Skip to content

Commit af8e2d3

Browse files
committed
chore: cleanup tests
1 parent 8c8603c commit af8e2d3

File tree

7 files changed

+50
-76
lines changed

7 files changed

+50
-76
lines changed

tests/codec_test.py

Lines changed: 40 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import os
12
import base64
23
from pathlib import Path
34
from typing import Type, TypeVar, Any
@@ -7,8 +8,8 @@
78

89
from xconn.client import connect_anonymous
910
from xconn import codec
10-
from xconn.types import Invocation, Result, Event
11-
from tests.profile_pb2 import ProfileCreate, ProfileGet
11+
from xconn.types import Event
12+
from tests.schemas.profile_pb2 import ProfileCreate, ProfileGet
1213

1314

1415
class String(str):
@@ -36,15 +37,6 @@ def test_base64_codec():
3637
assert decoded == "hello"
3738

3839

39-
def test_something():
40-
# session = connect_anonymous("ws://localhost:8080/ws", "realm1")
41-
# session.set_payload_codec(Base64Codec())
42-
# result = session.call_object("io.xconn.object", String("hello"), String)
43-
# print(result)
44-
# session.leave()
45-
pass
46-
47-
4840
class ProtobufCodec(codec.Codec[Message]):
4941
def name(self) -> str:
5042
return "protobuf"
@@ -55,28 +47,24 @@ def encode(self, obj: Message) -> bytes:
5547
def decode(self, data: bytes, out_type: Type[Message]) -> Message:
5648
msg = out_type()
5749
msg.ParseFromString(data)
50+
5851
return msg
5952

6053

61-
def test_protobuf_codec():
54+
def test_rpc_object_protobuf():
6255
session = connect_anonymous("ws://localhost:8080/ws", "realm1")
6356
session.set_payload_codec(ProtobufCodec())
6457

