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

1from __future__ import annotations 

2 

3import sys 

4 

5import pytest 

6 

7from muutils.json_serialize import SerializableDataclass, serializable_dataclass 

8from muutils.json_serialize.util import _FORMAT_KEY 

9 

10SUPPORTS_KW_ONLY: bool = sys.version_info >= (3, 10) 

11 

12print(f"{SUPPORTS_KW_ONLY = }") 

13 

14 

15@serializable_dataclass 

16class Person(SerializableDataclass): 

17 first_name: str 

18 last_name: str 

19 

20 @property 

21 def full_name(self) -> str: 

22 return f"{self.first_name} {self.last_name}" 

23 

24 

25@serializable_dataclass( 

26 kw_only=SUPPORTS_KW_ONLY, properties_to_serialize=["full_name", "full_title"] 

27) 

28class TitledPerson(Person): 

29 title: str 

30 

31 @property 

32 def full_title(self) -> str: 

33 return f"{self.title} {self.full_name}" 

34 

35 

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 

42 

43 @property 

44 def full_title(self) -> str: 

45 return f"{self.title} {self.full_name}" 

46 

47 

48def test_invalid_properties_to_serialize(): 

49 instance = AgedPerson_not_valid(first_name="Jane", last_name="Smith", title="Dr.") 

50 

51 with pytest.raises(AttributeError): 

52 instance.serialize() 

53 

54 

55def test_serialize_person(): 

56 instance = Person(first_name="John", last_name="Doe") 

57 

58 serialized = instance.serialize() 

59 

60 assert serialized == { 

61 "first_name": "John", 

62 "last_name": "Doe", 

63 _FORMAT_KEY: "Person(SerializableDataclass)", 

64 } 

65 

66 recovered = Person.load(serialized) 

67 

68 assert recovered == instance 

69 

70 

71def test_serialize_titled_person(): 

72 instance = TitledPerson(first_name="Jane", last_name="Smith", title="Dr.") 

73 

74 if SUPPORTS_KW_ONLY: 

75 with pytest.raises(TypeError): 

76 TitledPerson("Jane", "Smith", "Dr.") 

77 

78 serialized = instance.serialize() 

79 

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 } 

88 

89 recovered = TitledPerson.load(serialized) 

90 

91 assert recovered == instance