Coverage for tests\unit\json_serialize\serializable_dataclass\test_sdc_properties_nested.py: 98%
45 statements
« prev ^ index » next coverage.py v7.6.1, created at 2025-02-14 01:33 -0700
« prev ^ index » next coverage.py v7.6.1, created at 2025-02-14 01:33 -0700
1from __future__ import annotations
3import sys
5import pytest
7from muutils.json_serialize import SerializableDataclass, serializable_dataclass
8from muutils.json_serialize.util import _FORMAT_KEY
10SUPPORTS_KW_ONLY: bool = sys.version_info >= (3, 10)
12print(f"{SUPPORTS_KW_ONLY = }")
15@serializable_dataclass
16class Person(SerializableDataclass):
17 first_name: str
18 last_name: str
20 @property
21 def full_name(self) -> str:
22 return f"{self.first_name} {self.last_name}"
25@serializable_dataclass(
26 kw_only=SUPPORTS_KW_ONLY, properties_to_serialize=["full_name", "full_title"]
27)
28class TitledPerson(Person):
29 title: str
31 @property
32 def full_title(self) -> str:
33 return f"{self.title} {self.full_name}"
36@serializable_dataclass(
37 kw_only=SUPPORTS_KW_ONLY,
38 properties_to_serialize=["full_name", "not_a_real_property"],
39)
40class AgedPerson_not_valid(Person):
41 title: str
43 @property
44 def full_title(self) -> str:
45 return f"{self.title} {self.full_name}"
48def test_invalid_properties_to_serialize():
49 instance = AgedPerson_not_valid(first_name="Jane", last_name="Smith", title="Dr.")
51 with pytest.raises(AttributeError):
52 instance.serialize()
55def test_serialize_person():
56 instance = Person(first_name="John", last_name="Doe")
58 serialized = instance.serialize()
60 assert serialized == {
61 "first_name": "John",
62 "last_name": "Doe",
63 _FORMAT_KEY: "Person(SerializableDataclass)",
64 }
66 recovered = Person.load(serialized)
68 assert recovered == instance
71def test_serialize_titled_person():
72 instance = TitledPerson(first_name="Jane", last_name="Smith", title="Dr.")
74 if SUPPORTS_KW_ONLY:
75 with pytest.raises(TypeError):
76 TitledPerson("Jane", "Smith", "Dr.")
78 serialized = instance.serialize()
80 assert serialized == {
81 "first_name": "Jane",
82 "last_name": "Smith",
83 "title": "Dr.",
84 _FORMAT_KEY: "TitledPerson(SerializableDataclass)",
85 "full_name": "Jane Smith",
86 "full_title": "Dr. Jane Smith",
87 }
89 recovered = TitledPerson.load(serialized)
91 assert recovered == instance