Skip to content

Commit 7fd658e

Browse files
author
rawls238
committed
add tests and fixups
1 parent 9b85a0c commit 7fd658e

File tree

2 files changed

+205
-4
lines changed

2 files changed

+205
-4
lines changed

graphql/core/validation/rules.py

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -640,10 +640,8 @@ def enter_VariableDefinition(self, node, *args):
640640
def enter_Variable(self, node, *args):
641641
var_name = node.name.value
642642
var_def = self.var_def_map.get(var_name)
643-
644643
var_type = var_def and type_from_ast(self.context.get_schema(), var_def.type)
645644
input_type = self.context.get_input_type()
646-
647645
if var_type and input_type and not self.var_type_allowed_for_type(self.effective_type(var_type, var_def),
648646
input_type):
649647
return GraphQLError(self.bad_var_pos_message(var_name, var_type, input_type),
@@ -652,7 +650,6 @@ def enter_Variable(self, node, *args):
652650
def enter_FragmentSpread(self, node, *args):
653651
if node.name.value in self.visited_fragment_names:
654652
return False
655-
656653
self.visited_fragment_names.add(node.name.value)
657654

658655
@staticmethod
@@ -680,7 +677,7 @@ def var_type_allowed_for_type(var_type, expected_type):
680677

681678
@staticmethod
682679
def bad_var_pos_message(var_name, var_type, expected_type):
683-
return 'Variable "${}" of type "{}" used in position expecting type "{}".'.format(var_name, var_type, expected_type)
680+
return 'Variable "{}" of type "{}" used in position expecting type "{}".'.format(var_name, var_type, expected_type)
684681

685682

686683
class OverlappingFieldsCanBeMerged(ValidationRule):

tests/core_validation/test_variables_in_allowed_position.py

Lines changed: 204 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,3 +27,207 @@ def test_boolean_boolean_in_fragment():
2727
}
2828
}
2929
''')
30+
31+
expect_passes_rule(VariablesInAllowedPosition, '''
32+
query Query($booleanArg: Boolean)
33+
{
34+
complicatedArgs {
35+
...booleanArgFrag
36+
}
37+
}
38+
fragment booleanArgFrag on ComplicatedArgs {
39+
booleanArgField(booleanArg: $booleanArg)
40+
}
41+
''')
42+
43+
def test_non_null_boolean_boolean():
44+
expect_passes_rule(VariablesInAllowedPosition, '''
45+
query Query($nonNullBooleanArg: Boolean!)
46+
{
47+
complicatedArgs {
48+
booleanArgField(booleanArg: $nonNullBooleanArg)
49+
}
50+
}
51+
''')
52+
53+
def test_int_non_nll_int_with_default():
54+
expect_passes_rule(VariablesInAllowedPosition, '''
55+
query Query($intArg: Int = 1)
56+
{
57+
complicatedArgs {
58+
nonNullIntArgField(nonNullIntArg: $intArg)
59+
}
60+
}
61+
''')
62+
63+
def test_string_string():
64+
expect_passes_rule(VariablesInAllowedPosition, '''
65+
query Query($stringListVar: [String])
66+
{
67+
complicatedArgs {
68+
stringListArgField(stringListArg: $stringListVar)
69+
}
70+
}
71+
''')
72+
73+
def test_non_null_string_string():
74+
expect_passes_rule(VariablesInAllowedPosition, '''
75+
query Query($stringListVar: [String!])
76+
{
77+
complicatedArgs {
78+
stringListArgField(stringListArg: $stringListVar)
79+
}
80+
}
81+
''')
82+
83+
def test_string_string_item_position():
84+
expect_passes_rule(VariablesInAllowedPosition, '''
85+
query Query($stringVar: String)
86+
{
87+
complicatedArgs {
88+
stringListArgField(stringListArg: [$stringVar])
89+
}
90+
}
91+
''')
92+
93+
def test_non_null_string_string_item_positiion():
94+
expect_passes_rule(VariablesInAllowedPosition, '''
95+
query Query($stringVar: String!)
96+
{
97+
complicatedArgs {
98+
stringListArgField(stringListArg: [$stringVar])
99+
}
100+
}
101+
''')
102+
103+
def test_complex_input_complex_input():
104+
expect_passes_rule(VariablesInAllowedPosition, '''
105+
query Query($complexVar: ComplexInput)
106+
{
107+
complicatedArgs {
108+
complexArgField(complexArg: $ComplexInput)
109+
}
110+
}
111+
''')
112+
113+
def test_complex_input_complex_input_in_field_position():
114+
expect_passes_rule(VariablesInAllowedPosition, '''
115+
query Query($boolVar: Boolean = false)
116+
{
117+
complicatedArgs {
118+
complexArgField(complexArg: {requiredArg: $boolVar})
119+
}
120+
}
121+
''')
122+
123+
def test_boolean_non_null_boolean_in_directive():
124+
expect_passes_rule(VariablesInAllowedPosition, '''
125+
query Query($boolVar: Boolean!)
126+
{
127+
dog @include(if: $boolVar)
128+
}
129+
''')
130+
131+
def test_boolean_non_null_boolean_in_directive_with_default():
132+
expect_passes_rule(VariablesInAllowedPosition, '''
133+
query Query($boolVar: Boolean = false)
134+
{
135+
dog @include(if: $boolVar)
136+
}
137+
''')
138+
139+
def test_int_non_null_int():
140+
expect_fails_rule(VariablesInAllowedPosition, '''
141+
query Query($intArg: Int)
142+
{
143+
complicatedArgs {
144+
nonNullIntArgField(nonNullIntArg: $intArg)
145+
}
146+
}
147+
''', [
148+
{ 'message': VariablesInAllowedPosition.bad_var_pos_message('intArg', 'Int', 'Int!'),
149+
'locations': [SourceLocation(5, 45)] }
150+
])
151+
152+
def test_int_non_null_int_within_fragment():
153+
expect_fails_rule(VariablesInAllowedPosition, '''
154+
fragment nonNullIntArgFieldFrag on ComplicatedArgs {
155+
nonNullIntArgField(nonNullIntArg: $intArg)
156+
}
157+
query Query($intArg: Int)
158+
{
159+
complicatedArgs {
160+
...nonNullIntArgFieldFrag
161+
}
162+
}
163+
''', [
164+
{ 'message': VariablesInAllowedPosition.bad_var_pos_message('intArg', 'Int', 'Int!'),
165+
'locations': [SourceLocation(3, 43)] }
166+
])
167+
168+
def test_int_non_null_int_within_nested_fragment():
169+
expect_fails_rule(VariablesInAllowedPosition, '''
170+
fragment outerFrag on ComplicatedArgs {
171+
...nonNullIntArgFieldFrag
172+
}
173+
fragment nonNullIntArgFieldFrag on ComplicatedArgs {
174+
nonNullIntArgField(nonNullIntArg: $intArg)
175+
}
176+
query Query($intArg: Int)
177+
{
178+
complicatedArgs {
179+
...outerFrag
180+
}
181+
}
182+
''', [
183+
{ 'message': VariablesInAllowedPosition.bad_var_pos_message('intArg', 'Int', 'Int!'),
184+
'locations': [SourceLocation(6, 43)] }
185+
])
186+
187+
def test_string_over_boolean():
188+
expect_fails_rule(VariablesInAllowedPosition, '''
189+
query Query($stringVar: String)
190+
{
191+
complicatedArgs {
192+
booleanArgField(booleanArg: $stringVar)
193+
}
194+
}
195+
''', [
196+
{ 'message': VariablesInAllowedPosition.bad_var_pos_message('stringVar', 'String', 'Boolean'),
197+
'locations': [SourceLocation(5, 39)] }
198+
])
199+
200+
def test_string_string_fail():
201+
expect_fails_rule(VariablesInAllowedPosition, '''
202+
query Query($stringVar: String)
203+
{
204+
complicatedArgs {
205+
stringListArgField(stringListArg: $stringVar)
206+
}
207+
}
208+
''', [
209+
{ 'message': VariablesInAllowedPosition.bad_var_pos_message('stringVar', 'String', '[String]'),
210+
'locations': [SourceLocation(5, 45)]}
211+
])
212+
213+
def test_boolean_non_null_boolean_in_directive():
214+
expect_fails_rule(VariablesInAllowedPosition, '''
215+
query Query($boolVar: Boolean)
216+
{
217+
dog @include(if: $boolVar)
218+
}
219+
''', [
220+
{ 'message': VariablesInAllowedPosition.bad_var_pos_message('boolVar', 'Boolean', 'Boolean!'),
221+
'locations': [SourceLocation(4, 26)]
222+
}])
223+
224+
def test_string_non_null_boolean_in_directive():
225+
expect_fails_rule(VariablesInAllowedPosition, '''
226+
query Query($stringVar: String)
227+
{
228+
dog @include(if: $stringVar)
229+
}
230+
''', [
231+
{ 'message': VariablesInAllowedPosition.bad_var_pos_message('stringVar', 'String', 'Boolean!'),
232+
'locations': [SourceLocation(4, 26)] }
233+
])

0 commit comments

Comments
 (0)