Skip to content

Commit 152e90e

Browse files
committed
Add typing to validation tests and refactoring
Replicates graphql/graphql-js@51eda7b
1 parent f94e85b commit 152e90e

30 files changed

+1121
-1407
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ a query language for APIs created by Facebook.
1313
[![Code Style](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/ambv/black)
1414

1515
The current version 1.0.1 of GraphQL-core-next is up-to-date with GraphQL.js version
16-
14.0.2. All parts of the API are covered by an extensive test suite of currently 1661
16+
14.0.2. All parts of the API are covered by an extensive test suite of currently 1662
1717
unit tests.
1818

1919

tests/validation/harness.py

Lines changed: 31 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1-
from graphql.language.parser import parse
1+
from typing import List, Optional, Type
2+
3+
from graphql.error import GraphQLError
4+
from graphql.language import parse, print_ast
25
from graphql.type import (
36
GraphQLArgument,
47
GraphQLBoolean,
@@ -25,6 +28,7 @@
2528
GraphQLIncludeDirective,
2629
GraphQLSkipDirective,
2730
)
31+
from graphql.validation import ValidationRule, SDLValidationRule
2832
from graphql.validation.validate import validate, validate_sdl
2933

3034
Being = GraphQLInterfaceType(
@@ -227,11 +231,11 @@ def raise_type_error(message):
227231
InvalidScalar = GraphQLScalarType(
228232
name="Invalid",
229233
serialize=lambda value: value,
230-
parse_literal=lambda node: raise_type_error(
231-
f"Invalid scalar is always invalid: {node.value}"
234+
parse_literal=lambda value_node: raise_type_error(
235+
f"Invalid scalar is always invalid: {print_ast(value_node)}"
232236
),
233-
parse_value=lambda node: raise_type_error(
234-
f"Invalid scalar is always invalid: {node}"
237+
parse_value=lambda value: raise_type_error(
238+
f"Invalid scalar is always invalid: {value!r}"
235239
),
236240
)
237241

@@ -289,34 +293,25 @@ def raise_type_error(message):
289293
)
290294

291295

292-
def expect_valid(schema, rule, query_string):
293-
errors = validate(schema, parse(query_string), [rule])
294-
assert errors == [], "Should validate"
295-
296-
297-
def expect_invalid(schema, rule, query_string, expected_errors):
298-
errors = validate(schema, parse(query_string), [rule])
299-
assert errors, "Should not validate"
300-
assert errors == expected_errors
301-
return errors
302-
303-
304-
def expect_passes_rule(rule, query_string):
305-
expect_valid(test_schema, rule, query_string)
306-
307-
308-
def expect_fails_rule(rule, query_string, errors):
309-
return expect_invalid(test_schema, rule, query_string, errors)
310-
311-
312-
def expect_passes_rule_with_schema(schema, rule, query_string):
313-
return expect_valid(schema, rule, query_string)
314-
315-
316-
def expect_fails_rule_with_schema(schema, rule, query_string, errors):
317-
return expect_invalid(schema, rule, query_string, errors)
318-
319-
320-
def expect_sdl_errors_from_rule(rule, sdl_string, schema=None):
321-
errors = validate_sdl(parse(sdl_string), schema, [rule])
322-
return errors
296+
def assert_validation_errors(
297+
rule: Type[ValidationRule],
298+
query_str: str,
299+
errors: List[GraphQLError],
300+
schema: GraphQLSchema = test_schema,
301+
) -> List[GraphQLError]:
302+
doc = parse(query_str)
303+
returned_errors = validate(schema, doc, [rule])
304+
assert returned_errors == errors
305+
return returned_errors
306+
307+
308+
def assert_sdl_validation_errors(
309+
rule: Type[SDLValidationRule],
310+
sdl_str: str,
311+
errors: List[GraphQLError],
312+
schema: Optional[GraphQLSchema] = None,
313+
) -> List[GraphQLError]:
314+
doc = parse(sdl_str)
315+
returned_errors = validate_sdl(doc, schema, [rule])
316+
assert returned_errors == errors
317+
return returned_errors

tests/validation/test_executable_definitions.py

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,15 @@
1+
from functools import partial
2+
13
from graphql.validation import ExecutableDefinitionsRule
24
from graphql.validation.rules.executable_definitions import (
35
non_executable_definitions_message,
46
)
57

6-
from .harness import expect_fails_rule, expect_passes_rule
8+
from .harness import assert_validation_errors
9+
10+
assert_errors = partial(assert_validation_errors, ExecutableDefinitionsRule)
11+
12+
assert_valid = partial(assert_errors, errors=[])
713

814

915
def non_executable_definition(def_name, line, column):
@@ -15,20 +21,18 @@ def non_executable_definition(def_name, line, column):
1521

1622
def describe_validate_executable_definitions():
1723
def with_only_operation():
18-
expect_passes_rule(
19-
ExecutableDefinitionsRule,
24+
assert_valid(
2025
"""
2126
query Foo {
2227
dog {
2328
name
2429
}
2530
}
26-
""",
31+
"""
2732
)
2833

2934
def with_operation_and_fragment():
30-
expect_passes_rule(
31-
ExecutableDefinitionsRule,
35+
assert_valid(
3236
"""
3337
query Foo {
3438
dog {
@@ -40,12 +44,11 @@ def with_operation_and_fragment():
4044
fragment Frag on Dog {
4145
name
4246
}
43-
""",
47+
"""
4448
)
4549

4650
def with_type_definition():
47-
expect_fails_rule(
48-
ExecutableDefinitionsRule,
51+
assert_errors(
4952
"""
5053
query Foo {
5154
dog {
@@ -68,8 +71,7 @@ def with_type_definition():
6871
)
6972

7073
def with_schema_definition():
71-
expect_fails_rule(
72-
ExecutableDefinitionsRule,
74+
assert_errors(
7375
"""
7476
schema {
7577
query: Query

tests/validation/test_fields_on_correct_type.py

Lines changed: 35 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,13 @@
1+
from functools import partial
2+
13
from graphql.validation import FieldsOnCorrectTypeRule
24
from graphql.validation.rules.fields_on_correct_type import undefined_field_message
35

4-
from .harness import expect_fails_rule, expect_passes_rule
6+
from .harness import assert_validation_errors
7+
8+
assert_errors = partial(assert_validation_errors, FieldsOnCorrectTypeRule)
9+
10+
assert_valid = partial(assert_errors, errors=[])
511

612

713
def undefined_field(field, type_, suggested_types, suggested_fields, line, column):
@@ -15,71 +21,64 @@ def undefined_field(field, type_, suggested_types, suggested_fields, line, colum
1521

1622
def describe_validate_fields_on_correct_type():
1723
def object_field_selection():
18-
expect_passes_rule(
19-
FieldsOnCorrectTypeRule,
24+
assert_valid(
2025
"""
2126
fragment objectFieldSelection on Dog {
2227
__typename
2328
name
2429
}
25-
""",
30+
"""
2631
)
2732

2833
def aliased_object_field_selection():
29-
expect_passes_rule(
30-
FieldsOnCorrectTypeRule,
34+
assert_valid(
3135
"""
3236
fragment aliasedObjectFieldSelection on Dog {
3337
tn : __typename
3438
otherName : name
3539
}
36-
""",
40+
"""
3741
)
3842

3943
def interface_field_selection():
40-
expect_passes_rule(
41-
FieldsOnCorrectTypeRule,
44+
assert_valid(
4245
"""
4346
fragment interfaceFieldSelection on Pet {
4447
__typename
4548
name
4649
}
47-
""",
50+
"""
4851
)
4952

5053
def aliased_interface_field_selection():
51-
expect_passes_rule(
52-
FieldsOnCorrectTypeRule,
54+
assert_valid(
5355
"""
5456
fragment interfaceFieldSelection on Pet {
5557
otherName : name
5658
}
57-
""",
59+
"""
5860
)
5961

6062
def lying_alias_selection():
61-
expect_passes_rule(
62-
FieldsOnCorrectTypeRule,
63+
assert_valid(
6364
"""
6465
fragment lyingAliasSelection on Dog {
6566
name : nickname
6667
}
67-
""",
68+
"""
6869
)
6970

7071
def ignores_fields_on_unknown_type():
71-
expect_passes_rule(
72-
FieldsOnCorrectTypeRule,
72+
assert_valid(
7373
"""
7474
fragment unknownSelection on UnknownType {
7575
unknownField
7676
}
77-
""",
77+
"""
7878
)
7979

8080
def reports_errors_when_type_is_known_again():
81-
expect_fails_rule(
82-
FieldsOnCorrectTypeRule,
81+
assert_errors(
8382
"""
8483
fragment typeKnownAgain on Pet {
8584
unknown_pet_field {
@@ -96,8 +95,7 @@ def reports_errors_when_type_is_known_again():
9695
)
9796

9897
def field_not_defined_on_fragment():
99-
expect_fails_rule(
100-
FieldsOnCorrectTypeRule,
98+
assert_errors(
10199
"""
102100
fragment fieldNotDefined on Dog {
103101
meowVolume
@@ -107,8 +105,7 @@ def field_not_defined_on_fragment():
107105
)
108106

109107
def ignores_deeply_unknown_field():
110-
expect_fails_rule(
111-
FieldsOnCorrectTypeRule,
108+
assert_errors(
112109
"""
113110
fragment deepFieldNotDefined on Dog {
114111
unknown_field {
@@ -120,10 +117,9 @@ def ignores_deeply_unknown_field():
120117
)
121118

122119
def sub_field_not_defined():
123-
expect_fails_rule(
124-
FieldsOnCorrectTypeRule,
120+
assert_errors(
125121
"""
126-
fragment subFieldNotDefined on Human {
122+
fragment subFieldNotDefined on Human {
127123
pets {
128124
unknown_field
129125
}
@@ -133,8 +129,7 @@ def sub_field_not_defined():
133129
)
134130

135131
def field_not_defined_on_inline_fragment():
136-
expect_fails_rule(
137-
FieldsOnCorrectTypeRule,
132+
assert_errors(
138133
"""
139134
fragment fieldNotDefined on Pet {
140135
... on Dog {
@@ -146,8 +141,7 @@ def field_not_defined_on_inline_fragment():
146141
)
147142

148143
def aliased_field_target_not_defined():
149-
expect_fails_rule(
150-
FieldsOnCorrectTypeRule,
144+
assert_errors(
151145
"""
152146
fragment aliasedFieldTargetNotDefined on Dog {
153147
volume : mooVolume
@@ -157,8 +151,7 @@ def aliased_field_target_not_defined():
157151
)
158152

159153
def aliased_lying_field_target_not_defined():
160-
expect_fails_rule(
161-
FieldsOnCorrectTypeRule,
154+
assert_errors(
162155
"""
163156
fragment aliasedLyingFieldTargetNotDefined on Dog {
164157
barkVolume : kawVolume
@@ -168,8 +161,7 @@ def aliased_lying_field_target_not_defined():
168161
)
169162

170163
def not_defined_on_interface():
171-
expect_fails_rule(
172-
FieldsOnCorrectTypeRule,
164+
assert_errors(
173165
"""
174166
fragment notDefinedOnInterface on Pet {
175167
tailLength
@@ -179,8 +171,7 @@ def not_defined_on_interface():
179171
)
180172

181173
def defined_on_implementors_but_not_on_interface():
182-
expect_fails_rule(
183-
FieldsOnCorrectTypeRule,
174+
assert_errors(
184175
"""
185176
fragment definedOnImplementorsButNotInterface on Pet {
186177
nickname
@@ -190,18 +181,16 @@ def defined_on_implementors_but_not_on_interface():
190181
)
191182

192183
def meta_field_selection_on_union():
193-
expect_passes_rule(
194-
FieldsOnCorrectTypeRule,
184+
assert_valid(
195185
"""
196186
fragment directFieldSelectionOnUnion on CatOrDog {
197187
__typename
198188
}
199-
""",
189+
"""
200190
)
201191

202192
def direct_field_selection_on_union():
203-
expect_fails_rule(
204-
FieldsOnCorrectTypeRule,
193+
assert_errors(
205194
"""
206195
fragment directFieldSelectionOnUnion on CatOrDog {
207196
directField
@@ -211,8 +200,7 @@ def direct_field_selection_on_union():
211200
)
212201

213202
def defined_on_implementors_queried_on_union():
214-
expect_fails_rule(
215-
FieldsOnCorrectTypeRule,
203+
assert_errors(
216204
"""
217205
fragment definedOnImplementorsQueriedOnUnion on CatOrDog {
218206
name
@@ -231,8 +219,7 @@ def defined_on_implementors_queried_on_union():
231219
)
232220

233221
def valid_field_in_inline_fragment():
234-
expect_passes_rule(
235-
FieldsOnCorrectTypeRule,
222+
assert_valid(
236223
"""
237224
fragment objectFieldSelection on Pet {
238225
... on Dog {
@@ -242,7 +229,7 @@ def valid_field_in_inline_fragment():
242229
name
243230
}
244231
}
245-
""",
232+
"""
246233
)
247234

248235

0 commit comments

Comments
 (0)