mmgen-ticker: test caching JSON data

This commit is contained in:
The MMGen Project 2025-10-12 10:01:51 +00:00
commit 313c7af4bb
Signed by: mmgen
GPG key ID: 3F8B1861E32B7DA2
6 changed files with 82 additions and 9 deletions

View file

@ -7,5 +7,6 @@ include test/test-release.d/*.sh
include test/modtest_d/*.py include test/modtest_d/*.py
include test/cmdtest_d/*.py include test/cmdtest_d/*.py
include test/cmdtest_d/include/cfg.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/overlay/fakemods/mmgen_node_tools/*.py
include test/ref/*/* include test/ref/*/*

View file

@ -175,6 +175,7 @@ class DataSource:
desc = 'CoinPaprika' desc = 'CoinPaprika'
data_desc = 'cryptocurrency data' data_desc = 'cryptocurrency data'
api_host = 'api.coinpaprika.com' api_host = 'api.coinpaprika.com'
api_proto = 'https'
ratelimit = 240 ratelimit = 240
btc_ratelimit = 10 btc_ratelimit = 10
net_data_type = 'json' net_data_type = 'json'
@ -192,11 +193,11 @@ class DataSource:
@property @property
def api_url(self): def api_url(self):
return ( 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 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 if self.asset_limit else
f'https://{self.api_host}/v1/tickers') f'{self.api_proto}://{self.api_host}/v1/tickers')
@property @property
def json_fn(self): def json_fn(self):
@ -697,6 +698,11 @@ def make_cfg(gcfg_arg):
cmd_args = gcfg._args cmd_args = gcfg._args
cfg_in = get_cfg_in() 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_rows = parse_usr_asset_arg('add_rows')
usr_columns = parse_usr_asset_arg('add_columns', use_cf_file=True) usr_columns = parse_usr_asset_arg('add_columns', use_cf_file=True)
query = parse_query_arg(cmd_args[0]) if cmd_args else None query = parse_query_arg(cmd_args[0]) if cmd_args else None

27
test/cmdtest_d/httpd/ticker.py Executable file
View file

@ -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 <mmgen@tuta.io>
# 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()

View file

@ -16,6 +16,7 @@ import os, shutil
from ..include.common import cfg from ..include.common import cfg
from .base import CmdTestBase from .base import CmdTestBase
from .httpd.ticker import TickerServer
refdir = os.path.join('test','ref','ticker') refdir = os.path.join('test','ref','ticker')
@ -70,8 +71,9 @@ class CmdTestScripts(CmdTestBase):
), ),
'ticker': ( 'ticker': (
"'mmnode-ticker' script", "'mmnode-ticker' script",
('ticker1', 'ticker [--help)'), ('ticker1', 'ticker [--help]'),
('ticker2', 'ticker (bad proxy)'), ('ticker2', 'ticker (bad proxy)'),
('ticker2a', 'ticker [--download=cc]'),
('ticker3', 'ticker [--cached-data]'), ('ticker3', 'ticker [--cached-data]'),
('ticker4', 'ticker [--cached-data --wide]'), ('ticker4', 'ticker [--cached-data --wide]'),
('ticker5', 'ticker [--cached-data --wide --adjust=-0.766] (usr cfg file)'), ('ticker5', 'ticker [--cached-data --wide --adjust=-0.766] (usr cfg file)'),
@ -90,9 +92,12 @@ class CmdTestScripts(CmdTestBase):
) )
} }
@property def __init__(self, cfg, trunner, cfgs, spawn):
def ticker_args(self): if not trunner:
return [ f'--cachedir={self.tmpdir}', '--proxy=http://asdfzxcv:32459' ] return
self.ticker_server = TickerServer(cfg)
self.ticker_server.start()
return super().__init__(cfg, trunner, cfgs, spawn)
@property @property
def nt_datadir(self): def nt_datadir(self):
@ -100,7 +105,6 @@ class CmdTestScripts(CmdTestBase):
def ticker_setup(self): def ticker_setup(self):
self.spawn('',msg_only=True) 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.json'),self.tmpdir)
shutil.copy2(os.path.join(refdir,'ticker-finance-history.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) shutil.copy2(os.path.join(refdir,'ticker-btc.json'),self.tmpdir)
@ -111,11 +115,15 @@ class CmdTestScripts(CmdTestBase):
args = [], args = [],
expect_list = None, expect_list = None,
cached_data = True, cached_data = True,
add_opts = [],
use_proxy = True,
exit_val = None): exit_val = None):
t = self.spawn( t = self.spawn(
'mmnode-ticker', 'mmnode-ticker',
(['--cached-data'] if cached_data else []) (['--cached-data'] if cached_data else [])
+ self.ticker_args + [f'--cachedir={self.tmpdir}']
+ (['--proxy=http://asdfzxcv:32459'] if use_proxy else [])
+ add_opts
+ args, + args,
exit_val = exit_val) exit_val = exit_val)
if expect_list: if expect_list:
@ -136,6 +144,13 @@ class CmdTestScripts(CmdTestBase):
t.exit_val = 1 if ret else 3 t.exit_val = 1 if ret else 3
return t return t
def ticker2a(self):
t = self.ticker(
add_opts = ['--proxy', '', '--download=cc'],
cached_data = False,
use_proxy = False)
return t
def ticker3(self): def ticker3(self):
return self.ticker( return self.ticker(
[], [],

View file

@ -98,6 +98,7 @@ create_test_links() {
test/modtest.py hard test/modtest.py hard
test/test-release.sh symbolic test/test-release.sh symbolic
test/cmdtest_d/base.py 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/common.py symbolic
test/cmdtest_d/include/runner.py symbolic test/cmdtest_d/include/runner.py symbolic
test/cmdtest_d/include/group_mgr.py symbolic test/cmdtest_d/include/group_mgr.py symbolic

View file

@ -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 <mmgen@tuta.io>
# 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