tests.test_args.test_extra_kwargs_with_class()   A
last analyzed

Complexity

Conditions 2

Size

Total Lines 15
Code Lines 11

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 11
dl 0
loc 15
rs 9.85
c 0
b 0
f 0
cc 2
nop 1
1
import functools
2
3
import pytest
4
5
import aiohttp_rpc
6
from aiohttp_rpc import errors
7
from tests import utils
8
9
10
async def test_args(aiohttp_client):
11
    def method(a=1):
12
        return [1, 2, a]
13
14
    rpc_server = aiohttp_rpc.JsonRpcServer()
15
    rpc_server.add_method(method)
16
17
    assert await rpc_server.call('method') == [1, 2, 1]
18
    assert await rpc_server.call('method', args=[1]) == [1, 2, 1]
19
20
    client = await utils.make_client(aiohttp_client, rpc_server)
21
22
    async with aiohttp_rpc.JsonRpcClient('/rpc', session=client) as rpc:
23
        assert await rpc.call('method') == [1, 2, 1]
24
        assert await rpc.call('method', 1) == [1, 2, 1]
25
26
27
async def test_kwargs(aiohttp_client):
28
    def method(a=1, *, b=2):
29
        return [1, a, b]
30
31
    rpc_server = aiohttp_rpc.JsonRpcServer()
32
    rpc_server.add_method(method)
33
34
    with pytest.raises(errors.InvalidParams):
35
        await rpc_server.call('method', args=[1, 2])
36
37
    assert await rpc_server.call('method', kwargs={'a': 1, 'b': 2}) == [1, 1, 2]
38
    assert await rpc_server.call('method', args=[2], kwargs={'b': 2}) == [1, 2, 2]
39
40
    client = await utils.make_client(aiohttp_client, rpc_server)
41
42
    async with aiohttp_rpc.JsonRpcClient('/rpc', session=client) as rpc:
43
        assert await rpc.call('method', a=1, b=2) == [1, 1, 2]
44
45
        with pytest.raises(errors.InvalidParams):
46
            await rpc.call('method', 2, b=2)
47
48
49
async def test_varargs(aiohttp_client):
50
    def method(a=1, *args):
51
        return [a, *args]
52
53
    rpc_server = aiohttp_rpc.JsonRpcServer()
54
    rpc_server.add_method(method)
55
56
    assert await rpc_server.call('method') == [1]
57
    assert await rpc_server.call('method', args=[2]) == [2]
58
    assert await rpc_server.call('method', args=[2, 3]) == [2, 3]
59
60
    client = await utils.make_client(aiohttp_client, rpc_server)
61
62
    async with aiohttp_rpc.JsonRpcClient('/rpc', session=client) as rpc:
63
        assert await rpc.call('method') == [1]
64
        assert await rpc.call('method', 2) == [2]
65
        assert await rpc.call('method', 2, 3) == [2, 3]
66
67
68
async def test_varkw(aiohttp_client):
69
    def method(a=1, **kwargs):
70
        return [a, kwargs]
71
72
    rpc_server = aiohttp_rpc.JsonRpcServer()
73
    rpc_server.add_method(method)
74
75
    with pytest.raises(errors.InvalidParams):
76
        await rpc_server.call('method', args=[1, 2])
77
78
    assert await rpc_server.call('method', kwargs={'a': 1, 'b': 2}) == [1, {'b': 2}]
79
80
    client = await utils.make_client(aiohttp_client, rpc_server)
81
82
    async with aiohttp_rpc.JsonRpcClient('/rpc', session=client) as rpc:
83
        with pytest.raises(errors.InvalidParams):
84
            await rpc.call('method', 1, 2)
85
86
        assert await rpc.call('method', a=1, b=2) == [1, {'b': 2}]
87
88
89
async def test_extra_kwargs(aiohttp_client):
90
    def method(rpc_request):
91
        return rpc_request.__class__.__name__
92
93
    def method_2(*, rpc_request):
94
        return rpc_request.__class__.__name__
95
96
    rpc_server = aiohttp_rpc.JsonRpcServer(middlewares=(aiohttp_rpc.middlewares.extra_args_middleware,))
97
    rpc_server.add_method(method)
98
    rpc_server.add_method(method_2)
99
100
    assert await rpc_server.call('method', extra_args={'rpc_request': 123}), 123
101
    assert await rpc_server.call('method_2', extra_args={'rpc_request': 123}), 123
102
103
    client = await utils.make_client(aiohttp_client, rpc_server)
104
105
    async with aiohttp_rpc.JsonRpcClient('/rpc', session=client) as rpc:
106
        assert await rpc.call('method') == 'JsonRpcRequest'
107
        assert await rpc.call('method_2') == 'JsonRpcRequest'
108
109
110
async def test_extra_kwargs_with_class(aiohttp_client):
111
    class TestClass:
112
        def __init__(self, rpc_request):
113
            self.rpc_request = rpc_request
114
115
        def __str__(self):
116
            return self.rpc_request.__class__.__name__
117
118
    rpc_server = aiohttp_rpc.JsonRpcServer(middlewares=(aiohttp_rpc.middlewares.extra_args_middleware,))
119
    rpc_server.add_method(aiohttp_rpc.JsonRpcMethod(TestClass, prepare_result=str))
120
121
    client = await utils.make_client(aiohttp_client, rpc_server)
122
123
    async with aiohttp_rpc.JsonRpcClient('/rpc', session=client) as rpc:
124
        assert await rpc.call('TestClass') == 'JsonRpcRequest'
125
126
127
async def test_extra_kwargs_with_wrapper(aiohttp_client):
128
    def test_decorator(func):
129
        @functools.wraps(func)
130
        def wrapper(*args, **kwargs):
131
            return func(*args, **kwargs)
132
133
        return wrapper
134
135
    @test_decorator
136
    def method(rpc_request):
137
        return rpc_request.__class__.__name__
138
139
    @test_decorator
140
    def method_2():
141
        return True
142
143
    rpc_server = aiohttp_rpc.JsonRpcServer(middlewares=(aiohttp_rpc.middlewares.extra_args_middleware,))
144
    rpc_server.add_methods((method, method_2,))
145
146
    client = await utils.make_client(aiohttp_client, rpc_server)
147
148
    async with aiohttp_rpc.JsonRpcClient('/rpc', session=client) as rpc:
149
        assert await rpc.call('method') == 'JsonRpcRequest'
150
        assert await rpc.call('method_2') is True
151
152
153
async def test_builtin_funcs(aiohttp_client):
154
    rpc_server = aiohttp_rpc.JsonRpcServer(middlewares=(aiohttp_rpc.middlewares.extra_args_middleware,))
155
    rpc_server.add_method(sum)
156
    rpc_server.add_method(aiohttp_rpc.JsonRpcMethod(zip, prepare_result=list))
157
158
    client = await utils.make_client(aiohttp_client, rpc_server)
159
160
    async with aiohttp_rpc.JsonRpcClient('/rpc', session=client) as rpc:
161
        assert await rpc.sum([1, 2, 3]) == 6
162
        assert await rpc.zip(['a', 'b'], [1, 2]) == [['a', 1], ['b', 2]]
163