Coverage for tests\unit\json_serialize\serializable_dataclass\test_sdc_properties_nested.py: 98%
44 statements
« prev ^ index » next coverage.py v7.6.1, created at 2024-10-15 21:53 -0600
« prev ^ index » next coverage.py v7.6.1, created at 2024-10-15 21:53 -0600
1from __future__ import annotations
3import sys
5import pytest
7from muutils.json_serialize import SerializableDataclass, serializable_dataclass
9SUPPORTS_KW_ONLY: bool = sys.version_info >= (3, 10)
11print(f"{SUPPORTS_KW_ONLY = }")
14@serializable_dataclass
15class Person(SerializableDataclass):
16 first_name: str
17 last_name: str
19 @property
20 def full_name(self) -> str:
21 return f"{self.first_name} {self.last_name}"
24@serializable_dataclass(
25 kw_only=SUPPORTS_KW_ONLY, properties_to_serialize=["full_name", "full_title"]
26)
27class TitledPerson(Person):
28 title: str
30 @property
31 def full_title(self) -> str:
32 return f"{self.title} {self.full_name}"
35@serializable_dataclass(
36 kw_only=SUPPORTS_KW_ONLY,
37 properties_to_serialize=["full_name", "not_a_real_property"],
38)
39class AgedPerson_not_valid(Person):
40 title: str
42 @property
43 def full_title(self) -> str:
44 return f"{self.title} {self.full_name}"
47def test_invalid_properties_to_serialize():
48 instance = AgedPerson_not_valid(first_name="Jane", last_name="Smith", title="Dr.")
50 with pytest.raises(AttributeError):
51 instance.serialize()
54def test_serialize_person():
55 instance = Person(first_name="John", last_name="Doe")
57 serialized = instance.serialize()
59 assert serialized == {
60 "first_name": "John",
61 "last_name": "Doe",
62 "__format__": "Person(SerializableDataclass)",
63 }
65 recovered = Person.load(serialized)
67 assert recovered == instance
70def test_serialize_titled_person():
71 instance = TitledPerson(first_name="Jane", last_name="Smith", title="Dr.")
73 if SUPPORTS_KW_ONLY:
74 with pytest.raises(TypeError):
75 TitledPerson("Jane", "Smith", "Dr.")
77 serialized = instance.serialize()
79 assert serialized == {
80 "first_name": "Jane",
81 "last_name": "Smith",
82 "title": "Dr.",
83 "__format__": "TitledPerson(SerializableDataclass)",
84 "full_name": "Jane Smith",
85 "full_title": "Dr. Jane Smith",
86 }
88 recovered = TitledPerson.load(serialized)
90 assert recovered == instance