summaryrefslogtreecommitdiff
path: root/tests/Language/GraphQL/RootOperationSpec.hs
blob: 118e6d4a3ce2cabef443979f9e0e4f062f79719b (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
{- 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.RootOperationSpec
    ( spec
    ) where

import Data.HashMap.Strict (HashMap)
import qualified Data.HashMap.Strict as HashMap
import Language.GraphQL
import Language.GraphQL.AST (Name)
import Test.Hspec (Spec, describe, it)
import Language.GraphQL.TH
import Language.GraphQL.Type
import qualified Language.GraphQL.Type.Out as Out
import Test.Hspec.GraphQL

hatType :: Out.ObjectType IO
hatType = Out.ObjectType "Hat" Nothing []
    $ HashMap.singleton "circumference"
    $ ValueResolver (Out.Field Nothing (Out.NamedScalarType int) mempty)
    $ pure $ Int 60

garmentSchema :: Schema IO
garmentSchema = schema queryType (Just mutationType) Nothing mempty
  where
    queryType = Out.ObjectType "Query" Nothing [] hatFieldResolver
    mutationType = Out.ObjectType "Mutation" Nothing [] incrementFieldResolver
    garment = pure $ Object $ HashMap.fromList
        [ ("circumference", Int 60)
        ]
    incrementFieldResolver = HashMap.singleton "incrementCircumference"
        $ ValueResolver (Out.Field Nothing (Out.NamedScalarType int) mempty)
        $ pure $ Int 61
    hatField = Out.Field Nothing (Out.NamedObjectType hatType) mempty
    hatFieldResolver =
        HashMap.singleton "garment" $ ValueResolver hatField garment

spec :: Spec
spec =
    describe "Root operation type" $ do
        it "returns objects from the root resolvers" $ do
            let querySource = [gql|
              {
                garment {
                  circumference
                }
              }
            |]
                expected = Object
                    $ HashMap.singleton "garment"
                    $ Object
                    $ HashMap.singleton "circumference"
                    $ Int 60
            actual <- graphql garmentSchema Nothing (mempty :: HashMap Name Value) querySource
            actual `shouldResolveTo` expected

        it "chooses Mutation" $ do
            let querySource = [gql|
              mutation {
                incrementCircumference
              }
            |]
                expected = Object
                    $ HashMap.singleton "incrementCircumference"
                    $ Int 61
            actual <- graphql garmentSchema Nothing (mempty :: HashMap Name Value) querySource
            actual `shouldResolveTo` expected