{-# 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", monitorMemo = Just "Monitor memo", 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", "memo": "Monitor memo", "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", monitorMemo = Just "Monitor memo", monitorIsMute = Just False, monitorNotificationInterval = Nothing, monitorScopes = Nothing, monitorExcludeScopes = Nothing } let connectivityJson = [aesonQQ| { "type": "connectivity", "id": "abcde2", "name": "connectivity", "memo": "Monitor memo", "isMute": false } |] let serviceMonitor = MonitorService { monitorId = Just $ MonitorId "abcde3", monitorName = "Service count", monitorMemo = Just "Monitor memo", 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", "memo": "Monitor memo", "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", monitorMemo = Just "Monitor memo", monitorMethod = Just MonitorExternalMethodGET, monitorUrl = "https://example.com", monitorRequestBody = Just "Request Body", monitorHeaders = Just [MonitorExternalHeader "Cache-Control" "no-cache"], 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, monitorIsMute = Just True, monitorNotificationInterval = Just 60 } let externalMonitorJson = [aesonQQ| { "type": "external", "id": "abcde4", "name": "Example external monitor", "memo": "Monitor memo", "method": "GET", "url": "https://example.com", "requestBody": "Request Body", "headers": [{ "name": "Cache-Control", "value": "no-cache" }], "service": "service1", "responseTimeDuration": 5, "responseTimeWarning": 3000, "responseTimeCritical": 5000, "containsString": "Example Domain", "maxCheckAttempts": 5, "certificationExpirationWarning": 1200, "certificationExpirationCritical": 60, "skipCertificateVerification": true, "isMute": true, "notificationInterval": 60 } |] let expressionMonitor = MonitorExpression { monitorId = Just $ MonitorId "abcde5", monitorName = "Example expression monitor", monitorMemo = Just "Monitor memo", 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", "memo": "Monitor memo", "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)