packages feed

datadog-0.2.0.0: test/Test/Network/Datadog/Monitor.hs

module Test.Network.Datadog.Monitor (spec) where

import Control.Concurrent (threadDelay)
import Control.Lens ((^.))
import Control.Monad (when)
import Test.Hspec (Spec, describe, expectationFailure, it)

import Network.Datadog (Environment, createEnvironment, loadKeysFromEnv)
import Network.Datadog.Monitor
  ( MonitorType (MetricAlert)
  , createMonitor
  , deleteMonitor
  , id'
  , loadMonitor
  , loadMonitors
  , minimalMonitorSpec
  , monitorSpecName
  , updateMonitor
  )

spec :: Spec
spec = describe "Monitor spec" $ do
  it "Does monitor CRUD operations" $ do
    let environment :: IO Environment
        environment = createEnvironment =<< loadKeysFromEnv
        monitorDetails = minimalMonitorSpec
          MetricAlert
          "avg(last_5m):sum:system.net.bytes_rcvd{host:host0} > 100"
        monitorUpdatedDetails = monitorDetails { monitorSpecName = Just "Haskell Datadog test monitor" }
    env <- environment
    threadDelay 500000
    monitor1 <- createMonitor env monitorDetails
    threadDelay 500000
    monitor2 <- updateMonitor env (monitor1 ^. id') monitorUpdatedDetails
    threadDelay 500000
    monitor3 <- loadMonitor env (monitor1 ^. id')
    threadDelay 500000
    monitors <- loadMonitors env []
    threadDelay 500000
    deleteMonitor env (monitor1 ^. id')
    when (monitor2 /= monitor3) $
      expectationFailure "Updated and fetched monitors are not identical"
    when (monitor2 `notElem` monitors) $
      expectationFailure "Created monitor not updated (in group load)"