graphql-api-0.1.1: tests/ResolverTests.hs
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeOperators #-}
module ResolverTests (tests) where
import Protolude hiding (Enum)
import Test.Tasty (TestTree)
import Test.Tasty.Hspec (testSpec, describe, it, shouldBe)
import Data.Aeson (encode)
import GraphQL
( Response(..)
, interpretAnonymousQuery
)
import GraphQL.API
( Object
, Field
, Argument
, (:>)
)
import GraphQL.Resolver
( Handler
, ResolverError(..)
, (:<>)(..)
)
import GraphQL.Internal.Name (unsafeMakeName)
import GraphQL.Internal.Output (singleError)
-- Test a custom error monad
type TMonad = ExceptT Text IO
type T = Object "T" '[] '[ Field "z" Int32
, Argument "x" Int32 :> Field "t" Int32
, Argument "y" Int32 :> Field "q" Int32
]
tHandler :: Handler TMonad T
tHandler =
pure $ (pure 10) :<> (\tArg -> pure tArg) :<> (pure . (*2))
tests :: IO TestTree
tests = testSpec "TypeAPI" $ do
describe "tTest" $ do
it "works in a simple case" $ do
Right (Success object) <- runExceptT (interpretAnonymousQuery @T tHandler "{ t(x: 12) }")
encode object `shouldBe` "{\"t\":12}"
it "complains about missing field" $ do
Right (PartialSuccess _ errs) <- runExceptT (interpretAnonymousQuery @T tHandler "{ not_a_field }")
errs `shouldBe` singleError (FieldNotFoundError (unsafeMakeName "not_a_field"))
it "complains about missing argument" $ do
Right (PartialSuccess _ errs) <- runExceptT (interpretAnonymousQuery @T tHandler "{ t }")
errs `shouldBe` singleError (ValueMissing (unsafeMakeName "x"))