{-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE QuasiQuotes #-} module Test.DirectiveSpec ( spec ) where import Data.Aeson (object, (.=)) import qualified Data.Aeson as Aeson import qualified Data.HashMap.Strict as HashMap import Language.GraphQL import Language.GraphQL.Type import qualified Language.GraphQL.Type.Out as Out import Test.Hspec (Spec, describe, it, shouldBe) import Text.RawString.QQ (r) experimentalResolver :: Schema IO experimentalResolver = Schema { query = queryType, mutation = Nothing } where resolver = pure $ Int 5 queryType = Out.ObjectType "Query" Nothing [] $ HashMap.singleton "experimentalField" $ Out.Resolver (Out.Field Nothing (Out.NamedScalarType int) mempty) resolver emptyObject :: Aeson.Value emptyObject = object [ "data" .= object [] ] spec :: Spec spec = describe "Directive executor" $ do it "should be able to @skip fields" $ do let sourceQuery = [r| { experimentalField @skip(if: true) } |] actual <- graphql experimentalResolver sourceQuery actual `shouldBe` emptyObject it "should not skip fields if @skip is false" $ do let sourceQuery = [r| { experimentalField @skip(if: false) } |] expected = object [ "data" .= object [ "experimentalField" .= (5 :: Int) ] ] actual <- graphql experimentalResolver sourceQuery actual `shouldBe` expected it "should skip fields if @include is false" $ do let sourceQuery = [r| { experimentalField @include(if: false) } |] actual <- graphql experimentalResolver sourceQuery actual `shouldBe` emptyObject it "should be able to @skip a fragment spread" $ do let sourceQuery = [r| { ...experimentalFragment @skip(if: true) } fragment experimentalFragment on ExperimentalType { experimentalField } |] actual <- graphql experimentalResolver sourceQuery actual `shouldBe` emptyObject it "should be able to @skip an inline fragment" $ do let sourceQuery = [r| { ... on ExperimentalType @skip(if: true) { experimentalField } } |] actual <- graphql experimentalResolver sourceQuery actual `shouldBe` emptyObject