async def test_adding_method(): def method(): pass class TestClass: def method_1(self): pass @classmethod def method_2(cls): pass @staticmethod def method_3(): pass rpc_server = aiohttp_rpc.JsonRpcServer() rpc_server.add_method(method) assert rpc_server.methods['method'].func == method rpc_server.add_method(['test', method]) assert rpc_server.methods['test__method'].func == method rpc_server.add_method(aiohttp_rpc.JsonRpcMethod('test_2', method)) assert rpc_server.methods['test_2__method'].func == method rpc_server.add_method(aiohttp_rpc.JsonRpcMethod('', method, custom_name='test')) assert rpc_server.methods['test'].func == method rpc_server.add_method(aiohttp_rpc.JsonRpcMethod('test', method, custom_name='test')) assert rpc_server.methods['test__test'].func == method test_class = TestClass() rpc_server.add_method(test_class.method_1) assert rpc_server.methods['method_1'].func == test_class.method_1 rpc_server.add_method(TestClass.method_2) assert rpc_server.methods['method_2'].func == TestClass.method_2 rpc_server.add_method(TestClass.method_3) assert rpc_server.methods['method_3'].func == TestClass.method_3
async def test_builtin_funcs(aiohttp_client): rpc_server = aiohttp_rpc.JsonRpcServer( middlewares=(aiohttp_rpc.middlewares.extra_args_middleware, )) rpc_server.add_method(sum) rpc_server.add_method( aiohttp_rpc.JsonRpcMethod('', zip, prepare_result=list)) client = await utils.make_client(aiohttp_client, rpc_server) async with aiohttp_rpc.JsonRpcClient('/rpc', session=client) as rpc: assert await rpc.sum([1, 2, 3]) == 6 assert await rpc.zip(['a', 'b'], [1, 2]) == [['a', 1], ['b', 2]]
async def test_extra_kwargs_with_class(aiohttp_client): class TestClass: def __init__(self, rpc_request): self.rpc_request = rpc_request def __str__(self): return self.rpc_request.__class__.__name__ rpc_server = aiohttp_rpc.JsonRpcServer( middlewares=(aiohttp_rpc.middlewares.extra_args_middleware, )) rpc_server.add_method( aiohttp_rpc.JsonRpcMethod('', TestClass, prepare_result=str)) client = await utils.make_client(aiohttp_client, rpc_server) async with aiohttp_rpc.JsonRpcClient('/rpc', session=client) as rpc: assert await rpc.call('TestClass') == 'JsonRpcRequest'
async def test_rpc_call_with_invalid_batch(aiohttp_client): """ --> [ {"jsonrpc": "2.0", "method": "sum", "params": [1,2,4], "id": "1"}, {"jsonrpc": "2.0", "method": "notify_hello", "params": [7]}, {"jsonrpc": "2.0", "method": "subtract", "params": [42,23], "id": "2"}, {"foo": "boo"}, {"jsonrpc": "2.0", "method": "foo.get", "params": {"name": "myself"}, "id": "5"}, {"jsonrpc": "2.0", "method": "get_data", "id": "9"} ] <-- [ {"jsonrpc": "2.0", "result": 7, "id": "1"}, {"jsonrpc": "2.0", "result": 19, "id": "2"}, {"jsonrpc": "2.0", "error": {"code": -32600, "message": "Invalid Request"}, "id": null}, {"jsonrpc": "2.0", "error": {"code": -32601, "message": "Method not found"}, "id": "5"}, {"jsonrpc": "2.0", "result": ["hello", 5], "id": "9"} ] """ def subtract(a, b): return a - b def notify_hello(a): return a def get_data(): return ['hello', 5] def my_sum(*args): return sum(args) rpc_server = aiohttp_rpc.JsonRpcServer() rpc_server.add_method(subtract) rpc_server.add_method((aiohttp_rpc.JsonRpcMethod(prefix='', func=my_sum, custom_name='sum'))) rpc_server.add_method(notify_hello) rpc_server.add_method(get_data) client = await utils.make_client(aiohttp_client, rpc_server) called_methods = [ aiohttp_rpc.JsonRpcRequest(id=1, method_name='sum', params=[1, 2, 4]), aiohttp_rpc.JsonRpcRequest(method_name='notify_hello', params=[1, 2, 4]), aiohttp_rpc.JsonRpcRequest(id=2, method_name='subtract', params=[42, 23]), aiohttp_rpc.JsonRpcRequest(id=5, method_name='foo.get', params={'name': 'myself'}), aiohttp_rpc.JsonRpcRequest(id=9, method_name='get_data'), ] async with aiohttp_rpc.JsonRpcClient('/rpc', session=client) as rpc: assert await rpc.batch(called_methods) == [ 7, None, 19, errors.MethodNotFound(), ['hello', 5] ] assert await rpc.batch(called_methods, save_order=False) == [ 7, 19, errors.MethodNotFound(), ['hello', 5] ] result = await rpc.send_json([{ 'jsonrpc': '2.0', 'method': 'sum', 'params': [1, 2, 4], 'id': '1' }, { 'jsonrpc': '2.0', 'method': 'notify_hello', 'params': [7] }, { 'jsonrpc': '2.0', 'method': 'subtract', 'params': [42, 23], 'id': '2' }, { 'foo': 'boo' }, { 'jsonrpc': '2.0', 'method': 'foo.get', 'params': { 'name': 'myself' }, 'id': '5' }, { 'jsonrpc': '2.0', 'method': 'get_data', 'id': '9' }]) assert result[0] == [ { 'jsonrpc': '2.0', 'result': 7, 'id': '1' }, { 'jsonrpc': '2.0', 'result': 19, 'id': '2' }, { 'jsonrpc': '2.0', 'error': { 'code': -32600, 'message': 'A request must contain "method" and "jsonrpc".' }, 'id': None }, { 'jsonrpc': '2.0', 'error': { 'code': -32601, 'message': 'The method does not exist / is not available.' }, 'id': '5' }, { 'jsonrpc': '2.0', 'result': ['hello', 5], 'id': '9' }, ]