1+ from datetime import datetime , timedelta , timezone
2+
3+ import pytest
4+ import msgpack
5+
16from socketio import msgpack_packet
27from socketio import packet
38
49
510class TestMsgPackPacket :
611 def test_encode_decode (self ):
712 p = msgpack_packet .MsgPackPacket (
8- packet .CONNECT , data = {'auth' : {'token' : '123' }}, namespace = '/foo' )
13+ packet .CONNECT , data = {'auth' : {'token' : '123' }}, namespace = '/foo'
14+ )
915 p2 = msgpack_packet .MsgPackPacket (encoded_packet = p .encode ())
1016 assert p .packet_type == p2 .packet_type
1117 assert p .data == p2 .data
@@ -14,7 +20,8 @@ def test_encode_decode(self):
1420
1521 def test_encode_decode_with_id (self ):
1622 p = msgpack_packet .MsgPackPacket (
17- packet .EVENT , data = ['ev' , 42 ], id = 123 , namespace = '/foo' )
23+ packet .EVENT , data = ['ev' , 42 ], id = 123 , namespace = '/foo'
24+ )
1825 p2 = msgpack_packet .MsgPackPacket (encoded_packet = p .encode ())
1926 assert p .packet_type == p2 .packet_type
2027 assert p .data == p2 .data
@@ -32,3 +39,101 @@ def test_encode_binary_ack_packet(self):
3239 assert p .packet_type == packet .ACK
3340 p2 = msgpack_packet .MsgPackPacket (encoded_packet = p .encode ())
3441 assert p2 .data == {'foo' : b'bar' }
42+
43+ def test_encode_with_dumps_default (self ):
44+ def default (obj ):
45+ if isinstance (obj , datetime ):
46+ return obj .isoformat ()
47+ raise TypeError ('Unknown type' )
48+
49+ data = {
50+ 'current' : datetime .now (tz = timezone (timedelta (0 ))),
51+ 'key' : 'value' ,
52+ }
53+ p = msgpack_packet .MsgPackPacket (data = data , dumps_default = default )
54+ p2 = msgpack_packet .MsgPackPacket (encoded_packet = p .encode ())
55+ assert p .packet_type == p2 .packet_type
56+ assert p .id == p2 .id
57+ assert p .namespace == p2 .namespace
58+ assert p .data != p2 .data
59+
60+ assert isinstance (p2 .data , dict )
61+ assert 'current' in p2 .data
62+ assert isinstance (p2 .data ['current' ], str )
63+ assert default (data ['current' ]) == p2 .data ['current' ]
64+
65+ data .pop ('current' )
66+ p2_data_without_current = p2 .data .copy ()
67+ p2_data_without_current .pop ('current' )
68+ assert data == p2_data_without_current
69+
70+ def test_encode_without_dumps_default (self ):
71+ data = {
72+ 'current' : datetime .now (tz = timezone (timedelta (0 ))),
73+ 'key' : 'value' ,
74+ }
75+ p_without_default = msgpack_packet .MsgPackPacket (data = data )
76+ with pytest .raises (
77+ TypeError , match = "can not serialize 'datetime.datetime' object"
78+ ):
79+ p_without_default .encode ()
80+
81+ def test_encode_decode_with_ext_hook (self ):
82+ class Custom :
83+ def __init__ (self , value ):
84+ self .value = value
85+
86+ def __eq__ (self , value : object ) -> bool :
87+ return isinstance (value , Custom ) and self .value == value .value
88+
89+ def default (obj ):
90+ if isinstance (obj , Custom ):
91+ return msgpack .ExtType (1 , obj .value )
92+ raise TypeError ('Unknown type' )
93+
94+ def ext_hook (code , data ):
95+ if code == 1 :
96+ return Custom (data )
97+ raise TypeError ('Unknown ext type' )
98+
99+ data = {'custom' : Custom (b'custom_data' ), 'key' : 'value' }
100+ p = msgpack_packet .MsgPackPacket (data = data , dumps_default = default )
101+ p2 = msgpack_packet .MsgPackPacket (
102+ encoded_packet = p .encode (), ext_hook = ext_hook
103+ )
104+ assert p .packet_type == p2 .packet_type
105+ assert p .id == p2 .id
106+ assert p .data == p2 .data
107+ assert p .namespace == p2 .namespace
108+
109+ def test_encode_decode_without_ext_hook (self ):
110+ class Custom :
111+ def __init__ (self , value ):
112+ self .value = value
113+
114+ def __eq__ (self , value : object ) -> bool :
115+ return isinstance (value , Custom ) and self .value == value .value
116+
117+ def default (obj ):
118+ if isinstance (obj , Custom ):
119+ return msgpack .ExtType (1 , obj .value )
120+ raise TypeError ('Unknown type' )
121+
122+ data = {'custom' : Custom (b'custom_data' ), 'key' : 'value' }
123+ p = msgpack_packet .MsgPackPacket (data = data , dumps_default = default )
124+ p2 = msgpack_packet .MsgPackPacket (encoded_packet = p .encode ())
125+ assert p .packet_type == p2 .packet_type
126+ assert p .id == p2 .id
127+ assert p .namespace == p2 .namespace
128+ assert p .data != p2 .data
129+
130+ assert isinstance (p2 .data , dict )
131+ assert 'custom' in p2 .data
132+ assert isinstance (p2 .data ['custom' ], msgpack .ExtType )
133+ assert p2 .data ['custom' ].code == 1
134+ assert p2 .data ['custom' ].data == b'custom_data'
135+
136+ data .pop ('custom' )
137+ p2_data_without_custom = p2 .data .copy ()
138+ p2_data_without_custom .pop ('custom' )
139+ assert data == p2_data_without_custom
0 commit comments