packages feed

keiro-dsl-0.2.0.0: test/conformance-newsurface/Main.hs

{-# LANGUAGE OverloadedRecordDot #-}
{-# LANGUAGE OverloadedStrings #-}

module Main (main) where

import Control.Monad (unless)
import Effectful (runPureEff)
import Generated.TransferRouting.Hospital.Domain qualified as Hospital
import Generated.TransferRouting.Hospital.EventStream (hospitalCategory, hospitalEventStream)
import Generated.TransferRouting.Hospital.Harness (harnessAssertions)
import Generated.TransferRouting.HospitalTransferRouter.RouterHarness (routerHarnessValues)
import Generated.TransferRouting.Hospital_load.ReadModelHarness (runReadModelFacts)
import Keiro.ProcessManager (PMCommand (..))
import Keiro.Router (Router (..))
import Keiro.Stream (entityStream)
import System.Exit (exitFailure)
import TransferRouting.HospitalTransferRouter.RouterValue (
    AcceptedHospitalTransferNeed (..),
    hospitalTransferRouter,
 )

main :: IO ()
main = do
    readModelFactsPass <- runReadModelFacts
    let input =
            AcceptedHospitalTransferNeed
                { transferNeedId = "need-42"
                , region = "north"
                }
        commands = runPureEff (hospitalTransferRouter.resolve input)
        checks =
            [("aggregate: " <> label, passed) | (label, passed) <- harnessAssertions]
                <> [ ("validated hospital event stream constructs", hospitalEventStream `seq` True)
                   , ("read-model facts", readModelFactsPass)
                   , ("router name", hospitalTransferRouter.name == "hospital-transfer-router")
                   , ("router key", hospitalTransferRouter.key input == "need-42")
                   ,
                       ( "resolver source is hospital_load"
                       , lookup "resolveSource" routerHarnessValues == Just "read-model hospital_load"
                       )
                   ,
                       ( "rejected commands dead-letter"
                       , lookup "rejectedPolicy" routerHarnessValues == Just "deadLetter"
                       )
                   ,
                       ( "resolver targets the selected hospital aggregate"
                       , map target commands == [entityStream hospitalCategory "north-general"]
                       )
                   ,
                       ( "resolver dispatches the accepted need"
                       , map command commands
                            == [ Hospital.RouteAcceptedTransferNeed
                                    (Hospital.RouteAcceptedTransferNeedData "need-42" "north-general")
                               ]
                       )
                   ]
    mapM_ printCheck checks
    unless (all snd checks) exitFailure

printCheck :: (String, Bool) -> IO ()
printCheck (label, passed) =
    putStrLn ((if passed then "PASS  " else "FAIL  ") <> label)