From 3eb8f934c445161220ae5e68b033e903d9c97ed6 Mon Sep 17 00:00:00 2001 From: "arne.vanlondersele" Date: Sun, 19 Jan 2025 12:43:21 +0100 Subject: [PATCH] test generic forward reference --- tests/core/test_forward_reference.py | 26 +++++++++++++++++++++++++- tests/core/test_generics.py | 2 +- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/tests/core/test_forward_reference.py b/tests/core/test_forward_reference.py index 8512845..c891d35 100644 --- a/tests/core/test_forward_reference.py +++ b/tests/core/test_forward_reference.py @@ -1,7 +1,9 @@ from dataclasses import dataclass -from typing import List, Optional +from typing import Generic, List, Optional, TypeVar from dacite import from_dict +T = TypeVar("T") + @dataclass class Person: @@ -15,6 +17,18 @@ class Club: members: List["Person"] +@dataclass +class Employee: + name: str + + +@dataclass +class Team(Generic[T]): + name: str + members: Optional[List[T]] = None + subteams: Optional[List["Team[T]"]] = None + + def test_self_reference(): data = {"name": "John Doe", "children": [{"name": "Jane Doe"}]} @@ -29,3 +43,13 @@ def test_other_reference(): result = from_dict(Club, data) assert result == Club(name="FooBar", members=[Person(name="John Doe", children=[Person(name="Jane Doe")])]) + + +def test_generic_self_reference(): + data = {"name": "foo", "members": [{"name": "John"}], "subteams": [{"name": "bar", "members": [{"name": "Jane"}]}]} + + result = from_dict(Team[Employee], data) + + assert result == Team( + name="foo", members=[Employee(name="John")], subteams=[Team(name="bar", members=[Employee(name="Jane")])] + ) diff --git a/tests/core/test_generics.py b/tests/core/test_generics.py index 5c83421..36addc1 100644 --- a/tests/core/test_generics.py +++ b/tests/core/test_generics.py @@ -30,7 +30,7 @@ def test_multi_generic(): assert result == A(x=X(a="foo"), y=[1, 2, 3]) -def test_inherited_generic(): +def test_generic_parent(): @dataclass class B(A[X, int]): z: str