15
15
deserialize_pickle_message ,
16
16
)
17
17
18
+ class NonDataclass :
19
+ def __init__ (self , value ):
20
+ self .value = value
21
+
18
22
@dataclass
19
23
class Object :
20
24
value : str
@@ -33,6 +37,9 @@ class FullMessge:
33
37
uid : uuid .UUID
34
38
data : bytes
35
39
items : list # Changed from df to a simple list
40
+ list_obj : list [Object ] = None
41
+ dict_obj : dict [str , Object ] = None
42
+ optional_obj : Optional [Object ] = None
36
43
37
44
@dataclass
38
45
class MyObject :
@@ -47,8 +54,6 @@ class Msg:
47
54
my_obj : MyObject
48
55
49
56
def test_message_serialization ():
50
-
51
-
52
57
msg = Msg (text = "hello" , number = 42 , my_obj = None )
53
58
54
59
my_obj = MyObject (value = "test" , foo = None )
@@ -71,6 +76,46 @@ def test_message_serialization():
71
76
assert result .number == msg .number
72
77
assert result .my_obj == my_obj
73
78
79
+ def test_unexpexted_obj_serialization ():
80
+ # Create an invalid message
81
+ msg = Msg (text = "hello" , number = 42 , my_obj = None )
82
+ msg .my_obj = NonDataclass (value = "test" )
83
+
84
+ # Test serialization
85
+ serial = serialize_message (msg )
86
+ assert type (serial ).__module__ .startswith ('iris' ) and serial ._IsA ("IOP.Message" )
87
+ assert serial .classname == f"{ Msg .__module__ } .{ Msg .__name__ } "
88
+
89
+ # Test deserialization
90
+ result = deserialize_message (serial )
91
+ assert isinstance (result , Msg )
92
+ assert result .text == msg .text
93
+ assert result .number == msg .number
94
+ assert result .my_obj .value == msg .my_obj .value
95
+
96
+
97
+ def test_unexpected_fields ():
98
+ # Create a message with unexpected fields
99
+ msg = Msg (text = "hello" , number = 42 , my_obj = None )
100
+ msg .unexpected_field = "unexpected"
101
+
102
+ my_obj = MyObject (value = "test" , foo = None )
103
+ my_obj .unexpected_field = "unexpected"
104
+ msg .my_obj = my_obj
105
+
106
+ # Test serialization
107
+ serial = serialize_message (msg )
108
+ assert type (serial ).__module__ .startswith ('iris' ) and serial ._IsA ("IOP.Message" )
109
+ assert serial .classname == f"{ Msg .__module__ } .{ Msg .__name__ } "
110
+
111
+ # Test deserialization
112
+ result = deserialize_message (serial )
113
+ assert isinstance (result , Msg )
114
+ assert result .text == msg .text
115
+ assert result .number == msg .number
116
+ assert result .unexpected_field == msg .unexpected_field
117
+ assert result .my_obj == my_obj
118
+
74
119
75
120
def test_json_serialization ():
76
121
# Create test data
@@ -127,7 +172,10 @@ def test_pickle_serialization():
127
172
dec = decimal .Decimal ("3.14" ),
128
173
uid = uuid .uuid4 (),
129
174
data = b'hello world' ,
130
- items = [{'col1' : 1 , 'col2' : 'a' }, {'col1' : 2 , 'col2' : 'b' }]
175
+ items = [{'col1' : 1 , 'col2' : 'a' }, {'col1' : 2 , 'col2' : 'b' }],
176
+ list_obj = [Object (value = "item1" ), Object (value = "item2" )],
177
+ dict_obj = {'key1' : Object (value = "item1" ), 'key2' : Object (value = "item2" )},
178
+ optional_obj = Object (value = "optional" )
131
179
)
132
180
133
181
# Test serialization
@@ -150,6 +198,9 @@ def test_pickle_serialization():
150
198
assert result .uid == msg .uid
151
199
assert result .data == msg .data
152
200
assert result .items == msg .items
201
+ assert result .list_obj == msg .list_obj
202
+ assert result .dict_obj == msg .dict_obj
203
+ assert result .optional_obj == msg .optional_obj
153
204
154
205
def test_invalid_message_deserialization ():
155
206
# Create an invalid message without classname
0 commit comments