mirror of
https://github.com/hasura/graphql-engine.git
synced 2024-12-18 13:02:11 +03:00
145 lines
4.2 KiB
Haskell
145 lines
4.2 KiB
Haskell
|
{-# LANGUAGE DeriveAnyClass #-}
|
||
|
{-# LANGUAGE QuasiQuotes #-}
|
||
|
|
||
|
-- who tests the test franework?
|
||
|
module Test.Quoter.YamlSpec (spec) where
|
||
|
|
||
|
import Data.Aeson qualified as Aeson
|
||
|
import Data.Aeson.KeyMap qualified as KM
|
||
|
import GHC.Generics
|
||
|
import Harness.Quoter.Yaml (interpolateYaml, yaml)
|
||
|
import Harness.TestEnvironment
|
||
|
import Test.Hspec
|
||
|
import Prelude
|
||
|
|
||
|
--------------------------------------------------------------------------------
|
||
|
|
||
|
-- test datatype we will use to insert some yaml
|
||
|
data MakeSomeYaml = MakeSomeYaml
|
||
|
{ msyString :: String,
|
||
|
msyBool :: Bool,
|
||
|
msyNumber :: Int,
|
||
|
msyArray :: [MakeSomeYaml]
|
||
|
}
|
||
|
deriving stock (Generic)
|
||
|
deriving anyclass (Aeson.ToJSON)
|
||
|
|
||
|
-- ** Preamble
|
||
|
|
||
|
spec :: SpecWith TestEnvironment
|
||
|
spec = describe "Yaml quasiquoters" $ do
|
||
|
describe "yaml quoter" $ do
|
||
|
it "Interpolates a simple value using a Yaml anchor" $ const do
|
||
|
let interpolatedValue = (100 :: Int)
|
||
|
let input =
|
||
|
[yaml|
|
||
|
type: pg_create_select_permission
|
||
|
args:
|
||
|
limit: *interpolatedValue
|
||
|
|]
|
||
|
let expected =
|
||
|
[yaml|
|
||
|
type: pg_create_select_permission
|
||
|
args:
|
||
|
limit: 100
|
||
|
|]
|
||
|
input `shouldBe` expected
|
||
|
|
||
|
it "Interpolates a complex value using a Yaml anchor" $ const do
|
||
|
let complexValue =
|
||
|
MakeSomeYaml
|
||
|
{ msyString = "hello",
|
||
|
msyNumber = 100,
|
||
|
msyBool = True,
|
||
|
msyArray = []
|
||
|
}
|
||
|
let expected =
|
||
|
Aeson.Object
|
||
|
( KM.fromList
|
||
|
[ ("type", Aeson.String "thing"),
|
||
|
("complex", Aeson.toJSON complexValue)
|
||
|
]
|
||
|
)
|
||
|
|
||
|
let input =
|
||
|
[yaml|
|
||
|
type: thing
|
||
|
complex: *complexValue
|
||
|
|]
|
||
|
input `shouldBe` expected
|
||
|
|
||
|
it "Interpolates a key using a Yaml anchor" $ const do
|
||
|
let interpolatedValue = ("limit" :: String)
|
||
|
let input =
|
||
|
[yaml|
|
||
|
type: pg_create_select_permission
|
||
|
args:
|
||
|
*interpolatedValue: 100
|
||
|
|]
|
||
|
let expected =
|
||
|
[yaml|
|
||
|
type: pg_create_select_permission
|
||
|
args:
|
||
|
limit: 100
|
||
|
|]
|
||
|
input `shouldBe` expected
|
||
|
|
||
|
describe "interpolateYaml quoter" $ do
|
||
|
it "Copes with input that contains lots of single quotes" $ const do
|
||
|
let interpolateValue = ("hello" :: String)
|
||
|
let input =
|
||
|
[interpolateYaml|
|
||
|
errors:
|
||
|
- extensions:
|
||
|
code: validation-failed
|
||
|
path: $.selectionSet.hasura_author.selectionSet.notPresentCol
|
||
|
message: |-
|
||
|
field 'notPresentCol' not found in type: '#{interpolateValue}_author'
|
||
|
|]
|
||
|
let expected =
|
||
|
[interpolateYaml|
|
||
|
errors:
|
||
|
- extensions:
|
||
|
code: validation-failed
|
||
|
path: $.selectionSet.hasura_author.selectionSet.notPresentCol
|
||
|
message: |-
|
||
|
field 'notPresentCol' not found in type: 'hello_author'
|
||
|
|]
|
||
|
|
||
|
input `shouldBe` expected
|
||
|
|
||
|
it "Interpolates a Haskell value as expected" $ const do
|
||
|
let interpolatedValue = (100 :: Int)
|
||
|
let input :: Aeson.Value
|
||
|
input =
|
||
|
[interpolateYaml|
|
||
|
type: pg_create_select_permission
|
||
|
args:
|
||
|
limit: #{interpolatedValue}
|
||
|
|]
|
||
|
let expected :: Aeson.Value
|
||
|
expected =
|
||
|
[yaml|
|
||
|
type: pg_create_select_permission
|
||
|
args:
|
||
|
limit: 100
|
||
|
|]
|
||
|
input `shouldBe` expected
|
||
|
|
||
|
it "Interpolates a Haskell expression as expected" $ const do
|
||
|
let input :: Aeson.Value
|
||
|
input =
|
||
|
[interpolateYaml|
|
||
|
type: pg_create_select_permission
|
||
|
args:
|
||
|
limit: #{ (1 + 2 + 3 :: Int) }
|
||
|
|]
|
||
|
let expected :: Aeson.Value
|
||
|
expected =
|
||
|
[yaml|
|
||
|
type: pg_create_select_permission
|
||
|
args:
|
||
|
limit: 6
|
||
|
|]
|
||
|
input `shouldBe` expected
|