serverless-haskell-0.4.2: test/AWSLambda/Events/SNSEventSpec.hs
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE QuasiQuotes #-}
module AWSLambda.Events.SNSEventSpec where
import AWSLambda.Events.Records
import AWSLambda.Events.S3Event
import AWSLambda.Events.SNSEvent
import Data.Aeson
import Data.Aeson.Embedded
import Data.Aeson.TextValue
import Data.ByteString.Lazy (ByteString)
import qualified Data.HashMap.Strict as HashMap
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 "SNSEvent" $ do
it "parses sample text event" $
decode sampleSNSJSON `shouldBe` Just sampleSNSEvent
it "parses sample embedded S3 event" $
decode sampleSNSS3JSON `shouldBe` Just sampleSNSS3Event
sampleSNSJSON :: ByteString
sampleSNSJSON = [r|
{
"Records": [
{
"EventVersion": "1.0",
"EventSubscriptionArn": "eventsubscriptionarn",
"EventSource": "aws:sns",
"Sns": {
"SignatureVersion": "1",
"Timestamp": "1970-01-01T00:00:00.000Z",
"Signature": "EXAMPLE",
"SigningCertUrl": "EXAMPLE",
"MessageId": "95df01b4-ee98-5cb9-9903-4c221d41eb5e",
"Message": "Hello from SNS!",
"MessageAttributes": {
"Test": {
"Type": "String",
"Value": "TestString"
},
"TestBinary": {
"Type": "Binary",
"Value": "TestBinary"
}
},
"Type": "Notification",
"UnsubscribeUrl": "EXAMPLE",
"TopicArn": "topicarn",
"Subject": "TestInvoke"
}
}
]
}
|]
sampleSNSEvent :: SNSEvent Text
sampleSNSEvent =
RecordsEvent
[ SNSRecord
{ _srEventVersion = "1.0"
, _srEventSubscriptionArn = "eventsubscriptionarn"
, _srEventSource = "aws:sns"
, _srSns =
SNSMessage
{ _smMessage = "Hello from SNS!"
, _smMessageAttributes =
HashMap.fromList
[ ( "Test"
, MessageAttribute
{ _maType = "String"
, _maValue = "TestString"
})
, ( "TestBinary"
, MessageAttribute
{ _maType = "Binary"
, _maValue = "TestBinary"
})
]
, _smMessageId = "95df01b4-ee98-5cb9-9903-4c221d41eb5e"
, _smSignature = "EXAMPLE"
, _smSignatureVersion = "1"
, _smSigningCertUrl = "EXAMPLE"
, _smSubject = "TestInvoke"
, _smTimestamp = UTCTime (fromGregorian 1970 1 1) (secondsToDiffTime 0)
, _smTopicArn = "topicarn"
, _smType = "Notification"
, _smUnsubscribeUrl = "EXAMPLE"
}
}
]
sampleSNSS3JSON :: ByteString
sampleSNSS3JSON = [r|
{"Records":
[
{"EventSource":"aws:sns",
"EventVersion":"1.0",
"EventSubscriptionArn":"arn:aws:sns:ap-southeast-2:012345678901:SomeSNSEvent:23e2d254-e8bb-4db5-92ce-d917e5aad090",
"Sns":{
"Type":"Notification",
"MessageId":"89f6fe8b-a751-5dcd-8e0c-afbd75420455",
"TopicArn":"arn:aws:sns:ap-southeast-2:012345678901:SomeSNSEvent",
"Subject":"Amazon S3 Notification",
"Message": "{\"Records\":[{\"eventVersion\":\"2.0\",\"eventSource\":\"aws:s3\",\"awsRegion\":\"ap-southeast-2\",\"eventTime\":\"2017-03-06T02:56:19.713Z\",\"eventName\":\"ObjectCreated:Put\",\"userIdentity\":{\"principalId\":\"AWS:DFLKSDFLKJ987SDFLJJDJ:some-principal-id\"},\"requestParameters\":{\"sourceIPAddress\":\"192.168.0.1\"},\"responseElements\":{\"x-amz-request-id\":\"324098EDFLK0894F\",\"x-amz-id-2\":\"xsdSDF/pgAl401Fz3UIATJ5/didfljDSFDSFsdfkjsdfl8JdsfLSDF89ldsf7SDF898jsdfljiA=\"},\"s3\":{\"s3SchemaVersion\":\"1.0\",\"configurationId\":\"SomeS3Event:Created\",\"bucket\":{\"name\":\"some-bucket\",\"ownerIdentity\":{\"principalId\":\"A3O1SDFLKJIJXU\"},\"arn\":\"arn:aws:s3:::some-bucket\"},\"object\":{\"key\":\"path/to/some/object\",\"size\":53598442,\"eTag\":\"6b1f72b9e81e4d6fcd3e0c808e8477f8\",\"sequencer\":\"0058BCCFD25C798E7B\"}}}]}",
"Timestamp":"2017-03-06T02:56:19.834Z",
"SignatureVersion":"1",
"Signature":"aybEgnTjKzSbC2puHxho7SUnYOje4SjBoCyt0Q13bMWyp7M64+EU6jzi7P01+gSIuBFyYPsHreSmyqGMRSxbFuzn7rG5JcVGN0901U3CRXdk42eh03je8evRvs/Oa7TJlhpCTEDDOScalCWbIH0RthYONQpPR01nEgaNKj3e8YVJqyRQV+4RbU3YWJOj+Spyi4u1hOC9PLUv4BH7U80nbhbOe9EwgX0zpeNU1WBRbEpqPoACm+7/uB0w79qFBKjB/Q7OWc1kASUZV9q8bz03yceoQeVvza0QGhPsnSXi49sn1mLWQOFS4KvgbJIC/Qk7H036ShrDioP6pP+UEg6kow==",
"SigningCertUrl":"https://sns.ap-southeast-2.amazonaws.com/SimpleNotificationService-b95095beb82e8f6a046b3aafc7f4149a.pem",
"UnsubscribeUrl":"https://sns.ap-southeast-2.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:ap-southeast-2:012345678901:SomeSNSEvent:23e2d254-e8bb-4db5-92ce-d917e5aad090",
"MessageAttributes":{}
}
}
]
}
|]
sampleSNSS3Event :: SNSEvent (Embedded S3Event)
sampleSNSS3Event =
RecordsEvent
{ _reRecords =
[ SNSRecord
{ _srEventVersion = "1.0"
, _srEventSubscriptionArn =
"arn:aws:sns:ap-southeast-2:012345678901:SomeSNSEvent:23e2d254-e8bb-4db5-92ce-d917e5aad090"
, _srEventSource = "aws:sns"
, _srSns =
SNSMessage
{ _smMessage =
TextValue
{ _unTextValue =
Embedded
{ _unEmbed =
RecordsEvent
{ _reRecords =
[ S3EventNotification
{ _senAwsRegion = Sydney
, _senEventName = S3ObjectCreatedPut
, _senEventSource = "aws:s3"
, _senEventTime =
UTCTime
(fromGregorian 2017 3 6)
(picosecondsToDiffTime 10579713000000000)
, _senEventVersion = "2.0"
, _senRequestParameters =
RequestParametersEntity
{ _rpeSourceIPAddress = "192.168.0.1"
}
, _senResponseElements =
ResponseElementsEntity
{ _reeXAmzId2 =
"xsdSDF/pgAl401Fz3UIATJ5/didfljDSFDSFsdfkjsdfl8JdsfLSDF89ldsf7SDF898jsdfljiA="
, _reeXAmzRequestId = "324098EDFLK0894F"
}
, _senS3 =
S3Entity
{ _seBucket =
S3BucketEntity
{ _sbeArn = "arn:aws:s3:::some-bucket"
, _sbeName = BucketName "some-bucket"
, _sbeOwnerIdentity =
UserIdentityEntity
{ _uiePrincipalId = "A3O1SDFLKJIJXU"
}
}
, _seConfigurationId = "SomeS3Event:Created"
, _seObject =
S3ObjectEntity
{ _soeETag =
Just (ETag "6b1f72b9e81e4d6fcd3e0c808e8477f8")
, _soeKey = ObjectKey "path/to/some/object"
, _soeSize = Just 53598442
, _soeSequencer = "0058BCCFD25C798E7B"
, _soeVersionId = Nothing
}
, _seS3SchemaVersion = "1.0"
}
, _senUserIdentity =
UserIdentityEntity
{ _uiePrincipalId =
"AWS:DFLKSDFLKJ987SDFLJJDJ:some-principal-id"
}
}
]
}
}
}
, _smMessageAttributes = HashMap.fromList []
, _smMessageId = "89f6fe8b-a751-5dcd-8e0c-afbd75420455"
, _smSignature =
"aybEgnTjKzSbC2puHxho7SUnYOje4SjBoCyt0Q13bMWyp7M64+EU6jzi7P01+gSIuBFyYPsHreSmyqGMRSxbFuzn7rG5JcVGN0901U3CRXdk42eh03je8evRvs/Oa7TJlhpCTEDDOScalCWbIH0RthYONQpPR01nEgaNKj3e8YVJqyRQV+4RbU3YWJOj+Spyi4u1hOC9PLUv4BH7U80nbhbOe9EwgX0zpeNU1WBRbEpqPoACm+7/uB0w79qFBKjB/Q7OWc1kASUZV9q8bz03yceoQeVvza0QGhPsnSXi49sn1mLWQOFS4KvgbJIC/Qk7H036ShrDioP6pP+UEg6kow=="
, _smSignatureVersion = "1"
, _smSigningCertUrl =
"https://sns.ap-southeast-2.amazonaws.com/SimpleNotificationService-b95095beb82e8f6a046b3aafc7f4149a.pem"
, _smSubject = "Amazon S3 Notification"
, _smTimestamp =
UTCTime
(fromGregorian 2017 3 6)
(picosecondsToDiffTime 10579834000000000)
, _smTopicArn = "arn:aws:sns:ap-southeast-2:012345678901:SomeSNSEvent"
, _smType = "Notification"
, _smUnsubscribeUrl =
"https://sns.ap-southeast-2.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:ap-southeast-2:012345678901:SomeSNSEvent:23e2d254-e8bb-4db5-92ce-d917e5aad090"
}
}
]
}