packages feed

keiro-dsl-0.12.0.0: test/conformance-mapped-queue/Main.hs

module Main (main) where

import Conformance.MappedQueue.Domain (Geometry (..), JobMetadata (..), JobPayload (..))
import Control.Monad (forM_, unless)
import Data.Aeson (Value (..), object, (.=))
import Data.Aeson.KeyMap qualified as KeyMap
import Data.Text (Text)
import Generated.MappedQueue.MappedJobs.Queue
import Generated.MappedQueue.MappedJobs.QueueCodec (mappedJobsJobCodec)
import Generated.MappedQueue.StructuralConformance (structuralConformanceAssertions)
import Keiro.PGMQ.Codec (JobCodec (..))
import System.Exit (exitFailure)

main :: IO ()
main = do
  let job = JobPayload "job-7" "priority-job" (Just (JobMetadata (Just "priority"))) (Geometry "POINT (1 2)")
      payload = MappedJob job Nothing (object ["trace_id" .= ("trace-7" :: Text)])
      encoded = encodeMappedJob payload
      expectedPayload =
        object
          [ "job"
              .= object
                [ "job_id" .= ("job-7" :: Text),
                  "label" .= ("priority-job" :: Text),
                  "metadata" .= object ["note" .= ("priority" :: Text)],
                  "geometry" .= ("POINT (1 2)" :: Text)
                ],
            "maybe_job" .= Null,
            "trace" .= object ["trace_id" .= ("trace-7" :: Text)]
          ]
      envelope =
        object
          [ "v" .= (1 :: Int),
            "t" .= ("MappedJob" :: Text),
            "data" .= expectedPayload
          ]
      missingRequired = case encoded of
        Object fields -> parseMappedJob (Object (KeyMap.delete "job" fields))
        _ -> error "mapped queue encoder did not produce an object"
      unknownNested = case encoded of
        Object fields -> case KeyMap.lookup "job" fields of
          Just (Object jobFields) ->
            parseMappedJob (Object (KeyMap.insert "job" (Object (KeyMap.insert "extra" Null jobFields)) fields))
          _ -> error "mapped queue job field was not an object"
        _ -> error "mapped queue encoder did not produce an object"
      assertions =
        [ ("payload bytes", encoded == expectedPayload),
          ("domain round-trip", parseMappedJob encoded == Right payload),
          ("required key rejects omission", isLeft missingRequired),
          ("present null admits Optional", (maybeJob <$> parseMappedJob encoded) == Right Nothing),
          ("nested reject-unknown policy", isLeft unknownNested),
          ("versioned {v,t,data} envelope", encodeJob mappedJobsJobCodec payload == envelope && decodeJob mappedJobsJobCodec envelope == Right payload),
          ("schema-v1 physical queue", queuePhysical == "mapped_jobs")
        ]
          <> [("structural/" <> label, passed) | (label, passed) <- structuralConformanceAssertions]
  forM_ assertions $ \(label, passed) ->
    putStrLn ((if passed then "PASS  " else "FAIL  ") <> label)
  unless (all snd assertions) exitFailure

isLeft :: Either problem value -> Bool
isLeft (Left _) = True
isLeft (Right _) = False