65-
def inv_handler(inv: Invocation) -> Result:
66-
profile = ProfileCreate()
67-
profile.ParseFromString(inv.args[0])
68-
69-
profile_get = ProfileGet(
58+
def inv_handler(profile: ProfileCreate) -> ProfileGet:
59+
return ProfileGet(
7060
id="123",
7161
username=profile.username,
7262
email=profile.email,
7363
age=profile.age,
7464
created_at="2025-10-28T17:00:00Z",
7565
)
7666

77-
return Result(args=[profile_get.SerializeToString()])
78-
79-
session.register("io.xconn.profile.create", inv_handler)
67+
session.register_object("io.xconn.profile.create", inv_handler)
8068
create_msg = ProfileCreate(username="john", email="[email protected]", age=25)
8169

8270
result = session.call_object("io.xconn.profile.create", create_msg, ProfileGet)
@@ -104,7 +92,25 @@ def event_handler(event: Event):
10492
session.leave()
10593

10694

107-
def test_register_object_one_param_with_return_type():
95+
def test_pubsub_protobuf():
96+
session = connect_anonymous("ws://localhost:8080/ws", "realm1")
97+
session.set_payload_codec(ProtobufCodec())
98+
99+
def event_handler(event: Event):
100+
user: ProfileCreate = event.args[0]
101+
assert user.username == "john"
102+
assert user.email == "[email protected]"
103+
assert user.age == 25
104+
105+
session.subscribe_object("io.xconn.object", event_handler, ProfileCreate)
106+
107+
create_msg = ProfileCreate(username="john", email="[email protected]", age=25)
108+
session.publish_object("io.xconn.object", create_msg)
109+
110+
session.leave()
111+
112+
113+
def test_rpc_object_one_param_with_return_type():
108114
session = connect_anonymous("ws://localhost:8080/ws", "realm1")
109115
session.set_payload_codec(ProtobufCodec())
110116

@@ -120,10 +126,7 @@ def create_profile_handler(prof: ProfileCreate) -> ProfileGet:
120126
session.register_object("io.xconn.profile.create", create_profile_handler)
121127

122128
profile_create = ProfileCreate(username="john", email="[email protected]", age=25)
123-
result = session.call("io.xconn.profile.create", [profile_create.SerializeToString()])
124-
125-
profile = ProfileGet()
126-
profile.ParseFromString(result.args[0])
129+
profile = session.call_object("io.xconn.profile.create", profile_create, ProfileGet)
127130

128131
assert profile.id == "356"
129132
assert profile.username == "john"
@@ -134,7 +137,7 @@ def create_profile_handler(prof: ProfileCreate) -> ProfileGet:
134137
session.leave()
135138

136139

137-
def test_register_object_no_param():
140+
def test_rpc_object_no_param():
138141
session = connect_anonymous("ws://localhost:8080/ws", "realm1")
139142
session.set_payload_codec(ProtobufCodec())
140143

@@ -145,16 +148,15 @@ def invocation_handler() -> None:
145148

146149
session.register_object("io.xconn.param.none", invocation_handler)
147150

148-
result = session.call("io.xconn.param.none")
151+
result = session.call_object("io.xconn.param.none")
149152

150153
assert options["flag"] is True
151-
assert result.args is None
152-
assert result.kwargs is None
154+
assert result is None
153155

154156
session.leave()
155157

156158

157-
def test_register_object_no_param_with_return():
159+
def test_rpc_object_no_param_with_return():
158160
session = connect_anonymous("ws://localhost:8080/ws", "realm1")
159161
session.set_payload_codec(ProtobufCodec())
160162

@@ -169,10 +171,7 @@ def get_profile_handler() -> ProfileGet:
169171

170172
session.register_object("io.xconn.profile.get", get_profile_handler)
171173

172-
result = session.call("io.xconn.profile.get")
173-
174-
profile = ProfileGet()
175-
profile.ParseFromString(result.args[0])
174+
profile = session.call_object("io.xconn.profile.get", return_type=ProfileGet)
176175

177176
assert profile.id == "636"
178177
assert profile.username == "admin"
@@ -184,8 +183,10 @@ def get_profile_handler() -> ProfileGet:
184183

185184

186185
T = TypeVar("T")
187-
SCHEMA_PATH = Path(__file__).parent / "user.capnp"
188-
user_capnp = capnp.load(str(SCHEMA_PATH))
186+
187+
root_dir = Path(__file__).resolve().parent
188+
module_file = os.path.join(root_dir, "schemas", "user.capnp")
189+
user_capnp = capnp.load(str(module_file))
189190

190191
UserCreate = user_capnp.UserCreate
191192
UserGet = user_capnp.UserGet
@@ -202,7 +203,7 @@ def decode(self, data: bytes, out_type: Type[T]) -> T:
202203
return out_type.from_bytes_packed(data)
203204

204205

205-
def test_register_object_capnproto():
206+
def test_rpc_object_capnproto():
206207
session = connect_anonymous("ws://localhost:8080/ws", "realm1")
207208
session.set_payload_codec(CapnpProtoCodec())
208209

@@ -223,8 +224,7 @@ def create_handler(user_create: UserCreate) -> UserGet:
223224
new_user.email = "[email protected]"
224225
new_user.age = 35
225226

226-
result = session.call("io.xconn.user.create", [new_user.to_bytes_packed()])
227-
user = UserGet.from_bytes_packed(result.args[0])
227+
user = session.call_object("io.xconn.user.create", new_user, UserGet)
228228

229229
assert user.id == 999
230230
assert user.name == "john"
@@ -235,44 +235,12 @@ def create_handler(user_create: UserCreate) -> UserGet:
235235
session.leave()
236236

237237

238-
def test_call_object_capnproto():
239-
session = connect_anonymous("ws://localhost:8080/ws", "realm1")
240-
session.set_payload_codec(CapnpProtoCodec())
241-
242-
def invocation_handler(inv: Invocation) -> Result:
243-
user_create = UserCreate.from_bytes_packed(inv.args[0])
244-
245-
user_get = UserGet.new_message()
246-
user_get.id = 78
247-
user_get.name = user_create.name
248-
user_get.email = user_create.email
249-
user_get.age = user_create.age
250-
user_get.isAdmin = True
251-
252-
return Result(args=[user_get.to_bytes_packed()])
253-
254-
session.register("io.xconn.user.create", invocation_handler)
255-
new_user = UserCreate.new_message()
256-
new_user.name = "alice"
257-
new_user.email = "[email protected]"
258-
new_user.age = 23
259-
260-
result: UserGet = session.call_object("io.xconn.user.create", new_user, UserGet)
261-
assert result.id == 78
262-
assert result.name == "alice"
263-
assert result.email == "[email protected]"
264-
assert result.age == 23
265-
assert result.isAdmin
266-
267-
session.leave()
268-
269-
270238
def test_pubsub_capnproto():
271239
session = connect_anonymous("ws://localhost:8080/ws", "realm1")
272240
session.set_payload_codec(CapnpProtoCodec())
273241

274242
def event_handler(event: Event):
275-
user: UserGet = event.args[0]
243+
user: UserCreate = event.args[0]
276244
assert user.name == "alice"
277245
assert user.email == "[email protected]"
278246
assert user.age == 21

tests/schemas/__init__.py

Whitespace-only changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.

xconn/session.py

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -202,14 +202,20 @@ def _process_incoming_message(self, msg: messages.Message):
202202
def set_payload_codec(self, codec: Codec) -> None:
203203
self._payload_codec = codec
204204

205-
def call_object(self, procedure: str, request: TReq, return_type: Type[TRes] = None) -> TReq | None:
205+
def call_object(self, procedure: str, request: TReq = None, return_type: Type[TRes] = None) -> TRes | None:
206206
if self._payload_codec is None:
207207
raise ValueError("no payload codec set")
208208

209-
encoded = self._payload_codec.encode(request)
210-
result = self.call(procedure, [encoded])
209+
if request is not None:
210+
encoded = self._payload_codec.encode(request)
211+
result = self.call(procedure, [encoded])
212+
else:
213+
result = self.call(procedure)
214+
215+
if return_type is not None:
216+
return self._payload_codec.decode(result.args[0], return_type)
211217

212-
return self._payload_codec.decode(result.args[0], return_type)
218+
return None
213219

214220
def subscribe_object(self, topic: str, event_handler: Callable[[types.Event], None], return_type: Type[TRes]):
215221
if self._payload_codec is None:

0 commit comments

Comments
 (0)