mirror of
https://github.com/hasura/graphql-engine.git
synced 2024-12-19 05:21:47 +03:00
75 lines
2.3 KiB
Haskell
75 lines
2.3 KiB
Haskell
|
-- | Common interface for setup/teardown for all backends - schema and data
|
||
|
module Harness.Test.Schema
|
||
|
( Table (..),
|
||
|
Reference (..),
|
||
|
Column (..),
|
||
|
ScalarType (..),
|
||
|
ScalarValue (..),
|
||
|
serialize,
|
||
|
column,
|
||
|
)
|
||
|
where
|
||
|
|
||
|
import Data.Text (Text, replace)
|
||
|
import Hasura.Prelude (tshow)
|
||
|
import Prelude
|
||
|
|
||
|
-- | Generic type to use to specify schema tables for all backends.
|
||
|
-- Usually a list of these make up a "schema" to pass to the respective
|
||
|
-- @Harness.Backend.<Backend>.{setup,teardown}@ functions
|
||
|
--
|
||
|
-- NOTE: There is neither a type-level check to assert that the length of
|
||
|
-- tableColumns matches the length of each row in tableData, nor that the
|
||
|
-- tablePrimaryKey only contains names of columns already in tableColumns or
|
||
|
-- that tableReferences are valid references to other Tables. Test author will
|
||
|
-- need to be just a bit careful while constructing Tables.
|
||
|
data Table = Table
|
||
|
{ tableName :: Text,
|
||
|
tableColumns :: [Column],
|
||
|
tablePrimaryKey :: [Text],
|
||
|
tableReferences :: [Reference],
|
||
|
tableData :: [[ScalarValue]]
|
||
|
}
|
||
|
|
||
|
-- | Foreign keys for backends that support it.
|
||
|
data Reference = Reference
|
||
|
{ referenceLocalColumn :: Text,
|
||
|
referenceTargetTable :: Text,
|
||
|
referenceTargetColumn :: Text
|
||
|
}
|
||
|
|
||
|
-- | Generic type to construct columns for all backends
|
||
|
data Column = Column
|
||
|
{ columnName :: Text,
|
||
|
columnType :: ScalarType,
|
||
|
columnNullable :: Bool,
|
||
|
columnDefault :: Maybe Text
|
||
|
}
|
||
|
|
||
|
-- | Generic scalar type for all backends, for simplicity.
|
||
|
-- Ideally, we would be wiring in @'Backend@ specific scalar types here to make
|
||
|
-- sure all backend-specific scalar types are also covered by tests, perhaps in
|
||
|
-- a future iteration.
|
||
|
data ScalarType
|
||
|
= TInt
|
||
|
| TStr
|
||
|
|
||
|
-- | Generic scalar value type for all backends, that should directly correspond
|
||
|
-- to 'ScalarType'
|
||
|
data ScalarValue
|
||
|
= VInt Int
|
||
|
| VStr Text
|
||
|
|
||
|
-- | Generic 'ScalarValue' serializer.
|
||
|
--
|
||
|
-- NOTE: For serialization of 'ScalarType' we need to have backend-specific
|
||
|
-- functions as they correspond to the query language of the specific backend
|
||
|
serialize :: ScalarValue -> Text
|
||
|
serialize = \case
|
||
|
VInt i -> tshow i
|
||
|
VStr s -> "'" <> replace "'" "\'" s <> "'"
|
||
|
|
||
|
-- | Helper function to construct 'Column's with common defaults
|
||
|
column :: Text -> ScalarType -> Column
|
||
|
column name typ = Column name typ False Nothing
|