Skip to content

Commit abb2c8c

Browse files
committed
test: msgpack packet tests
1 parent db7fcda commit abb2c8c

File tree

2 files changed

+109
-4
lines changed

2 files changed

+109
-4
lines changed

src/socketio/msgpack_packet.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,11 @@ def __init__(
1616
dumps_default=None,
1717
ext_hook=None,
1818
):
19+
self.dumps_default = dumps_default
20+
self.ext_hook = ext_hook
1921
super().__init__(
2022
packet_type, data, namespace, id, binary, encoded_packet
2123
)
22-
self.dumps_default = dumps_default
23-
self.ext_hook = ext_hook
2424

2525
def encode(self):
2626
"""Encode the packet for transmission."""

tests/common/test_msgpack_packet.py

Lines changed: 107 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,17 @@
1+
from datetime import datetime, timedelta, timezone
2+
3+
import pytest
4+
import msgpack
5+
16
from socketio import msgpack_packet
27
from socketio import packet
38

49

510
class 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

Comments
 (0)