76 lines
2.8 KiB
Haskell
76 lines
2.8 KiB
Haskell
{-# LANGUAGE OverloadedStrings #-}
|
|
module Language.GraphQL.ExecuteSpec
|
|
( spec
|
|
) where
|
|
|
|
import Data.Aeson ((.=))
|
|
import qualified Data.Aeson as Aeson
|
|
import Data.Functor.Identity (Identity(..))
|
|
import Data.HashMap.Strict (HashMap)
|
|
import qualified Data.HashMap.Strict as HashMap
|
|
import Language.GraphQL.AST (Name)
|
|
import Language.GraphQL.AST.Parser (document)
|
|
import Language.GraphQL.Error
|
|
import Language.GraphQL.Execute
|
|
import Language.GraphQL.Type as Type
|
|
import Language.GraphQL.Type.Out as Out
|
|
import Test.Hspec (Spec, describe, it, shouldBe)
|
|
import Text.Megaparsec (parse)
|
|
|
|
schema :: Schema Identity
|
|
schema = Schema {query = queryType, mutation = Nothing}
|
|
|
|
queryType :: Out.ObjectType Identity
|
|
queryType = Out.ObjectType "Query" Nothing []
|
|
$ HashMap.singleton "philosopher"
|
|
$ Out.Resolver philosopherField
|
|
$ pure
|
|
$ Type.Object mempty
|
|
where
|
|
philosopherField =
|
|
Out.Field Nothing (Out.NonNullObjectType philosopherType) HashMap.empty
|
|
|
|
philosopherType :: Out.ObjectType Identity
|
|
philosopherType = Out.ObjectType "Philosopher" Nothing []
|
|
$ HashMap.fromList resolvers
|
|
where
|
|
resolvers =
|
|
[ ("firstName", firstNameResolver)
|
|
, ("lastName", lastNameResolver)
|
|
]
|
|
firstNameResolver = Out.Resolver firstNameField $ pure $ Type.String "Friedrich"
|
|
lastNameResolver = Out.Resolver lastNameField $ pure $ Type.String "Nietzsche"
|
|
firstNameField = Out.Field Nothing (Out.NonNullScalarType string) HashMap.empty
|
|
lastNameField = Out.Field Nothing (Out.NonNullScalarType string) HashMap.empty
|
|
|
|
spec :: Spec
|
|
spec =
|
|
describe "execute" $ do
|
|
it "skips unknown fields" $
|
|
let expected = Aeson.object
|
|
[ "data" .= Aeson.object
|
|
[ "philosopher" .= Aeson.object
|
|
[ "firstName" .= ("Friedrich" :: String)
|
|
]
|
|
]
|
|
]
|
|
execute' = execute schema (mempty :: HashMap Name Aeson.Value)
|
|
actual = runIdentity
|
|
$ either parseError execute'
|
|
$ parse document "" "{ philosopher { firstName surname } }"
|
|
in actual `shouldBe` expected
|
|
it "merges selections" $
|
|
let expected = Aeson.object
|
|
[ "data" .= Aeson.object
|
|
[ "philosopher" .= Aeson.object
|
|
[ "firstName" .= ("Friedrich" :: String)
|
|
, "lastName" .= ("Nietzsche" :: String)
|
|
]
|
|
]
|
|
]
|
|
execute' = execute schema (mempty :: HashMap Name Aeson.Value)
|
|
actual = runIdentity
|
|
$ either parseError execute'
|
|
$ parse document "" "{ philosopher { firstName } philosopher { lastName } }"
|
|
in actual `shouldBe` expected
|