Add tests for bad input

This commit is contained in:
Rossen Stoyanchev
2020-09-18 14:36:26 +01:00
parent 6044017d31
commit b0b10dd8d3
2 changed files with 91 additions and 36 deletions

View File

@@ -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<WebTestClient> 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 {

View File

@@ -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()));
}
}
}