Skip to content

Commit 872ff2a

Browse files
committed
added argument support to graphql schema checking on interfaces - with default value checks
1 parent dd42897 commit 872ff2a

File tree

2 files changed

+15
-1
lines changed

2 files changed

+15
-1
lines changed

src/main/java/graphql/schema/validation/ObjectsImplementInterfaces.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import graphql.schema.GraphQLType;
99

1010
import java.util.List;
11+
import java.util.Objects;
1112

1213
import static graphql.schema.GraphQLTypeUtil.getUnwrappedTypeName;
1314
import static graphql.schema.validation.SchemaValidationErrorType.ObjectDoesNotImplementItsInterfaces;
@@ -84,16 +85,25 @@ private void checkFieldArgumentEquivalence(GraphQLObjectType objectTyoe, GraphQL
8485
String interfaceArgStr = makeArgStr(interfaceArg);
8586
String objectArgStr = makeArgStr(objectArg);
8687

88+
boolean same = true;
8789
if (!interfaceArgStr.equals(objectArgStr)) {
90+
same = false;
91+
}
92+
if (!Objects.equals(interfaceArg.getDefaultValue(), objectArg.getDefaultValue())) {
93+
same = false;
94+
}
95+
if (!same) {
8896
validationErrorCollector.addError(
8997
error(format("object type '%s' does not implement interface '%s' because field '%s' argument '%s' is defined differently",
9098
objectTyoe.getName(), interfaceType.getName(), interfaceFieldDef.getName(), interfaceArg.getName())));
9199
}
100+
92101
}
93102
}
94103
}
95104

96105
private String makeArgStr(GraphQLArgument argument) {
106+
// we don't do default value checking because toString of getDefaultValue is not guaranteed to be stable
97107
return argument.getName() +
98108
":" +
99109
getUnwrappedTypeName(argument.getType());

src/test/groovy/graphql/schema/validation/ObjectsImplementInterfacesTest.groovy

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ class ObjectsImplementInterfacesTest extends Specification {
3535
.argument(newArgument().name("arg1").type(GraphQLString))
3636
.argument(newArgument().name("arg2").type(GraphQLInt))
3737
.argument(newArgument().name("arg3").type(GraphQLBoolean))
38+
.argument(newArgument().name("arg4").type(GraphQLString).defaultValue("ABC"))
3839
)
3940

4041
.field(newFieldDefinition().name("argField2").type(GraphQLString)
@@ -61,6 +62,7 @@ class ObjectsImplementInterfacesTest extends Specification {
6162
.argument(newArgument().name("arg1").type(GraphQLInt))
6263
.argument(newArgument().name("arg2").type(GraphQLInt))
6364
.argument(newArgument().name("arg3").type(GraphQLInt))
65+
.argument(newArgument().name("arg4").type(GraphQLString).defaultValue("XYZ"))
6466
)
6567

6668
.field(newFieldDefinition().name("argField2").type(GraphQLString)
@@ -76,7 +78,7 @@ class ObjectsImplementInterfacesTest extends Specification {
7678

7779
errorCollector.containsValidationError(ObjectDoesNotImplementItsInterfaces)
7880
def errors = errorCollector.getErrors()
79-
errors.size() == 6
81+
errors.size() == 7
8082
errors.contains(new SchemaValidationError(ObjectDoesNotImplementItsInterfaces,
8183
"object type 'obj' does not implement interface 'Interface' because field 'friends' is missing"))
8284
errors.contains(new SchemaValidationError(ObjectDoesNotImplementItsInterfaces,
@@ -87,6 +89,8 @@ class ObjectsImplementInterfacesTest extends Specification {
8789
"object type 'obj' does not implement interface 'Interface' because field 'address' is defined as '[String!]' type and not as '[String]' type"))
8890
errors.contains(new SchemaValidationError(ObjectDoesNotImplementItsInterfaces,
8991
"object type 'obj' does not implement interface 'Interface' because field 'argField1' argument 'arg1' is defined differently"))
92+
errors.contains(new SchemaValidationError(ObjectDoesNotImplementItsInterfaces,
93+
"object type 'obj' does not implement interface 'Interface' because field 'argField1' argument 'arg1' is defined differently"))
9094
errors.contains(new SchemaValidationError(ObjectDoesNotImplementItsInterfaces,
9195
"object type 'obj' does not implement interface 'Interface' because field 'argField2' has a different number of arguments"))
9296
}

0 commit comments

Comments
 (0)