Skip to content

Commit 49bbbeb

Browse files
authored
providing the explicit value 'null' to non‐null_argument is not valid (#2038)
1 parent 31f44d8 commit 49bbbeb

3 files changed

Lines changed: 37 additions & 1 deletion

File tree

src/main/java/graphql/validation/ValidationErrorType.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,5 +33,6 @@ public enum ValidationErrorType {
3333
DuplicateFragmentName,
3434
DuplicateDirectiveName,
3535
DuplicateArgumentNames,
36-
DuplicateVariableName
36+
DuplicateVariableName,
37+
NullValueForNonNullArgument
3738
}

src/main/java/graphql/validation/rules/ProvidedNonNullArguments.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
import graphql.language.Directive;
77
import graphql.language.Field;
88
import graphql.language.Node;
9+
import graphql.language.NullValue;
10+
import graphql.language.Value;
911
import graphql.schema.GraphQLArgument;
1012
import graphql.schema.GraphQLDirective;
1113
import graphql.schema.GraphQLFieldDefinition;
@@ -41,6 +43,14 @@ public void checkField(Field field) {
4143
String message = String.format("Missing field argument %s", graphQLArgument.getName());
4244
addError(ValidationErrorType.MissingFieldArgument, field.getSourceLocation(), message);
4345
}
46+
47+
if(argument!=null) {
48+
Value value = argument.getValue();
49+
if ((value == null || value instanceof NullValue) && nonNullType && noDefaultValue) {
50+
String message = String.format("null value for non-null field argument %s", graphQLArgument.getName());
51+
addError(ValidationErrorType.NullValueForNonNullArgument, field.getSourceLocation(), message);
52+
}
53+
}
4454
}
4555
}
4656

src/test/groovy/graphql/validation/rules/ProvidedNonNullArgumentsTest.groovy

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ package graphql.validation.rules
33
import graphql.language.Argument
44
import graphql.language.Directive
55
import graphql.language.Field
6+
import graphql.language.NonNullType
7+
import graphql.language.NullValue
68
import graphql.language.StringValue
79
import graphql.schema.GraphQLArgument
810
import graphql.schema.GraphQLDirective
@@ -141,4 +143,27 @@ class ProvidedNonNullArgumentsTest extends Specification {
141143
then:
142144
errorCollector.getErrors().isEmpty()
143145
}
146+
147+
def "provide the explicit value null is not valid for non null argument"() {
148+
given:
149+
def fieldArg = GraphQLArgument.newArgument().name("arg")
150+
.type(GraphQLNonNull.nonNull(GraphQLString))
151+
152+
def fieldDef = GraphQLFieldDefinition.newFieldDefinition()
153+
.name("field")
154+
.type(GraphQLString)
155+
.argument(fieldArg)
156+
.build()
157+
158+
validationContext.getFieldDef() >> fieldDef
159+
160+
def defaultNullArg = Argument.newArgument().name("arg").value(NullValue.newNullValue().build()).build()
161+
def field = new Field("field", [defaultNullArg])
162+
163+
when:
164+
providedNonNullArguments.checkField(field)
165+
166+
then:
167+
errorCollector.containsValidationError(ValidationErrorType.NullValueForNonNullArgument)
168+
}
144169
}

0 commit comments

Comments
 (0)