summaryrefslogtreecommitdiff
path: root/tests/Language/GraphQL/DirectiveSpec.hs
diff options
context:
space:
mode:
Diffstat (limited to 'tests/Language/GraphQL/DirectiveSpec.hs')
-rw-r--r--tests/Language/GraphQL/DirectiveSpec.hs92
1 files changed, 92 insertions, 0 deletions
diff --git a/tests/Language/GraphQL/DirectiveSpec.hs b/tests/Language/GraphQL/DirectiveSpec.hs
new file mode 100644
index 0000000..40f6215
--- /dev/null
+++ b/tests/Language/GraphQL/DirectiveSpec.hs
@@ -0,0 +1,92 @@
+{- This Source Code Form is subject to the terms of the Mozilla Public License,
+ v. 2.0. If a copy of the MPL was not distributed with this file, You can
+ obtain one at https://mozilla.org/MPL/2.0/. -}
+
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE QuasiQuotes #-}
+module Language.GraphQL.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.TH
+import Language.GraphQL.Type
+import qualified Language.GraphQL.Type.Out as Out
+import Test.Hspec (Spec, describe, it)
+import Test.Hspec.GraphQL
+
+experimentalResolver :: Schema IO
+experimentalResolver = schema queryType Nothing Nothing mempty
+ where
+ queryType = Out.ObjectType "Query" Nothing []
+ $ HashMap.singleton "experimentalField"
+ $ Out.ValueResolver (Out.Field Nothing (Out.NamedScalarType int) mempty)
+ $ pure $ Int 5
+
+emptyObject :: Aeson.Object
+emptyObject = HashMap.singleton "data" $ object []
+
+spec :: Spec
+spec =
+ describe "Directive executor" $ do
+ it "should be able to @skip fields" $ do
+ let sourceQuery = [gql|
+ {
+ experimentalField @skip(if: true)
+ }
+ |]
+
+ actual <- graphql experimentalResolver sourceQuery
+ actual `shouldResolveTo` emptyObject
+
+ it "should not skip fields if @skip is false" $ do
+ let sourceQuery = [gql|
+ {
+ experimentalField @skip(if: false)
+ }
+ |]
+ expected = HashMap.singleton "data"
+ $ object
+ [ "experimentalField" .= (5 :: Int)
+ ]
+ actual <- graphql experimentalResolver sourceQuery
+ actual `shouldResolveTo` expected
+
+ it "should skip fields if @include is false" $ do
+ let sourceQuery = [gql|
+ {
+ experimentalField @include(if: false)
+ }
+ |]
+
+ actual <- graphql experimentalResolver sourceQuery
+ actual `shouldResolveTo` emptyObject
+
+ it "should be able to @skip a fragment spread" $ do
+ let sourceQuery = [gql|
+ {
+ ...experimentalFragment @skip(if: true)
+ }
+
+ fragment experimentalFragment on Query {
+ experimentalField
+ }
+ |]
+
+ actual <- graphql experimentalResolver sourceQuery
+ actual `shouldResolveTo` emptyObject
+
+ it "should be able to @skip an inline fragment" $ do
+ let sourceQuery = [gql|
+ {
+ ... on Query @skip(if: true) {
+ experimentalField
+ }
+ }
+ |]
+
+ actual <- graphql experimentalResolver sourceQuery
+ actual `shouldResolveTo` emptyObject