From 313c7af4bbf165ed65e5acd56e2461663d54bec2 Mon Sep 17 00:00:00 2001 From: The MMGen Project Date: Sun, 12 Oct 2025 10:01:51 +0000 Subject: [PATCH] mmgen-ticker: test caching JSON data --- MANIFEST.in | 1 + mmgen_node_tools/Ticker.py | 12 ++++++--- test/cmdtest_d/httpd/ticker.py | 27 +++++++++++++++++++ test/cmdtest_d/misc.py | 27 ++++++++++++++----- test/init.sh | 1 + .../fakemods/mmgen_node_tools/Ticker.py | 23 ++++++++++++++++ 6 files changed, 82 insertions(+), 9 deletions(-) create mode 100755 test/cmdtest_d/httpd/ticker.py create mode 100644 test/overlay/fakemods/mmgen_node_tools/Ticker.py diff --git a/MANIFEST.in b/MANIFEST.in index 77b53ac..2581100 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -7,5 +7,6 @@ include test/test-release.d/*.sh include test/modtest_d/*.py include test/cmdtest_d/*.py include test/cmdtest_d/include/cfg.py +include test/cmdtest_d/httpd/ticker.py include test/overlay/fakemods/mmgen_node_tools/*.py include test/ref/*/* diff --git a/mmgen_node_tools/Ticker.py b/mmgen_node_tools/Ticker.py index d681a81..bfe899b 100755 --- a/mmgen_node_tools/Ticker.py +++ b/mmgen_node_tools/Ticker.py @@ -175,6 +175,7 @@ class DataSource: desc = 'CoinPaprika' data_desc = 'cryptocurrency data' api_host = 'api.coinpaprika.com' + api_proto = 'https' ratelimit = 240 btc_ratelimit = 10 net_data_type = 'json' @@ -192,11 +193,11 @@ class DataSource: @property def api_url(self): return ( - f'https://{self.api_host}/v1/tickers/btc-bitcoin' + f'{self.api_proto}://{self.api_host}/v1/tickers/btc-bitcoin' if cfg.btc_only else - f'https://{self.api_host}/v1/tickers?limit={self.asset_limit}' + f'{self.api_proto}://{self.api_host}/v1/tickers?limit={self.asset_limit}' if self.asset_limit else - f'https://{self.api_host}/v1/tickers') + f'{self.api_proto}://{self.api_host}/v1/tickers') @property def json_fn(self): @@ -697,6 +698,11 @@ def make_cfg(gcfg_arg): cmd_args = gcfg._args cfg_in = get_cfg_in() + if gcfg.test_suite: # required for testing with overlay + from . import Ticker as this_mod + this_mod.src_cls = src_cls + this_mod.cfg_in = cfg_in + usr_rows = parse_usr_asset_arg('add_rows') usr_columns = parse_usr_asset_arg('add_columns', use_cf_file=True) query = parse_query_arg(cmd_args[0]) if cmd_args else None diff --git a/test/cmdtest_d/httpd/ticker.py b/test/cmdtest_d/httpd/ticker.py new file mode 100755 index 0000000..2d946ae --- /dev/null +++ b/test/cmdtest_d/httpd/ticker.py @@ -0,0 +1,27 @@ +#!/usr/bin/env python3 +# +# MMGen Node Tools, terminal-based programs for Bitcoin and forkcoin nodes +# Copyright (C)2013-2025 The MMGen Project +# Licensed under the GNU General Public License, Version 3: +# https://www.gnu.org/licenses +# Public project repositories: +# https://github.com/mmgen/mmgen-node-tools +# https://gitlab.com/mmgen/mmgen-node-tools + +""" +test.cmdtest_d.httpd.ticker: Ticker WSGI http server +""" + +from . import HTTPD + +class TickerServer(HTTPD): + name = 'ticker server' + port = 19900 + content_type = 'application/json' + + def make_response_body(self, method, environ): + + with open(f'test/ref/ticker/ticker.json') as fh: + text = fh.read() + + return text.encode() diff --git a/test/cmdtest_d/misc.py b/test/cmdtest_d/misc.py index fb48282..e9d4c32 100755 --- a/test/cmdtest_d/misc.py +++ b/test/cmdtest_d/misc.py @@ -16,6 +16,7 @@ import os, shutil from ..include.common import cfg from .base import CmdTestBase +from .httpd.ticker import TickerServer refdir = os.path.join('test','ref','ticker') @@ -70,8 +71,9 @@ class CmdTestScripts(CmdTestBase): ), 'ticker': ( "'mmnode-ticker' script", - ('ticker1', 'ticker [--help)'), + ('ticker1', 'ticker [--help]'), ('ticker2', 'ticker (bad proxy)'), + ('ticker2a', 'ticker [--download=cc]'), ('ticker3', 'ticker [--cached-data]'), ('ticker4', 'ticker [--cached-data --wide]'), ('ticker5', 'ticker [--cached-data --wide --adjust=-0.766] (usr cfg file)'), @@ -90,9 +92,12 @@ class CmdTestScripts(CmdTestBase): ) } - @property - def ticker_args(self): - return [ f'--cachedir={self.tmpdir}', '--proxy=http://asdfzxcv:32459' ] + def __init__(self, cfg, trunner, cfgs, spawn): + if not trunner: + return + self.ticker_server = TickerServer(cfg) + self.ticker_server.start() + return super().__init__(cfg, trunner, cfgs, spawn) @property def nt_datadir(self): @@ -100,7 +105,6 @@ class CmdTestScripts(CmdTestBase): def ticker_setup(self): self.spawn('',msg_only=True) - shutil.copy2(os.path.join(refdir,'ticker.json'),self.tmpdir) shutil.copy2(os.path.join(refdir,'ticker-finance.json'),self.tmpdir) shutil.copy2(os.path.join(refdir,'ticker-finance-history.json'),self.tmpdir) shutil.copy2(os.path.join(refdir,'ticker-btc.json'),self.tmpdir) @@ -111,11 +115,15 @@ class CmdTestScripts(CmdTestBase): args = [], expect_list = None, cached_data = True, + add_opts = [], + use_proxy = True, exit_val = None): t = self.spawn( 'mmnode-ticker', (['--cached-data'] if cached_data else []) - + self.ticker_args + + [f'--cachedir={self.tmpdir}'] + + (['--proxy=http://asdfzxcv:32459'] if use_proxy else []) + + add_opts + args, exit_val = exit_val) if expect_list: @@ -136,6 +144,13 @@ class CmdTestScripts(CmdTestBase): t.exit_val = 1 if ret else 3 return t + def ticker2a(self): + t = self.ticker( + add_opts = ['--proxy', '', '--download=cc'], + cached_data = False, + use_proxy = False) + return t + def ticker3(self): return self.ticker( [], diff --git a/test/init.sh b/test/init.sh index 134f4f3..eec6ec3 100755 --- a/test/init.sh +++ b/test/init.sh @@ -98,6 +98,7 @@ create_test_links() { test/modtest.py hard test/test-release.sh symbolic test/cmdtest_d/base.py symbolic + test/cmdtest_d/httpd/__init__.py symbolic test/cmdtest_d/include/common.py symbolic test/cmdtest_d/include/runner.py symbolic test/cmdtest_d/include/group_mgr.py symbolic diff --git a/test/overlay/fakemods/mmgen_node_tools/Ticker.py b/test/overlay/fakemods/mmgen_node_tools/Ticker.py new file mode 100644 index 0000000..8d1ede4 --- /dev/null +++ b/test/overlay/fakemods/mmgen_node_tools/Ticker.py @@ -0,0 +1,23 @@ +#!/usr/bin/env python3 +# +# MMGen Node Tools, terminal-based programs for Bitcoin and forkcoin nodes +# Copyright (C)2013-2025 The MMGen Project +# Licensed under the GNU General Public License, Version 3: +# https://www.gnu.org/licenses +# Public project repositories: +# https://github.com/mmgen/mmgen-node-tools +# https://gitlab.com/mmgen/mmgen-node-tools + +""" +fakemods.mmgen_node_tools.Ticker: fake module for Ticker class +""" + +from .Ticker_orig import * + +class overlay_fake_DataSource: + class coinpaprika: + api_host = 'localhost:19900' + api_proto = 'http' + +DataSource.coinpaprika.api_host = overlay_fake_DataSource.coinpaprika.api_host +DataSource.coinpaprika.api_proto = overlay_fake_DataSource.coinpaprika.api_proto