22
22
23
23
import org .junit .Before ;
24
24
import org .junit .Test ;
25
-
26
25
import org .springframework .core .MethodParameter ;
27
26
import org .springframework .data .domain .Page ;
28
27
import org .springframework .data .domain .Pageable ;
38
37
import org .springframework .hateoas .EntityModel ;
39
38
import org .springframework .http .HttpEntity ;
40
39
import org .springframework .http .ResponseEntity ;
40
+ import org .springframework .lang .Nullable ;
41
41
import org .springframework .mock .web .MockHttpServletRequest ;
42
42
import org .springframework .test .util .ReflectionTestUtils ;
43
43
import org .springframework .web .context .request .ServletWebRequest ;
@@ -94,7 +94,7 @@ public void resolveArgumentShouldCreateSingleStringParameterPredicateCorrectly()
94
94
95
95
request .addParameter ("firstname" , "rand" );
96
96
97
- Predicate predicate = resolver .resolveArgument (getMethodParameterFor ("simpleFind" , Predicate .class ), null ,
97
+ Object predicate = resolver .resolveArgument (getMethodParameterFor ("simpleFind" , Predicate .class ), null ,
98
98
new ServletWebRequest (request ), null );
99
99
100
100
assertThat (predicate ).isEqualTo (QUser .user .firstname .eq ("rand" ));
@@ -106,7 +106,7 @@ public void resolveArgumentShouldCreateMultipleParametersPredicateCorrectly() th
106
106
request .addParameter ("firstname" , "rand" );
107
107
request .addParameter ("lastname" , "al'thor" );
108
108
109
- Predicate predicate = resolver .resolveArgument (getMethodParameterFor ("simpleFind" , Predicate .class ), null ,
109
+ Object predicate = resolver .resolveArgument (getMethodParameterFor ("simpleFind" , Predicate .class ), null ,
110
110
new ServletWebRequest (request ), null );
111
111
112
112
assertThat (predicate ).isEqualTo (QUser .user .firstname .eq ("rand" ).and (QUser .user .lastname .eq ("al'thor" )));
@@ -117,23 +117,23 @@ public void resolveArgumentShouldCreateNestedObjectPredicateCorrectly() throws E
117
117
118
118
request .addParameter ("address.city" , "two rivers" );
119
119
120
- Predicate predicate = resolver .resolveArgument (getMethodParameterFor ("simpleFind" , Predicate .class ), null ,
120
+ Object predicate = resolver .resolveArgument (getMethodParameterFor ("simpleFind" , Predicate .class ), null ,
121
121
new ServletWebRequest (request ), null );
122
122
123
123
BooleanExpression eq = QUser .user .address .city .eq ("two rivers" );
124
124
125
- assertThat (predicate ).isEqualTo (( Predicate ) eq );
125
+ assertThat (predicate ).isEqualTo (eq );
126
126
}
127
127
128
128
@ Test // DATACMNS-669
129
129
public void resolveArgumentShouldResolveTypePropertyFromPageCorrectly () throws Exception {
130
130
131
131
request .addParameter ("address.city" , "tar valon" );
132
132
133
- Predicate predicate = resolver .resolveArgument (getMethodParameterFor ("pagedFind" , Predicate .class , Pageable .class ),
133
+ Object predicate = resolver .resolveArgument (getMethodParameterFor ("pagedFind" , Predicate .class , Pageable .class ),
134
134
null , new ServletWebRequest (request ), null );
135
135
136
- assertThat (predicate ).isEqualTo (( Predicate ) QUser .user .address .city .eq ("tar valon" ));
136
+ assertThat (predicate ).isEqualTo (QUser .user .address .city .eq ("tar valon" ));
137
137
}
138
138
139
139
@ Test // DATACMNS-669
@@ -142,7 +142,7 @@ public void resolveArgumentShouldHonorCustomSpecification() throws Exception {
142
142
request .addParameter ("firstname" , "egwene" );
143
143
request .addParameter ("lastname" , "al'vere" );
144
144
145
- Predicate predicate = resolver .resolveArgument (getMethodParameterFor ("specificFind" , Predicate .class ), null ,
145
+ Object predicate = resolver .resolveArgument (getMethodParameterFor ("specificFind" , Predicate .class ), null ,
146
146
new ServletWebRequest (request ), null );
147
147
148
148
assertThat (predicate ).isEqualTo (
@@ -154,21 +154,21 @@ public void shouldCreatePredicateForNonStringPropertyCorrectly() throws Exceptio
154
154
155
155
request .addParameter ("inceptionYear" , "978" );
156
156
157
- Predicate predicate = resolver .resolveArgument (getMethodParameterFor ("specificFind" , Predicate .class ), null ,
157
+ Object predicate = resolver .resolveArgument (getMethodParameterFor ("specificFind" , Predicate .class ), null ,
158
158
new ServletWebRequest (request ), null );
159
159
160
- assertThat (predicate ).isEqualTo (( Predicate ) QUser .user .inceptionYear .eq (978L ));
160
+ assertThat (predicate ).isEqualTo (QUser .user .inceptionYear .eq (978L ));
161
161
}
162
162
163
163
@ Test // DATACMNS-669
164
164
public void shouldCreatePredicateForNonStringListPropertyCorrectly () throws Exception {
165
165
166
166
request .addParameter ("inceptionYear" , new String [] { "978" , "998" });
167
167
168
- Predicate predicate = resolver .resolveArgument (getMethodParameterFor ("specificFind" , Predicate .class ), null ,
168
+ Object predicate = resolver .resolveArgument (getMethodParameterFor ("specificFind" , Predicate .class ), null ,
169
169
new ServletWebRequest (request ), null );
170
170
171
- assertThat (predicate ).isEqualTo (( Predicate ) QUser .user .inceptionYear .in (978L , 998L ));
171
+ assertThat (predicate ).isEqualTo (QUser .user .inceptionYear .in (978L , 998L ));
172
172
}
173
173
174
174
@ Test // DATACMNS-669
@@ -190,7 +190,7 @@ public void extractTypeInformationShouldUseTypeExtractedFromMethodReturnTypeIfPr
190
190
TypeInformation <?> type = ReflectionTestUtils .invokeMethod (resolver , "extractTypeInfo" ,
191
191
getMethodParameterFor ("predicateWithoutAnnotation" , Predicate .class ));
192
192
193
- assertThat (type ).isEqualTo (( TypeInformation ) ClassTypeInformation .from (User .class ));
193
+ assertThat (type ).isEqualTo (ClassTypeInformation .from (User .class ));
194
194
}
195
195
196
196
@ Test // DATACMNS-669
@@ -205,6 +205,43 @@ public void detectsDomainTypesCorrectly() {
205
205
assertThat (extractTypeInfo (getMethodParameterFor ("forModelAndView" ))).isEqualTo (MODELA_AND_VIEW_TYPE );
206
206
}
207
207
208
+ @ Test // DATACMNS-1593
209
+ public void returnsEmptyPredicateForEmptyInput () throws Exception {
210
+
211
+ MethodParameter parameter = getMethodParameterFor ("predicateWithoutAnnotation" , Predicate .class );
212
+
213
+ request .addParameter ("firstname" , "" );
214
+
215
+ assertThat (resolver .resolveArgument (parameter , null , new ServletWebRequest (request ), null )) //
216
+ .isNotNull ();
217
+ }
218
+
219
+ @ Test // DATACMNS-1635
220
+ public void forwardsNullValueForNullablePredicate () throws Exception {
221
+
222
+ MethodParameter parameter = getMethodParameterFor ("nullablePredicateWithoutAnnotation" , Predicate .class );
223
+
224
+ request .addParameter ("firstname" , "" );
225
+
226
+ assertThat (resolver .resolveArgument (parameter , null , new ServletWebRequest (request ), null )).isNull ();
227
+ }
228
+
229
+ @ Test // DATACMNS-1635
230
+ public void returnsOptionalIfDeclared () throws Exception {
231
+
232
+ MethodParameter parameter = getMethodParameterFor ("optionalPredicateWithoutAnnotation" , Optional .class );
233
+
234
+ request .addParameter ("firstname" , "" );
235
+
236
+ assertThat (resolver .resolveArgument (parameter , null , new ServletWebRequest (request ), null )) //
237
+ .isInstanceOfSatisfying (Optional .class , it -> assertThat (it ).isEmpty ());
238
+
239
+ request .addParameter ("lastname" , "Matthews" );
240
+
241
+ assertThat (resolver .resolveArgument (parameter , null , new ServletWebRequest (request ), null )) //
242
+ .isInstanceOfSatisfying (Optional .class , it -> assertThat (it ).isPresent ());
243
+ }
244
+
208
245
private static MethodParameter getMethodParameterFor (String methodName , Class <?>... args ) throws RuntimeException {
209
246
210
247
try {
@@ -244,6 +281,12 @@ static interface Sample {
244
281
ModelAndView forModelAndView ();
245
282
246
283
ResponseEntity <EntityModel <User >> forResourceOfUser ();
284
+
285
+ // Nullability
286
+
287
+ User nullablePredicateWithoutAnnotation (@ Nullable Predicate predicate );
288
+
289
+ User optionalPredicateWithoutAnnotation (Optional <Predicate > predicate );
247
290
}
248
291
249
292
public static class SampleRepo implements QuerydslBinderCustomizer <QUser > {
0 commit comments