Add tests for bad input
This commit is contained in:
@@ -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 {
|
||||
|
||||
|
||||
@@ -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()));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user