packages feed

keiro-0.24.0.0: test/ConsumerInspectionSpec.hs

module ConsumerInspectionSpec (spec) where

import Data.Either (isLeft)
import Keiro.Inspection.Consumers
import Kiroku.Store.Types (CategoryName (..))
import Test.Hspec

spec :: Spec
spec = describe "category consumers durable metadata" $ do
  it "uses declared inputs rather than the manager's fulfillment journal" $ do
    let manager = DurableConsumerDescription ProcessManagerConsumer "fulfillment" "order-input" (ExactCategory "order")
    Right registry <- pure (durableConsumerRegistry [manager])
    durableConsumersForCategory registry (CategoryName "order") `shouldBe` [manager]
    durableConsumersForCategory registry (CategoryName "fulfillment") `shouldBe` []
    durableConsumersForCategory registry (CategoryName "Order") `shouldBe` []
  it "matches literal namespaces at colon boundaries and all categories" $ do
    let namespace = DurableConsumerDescription DurableSubscriber "namespace" "ns" (CategoryNamespace "pm")
        all = DurableConsumerDescription DurableSubscriber "all" "all" AllCategories
    Right registry <- pure (durableConsumerRegistry [namespace, all])
    mapM_ (\category -> durableConsumersForCategory registry (CategoryName category) `shouldBe` [all, namespace]) ["pm", "pm:orders", "pm:orders:child"]
    mapM_ (\category -> durableConsumersForCategory registry (CategoryName category) `shouldBe` [all]) ["pmm", "PM", "orders"]
  it "coalesces duplicates, permits shared subscriptions, and orders independent of declarations" $ do
    let first = DurableConsumerDescription DurableSubscriber "a" "shared" (ExactCategory "order")
        second = DurableConsumerDescription ProcessManagerConsumer "b" "shared" (ExactCategory "order")
        third = DurableConsumerDescription DurableSubscriber "a" "second" AllCategories
    Right registry <- pure (durableConsumerRegistry [second, first, third, first])
    durableConsumerRegistry [third, second, first] `shouldBe` Right registry
    durableConsumersForCategory registry (CategoryName "order") `shouldBe` [third, first, second]
    durableConsumerRegistry [first, second {source = ExactCategory "invoice"}]
      `shouldBe` Left (ConflictingSubscriptionScope "shared")
    Right changed <- pure (durableConsumerRegistry [first {name = "changed"}])
    durableConsumerInventoryIdentity changed `shouldNotBe` durableConsumerInventoryIdentity registry
  it "rejects blank identities and invalid scopes and permits explicitly empty registries" $ do
    let valid = DurableConsumerDescription DurableSubscriber "consumer" "subscription" AllCategories
    mapM_
      (\description -> durableConsumerRegistry [description] `shouldSatisfy` isLeft)
      [valid {name = ""}, valid {name = " c"}, valid {subscriptionName = " "}, valid {source = ExactCategory ""}, valid {source = ExactCategory "order "}, valid {source = CategoryNamespace " pm"}]
    Right empty <- pure (durableConsumerRegistry [])
    durableConsumersForCategory empty (CategoryName "order") `shouldBe` []