@@ -27,6 +27,7 @@ class ValidateParams(NamedTuple):
2727 response_model : Type [BaseModel ] = EmptyModel
2828 on_success_status : int = 200
2929 request_query : ImmutableMultiDict = ImmutableMultiDict ({})
30+ flat_request_query : bool = True
3031 request_body : Union [dict , List [dict ]] = {}
3132 request_form : ImmutableMultiDict = ImmutableMultiDict ({})
3233 expected_response_body : Optional [dict ] = None
@@ -58,7 +59,7 @@ class FormModel(BaseModel):
5859 f2 : Optional [str ] = None
5960
6061
61- class RequestBodyWithIterableModel (BaseModel ):
62+ class RequestWithIterableModel (BaseModel ):
6263 b1 : List
6364 b2 : List [str ]
6465 b3 : Tuple [str , int ]
@@ -68,7 +69,7 @@ class RequestBodyWithIterableModel(BaseModel):
6869
6970if sys .version_info >= (3 , 10 ):
7071 # New Python(>=3.10) syntax tests
71- class RequestBodyWithIterableModelPy310 (BaseModel ):
72+ class RequestWithIterableModelPy310 (BaseModel ):
7273 b1 : list
7374 b2 : list [str ]
7475 b3 : tuple [str , int ]
@@ -220,25 +221,34 @@ class RequestBodyModelRoot(RootModel):
220221 ),
221222 pytest .param (
222223 ValidateParams (
223- body_model = RequestBodyWithIterableModel ,
224- request_body = {
225- "b1" : ["str1" , "str2" ],
226- "b2" : ["str1" , "str2" ],
227- "b3" : ("str" , 123 ),
228- "b4" : [1 , 2 , 3 ],
229- "b5" : ("str" , 321 ),
230- },
224+ request_query = ImmutableMultiDict (
225+ [
226+ ("b1" , "str1" ),
227+ ("b1" , "str2" ),
228+ ("b2" , "str1" ),
229+ ("b2" , "str2" ),
230+ ("b3" , "str" ),
231+ ("b3" , 123 ),
232+ ("b4" , 1 ),
233+ ("b4" , 2 ),
234+ ("b4" , 3 ),
235+ ("b5" , "str" ),
236+ ("b5" , 321 ),
237+ ]
238+ ),
239+ flat_request_query = False ,
231240 expected_response_body = {
232241 "b1" : ["str1" , "str2" ],
233242 "b2" : ["str1" , "str2" ],
234243 "b3" : ("str" , 123 ),
235244 "b4" : [1 , 2 , 3 ],
236245 "b5" : ("str" , 321 ),
237246 },
238- response_model = RequestBodyWithIterableModel ,
247+ query_model = RequestWithIterableModel ,
248+ response_model = RequestWithIterableModel ,
239249 expected_status_code = 200 ,
240250 ),
241- id = "iterable and Optional[Iterable] fields in pydantic model" ,
251+ id = "iterable and Optional[Iterable] fields in pydantic model in query " ,
242252 ),
243253]
244254
@@ -247,25 +257,34 @@ class RequestBodyModelRoot(RootModel):
247257 [
248258 pytest .param (
249259 ValidateParams (
250- body_model = RequestBodyWithIterableModelPy310 ,
251- request_body = {
252- "b1" : ["str1" , "str2" ],
253- "b2" : ["str1" , "str2" ],
254- "b3" : ("str" , 123 ),
255- "b4" : [1 , 2 , 3 ],
256- "b5" : ("str" , 321 ),
257- },
260+ request_query = ImmutableMultiDict (
261+ [
262+ ("b1" , "str1" ),
263+ ("b1" , "str2" ),
264+ ("b2" , "str1" ),
265+ ("b2" , "str2" ),
266+ ("b3" , "str" ),
267+ ("b3" , 123 ),
268+ ("b4" , 1 ),
269+ ("b4" , 2 ),
270+ ("b4" , 3 ),
271+ ("b5" , "str" ),
272+ ("b5" , 321 ),
273+ ]
274+ ),
275+ flat_request_query = False ,
258276 expected_response_body = {
259277 "b1" : ["str1" , "str2" ],
260278 "b2" : ["str1" , "str2" ],
261279 "b3" : ("str" , 123 ),
262280 "b4" : [1 , 2 , 3 ],
263281 "b5" : ("str" , 321 ),
264282 },
265- response_model = RequestBodyWithIterableModelPy310 ,
283+ query_model = RequestWithIterableModelPy310 ,
284+ response_model = RequestWithIterableModelPy310 ,
266285 expected_status_code = 200 ,
267286 ),
268- id = "iterable and Iterable | None fields in pydantic model (Python 3.10+)" ,
287+ id = "iterable and Iterable | None fields in pydantic model in query (Python 3.10+)" ,
269288 ),
270289 ]
271290 )
@@ -303,17 +322,17 @@ def f():
303322 assert response .status_code == parameters .expected_status_code
304323 assert_matches (parameters .expected_response_body , response .json )
305324 if 200 <= response .status_code < 300 :
306- assert (
325+ assert_matches (
326+ parameters .request_body ,
307327 mock_request .body_params .model_dump (
308328 exclude_none = True , exclude_defaults = True
309- )
310- == parameters .request_body
329+ ),
311330 )
312- assert (
331+ assert_matches (
332+ parameters .request_query .to_dict (flat = parameters .flat_request_query ),
313333 mock_request .query_params .model_dump (
314334 exclude_none = True , exclude_defaults = True
315- )
316- == parameters .request_query .to_dict ()
335+ ),
317336 )
318337
319338 @pytest .mark .parametrize ("parameters" , validate_test_cases )
@@ -342,17 +361,17 @@ def f(
342361 assert_matches (parameters .expected_response_body , response .json )
343362 assert response .status_code == parameters .expected_status_code
344363 if 200 <= response .status_code < 300 :
345- assert (
364+ assert_matches (
365+ parameters .request_body ,
346366 mock_request .body_params .model_dump (
347367 exclude_none = True , exclude_defaults = True
348- )
349- == parameters .request_body
368+ ),
350369 )
351- assert (
370+ assert_matches (
371+ parameters .request_query .to_dict (flat = parameters .flat_request_query ),
352372 mock_request .query_params .model_dump (
353373 exclude_none = True , exclude_defaults = True
354- )
355- == parameters .request_query .to_dict ()
374+ ),
356375 )
357376
358377 @pytest .mark .usefixtures ("request_ctx" )
@@ -541,17 +560,17 @@ def f() -> Any:
541560 assert response .status_code == parameters .expected_status_code
542561 assert_matches (parameters .expected_response_body , response .json )
543562 if 200 <= response .status_code < 300 :
544- assert (
563+ assert_matches (
564+ parameters .request_body ,
545565 mock_request .body_params .model_dump (
546566 exclude_none = True , exclude_defaults = True
547- )
548- == parameters .request_body
567+ ),
549568 )
550- assert (
569+ assert_matches (
570+ parameters .request_query .to_dict (flat = parameters .flat_request_query ),
551571 mock_request .query_params .model_dump (
552572 exclude_none = True , exclude_defaults = True
553- )
554- == parameters .request_query .to_dict ()
573+ ),
555574 )
556575
557576 def test_fail_validation_custom_status_code (self , app , request_ctx , mocker ):
0 commit comments