@@ -2313,11 +2313,18 @@ class Config:
23132313 expected_detail = "Check validator" ,
23142314 )
23152315
2316- async def test_field_validator_can_change_value (self ):
2316+ @mark .parametrize (
2317+ "inherit" ,
2318+ [
2319+ param (True , id = "inherited_true" ),
2320+ param (False , id = "inherited_false" ),
2321+ ],
2322+ )
2323+ async def test_field_validator_can_change_value (self , inherit : bool ):
23172324 class UserSchemaWithValidator (BaseModel ):
23182325 name : str
23192326
2320- @validator ("name" )
2327+ @validator ("name" , allow_reuse = True )
23212328 def fix_title (cls , v ):
23222329 return v .title ()
23232330
@@ -2327,7 +2334,11 @@ class Config:
23272334 attrs = {"name" : "john doe" }
23282335 create_user_body = {"data" : {"attributes" : attrs }}
23292336
2330- app = self .build_app (UserSchemaWithValidator )
2337+ if inherit :
2338+ app = self .build_app (self .inherit (UserSchemaWithValidator ))
2339+ else :
2340+ app = self .build_app (UserSchemaWithValidator )
2341+
23312342 async with AsyncClient (app = app , base_url = "http://test" ) as client :
23322343 url = app .url_path_for (f"get_{ self .resource_type } _list" )
23332344 res = await client .post (url , json = create_user_body )
@@ -2392,17 +2403,24 @@ class Config:
23922403 attrs = {"name" : name }
23932404 create_user_body = {"data" : {"attributes" : attrs }}
23942405
2395- await self .execute_request_and_check_response (
2396- app = self . build_app ( UserSchemaWithValidator ) ,
2406+ await self .execute_request_twice_and_check_response (
2407+ schema = UserSchemaWithValidator ,
23972408 body = create_user_body ,
23982409 expected_detail = expected_detail ,
23992410 )
24002411
2401- async def test_root_validator_can_change_value (self ):
2412+ @mark .parametrize (
2413+ "inherit" ,
2414+ [
2415+ param (True , id = "inherited_true" ),
2416+ param (False , id = "inherited_false" ),
2417+ ],
2418+ )
2419+ async def test_root_validator_can_change_value (self , inherit : bool ):
24022420 class UserSchemaWithValidator (BaseModel ):
24032421 name : str
24042422
2405- @root_validator
2423+ @root_validator ( allow_reuse = True )
24062424 def fix_title (cls , v ):
24072425 v ["name" ] = v ["name" ].title ()
24082426 return v
@@ -2413,7 +2431,11 @@ class Config:
24132431 attrs = {"name" : "john doe" }
24142432 create_user_body = {"data" : {"attributes" : attrs }}
24152433
2416- app = self .build_app (UserSchemaWithValidator )
2434+ if inherit :
2435+ app = self .build_app (self .inherit (UserSchemaWithValidator ))
2436+ else :
2437+ app = self .build_app (UserSchemaWithValidator )
2438+
24172439 async with AsyncClient (app = app , base_url = "http://test" ) as client :
24182440 url = app .url_path_for (f"get_{ self .resource_type } _list" )
24192441 res = await client .post (url , json = create_user_body )
@@ -2431,5 +2453,92 @@ class Config:
24312453 "meta" : None ,
24322454 }
24332455
2456+ @mark .parametrize (
2457+ ("name" , "expected_detail" ),
2458+ [
2459+ param ("check_pre_1" , "check_pre_1" , id = "check_1_pre_validator" ),
2460+ param ("check_pre_2" , "check_pre_2" , id = "check_2_pre_validator" ),
2461+ param ("check_post_1" , "check_post_1" , id = "check_1_post_validator" ),
2462+ param ("check_post_2" , "check_post_2" , id = "check_2_post_validator" ),
2463+ ],
2464+ )
2465+ async def test_root_validator_inheritance (self , name : str , expected_detail : str ):
2466+ class UserSchemaWithValidatorBase (BaseModel ):
2467+ name : str
2468+
2469+ @root_validator (pre = True , allow_reuse = True )
2470+ def validator_pre_1 (cls , values ):
2471+ if values ["name" ] == "check_pre_1" :
2472+ raise BadRequest (detail = "Base check_pre_1" )
2473+
2474+ return values
2475+
2476+ @root_validator (pre = True , allow_reuse = True )
2477+ def validator_pre_2 (cls , values ):
2478+ if values ["name" ] == "check_pre_2" :
2479+ raise BadRequest (detail = "Base check_pre_2" )
2480+
2481+ return values
2482+
2483+ @root_validator (allow_reuse = True )
2484+ def validator_post_1 (cls , values ):
2485+ if values ["name" ] == "check_post_1" :
2486+ raise BadRequest (detail = "Base check_post_1" )
2487+
2488+ return values
2489+
2490+ @root_validator (allow_reuse = True )
2491+ def validator_post_2 (cls , values ):
2492+ if values ["name" ] == "check_post_2" :
2493+ raise BadRequest (detail = "Base check_post_2" )
2494+
2495+ return values
2496+
2497+ class Config :
2498+ orm_mode = True
2499+
2500+ class UserSchemaWithValidator (UserSchemaWithValidatorBase ):
2501+ name : str
2502+
2503+ @root_validator (pre = True , allow_reuse = True )
2504+ def validator_pre_1 (cls , values ):
2505+ if values ["name" ] == "check_pre_1" :
2506+ raise BadRequest (detail = "check_pre_1" )
2507+
2508+ return values
2509+
2510+ @root_validator (pre = True , allow_reuse = True )
2511+ def validator_pre_2 (cls , values ):
2512+ if values ["name" ] == "check_pre_2" :
2513+ raise BadRequest (detail = "check_pre_2" )
2514+
2515+ return values
2516+
2517+ @root_validator (allow_reuse = True )
2518+ def validator_post_1 (cls , values ):
2519+ if values ["name" ] == "check_post_1" :
2520+ raise BadRequest (detail = "check_post_1" )
2521+
2522+ return values
2523+
2524+ @root_validator (allow_reuse = True )
2525+ def validator_post_2 (cls , values ):
2526+ if values ["name" ] == "check_post_2" :
2527+ raise BadRequest (detail = "check_post_2" )
2528+
2529+ return values
2530+
2531+ class Config :
2532+ orm_mode = True
2533+
2534+ attrs = {"name" : name }
2535+ create_user_body = {"data" : {"attributes" : attrs }}
2536+
2537+ await self .execute_request_and_check_response (
2538+ app = self .build_app (UserSchemaWithValidator ),
2539+ body = create_user_body ,
2540+ expected_detail = expected_detail ,
2541+ )
2542+
24342543
24352544# todo: test errors
0 commit comments