diff --git a/src/main/java/graphql/ExecutionInput.java b/src/main/java/graphql/ExecutionInput.java index 0e7d50b44f..db97ff27a1 100644 --- a/src/main/java/graphql/ExecutionInput.java +++ b/src/main/java/graphql/ExecutionInput.java @@ -26,13 +26,9 @@ public class ExecutionInput { private final ExecutionId executionId; - public ExecutionInput(String query, String operationName, Object context, Object root, Map variables) { - this(query, operationName, context, root, variables, new DataLoaderRegistry(), null, null); - } - @Internal private ExecutionInput(String query, String operationName, Object context, Object root, Map variables, DataLoaderRegistry dataLoaderRegistry, CacheControl cacheControl, ExecutionId executionId) { - this.query = query; + this.query = assertNotNull(query, "query can't be null"); this.operationName = operationName; this.context = context; this.root = root; @@ -103,18 +99,19 @@ public ExecutionId getExecutionId() { * the current values and allows you to transform it how you want. * * @param builderConsumer the consumer code that will be given a builder to transform + * * @return a new ExecutionInput object based on calling build on that builder */ public ExecutionInput transform(Consumer builderConsumer) { Builder builder = new Builder() - .query(this.query) - .operationName(this.operationName) - .context(this.context) - .root(this.root) - .dataLoaderRegistry(this.dataLoaderRegistry) - .cacheControl(this.cacheControl) - .variables(this.variables) - .executionId(executionId); + .query(this.query) + .operationName(this.operationName) + .context(this.context) + .root(this.root) + .dataLoaderRegistry(this.dataLoaderRegistry) + .cacheControl(this.cacheControl) + .variables(this.variables) + .executionId(executionId); builderConsumer.accept(builder); @@ -125,14 +122,14 @@ public ExecutionInput transform(Consumer builderConsumer) { @Override public String toString() { return "ExecutionInput{" + - "query='" + query + '\'' + - ", operationName='" + operationName + '\'' + - ", context=" + context + - ", root=" + root + - ", variables=" + variables + - ", dataLoaderRegistry=" + dataLoaderRegistry + - ", executionId= " + executionId + - '}'; + "query='" + query + '\'' + + ", operationName='" + operationName + '\'' + + ", context=" + context + + ", root=" + root + + ", variables=" + variables + + ", dataLoaderRegistry=" + dataLoaderRegistry + + ", executionId= " + executionId + + '}'; } /** @@ -146,6 +143,7 @@ public static Builder newExecutionInput() { * Creates a new builder of ExecutionInput objects with the given query * * @param query the query to execute + * * @return a new builder of ExecutionInput objects */ public static Builder newExecutionInput(String query) { @@ -164,7 +162,7 @@ public static class Builder { private ExecutionId executionId = null; public Builder query(String query) { - this.query = query; + this.query = assertNotNull(query, "query can't be null"); return this; } @@ -175,7 +173,9 @@ public Builder operationName(String operationName) { /** * A default one will be assigned, but you can set your own. + * * @param executionId an execution id object + * * @return this builder */ public Builder executionId(ExecutionId executionId) { @@ -187,6 +187,7 @@ public Builder executionId(ExecutionId executionId) { * By default you will get a {@link GraphQLContext} object but you can set your own. * * @param context the context object to use + * * @return this builder */ public Builder context(Object context) { @@ -211,7 +212,7 @@ public Builder root(Object root) { } public Builder variables(Map variables) { - this.variables = variables; + this.variables = assertNotNull(variables, "variables map can't be null"); return this; } @@ -221,6 +222,7 @@ public Builder variables(Map variables) { * instances as this will create unexpected results. * * @param dataLoaderRegistry a registry of {@link org.dataloader.DataLoader}s + * * @return this builder */ public Builder dataLoaderRegistry(DataLoaderRegistry dataLoaderRegistry) { diff --git a/src/test/groovy/graphql/GraphQLTest.groovy b/src/test/groovy/graphql/GraphQLTest.groovy index ae93a69f07..a9cb59cd73 100644 --- a/src/test/groovy/graphql/GraphQLTest.groovy +++ b/src/test/groovy/graphql/GraphQLTest.groovy @@ -77,13 +77,13 @@ class GraphQLTest extends Specification { GraphQLObjectType heroType = newObject() .name("heroType") .field( - newFieldDefinition() - .name("id") - .type(GraphQLString)) + newFieldDefinition() + .name("id") + .type(GraphQLString)) .field( - newFieldDefinition() - .name("name") - .type(GraphQLString)) + newFieldDefinition() + .name("name") + .type(GraphQLString)) .build() GraphQLFieldDefinition.Builder simpsonField = newFieldDefinition() @@ -166,11 +166,11 @@ class GraphQLTest extends Specification { newObject() .name("RootQueryType") .field(newFieldDefinition() - .name("field") - .type(GraphQLString) - .argument(newArgument() - .name("arg") - .type(GraphQLNonNull.nonNull(GraphQLString)))) + .name("field") + .type(GraphQLString) + .argument(newArgument() + .name("arg") + .type(GraphQLNonNull.nonNull(GraphQLString)))) .build() ).build() @@ -192,11 +192,11 @@ class GraphQLTest extends Specification { def schema = newSchema() .query(newObject() - .name("QueryType") - .field(newFieldDefinition() - .name("set") - .type(list(GraphQLString)) - .dataFetcher({ set }))) + .name("QueryType") + .field(newFieldDefinition() + .name("set") + .type(list(GraphQLString)) + .dataFetcher({ set }))) .build() when: @@ -295,12 +295,12 @@ class GraphQLTest extends Specification { newObject() .name("QueryType") .field( - newFieldDefinition() - .name("foo") - .type(GraphQLInt) - .argument(newArgument().name("bar").type(GraphQLInt).build()) - .dataFetcher({ return it.getArgument("bar") }) - )) + newFieldDefinition() + .name("foo") + .type(GraphQLInt) + .argument(newArgument().name("bar").type(GraphQLInt).build()) + .dataFetcher({ return it.getArgument("bar") }) + )) .build() def query = "{foo(bar: 12345678910)}" when: @@ -319,12 +319,12 @@ class GraphQLTest extends Specification { newObject() .name("QueryType") .field( - newFieldDefinition() - .name("foo") - .type(GraphQLInt) - .argument(newArgument().name("bar").type(GraphQLInt).build()) - .dataFetcher(dataFetcher) - )) + newFieldDefinition() + .name("foo") + .type(GraphQLInt) + .argument(newArgument().name("bar").type(GraphQLInt).build()) + .dataFetcher(dataFetcher) + )) .build() def query = "{foo}" when: @@ -345,12 +345,12 @@ class GraphQLTest extends Specification { newObject() .name("QueryType") .field( - newFieldDefinition() - .name("foo") - .type(GraphQLInt) - .argument(newArgument().name("bar").type(GraphQLInt).build()) - .dataFetcher(dataFetcher) - )) + newFieldDefinition() + .name("foo") + .type(GraphQLInt) + .argument(newArgument().name("bar").type(GraphQLInt).build()) + .dataFetcher(dataFetcher) + )) .build() def query = "{foo(bar: null)}" DataFetchingEnvironment dataFetchingEnvironment @@ -377,12 +377,12 @@ class GraphQLTest extends Specification { newObject() .name("QueryType") .field( - newFieldDefinition() - .name("foo") - .type(GraphQLInt) - .argument(newArgument().name("bar").type(inputObject).build()) - .dataFetcher(dataFetcher) - )) + newFieldDefinition() + .name("foo") + .type(GraphQLInt) + .argument(newArgument().name("bar").type(inputObject).build()) + .dataFetcher(dataFetcher) + )) .build() def query = "{foo(bar: {someKey: \"value\"})}" when: @@ -410,12 +410,12 @@ class GraphQLTest extends Specification { newObject() .name("QueryType") .field( - newFieldDefinition() - .name("foo") - .type(GraphQLInt) - .argument(newArgument().name("bar").type(inputObject).build()) - .dataFetcher(dataFetcher) - )) + newFieldDefinition() + .name("foo") + .type(GraphQLInt) + .argument(newArgument().name("bar").type(inputObject).build()) + .dataFetcher(dataFetcher) + )) .build() def query = "{foo(bar: {someKey: \"value\", otherKey: null})}" when: @@ -443,12 +443,12 @@ class GraphQLTest extends Specification { newObject() .name("QueryType") .field( - newFieldDefinition() - .name("foo") - .type(GraphQLInt) - .argument(newArgument().name("bar").type(inputObject).build()) - .dataFetcher(dataFetcher) - )) + newFieldDefinition() + .name("foo") + .type(GraphQLInt) + .argument(newArgument().name("bar").type(inputObject).build()) + .dataFetcher(dataFetcher) + )) .build() def query = "{foo(bar: {})}" when: @@ -474,12 +474,12 @@ class GraphQLTest extends Specification { newObject() .name("QueryType") .field( - newFieldDefinition() - .name("foo") - .type(GraphQLInt) - .argument(newArgument().name("bar").type(inputObject).build()) - .dataFetcher(dataFetcher) - )) + newFieldDefinition() + .name("foo") + .type(GraphQLInt) + .argument(newArgument().name("bar").type(inputObject).build()) + .dataFetcher(dataFetcher) + )) .build() def query = "{foo(bar: {list: null})}" when: @@ -506,12 +506,12 @@ class GraphQLTest extends Specification { newObject() .name("QueryType") .field( - newFieldDefinition() - .name("foo") - .type(GraphQLInt) - .argument(newArgument().name("bar").type(inputObject).build()) - .dataFetcher(dataFetcher) - )) + newFieldDefinition() + .name("foo") + .type(GraphQLInt) + .argument(newArgument().name("bar").type(inputObject).build()) + .dataFetcher(dataFetcher) + )) .build() def query = "{foo(bar: {list: [null]})}" when: @@ -545,9 +545,9 @@ class GraphQLTest extends Specification { GraphQLObjectType queryType = newObject() .name("QueryType") .field(newFieldDefinition() - .name("query") - .argument(newArgument().name("fooParam").type(enumType)) - .type(GraphQLInt)) + .name("query") + .argument(newArgument().name("fooParam").type(enumType)) + .type(GraphQLInt)) .build() GraphQLSchema schema = newSchema() @@ -619,21 +619,21 @@ class GraphQLTest extends Specification { def foo = newObject() .name("Foo") .field(newFieldDefinition() - .name("field") - .type(typeRef('Foo')) - .build()) + .name("field") + .type(typeRef('Foo')) + .build()) .field(newFieldDefinition() - .name("scalar") - .type(GraphQLString) - .build()) + .name("scalar") + .type(GraphQLString) + .build()) .build() GraphQLSchema schema = newSchema().query( newObject() .name("RootQueryType") .field(newFieldDefinition() - .name("field") - .type(foo) - .build()).build()) + .name("field") + .type(foo) + .build()).build()) .build() MaxQueryDepthInstrumentation maximumQueryDepthInstrumentation = new MaxQueryDepthInstrumentation(3) @@ -663,21 +663,21 @@ class GraphQLTest extends Specification { def foo = newObject() .name("Foo") .field(newFieldDefinition() - .name("field") - .type(typeRef('Foo')) - .build()) + .name("field") + .type(typeRef('Foo')) + .build()) .field(newFieldDefinition() - .name("scalar") - .type(GraphQLString) - .build()) + .name("scalar") + .type(GraphQLString) + .build()) .build() GraphQLSchema schema = newSchema().query( newObject() .name("RootQueryType") .field(newFieldDefinition() - .name("field") - .type(foo) - .build()).build()) + .name("field") + .type(foo) + .build()).build()) .build() MaxQueryComplexityInstrumentation maxQueryComplexityInstrumentation = new MaxQueryComplexityInstrumentation(3) @@ -707,32 +707,32 @@ class GraphQLTest extends Specification { .name("Foo") .withInterface(typeRef("Node")) .field( - { field -> - field - .name("id") - .type(Scalars.GraphQLID) - } as UnaryOperator) + { field -> + field + .name("id") + .type(Scalars.GraphQLID) + } as UnaryOperator) .build() GraphQLInterfaceType node = GraphQLInterfaceType.newInterface() .name("Node") .field( - { field -> - field - .name("id") - .type(Scalars.GraphQLID) - } as UnaryOperator) + { field -> + field + .name("id") + .type(Scalars.GraphQLID) + } as UnaryOperator) .typeResolver({ type -> foo }) .build() GraphQLObjectType query = newObject() .name("RootQuery") .field( - { field -> - field - .name("a") - .type(node) - } as UnaryOperator) + { field -> + field + .name("a") + .type(node) + } as UnaryOperator) .build() GraphQLSchema schema = newSchema() @@ -767,49 +767,49 @@ class GraphQLTest extends Specification { .name("Foo") .withInterface(typeRef("Node")) .field( - { field -> - field - .name("id") - .type(Scalars.GraphQLID) - } as UnaryOperator) + { field -> + field + .name("id") + .type(Scalars.GraphQLID) + } as UnaryOperator) .build() GraphQLInterfaceType node = GraphQLInterfaceType.newInterface() .name("Node") .field( - { field -> - field - .name("id") - .type(Scalars.GraphQLID) - } as UnaryOperator) + { field -> + field + .name("id") + .type(Scalars.GraphQLID) + } as UnaryOperator) .typeResolver( - { - env -> - if (env.getObject() instanceof CompletableFuture) { - throw new RuntimeException("This seems bad!") - } + { + env -> + if (env.getObject() instanceof CompletableFuture) { + throw new RuntimeException("This seems bad!") + } - return foo - }) + return foo + }) .build() GraphQLObjectType query = newObject() .name("RootQuery") .field( - { field -> - field - .name("node") - .dataFetcher( - { env -> - CompletableFuture.supplyAsync({ -> - Map map = new HashMap<>() - map.put("id", "abc") - - return map - }) - }) - .type(node) - } as UnaryOperator) + { field -> + field + .name("node") + .dataFetcher( + { env -> + CompletableFuture.supplyAsync({ -> + Map map = new HashMap<>() + map.put("id", "abc") + + return map + }) + }) + .type(node) + } as UnaryOperator) .build() GraphQLSchema schema = newSchema() @@ -956,7 +956,7 @@ class GraphQLTest extends Specification { .type(GraphQLString) .argument(newArgument().name("arg").type(GraphQLString)) .dataFetcher({ env -> env.getArgument("arg") } - ) + ) GraphQLSchema schema = newSchema().query( newObject() .name("Query") @@ -975,4 +975,44 @@ many lines""") }''') over many lines'''] } + + def "variables map can't be null via ExecutionInput"() { + given: + + when: + def input = newExecutionInput().query('query($var:String){ hello(arg: $var) }').variables(null).build() + + then: + def assEx = thrown(AssertException) + assEx.message.contains("variables map can't be null") + + + } + + def "query can't be null via ExecutionInput"() { + given: + + when: + def input = newExecutionInput().query(null).build() + + then: + def assEx = thrown(AssertException) + assEx.message.contains("query can't be null") + + + } + + def "query must be set via ExecutionInput"() { + given: + + when: + def input = newExecutionInput().query().build() + + then: + def assEx = thrown(AssertException) + assEx.message.contains("query can't be null") + + + } + } diff --git a/src/test/groovy/graphql/execution/ExecutionTest.groovy b/src/test/groovy/graphql/execution/ExecutionTest.groovy index 0d958c4937..9a439a928a 100644 --- a/src/test/groovy/graphql/execution/ExecutionTest.groovy +++ b/src/test/groovy/graphql/execution/ExecutionTest.groovy @@ -35,7 +35,7 @@ class ExecutionTest extends Specification { def mutationStrategy = new CountingExecutionStrategy() def queryStrategy = new CountingExecutionStrategy() def execution = new Execution(queryStrategy, mutationStrategy, subscriptionStrategy, SimpleInstrumentation.INSTANCE) - def emptyExecutionInput = ExecutionInput.newExecutionInput().build() + def emptyExecutionInput = ExecutionInput.newExecutionInput().query("query").build() def instrumentationState = new InstrumentationState() {} def "query strategy is used for query requests"() {