packages feed

hal-0.4.10: test/AWS/Lambda/Events/EventBridge/Spec.hs

{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE QuasiQuotes #-}

module AWS.Lambda.Events.EventBridge.Spec where

import           Prelude                                                    hiding (id)

import           AWS.Lambda.Events.EventBridge
import qualified AWS.Lambda.Events.EventBridge.Gen                          as EventBridge
import qualified AWS.Lambda.Events.EventBridge.Detail.SSM.ParameterStoreChange.Gen as ParameterStoreChange
import           Data.Aeson                                                 (decode, eitherDecode, encode,
                                                                             object, (.=), Value(..))
import           Data.ByteString.Lazy                                       (ByteString)
import           Data.Time                                                  (UTCTime(..), fromGregorian,
                                                                             secondsToDiffTime)
import           Hedgehog                                                   (forAll, tripping)
import           Test.Hspec                                                 (Spec, describe, shouldBe, specify)
import           Test.Hspec.Hedgehog                                        (hedgehog)
import           Test.Hspec.Runner                                          (hspec)
import           Text.RawString.QQ                                          (r)

spec :: Spec
spec = do
  describe "EventBridge" $ do
    specify "read sample payload" $
      eitherDecode samplePayload `shouldBe` Right expectedPayload

    describe "properties" $ do
      specify "EventBridgeEvent tripping" $
        hedgehog $ do
          payload <- forAll EventBridge.eventBridgeEvent
          tripping payload encode decode

    describe "SSM" $
      specify "ParameterStoreChange tripping" $
        hedgehog $ do
          change <- forAll ParameterStoreChange.parameterStoreChange
          tripping change encode decode

samplePayload :: ByteString
samplePayload = [r|
{
   "version":"0",
   "id":"01234567-0123-0123-0123-0123456789ab",
   "detail-type":"Maintenance Window Target Registration Notification",
   "source":"aws.ssm",
   "account":"123456789012",
   "time":"2016-11-16T00:58:37Z",
   "region":"us-east-2",
   "resources":[
      "arn:aws:ssm:us-east-2:123456789012:maintenancewindow/mw-0ed7251d3fcf6e0c2",
      "arn:aws:ssm:us-east-2:123456789012:windowtarget/e7265f13-3cc5-4f2f-97a9-7d3ca86c32a6"
   ],
   "detail":{
      "window-target-id":"e7265f13-3cc5-4f2f-97a9-7d3ca86c32a6",
      "window-id":"mw-0ed7251d3fcf6e0c2",
      "status":"REGISTERED"
   }
}
|]

expectedPayload :: EventBridgeEvent
expectedPayload = EventBridgeEvent
  { version = "0"
  , id = "01234567-0123-0123-0123-0123456789ab"
  , detailType = "Maintenance Window Target Registration Notification"
  , source = "aws.ssm"
  , account = "123456789012"
  , time = UTCTime (fromGregorian 2016 11 16) (secondsToDiffTime $ 58 * 60 + 37)
  , region = "us-east-2"
  , resources =
    [ "arn:aws:ssm:us-east-2:123456789012:maintenancewindow/mw-0ed7251d3fcf6e0c2"
    , "arn:aws:ssm:us-east-2:123456789012:windowtarget/e7265f13-3cc5-4f2f-97a9-7d3ca86c32a6"
    ]
  , detail = object
    [ "window-target-id" .= String "e7265f13-3cc5-4f2f-97a9-7d3ca86c32a6"
    , "window-id" .= String "mw-0ed7251d3fcf6e0c2"
    , "status" .= String "REGISTERED"
    ]
  }