diff --git a/spring-graphql-web/src/test/java/org/springframework/boot/graphql/WebFluxApplicationContextTests.java b/spring-graphql-web/src/test/java/org/springframework/boot/graphql/WebFluxApplicationContextTests.java index 3d1fb797..9c0ece0c 100644 --- a/spring-graphql-web/src/test/java/org/springframework/boot/graphql/WebFluxApplicationContextTests.java +++ b/spring-graphql-web/src/test/java/org/springframework/boot/graphql/WebFluxApplicationContextTests.java @@ -1,6 +1,9 @@ package org.springframework.boot.graphql; +import java.util.Collections; +import java.util.function.Consumer; + import org.junit.jupiter.api.Test; import org.springframework.boot.autoconfigure.AutoConfigurations; @@ -9,7 +12,6 @@ import org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration; import org.springframework.boot.autoconfigure.web.reactive.HttpHandlerAutoConfiguration; import org.springframework.boot.autoconfigure.web.reactive.WebFluxAutoConfiguration; import org.springframework.boot.test.context.runner.ReactiveWebApplicationContextRunner; -import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.MediaType; @@ -19,16 +21,15 @@ import static graphql.schema.idl.TypeRuntimeWiring.newTypeWiring; class WebFluxApplicationContextTests { + private static final AutoConfigurations AUTO_CONFIGURATIONS = AutoConfigurations.of( + HttpHandlerAutoConfiguration.class, WebFluxAutoConfiguration.class, + CodecsAutoConfiguration.class, JacksonAutoConfiguration.class, + GraphQLAutoConfiguration.class, WebFluxGraphQLAutoConfiguration.class); + + @Test void endpointHandlesGraphQLQueries() { - new ReactiveWebApplicationContextRunner() - .withConfiguration(AutoConfigurations.of(JacksonAutoConfiguration.class, CodecsAutoConfiguration.class, - WebFluxAutoConfiguration.class, HttpHandlerAutoConfiguration.class, - GraphQLAutoConfiguration.class, WebFluxGraphQLAutoConfiguration.class)) - .withUserConfiguration(DataFetchersConfiguration.class) - .withPropertyValues("spring.main.web-application-type=reactive", "spring.graphql.schema:classpath:books/schema.graphqls").run((context) -> { - WebTestClient client = createWebTestClient(context); - + testWith(client -> { String query = "{" + " bookById(id: \\\"book-1\\\"){ " + " id" + @@ -38,22 +39,46 @@ class WebFluxApplicationContextTests { " }" + "}"; - String body = "{" + - " \"query\": \"" + query + "\"" + - "}"; - - client.post().uri("/graphql").contentType(MediaType.APPLICATION_JSON).accept(MediaType.APPLICATION_JSON) - .bodyValue(body).exchange().expectStatus().isOk() - .expectBody() - .jsonPath("data.bookById.name").isEqualTo("GraphQL for beginners"); + client.post().uri("") + .bodyValue("{ \"query\": \"" + query + "\"}") + .exchange() + .expectStatus().isOk() + .expectBody().jsonPath("data.bookById.name").isEqualTo("GraphQL for beginners"); }); } - private WebTestClient createWebTestClient(ApplicationContext context) { - return WebTestClient.bindToApplicationContext(context).configureClient().baseUrl("https://spring.example.org") - .build(); + @Test + void missingQuery() { + testWith(client -> client.post().uri("").bodyValue("{}").exchange().expectStatus().isBadRequest()); } + @Test + void invalidJson() { + testWith(client -> client.post().uri("").bodyValue(":)").exchange().expectStatus().isBadRequest()); + } + + + private void testWith(Consumer consumer) { + new ReactiveWebApplicationContextRunner() + .withConfiguration(AUTO_CONFIGURATIONS) + .withUserConfiguration(DataFetchersConfiguration.class) + .withPropertyValues( + "spring.main.web-application-type=reactive", + "spring.graphql.schema:classpath:books/schema.graphqls") + .run((context) -> { + WebTestClient client = WebTestClient.bindToApplicationContext(context) + .configureClient() + .defaultHeaders(headers -> { + headers.setContentType(MediaType.APPLICATION_JSON); + headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON)); + }) + .baseUrl("https://spring.example.org/graphql") + .build(); + consumer.accept(client); + }); + } + + @Configuration(proxyBeanMethods = false) static class DataFetchersConfiguration { diff --git a/spring-graphql-web/src/test/java/org/springframework/boot/graphql/WebMvcApplicationContextTests.java b/spring-graphql-web/src/test/java/org/springframework/boot/graphql/WebMvcApplicationContextTests.java index 1c9bd31d..54b13a30 100644 --- a/spring-graphql-web/src/test/java/org/springframework/boot/graphql/WebMvcApplicationContextTests.java +++ b/spring-graphql-web/src/test/java/org/springframework/boot/graphql/WebMvcApplicationContextTests.java @@ -13,24 +13,24 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.MediaType; import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder; import org.springframework.test.web.servlet.setup.MockMvcBuilders; import static graphql.schema.idl.TypeRuntimeWiring.newTypeWiring; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; class WebMvcApplicationContextTests { - @Test - void endpointHandlesGraphQLQueries() { - new WebApplicationContextRunner() - .withConfiguration(AutoConfigurations.of(JacksonAutoConfiguration.class, HttpMessageConvertersAutoConfiguration.class, - WebMvcAutoConfiguration.class, DispatcherServletAutoConfiguration.class, - GraphQLAutoConfiguration.class, WebMvcGraphQLAutoConfiguration.class)) - .withUserConfiguration(DataFetchersConfiguration.class) - .withPropertyValues("spring.main.web-application-type=servlet", "spring.graphql.schema:classpath:books/schema.graphqls").run((context) -> { + public static final AutoConfigurations AUTO_CONFIGURATIONS = AutoConfigurations.of( + DispatcherServletAutoConfiguration.class, WebMvcAutoConfiguration.class, + HttpMessageConvertersAutoConfiguration.class, JacksonAutoConfiguration.class, + GraphQLAutoConfiguration.class, WebMvcGraphQLAutoConfiguration.class); - MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(context).build(); + @Test + void endpointHandlesGraphQLQuery() { + testWith(mockMvc -> { String query = "{" + " bookById(id: \\\"book-1\\\"){ " + " id" + @@ -39,16 +39,46 @@ class WebMvcApplicationContextTests { " author" + " }" + "}"; - - String body = "{" + - " \"query\": \"" + query + "\"" + - "}"; - - mockMvc.perform(post("/graphql").content(body).contentType(MediaType.APPLICATION_JSON).accept(MediaType.APPLICATION_JSON)) + mockMvc.perform(post("/graphql").content("{\"query\": \"" + query + "\"}")) + .andExpect(status().isOk()) .andExpect(jsonPath("data.bookById.name").value("GraphQL for beginners")); }); } + @Test + void missingQuery() { + testWith(mockMvc -> mockMvc.perform(post("/graphql").content("{}")).andExpect(status().isBadRequest())); + } + + @Test + void invalidJson() { + testWith(mockMvc -> mockMvc.perform(post("/graphql").content(":)")).andExpect(status().isBadRequest())); + } + + + private void testWith(MockMvcConsumer mockMvcConsumer) { + new WebApplicationContextRunner() + .withConfiguration(AUTO_CONFIGURATIONS) + .withUserConfiguration(DataFetchersConfiguration.class) + .withPropertyValues( + "spring.main.web-application-type=servlet", + "spring.graphql.schema:classpath:books/schema.graphqls") + .run((context) -> { + MockHttpServletRequestBuilder builder = post("/graphQL") + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON); + MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(context).defaultRequest(builder).build(); + mockMvcConsumer.accept(mockMvc); + }); + } + + + private static interface MockMvcConsumer { + + void accept(MockMvc mockMvc) throws Exception; + + } + @Configuration(proxyBeanMethods = false) static class DataFetchersConfiguration { @@ -57,6 +87,6 @@ class WebMvcApplicationContextTests { return (runtimeWiring) -> runtimeWiring.type(newTypeWiring("Query") .dataFetcher("bookById", GraphQLDataFetchers.getBookByIdDataFetcher())); } - } + }