1
1
"""Tests for the GraphQL Response Parser.
2
2
3
- These tests are worthless until I have a schema I can work with.
3
+ At the moment we use the Star Wars schema which is fetched each time from the
4
+ server endpoint. In future it would be better to store this schema in a file
5
+ locally.
4
6
"""
5
7
import copy
6
8
from gql .response_parser import ResponseParser
7
-
9
+ import pytest
10
+ import requests
11
+ from gql import Client
12
+ from gql .transport .requests import RequestsHTTPTransport
8
13
9
14
class Capitalize ():
15
+ @classmethod
10
16
def parse_value (self , value : str ):
11
17
return value .upper ();
12
18
13
- def test_scalar_type_name_for_scalar_field_returns_name (gql_schema ):
14
- parser = ResponseParser (gql_schema )
15
- schema_obj = gql_schema .get_type_map ().get ('Wallet' )
19
+ @pytest .fixture
20
+ def schema ():
21
+ request = requests .get ('http://swapi.graphene-python.org/graphql' ,
22
+ headers = {
23
+ 'Host' : 'swapi.graphene-python.org' ,
24
+ 'Accept' : 'text/html' ,
25
+ })
26
+ request .raise_for_status ()
27
+ csrf = request .cookies ['csrftoken' ]
16
28
17
- assert parser ._get_scalar_type_name (schema_obj .fields ['balance' ]) == 'Money'
29
+ client = Client (
30
+ transport = RequestsHTTPTransport (url = 'http://swapi.graphene-python.org/graphql' ,
31
+ cookies = {"csrftoken" : csrf },
32
+ headers = {'x-csrftoken' : csrf }),
33
+ fetch_schema_from_transport = True
34
+ )
18
35
36
+ return client .schema
19
37
20
- def test_scalar_type_name_for_non_scalar_field_returns_none (gql_schema ):
21
- parser = ResponseParser (gql_schema )
22
- schema_obj = gql_schema .get_type_map ().get ('Wallet' )
38
+ def test_scalar_type_name_for_scalar_field_returns_name (schema ):
39
+ parser = ResponseParser (schema )
40
+ schema_obj = schema .get_query_type ().fields ['film' ]
41
+
42
+ assert parser ._get_scalar_type_name (schema_obj .type .fields ['releaseDate' ]) == 'DateTime'
23
43
24
- assert parser ._get_scalar_type_name (schema_obj .fields ['user' ]) is None
44
+
45
+ def test_scalar_type_name_for_non_scalar_field_returns_none (schema ):
46
+ parser = ResponseParser (schema )
47
+ schema_obj = schema .get_query_type ().fields ['film' ]
48
+
49
+ assert parser ._get_scalar_type_name (schema_obj .type .fields ['species' ]) is None
25
50
26
51
def test_lookup_scalar_type (gql_schema ):
27
52
parser = ResponseParser (gql_schema )
28
53
29
- assert parser ._lookup_scalar_type (["wallet" ]) is None
30
- assert parser ._lookup_scalar_type (["searchWallets" ]) is None
31
- assert parser ._lookup_scalar_type (["wallet" , "balance" ]) == 'Money'
32
- assert parser ._lookup_scalar_type (["searchWallets" , "balance" ]) == 'Money'
33
- assert parser ._lookup_scalar_type (["wallet" , "name" ]) == 'String'
34
- assert parser ._lookup_scalar_type (["wallet" , "invalid" ]) is None
54
+ assert parser ._lookup_scalar_type (["film" ]) is None
55
+ assert parser ._lookup_scalar_type (["film" , "releaseDate" ]) == 'DateTime'
56
+ assert parser ._lookup_scalar_type (["film" , "species" ]) is None
35
57
36
- def test_lookup_scalar_type_in_mutation (gql_schema ):
37
- parser = ResponseParser (gql_schema )
58
+ def test_lookup_scalar_type_in_mutation (schema ):
59
+ parser = ResponseParser (schema )
38
60
39
- assert parser ._lookup_scalar_type (["manualWithdraw" , "agentTransaction" ]) is None
40
- assert parser ._lookup_scalar_type (["manualWithdraw" , "agentTransaction" , "amount" ]) == 'Money'
61
+ assert parser ._lookup_scalar_type (["createHero" ]) is None
62
+ assert parser ._lookup_scalar_type (["createHero" , "hero" ]) is None
63
+ assert parser ._lookup_scalar_type (["createHero" , "ok" ]) == 'Boolean'
41
64
42
- def test_parse_response (gql_schema ):
65
+ def test_parse_response (schema ):
43
66
custom_scalars = {
44
- 'Money ' : Capitalize
67
+ 'DateTime ' : Capitalize
45
68
}
46
- parser = ResponseParser (gql_schema , custom_scalars )
69
+ parser = ResponseParser (schema , custom_scalars )
47
70
48
71
response = {
49
- 'wallet ' : {
72
+ 'film ' : {
50
73
'id' : 'some_id' ,
51
- 'name ' : 'U1_test ' ,
74
+ 'releaseDate ' : 'some_datetime ' ,
52
75
}
53
76
}
54
77
55
78
expected = {
56
- 'wallet ' : {
79
+ 'film ' : {
57
80
'id' : 'some_id' ,
58
- 'name ' : 'U1_test ' ,
81
+ 'releaseDate ' : 'SOME_DATETIME ' ,
59
82
}
60
83
}
61
84
62
85
assert parser .parse (response ) == expected
63
- assert response ['wallet ' ]['balance ' ] == 'CFA 3850'
86
+ assert response ['film ' ]['releaseDate ' ] == 'some_datetime' # ensure original response is not changed
64
87
65
- def test_parse_response_containing_list (gql_schema ):
88
+ def test_parse_response_containing_list (schema ):
66
89
custom_scalars = {
67
- 'Money ' : M
90
+ 'DateTime ' : Capitalize
68
91
}
69
- parser = ResponseParser (gql_schema , custom_scalars )
92
+ parser = ResponseParser (schema , custom_scalars )
70
93
71
94
response = {
72
- "searchWallets" : [
73
- {
74
- "id" : "W_wz518BXTDJuQ" ,
75
- "name" : "U2_test" ,
76
- "balance" : "CFA 4148"
77
- },
78
- {
79
- "id" : "W_uOe9fHPoKO21" ,
80
- "name" : "Agent_test" ,
81
- "balance" : "CFA 2641"
82
- }
83
- ]
95
+ "allFilms" : {
96
+ "edges" : [{
97
+ "node" : {
98
+ 'id' : 'some_id' ,
99
+ 'releaseDate' : 'some_datetime' ,
100
+ }
101
+ },{
102
+ "node" : {
103
+ 'id' : 'some_id' ,
104
+ 'releaseDate' : 'some_other_datetime' ,
105
+ }
106
+ }]
107
+ }
84
108
}
85
109
86
110
expected = copy .deepcopy (response )
87
- expected ['searchWallets ' ][0 ]['balance' ] = M ( "CFA" , "4148" )
88
- expected ['searchWallets ' ][1 ]['balance' ] = M ( "CFA" , "2641" )
111
+ expected ['allFilms ' ]['edges' ][ 0 ]['node' ][ 'releaseDate' ] = "SOME_DATETIME"
112
+ expected ['allFilms ' ]['edges' ][ 1 ]['node' ][ 'releaseDate' ] = "SOME_OTHER_DATETIME"
89
113
90
114
result = parser .parse (response )
91
115
92
116
assert result == expected
93
- assert response [ 'searchWallets ' ][0 ]['balance' ] == "CFA 4148 "
94
- assert response [ 'searchWallets ' ][1 ]['balance' ] == "CFA 2641 "
117
+ expected [ 'allFilms ' ]['edges' ][ 0 ]['node' ][ 'releaseDate' ] = "some_datetime "
118
+ expected [ 'allFilms ' ]['edges' ][ 1 ]['node' ][ 'releaseDate' ] = "some_other_datetime "
0 commit comments