packages feed

natskell-0.3.0.0: test/Unit/JetStream/PublishSpec.hs

{-# LANGUAGE OverloadedStrings #-}

module JetStream.PublishSpec (spec) where

import           Data.Aeson              (eitherDecodeStrict)
import           JetStream.Publish.Types
import           Test.Hspec

spec :: Spec
spec =
  parallel $ do
    describe "publishHeaders" $ do
      it "renders JetStream publish expectation headers" $ do
        publishHeaders
          [ withMsgId "msg-1"
          , withExpectedStream "ORDERS"
          , withPublishExpectation (ExpectedLastSequence 12)
          , withHeaders [("Nats-Expected-Test", "custom")]
          ]
          `shouldBe` [ ("Nats-Msg-Id", "msg-1")
                     , ("Nats-Expected-Stream", "ORDERS")
                     , ("Nats-Expected-Last-Sequence", "12")
                     , ("Nats-Expected-Test", "custom")
                     ]

      it "keeps publish expectations mutually exclusive" $ do
        publishHeaders
          [ withPublishExpectation (ExpectedLastSequence 12)
          , withPublishExpectation (ExpectedLastSubjectSequence 7)
          , withPublishExpectation (ExpectedLastMsgId "msg-0")
          ]
          `shouldBe` [("Nats-Expected-Last-Sequence", "12")]

    describe "PublishAck" $ do
      it "decodes required and optional publish ack fields" $ do
        eitherDecodeStrict
          "{\"stream\":\"ORDERS\",\"seq\":42,\"duplicate\":true,\"domain\":\"hub\"}"
          `shouldBe` Right PublishAck
            { publishAckStream = "ORDERS"
            , publishAckSequence = 42
            , publishAckDuplicate = Just True
            , publishAckDomain = Just "hub"
            }

      it "decodes publish ack without optional fields" $ do
        eitherDecodeStrict "{\"stream\":\"ORDERS\",\"seq\":42}"
          `shouldBe` Right PublishAck
            { publishAckStream = "ORDERS"
            , publishAckSequence = 42
            , publishAckDuplicate = Nothing
            , publishAckDomain = Nothing
            }