packages feed

serverless-haskell-0.10.0: test/AWSLambda/Events/SQSEventSpec.hs

{-# LANGUAGE OverloadedLists #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE QuasiQuotes       #-}

module AWSLambda.Events.SQSEventSpec where

import           AWSLambda.Events.MessageAttribute
import           AWSLambda.Events.Records
import           AWSLambda.Events.S3Event
import           AWSLambda.Events.SNSEvent
import           AWSLambda.Events.SQSEvent

import           Data.Aeson
import           Data.Aeson.Embedded
import           Data.Aeson.TextValue
import           Data.ByteString.Lazy      (ByteString)
import           Data.Text                 (Text)
import           Data.Time.Calendar
import           Data.Time.Clock
import           Network.AWS.S3            as S3

import           Text.RawString.QQ

import           Test.Hspec

spec :: Spec
spec = describe "Handler" $ do
  it "parses sample text event" $
    decode sampleSQSJSON `shouldBe` Just sampleSQSEvent
  it "parses sample embedded S3 -> SNS -> SQS event" $
    eitherDecode sampleS3SNSSQSJSON `shouldBe` Right sampleS3SNSSQSEvent

sampleSQSJSON :: ByteString
sampleSQSJSON = [r|
{
  "Records": [
    {
      "messageId": "b792b6ba-b444-48c5-9cd8-29b8ad373eae",
      "receiptHandle": "ReceiptHandle",
      "body": "Hello from SQS!",
      "attributes": {
        "ApproximateReceiveCount": "1",
        "SentTimestamp": "1572575717896",
        "SenderId": "AIDAIY4XCTD3OFZN5ED42",
        "ApproximateFirstReceiveTimestamp": "1572575717898"
      },
      "messageAttributes": {
        "Test": {
          "Type": "String",
          "Value": "TestString"
        },
        "TestBinary": {
          "Type": "Binary",
          "Value": "TestBinary"
        }
      },
      "md5OfBody": "aca137746cb7d6a8e3eda3d1ce09b0c5",
      "eventSource": "aws:sqs",
      "eventSourceARN": "arn:aws:sqs:ap-southeast-2:1234567890:my-queue",
      "awsRegion": "ap-southeast-2"
    }
  ]
}
|]

sampleSQSEvent :: SQSEvent Text
sampleSQSEvent =
  RecordsEvent
    [ SQSMessage
        { _sqsmMessageId         = "b792b6ba-b444-48c5-9cd8-29b8ad373eae"
        , _sqsmReceiptHandle     = "ReceiptHandle"
        , _sqsmBody              = "Hello from SQS!"
        , _sqsmAttributes        =
          [ ("ApproximateReceiveCount", "1")
          , ("SentTimestamp", "1572575717896")
          , ("SenderId", "AIDAIY4XCTD3OFZN5ED42")
          , ("ApproximateFirstReceiveTimestamp", "1572575717898")
          ]
        , _sqsmMessageAttributes =
          [ ( "Test"
            , MessageAttribute
              { _maType = "String"
              , _maValue = "TestString"
              })
          , ( "TestBinary"
            , MessageAttribute
              { _maType = "Binary"
              , _maValue = "TestBinary"
              })
          ]
        , _sqsmMd5OfBody         = "aca137746cb7d6a8e3eda3d1ce09b0c5"
        , _sqsmEventSource       = "aws:sqs"
        , _sqsmEventSourceARN    = "arn:aws:sqs:ap-southeast-2:1234567890:my-queue"
        , _sqsmAwsRegion         = Sydney
        }
      ]

sampleS3SNSSQSJSON :: ByteString
sampleS3SNSSQSJSON = [r|
{
  "Records": [
    {
      "messageId": "b792b6ba-b444-48c5-9cd8-29b8ad373eae",
      "receiptHandle": "ReceiptHandle",
      "body": "{\n  \"Type\" : \"Notification\",\n  \"MessageId\" : \"MessageId\",\n  \"TopicArn\" : \"arn:aws:sns:ap-southeast-2:11111111111111:my-topic\",\n  \"Subject\" : \"Amazon S3 Notification\",\n  \"Message\" : \"{\\\"Records\\\":[{\\\"eventVersion\\\":\\\"2.1\\\",\\\"eventSource\\\":\\\"aws:s3\\\",\\\"awsRegion\\\":\\\"ap-southeast-2\\\",\\\"eventTime\\\":\\\"2019-11-01T00:00:00.00Z\\\",\\\"eventName\\\":\\\"ObjectCreated:Put\\\",\\\"userIdentity\\\":{\\\"principalId\\\":\\\"AWS:AHJD568HF4356HJJ:bob\\\"},\\\"requestParameters\\\":{\\\"sourceIPAddress\\\":\\\"787.39.11.220\\\"},\\\"responseElements\\\":{\\\"x-amz-request-id\\\":\\\"GDJS6765sJSHSS\\\",\\\"x-amz-id-2\\\":\\\"ID2\\\"},\\\"s3\\\":{\\\"s3SchemaVersion\\\":\\\"1.0\\\",\\\"configurationId\\\":\\\"ConfigurationId\\\",\\\"bucket\\\":{\\\"name\\\":\\\"my-bucket\\\",\\\"ownerIdentity\\\":{\\\"principalId\\\":\\\"ASKD794UDYDH\\\"},\\\"arn\\\":\\\"arn:aws:s3:::my-bucket\\\"},\\\"object\\\":{\\\"key\\\":\\\"my-key\\\",\\\"size\\\":13315,\\\"eTag\\\":\\\"1231234fabf233124124\\\",\\\"versionId\\\":\\\"735hjf893ufb8fhuf\\\",\\\"sequencer\\\":\\\"HUJKFDHJD8656567HGGSGJKD\\\"}}}]}\",\n  \"Timestamp\" : \"2019-11-01T00:00:00Z\",\n  \"SignatureVersion\" : \"1\",\n  \"Signature\" : \"Signature\",\n  \"SigningCertURL\" : \"https://sns.ap-southeast-2.amazonaws.com/SimpleNotificationService-my-cert.pem\",\n  \"UnsubscribeURL\" : \"https://sns.ap-southeast-2.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:ap-southeast-2:11111111111111:my-topic:unsub\"\n}",
      "attributes": {
        "ApproximateReceiveCount": "1",
        "SentTimestamp": "1572575717896",
        "SenderId": "AIDAIY4XCTD3OFZN5ED42",
        "ApproximateFirstReceiveTimestamp": "1572575717898"
      },
      "messageAttributes": {
        "Test": {
          "Type": "String",
          "Value": "TestString"
        },
        "TestBinary": {
          "Type": "Binary",
          "Value": "TestBinary"
        }
      },
      "md5OfBody": "aca137746cb7d6a8e3eda3d1ce09b0c5",
      "eventSource": "aws:sqs",
      "eventSourceARN": "arn:aws:sqs:ap-southeast-2:1234567890:my-queue",
      "awsRegion": "ap-southeast-2"
    }
  ]
}
|]

sampleS3SNSSQSEvent :: SQSEvent (Embedded (SNSMessage (Embedded S3Event)))
sampleS3SNSSQSEvent =
  RecordsEvent
    [ SQSMessage
        { _sqsmMessageId         = "b792b6ba-b444-48c5-9cd8-29b8ad373eae"
        , _sqsmReceiptHandle     = "ReceiptHandle"
        , _sqsmBody              =
          TextValue $ Embedded $ SNSMessage
            { _smMessage                = TextValue $ Embedded $ RecordsEvent
              [ S3EventNotification
                { _senAwsRegion         = Sydney
                , _senEventName         = S3ObjectCreatedPut
                , _senEventSource       = "aws:s3"
                , _senEventTime         = UTCTime (fromGregorian 2019 11 1) 0
                , _senEventVersion      = "2.1"
                , _senRequestParameters = RequestParametersEntity "787.39.11.220"
                , _senResponseElements  = ResponseElementsEntity
                  { _reeXAmzId2         = "ID2"
                  , _reeXAmzRequestId   = "GDJS6765sJSHSS" }
                , _senS3                = S3Entity
                  { _seBucket           = S3BucketEntity
                    { _sbeArn           = "arn:aws:s3:::my-bucket"
                    , _sbeName          = BucketName "my-bucket"
                    , _sbeOwnerIdentity = UserIdentityEntity "ASKD794UDYDH" }
                  , _seConfigurationId  = "ConfigurationId"
                  , _seObject           = S3ObjectEntity
                    { _soeETag          = Just (ETag "1231234fabf233124124")
                    , _soeKey           = ObjectKey "my-key"
                    , _soeSize          = Just 13315
                    , _soeSequencer     = "HUJKFDHJD8656567HGGSGJKD"
                    , _soeVersionId     = Just "735hjf893ufb8fhuf" }
                  , _seS3SchemaVersion = "1.0"
                  }
                , _senUserIdentity = UserIdentityEntity "AWS:AHJD568HF4356HJJ:bob"
                }
              ]
            , _smMessageAttributes = mempty
            , _smMessageId         = "MessageId"
            , _smSignature         = "Signature"
            , _smSignatureVersion  = "1"
            , _smSigningCertUrl    = "https://sns.ap-southeast-2.amazonaws.com/SimpleNotificationService-my-cert.pem"
            , _smSubject           = "Amazon S3 Notification"
            , _smTimestamp         = UTCTime (fromGregorian 2019 11 1) 0
            , _smTopicArn          = "arn:aws:sns:ap-southeast-2:11111111111111:my-topic"
            , _smType              = "Notification"
            , _smUnsubscribeUrl    = "https://sns.ap-southeast-2.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:ap-southeast-2:11111111111111:my-topic:unsub"
          }
        , _sqsmAttributes        =
          [ ("ApproximateReceiveCount", "1")
          , ("SentTimestamp", "1572575717896")
          , ("SenderId", "AIDAIY4XCTD3OFZN5ED42")
          , ("ApproximateFirstReceiveTimestamp", "1572575717898")
          ]
        , _sqsmMessageAttributes =
          [ ( "Test"
            , MessageAttribute
              { _maType = "String"
              , _maValue = "TestString"
              })
          , ( "TestBinary"
            , MessageAttribute
              { _maType = "Binary"
              , _maValue = "TestBinary"
              })
          ]
        , _sqsmMd5OfBody         = "aca137746cb7d6a8e3eda3d1ce09b0c5"
        , _sqsmEventSource       = "aws:sqs"
        , _sqsmEventSourceARN    = "arn:aws:sqs:ap-southeast-2:1234567890:my-queue"
        , _sqsmAwsRegion         = Sydney
        }
      ]