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
示例#2
0
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]]
示例#3
0
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'
示例#4
0
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'
            },
        ]