11import pytest
2+ from common_library .json_serialization import json_dumps
23from models_library .basic_types import IDStr
34from models_library .rest_ordering import (
45 OrderBy ,
56 OrderDirection ,
67 create_ordering_query_model_classes ,
78)
8- from models_library .utils .json_serialization import json_dumps
9- from pydantic import BaseModel , Extra , Field , Json , ValidationError , validator
9+ from pydantic import (
10+ BaseModel ,
11+ ConfigDict ,
12+ Field ,
13+ Json ,
14+ ValidationError ,
15+ field_validator ,
16+ )
1017
1118
1219class ReferenceOrderQueryParamsClass (BaseModel ):
@@ -18,10 +25,10 @@ class ReferenceOrderQueryParamsClass(BaseModel):
1825 order_by : Json [OrderBy ] = Field (
1926 default = OrderBy (field = IDStr ("modified_at" ), direction = OrderDirection .DESC ),
2027 description = "Order by field (modified_at|name|description) and direction (asc|desc). The default sorting order is ascending." ,
21- example = '{"field": "name", "direction": "desc"}' ,
28+ json_schema_extra = { "examples" : [ '{"field": "name", "direction": "desc"}' ]} ,
2229 )
2330
24- @validator ("order_by" , check_fields = False )
31+ @field_validator ("order_by" , check_fields = False )
2532 @classmethod
2633 def _validate_order_by_field (cls , v ):
2734 if v .field not in {
@@ -35,8 +42,9 @@ def _validate_order_by_field(cls, v):
3542 v .field = "modified_column"
3643 return v
3744
38- class Config :
39- extra = Extra .forbid
45+ model_config = ConfigDict (
46+ extra = "forbid" ,
47+ )
4048
4149
4250def test_ordering_query_model_class_factory ():
@@ -52,16 +60,19 @@ class OrderQueryParamsModel(BaseOrderingQueryModel):
5260
5361 # normal
5462 data = {"order_by" : {"field" : "modified_at" , "direction" : "asc" }}
55- model = OrderQueryParamsModel .parse_obj (data )
63+ model = OrderQueryParamsModel .model_validate (data )
5664
5765 assert model .order_by
58- assert model .order_by .dict () == {"field" : "modified_column" , "direction" : "asc" }
66+ assert model .order_by .model_dump () == {
67+ "field" : "modified_column" ,
68+ "direction" : "asc" ,
69+ }
5970
6071 # test against reference
61- expected = ReferenceOrderQueryParamsClass .parse_obj (
72+ expected = ReferenceOrderQueryParamsClass .model_validate (
6273 {"order_by" : json_dumps ({"field" : "modified_at" , "direction" : "asc" })}
6374 )
64- assert expected .dict () == model .dict ()
75+ assert expected .model_dump () == model .model_dump ()
6576
6677
6778def test_ordering_query_model_class__fails_with_invalid_fields ():
@@ -73,7 +84,7 @@ def test_ordering_query_model_class__fails_with_invalid_fields():
7384
7485 # fails with invalid field to sort
7586 with pytest .raises (ValidationError ) as err_info :
76- OrderQueryParamsModel .parse_obj ({"order_by" : {"field" : "INVALID" }})
87+ OrderQueryParamsModel .model_validate ({"order_by" : {"field" : "INVALID" }})
7788
7889 error = err_info .value .errors ()[0 ]
7990
@@ -89,7 +100,7 @@ def test_ordering_query_model_class__fails_with_invalid_direction():
89100 )
90101
91102 with pytest .raises (ValidationError ) as err_info :
92- OrderQueryParamsModel .parse_obj (
103+ OrderQueryParamsModel .model_validate (
93104 {"order_by" : {"field" : "modified" , "direction" : "INVALID" }}
94105 )
95106
@@ -110,18 +121,19 @@ def test_ordering_query_model_class__defaults():
110121 # checks all defaults
111122 model = OrderQueryParamsModel ()
112123 assert model .order_by
124+ assert isinstance (model .order_by , OrderBy ) # nosec
113125 assert model .order_by .field == "modified_at" # NOTE that this was mapped!
114126 assert model .order_by .direction == OrderDirection .DESC
115127
116128 # partial defaults
117- model = OrderQueryParamsModel .parse_obj ({"order_by" : {"field" : "name" }})
129+ model = OrderQueryParamsModel .model_validate ({"order_by" : {"field" : "name" }})
118130 assert model .order_by
119131 assert model .order_by .field == "name"
120- assert model .order_by .direction == OrderBy .__fields__ ["direction" ].default
132+ assert model .order_by .direction == OrderBy .model_fields ["direction" ].default
121133
122134 # direction alone is invalid
123135 with pytest .raises (ValidationError ) as err_info :
124- OrderQueryParamsModel .parse_obj ({"order_by" : {"direction" : "asc" }})
136+ OrderQueryParamsModel .model_validate ({"order_by" : {"direction" : "asc" }})
125137
126138 error = err_info .value .errors ()[0 ]
127139 assert error ["loc" ] == ("order_by" , "field" )
@@ -135,5 +147,6 @@ def test_ordering_query_model_with_map():
135147 ordering_fields_api_to_column_map = {"modified" : "some_db_column_name" },
136148 )
137149
138- model = OrderQueryParamsModel .parse_obj ({"order_by" : {"field" : "modified" }})
150+ model = OrderQueryParamsModel .model_validate ({"order_by" : {"field" : "modified" }})
151+ assert model .order_by
139152 assert model .order_by .field == "some_db_column_name"
0 commit comments