packages feed

google-cloud-pubsub-1.1.0.0: test/Spec.hs

{-# LANGUAGE OverloadedStrings #-}

module Main (main) where

import Data.Aeson (eitherDecode, encode)
import qualified Data.ByteString.Base64 as Base64
import qualified Data.ByteString.Char8 as BS
import qualified Data.ByteString.Lazy.Char8 as BSL
import qualified Data.Map as M
import Test.Tasty (TestTree, defaultMain, testGroup)
import Test.Tasty.HUnit (assertBool, assertEqual, testCase)

import Google.Cloud.PubSub.Common (PubsubMessage (..), googlePubSubUrl)
import Google.Cloud.PubSub.Subscription
  ( PullRequest (..)
  , PullResponse (..)
  , ReceivedMessage (..)
  )
import Google.Cloud.PubSub.Topic
  ( Message (..)
  , PublishRequest (..)
  , PublishResponse (..)
  )

main :: IO ()
main = defaultMain tests

tests :: TestTree
tests =
  testGroup
    "google-cloud-pubsub"
    [ testCase "googlePubSubUrl is v1 endpoint" $ do
        assertEqual "Endpoint" "https://pubsub.googleapis.com/v1" googlePubSubUrl
    , testCase "PubsubMessage JSON field mapping of data_" $ do
        let msg =
              PubsubMessage
                { data_ = Just "Zm9v"
                , attributes = Nothing
                , messageId = Nothing
                , publishTime = Nothing
                , orderingKey = Nothing
                }
            json = encode msg
        assertBool "JSON must contain \"data\" key" ("\"data\"" `BS.isInfixOf` BSL.toStrict json)
        case eitherDecode json of
          Left err -> assertBool ("Failed to decode: " <> err) False
          Right (decoded :: PubsubMessage) -> assertEqual "Roundtrip" msg decoded
    , testCase "Message gets base64-encoded into PubsubMessage via PublishRequest" $ do
        let m =
              Message {content = "hello", attributes = Just (M.fromList [("k", "v")]), orderingKey = Just "ord"}
            pr =
              PublishRequest
                [ PubsubMessage
                    (Just (BS.unpack (Base64.encode (BS.pack "hello"))))
                    (Just (M.fromList [("k", "v")]))
                    Nothing
                    Nothing
                    (Just "ord")
                ]
            encoded = encode pr
        assertBool "Contains base64 of 'hello'" ("\"aGVsbG8=\"" `BS.isInfixOf` BSL.toStrict encoded)
    , testCase "Decode PublishResponse with messageIds" $ do
        let json = BSL.pack "{\n  \"messageIds\": [\"1\", \"2\"]\n}"
        case eitherDecode json of
          Left err -> assertBool ("Failed to decode: " <> err) False
          Right (PublishResponse mids) -> assertEqual "IDs" ["1", "2"] mids
    , testCase "Encode PullRequest and decode PullResponse with one message" $ do
        let req = PullRequest {maxMessages = 3, returnImmediately = False}
        assertBool "maxMessages present" ("\"maxMessages\"" `BS.isInfixOf` BSL.toStrict (encode req))
        let json =
              BSL.pack
                "{\n  \"receivedMessages\": [\n    {\n      \"ackId\": \"ack-1\",\n      \"message\": {\n        \"data\": \"aGVsbG8=\",\n        \"attributes\": {\n          \"k\": \"v\"\n        }\n      },\n      \"deliveryAttempt\": 1\n    }\n  ]\n}"
        case eitherDecode json of
          Left err -> assertBool ("Failed to decode: " <> err) False
          Right (PullResponse msgs) -> do
            assertEqual "One message" 1 (length msgs)
            let ReceivedMessage {ackId = ack, deliveryAttempt = att} = head msgs
            assertEqual "ackId" "ack-1" ack
            assertEqual "deliveryAttempt" (Just 1) att
    ]