packages feed

keiro-dsl-0.18.0.0: test/conformance-id-admission-domains/Generated/IdAdmissionDomains/IdentityLedger/Harness.hs

{-# LANGUAGE OverloadedLabels #-}
-- @generated by keiro-dsl 0.18.0.0 (language keiro-dsl 6) from aggregate IdentityLedger; do not edit.
module Generated.IdAdmissionDomains.IdentityLedger.Harness (harnessAssertions) where

import Generated.IdAdmissionDomains.IdentityLedger.Domain
import Generated.IdAdmissionDomains.IdentityLedger.Codec (encodeIdentityLedgerEvent, parseIdentityLedgerEvent, identityLedgerCodec, encodeIdentityEnvelopeMapped, decodeIdentityEnvelopeMapped)
import Generated.IdAdmissionDomains.IdentityLedger.Transducer (identityLedgerTransducer)
import Keiki.Core (applyEventsEither, defaultValidationOptions, step, validateTransducer, (!))
import Keiro.Codec (eventType)
import Generated.IdAdmissionDomains.Nominals (LegacyId, parseLegacyId)
import Data.Aeson qualified as Aeson
import Data.Aeson.Key qualified as AesonKey
import Data.Aeson.KeyMap qualified as AesonKeyMap
import Data.Either (isLeft, isRight)
import Data.List.NonEmpty qualified as NonEmpty
import Data.Text qualified as T
import Keiro.Codec.Structural (FixtureCases (..))
import Conformance.IdAdmissionDomains.Bindings qualified as Bindings

-- | (label, passed). A driver runs these and exits non-zero on any False,
-- naming the failing assertion. Filling a hole wrongly turns a specific
-- entry False; the scaffold cannot.
harnessAssertions :: [(String, Bool)]
harnessAssertions =
  [ ("validateTransducer is empty", null (validateTransducer defaultValidationOptions identityLedgerTransducer))
  -- clock-free: spec samples no wall clock (verified at scaffold time)
  , ("golden round-trip: IdentityRecorded", roundTrips sampleEventIdentityRecorded)
  , ("golden round-trip: IdentityAudited", roundTrips sampleEventIdentityAudited)
  , ("golden round-trip: LegacyIdentityImported", roundTrips sampleEventLegacyIdentityImported)
  , ("accepts RecordIdentity from IdentityLedgerOpen", acceptRecordIdentity)
  ]
  ++ mappedConformanceAssertions
  ++ forwardReplayRecordIdentity

roundTrips :: IdentityLedgerEvent -> Bool
roundTrips e = parseIdentityLedgerEvent (eventType identityLedgerCodec e) (encodeIdentityLedgerEvent e) == Right e

sampleLegacyId :: LegacyId
sampleLegacyId =
  case parseLegacyId "legacy_01h455vb4pex5vsknk084sn02q" of
    Right parsed -> parsed
    Left problem -> error (show problem)

sampleEventIdentityRecorded :: IdentityLedgerEvent
sampleEventIdentityRecorded = IdentityRecorded (IdentityRecordedData sampleLegacyId (snd (NonEmpty.head (fixtureCases Bindings.identityEnvelopeFixtures))))

sampleEventIdentityAudited :: IdentityLedgerEvent
sampleEventIdentityAudited = IdentityAudited (IdentityAuditedData sampleLegacyId (snd (NonEmpty.head (fixtureCases Bindings.identityEnvelopeFixtures))))

sampleEventLegacyIdentityImported :: IdentityLedgerEvent
sampleEventLegacyIdentityImported = LegacyIdentityImported (LegacyIdentityImportedData sampleLegacyId (snd (NonEmpty.head (fixtureCases Bindings.identityEnvelopeFixtures))))

acceptRecordIdentity :: Bool
acceptRecordIdentity =
  case step identityLedgerTransducer (IdentityLedgerOpen, initialIdentityLedgerRegs) (RecordIdentity (RecordIdentityData sampleLegacyId (snd (NonEmpty.head (fixtureCases Bindings.identityEnvelopeFixtures))))) of
    Just (v, _, _) -> v == IdentityLedgerOpen
    Nothing -> False

-- forward/replay equality (plan 147): cross the persisted codec boundary,
-- replay the emitted chain, and compare the final vertex and every register.
forwardReplayRecordIdentity :: [(String, Bool)]
forwardReplayRecordIdentity =
  case step identityLedgerTransducer (IdentityLedgerOpen, initialIdentityLedgerRegs) (RecordIdentity (RecordIdentityData sampleLegacyId (snd (NonEmpty.head (fixtureCases Bindings.identityEnvelopeFixtures))))) of
    Nothing -> [(prefix <> "forward step accepted", False)]
    Just (forwardVertex, forwardRegs, emitted) ->
      case mapM (\event -> parseIdentityLedgerEvent (eventType identityLedgerCodec event) (encodeIdentityLedgerEvent event)) emitted of
        Left _ -> [(prefix <> "emitted chain decodes", False)]
        Right decodedEvents ->
          case applyEventsEither identityLedgerTransducer (IdentityLedgerOpen, initialIdentityLedgerRegs) decodedEvents of
            Left _ -> [(prefix <> "replay succeeds", False)]
            Right (replayVertex, replayRegs) ->
              [ (prefix <> "final vertex", replayVertex == forwardVertex)
              , (prefix <> "register current", (replayRegs ! #current) == (forwardRegs ! #current))
              ]
  where
    prefix = "forward/replay equality: RecordIdentity from IdentityLedgerOpen -- "

mappedConformanceAssertions :: [(String, Bool)]
mappedConformanceAssertions =
  concat
    [ identityRecordedEnvelopeAssertions
    , identityAuditedEnvelopeAssertions
    , legacyIdentityImportedEnvelopeAssertions
    , structuralWirePolicyAssertions
    ]

identityRecordedEnvelopeAssertions :: [(String, Bool)]
identityRecordedEnvelopeAssertions =
  [ ("mapped codec round-trip: IdentityRecorded/envelope/" <> T.unpack label, roundTrips (IdentityRecorded (IdentityRecordedData sampleLegacyId mappedValue)))
  | (label, mappedValue) <- NonEmpty.toList (fixtureCases Bindings.identityEnvelopeFixtures)
  ]

identityAuditedEnvelopeAssertions :: [(String, Bool)]
identityAuditedEnvelopeAssertions =
  [ ("mapped codec round-trip: IdentityAudited/envelope/" <> T.unpack label, roundTrips (IdentityAudited (IdentityAuditedData sampleLegacyId mappedValue)))
  | (label, mappedValue) <- NonEmpty.toList (fixtureCases Bindings.identityEnvelopeFixtures)
  ]

legacyIdentityImportedEnvelopeAssertions :: [(String, Bool)]
legacyIdentityImportedEnvelopeAssertions =
  [ ("mapped codec round-trip: LegacyIdentityImported/envelope/" <> T.unpack label, roundTrips (LegacyIdentityImported (LegacyIdentityImportedData sampleLegacyId mappedValue)))
  | (label, mappedValue) <- NonEmpty.toList (fixtureCases Bindings.identityEnvelopeFixtures)
  ]

structuralWirePolicyAssertions :: [(String, Bool)]
structuralWirePolicyAssertions =
  [ ("wire policy missing default: conformance.id-admission-domains.IdentityEnvelope.v1/previousId", case decodeIdentityEnvelopeMapped (deleteObjectField "previousId" (encodeIdentityEnvelopeMapped (snd (NonEmpty.head (fixtureCases Bindings.identityEnvelopeFixtures))))) of Left _ -> False; Right decoded -> objectField "previousId" (encodeIdentityEnvelopeMapped decoded) == Just (Aeson.Null))
  , ("wire policy explicit null: conformance.id-admission-domains.IdentityEnvelope.v1/previousId", isRight (decodeIdentityEnvelopeMapped (insertObjectField "previousId" Aeson.Null (encodeIdentityEnvelopeMapped (snd (NonEmpty.head (fixtureCases Bindings.identityEnvelopeFixtures)))))))
  , ("wire policy unknown fields: conformance.id-admission-domains.IdentityEnvelope.v1", all (\(_, value) -> isLeft (decodeIdentityEnvelopeMapped (insertObjectField "__keiro_unknown" (Aeson.Bool True) (encodeIdentityEnvelopeMapped value)))) (NonEmpty.toList (fixtureCases Bindings.identityEnvelopeFixtures)))
  ]

deleteObjectField :: T.Text -> Aeson.Value -> Aeson.Value
deleteObjectField key (Aeson.Object objectValue) = Aeson.Object (AesonKeyMap.delete (AesonKey.fromText key) objectValue)
deleteObjectField _ value = value

insertObjectField :: T.Text -> Aeson.Value -> Aeson.Value -> Aeson.Value
insertObjectField key inserted (Aeson.Object objectValue) = Aeson.Object (AesonKeyMap.insert (AesonKey.fromText key) inserted objectValue)
insertObjectField _ _ value = value

objectField :: T.Text -> Aeson.Value -> Maybe Aeson.Value
objectField key (Aeson.Object objectValue) = AesonKeyMap.lookup (AesonKey.fromText key) objectValue
objectField _ _ = Nothing