graphql-engine/server/src-test/Hasura/Backends/DataConnector/API/V0/TableSpec.hs
2022-10-10 02:25:09 +00:00

97 lines
3.4 KiB
Haskell

{-# LANGUAGE OverloadedLists #-}
{-# LANGUAGE QuasiQuotes #-}
module Hasura.Backends.DataConnector.API.V0.TableSpec (spec, genTableName, genTableInfo) where
import Data.Aeson.QQ.Simple (aesonQQ)
import Data.HashMap.Strict qualified as HashMap
import Hasura.Backends.DataConnector.API.V0
import Hasura.Backends.DataConnector.API.V0.ColumnSpec (genColumnInfo, genColumnName)
import Hasura.Generator.Common
import Hasura.Prelude
import Hedgehog
import Hedgehog.Gen qualified as Gen
import Hedgehog.Range
import Test.Aeson.Utils
import Test.Hspec
spec :: Spec
spec = do
describe "TableName" $ do
testToFromJSONToSchema (TableName ["my_table_name"]) [aesonQQ|["my_table_name"]|]
jsonOpenApiProperties genTableName
describe "TableInfo" $ do
describe "minimal" $
testToFromJSONToSchema
(TableInfo (TableName ["my_table_name"]) [] [] (ForeignKeys mempty) Nothing)
[aesonQQ|
{ "name": ["my_table_name"],
"columns": []
}
|]
describe "non-minimal" $
testToFromJSONToSchema
( TableInfo
(TableName ["my_table_name"])
[ColumnInfo (ColumnName "id") StringTy False Nothing]
[ColumnName "id"]
(ForeignKeys mempty)
(Just "my description")
)
[aesonQQ|
{ "name": ["my_table_name"],
"columns": [{"name": "id", "type": "string", "nullable": false}],
"primary_key": ["id"],
"description": "my description"
}
|]
describe "foreign-key" $
testToFromJSONToSchema
( TableInfo
(TableName ["my_table_name"])
[ColumnInfo (ColumnName "id") StringTy False Nothing]
[ColumnName "id"]
(ForeignKeys $ HashMap.singleton (ConstraintName "Artist") (Constraint (TableName ["artist_table"]) (HashMap.singleton (ColumnName "ArtistId") (ColumnName "ArtistId"))))
(Just "my description")
)
[aesonQQ|
{ "name": ["my_table_name"],
"columns": [{"name": "id", "type": "string", "nullable": false}],
"primary_key": ["id"],
"description": "my description",
"foreign_keys": {
"Artist": {
"foreign_table": ["artist_table"],
"column_mapping": {
"ArtistId": "ArtistId"
}
}
}
}
|]
jsonOpenApiProperties genTableInfo
genTableName :: MonadGen m => m TableName
genTableName = TableName <$> Gen.nonEmpty (linear 1 3) (genArbitraryAlphaNumText defaultRange)
genForeignKeys :: MonadGen m => m ForeignKeys
genForeignKeys = ForeignKeys <$> genHashMap genConstraintName genConstraint defaultRange
genConstraintName :: MonadGen m => m ConstraintName
genConstraintName = ConstraintName <$> genArbitraryAlphaNumText defaultRange
genConstraint :: MonadGen m => m Constraint
genConstraint =
let mapping = genHashMap genColumnName genColumnName defaultRange
in Constraint <$> genTableName <*> mapping
-- | Note: this generator is intended for serialization tests only and does not ensure valid Foreign Key Constraints.
genTableInfo :: MonadGen m => m TableInfo
genTableInfo =
TableInfo
<$> genTableName
<*> Gen.list defaultRange genColumnInfo
<*> Gen.list defaultRange genColumnName
<*> genForeignKeys
<*> Gen.maybe (genArbitraryAlphaNumText defaultRange)