Skip to content

Commit

Permalink
Merge pull request #170 from jufemaiz/bugfix/164/argument-slice-compa…
Browse files Browse the repository at this point in the history
…rison

Fix: argument comparison between two sets of args
  • Loading branch information
StevenACoffman authored Jan 26, 2022
2 parents 994c7e4 + 1cb3111 commit 8d86355
Show file tree
Hide file tree
Showing 2 changed files with 150 additions and 5 deletions.
12 changes: 7 additions & 5 deletions validator/rules/overlapping_fields_can_be_merged.go
Original file line number Diff line number Diff line change
Expand Up @@ -478,14 +478,16 @@ func sameArguments(args1 []*ast.Argument, args2 []*ast.Argument) bool {
return false
}
for _, arg1 := range args1 {
var matched bool
for _, arg2 := range args2 {
if arg1.Name != arg2.Name {
return false
}
if !sameValue(arg1.Value, arg2.Value) {
return false
if arg1.Name == arg2.Name && sameValue(arg1.Value, arg2.Value) {
matched = true
break
}
}
if !matched {
return false
}
}
return true
}
Expand Down
143 changes: 143 additions & 0 deletions validator/rules/overlapping_fields_can_be_merged_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,143 @@
package validator

import (
"testing"

"github.com/vektah/gqlparser/v2/ast"
)

func Test_sameArguments(t *testing.T) {
tests := map[string]struct {
args func() (args1, args2 []*ast.Argument)
result bool
}{
"both argument lists empty": {
args: func() (args1 []*ast.Argument, args2 []*ast.Argument) {
return nil, nil
},
result: true,
},
"args 1 empty, args 2 not": {
args: func() (args1 []*ast.Argument, args2 []*ast.Argument) {
return nil, []*ast.Argument{
{
Name: "thing",
Value: &ast.Value{Raw: "a thing"},
Position: &ast.Position{},
},
}
},
result: false,
},
"args 2 empty, args 1 not": {
args: func() (args1 []*ast.Argument, args2 []*ast.Argument) {
return []*ast.Argument{
{
Name: "thing",
Value: &ast.Value{Raw: "a thing"},
Position: &ast.Position{},
},
}, nil
},
result: false,
},
"args 1 mismatches args 2 names": {
args: func() (args1 []*ast.Argument, args2 []*ast.Argument) {
return []*ast.Argument{
{
Name: "thing1",
Value: &ast.Value{Raw: "1 thing"},
Position: &ast.Position{},
},
},
[]*ast.Argument{
{
Name: "thing2",
Value: &ast.Value{Raw: "2 thing"},
Position: &ast.Position{},
},
}
},
result: false,
},
"args 1 mismatches args 2 values": {
args: func() (args1 []*ast.Argument, args2 []*ast.Argument) {
return []*ast.Argument{
{
Name: "thing1",
Value: &ast.Value{Raw: "1 thing"},
Position: &ast.Position{},
},
},
[]*ast.Argument{
{
Name: "thing1",
Value: &ast.Value{Raw: "2 thing"},
Position: &ast.Position{},
},
}
},
result: false,
},
"args 1 matches args 2 names and values": {
args: func() (args1 []*ast.Argument, args2 []*ast.Argument) {
return []*ast.Argument{
{
Name: "thing1",
Value: &ast.Value{Raw: "1 thing"},
Position: &ast.Position{},
},
},
[]*ast.Argument{
{
Name: "thing1",
Value: &ast.Value{Raw: "1 thing"},
Position: &ast.Position{},
},
}
},
result: true,
},
"args 1 matches args 2 names and values where multiple exist in various orders": {
args: func() (args1 []*ast.Argument, args2 []*ast.Argument) {
return []*ast.Argument{
{
Name: "thing1",
Value: &ast.Value{Raw: "1 thing"},
Position: &ast.Position{},
},
{
Name: "thing2",
Value: &ast.Value{Raw: "2 thing"},
Position: &ast.Position{},
},
},
[]*ast.Argument{
{
Name: "thing1",
Value: &ast.Value{Raw: "1 thing"},
Position: &ast.Position{},
},
{
Name: "thing2",
Value: &ast.Value{Raw: "2 thing"},
Position: &ast.Position{},
},
}
},
result: true,
},
}

for name, tc := range tests {
t.Run(name, func(t *testing.T) {
args1, args2 := tc.args()

resp := sameArguments(args1, args2)

if resp != tc.result {
t.Fatalf("Expected %t got %t", tc.result, resp)
}
})
}
}

0 comments on commit 8d86355

Please sign in to comment.