summaryrefslogtreecommitdiff
path: root/tests/Test/DirectiveSpec.hs
blob: 3b9da1953842a98f59c7247fb7d3183dfc9311e0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE QuasiQuotes #-}
module Test.DirectiveSpec
    ( spec
    ) where

import Data.Aeson (Value, object, (.=))
import Data.HashMap.Strict (HashMap)
import qualified Data.HashMap.Strict as HashMap
import Data.List.NonEmpty (NonEmpty(..))
import Data.Text (Text)
import Language.GraphQL
import qualified Language.GraphQL.Schema as Schema
import Test.Hspec (Spec, describe, it, shouldBe)
import Text.RawString.QQ (r)

experimentalResolver :: HashMap Text (NonEmpty (Schema.Resolver IO))
experimentalResolver = HashMap.singleton "Query"
    $ Schema.scalar "experimentalField" (pure (5 :: Int)) :| []

emptyObject :: Value
emptyObject = object
    [ "data" .= object []
    ]

spec :: Spec
spec =
    describe "Directive executor" $ do
        it "should be able to @skip fields" $ do
            let query = [r|
              {
                experimentalField @skip(if: true)
              }
            |]

            actual <- graphql experimentalResolver query
            actual `shouldBe` emptyObject

        it "should not skip fields if @skip is false" $ do
            let query = [r|
              {
                experimentalField @skip(if: false)
              }
            |]
                expected = object
                    [ "data" .= object
                        [ "experimentalField" .= (5 :: Int)
                        ]
                    ]

            actual <- graphql experimentalResolver query
            actual `shouldBe` expected

        it "should skip fields if @include is false" $ do
            let query = [r|
              {
                experimentalField @include(if: false)
              }
            |]

            actual <- graphql experimentalResolver query
            actual `shouldBe` emptyObject

        it "should be able to @skip a fragment spread" $ do
            let query = [r|
              {
                ...experimentalFragment @skip(if: true)
              }

              fragment experimentalFragment on ExperimentalType {
                experimentalField
              }
            |]

            actual <- graphql experimentalResolver query
            actual `shouldBe` emptyObject

        it "should be able to @skip an inline fragment" $ do
            let query = [r|
              {
                ... on ExperimentalType @skip(if: true) {
                  experimentalField
                }
              }
            |]

            actual <- graphql experimentalResolver query
            actual `shouldBe` emptyObject