32
32
import static org .assertj .core .api .Assertions .assertThat ;
33
33
import static org .assertj .core .api .Assertions .assertThatThrownBy ;
34
34
35
+
35
36
/**
36
37
* Tests for {@link GraphQlArgumentInitializer}
37
38
*
38
39
* @author Brian Clozel
40
+ * @author Rossen Stoyanchev
39
41
*/
40
42
class GraphQlArgumentInitializerTests {
41
43
42
44
private final ObjectMapper mapper = new ObjectMapper ();
43
45
44
- private final GraphQlArgumentInitializer initializer = new GraphQlArgumentInitializer (null );
46
+ private final ThreadLocal < GraphQlArgumentInitializer > initializer = ThreadLocal . withInitial (() -> new GraphQlArgumentInitializer (null ) );
45
47
46
48
47
49
@ 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 ));
53
55
54
56
assertThat (result ).isNotNull ().isInstanceOf (SimpleBean .class );
55
57
assertThat (result ).hasFieldOrPropertyWithValue ("name" , "test" );
56
58
}
57
59
58
60
@ 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 {
64
62
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 ));
87
66
88
67
assertThat (result ).isNotNull ().isInstanceOf (Book .class );
89
68
assertThat (result ).hasFieldOrPropertyWithValue ("name" , "test name" );
@@ -93,52 +72,77 @@ void shouldInstantiateNestedBean() throws Exception {
93
72
}
94
73
95
74
@ 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 ));
101
80
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" );
104
84
}
105
85
106
86
@ 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 ));
111
92
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 );
114
95
}
115
96
116
97
@ 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" );
126
118
}
127
119
128
120
@ 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 ));
134
126
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" );
138
142
}
139
143
140
144
@ SuppressWarnings ("unchecked" )
141
- private DataFetchingEnvironment initEnvironment (String jsonPayload ) throws JsonProcessingException {
145
+ private DataFetchingEnvironment environment (String jsonPayload ) throws JsonProcessingException {
142
146
Map <String , Object > arguments = this .mapper .readValue (jsonPayload , Map .class );
143
147
return DataFetchingEnvironmentImpl .newDataFetchingEnvironment ().arguments (arguments ).build ();
144
148
}
@@ -158,11 +162,11 @@ public void setName(String name) {
158
162
}
159
163
160
164
161
- static class ContructorBean {
165
+ static class PrimaryConstructorBean {
162
166
163
167
final String name ;
164
168
165
- public ContructorBean (String name ) {
169
+ public PrimaryConstructorBean (String name ) {
166
170
this .name = name ;
167
171
}
168
172
@@ -172,34 +176,41 @@ public String getName() {
172
176
}
173
177
174
178
175
- static class NoPrimaryConstructor {
179
+ static class NoPrimaryConstructorBean {
176
180
177
- NoPrimaryConstructor (String name ) {
181
+ NoPrimaryConstructorBean (String name ) {
178
182
}
179
183
180
- NoPrimaryConstructor (String name , Long id ) {
184
+ NoPrimaryConstructorBean (String name , Long id ) {
181
185
}
182
186
}
183
187
184
188
185
- static class NestedList {
189
+ static class PrimaryConstructorItemBean {
190
+ final String name ;
186
191
187
- List < Item > items ;
192
+ final Item item ;
188
193
189
- public List <Item > getItems () {
190
- return this .items ;
194
+ public PrimaryConstructorItemBean (String name , Item item ) {
195
+ this .name = name ;
196
+ this .item = item ;
191
197
}
192
198
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 ;
195
205
}
196
206
}
197
207
198
- static class PrimaryConstructorNestedList {
208
+
209
+ static class PrimaryConstructorItemListBean {
199
210
200
211
final List <Item > items ;
201
212
202
- public PrimaryConstructorNestedList (List <Item > items ) {
213
+ public PrimaryConstructorItemListBean (List <Item > items ) {
203
214
this .items = items ;
204
215
}
205
216
@@ -209,37 +220,31 @@ public List<Item> getItems() {
209
220
}
210
221
211
222
212
- static class Item {
223
+ static class ItemListHolder {
213
224
214
- String name ;
225
+ List < Item > items ;
215
226
216
- public String getName () {
217
- return this .name ;
227
+ public List < Item > getItems () {
228
+ return this .items ;
218
229
}
219
230
220
- public void setName ( String name ) {
221
- this .name = name ;
231
+ public void setItems ( List < Item > items ) {
232
+ this .items = items ;
222
233
}
223
234
}
224
235
225
236
226
- static class PrimaryConstructorComplexInput {
227
- final String name ;
228
-
229
- final Item item ;
237
+ static class Item {
230
238
231
- public PrimaryConstructorComplexInput (String name , Item item ) {
232
- this .name = name ;
233
- this .item = item ;
234
- }
239
+ String name ;
235
240
236
241
public String getName () {
237
242
return this .name ;
238
243
}
239
244
240
- public Item getItem ( ) {
241
- return item ;
245
+ public void setName ( String name ) {
246
+ this . name = name ;
242
247
}
243
248
}
244
-
249
+
245
250
}
0 commit comments