diff --git a/spring-graphql-test/src/main/java/org/springframework/graphql/test/tester/DefaultGraphQlTester.java b/spring-graphql-test/src/main/java/org/springframework/graphql/test/tester/DefaultGraphQlTester.java index 98d5bb8d2..c6c37d111 100644 --- a/spring-graphql-test/src/main/java/org/springframework/graphql/test/tester/DefaultGraphQlTester.java +++ b/spring-graphql-test/src/main/java/org/springframework/graphql/test/tester/DefaultGraphQlTester.java @@ -144,6 +144,12 @@ public DefaultRequest variable(String name, @Nullable Object value) { return this; } + @Override + public DefaultRequest variable(Map values) { + this.variables.putAll(values); + return this; + } + @Override public DefaultRequest extension(String name, @Nullable Object value) { this.extensions.put(name, value); diff --git a/spring-graphql-test/src/main/java/org/springframework/graphql/test/tester/GraphQlTester.java b/spring-graphql-test/src/main/java/org/springframework/graphql/test/tester/GraphQlTester.java index 4c09da830..4b76d4677 100644 --- a/spring-graphql-test/src/main/java/org/springframework/graphql/test/tester/GraphQlTester.java +++ b/spring-graphql-test/src/main/java/org/springframework/graphql/test/tester/GraphQlTester.java @@ -18,6 +18,7 @@ import java.time.Duration; import java.util.List; +import java.util.Map; import java.util.function.Consumer; import java.util.function.Predicate; @@ -153,6 +154,15 @@ interface Request> { */ T variable(String name, @Nullable Object value); + /** + * Add variables. + * @param values the variables to be set + * the variable of the values, possibly {@code null} since GraphQL + * supports providing null value vs not providing a value at all. + * @return this request spec + */ + T variable(Map values); + /** * Add a value for a protocol extension. * @param name the protocol extension name diff --git a/spring-graphql-test/src/test/java/org/springframework/graphql/test/tester/GraphQlTesterTests.java b/spring-graphql-test/src/test/java/org/springframework/graphql/test/tester/GraphQlTesterTests.java index 3fc7fb76e..d7c640f45 100644 --- a/spring-graphql-test/src/test/java/org/springframework/graphql/test/tester/GraphQlTesterTests.java +++ b/spring-graphql-test/src/test/java/org/springframework/graphql/test/tester/GraphQlTesterTests.java @@ -19,6 +19,7 @@ import java.util.Collections; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.concurrent.atomic.AtomicReference; import graphql.GraphqlErrorBuilder; @@ -240,6 +241,39 @@ void operationNameAndVariables() { assertThat(request.getVariables()).containsEntry("keyOnly", null); } + @Test + void operationNameAndVariablesAsMap() { + + String document = "query HeroNameAndFriends($episode: Episode) {" + + " hero(episode: $episode) {" + + " name" + + " }" + + "}"; + + getGraphQlService().setDataAsJson(document, "{\"hero\": {\"name\":\"R2-D2\"}}"); + + Map variableMap = new LinkedHashMap<>(); + + variableMap.put("episode", Optional.of("JEDI")); + variableMap.put("foo", Optional.of("bar")); + variableMap.put("keyOnly", Optional.ofNullable(null)); + + GraphQlTester.Response response = graphQlTester().document(document) + .operationName("HeroNameAndFriends") + .variable(variableMap) + .execute(); + + response.path("hero").entity(MovieCharacter.class).isEqualTo(MovieCharacter.create("R2-D2")); + + ExecutionGraphQlRequest request = getGraphQlService().getGraphQlRequest(); + assertThat(request.getDocument()).contains(document); + assertThat(request.getOperationName()).isEqualTo("HeroNameAndFriends"); + assertThat(request.getVariables()).hasSize(3); + assertThat(request.getVariables()).containsEntry("episode", Optional.of("JEDI")); + assertThat(request.getVariables()).containsEntry("foo", Optional.of("bar")); + assertThat(request.getVariables()).containsEntry("keyOnly", Optional.ofNullable(null)); + } + @Test void protocolExtensions() { String document = "{me {name, friends}}";