From d68edb47c95043c4f305ed9a1b77e9ceb4289fcb Mon Sep 17 00:00:00 2001 From: Rossen Stoyanchev Date: Thu, 23 Sep 2021 12:23:17 +0100 Subject: [PATCH] Polishing annotated DataFetcher tests See gh-130 --- .../AnnotatedDataFetcherConfigurer.java | 6 +-- ....java => SchemaMappingDetectionTests.java} | 40 +++++++++------- ...java => SchemaMappingInvocationTests.java} | 48 +++++++++---------- 3 files changed, 50 insertions(+), 44 deletions(-) rename spring-graphql/src/test/java/org/springframework/graphql/data/method/annotation/support/{AnnotatedDataFetcherDetectionTests.java => SchemaMappingDetectionTests.java} (76%) rename spring-graphql/src/test/java/org/springframework/graphql/data/method/annotation/support/{AnnotatedDataFetcherInvocationTests.java => SchemaMappingInvocationTests.java} (88%) diff --git a/spring-graphql/src/main/java/org/springframework/graphql/data/method/annotation/support/AnnotatedDataFetcherConfigurer.java b/spring-graphql/src/main/java/org/springframework/graphql/data/method/annotation/support/AnnotatedDataFetcherConfigurer.java index e0cce8c3..43ac1b3a 100644 --- a/spring-graphql/src/main/java/org/springframework/graphql/data/method/annotation/support/AnnotatedDataFetcherConfigurer.java +++ b/spring-graphql/src/main/java/org/springframework/graphql/data/method/annotation/support/AnnotatedDataFetcherConfigurer.java @@ -122,7 +122,7 @@ public class AnnotatedDataFetcherConfigurer findHandlerMethods().forEach((info) -> { FieldCoordinates coordinates = info.getCoordinates(); HandlerMethod handlerMethod = info.getHandlerMethod(); - DataFetcher dataFetcher = new AnnotatedDataFetcher(coordinates, handlerMethod, this.argumentResolvers); + DataFetcher dataFetcher = new SchemaMappingDataFetcher(coordinates, handlerMethod, this.argumentResolvers); builder.type(coordinates.getTypeName(), typeBuilder -> typeBuilder.dataFetcher(coordinates.getFieldName(), dataFetcher)); }); @@ -267,7 +267,7 @@ public class AnnotatedDataFetcherConfigurer /** * {@link DataFetcher} that wrap and invokes a {@link HandlerMethod}. */ - static class AnnotatedDataFetcher implements DataFetcher { + static class SchemaMappingDataFetcher implements DataFetcher { private final FieldCoordinates coordinates; @@ -276,7 +276,7 @@ public class AnnotatedDataFetcherConfigurer private final HandlerMethodArgumentResolverComposite argumentResolvers; - public AnnotatedDataFetcher(FieldCoordinates coordinates, HandlerMethod handlerMethod, + public SchemaMappingDataFetcher(FieldCoordinates coordinates, HandlerMethod handlerMethod, HandlerMethodArgumentResolverComposite resolvers) { this.coordinates = coordinates; diff --git a/spring-graphql/src/test/java/org/springframework/graphql/data/method/annotation/support/AnnotatedDataFetcherDetectionTests.java b/spring-graphql/src/test/java/org/springframework/graphql/data/method/annotation/support/SchemaMappingDetectionTests.java similarity index 76% rename from spring-graphql/src/test/java/org/springframework/graphql/data/method/annotation/support/AnnotatedDataFetcherDetectionTests.java rename to spring-graphql/src/test/java/org/springframework/graphql/data/method/annotation/support/SchemaMappingDetectionTests.java index 27fcb1d4..df3ca32c 100644 --- a/spring-graphql/src/test/java/org/springframework/graphql/data/method/annotation/support/AnnotatedDataFetcherDetectionTests.java +++ b/spring-graphql/src/test/java/org/springframework/graphql/data/method/annotation/support/SchemaMappingDetectionTests.java @@ -32,6 +32,7 @@ import org.springframework.graphql.data.method.annotation.QueryMapping; import org.springframework.graphql.data.method.annotation.SchemaMapping; import org.springframework.graphql.data.method.annotation.SubscriptionMapping; import org.springframework.stereotype.Controller; +import org.springframework.util.StringUtils; import static org.assertj.core.api.Assertions.assertThat; @@ -41,40 +42,42 @@ import static org.assertj.core.api.Assertions.assertThat; * * @author Rossen Stoyanchev */ -public class AnnotatedDataFetcherDetectionTests { +public class SchemaMappingDetectionTests { @Test void registerWithDefaultCoordinates() { - RuntimeWiring.Builder wiringBuilder = initRuntimeWiringBuilder(BookController.class); - Map> map = wiringBuilder.build().getDataFetchers(); + Map> map = + initRuntimeWiringBuilder(BookController.class).build().getDataFetchers(); + assertThat(map).containsOnlyKeys("Query", "Mutation", "Subscription", "Book"); assertThat(map.get("Query")).containsOnlyKeys("bookById", "bookByIdCustomized"); assertThat(map.get("Mutation")).containsOnlyKeys("saveBook", "saveBookCustomized"); assertThat(map.get("Subscription")).containsOnlyKeys("bookSearch", "bookSearchCustomized"); assertThat(map.get("Book")).containsOnlyKeys("author", "authorCustomized"); - checkMappedMethod(map, "Query", "bookById", "bookById"); - checkMappedMethod(map, "Mutation", "saveBook", "saveBook"); - checkMappedMethod(map, "Subscription", "bookSearch", "bookSearch"); - checkMappedMethod(map, "Book", "author", "author"); + assertMapping(map, "Query.bookById", "bookById"); + assertMapping(map, "Mutation.saveBook", "saveBook"); + assertMapping(map, "Subscription.bookSearch", "bookSearch"); + assertMapping(map, "Book.author", "author"); } @Test void registerWithExplicitCoordinates() { - RuntimeWiring.Builder wiringBuilder = initRuntimeWiringBuilder(BookController.class); - Map> map = wiringBuilder.build().getDataFetchers(); + Map> map = + initRuntimeWiringBuilder(BookController.class).build().getDataFetchers(); + assertThat(map).containsOnlyKeys("Query", "Mutation", "Subscription", "Book"); assertThat(map.get("Query")).containsOnlyKeys("bookById", "bookByIdCustomized"); assertThat(map.get("Mutation")).containsOnlyKeys("saveBook", "saveBookCustomized"); assertThat(map.get("Subscription")).containsOnlyKeys("bookSearch", "bookSearchCustomized"); assertThat(map.get("Book")).containsOnlyKeys("author", "authorCustomized"); - checkMappedMethod(map, "Query", "bookByIdCustomized", "bookByIdWithNonMatchingMethodName"); - checkMappedMethod(map, "Mutation", "saveBookCustomized", "saveBookWithNonMatchingMethodName"); - checkMappedMethod(map, "Subscription", "bookSearchCustomized", "bookSearchWithNonMatchingMethodName"); - checkMappedMethod(map, "Book", "authorCustomized", "authorWithNonMatchingMethodName"); + assertMapping(map, "Query.bookByIdCustomized", "bookByIdWithNonMatchingMethodName"); + assertMapping(map, "Mutation.saveBookCustomized", "saveBookWithNonMatchingMethodName"); + assertMapping(map, "Subscription.bookSearchCustomized", "bookSearchWithNonMatchingMethodName"); + assertMapping(map, "Book.authorCustomized", "authorWithNonMatchingMethodName"); } private RuntimeWiring.Builder initRuntimeWiringBuilder(Class handlerType) { @@ -92,11 +95,14 @@ public class AnnotatedDataFetcherDetectionTests { } @SuppressWarnings("rawtypes") - private void checkMappedMethod( - Map> dataFetcherMap, String typeName, String fieldName, String methodName) { + private void assertMapping(Map> map, String coordinates, String methodName) { - AnnotatedDataFetcherConfigurer.AnnotatedDataFetcher dataFetcher = - (AnnotatedDataFetcherConfigurer.AnnotatedDataFetcher) dataFetcherMap.get(typeName).get(fieldName); + String[] strings = StringUtils.tokenizeToStringArray(coordinates, "."); + String typeName = strings[0]; + String field = strings[1]; + + AnnotatedDataFetcherConfigurer.SchemaMappingDataFetcher dataFetcher = + (AnnotatedDataFetcherConfigurer.SchemaMappingDataFetcher) map.get(typeName).get(field); assertThat(dataFetcher.getHandlerMethod().getMethod().getName()).isEqualTo(methodName); } diff --git a/spring-graphql/src/test/java/org/springframework/graphql/data/method/annotation/support/AnnotatedDataFetcherInvocationTests.java b/spring-graphql/src/test/java/org/springframework/graphql/data/method/annotation/support/SchemaMappingInvocationTests.java similarity index 88% rename from spring-graphql/src/test/java/org/springframework/graphql/data/method/annotation/support/AnnotatedDataFetcherInvocationTests.java rename to spring-graphql/src/test/java/org/springframework/graphql/data/method/annotation/support/SchemaMappingInvocationTests.java index 334f6861..d9a9d7bf 100644 --- a/spring-graphql/src/test/java/org/springframework/graphql/data/method/annotation/support/AnnotatedDataFetcherInvocationTests.java +++ b/spring-graphql/src/test/java/org/springframework/graphql/data/method/annotation/support/SchemaMappingInvocationTests.java @@ -48,15 +48,17 @@ import org.springframework.graphql.execution.BatchLoaderRegistry; import org.springframework.graphql.execution.DefaultBatchLoaderRegistry; import org.springframework.graphql.execution.ExecutionGraphQlService; import org.springframework.graphql.execution.GraphQlSource; +import org.springframework.lang.Nullable; import org.springframework.stereotype.Controller; import static org.assertj.core.api.Assertions.assertThat; /** - * Tests with invocation of DataFetcher's from annotated methods. + * Test GraphQL requests handled through {@code @SchemaMapping} methods. + * * @author Rossen Stoyanchev */ -public class AnnotatedDataFetcherInvocationTests { +public class SchemaMappingInvocationTests { @Test void queryWithScalarArgument() { @@ -71,13 +73,11 @@ public class AnnotatedDataFetcherInvocationTests { " }" + "}"; - ExecutionResult result = initGraphQlService(BookController.class) + ExecutionResult result = initGraphQlService() .execute(new RequestInput(query, null, null)) .block(); - assertThat(result.getErrors()).isEmpty(); - Map data = result.getData(); - assertThat(data).isNotNull(); + Map data = getData(result); Map book = getValue(data, "bookById"); assertThat(book.get("id")).isEqualTo("1"); @@ -97,14 +97,11 @@ public class AnnotatedDataFetcherInvocationTests { " }" + "}"; - ExecutionResult result = initGraphQlService(BookController.class) + ExecutionResult result = initGraphQlService() .execute(new RequestInput(query, null, null)) .block(); - assertThat(result.getErrors()).isEmpty(); - Map data = result.getData(); - assertThat(data).isNotNull(); - + Map data = getData(result); List> bookList = getValue(data, "booksByCriteria"); assertThat(bookList).hasSize(2); assertThat(bookList.get(0).get("name")).isEqualTo("Nineteen Eighty-Four"); @@ -128,13 +125,11 @@ public class AnnotatedDataFetcherInvocationTests { return executionInput; }); - ExecutionResult result = initGraphQlService(BookController.class) + ExecutionResult result = initGraphQlService() .execute(requestInput) .block(); - assertThat(result.getErrors()).isEmpty(); - Map data = result.getData(); - assertThat(data).isNotNull(); + Map data = getData(result); Map author = getValue(data, "authorById"); assertThat(author.get("id")).isEqualTo("101"); @@ -154,13 +149,11 @@ public class AnnotatedDataFetcherInvocationTests { " }" + "}"; - ExecutionResult result = initGraphQlService(BookController.class) + ExecutionResult result = initGraphQlService() .execute(new RequestInput(operation, null, null)) .block(); - assertThat(result.getErrors()).isEmpty(); - Map data = result.getData(); - assertThat(data).isNotNull(); + Map data = getData(result); Map author = getValue(data, "addAuthor"); assertThat(author.get("id")).isEqualTo("99"); @@ -177,13 +170,11 @@ public class AnnotatedDataFetcherInvocationTests { " }" + "}"; - ExecutionResult result = initGraphQlService(BookController.class) + ExecutionResult result = initGraphQlService() .execute(new RequestInput(operation, null, null)) .block(); - assertThat(result.getErrors()).isEmpty(); - Publisher publisher = result.getData(); - assertThat(publisher).isNotNull(); + Publisher publisher = getData(result); Flux> bookFlux = Flux.from(publisher).map(rs -> { Map map = rs.getData(); @@ -203,7 +194,7 @@ public class AnnotatedDataFetcherInvocationTests { } - private ExecutionGraphQlService initGraphQlService(Class beanClass) { + private ExecutionGraphQlService initGraphQlService() { AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(); applicationContext.register(TestConfig.class); applicationContext.refresh(); @@ -211,6 +202,14 @@ public class AnnotatedDataFetcherInvocationTests { return applicationContext.getBean(ExecutionGraphQlService.class); } + private T getData(@Nullable ExecutionResult result) { + assertThat(result).isNotNull(); + assertThat(result.getErrors()).isEmpty(); + T data = result.getData(); + assertThat(data).isNotNull(); + return data; + } + @SuppressWarnings("unchecked") private T getValue(Map data, String key) { return (T) data.get(key); @@ -253,6 +252,7 @@ public class AnnotatedDataFetcherInvocationTests { } + @SuppressWarnings("unused") @Controller private static class BookController {