import re from unittest.mock import MagicMock import pytest from requests.exceptions import ConnectionError from freqtrade_client import FtRestClient from freqtrade_client.ft_client import add_arguments, main_exec def log_has_re(line, logs): """Check if line matches some caplog's message.""" return any(re.match(line, message) for message in logs.messages) def get_rest_client(): client = FtRestClient('http://localhost:8080', 'freqtrader', 'password') client._session = MagicMock() request_mock = MagicMock() client._session.request = request_mock return client, request_mock def test_FtRestClient_init(): client = FtRestClient('http://localhost:8080', 'freqtrader', 'password') assert client is not None assert client._serverurl == 'http://localhost:8080' assert client._session is not None assert client._session.auth is not None assert client._session.auth == ('freqtrader', 'password') @pytest.mark.parametrize('method', ['GET', 'POST', 'DELETE']) def test_FtRestClient_call(method): client, mock = get_rest_client() client._call(method, '/dummytest') assert mock.call_count == 1 getattr(client, f"_{method.lower()}")('/dummytest') assert mock.call_count == 2 def test_FtRestClient_call_invalid(caplog): client, _ = get_rest_client() with pytest.raises(ValueError): client._call('PUTTY', '/dummytest') client._session.request = MagicMock(side_effect=ConnectionError()) client._call('GET', '/dummytest') assert log_has_re('Connection error', caplog) @pytest.mark.parametrize('method,args', [ ('start', []), ('stop', []), ('stopbuy', []), ('reload_config', []), ('balance', []), ('count', []), ('entries', []), ('exits', []), ('mix_tags', []), ('locks', []), ('lock_add', ["XRP/USDT", '2024-01-01 20:00:00Z', '*', 'rand']), ('delete_lock', [2]), ('daily', []), ('daily', [15]), ('weekly', []), ('weekly', [15]), ('monthly', []), ('monthly', [12]), ('edge', []), ('profit', []), ('stats', []), ('performance', []), ('status', []), ('version', []), ('show_config', []), ('ping', []), ('logs', []), ('logs', [55]), ('trades', []), ('trades', [5]), ('trades', [5, 5]), # With offset ('trade', [1]), ('delete_trade', [1]), ('cancel_open_order', [1]), ('whitelist', []), ('blacklist', []), ('blacklist', ['XRP/USDT']), ('blacklist', ['XRP/USDT', 'BTC/USDT']), ('forcebuy', ['XRP/USDT']), ('forcebuy', ['XRP/USDT', 1.5]), ('forceenter', ['XRP/USDT', 'short']), ('forceenter', ['XRP/USDT', 'short', 1.5]), ('forceexit', [1]), ('forceexit', [1, 'limit']), ('forceexit', [1, 'limit', 100]), ('strategies', []), ('strategy', ['sampleStrategy']), ('pairlists_available', []), ('plot_config', []), ('available_pairs', []), ('available_pairs', ['5m']), ('pair_candles', ['XRP/USDT', '5m']), ('pair_candles', ['XRP/USDT', '5m', 500]), ('pair_history', ['XRP/USDT', '5m', 'SampleStrategy']), ('sysinfo', []), ('health', []), ]) def test_FtRestClient_call_explicit_methods(method, args): client, mock = get_rest_client() exec = getattr(client, method) exec(*args) assert mock.call_count == 1 def test_ft_client(mocker, capsys, caplog): with pytest.raises(SystemExit): args = add_arguments(['-V']) args = add_arguments(['--show']) assert isinstance(args, dict) assert args['show'] is True with pytest.raises(SystemExit): main_exec(args) captured = capsys.readouterr() assert 'Possible commands' in captured.out mock = mocker.patch('freqtrade_client.ft_client.FtRestClient._call') args = add_arguments([ '--config', 'tests/testdata/testconfigs/main_test_config.json', 'ping' ]) main_exec(args) captured = capsys.readouterr() assert mock.call_count == 1 with pytest.raises(SystemExit): args = add_arguments(['--config', 'tests/testdata/testconfigs/nonexisting.json']) main_exec(args) assert log_has_re(r'Could not load config file .*nonexisting\.json\.', caplog) args = add_arguments([ '--config', 'tests/testdata/testconfigs/main_test_config.json', 'whatever' ]) main_exec(args) assert log_has_re('Command whatever not defined', caplog)