3232import static org .assertj .core .api .Assertions .assertThat ;
3333import 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 */
4042class 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