packages feed

poppy-codegen-1.0.0: test/Poppy/Codegen/SchemaSpec.hs

{-# LANGUAGE OverloadedStrings #-}

module Poppy.Codegen.SchemaSpec
  ( schemaSpec,
  )
where

import Poppy.Codegen.IR (modelName, modelRelations, relName, schemaModels)
import Poppy.Codegen.Schema
import Poppy.Codegen.Spec.Editor (editorSchema)
import Poppy.Codegen.Spec.Shelf (shelfSchema)
import Test.Hspec

schemaSpec :: Spec
schemaSpec =
  describe "Poppy.Codegen.Schema" $ do
    it "keeps relation names as declared" $ do
      let parent =
            model
              "Parent"
              [uuid "id" & pk]
              [hasMany "kids" "Kid" "parentId"]
          child =
            model
              "Kid"
              [uuid "id" & pk, uuid "parentId"]
              []
          built = schema [] [parent, child] []
          parentModel = head (schemaModels built)
      map relName (modelRelations parentModel) `shouldBe` ["kids"]

    it "derives Shelf relations from the model" $ do
      let shelf = head [m | m <- schemaModels shelfSchema, modelName m == "Shelf"]
      map relName (modelRelations shelf) `shouldBe` ["books", "tags"]

    it "keeps two relations to the same model as distinct edges" $ do
      let editor = head [m | m <- schemaModels editorSchema, modelName m == "Editor"]
      map relName (modelRelations editor) `shouldBe` ["writtenPosts", "editedPosts"]