1
1
from __future__ import annotations
2
2
3
3
import uuid
4
- from typing import Any , Generic
4
+ from typing import Any , Generic , TypeVar
5
5
6
6
import pytest
7
7
from pydantic import BaseModel , Field
@@ -22,12 +22,28 @@ class SampleModel(BaseModel):
22
22
value : int = Field (description = "Value field for testing" )
23
23
24
24
25
- class ComplexModel (BaseModel ):
25
+ class SampleModelSubclass (SampleModel ):
26
+ """Subclass of SampleModel for testing."""
27
+
28
+ extra_field : str
29
+
30
+
31
+ SampleModelT = TypeVar ("SampleModelT" , bound = SampleModel )
32
+
33
+
34
+ class ComplexModel (BaseModel , Generic [SampleModelT ]):
26
35
"""Complex Pydantic model for testing."""
27
36
28
37
items : list [str ] = Field (default_factory = list )
29
38
metadata : dict [str , Any ] = Field (default_factory = dict )
30
- nested : SampleModel | None = Field (default = None )
39
+ nested : SampleModelT | None = Field (default = None )
40
+
41
+
42
+ class GenricModelWrapper (Generic [SampleModelT ]):
43
+ """Simulates a layered generic type."""
44
+
45
+ def method (self , ** kwargs ) -> ComplexModel [SampleModelT ]:
46
+ return ComplexModel [SampleModelT ](** kwargs )
31
47
32
48
33
49
class TestMessageEncoding :
@@ -508,3 +524,31 @@ def test_dynamic_import_load_pydantic(self, monkeypatch):
508
524
inst .pydantic_registry .clear ()
509
525
restored = inst .from_dict (dumped )
510
526
assert restored == sample
527
+
528
+ @pytest .mark .sanity
529
+ def test_generic_model (self ):
530
+ inst = Serializer ("dict" )
531
+ inst .register_pydantic (ComplexModel [SampleModelSubclass ])
532
+ nested = ComplexModel [SampleModelSubclass ](
533
+ items = ["i1" , "i2" ],
534
+ metadata = {"m" : 1 },
535
+ nested = SampleModelSubclass (name = "nested" , value = 10 , extra_field = "extra" ),
536
+ )
537
+ dumped = inst .to_dict (nested )
538
+ restored = inst .from_dict (dumped )
539
+ assert restored == nested
540
+
541
+ @pytest .mark .sanity
542
+ def test_generic_emitted_type (self ):
543
+ generic_instance = GenricModelWrapper [SampleModelSubclass ]()
544
+
545
+ inst = Serializer ("dict" )
546
+ inst .register_pydantic (ComplexModel [SampleModelSubclass ])
547
+ nested = generic_instance .method (
548
+ items = ["i1" , "i2" ],
549
+ metadata = {"m" : 1 },
550
+ nested = SampleModelSubclass (name = "nested" , value = 10 , extra_field = "extra" ),
551
+ )
552
+ dumped = inst .to_dict (nested )
553
+ restored = inst .from_dict (dumped )
554
+ assert restored == nested
0 commit comments