Skip to content

Commit 5d3d775

Browse files
committed
applied directive values are validated
1 parent c4a05f1 commit 5d3d775

3 files changed

Lines changed: 17 additions & 8 deletions

File tree

src/main/java/graphql/schema/GraphQLDirective.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ public DirectiveDefinition getDefinition() {
9696
public String toString() {
9797
return "GraphQLDirective{" +
9898
"name='" + name + '\'' +
99-
"repeatable='" + repeatable + '\'' +
99+
", repeatable='" + repeatable + '\'' +
100100
", arguments=" + arguments +
101101
", locations=" + locations +
102102
'}';

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

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import graphql.language.Value;
66
import graphql.schema.CoercingParseValueException;
77
import graphql.schema.GraphQLArgument;
8+
import graphql.schema.GraphQLDirective;
89
import graphql.schema.GraphQLInputType;
910
import graphql.schema.GraphQLSchema;
1011
import graphql.schema.GraphQLSchemaElement;
@@ -14,18 +15,27 @@
1415
import graphql.util.TraverserContext;
1516
import graphql.validation.ValidationUtil;
1617

17-
import static graphql.schema.GraphQLTypeUtil.simplePrint;
1818
import static java.lang.String.format;
1919

2020
public class AppliedDirectiveArgumentsAreValid extends GraphQLTypeVisitorStub {
2121

2222
private ValidationUtil validationUtil = new ValidationUtil();
2323

2424

25-
public TraversalControl visitGraphQLArgument(GraphQLArgument argument, TraverserContext<GraphQLSchemaElement> context) {
26-
// a directive argument is represented as GraphQLArgument.value
25+
@Override
26+
public TraversalControl visitGraphQLDirective(GraphQLDirective directive, TraverserContext<GraphQLSchemaElement> context) {
27+
// if there is no parent it means it is just a directive definition and not an applied directive
28+
if (context.getParentNode() != null) {
29+
for (GraphQLArgument graphQLArgument : directive.getArguments()) {
30+
checkArgument(directive, graphQLArgument, context);
31+
}
32+
}
33+
return TraversalControl.CONTINUE;
34+
}
35+
36+
private void checkArgument(GraphQLDirective directive, GraphQLArgument argument, TraverserContext<GraphQLSchemaElement> context) {
2737
if (!argument.hasSetValue()) {
28-
return TraversalControl.CONTINUE;
38+
return;
2939
}
3040
GraphQLSchema schema = context.getVarFromParents(GraphQLSchema.class);
3141
SchemaValidationErrorCollector errorCollector = context.getVarFromParents(SchemaValidationErrorCollector.class);
@@ -39,10 +49,9 @@ public TraversalControl visitGraphQLArgument(GraphQLArgument argument, Traverser
3949
invalid = true;
4050
}
4151
if (invalid) {
42-
String message = format("Invalid argument %s for type %s for applied directive", argument.getValueState(), simplePrint(argument.getType()));
52+
String message = format("Invalid argument '%s' for applied directive of name '%s'", argument.getName(), directive.getName());
4353
errorCollector.addError(new SchemaValidationError(SchemaValidationErrorType.InvalidAppliedDirectiveArgument, message));
4454
}
45-
return TraversalControl.CONTINUE;
4655
}
4756

4857
private boolean isValidExternalValue(GraphQLSchema schema, Object externalValue, GraphQLInputType type) {

src/test/groovy/graphql/GraphQLTest.groovy

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1355,6 +1355,6 @@ many lines''']
13551355
.build()
13561356
then:
13571357
def e = thrown(InvalidSchemaException)
1358-
e.message.contains("Invalid argument")
1358+
e.message.contains("Invalid argument 'arg' for applied directive of name 'cached'")
13591359
}
13601360
}

0 commit comments

Comments
 (0)