44
55from __future__ import annotations
66
7- from typing import Any , Dict , Optional , TypeVar
7+ from copy import deepcopy
8+ from typing import Any , Dict , Iterable , Optional , TypeVar
89
910from dictdiffer import diff # type:ignore[import-not-found]
1011from pydantic import BaseModel
@@ -22,6 +23,7 @@ def assert_serialization_roundtrip(serializable_object: T, expected_json_dict: O
2223 then deserializes the dictionary again and asserts the equality with the original serializable_object
2324 :returns the deserialized_object
2425 """
26+ serializable_object = deepcopy (serializable_object )
2527 json_string = serializable_object .model_dump_json (by_alias = True )
2628 assert json_string is not None
2729 actual_json_dict = serializable_object .model_dump (by_alias = True )
@@ -36,6 +38,17 @@ def _remove_version_recursive_iter(value: dict[str, Any] | list[Any]) -> None:
3638 for v in value :
3739 _remove_version_recursive_iter (v )
3840
41+ def _clear_pydantic_fields_set (object : T ) -> None :
42+ object .model_fields_set .clear ()
43+ for field_name in object .model_fields :
44+ field_value = getattr (object , field_name )
45+ if isinstance (field_value , BaseModel ):
46+ _clear_pydantic_fields_set (field_value )
47+ if isinstance (field_value , Iterable ):
48+ for item in field_value :
49+ if isinstance (item , BaseModel ):
50+ _clear_pydantic_fields_set (item )
51+
3952 _remove_version_recursive_iter (actual_json_dict )
4053
4154 # Check typ property for bo and com classes
@@ -60,5 +73,7 @@ def _remove_version_recursive_iter(value: dict[str, Any] | list[Any]) -> None:
6073
6174 deserialized_object = type (serializable_object ).model_validate_json (json_string )
6275 assert isinstance (deserialized_object , type (serializable_object ))
76+ _clear_pydantic_fields_set (deserialized_object )
77+ _clear_pydantic_fields_set (serializable_object )
6378 assert deserialized_object == serializable_object
6479 return deserialized_object
0 commit comments