content: {-# LANGUAGE OverloadedLists   #-}
  {-# LANGUAGE OverloadedStrings #-}
  {-# LANGUAGE QuasiQuotes       #-}
  
  module AWSLambda.Events.SQSEventSpec where
  
  import           AWSLambda.Events
  
  import           Control.Monad.Trans.Writer
  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           Amazonka.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
    it "traverses sample embedded S3 -> SNS -> SQS event" $
      (execWriter $
        traverseS3InSnsInSqs (tell . (: []) . _sbeName . _seBucket . _senS3) sampleS3SNSSQSEvent)
        `shouldBe` ["my-bucket"]
  
  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\\\":\\\"s3: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         = Event_S3_ObjectCreated_Put
                  , _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
          }
        ]
  