From 21d9791484acfcbe379d88c911e8ed72eb36dff6 Mon Sep 17 00:00:00 2001 From: Rossen Stoyanchev Date: Fri, 1 Oct 2021 17:35:40 +0100 Subject: [PATCH] Update reference docs for access to HTTP headers Also rename existing methods for request headers to be consistent with those for response headers and use "Http" in the name. Closes gh-74 --- .../graphql/SampleApplicationTests.java | 6 ++--- .../graphql/SampleApplicationTests.java | 6 ++--- .../src/docs/asciidoc/testing.adoc | 24 +++++++++++++++++++ .../test/tester/DefaultWebGraphQlTester.java | 4 ++-- .../DefaultWebGraphQlTesterBuilder.java | 4 ++-- .../graphql/test/tester/WebGraphQlTester.java | 10 ++++---- .../test/tester/WebGraphQlTesterTests.java | 12 +++++----- 7 files changed, 45 insertions(+), 21 deletions(-) diff --git a/samples/webflux-security/src/test/java/io/spring/sample/graphql/SampleApplicationTests.java b/samples/webflux-security/src/test/java/io/spring/sample/graphql/SampleApplicationTests.java index e945580b..ad99c569 100644 --- a/samples/webflux-security/src/test/java/io/spring/sample/graphql/SampleApplicationTests.java +++ b/samples/webflux-security/src/test/java/io/spring/sample/graphql/SampleApplicationTests.java @@ -57,7 +57,7 @@ class SampleApplicationTests { @Test void userRoleThenForbidden() { this.graphQlTester.queryName("employeesNamesAndSalaries") - .headers(headers -> headers.setBasicAuth("rob", "rob")) + .httpHeaders(headers -> headers.setBasicAuth("rob", "rob")) .execute() .errors() .satisfy(errors -> { @@ -87,7 +87,7 @@ class SampleApplicationTests { @Test void canQuerySalaryAsAdmin() { this.graphQlTester.queryName("employeesNamesAndSalaries") - .headers(headers -> headers.setBasicAuth("admin", "admin")) + .httpHeaders(headers -> headers.setBasicAuth("admin", "admin")) .execute() .path("employees[0].name").entity(String.class).isEqualTo("Andi") .path("employees[0].salary").entity(int.class).isEqualTo(42); @@ -97,7 +97,7 @@ class SampleApplicationTests { void invalidCredentials() { assertThatThrownBy(() -> this.graphQlTester.queryName("employeesNamesAndSalaries") - .headers(headers -> headers.setBasicAuth("admin", "INVALID")) + .httpHeaders(headers -> headers.setBasicAuth("admin", "INVALID")) .executeAndVerify()) .hasMessage("Status expected:<200 OK> but was:<401 UNAUTHORIZED>"); } diff --git a/samples/webmvc-http-security/src/test/java/io/spring/sample/graphql/SampleApplicationTests.java b/samples/webmvc-http-security/src/test/java/io/spring/sample/graphql/SampleApplicationTests.java index eada64f3..6fc703aa 100644 --- a/samples/webmvc-http-security/src/test/java/io/spring/sample/graphql/SampleApplicationTests.java +++ b/samples/webmvc-http-security/src/test/java/io/spring/sample/graphql/SampleApplicationTests.java @@ -42,7 +42,7 @@ class SampleApplicationTests { @Test void userRoleThenForbidden() { this.graphQlTester.queryName("employeesNamesAndSalaries") - .headers(headers -> headers.setBasicAuth("rob", "rob")) + .httpHeaders(headers -> headers.setBasicAuth("rob", "rob")) .execute() .errors() .satisfy(errors -> { @@ -72,7 +72,7 @@ class SampleApplicationTests { @Test void canQuerySalaryAsAdmin() { this.graphQlTester.queryName("employeesNamesAndSalaries") - .headers(headers -> headers.setBasicAuth("admin", "admin")) + .httpHeaders(headers -> headers.setBasicAuth("admin", "admin")) .execute() .path("employees[0].name").entity(String.class).isEqualTo("Andi") .path("employees[0].salary").entity(int.class).isEqualTo(42); @@ -82,7 +82,7 @@ class SampleApplicationTests { void invalidCredentials() { assertThatThrownBy(() -> this.graphQlTester.queryName("employeesNamesAndSalaries") - .headers(headers -> headers.setBasicAuth("admin", "INVALID")) + .httpHeaders(headers -> headers.setBasicAuth("admin", "INVALID")) .executeAndVerify()) .hasMessage("Status expected:<200 OK> but was:<401 UNAUTHORIZED>"); } diff --git a/spring-graphql-docs/src/docs/asciidoc/testing.adoc b/spring-graphql-docs/src/docs/asciidoc/testing.adoc index 9a05f4c9..e10b20d9 100644 --- a/spring-graphql-docs/src/docs/asciidoc/testing.adoc +++ b/spring-graphql-docs/src/docs/asciidoc/testing.adoc @@ -88,6 +88,30 @@ For tests against a live, running server: WebGraphQlTester tester = WebGraphQlTester.builder(client).build(); ---- +`WebGraphQlTester` supports setting HTTP request headers and access to HTTP response +headers. This may be useful to inspect or set security related headers. + +[source,java,indent=0,subs="verbatim,quotes"] +---- + this.graphQlTester.queryName("{ myQuery }") + .httpHeaders(headers -> headers.setBasicAuth("rob", "...")) + .execute() + .httpHeadersSatisfy(headers -> { + // check response headers + }) + .path("myQuery.field1").entity(String.class).isEqualTo("value1") + .path("myQuery.field2").entity(String.class).isEqualTo("value2"); +---- + +You can also set default request headers at the builder level: + +[source,java,indent=0,subs="verbatim,quotes"] +---- + WebGraphQlTester tester = WebGraphQlTester.builder(client) + .defaultHttpHeaders(headers -> headers.setBasicAuth("rob", "...")) + .build(); +---- + [[testing-queries]] diff --git a/spring-graphql-test/src/main/java/org/springframework/graphql/test/tester/DefaultWebGraphQlTester.java b/spring-graphql-test/src/main/java/org/springframework/graphql/test/tester/DefaultWebGraphQlTester.java index 96bbd7de..08adbd02 100644 --- a/spring-graphql-test/src/main/java/org/springframework/graphql/test/tester/DefaultWebGraphQlTester.java +++ b/spring-graphql-test/src/main/java/org/springframework/graphql/test/tester/DefaultWebGraphQlTester.java @@ -123,7 +123,7 @@ class DefaultWebGraphQlTester implements WebGraphQlTester { } @Override - public WebRequestSpec header(String headerName, String... headerValues) { + public WebRequestSpec httpHeader(String headerName, String... headerValues) { for (String headerValue : headerValues) { this.headers.add(headerName, headerValue); } @@ -131,7 +131,7 @@ class DefaultWebGraphQlTester implements WebGraphQlTester { } @Override - public WebRequestSpec headers(Consumer headersConsumer) { + public WebRequestSpec httpHeaders(Consumer headersConsumer) { headersConsumer.accept(this.headers); return this; } diff --git a/spring-graphql-test/src/main/java/org/springframework/graphql/test/tester/DefaultWebGraphQlTesterBuilder.java b/spring-graphql-test/src/main/java/org/springframework/graphql/test/tester/DefaultWebGraphQlTesterBuilder.java index 0e37662c..0fc76e65 100644 --- a/spring-graphql-test/src/main/java/org/springframework/graphql/test/tester/DefaultWebGraphQlTesterBuilder.java +++ b/spring-graphql-test/src/main/java/org/springframework/graphql/test/tester/DefaultWebGraphQlTesterBuilder.java @@ -79,7 +79,7 @@ final class DefaultWebGraphQlTesterBuilder } @Override - public DefaultWebGraphQlTesterBuilder defaultHeader(String headerName, String... headerValues) { + public DefaultWebGraphQlTesterBuilder defaultHttpHeader(String headerName, String... headerValues) { this.headers = (this.headers != null ? this.headers : new HttpHeaders()); for (String headerValue : headerValues) { this.headers.add(headerName, headerValue); @@ -88,7 +88,7 @@ final class DefaultWebGraphQlTesterBuilder } @Override - public WebGraphQlTester.Builder defaultHeaders(Consumer headersConsumer) { + public WebGraphQlTester.Builder defaultHttpHeaders(Consumer headersConsumer) { this.headers = (this.headers != null ? this.headers : new HttpHeaders()); headersConsumer.accept(this.headers); return this; diff --git a/spring-graphql-test/src/main/java/org/springframework/graphql/test/tester/WebGraphQlTester.java b/spring-graphql-test/src/main/java/org/springframework/graphql/test/tester/WebGraphQlTester.java index eb6eb2eb..969e065a 100644 --- a/spring-graphql-test/src/main/java/org/springframework/graphql/test/tester/WebGraphQlTester.java +++ b/spring-graphql-test/src/main/java/org/springframework/graphql/test/tester/WebGraphQlTester.java @@ -147,14 +147,14 @@ public interface WebGraphQlTester extends GraphQlTester { * @param headerName the header name * @param headerValues the header values */ - Builder defaultHeader(String headerName, String... headerValues); + Builder defaultHttpHeader(String headerName, String... headerValues); /** - * Variant of {@link #defaultHeader(String, String...)} that provides + * Variant of {@link #defaultHttpHeader(String, String...)} that provides * access to the underlying headers to inspect or modify directly. * @param headersConsumer a function that consumes the {@code HttpHeaders} */ - Builder defaultHeaders(Consumer headersConsumer); + Builder defaultHttpHeaders(Consumer headersConsumer); /** * Build the {@code WebGraphQlTester}. @@ -177,7 +177,7 @@ public interface WebGraphQlTester extends GraphQlTester { * @param headerValues the header value(s) * @return the same instance */ - WebRequestSpec header(String headerName, String... headerValues); + WebRequestSpec httpHeader(String headerName, String... headerValues); /** * Manipulate the request's headers with the given consumer. The @@ -188,7 +188,7 @@ public interface WebGraphQlTester extends GraphQlTester { * @param headersConsumer a function that consumes the {@code HttpHeaders} * @return this builder */ - WebRequestSpec headers(Consumer headersConsumer); + WebRequestSpec httpHeaders(Consumer headersConsumer); /** diff --git a/spring-graphql-test/src/test/java/org/springframework/graphql/test/tester/WebGraphQlTesterTests.java b/spring-graphql-test/src/test/java/org/springframework/graphql/test/tester/WebGraphQlTesterTests.java index 21d1999c..59096515 100644 --- a/spring-graphql-test/src/test/java/org/springframework/graphql/test/tester/WebGraphQlTesterTests.java +++ b/spring-graphql-test/src/test/java/org/springframework/graphql/test/tester/WebGraphQlTesterTests.java @@ -80,9 +80,9 @@ public class WebGraphQlTesterTests { setup.response("{\"me\": {\"name\":\"Luke Skywalker\", \"friends\":[]}}"); GraphQlTester.ResponseSpec spec = setup.graphQlTester().query(query) - .header("myHeader1", "myValue1a") - .header("myHeader1", "myValue1b") - .headers(headers -> headers.add("myHeader2", "myValue2")) + .httpHeader("myHeader1", "myValue1a") + .httpHeader("myHeader1", "myValue1b") + .httpHeaders(headers -> headers.add("myHeader2", "myValue2")) .execute(); spec.path("me.name").entity(String.class).isEqualTo("Luke Skywalker"); @@ -103,9 +103,9 @@ public class WebGraphQlTesterTests { setup.response("{\"me\": {\"name\":\"Luke Skywalker\", \"friends\":[]}}"); GraphQlTester.ResponseSpec spec = setup.graphQlTesterBuilder() - .defaultHeader("myHeader1", "myValue1a") - .defaultHeader("myHeader1", "myValue1b") - .defaultHeaders(headers -> headers.add("myHeader2", "myValue2")) + .defaultHttpHeader("myHeader1", "myValue1a") + .defaultHttpHeader("myHeader1", "myValue1b") + .defaultHttpHeaders(headers -> headers.add("myHeader2", "myValue2")) .build() .query(query) .execute();