packages feed

mackerel-client-0.0.0: test/Types/MonitorSpec.hs

{-# LANGUAGE OverloadedStrings, QuasiQuotes #-}
module Types.MonitorSpec where

import Control.Monad (forM_)
import Data.Aeson (decode, encode)
import Data.Aeson.QQ
import Test.Hspec

import Web.Mackerel.Types.Monitor

spec :: Spec
spec = do

  let hostMonitor = MonitorHost {
        monitorId = Just $ MonitorId "abcde1",
        monitorName = "Monitor custom.foo.bar",
        monitorDuration = 5,
        monitorMetric = "custom.foo.bar",
        monitorOperator = MonitorGreaterThan,
        monitorWarning = 10.0,
        monitorCritical = 20.0,
        monitorIsMute = Just False,
        monitorNotificationInterval = Just 30,
        monitorScopes = Just ["service0"],
        monitorExcludeScopes = Just ["service0:role3"]
      }

  let hostMonitorJson = [aesonQQ|
    {
      "type": "host",
      "id": "abcde1",
      "name": "Monitor custom.foo.bar",
      "duration": 5,
      "metric": "custom.foo.bar",
      "operator": ">",
      "warning": 10.0,
      "critical": 20.0,
      "isMute": false,
      "notificationInterval": 30,
      "scopes": ["service0"],
      "excludeScopes": ["service0:role3"]
    }
  |]

  let connectivity = MonitorConnectivity {
        monitorId = Just $ MonitorId "abcde2",
        monitorName = "connectivity",
        monitorIsMute = Just False,
        monitorNotificationInterval = Nothing,
        monitorScopes = Nothing,
        monitorExcludeScopes = Nothing
      }

  let connectivityJson = [aesonQQ|
    {
      "type": "connectivity",
      "id": "abcde2",
      "name": "connectivity",
      "isMute": false
    }
  |]

  let serviceMonitor = MonitorService {
        monitorId = Just $ MonitorId "abcde3",
        monitorName = "Service count",
        monitorService = "service1",
        monitorDuration = 5,
        monitorMetric = "custom.service.count",
        monitorOperator = MonitorGreaterThan,
        monitorWarning = 100,
        monitorCritical = 200,
        monitorIsMute = Just False,
        monitorNotificationInterval = Just 30
      }

  let serviceMonitorJson = [aesonQQ|
    {
      "type": "service",
      "id": "abcde3",
      "name": "Service count",
      "service": "service1",
      "duration": 5,
      "metric": "custom.service.count",
      "operator": ">",
      "warning": 100,
      "critical": 200,
      "isMute": false,
      "notificationInterval": 30
    }
  |]

  let externalMonitor = MonitorExternal {
        monitorId = Just $ MonitorId "abcde4",
        monitorName = "Example external monitor",
        monitorUrl = "https://example.com",
        monitorServiceOption = Just "service1",
        monitorResponseTimeDuration = Just 5,
        monitorResponseTimeWarning = Just 3000,
        monitorResponseTimeCritical = Just 5000,
        monitorContainsString = Just "Example Domain",
        monitorMaxCheckAttempts = Just 5,
        monitorCertificationExpirationWarning = Just 1200,
        monitorCertificationExpirationCritical = Just 60,
        monitorSkipCertificateVerification = Just True,
        monitorHeaders = Just [MonitorExternalHeader "Cache-Control" "no-cache"],
        monitorIsMute = Just True,
        monitorNotificationInterval = Just 60
      }

  let externalMonitorJson = [aesonQQ|
    {
      "type": "external",
      "id": "abcde4",
      "name": "Example external monitor",
      "url": "https://example.com",
      "service": "service1",
      "responseTimeDuration": 5,
      "responseTimeWarning": 3000,
      "responseTimeCritical": 5000,
      "containsString": "Example Domain",
      "maxCheckAttempts": 5,
      "certificationExpirationWarning": 1200,
      "certificationExpirationCritical": 60,
      "skipCertificateVerification": true,
      "headers": [{ "name": "Cache-Control", "value": "no-cache" }],
      "isMute": true,
      "notificationInterval": 60
    }
  |]

  let expressionMonitor = MonitorExpression {
        monitorId = Just $ MonitorId "abcde5",
        monitorName = "Example expression monitor",
        monitorExpression = "min(role(\"foo:bar\", \"custom.foo.bar\"))",
        monitorOperator = MonitorLessThan,
        monitorWarning = 10.0,
        monitorCritical = 20.0,
        monitorIsMute = Just False,
        monitorNotificationInterval = Nothing
      }

  let expressionMonitorJson = [aesonQQ|
    {
      "type": "expression",
      "id": "abcde5",
      "name": "Example expression monitor",
      "expression": "min(role(\"foo:bar\", \"custom.foo.bar\"))",
      "operator": "<",
      "warning": 10.0,
      "critical": 20.0,
      "isMute": false
    }
  |]

  let monitors = [
          (hostMonitor, hostMonitorJson),
          (connectivity, connectivityJson),
          (serviceMonitor, serviceMonitorJson),
          (externalMonitor, externalMonitorJson),
          (expressionMonitor, expressionMonitorJson)
        ]

  describe "Monitor FromJSON" $
    it "should parse jsons" $ do
      forM_ monitors $ \(monitor, json) ->
        decode (encode json) `shouldBe` Just monitor
      decode (encode (map snd monitors)) `shouldBe` Just (map fst monitors)

  describe "Monitor ToJSON" $
    it "should encode into jsons" $ do
      forM_ monitors $ \(monitor, json) ->
        decode (encode monitor) `shouldBe` Just json
      decode (encode (map fst monitors)) `shouldBe` Just (map snd monitors)