Browse Source

mmgen-ticker: test caching JSON data

The MMGen Project 1 month ago
parent
commit
313c7af4bb

+ 1 - 0
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/*/*

+ 9 - 3
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

+ 27 - 0
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 <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()

+ 21 - 6
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(
 			[],

+ 1 - 0
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

+ 23 - 0
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 <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