summaryrefslogtreecommitdiff
path: root/tests/Test/DirectiveSpec.hs
blob: ca1103b245373b82884678f43fd0805665ec6bc8 (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
89
90
91
92
{-# 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.Definition
import qualified Language.GraphQL.Type.Out as Out
import Language.GraphQL.Type.Schema (Schema(..))
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