{-# 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
]