Skip to content

Commit 7f43a0a

Browse files
authored
Merge pull request rmosolgo#2454 from rmosolgo/enum-args-conflict
Fix enum argument conflict
2 parents 1149e07 + 0381baf commit 7f43a0a

2 files changed

Lines changed: 78 additions & 8 deletions

File tree

lib/graphql/static_validation/rules/fields_will_merge.rb

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -330,22 +330,29 @@ def possible_arguments(field1, field2)
330330
# Check for incompatible / non-identical arguments on this node:
331331
[field1, field2].map do |n|
332332
if n.arguments.any?
333-
n.arguments.reduce({}) do |memo, a|
333+
serialized_args = {}
334+
n.arguments.each do |a|
334335
arg_value = a.value
335-
memo[a.name] = case arg_value
336-
when GraphQL::Language::Nodes::AbstractNode
337-
arg_value.to_query_string
338-
else
339-
GraphQL::Language.serialize(arg_value)
340-
end
341-
memo
336+
serialized_args[a.name] = serialize_arg(arg_value)
342337
end
338+
serialized_args
343339
else
344340
NO_ARGS
345341
end
346342
end.uniq
347343
end
348344

345+
def serialize_arg(arg_value)
346+
case arg_value
347+
when GraphQL::Language::Nodes::AbstractNode
348+
arg_value.to_query_string
349+
when Array
350+
"[#{arg_value.map { |a| serialize_arg(a) }.join(", ")}]"
351+
else
352+
GraphQL::Language.serialize(arg_value)
353+
end
354+
end
355+
349356
def compared_fragments_key(frag1, frag2, exclusive)
350357
# Cache key to not compare two fragments more than once.
351358
# The key includes both fragment names sorted (this way we

spec/graphql/static_validation/rules/fields_will_merge_spec.rb

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -601,6 +601,69 @@
601601
end
602602
end
603603

604+
describe "arguments that are a list of enums, in fragments" do
605+
let(:schema) {
606+
GraphQL::Schema.from_definition <<-GRAPHQL
607+
type Query {
608+
field(categories: [Category!]): Int
609+
}
610+
611+
enum Category {
612+
A
613+
B
614+
C
615+
}
616+
GRAPHQL
617+
}
618+
619+
describe "When there's not a conflict" do
620+
let(:query_string) {
621+
"
622+
{
623+
field(categories: [A, B, C])
624+
...Q
625+
}
626+
fragment Q on Query {
627+
field(categories: [A, B, C])
628+
}
629+
"
630+
}
631+
632+
it "doesn't find errors" do
633+
assert_equal [], errors
634+
end
635+
end
636+
637+
describe "When there is a conflict" do
638+
let(:query_string) {
639+
"
640+
{
641+
field(categories: [A, B])
642+
...Q
643+
}
644+
fragment Q on Query {
645+
field(categories: [A, B, C])
646+
}
647+
"
648+
}
649+
650+
it "adds an error" do
651+
expected_error = {
652+
"message"=>"Field 'field' has an argument conflict: {categories:\"[A, B]\"} or {categories:\"[A, B, C]\"}?",
653+
"locations"=>[{"line"=>3, "column"=>11}, {"line"=>7, "column"=>11}],
654+
"path"=>[],
655+
"extensions"=> {
656+
"code"=>"fieldConflict",
657+
"fieldName"=>"field",
658+
"conflicts"=>"{categories:\"[A, B]\"} or {categories:\"[A, B, C]\"}"
659+
}
660+
}
661+
662+
assert_equal [expected_error], errors
663+
end
664+
end
665+
end
666+
604667
describe "return types must be unambiguous" do
605668
let(:schema) {
606669
GraphQL::Schema.from_definition(%|

0 commit comments

Comments
 (0)