packages feed

keiro-dsl-0.2.0.0: test/conformance-router-runtime/Main.hs

{-# LANGUAGE DataKinds #-}

module Main (main) where

import Control.Monad (unless)
import Data.UUID qualified as UUID
import Generated.IncidentPaging.PagingRouter.Router (pagingRouterName, pagingRouterWorkerOptions)
import Generated.IncidentPaging.PagingRouter.RouterHarness (routerHarnessValues)
import Keiro.ProcessManager (PoisonPolicy (..), RejectedCommandPolicy (..), WorkerOptions (..))
import Keiro.Router (deterministicRouterCommandId)
import Kiroku.Store.Types (EventId (..), StreamName (..))
import System.Exit (exitFailure)

main :: IO ()
main = do
    let sourceEventId = EventId UUID.nil
        first = deterministicRouterCommandId pagingRouterName "incident-1" sourceEventId (StreamName "page-a") 0
        same = deterministicRouterCommandId pagingRouterName "incident-1" sourceEventId (StreamName "page-a") 0
        otherTarget = deterministicRouterCommandId pagingRouterName "incident-1" sourceEventId (StreamName "page-b") 0
        otherOccurrence = deterministicRouterCommandId pagingRouterName "incident-1" sourceEventId (StreamName "page-a") 1
        checks =
            [ ("router name", pagingRouterName == "jitsurei-paging")
            , ("rejected policy lowered", rejectedCommandPolicy pagingRouterWorkerOptions == RejectedDeadLetter)
            , ("poison policy lowered", poisonIsHalt pagingRouterWorkerOptions)
            , ("id stable across calls", first == same)
            , ("id discriminates target stream", first /= otherTarget)
            , ("id discriminates occurrence", first /= otherOccurrence)
            , ("harness pins target-keyed inputs", lookup "dispatchIdInputs" routerHarnessValues == Just "(name, key, sourceEventId, targetStreamName, occurrence)")
            ]
    mapM_ (\(label, ok) -> putStrLn (label <> ": " <> show ok)) checks
    unless (all snd checks) exitFailure

poisonIsHalt :: WorkerOptions es msg -> Bool
poisonIsHalt options = case poisonPolicy options of
    PoisonHalt -> True
    _ -> False