packages feed

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

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

module Main (main) where

import Control.Monad (unless)
import Effectful (Eff, (:>))
import Generated.HospitalCapacity.Transfer_decisions.ReadModel
import Generated.HospitalCapacity.Transfer_decisions.ReadModelHarness (readModelFacts, runReadModelFacts)
import Keiro.Projection (AsyncProjection (..))
import Keiro.ReadModel (ConsistencyMode (..), ReadModel (..), ReadModelMetadata, StrongScope (..), qualifiedTableName)
import Keiro.ReadModel.Rebuild (RebuildError)
import Kiroku.Store.Effect (Store)
import Kiroku.Store.Types (GlobalPosition)
import System.Exit (exitFailure)

main :: IO ()
main = do
    factsOk <- runReadModelFacts
    let recordOk =
            transferDecisionsReadModel.name == "hospital-capacity-transfer-decisions"
                && transferDecisionsReadModel.tableName == "transfer_decisions"
                && transferDecisionsReadModel.schema == "hospital_capacity"
                && transferDecisionsReadModel.subscriptionName == "hospital-capacity-transfer-decisions-sub"
                && transferDecisionsReadModel.version == 1
                && transferDecisionsReadModel.shapeHash == "fnv1a:3717f6d9e3c44bd6"
        consistencyOk = case transferDecisionsReadModel.defaultConsistency of
            Strong -> True
            _ -> False
        scopeOk = case transferDecisionsReadModel.strongScope of
            CategoryHead "reservation" -> True
            _ -> False
        qualifiedTableOk =
            qualifiedTableName transferDecisionsReadModel == transferDecisionsQualifiedTable
                && transferDecisionsQualifiedTable == "\"hospital_capacity\".\"transfer_decisions\""
        asyncOk =
            transferDecisionsAsyncProjection.readModelName == transferDecisionsReadModel.name
                && transferDecisionsAsyncProjection.subscriptionName == transferDecisionsReadModel.subscriptionName
                && transferDecisionsAsyncProjection.name == "hospital-capacity-transfer-decisions-async"
        allOk = factsOk && all (\(_, expected, actual) -> expected == actual) readModelFacts && recordOk && consistencyOk && scopeOk && qualifiedTableOk && asyncOk
    putStrLn ("read-model facts: " <> show factsOk)
    putStrLn ("runtime record: " <> show recordOk)
    putStrLn ("consistency/scope: " <> show (consistencyOk && scopeOk))
    putStrLn ("qualified table: " <> show qualifiedTableOk)
    putStrLn ("async identity: " <> show asyncOk)
    unless allOk exitFailure

_usesRegister :: (Store :> es) => Eff es ()
_usesRegister = registerTransferDecisions

_usesStartRebuild :: (Store :> es) => GlobalPosition -> Eff es ReadModelMetadata
_usesStartRebuild = startTransferDecisionsRebuild

_usesFinishRebuild :: (Store :> es) => GlobalPosition -> Eff es (Either RebuildError ReadModelMetadata)
_usesFinishRebuild = finishTransferDecisionsRebuild

_usesAbandonRebuild :: (Store :> es) => Eff es ReadModelMetadata
_usesAbandonRebuild = abandonTransferDecisionsRebuild