From 5c0b32912abfff913ed7d9a12a45e5ea87d206dc Mon Sep 17 00:00:00 2001 From: Rossen Stoyanchev Date: Fri, 12 Nov 2021 21:44:10 +0000 Subject: [PATCH] Simplify setup for annotated controller tests --- .../springframework/graphql/GraphQlSetup.java | 9 ++++ .../support/BatchMappingDetectionTests.java | 10 ++-- .../support/BatchMappingInvocationTests.java | 34 +++++--------- ...gPrincipalMethodArgumentResolverTests.java | 33 ++++--------- .../support/BatchMappingTestSupport.java | 38 ++++++--------- .../support/SchemaMappingInvocationTests.java | 46 ++++--------------- ...gPrincipalMethodArgumentResolverTests.java | 14 +++--- 7 files changed, 65 insertions(+), 119 deletions(-) diff --git a/spring-graphql/src/test/java/org/springframework/graphql/GraphQlSetup.java b/spring-graphql/src/test/java/org/springframework/graphql/GraphQlSetup.java index b99504c7..8402428c 100644 --- a/spring-graphql/src/test/java/org/springframework/graphql/GraphQlSetup.java +++ b/spring-graphql/src/test/java/org/springframework/graphql/GraphQlSetup.java @@ -25,8 +25,10 @@ import graphql.schema.DataFetcher; import graphql.schema.GraphQLTypeVisitor; import graphql.schema.TypeResolver; +import org.springframework.context.ApplicationContext; import org.springframework.core.io.ByteArrayResource; import org.springframework.core.io.Resource; +import org.springframework.graphql.data.method.annotation.support.AnnotatedControllerConfigurer; import org.springframework.graphql.execution.DataFetcherExceptionResolver; import org.springframework.graphql.execution.DataLoaderRegistrar; import org.springframework.graphql.execution.ExecutionGraphQlService; @@ -82,6 +84,13 @@ public class GraphQlSetup implements GraphQlServiceSetup { return this; } + public GraphQlSetup runtimeWiringForAnnotatedControllers(ApplicationContext context) { + AnnotatedControllerConfigurer configurer = new AnnotatedControllerConfigurer(); + configurer.setApplicationContext(context); + configurer.afterPropertiesSet(); + return runtimeWiring(configurer); + } + public GraphQlSetup exceptionResolver(DataFetcherExceptionResolver... resolvers) { this.graphQlSourceBuilder.exceptionResolvers(Arrays.asList(resolvers)); return this; diff --git a/spring-graphql/src/test/java/org/springframework/graphql/data/method/annotation/support/BatchMappingDetectionTests.java b/spring-graphql/src/test/java/org/springframework/graphql/data/method/annotation/support/BatchMappingDetectionTests.java index a91a3d71..8bf389bf 100644 --- a/spring-graphql/src/test/java/org/springframework/graphql/data/method/annotation/support/BatchMappingDetectionTests.java +++ b/spring-graphql/src/test/java/org/springframework/graphql/data/method/annotation/support/BatchMappingDetectionTests.java @@ -81,13 +81,13 @@ public class BatchMappingDetectionTests { } private RuntimeWiring.Builder initRuntimeWiringBuilder(Class handlerType) { - AnnotationConfigApplicationContext appContext = new AnnotationConfigApplicationContext(); - appContext.registerBean(handlerType); - appContext.registerBean(BatchLoaderRegistry.class, () -> this.batchLoaderRegistry); - appContext.refresh(); + AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(); + context.registerBean(handlerType); + context.registerBean(BatchLoaderRegistry.class, () -> this.batchLoaderRegistry); + context.refresh(); AnnotatedControllerConfigurer configurer = new AnnotatedControllerConfigurer(); - configurer.setApplicationContext(appContext); + configurer.setApplicationContext(context); configurer.afterPropertiesSet(); RuntimeWiring.Builder wiringBuilder = RuntimeWiring.newRuntimeWiring(); diff --git a/spring-graphql/src/test/java/org/springframework/graphql/data/method/annotation/support/BatchMappingInvocationTests.java b/spring-graphql/src/test/java/org/springframework/graphql/data/method/annotation/support/BatchMappingInvocationTests.java index 3fbc4085..d0f40f0e 100644 --- a/spring-graphql/src/test/java/org/springframework/graphql/data/method/annotation/support/BatchMappingInvocationTests.java +++ b/spring-graphql/src/test/java/org/springframework/graphql/data/method/annotation/support/BatchMappingInvocationTests.java @@ -29,11 +29,9 @@ import org.junit.jupiter.params.provider.MethodSource; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; -import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.graphql.GraphQlResponse; import org.springframework.graphql.RequestInput; import org.springframework.graphql.data.method.annotation.BatchMapping; -import org.springframework.graphql.execution.ExecutionGraphQlService; import org.springframework.stereotype.Controller; import static org.assertj.core.api.Assertions.assertThat; @@ -48,19 +46,18 @@ import static org.junit.jupiter.params.provider.Arguments.arguments; @SuppressWarnings("unused") public class BatchMappingInvocationTests extends BatchMappingTestSupport { - private static Stream controllerClasses() { + private static Stream controllers() { return Stream.of( - arguments(named("Returning Mono>", BatchMonoMapController.class)), - arguments(named("Returning Map", BatchMapController.class)), - arguments(named("Returning Flux", BatchFluxController.class)), - arguments(named("Returning List", BatchListController.class)) + arguments(named("Returning Mono>", new BatchMonoMapController())), + arguments(named("Returning Map", new BatchMapController())), + arguments(named("Returning Flux", new BatchFluxController())), + arguments(named("Returning List", new BatchListController())) ); } - @ParameterizedTest - @MethodSource("controllerClasses") - void oneToOne(Class controllerClass) { + @MethodSource("controllers") + void oneToOne(CourseController controller) { String query = "{ " + " courses { " + " id" + @@ -73,7 +70,7 @@ public class BatchMappingInvocationTests extends BatchMappingTestSupport { " }" + "}"; - Mono resultMono = graphQlService(controllerClass) + Mono resultMono = createGraphQlService(controller) .execute(new RequestInput(query, null, null, null)); List actualCourses = GraphQlResponse.from(resultMono).toList("courses", Course.class); @@ -92,8 +89,8 @@ public class BatchMappingInvocationTests extends BatchMappingTestSupport { } @ParameterizedTest - @MethodSource("controllerClasses") - void oneToMany(Class controllerClass) { + @MethodSource("controllers") + void oneToMany(CourseController controller) { String query = "{ " + " courses { " + " id" + @@ -106,7 +103,7 @@ public class BatchMappingInvocationTests extends BatchMappingTestSupport { " }" + "}"; - Mono resultMono = graphQlService(controllerClass) + Mono resultMono = createGraphQlService(controller) .execute(new RequestInput(query, null, null, null)); List actualCourses = GraphQlResponse.from(resultMono).toList("courses", Course.class); @@ -129,15 +126,6 @@ public class BatchMappingInvocationTests extends BatchMappingTestSupport { } } - private ExecutionGraphQlService graphQlService(Class... configClasses) { - AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(); - applicationContext.register(configClasses); - applicationContext.register(BatchMappingTestSupport.CourseConfig.class); - applicationContext.refresh(); - - return applicationContext.getBean(ExecutionGraphQlService.class); - } - @Controller private static class BatchMonoMapController extends CourseController { diff --git a/spring-graphql/src/test/java/org/springframework/graphql/data/method/annotation/support/BatchMappingPrincipalMethodArgumentResolverTests.java b/spring-graphql/src/test/java/org/springframework/graphql/data/method/annotation/support/BatchMappingPrincipalMethodArgumentResolverTests.java index ebcd5620..08fded42 100644 --- a/spring-graphql/src/test/java/org/springframework/graphql/data/method/annotation/support/BatchMappingPrincipalMethodArgumentResolverTests.java +++ b/spring-graphql/src/test/java/org/springframework/graphql/data/method/annotation/support/BatchMappingPrincipalMethodArgumentResolverTests.java @@ -17,7 +17,6 @@ package org.springframework.graphql.data.method.annotation.support; import java.security.Principal; import java.time.Duration; -import java.util.Collection; import java.util.List; import java.util.Map; import java.util.function.Function; @@ -32,12 +31,9 @@ import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; import reactor.util.context.Context; -import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.graphql.GraphQlResponse; import org.springframework.graphql.RequestInput; import org.springframework.graphql.data.method.annotation.BatchMapping; -import org.springframework.graphql.data.method.annotation.QueryMapping; -import org.springframework.graphql.execution.ExecutionGraphQlService; import org.springframework.graphql.execution.ReactorContextManager; import org.springframework.graphql.security.SecurityContextThreadLocalAccessor; import org.springframework.lang.Nullable; @@ -79,13 +75,13 @@ public class BatchMappingPrincipalMethodArgumentResolverTests extends BatchMappi @ParameterizedTest @MethodSource("controllers") - void resolveFromReactiveContext(CourseController courseController) { + void resolveFromReactiveContext(PrincipalCourseController courseController) { testBatchLoading(courseController, this.reactiveContextWriter); } @ParameterizedTest @MethodSource("controllers") - void resolveFromThreadLocalContext(CourseController courseController) { + void resolveFromThreadLocalContext(PrincipalCourseController courseController) { SecurityContextHolder.setContext(new SecurityContextImpl(authentication)); try { testBatchLoading(courseController, this.threadLocalContextWriter); @@ -95,18 +91,11 @@ public class BatchMappingPrincipalMethodArgumentResolverTests extends BatchMappi } } - private void testBatchLoading(CourseController controller, Function contextWriter) { - AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(); - context.getBeanFactory().registerSingleton("courseController", controller); - context.register(BatchMappingTestSupport.CourseConfig.class); - context.refresh(); - - ExecutionGraphQlService graphQlService = context.getBean(ExecutionGraphQlService.class); - + private void testBatchLoading(PrincipalCourseController controller, Function contextWriter) { Mono resultMono = Mono.delay(Duration.ofMillis(10)) .flatMap(aLong -> { String query = "{ courses { id instructor { id } } }"; - return graphQlService.execute(new RequestInput(query, null, null, null)); + return createGraphQlService(controller).execute(new RequestInput(query, null, null, null)); }) .contextWrite(contextWriter); @@ -122,7 +111,7 @@ public class BatchMappingPrincipalMethodArgumentResolverTests extends BatchMappi @SuppressWarnings("unused") - private static class CourseController { + private static class PrincipalCourseController extends CourseController { @Nullable protected Principal principal; @@ -136,16 +125,12 @@ public class BatchMappingPrincipalMethodArgumentResolverTests extends BatchMappi this.principal = principal; } - @QueryMapping - public Collection courses() { - return BatchMappingTestSupport.courseMap.values(); - } } @Controller @SuppressWarnings("unused") - private static class BatchMonoMapController extends CourseController { + private static class BatchMonoMapController extends PrincipalCourseController { @BatchMapping public Mono> instructor(List courses, Principal principal) { @@ -158,7 +143,7 @@ public class BatchMappingPrincipalMethodArgumentResolverTests extends BatchMappi @Controller @SuppressWarnings("unused") - private static class BatchMapController extends CourseController { + private static class BatchMapController extends PrincipalCourseController { @BatchMapping public Map instructor(List courses, Principal principal) { @@ -170,7 +155,7 @@ public class BatchMappingPrincipalMethodArgumentResolverTests extends BatchMappi @Controller @SuppressWarnings("unused") - private static class BatchFluxController extends CourseController { + private static class BatchFluxController extends PrincipalCourseController { @BatchMapping public Flux instructor(List courses, Principal principal) { @@ -182,7 +167,7 @@ public class BatchMappingPrincipalMethodArgumentResolverTests extends BatchMappi @Controller @SuppressWarnings("unused") - private static class BatchListController extends CourseController { + private static class BatchListController extends PrincipalCourseController { @BatchMapping public List instructor(List courses, Principal principal) { diff --git a/spring-graphql/src/test/java/org/springframework/graphql/data/method/annotation/support/BatchMappingTestSupport.java b/spring-graphql/src/test/java/org/springframework/graphql/data/method/annotation/support/BatchMappingTestSupport.java index cb357398..398cf95c 100644 --- a/spring-graphql/src/test/java/org/springframework/graphql/data/method/annotation/support/BatchMappingTestSupport.java +++ b/spring-graphql/src/test/java/org/springframework/graphql/data/method/annotation/support/BatchMappingTestSupport.java @@ -27,7 +27,7 @@ import java.util.stream.Collectors; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; -import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.graphql.GraphQlService; import org.springframework.graphql.GraphQlSetup; import org.springframework.graphql.data.method.annotation.QueryMapping; @@ -79,6 +79,20 @@ public class BatchMappingTestSupport { "}"; + protected GraphQlService createGraphQlService(CourseController controller) { + BatchLoaderRegistry registry = new DefaultBatchLoaderRegistry(); + + AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(); + context.registerBean(CourseController.class, () -> controller); + context.registerBean(BatchLoaderRegistry.class, () -> registry); + context.refresh(); + + return GraphQlSetup.schemaContent(schema) + .runtimeWiringForAnnotatedControllers(context) + .dataLoaders(registry) + .toGraphQlService(); + } + static class Course { @@ -206,26 +220,4 @@ public class BatchMappingTestSupport { } } - - static class CourseConfig { - - @Bean - public GraphQlService graphQlService(AnnotatedControllerConfigurer configurer, BatchLoaderRegistry registry) { - return GraphQlSetup.schemaContent(schema) - .runtimeWiring(configurer) - .dataLoaders(registry) - .toGraphQlService(); - } - - @Bean - public AnnotatedControllerConfigurer annotatedDataFetcherConfigurer() { - return new AnnotatedControllerConfigurer(); - } - - @Bean - public BatchLoaderRegistry batchLoaderRegistry() { - return new DefaultBatchLoaderRegistry(); - } - } - } diff --git a/spring-graphql/src/test/java/org/springframework/graphql/data/method/annotation/support/SchemaMappingInvocationTests.java b/spring-graphql/src/test/java/org/springframework/graphql/data/method/annotation/support/SchemaMappingInvocationTests.java index 128e879c..4b85762f 100644 --- a/spring-graphql/src/test/java/org/springframework/graphql/data/method/annotation/support/SchemaMappingInvocationTests.java +++ b/spring-graphql/src/test/java/org/springframework/graphql/data/method/annotation/support/SchemaMappingInvocationTests.java @@ -29,8 +29,6 @@ import reactor.core.publisher.Mono; import reactor.test.StepVerifier; import org.springframework.context.annotation.AnnotationConfigApplicationContext; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; import org.springframework.graphql.Author; import org.springframework.graphql.Book; import org.springframework.graphql.BookCriteria; @@ -46,7 +44,6 @@ import org.springframework.graphql.data.method.annotation.SchemaMapping; import org.springframework.graphql.data.method.annotation.SubscriptionMapping; import org.springframework.graphql.execution.BatchLoaderRegistry; import org.springframework.graphql.execution.DefaultBatchLoaderRegistry; -import org.springframework.graphql.execution.ExecutionGraphQlService; import org.springframework.stereotype.Controller; import static org.assertj.core.api.Assertions.assertThat; @@ -173,41 +170,18 @@ public class SchemaMappingInvocationTests { } - private ExecutionGraphQlService graphQlService() { - AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(); - applicationContext.register(TestConfig.class); - applicationContext.refresh(); + private GraphQlService graphQlService() { + BatchLoaderRegistry registry = new DefaultBatchLoaderRegistry(); - return applicationContext.getBean(ExecutionGraphQlService.class); - } - - - @Configuration - static class TestConfig { - - @Bean - public BookController bookController() { - return new BookController(batchLoaderRegistry()); - } - - @Bean - public GraphQlService graphQlService(AnnotatedControllerConfigurer configurer, BatchLoaderRegistry registry) { - return GraphQlSetup.schemaResource(BookSource.schema) - .runtimeWiring(configurer) - .dataLoaders(registry) - .toGraphQlService(); - } - - @Bean - public AnnotatedControllerConfigurer annotatedControllerConfigurer() { - return new AnnotatedControllerConfigurer(); - } - - @Bean - public BatchLoaderRegistry batchLoaderRegistry() { - return new DefaultBatchLoaderRegistry(); - } + AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(); + context.register(BookController.class); + context.registerBean(BatchLoaderRegistry.class, () -> registry); + context.refresh(); + return GraphQlSetup.schemaResource(BookSource.schema) + .runtimeWiringForAnnotatedControllers(context) + .dataLoaders(registry) + .toGraphQlService(); } diff --git a/spring-graphql/src/test/java/org/springframework/graphql/data/method/annotation/support/SchemaMappingPrincipalMethodArgumentResolverTests.java b/spring-graphql/src/test/java/org/springframework/graphql/data/method/annotation/support/SchemaMappingPrincipalMethodArgumentResolverTests.java index 4b9c691d..9ab5d562 100644 --- a/spring-graphql/src/test/java/org/springframework/graphql/data/method/annotation/support/SchemaMappingPrincipalMethodArgumentResolverTests.java +++ b/spring-graphql/src/test/java/org/springframework/graphql/data/method/annotation/support/SchemaMappingPrincipalMethodArgumentResolverTests.java @@ -30,6 +30,7 @@ import reactor.core.publisher.Mono; import reactor.test.StepVerifier; import reactor.util.context.Context; +import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.support.StaticApplicationContext; import org.springframework.core.MethodParameter; import org.springframework.graphql.GraphQlResponse; @@ -153,16 +154,13 @@ public class SchemaMappingPrincipalMethodArgumentResolverTests { private Mono executeAsync( String schema, String op, Function contextWriter) { - StaticApplicationContext context = new StaticApplicationContext(); - context.getBeanFactory().registerSingleton("greetingController", greetingController); + AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(); + context.registerBean(GreetingController.class, () -> greetingController); context.refresh(); - AnnotatedControllerConfigurer configurer = new AnnotatedControllerConfigurer(); - configurer.setApplicationContext(context); - configurer.afterPropertiesSet(); - - ExecutionGraphQlService graphQlService = - GraphQlSetup.schemaContent(schema).runtimeWiring(configurer).toGraphQlService(); + ExecutionGraphQlService graphQlService = GraphQlSetup.schemaContent(schema) + .runtimeWiringForAnnotatedControllers(context) + .toGraphQlService(); return Mono.delay(Duration.ofMillis(10)) .flatMap(aLong -> graphQlService.execute(new RequestInput(op, null, null, null)))