From c7316d7ba2f8a8accdaadd3438d2f7c20c2e5b61 Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Mon, 25 Feb 2019 14:45:56 +1030 Subject: [PATCH] pytest: test that we translate to and from Millisatoshi on plugin RPC. We don't, but we should, like we do for normal RPC. However, I chose to use function annotations, rather than names-ending-in-'msat' because it's more Pythony. Signed-off-by: Rusty Russell --- tests/plugins/millisatoshis.py | 23 +++++++++++++++++++++++ tests/test_plugin.py | 20 +++++++++++++++++++- 2 files changed, 42 insertions(+), 1 deletion(-) create mode 100755 tests/plugins/millisatoshis.py diff --git a/tests/plugins/millisatoshis.py b/tests/plugins/millisatoshis.py new file mode 100755 index 000000000..5404aa8e0 --- /dev/null +++ b/tests/plugins/millisatoshis.py @@ -0,0 +1,23 @@ +#!/usr/bin/env python3 +from lightning import Plugin, Millisatoshi + + +plugin = Plugin(autopatch=True) + + +@plugin.method("echo") +def echo(plugin, msat: Millisatoshi, not_an_msat): + plugin.log("got echo for {} {} (types {} and {})" + .format(msat, not_an_msat, type(msat), type(not_an_msat))) + if not isinstance(msat, Millisatoshi): + raise TypeError("msat must be Millisatoshi not {}".format(type(msat))) + if isinstance(not_an_msat, Millisatoshi): + raise TypeError("not_an_msat must not be Millisatoshi") + plugin.log("got echo for {} (type {})".format(msat, type(msat))) + if not isinstance(msat, Millisatoshi): + raise TypeError("msat must be Millisatoshi not {}".format(type(msat))) + plugin.log("Returning {}".format(msat)) + return {'echo_msat': msat} + + +plugin.run() diff --git a/tests/test_plugin.py b/tests/test_plugin.py index 67ac913f4..5df0c47bb 100644 --- a/tests/test_plugin.py +++ b/tests/test_plugin.py @@ -1,6 +1,6 @@ from collections import OrderedDict from fixtures import * # noqa: F401,F403 -from lightning import RpcError +from lightning import RpcError, Millisatoshi from utils import only_one import pytest @@ -34,6 +34,24 @@ def test_option_passthrough(node_factory): n.stop() +@pytest.mark.xfail(strict=True) +def test_millisatoshi_passthrough(node_factory): + """ Ensure that Millisatoshi arguments and return work. + """ + plugin_path = 'tests/plugins/millisatoshis.py' + n = node_factory.get_node(options={'plugin': plugin_path, 'log-level': 'io'}) + + # By keyword + ret = n.rpc.call('echo', {'msat': Millisatoshi(17), 'not_an_msat': '22msat'})['echo_msat'] + assert type(ret) == Millisatoshi + assert ret == Millisatoshi(17) + + # By position + ret = n.rpc.call('echo', [Millisatoshi(18), '22msat'])['echo_msat'] + assert type(ret) == Millisatoshi + assert ret == Millisatoshi(18) + + def test_rpc_passthrough(node_factory): """Starting with a plugin exposes its RPC methods.