Skip to content

Commit 1f0c725

Browse files
committed
Merge pull request #21 from rawls238/guy_unique_arg_names
add unique argument names
2 parents 05321fe + c5e20d3 commit 1f0c725

File tree

2 files changed

+135
-1
lines changed

2 files changed

+135
-1
lines changed

graphql/core/validation/rules.py

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -271,7 +271,28 @@ def directive_message(arg_name, directive_name):
271271

272272

273273
class UniqueArgumentNames(ValidationRule):
274-
pass
274+
def __init__(self, context):
275+
super(UniqueArgumentNames, self).__init__(context)
276+
self.known_arg_names = {}
277+
278+
def enter_Field(self, node, *args):
279+
self.known_arg_names = {}
280+
281+
def enter_Directive(self, node, key, parent, path, ancestors):
282+
self.known_arg_names = {}
283+
284+
def enter_Argument(self, node, *args):
285+
arg_name = node.name.value
286+
if arg_name in self.known_arg_names:
287+
return GraphQLError(
288+
self.duplicate_arg_message(arg_name),
289+
[self.known_arg_names[arg_name], node.name]
290+
)
291+
self.known_arg_names[arg_name] = node.name
292+
293+
@staticmethod
294+
def duplicate_arg_message(field):
295+
return 'There can only be one argument named {}'.format(field)
275296

276297

277298
class ArgumentsOfCorrectType(ValidationRule):
Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
from graphql.core.language.location import SourceLocation
2+
from graphql.core.validation.rules import UniqueArgumentNames
3+
from utils import expect_passes_rule, expect_fails_rule
4+
5+
6+
def duplicate_arg(arg_name, l1, c1, l2, c2):
7+
return {
8+
'message': UniqueArgumentNames.duplicate_arg_message(arg_name),
9+
'locations': [SourceLocation(l1, c1), SourceLocation(l2, c2)]
10+
}
11+
12+
13+
def test_no_arguments_on_field():
14+
expect_passes_rule(UniqueArgumentNames, '''
15+
{
16+
field
17+
}
18+
''')
19+
20+
21+
def test_no_arguments_on_directive():
22+
expect_passes_rule(UniqueArgumentNames, '''
23+
{
24+
field
25+
}
26+
''')
27+
28+
29+
def test_argument_on_field():
30+
expect_passes_rule(UniqueArgumentNames, '''
31+
{
32+
field(arg: "value")
33+
}
34+
''')
35+
36+
37+
def test_argument_on_directive():
38+
expect_passes_rule(UniqueArgumentNames, '''
39+
{
40+
field @directive(arg: "value")
41+
}
42+
''')
43+
44+
def test_same_field_two_arguments():
45+
expect_passes_rule(UniqueArgumentNames, '''
46+
{
47+
one: field(arg: "value")
48+
two: field(arg: "value")
49+
}
50+
''')
51+
52+
def test_same_argument_on_field_and_directive():
53+
expect_passes_rule(UniqueArgumentNames, '''
54+
{
55+
field(arg: "value") @directive(arg: "value")
56+
}
57+
''')
58+
def test_same_argument_two_directives():
59+
expect_passes_rule(UniqueArgumentNames, '''
60+
{
61+
field @directive1(arg: "value") @directive2(arg: "value")
62+
}
63+
''')
64+
65+
def test_multiple_field_arguments():
66+
expect_passes_rule(UniqueArgumentNames, '''
67+
{
68+
field(arg1: "value", arg2: "value", arg3: "value")
69+
}
70+
''')
71+
72+
def test_multiple_directive_arguments():
73+
expect_passes_rule(UniqueArgumentNames, '''
74+
{
75+
field @directive(arg1: "value", arg2: "value", arg3: "value")
76+
}
77+
''')
78+
79+
def test_duplicate_field_arguments():
80+
expect_fails_rule(UniqueArgumentNames, '''
81+
{
82+
field(arg1: "value", arg1: "value")
83+
}
84+
''', [duplicate_arg('arg1', 3, 13, 3, 28)]
85+
)
86+
87+
def test_many_duplicate_field_arguments():
88+
expect_fails_rule(UniqueArgumentNames, '''
89+
{
90+
field(arg1: "value", arg1: "value", arg1: "value")
91+
}
92+
''', [
93+
duplicate_arg('arg1', 3, 13, 3, 28),
94+
duplicate_arg('arg1', 3, 13, 3, 43)
95+
])
96+
97+
def test_duplicate_directive_arguments():
98+
expect_fails_rule(UniqueArgumentNames, '''
99+
{
100+
field @directive(arg1: "value", arg1: "value")
101+
}
102+
''', [duplicate_arg('arg1', 3, 24, 3, 39)]
103+
)
104+
105+
def test_many_duplicate_directive_arguments():
106+
expect_fails_rule(UniqueArgumentNames, '''
107+
{
108+
field @directive(arg1: "value", arg1: "value", arg1: "value")
109+
}
110+
''',[
111+
duplicate_arg('arg1', 3, 24, 3, 39),
112+
duplicate_arg('arg1', 3, 24, 3, 54)
113+
])

0 commit comments

Comments
 (0)