summaryrefslogtreecommitdiff
path: root/tests/Test/StarWars/QueryTests.hs
blob: 994f7bc18d080f7dd4db85cf5ceb8bb2ac9592fc (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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE QuasiQuotes #-}
module Test.StarWars.QueryTests (test) where

import Data.Aeson (object, (.=))
import qualified Data.Aeson as Aeson (Value)
import Data.Text (Text)
import Text.RawString.QQ (r)

import Test.Tasty (TestTree, testGroup)
import Test.Tasty.HUnit (Assertion, testCase, (@?=))

import Data.GraphQL

import Test.StarWars.Schema

-- * Test
-- See https://github.com/graphql/graphql-js/blob/master/src/__tests__/starWarsQueryTests.js

testQuery :: Text -> Aeson.Value -> Assertion
testQuery q expected = graphql schema q @?= Just expected

test :: TestTree
test = testGroup "Star Wars Query Tests"
  [ testGroup "Basic Queries"
    [ testCase "R2-D2 hero" . testQuery
        [r| query HeroNameQuery {
              hero {
                id
              }
            }
        |]
      $ object ["hero" .= object ["id" .= ("2001" :: Text)]]
    , testCase "R2-D2 ID and friends" . testQuery
        [r| query HeroNameAndFriendsQuery {
              hero {
                id
                name
                friends {
                  name
                }
              }
            }
        |]
      $ object [
          "hero" .= object [
              "id" .= ("2001" :: Text)
            , "name" .= ("R2-D2" :: Text)
            , "friends" .= [
                  object ["name" .= ("Luke Skywalker" :: Text)]
                , object ["name" .= ("Han Solo" :: Text)]
                , object ["name" .= ("Leia Organa" :: Text)]
                ]
            ]
        ]
    ]
  , testGroup "Nested Queries"
    [ testCase "R2-D2 friends" . testQuery
        [r| query NestedQuery {
              hero {
                name
                friends {
                  name
                  appearsIn
                    friends {
                      name
                    }
                }
              }
            }
        |]
      $ object [
          "hero" .= object [
              "name" .= ("R2-D2" :: Text)
            , "friends" .= [
                  object [
                      "name" .= ("Luke Skywalker" :: Text)
                    , "appearsIn" .= ["NEWHOPE","EMPIRE","JEDI" :: Text]
                    , "friends" .= [
                          object ["name" .= ("Han Solo" :: Text)]
                        , object ["name" .= ("Leia Organa" :: Text)]
                        , object ["name" .= ("C-3PO" :: Text)]
                        , object ["name" .= ("R2-D2" :: Text)]
                        ]
                    ]
                , object [
                      "name" .= ("Han Solo" :: Text)
                    , "appearsIn" .= [ "NEWHOPE","EMPIRE","JEDI" :: Text]
                    , "friends" .= [
                          object ["name" .= ("Luke Skywalker" :: Text)]
                        , object ["name" .= ("Leia Organa" :: Text)]
                        , object ["name" .= ("R2-D2" :: Text)]
                        ]
                    ]
                , object [
                      "name" .= ("Leia Organa" :: Text)
                    , "appearsIn" .= [ "NEWHOPE","EMPIRE","JEDI" :: Text]
                    , "friends" .= [
                          object ["name" .= ("Luke Skywalker" :: Text)]
                        , object ["name" .= ("Han Solo" :: Text)]
                        , object ["name" .= ("C-3PO" :: Text)]
                        , object ["name" .= ("R2-D2" :: Text)]
                        ]
                    ]
                ]
            ]
        ]
    , testCase "Luke ID" . testQuery
        [r| query FetchLukeQuery {
              human(id: "1000") {
                name
              }
            }
        |]
      $ object [
          "human" .= object [
             "name" .= ("Luke Skywalker" :: Text)
          ]
        ]
    ]
  ]