packages feed

serverless-haskell-0.0.6: test/AWSLambda/Events/S3EventSpec.hs

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

module AWSLambda.Events.S3EventSpec where

import           AWSLambda.Events.Records
import           AWSLambda.Events.S3Event

import           Data.Aeson
import           Data.ByteString.Lazy     (ByteString)
import           Data.Time.Calendar
import           Data.Time.Clock

import           Network.AWS.S3

import           Text.RawString.QQ

import           Test.Hspec

spec :: Spec
spec =
  describe "S3Event" $ do
    it "parses sample Put event" $
      decode sampleS3PutJSON `shouldBe` Just sampleS3PutEvent
    it "parses sample Delete event" $
      decode sampleS3DeleteJSON `shouldBe` Just sampleS3DeleteEvent

sampleS3PutJSON :: ByteString
sampleS3PutJSON = [r|
{
  "Records": [
    {
      "eventVersion": "2.0",
      "eventTime": "1970-01-01T00:00:00.000Z",
      "requestParameters": {
        "sourceIPAddress": "127.0.0.1"
      },
      "s3": {
        "configurationId": "testConfigRule",
        "object": {
          "eTag": "0123456789abcdef0123456789abcdef",
          "sequencer": "0A1B2C3D4E5F678901",
          "key": "HappyFace.jpg",
          "size": 1024
        },
        "bucket": {
          "arn": "bucketarn",
          "name": "sourcebucket",
          "ownerIdentity": {
            "principalId": "EXAMPLE"
          }
        },
        "s3SchemaVersion": "1.0"
      },
      "responseElements": {
        "x-amz-id-2": "EXAMPLE123/5678abcdefghijklambdaisawesome/mnopqrstuvwxyzABCDEFGH",
        "x-amz-request-id": "EXAMPLE123456789"
      },
      "awsRegion": "us-east-1",
      "eventName": "ObjectCreated:Put",
      "userIdentity": {
        "principalId": "EXAMPLE"
      },
      "eventSource": "aws:s3"
    }
  ]
}
|]

sampleS3PutEvent :: S3Event
sampleS3PutEvent =
  RecordsEvent
  { _reRecords =
    [ S3EventNotification
      { _senAwsRegion = NorthVirginia
      , _senEventName = S3ObjectCreatedPut
      , _senEventSource = "aws:s3"
      , _senEventTime = UTCTime (fromGregorian 1970 1 1) (secondsToDiffTime 0)
      , _senEventVersion = "2.0"
      , _senRequestParameters =
        RequestParametersEntity
        { _rpeSourceIPAddress = "127.0.0.1"
        }
      , _senResponseElements =
        ResponseElementsEntity
        { _reeXAmzId2 =
          "EXAMPLE123/5678abcdefghijklambdaisawesome/mnopqrstuvwxyzABCDEFGH"
        , _reeXAmzRequestId = "EXAMPLE123456789"
        }
      , _senS3 =
        S3Entity
        { _seBucket =
          S3BucketEntity
          { _sbeArn = "bucketarn"
          , _sbeName = BucketName "sourcebucket"
          , _sbeOwnerIdentity =
            UserIdentityEntity
            { _uiePrincipalId = "EXAMPLE"
            }
          }
        , _seConfigurationId = "testConfigRule"
        , _seObject =
          S3ObjectEntity
          { _soeETag = Just (ETag "0123456789abcdef0123456789abcdef")
          , _soeKey = ObjectKey "HappyFace.jpg"
          , _soeSize = Just 1024
          , _soeSequencer = "0A1B2C3D4E5F678901"
          , _soeVersionId = Nothing
          }
        , _seS3SchemaVersion = "1.0"
        }
      , _senUserIdentity =
        UserIdentityEntity
        { _uiePrincipalId = "EXAMPLE"
        }
      }
    ]
  }

sampleS3DeleteJSON :: ByteString
sampleS3DeleteJSON = [r|
  {
  "Records": [
    {
      "eventVersion": "2.0",
      "eventTime": "1970-01-01T00:00:00.000Z",
      "requestParameters": {
        "sourceIPAddress": "127.0.0.1"
      },
      "s3": {
        "configurationId": "testConfigRule",
        "object": {
          "sequencer": "0A1B2C3D4E5F678901",
          "key": "HappyFace.jpg"
        },
        "bucket": {
          "arn": "bucketarn",
          "name": "sourcebucket",
          "ownerIdentity": {
            "principalId": "EXAMPLE"
          }
        },
        "s3SchemaVersion": "1.0"
      },
      "responseElements": {
        "x-amz-id-2": "EXAMPLE123/5678abcdefghijklambdaisawesome/mnopqrstuvwxyzABCDEFGH",
        "x-amz-request-id": "EXAMPLE123456789"
      },
      "awsRegion": "us-east-1",
      "eventName": "ObjectRemoved:Delete",
      "userIdentity": {
        "principalId": "EXAMPLE"
      },
      "eventSource": "aws:s3"
    }
  ]
}
|]

sampleS3DeleteEvent :: S3Event
sampleS3DeleteEvent =
  RecordsEvent
  { _reRecords =
    [ S3EventNotification
      { _senAwsRegion = NorthVirginia
      , _senEventName = S3ObjectRemovedDelete
      , _senEventSource = "aws:s3"
      , _senEventTime = UTCTime (fromGregorian 1970 1 1) (secondsToDiffTime 0)
      , _senEventVersion = "2.0"
      , _senRequestParameters =
        RequestParametersEntity
        { _rpeSourceIPAddress = "127.0.0.1"
        }
      , _senResponseElements =
        ResponseElementsEntity
        { _reeXAmzId2 =
          "EXAMPLE123/5678abcdefghijklambdaisawesome/mnopqrstuvwxyzABCDEFGH"
        , _reeXAmzRequestId = "EXAMPLE123456789"
        }
      , _senS3 =
        S3Entity
        { _seBucket =
          S3BucketEntity
          { _sbeArn = "bucketarn"
          , _sbeName = BucketName "sourcebucket"
          , _sbeOwnerIdentity =
            UserIdentityEntity
            { _uiePrincipalId = "EXAMPLE"
            }
          }
        , _seConfigurationId = "testConfigRule"
        , _seObject =
          S3ObjectEntity
          { _soeETag = Nothing
          , _soeKey = ObjectKey "HappyFace.jpg"
          , _soeSize = Nothing
          , _soeSequencer = "0A1B2C3D4E5F678901"
          , _soeVersionId = Nothing
          }
        , _seS3SchemaVersion = "1.0"
        }
      , _senUserIdentity =
        UserIdentityEntity
        { _uiePrincipalId = "EXAMPLE"
        }
      }
    ]
  }