1+ import os
12import base64
23from pathlib import Path
34from typing import Type , TypeVar , Any
78
89from xconn .client import connect_anonymous
910from 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
1415class 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-
4840class 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
186185T = 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
190191UserCreate = user_capnp .UserCreate
191192UserGet = 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-
270238def 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
0 commit comments