From 1f53a555da45503830d80d86e35bf6eddd9a609e Mon Sep 17 00:00:00 2001 From: rstoyanchev Date: Mon, 21 Mar 2022 17:37:25 +0000 Subject: [PATCH] Polishing --- .../GraphQlArgumentInitializerTests.java | 209 +++++++++--------- 1 file changed, 107 insertions(+), 102 deletions(-) diff --git a/spring-graphql/src/test/java/org/springframework/graphql/data/method/annotation/support/GraphQlArgumentInitializerTests.java b/spring-graphql/src/test/java/org/springframework/graphql/data/method/annotation/support/GraphQlArgumentInitializerTests.java index 3792a3af..6eb7acfe 100644 --- a/spring-graphql/src/test/java/org/springframework/graphql/data/method/annotation/support/GraphQlArgumentInitializerTests.java +++ b/spring-graphql/src/test/java/org/springframework/graphql/data/method/annotation/support/GraphQlArgumentInitializerTests.java @@ -32,58 +32,37 @@ import org.springframework.graphql.data.GraphQlArgumentInitializer; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; + /** * Tests for {@link GraphQlArgumentInitializer} * * @author Brian Clozel + * @author Rossen Stoyanchev */ class GraphQlArgumentInitializerTests { private final ObjectMapper mapper = new ObjectMapper(); - private final GraphQlArgumentInitializer initializer = new GraphQlArgumentInitializer(null); + private final ThreadLocal initializer = ThreadLocal.withInitial(() -> new GraphQlArgumentInitializer(null)); @Test - void shouldInstantiateDefaultConstructor() throws Exception { - String payload = "{\"simpleBean\": { \"name\": \"test\"} }"; - DataFetchingEnvironment environment = initEnvironment(payload); - Object result = initializer.initializeArgument( - environment, "simpleBean", ResolvableType.forClass(SimpleBean.class)); + void defaultConstructor() throws Exception { + + Object result = initializer.get().initializeArgument( + environment("{\"key\": { \"name\": \"test\"} }"), "key", + ResolvableType.forClass(SimpleBean.class)); assertThat(result).isNotNull().isInstanceOf(SimpleBean.class); assertThat(result).hasFieldOrPropertyWithValue("name", "test"); } @Test - void shouldInstantiatePrimaryConstructor() throws Exception { - String payload = "{\"constructorBean\": { \"name\": \"test\"} }"; - DataFetchingEnvironment environment = initEnvironment(payload); - Object result = initializer.initializeArgument( - environment, "constructorBean", ResolvableType.forClass(ContructorBean.class)); + void defaultConstructorWithNestedBeanProperty() throws Exception { - assertThat(result).isNotNull().isInstanceOf(ContructorBean.class); - assertThat(result).hasFieldOrPropertyWithValue("name", "test"); - } - - @Test - void shouldFailIfNoPrimaryConstructor() throws Exception { - String payload = "{\"noPrimary\": { \"name\": \"test\"} }"; - DataFetchingEnvironment environment = initEnvironment(payload); - assertThatThrownBy( - () -> { - ResolvableType targetType = ResolvableType.forClass(NoPrimaryConstructor.class); - initializer.initializeArgument(environment, "noPrimary", targetType); - }) - .isInstanceOf(IllegalStateException.class) - .hasMessageContaining("No primary or single unique constructor found"); - } - - @Test - void shouldInstantiateNestedBean() throws Exception { - String payload = "{\"book\": { \"name\": \"test name\", \"author\": { \"firstName\": \"Jane\", \"lastName\": \"Spring\"} } }"; - DataFetchingEnvironment environment = initEnvironment(payload); - Object result = initializer.initializeArgument(environment, "book", ResolvableType.forClass(Book.class)); + Object result = initializer.get().initializeArgument( + environment("{\"key\":{\"name\":\"test name\",\"author\":{\"firstName\":\"Jane\",\"lastName\":\"Spring\"}}}"), "key", + ResolvableType.forClass(Book.class)); assertThat(result).isNotNull().isInstanceOf(Book.class); assertThat(result).hasFieldOrPropertyWithValue("name", "test name"); @@ -93,52 +72,77 @@ class GraphQlArgumentInitializerTests { } @Test - void shouldInstantiateNestedBeanLists() throws Exception { - String payload = "{\"nestedList\": { \"items\": [ {\"name\": \"first\"}, {\"name\": \"second\"}] } }"; - DataFetchingEnvironment environment = initEnvironment(payload); - Object result = initializer.initializeArgument( - environment, "nestedList", ResolvableType.forClass(NestedList.class)); + void defaultConstructorWithNestedBeanListProperty() throws Exception { - assertThat(result).isNotNull().isInstanceOf(NestedList.class); - assertThat(((NestedList) result).getItems()).hasSize(2).extracting("name").containsExactly("first", "second"); + Object result = initializer.get().initializeArgument( + environment("{\"key\":{\"items\":[{\"name\":\"first\"},{\"name\":\"second\"}]}}"), "key", + ResolvableType.forClass(ItemListHolder.class)); + + assertThat(result).isNotNull().isInstanceOf(ItemListHolder.class); + assertThat(((ItemListHolder) result).getItems()) + .hasSize(2).extracting("name").containsExactly("first", "second"); } @Test // gh-301 - void shouldInstantiateNestedBeanListsEmpty() throws Exception { - String payload = "{\"nestedList\": { \"items\": [] } }"; - Object result = initializer.initializeArgument( - initEnvironment(payload), "nestedList", ResolvableType.forClass(NestedList.class)); + void defaultConstructorWithNestedBeanListEmpty() throws Exception { - assertThat(result).isNotNull().isInstanceOf(NestedList.class); - assertThat(((NestedList) result).getItems()).hasSize(0); + Object result = initializer.get().initializeArgument( + environment("{\"key\": { \"items\": [] } }"), "key", + ResolvableType.forClass(ItemListHolder.class)); + + assertThat(result).isNotNull().isInstanceOf(ItemListHolder.class); + assertThat(((ItemListHolder) result).getItems()).hasSize(0); } @Test - void shouldInstantiatePrimaryConstructorNestedBeanLists() throws Exception { - String payload = "{\"nestedList\": { \"items\": [ {\"name\": \"first\"}, {\"name\": \"second\"}] } }"; - DataFetchingEnvironment environment = initEnvironment(payload); - Object result = initializer.initializeArgument( - environment, "nestedList", ResolvableType.forClass(PrimaryConstructorNestedList.class)); + void primaryConstructor() throws Exception { - assertThat(result).isNotNull().isInstanceOf(PrimaryConstructorNestedList.class); - assertThat(((PrimaryConstructorNestedList) result).getItems()) + Object result = initializer.get().initializeArgument( + environment("{\"key\":{\"name\":\"test\"}}"), "key", + ResolvableType.forClass(PrimaryConstructorBean.class)); + + assertThat(result).isNotNull().isInstanceOf(PrimaryConstructorBean.class); + assertThat(result).hasFieldOrPropertyWithValue("name", "test"); + } + + @Test + void primaryConstructorWithBeanArgument() throws Exception { + + Object result = initializer.get().initializeArgument( + environment("{\"key\":{\"item\":{\"name\":\"Item name\"},\"name\":\"Hello\"}}"), "key", + ResolvableType.forClass(PrimaryConstructorItemBean.class)); + + assertThat(result).isNotNull().isInstanceOf(PrimaryConstructorItemBean.class); + assertThat(((PrimaryConstructorItemBean) result).item.name).isEqualTo("Item name"); + assertThat(((PrimaryConstructorItemBean) result).name).isEqualTo("Hello"); + } + + @Test + void primaryConstructorWithNestedBeanList() throws Exception { + + Object result = initializer.get().initializeArgument( + environment("{\"key\":{\"items\":[{\"name\":\"first\"},{\"name\":\"second\"}]}}"), "key", + ResolvableType.forClass(PrimaryConstructorItemListBean.class)); + + assertThat(result).isNotNull().isInstanceOf(PrimaryConstructorItemListBean.class); + assertThat(((PrimaryConstructorItemListBean) result).getItems()) .hasSize(2).extracting("name").containsExactly("first", "second"); } @Test - void shouldInstantiateComplexNestedBean() throws Exception { - String payload = "{\"complex\": { \"item\": {\"name\": \"Item name\"}, \"name\": \"Hello\" } }"; - DataFetchingEnvironment environment = initEnvironment(payload); - Object result = initializer.initializeArgument( - environment, "complex", ResolvableType.forClass(PrimaryConstructorComplexInput.class)); - - assertThat(result).isNotNull().isInstanceOf(PrimaryConstructorComplexInput.class); - assertThat(((PrimaryConstructorComplexInput) result).item.name).isEqualTo("Item name"); - assertThat(((PrimaryConstructorComplexInput) result).name).isEqualTo("Hello"); + void primaryConstructorNotFound() { + assertThatThrownBy( + () -> { + initializer.get().initializeArgument( + environment("{\"key\": { \"name\": \"test\"} }"), "key", + ResolvableType.forClass(NoPrimaryConstructorBean.class)); + }) + .isInstanceOf(IllegalStateException.class) + .hasMessageContaining("No primary or single unique constructor found"); } @SuppressWarnings("unchecked") - private DataFetchingEnvironment initEnvironment(String jsonPayload) throws JsonProcessingException { + private DataFetchingEnvironment environment(String jsonPayload) throws JsonProcessingException { Map arguments = this.mapper.readValue(jsonPayload, Map.class); return DataFetchingEnvironmentImpl.newDataFetchingEnvironment().arguments(arguments).build(); } @@ -158,11 +162,11 @@ class GraphQlArgumentInitializerTests { } - static class ContructorBean { + static class PrimaryConstructorBean { final String name; - public ContructorBean(String name) { + public PrimaryConstructorBean(String name) { this.name = name; } @@ -172,17 +176,51 @@ class GraphQlArgumentInitializerTests { } - static class NoPrimaryConstructor { + static class NoPrimaryConstructorBean { - NoPrimaryConstructor(String name) { + NoPrimaryConstructorBean(String name) { } - NoPrimaryConstructor(String name, Long id) { + NoPrimaryConstructorBean(String name, Long id) { } } - static class NestedList { + static class PrimaryConstructorItemBean { + final String name; + + final Item item; + + public PrimaryConstructorItemBean(String name, Item item) { + this.name = name; + this.item = item; + } + + public String getName() { + return this.name; + } + + public Item getItem() { + return item; + } + } + + + static class PrimaryConstructorItemListBean { + + final List items; + + public PrimaryConstructorItemListBean(List items) { + this.items = items; + } + + public List getItems() { + return items; + } + } + + + static class ItemListHolder { List items; @@ -195,19 +233,6 @@ class GraphQlArgumentInitializerTests { } } - static class PrimaryConstructorNestedList { - - final List items; - - public PrimaryConstructorNestedList(List items) { - this.items = items; - } - - public List getItems() { - return items; - } - } - static class Item { @@ -222,24 +247,4 @@ class GraphQlArgumentInitializerTests { } } - - static class PrimaryConstructorComplexInput { - final String name; - - final Item item; - - public PrimaryConstructorComplexInput(String name, Item item) { - this.name = name; - this.item = item; - } - - public String getName() { - return this.name; - } - - public Item getItem() { - return item; - } - } - } \ No newline at end of file