Skip to content

Commit 1f53a55

Browse files
committed
Polishing
1 parent 9bc4c40 commit 1f53a55

File tree

1 file changed

+99
-94
lines changed

1 file changed

+99
-94
lines changed

spring-graphql/src/test/java/org/springframework/graphql/data/method/annotation/support/GraphQlArgumentInitializerTests.java

Lines changed: 99 additions & 94 deletions
Original file line numberDiff line numberDiff line change
@@ -32,58 +32,37 @@
3232
import static org.assertj.core.api.Assertions.assertThat;
3333
import static org.assertj.core.api.Assertions.assertThatThrownBy;
3434

35+
3536
/**
3637
* Tests for {@link GraphQlArgumentInitializer}
3738
*
3839
* @author Brian Clozel
40+
* @author Rossen Stoyanchev
3941
*/
4042
class GraphQlArgumentInitializerTests {
4143

4244
private final ObjectMapper mapper = new ObjectMapper();
4345

44-
private final GraphQlArgumentInitializer initializer = new GraphQlArgumentInitializer(null);
46+
private final ThreadLocal<GraphQlArgumentInitializer> initializer = ThreadLocal.withInitial(() -> new GraphQlArgumentInitializer(null));
4547

4648

4749
@Test
48-
void shouldInstantiateDefaultConstructor() throws Exception {
49-
String payload = "{\"simpleBean\": { \"name\": \"test\"} }";
50-
DataFetchingEnvironment environment = initEnvironment(payload);
51-
Object result = initializer.initializeArgument(
52-
environment, "simpleBean", ResolvableType.forClass(SimpleBean.class));
50+
void defaultConstructor() throws Exception {
51+
52+
Object result = initializer.get().initializeArgument(
53+
environment("{\"key\": { \"name\": \"test\"} }"), "key",
54+
ResolvableType.forClass(SimpleBean.class));
5355

5456
assertThat(result).isNotNull().isInstanceOf(SimpleBean.class);
5557
assertThat(result).hasFieldOrPropertyWithValue("name", "test");
5658
}
5759

5860
@Test
59-
void shouldInstantiatePrimaryConstructor() throws Exception {
60-
String payload = "{\"constructorBean\": { \"name\": \"test\"} }";
61-
DataFetchingEnvironment environment = initEnvironment(payload);
62-
Object result = initializer.initializeArgument(
63-
environment, "constructorBean", ResolvableType.forClass(ContructorBean.class));
61+
void defaultConstructorWithNestedBeanProperty() throws Exception {
6462

65-
assertThat(result).isNotNull().isInstanceOf(ContructorBean.class);
66-
assertThat(result).hasFieldOrPropertyWithValue("name", "test");
67-
}
68-
69-
@Test
70-
void shouldFailIfNoPrimaryConstructor() throws Exception {
71-
String payload = "{\"noPrimary\": { \"name\": \"test\"} }";
72-
DataFetchingEnvironment environment = initEnvironment(payload);
73-
assertThatThrownBy(
74-
() -> {
75-
ResolvableType targetType = ResolvableType.forClass(NoPrimaryConstructor.class);
76-
initializer.initializeArgument(environment, "noPrimary", targetType);
77-
})
78-
.isInstanceOf(IllegalStateException.class)
79-
.hasMessageContaining("No primary or single unique constructor found");
80-
}
81-
82-
@Test
83-
void shouldInstantiateNestedBean() throws Exception {
84-
String payload = "{\"book\": { \"name\": \"test name\", \"author\": { \"firstName\": \"Jane\", \"lastName\": \"Spring\"} } }";
85-
DataFetchingEnvironment environment = initEnvironment(payload);
86-
Object result = initializer.initializeArgument(environment, "book", ResolvableType.forClass(Book.class));
63+
Object result = initializer.get().initializeArgument(
64+
environment("{\"key\":{\"name\":\"test name\",\"author\":{\"firstName\":\"Jane\",\"lastName\":\"Spring\"}}}"), "key",
65+
ResolvableType.forClass(Book.class));
8766

8867
assertThat(result).isNotNull().isInstanceOf(Book.class);
8968
assertThat(result).hasFieldOrPropertyWithValue("name", "test name");
@@ -93,52 +72,77 @@ void shouldInstantiateNestedBean() throws Exception {
9372
}
9473

9574
@Test
96-
void shouldInstantiateNestedBeanLists() throws Exception {
97-
String payload = "{\"nestedList\": { \"items\": [ {\"name\": \"first\"}, {\"name\": \"second\"}] } }";
98-
DataFetchingEnvironment environment = initEnvironment(payload);
99-
Object result = initializer.initializeArgument(
100-
environment, "nestedList", ResolvableType.forClass(NestedList.class));
75+
void defaultConstructorWithNestedBeanListProperty() throws Exception {
76+
77+
Object result = initializer.get().initializeArgument(
78+
environment("{\"key\":{\"items\":[{\"name\":\"first\"},{\"name\":\"second\"}]}}"), "key",
79+
ResolvableType.forClass(ItemListHolder.class));
10180

102-
assertThat(result).isNotNull().isInstanceOf(NestedList.class);
103-
assertThat(((NestedList) result).getItems()).hasSize(2).extracting("name").containsExactly("first", "second");
81+
assertThat(result).isNotNull().isInstanceOf(ItemListHolder.class);
82+
assertThat(((ItemListHolder) result).getItems())
83+
.hasSize(2).extracting("name").containsExactly("first", "second");
10484
}
10585

10686
@Test // gh-301
107-
void shouldInstantiateNestedBeanListsEmpty() throws Exception {
108-
String payload = "{\"nestedList\": { \"items\": [] } }";
109-
Object result = initializer.initializeArgument(
110-
initEnvironment(payload), "nestedList", ResolvableType.forClass(NestedList.class));
87+
void defaultConstructorWithNestedBeanListEmpty() throws Exception {
88+
89+
Object result = initializer.get().initializeArgument(
90+
environment("{\"key\": { \"items\": [] } }"), "key",
91+
ResolvableType.forClass(ItemListHolder.class));
11192

112-
assertThat(result).isNotNull().isInstanceOf(NestedList.class);
113-
assertThat(((NestedList) result).getItems()).hasSize(0);
93+
assertThat(result).isNotNull().isInstanceOf(ItemListHolder.class);
94+
assertThat(((ItemListHolder) result).getItems()).hasSize(0);
11495
}
11596

11697
@Test
117-
void shouldInstantiatePrimaryConstructorNestedBeanLists() throws Exception {
118-
String payload = "{\"nestedList\": { \"items\": [ {\"name\": \"first\"}, {\"name\": \"second\"}] } }";
119-
DataFetchingEnvironment environment = initEnvironment(payload);
120-
Object result = initializer.initializeArgument(
121-
environment, "nestedList", ResolvableType.forClass(PrimaryConstructorNestedList.class));
122-
123-
assertThat(result).isNotNull().isInstanceOf(PrimaryConstructorNestedList.class);
124-
assertThat(((PrimaryConstructorNestedList) result).getItems())
125-
.hasSize(2).extracting("name").containsExactly("first", "second");
98+
void primaryConstructor() throws Exception {
99+
100+
Object result = initializer.get().initializeArgument(
101+
environment("{\"key\":{\"name\":\"test\"}}"), "key",
102+
ResolvableType.forClass(PrimaryConstructorBean.class));
103+
104+
assertThat(result).isNotNull().isInstanceOf(PrimaryConstructorBean.class);
105+
assertThat(result).hasFieldOrPropertyWithValue("name", "test");
106+
}
107+
108+
@Test
109+
void primaryConstructorWithBeanArgument() throws Exception {
110+
111+
Object result = initializer.get().initializeArgument(
112+
environment("{\"key\":{\"item\":{\"name\":\"Item name\"},\"name\":\"Hello\"}}"), "key",
113+
ResolvableType.forClass(PrimaryConstructorItemBean.class));
114+
115+
assertThat(result).isNotNull().isInstanceOf(PrimaryConstructorItemBean.class);
116+
assertThat(((PrimaryConstructorItemBean) result).item.name).isEqualTo("Item name");
117+
assertThat(((PrimaryConstructorItemBean) result).name).isEqualTo("Hello");
126118
}
127119

128120
@Test
129-
void shouldInstantiateComplexNestedBean() throws Exception {
130-
String payload = "{\"complex\": { \"item\": {\"name\": \"Item name\"}, \"name\": \"Hello\" } }";
131-
DataFetchingEnvironment environment = initEnvironment(payload);
132-
Object result = initializer.initializeArgument(
133-
environment, "complex", ResolvableType.forClass(PrimaryConstructorComplexInput.class));
121+
void primaryConstructorWithNestedBeanList() throws Exception {
122+
123+
Object result = initializer.get().initializeArgument(
124+
environment("{\"key\":{\"items\":[{\"name\":\"first\"},{\"name\":\"second\"}]}}"), "key",
125+
ResolvableType.forClass(PrimaryConstructorItemListBean.class));
134126

135-
assertThat(result).isNotNull().isInstanceOf(PrimaryConstructorComplexInput.class);
136-
assertThat(((PrimaryConstructorComplexInput) result).item.name).isEqualTo("Item name");
137-
assertThat(((PrimaryConstructorComplexInput) result).name).isEqualTo("Hello");
127+
assertThat(result).isNotNull().isInstanceOf(PrimaryConstructorItemListBean.class);
128+
assertThat(((PrimaryConstructorItemListBean) result).getItems())
129+
.hasSize(2).extracting("name").containsExactly("first", "second");
130+
}
131+
132+
@Test
133+
void primaryConstructorNotFound() {
134+
assertThatThrownBy(
135+
() -> {
136+
initializer.get().initializeArgument(
137+
environment("{\"key\": { \"name\": \"test\"} }"), "key",
138+
ResolvableType.forClass(NoPrimaryConstructorBean.class));
139+
})
140+
.isInstanceOf(IllegalStateException.class)
141+
.hasMessageContaining("No primary or single unique constructor found");
138142
}
139143

140144
@SuppressWarnings("unchecked")
141-
private DataFetchingEnvironment initEnvironment(String jsonPayload) throws JsonProcessingException {
145+
private DataFetchingEnvironment environment(String jsonPayload) throws JsonProcessingException {
142146
Map<String, Object> arguments = this.mapper.readValue(jsonPayload, Map.class);
143147
return DataFetchingEnvironmentImpl.newDataFetchingEnvironment().arguments(arguments).build();
144148
}
@@ -158,11 +162,11 @@ public void setName(String name) {
158162
}
159163

160164

161-
static class ContructorBean {
165+
static class PrimaryConstructorBean {
162166

163167
final String name;
164168

165-
public ContructorBean(String name) {
169+
public PrimaryConstructorBean(String name) {
166170
this.name = name;
167171
}
168172

@@ -172,34 +176,41 @@ public String getName() {
172176
}
173177

174178

175-
static class NoPrimaryConstructor {
179+
static class NoPrimaryConstructorBean {
176180

177-
NoPrimaryConstructor(String name) {
181+
NoPrimaryConstructorBean(String name) {
178182
}
179183

180-
NoPrimaryConstructor(String name, Long id) {
184+
NoPrimaryConstructorBean(String name, Long id) {
181185
}
182186
}
183187

184188

185-
static class NestedList {
189+
static class PrimaryConstructorItemBean {
190+
final String name;
186191

187-
List<Item> items;
192+
final Item item;
188193

189-
public List<Item> getItems() {
190-
return this.items;
194+
public PrimaryConstructorItemBean(String name, Item item) {
195+
this.name = name;
196+
this.item = item;
191197
}
192198

193-
public void setItems(List<Item> items) {
194-
this.items = items;
199+
public String getName() {
200+
return this.name;
201+
}
202+
203+
public Item getItem() {
204+
return item;
195205
}
196206
}
197207

198-
static class PrimaryConstructorNestedList {
208+
209+
static class PrimaryConstructorItemListBean {
199210

200211
final List<Item> items;
201212

202-
public PrimaryConstructorNestedList(List<Item> items) {
213+
public PrimaryConstructorItemListBean(List<Item> items) {
203214
this.items = items;
204215
}
205216

@@ -209,37 +220,31 @@ public List<Item> getItems() {
209220
}
210221

211222

212-
static class Item {
223+
static class ItemListHolder {
213224

214-
String name;
225+
List<Item> items;
215226

216-
public String getName() {
217-
return this.name;
227+
public List<Item> getItems() {
228+
return this.items;
218229
}
219230

220-
public void setName(String name) {
221-
this.name = name;
231+
public void setItems(List<Item> items) {
232+
this.items = items;
222233
}
223234
}
224235

225236

226-
static class PrimaryConstructorComplexInput {
227-
final String name;
228-
229-
final Item item;
237+
static class Item {
230238

231-
public PrimaryConstructorComplexInput(String name, Item item) {
232-
this.name = name;
233-
this.item = item;
234-
}
239+
String name;
235240

236241
public String getName() {
237242
return this.name;
238243
}
239244

240-
public Item getItem() {
241-
return item;
245+
public void setName(String name) {
246+
this.name = name;
242247
}
243248
}
244-
249+
245250
}

0 commit comments

Comments
 (0)