Browse Source
If the `request` or `plugin` parameter that are injected by the framework where before or inbetween positional arguments we'd be injecting them incorrectly, i.e., we'd be providing them both as `args` (and mismapping another argument) as well as `kwargs`. This is a better way to map arguments, which takes advantage of the fact that JSON-RPC calls are either all positional or named arguments. I also included a test for various scenarios, that hopefull cover the most common cases. Reported-by: Rene Pickhardt <@renepickhardt> Signed-off-by: Christian Decker <decker.christian@gmail.com>pr-2218
Christian Decker
6 years ago
2 changed files with 79 additions and 8 deletions
@ -0,0 +1,51 @@ |
|||
from .plugin import Plugin |
|||
import itertools |
|||
|
|||
|
|||
def test_positional_inject(): |
|||
p = Plugin() |
|||
rdict = { |
|||
'id': 1, |
|||
'jsonrpc': |
|||
'2.0', |
|||
'method': 'func', |
|||
'params': {'a': 1, 'b': 2, 'kwa': 3, 'kwb': 4} |
|||
} |
|||
rarr = { |
|||
'id': 1, |
|||
'jsonrpc': '2.0', |
|||
'method': 'func', |
|||
'params': [1, 2, 3, 4] |
|||
} |
|||
|
|||
def pre_args(plugin, a, b, kwa=3, kwb=4): |
|||
assert (plugin, a, b, kwa, kwb) == (p, 1, 2, 3, 4) |
|||
|
|||
def in_args(a, plugin, b, kwa=3, kwb=4): |
|||
assert (plugin, a, b, kwa, kwb) == (p, 1, 2, 3, 4) |
|||
|
|||
def post_args(a, b, plugin, kwa=3, kwb=4): |
|||
assert (plugin, a, b, kwa, kwb) == (p, 1, 2, 3, 4) |
|||
|
|||
def post_kwargs(a, b, kwa=3, kwb=4, plugin=None): |
|||
assert (plugin, a, b, kwa, kwb) == (p, 1, 2, 3, 4) |
|||
|
|||
def in_multi_args(a, request, plugin, b, kwa=3, kwb=4): |
|||
assert request in [rarr, rdict] |
|||
assert (plugin, a, b, kwa, kwb) == (p, 1, 2, 3, 4) |
|||
|
|||
def in_multi_mix_args(a, plugin, b, request=None, kwa=3, kwb=4): |
|||
assert request in [rarr, rdict] |
|||
assert (plugin, a, b, kwa, kwb) == (p, 1, 2, 3, 4) |
|||
|
|||
def extra_def_arg(a, b, c, d, e=42): |
|||
""" Also uses a different name for kwa and kwb |
|||
""" |
|||
assert (a, b, c, d, e) == (1, 2, 3, 4, 42) |
|||
|
|||
funcs = [pre_args, in_args, post_args, post_kwargs, in_multi_args] |
|||
|
|||
for func, request in itertools.product(funcs, [rdict, rarr]): |
|||
p._exec_func(func, request) |
|||
|
|||
p._exec_func(extra_def_arg, rarr) |
Loading…
Reference in new issue