diff --git a/tests/commands/test_build_config.py b/tests/commands/test_build_config.py index 637ee9b23..5d287a35f 100644 --- a/tests/commands/test_build_config.py +++ b/tests/commands/test_build_config.py @@ -16,77 +16,72 @@ from tests.conftest import get_args, log_has_re def test_validate_is_float(): - assert validate_is_float('2.0') - assert validate_is_float('2.1') - assert validate_is_float('0.1') - assert validate_is_float('-0.5') - assert not validate_is_float('-0.5e') + assert validate_is_float("2.0") + assert validate_is_float("2.1") + assert validate_is_float("0.1") + assert validate_is_float("-0.5") + assert not validate_is_float("-0.5e") def test_validate_is_int(): - assert validate_is_int('2') - assert validate_is_int('6') - assert validate_is_int('-1') - assert validate_is_int('500') - assert not validate_is_int('2.0') - assert not validate_is_int('2.1') - assert not validate_is_int('-2.1') - assert not validate_is_int('-ee') + assert validate_is_int("2") + assert validate_is_int("6") + assert validate_is_int("-1") + assert validate_is_int("500") + assert not validate_is_int("2.0") + assert not validate_is_int("2.1") + assert not validate_is_int("-2.1") + assert not validate_is_int("-ee") -@pytest.mark.parametrize('exchange', ['bybit', 'binance', 'kraken']) +@pytest.mark.parametrize("exchange", ["bybit", "binance", "kraken"]) def test_start_new_config(mocker, caplog, exchange): wt_mock = mocker.patch.object(Path, "write_text", MagicMock()) mocker.patch.object(Path, "exists", MagicMock(return_value=True)) unlink_mock = mocker.patch.object(Path, "unlink", MagicMock()) - mocker.patch('freqtrade.commands.build_config_commands.ask_user_overwrite', return_value=True) + mocker.patch("freqtrade.commands.build_config_commands.ask_user_overwrite", return_value=True) sample_selections = { - 'max_open_trades': 3, - 'stake_currency': 'USDT', - 'stake_amount': 100, - 'fiat_display_currency': 'EUR', - 'timeframe': '15m', - 'dry_run': True, - 'trading_mode': 'spot', - 'margin_mode': '', - 'exchange_name': exchange, - 'exchange_key': 'sampleKey', - 'exchange_secret': 'Samplesecret', - 'telegram': False, - 'telegram_token': 'asdf1244', - 'telegram_chat_id': '1144444', - 'api_server': False, - 'api_server_listen_addr': '127.0.0.1', - 'api_server_username': 'freqtrader', - 'api_server_password': 'MoneyMachine', + "max_open_trades": 3, + "stake_currency": "USDT", + "stake_amount": 100, + "fiat_display_currency": "EUR", + "timeframe": "15m", + "dry_run": True, + "trading_mode": "spot", + "margin_mode": "", + "exchange_name": exchange, + "exchange_key": "sampleKey", + "exchange_secret": "Samplesecret", + "telegram": False, + "telegram_token": "asdf1244", + "telegram_chat_id": "1144444", + "api_server": False, + "api_server_listen_addr": "127.0.0.1", + "api_server_username": "freqtrader", + "api_server_password": "MoneyMachine", } - mocker.patch('freqtrade.commands.build_config_commands.ask_user_config', - return_value=sample_selections) - args = [ - "new-config", - "--config", - "coolconfig.json" - ] + mocker.patch( + "freqtrade.commands.build_config_commands.ask_user_config", return_value=sample_selections + ) + args = ["new-config", "--config", "coolconfig.json"] start_new_config(get_args(args)) assert log_has_re("Writing config to .*", caplog) assert wt_mock.call_count == 1 assert unlink_mock.call_count == 1 - result = rapidjson.loads(wt_mock.call_args_list[0][0][0], - parse_mode=rapidjson.PM_COMMENTS | rapidjson.PM_TRAILING_COMMAS) - assert result['exchange']['name'] == exchange - assert result['timeframe'] == '15m' + result = rapidjson.loads( + wt_mock.call_args_list[0][0][0], + parse_mode=rapidjson.PM_COMMENTS | rapidjson.PM_TRAILING_COMMAS, + ) + assert result["exchange"]["name"] == exchange + assert result["timeframe"] == "15m" def test_start_new_config_exists(mocker, caplog): mocker.patch.object(Path, "exists", MagicMock(return_value=True)) - mocker.patch('freqtrade.commands.build_config_commands.ask_user_overwrite', return_value=False) - args = [ - "new-config", - "--config", - "coolconfig.json" - ] + mocker.patch("freqtrade.commands.build_config_commands.ask_user_overwrite", return_value=False) + args = ["new-config", "--config", "coolconfig.json"] with pytest.raises(OperationalException, match=r"Configuration .* already exists\."): start_new_config(get_args(args)) @@ -95,15 +90,17 @@ def test_ask_user_overwrite(mocker): """ Once https://github.com/tmbo/questionary/issues/35 is implemented, improve this test. """ - prompt_mock = mocker.patch('freqtrade.commands.build_config_commands.prompt', - return_value={'overwrite': False}) - assert not ask_user_overwrite(Path('test.json')) + prompt_mock = mocker.patch( + "freqtrade.commands.build_config_commands.prompt", return_value={"overwrite": False} + ) + assert not ask_user_overwrite(Path("test.json")) assert prompt_mock.call_count == 1 prompt_mock.reset_mock() - prompt_mock = mocker.patch('freqtrade.commands.build_config_commands.prompt', - return_value={'overwrite': True}) - assert ask_user_overwrite(Path('test.json')) + prompt_mock = mocker.patch( + "freqtrade.commands.build_config_commands.prompt", return_value={"overwrite": True} + ) + assert ask_user_overwrite(Path("test.json")) assert prompt_mock.call_count == 1 @@ -111,14 +108,14 @@ def test_ask_user_config(mocker): """ Once https://github.com/tmbo/questionary/issues/35 is implemented, improve this test. """ - prompt_mock = mocker.patch('freqtrade.commands.build_config_commands.prompt', - return_value={'overwrite': False}) + prompt_mock = mocker.patch( + "freqtrade.commands.build_config_commands.prompt", return_value={"overwrite": False} + ) answers = ask_user_config() assert isinstance(answers, dict) assert prompt_mock.call_count == 1 - prompt_mock = mocker.patch('freqtrade.commands.build_config_commands.prompt', - return_value={}) + prompt_mock = mocker.patch("freqtrade.commands.build_config_commands.prompt", return_value={}) with pytest.raises(OperationalException, match=r"User interrupted interactive questions\."): ask_user_config() diff --git a/tests/commands/test_commands.py b/tests/commands/test_commands.py index 4ec530915..82d3d3246 100644 --- a/tests/commands/test_commands.py +++ b/tests/commands/test_commands.py @@ -59,33 +59,33 @@ from tests.conftest_trades import MOCK_TRADE_COUNT def test_setup_utils_configuration(): args = [ - 'list-exchanges', '--config', 'tests/testdata/testconfigs/main_test_config.json', + "list-exchanges", + "--config", + "tests/testdata/testconfigs/main_test_config.json", ] config = setup_utils_configuration(get_args(args), RunMode.OTHER) assert "exchange" in config - assert config['dry_run'] is True + assert config["dry_run"] is True args = [ - 'list-exchanges', '--config', 'tests/testdata/testconfigs/testconfig.json', + "list-exchanges", + "--config", + "tests/testdata/testconfigs/testconfig.json", ] config = setup_utils_configuration(get_args(args), RunMode.OTHER, set_dry=False) assert "exchange" in config - assert config['dry_run'] is False + assert config["dry_run"] is False def test_start_trading_fail(mocker, caplog): - mocker.patch("freqtrade.worker.Worker.run", MagicMock(side_effect=OperationalException)) mocker.patch("freqtrade.worker.Worker.__init__", MagicMock(return_value=None)) exitmock = mocker.patch("freqtrade.worker.Worker.exit", MagicMock()) - args = [ - 'trade', - '-c', 'tests/testdata/testconfigs/main_test_config.json' - ] + args = ["trade", "-c", "tests/testdata/testconfigs/main_test_config.json"] with pytest.raises(OperationalException): start_trading(get_args(args)) assert exitmock.call_count == 1 @@ -99,19 +99,16 @@ def test_start_trading_fail(mocker, caplog): def test_start_webserver(mocker, caplog): + api_server_mock = mocker.patch( + "freqtrade.rpc.api_server.ApiServer", + ) - api_server_mock = mocker.patch("freqtrade.rpc.api_server.ApiServer", ) - - args = [ - 'webserver', - '-c', 'tests/testdata/testconfigs/main_test_config.json' - ] + args = ["webserver", "-c", "tests/testdata/testconfigs/main_test_config.json"] start_webserver(get_args(args)) assert api_server_mock.call_count == 1 def test_list_exchanges(capsys): - args = [ "list-exchanges", ] @@ -161,72 +158,79 @@ def test_list_exchanges(capsys): def test_list_timeframes(mocker, capsys): - api_mock = MagicMock() - api_mock.timeframes = {'1m': 'oneMin', - '5m': 'fiveMin', - '30m': 'thirtyMin', - '1h': 'hour', - '1d': 'day', - } - patch_exchange(mocker, api_mock=api_mock, id='bybit') + api_mock.timeframes = { + "1m": "oneMin", + "5m": "fiveMin", + "30m": "thirtyMin", + "1h": "hour", + "1d": "day", + } + patch_exchange(mocker, api_mock=api_mock, id="bybit") args = [ "list-timeframes", ] pargs = get_args(args) - pargs['config'] = None - with pytest.raises(OperationalException, - match=r"This command requires a configured exchange.*"): + pargs["config"] = None + with pytest.raises( + OperationalException, match=r"This command requires a configured exchange.*" + ): start_list_timeframes(pargs) # Test with --config tests/testdata/testconfigs/main_test_config.json args = [ "list-timeframes", - '--config', 'tests/testdata/testconfigs/main_test_config.json', + "--config", + "tests/testdata/testconfigs/main_test_config.json", ] start_list_timeframes(get_args(args)) captured = capsys.readouterr() - assert re.match("Timeframes available for the exchange `Bybit`: " - "1m, 5m, 30m, 1h, 1d", - captured.out) + assert re.match( + "Timeframes available for the exchange `Bybit`: " "1m, 5m, 30m, 1h, 1d", captured.out + ) # Test with --exchange bybit args = [ "list-timeframes", - "--exchange", "bybit", + "--exchange", + "bybit", ] start_list_timeframes(get_args(args)) captured = capsys.readouterr() - assert re.match("Timeframes available for the exchange `Bybit`: " - "1m, 5m, 30m, 1h, 1d", - captured.out) + assert re.match( + "Timeframes available for the exchange `Bybit`: " "1m, 5m, 30m, 1h, 1d", captured.out + ) - api_mock.timeframes = {'1m': '1m', - '5m': '5m', - '15m': '15m', - '30m': '30m', - '1h': '1h', - '6h': '6h', - '12h': '12h', - '1d': '1d', - '3d': '3d', - } - patch_exchange(mocker, api_mock=api_mock, id='binance') + api_mock.timeframes = { + "1m": "1m", + "5m": "5m", + "15m": "15m", + "30m": "30m", + "1h": "1h", + "6h": "6h", + "12h": "12h", + "1d": "1d", + "3d": "3d", + } + patch_exchange(mocker, api_mock=api_mock, id="binance") # Test with --exchange binance args = [ "list-timeframes", - "--exchange", "binance", + "--exchange", + "binance", ] start_list_timeframes(get_args(args)) captured = capsys.readouterr() - assert re.match("Timeframes available for the exchange `Binance`: " - "1m, 5m, 15m, 30m, 1h, 6h, 12h, 1d, 3d", - captured.out) + assert re.match( + "Timeframes available for the exchange `Binance`: " "1m, 5m, 15m, 30m, 1h, 6h, 12h, 1d, 3d", + captured.out, + ) # Test with --one-column args = [ "list-timeframes", - '--config', 'tests/testdata/testconfigs/main_test_config.json', + "--config", + "tests/testdata/testconfigs/main_test_config.json", "--one-column", ] start_list_timeframes(get_args(args)) @@ -239,7 +243,8 @@ def test_list_timeframes(mocker, capsys): # Test with --exchange binance --one-column args = [ "list-timeframes", - "--exchange", "binance", + "--exchange", + "binance", "--one-column", ] start_list_timeframes(get_args(args)) @@ -251,259 +256,311 @@ def test_list_timeframes(mocker, capsys): def test_list_markets(mocker, markets_static, capsys): - api_mock = MagicMock() - patch_exchange(mocker, api_mock=api_mock, id='binance', mock_markets=markets_static) + patch_exchange(mocker, api_mock=api_mock, id="binance", mock_markets=markets_static) # Test with no --config args = [ "list-markets", ] pargs = get_args(args) - pargs['config'] = None - with pytest.raises(OperationalException, - match=r"This command requires a configured exchange.*"): + pargs["config"] = None + with pytest.raises( + OperationalException, match=r"This command requires a configured exchange.*" + ): start_list_markets(pargs, False) # Test with --config tests/testdata/testconfigs/main_test_config.json args = [ "list-markets", - '--config', 'tests/testdata/testconfigs/main_test_config.json', + "--config", + "tests/testdata/testconfigs/main_test_config.json", "--print-list", ] start_list_markets(get_args(args), False) captured = capsys.readouterr() - assert ("Exchange Binance has 12 active markets: " - "ADA/USDT:USDT, BLK/BTC, ETH/BTC, ETH/USDT, ETH/USDT:USDT, LTC/BTC, " - "LTC/ETH, LTC/USD, NEO/BTC, TKN/BTC, XLTCUSDT, XRP/BTC.\n" - in captured.out) + assert ( + "Exchange Binance has 12 active markets: " + "ADA/USDT:USDT, BLK/BTC, ETH/BTC, ETH/USDT, ETH/USDT:USDT, LTC/BTC, " + "LTC/ETH, LTC/USD, NEO/BTC, TKN/BTC, XLTCUSDT, XRP/BTC.\n" in captured.out + ) patch_exchange(mocker, api_mock=api_mock, id="binance", mock_markets=markets_static) # Test with --exchange - args = [ - "list-markets", - "--exchange", "binance" - ] + args = ["list-markets", "--exchange", "binance"] pargs = get_args(args) - pargs['config'] = None + pargs["config"] = None start_list_markets(pargs, False) captured = capsys.readouterr() - assert re.match("\nExchange Binance has 12 active markets:\n", - captured.out) + assert re.match("\nExchange Binance has 12 active markets:\n", captured.out) patch_exchange(mocker, api_mock=api_mock, id="binance", mock_markets=markets_static) # Test with --all: all markets args = [ - "list-markets", "--all", - '--config', 'tests/testdata/testconfigs/main_test_config.json', + "list-markets", + "--all", + "--config", + "tests/testdata/testconfigs/main_test_config.json", "--print-list", ] start_list_markets(get_args(args), False) captured = capsys.readouterr() - assert ("Exchange Binance has 14 markets: " - "ADA/USDT:USDT, BLK/BTC, BTT/BTC, ETH/BTC, ETH/USDT, ETH/USDT:USDT, " - "LTC/BTC, LTC/ETH, LTC/USD, LTC/USDT, NEO/BTC, TKN/BTC, XLTCUSDT, XRP/BTC.\n" - in captured.out) + assert ( + "Exchange Binance has 14 markets: " + "ADA/USDT:USDT, BLK/BTC, BTT/BTC, ETH/BTC, ETH/USDT, ETH/USDT:USDT, " + "LTC/BTC, LTC/ETH, LTC/USD, LTC/USDT, NEO/BTC, TKN/BTC, XLTCUSDT, XRP/BTC.\n" + in captured.out + ) # Test list-pairs subcommand: active pairs args = [ "list-pairs", - '--config', 'tests/testdata/testconfigs/main_test_config.json', + "--config", + "tests/testdata/testconfigs/main_test_config.json", "--print-list", ] start_list_markets(get_args(args), True) captured = capsys.readouterr() - assert ("Exchange Binance has 9 active pairs: " - "BLK/BTC, ETH/BTC, ETH/USDT, LTC/BTC, LTC/ETH, LTC/USD, NEO/BTC, TKN/BTC, XRP/BTC.\n" - in captured.out) + assert ( + "Exchange Binance has 9 active pairs: " + "BLK/BTC, ETH/BTC, ETH/USDT, LTC/BTC, LTC/ETH, LTC/USD, NEO/BTC, TKN/BTC, XRP/BTC.\n" + in captured.out + ) # Test list-pairs subcommand with --all: all pairs args = [ - "list-pairs", "--all", - '--config', 'tests/testdata/testconfigs/main_test_config.json', + "list-pairs", + "--all", + "--config", + "tests/testdata/testconfigs/main_test_config.json", "--print-list", ] start_list_markets(get_args(args), True) captured = capsys.readouterr() - assert ("Exchange Binance has 11 pairs: " - "BLK/BTC, BTT/BTC, ETH/BTC, ETH/USDT, LTC/BTC, LTC/ETH, LTC/USD, LTC/USDT, NEO/BTC, " - "TKN/BTC, XRP/BTC.\n" - in captured.out) + assert ( + "Exchange Binance has 11 pairs: " + "BLK/BTC, BTT/BTC, ETH/BTC, ETH/USDT, LTC/BTC, LTC/ETH, LTC/USD, LTC/USDT, NEO/BTC, " + "TKN/BTC, XRP/BTC.\n" in captured.out + ) # active markets, base=ETH, LTC args = [ "list-markets", - '--config', 'tests/testdata/testconfigs/main_test_config.json', - "--base", "ETH", "LTC", + "--config", + "tests/testdata/testconfigs/main_test_config.json", + "--base", + "ETH", + "LTC", "--print-list", ] start_list_markets(get_args(args), False) captured = capsys.readouterr() - assert ("Exchange Binance has 7 active markets with ETH, LTC as base currencies: " - "ETH/BTC, ETH/USDT, ETH/USDT:USDT, LTC/BTC, LTC/ETH, LTC/USD, XLTCUSDT.\n" - in captured.out) + assert ( + "Exchange Binance has 7 active markets with ETH, LTC as base currencies: " + "ETH/BTC, ETH/USDT, ETH/USDT:USDT, LTC/BTC, LTC/ETH, LTC/USD, XLTCUSDT.\n" in captured.out + ) # active markets, base=LTC args = [ "list-markets", - '--config', 'tests/testdata/testconfigs/main_test_config.json', - "--base", "LTC", + "--config", + "tests/testdata/testconfigs/main_test_config.json", + "--base", + "LTC", "--print-list", ] start_list_markets(get_args(args), False) captured = capsys.readouterr() - assert ("Exchange Binance has 4 active markets with LTC as base currency: " - "LTC/BTC, LTC/ETH, LTC/USD, XLTCUSDT.\n" - in captured.out) + assert ( + "Exchange Binance has 4 active markets with LTC as base currency: " + "LTC/BTC, LTC/ETH, LTC/USD, XLTCUSDT.\n" in captured.out + ) # active markets, quote=USDT, USD args = [ "list-markets", - '--config', 'tests/testdata/testconfigs/main_test_config.json', - "--quote", "USDT", "USD", + "--config", + "tests/testdata/testconfigs/main_test_config.json", + "--quote", + "USDT", + "USD", "--print-list", ] start_list_markets(get_args(args), False) captured = capsys.readouterr() - assert ("Exchange Binance has 5 active markets with USDT, USD as quote currencies: " - "ADA/USDT:USDT, ETH/USDT, ETH/USDT:USDT, LTC/USD, XLTCUSDT.\n" - in captured.out) + assert ( + "Exchange Binance has 5 active markets with USDT, USD as quote currencies: " + "ADA/USDT:USDT, ETH/USDT, ETH/USDT:USDT, LTC/USD, XLTCUSDT.\n" in captured.out + ) # active markets, quote=USDT args = [ "list-markets", - '--config', 'tests/testdata/testconfigs/main_test_config.json', - "--quote", "USDT", + "--config", + "tests/testdata/testconfigs/main_test_config.json", + "--quote", + "USDT", "--print-list", ] start_list_markets(get_args(args), False) captured = capsys.readouterr() - assert ("Exchange Binance has 4 active markets with USDT as quote currency: " - "ADA/USDT:USDT, ETH/USDT, ETH/USDT:USDT, XLTCUSDT.\n" - in captured.out) + assert ( + "Exchange Binance has 4 active markets with USDT as quote currency: " + "ADA/USDT:USDT, ETH/USDT, ETH/USDT:USDT, XLTCUSDT.\n" in captured.out + ) # active markets, base=LTC, quote=USDT args = [ "list-markets", - '--config', 'tests/testdata/testconfigs/main_test_config.json', - "--base", "LTC", "--quote", "USDT", + "--config", + "tests/testdata/testconfigs/main_test_config.json", + "--base", + "LTC", + "--quote", + "USDT", "--print-list", ] start_list_markets(get_args(args), False) captured = capsys.readouterr() - assert ("Exchange Binance has 1 active market with LTC as base currency and " - "with USDT as quote currency: XLTCUSDT.\n" - in captured.out) + assert ( + "Exchange Binance has 1 active market with LTC as base currency and " + "with USDT as quote currency: XLTCUSDT.\n" in captured.out + ) # active pairs, base=LTC, quote=USDT args = [ "list-pairs", - '--config', 'tests/testdata/testconfigs/main_test_config.json', - "--base", "LTC", "--quote", "USD", + "--config", + "tests/testdata/testconfigs/main_test_config.json", + "--base", + "LTC", + "--quote", + "USD", "--print-list", ] start_list_markets(get_args(args), True) captured = capsys.readouterr() - assert ("Exchange Binance has 1 active pair with LTC as base currency and " - "with USD as quote currency: LTC/USD.\n" - in captured.out) + assert ( + "Exchange Binance has 1 active pair with LTC as base currency and " + "with USD as quote currency: LTC/USD.\n" in captured.out + ) # active markets, base=LTC, quote=USDT, NONEXISTENT args = [ "list-markets", - '--config', 'tests/testdata/testconfigs/main_test_config.json', - "--base", "LTC", "--quote", "USDT", "NONEXISTENT", + "--config", + "tests/testdata/testconfigs/main_test_config.json", + "--base", + "LTC", + "--quote", + "USDT", + "NONEXISTENT", "--print-list", ] start_list_markets(get_args(args), False) captured = capsys.readouterr() - assert ("Exchange Binance has 1 active market with LTC as base currency and " - "with USDT, NONEXISTENT as quote currencies: XLTCUSDT.\n" - in captured.out) + assert ( + "Exchange Binance has 1 active market with LTC as base currency and " + "with USDT, NONEXISTENT as quote currencies: XLTCUSDT.\n" in captured.out + ) # active markets, base=LTC, quote=NONEXISTENT args = [ "list-markets", - '--config', 'tests/testdata/testconfigs/main_test_config.json', - "--base", "LTC", "--quote", "NONEXISTENT", + "--config", + "tests/testdata/testconfigs/main_test_config.json", + "--base", + "LTC", + "--quote", + "NONEXISTENT", "--print-list", ] start_list_markets(get_args(args), False) captured = capsys.readouterr() - assert ("Exchange Binance has 0 active markets with LTC as base currency and " - "with NONEXISTENT as quote currency.\n" - in captured.out) + assert ( + "Exchange Binance has 0 active markets with LTC as base currency and " + "with NONEXISTENT as quote currency.\n" in captured.out + ) # Test tabular output args = [ "list-markets", - '--config', 'tests/testdata/testconfigs/main_test_config.json', + "--config", + "tests/testdata/testconfigs/main_test_config.json", ] start_list_markets(get_args(args), False) captured = capsys.readouterr() - assert ("Exchange Binance has 12 active markets:\n" - in captured.out) + assert "Exchange Binance has 12 active markets:\n" in captured.out # Test tabular output, no markets found args = [ "list-markets", - '--config', 'tests/testdata/testconfigs/main_test_config.json', - "--base", "LTC", "--quote", "NONEXISTENT", + "--config", + "tests/testdata/testconfigs/main_test_config.json", + "--base", + "LTC", + "--quote", + "NONEXISTENT", ] start_list_markets(get_args(args), False) captured = capsys.readouterr() - assert ("Exchange Binance has 0 active markets with LTC as base currency and " - "with NONEXISTENT as quote currency.\n" - in captured.out) + assert ( + "Exchange Binance has 0 active markets with LTC as base currency and " + "with NONEXISTENT as quote currency.\n" in captured.out + ) # Test --print-json args = [ "list-markets", - '--config', 'tests/testdata/testconfigs/main_test_config.json', - "--print-json" + "--config", + "tests/testdata/testconfigs/main_test_config.json", + "--print-json", ] start_list_markets(get_args(args), False) captured = capsys.readouterr() - assert ('["ADA/USDT:USDT","BLK/BTC","ETH/BTC","ETH/USDT","ETH/USDT:USDT",' - '"LTC/BTC","LTC/ETH","LTC/USD","NEO/BTC","TKN/BTC","XLTCUSDT","XRP/BTC"]' - in captured.out) + assert ( + '["ADA/USDT:USDT","BLK/BTC","ETH/BTC","ETH/USDT","ETH/USDT:USDT",' + '"LTC/BTC","LTC/ETH","LTC/USD","NEO/BTC","TKN/BTC","XLTCUSDT","XRP/BTC"]' in captured.out + ) # Test --print-csv args = [ "list-markets", - '--config', 'tests/testdata/testconfigs/main_test_config.json', - "--print-csv" + "--config", + "tests/testdata/testconfigs/main_test_config.json", + "--print-csv", ] start_list_markets(get_args(args), False) captured = capsys.readouterr() - assert ("Id,Symbol,Base,Quote,Active,Spot,Margin,Future,Leverage" in captured.out) - assert ("blkbtc,BLK/BTC,BLK,BTC,True,Spot" in captured.out) - assert ("USD-LTC,LTC/USD,LTC,USD,True,Spot" in captured.out) + assert "Id,Symbol,Base,Quote,Active,Spot,Margin,Future,Leverage" in captured.out + assert "blkbtc,BLK/BTC,BLK,BTC,True,Spot" in captured.out + assert "USD-LTC,LTC/USD,LTC,USD,True,Spot" in captured.out # Test --one-column args = [ "list-markets", - '--config', 'tests/testdata/testconfigs/main_test_config.json', - "--one-column" + "--config", + "tests/testdata/testconfigs/main_test_config.json", + "--one-column", ] start_list_markets(get_args(args), False) captured = capsys.readouterr() assert re.search(r"^BLK/BTC$", captured.out, re.MULTILINE) assert re.search(r"^LTC/USD$", captured.out, re.MULTILINE) - mocker.patch(f'{EXMS}.markets', PropertyMock(side_effect=ValueError)) + mocker.patch(f"{EXMS}.markets", PropertyMock(side_effect=ValueError)) # Test --one-column args = [ "list-markets", - '--config', 'tests/testdata/testconfigs/main_test_config.json', - "--one-column" + "--config", + "tests/testdata/testconfigs/main_test_config.json", + "--one-column", ] with pytest.raises(OperationalException, match=r"Cannot get markets.*"): start_list_markets(get_args(args), False) def test_create_datadir_failed(caplog): - args = [ "create-userdir", ] @@ -513,14 +570,9 @@ def test_create_datadir_failed(caplog): def test_create_datadir(caplog, mocker): - cud = mocker.patch("freqtrade.commands.deploy_commands.create_userdata_dir", MagicMock()) csf = mocker.patch("freqtrade.commands.deploy_commands.copy_sample_files", MagicMock()) - args = [ - "create-userdir", - "--userdir", - "/temp/freqtrade/test" - ] + args = ["create-userdir", "--userdir", "/temp/freqtrade/test"] start_create_userdir(get_args(args)) assert cud.call_count == 1 @@ -531,21 +583,18 @@ def test_start_new_strategy(mocker, caplog): wt_mock = mocker.patch.object(Path, "write_text", MagicMock()) mocker.patch.object(Path, "exists", MagicMock(return_value=False)) - args = [ - "new-strategy", - "--strategy", - "CoolNewStrategy" - ] + args = ["new-strategy", "--strategy", "CoolNewStrategy"] start_new_strategy(get_args(args)) assert wt_mock.call_count == 1 assert "CoolNewStrategy" in wt_mock.call_args_list[0][0][0] assert log_has_re("Writing strategy to .*", caplog) - mocker.patch('freqtrade.commands.deploy_commands.setup_utils_configuration') + mocker.patch("freqtrade.commands.deploy_commands.setup_utils_configuration") mocker.patch.object(Path, "exists", MagicMock(return_value=True)) - with pytest.raises(OperationalException, - match=r".* already exists. Please choose another Strategy Name\."): + with pytest.raises( + OperationalException, match=r".* already exists. Please choose another Strategy Name\." + ): start_new_strategy(get_args(args)) @@ -553,17 +602,18 @@ def test_start_new_strategy_no_arg(mocker, caplog): args = [ "new-strategy", ] - with pytest.raises(OperationalException, - match="`new-strategy` requires --strategy to be set."): + with pytest.raises(OperationalException, match="`new-strategy` requires --strategy to be set."): start_new_strategy(get_args(args)) def test_start_install_ui(mocker): - clean_mock = mocker.patch('freqtrade.commands.deploy_commands.clean_ui_subdir') - get_url_mock = mocker.patch('freqtrade.commands.deploy_commands.get_ui_download_url', - return_value=('https://example.com/whatever', '0.0.1')) - download_mock = mocker.patch('freqtrade.commands.deploy_commands.download_and_install_ui') - mocker.patch('freqtrade.commands.deploy_commands.read_ui_version', return_value=None) + clean_mock = mocker.patch("freqtrade.commands.deploy_commands.clean_ui_subdir") + get_url_mock = mocker.patch( + "freqtrade.commands.deploy_commands.get_ui_download_url", + return_value=("https://example.com/whatever", "0.0.1"), + ) + download_mock = mocker.patch("freqtrade.commands.deploy_commands.download_and_install_ui") + mocker.patch("freqtrade.commands.deploy_commands.read_ui_version", return_value=None) args = [ "install-ui", ] @@ -587,15 +637,15 @@ def test_start_install_ui(mocker): def test_clean_ui_subdir(mocker, tmp_path, caplog): - mocker.patch("freqtrade.commands.deploy_commands.Path.is_dir", - side_effect=[True, True]) - mocker.patch("freqtrade.commands.deploy_commands.Path.is_file", - side_effect=[False, True]) + mocker.patch("freqtrade.commands.deploy_commands.Path.is_dir", side_effect=[True, True]) + mocker.patch("freqtrade.commands.deploy_commands.Path.is_file", side_effect=[False, True]) rd_mock = mocker.patch("freqtrade.commands.deploy_commands.Path.rmdir") ul_mock = mocker.patch("freqtrade.commands.deploy_commands.Path.unlink") - mocker.patch("freqtrade.commands.deploy_commands.Path.glob", - return_value=[Path('test1'), Path('test2'), Path('.gitkeep')]) + mocker.patch( + "freqtrade.commands.deploy_commands.Path.glob", + return_value=[Path("test1"), Path("test2"), Path(".gitkeep")], + ) folder = tmp_path / "uitests" clean_ui_subdir(folder) assert log_has("Removing UI directory content.", caplog) @@ -607,16 +657,15 @@ def test_download_and_install_ui(mocker, tmp_path): # Create zipfile requests_mock = MagicMock() file_like_object = BytesIO() - with ZipFile(file_like_object, mode='w') as zipfile: - for file in ('test1.txt', 'hello/', 'test2.txt'): + with ZipFile(file_like_object, mode="w") as zipfile: + for file in ("test1.txt", "hello/", "test2.txt"): zipfile.writestr(file, file) file_like_object.seek(0) requests_mock.content = file_like_object.read() mocker.patch("freqtrade.commands.deploy_commands.requests.get", return_value=requests_mock) - mocker.patch("freqtrade.commands.deploy_commands.Path.is_dir", - side_effect=[True, False]) + mocker.patch("freqtrade.commands.deploy_commands.Path.is_dir", side_effect=[True, False]) wb_mock = mocker.patch("freqtrade.commands.deploy_commands.Path.write_bytes") folder = tmp_path / "uitests_dl" @@ -624,24 +673,28 @@ def test_download_and_install_ui(mocker, tmp_path): assert read_ui_version(folder) is None - download_and_install_ui(folder, 'http://whatever.xxx/download/file.zip', '22') + download_and_install_ui(folder, "http://whatever.xxx/download/file.zip", "22") assert wb_mock.call_count == 2 - assert read_ui_version(folder) == '22' + assert read_ui_version(folder) == "22" def test_get_ui_download_url(mocker): response = MagicMock() response.json = MagicMock( - side_effect=[[{'assets_url': 'http://whatever.json', 'name': '0.0.1'}], - [{'browser_download_url': 'http://download.zip'}]]) - get_mock = mocker.patch("freqtrade.commands.deploy_commands.requests.get", - return_value=response) + side_effect=[ + [{"assets_url": "http://whatever.json", "name": "0.0.1"}], + [{"browser_download_url": "http://download.zip"}], + ] + ) + get_mock = mocker.patch( + "freqtrade.commands.deploy_commands.requests.get", return_value=response + ) x, last_version = get_ui_download_url() assert get_mock.call_count == 2 - assert last_version == '0.0.1' - assert x == 'http://download.zip' + assert last_version == "0.0.1" + assert x == "http://download.zip" def test_get_ui_download_url_direct(mocker): @@ -649,46 +702,53 @@ def test_get_ui_download_url_direct(mocker): response.json = MagicMock( return_value=[ { - 'assets_url': 'http://whatever.json', - 'name': '0.0.2', - 'assets': [{'browser_download_url': 'http://download22.zip'}] + "assets_url": "http://whatever.json", + "name": "0.0.2", + "assets": [{"browser_download_url": "http://download22.zip"}], }, { - 'assets_url': 'http://whatever.json', - 'name': '0.0.1', - 'assets': [{'browser_download_url': 'http://download1.zip'}] + "assets_url": "http://whatever.json", + "name": "0.0.1", + "assets": [{"browser_download_url": "http://download1.zip"}], }, - ]) - get_mock = mocker.patch("freqtrade.commands.deploy_commands.requests.get", - return_value=response) + ] + ) + get_mock = mocker.patch( + "freqtrade.commands.deploy_commands.requests.get", return_value=response + ) x, last_version = get_ui_download_url() assert get_mock.call_count == 1 - assert last_version == '0.0.2' - assert x == 'http://download22.zip' + assert last_version == "0.0.2" + assert x == "http://download22.zip" get_mock.reset_mock() response.json.reset_mock() - x, last_version = get_ui_download_url('0.0.1') - assert last_version == '0.0.1' - assert x == 'http://download1.zip' + x, last_version = get_ui_download_url("0.0.1") + assert last_version == "0.0.1" + assert x == "http://download1.zip" with pytest.raises(ValueError, match="UI-Version not found."): - x, last_version = get_ui_download_url('0.0.3') + x, last_version = get_ui_download_url("0.0.3") def test_download_data_keyboardInterrupt(mocker, markets): - dl_mock = mocker.patch('freqtrade.commands.data_commands.download_data_main', - MagicMock(side_effect=KeyboardInterrupt)) + dl_mock = mocker.patch( + "freqtrade.commands.data_commands.download_data_main", + MagicMock(side_effect=KeyboardInterrupt), + ) patch_exchange(mocker) - mocker.patch(f'{EXMS}.markets', PropertyMock(return_value=markets)) + mocker.patch(f"{EXMS}.markets", PropertyMock(return_value=markets)) args = [ "download-data", - "--exchange", "binance", - "--pairs", "ETH/BTC", "XRP/BTC", + "--exchange", + "binance", + "--pairs", + "ETH/BTC", + "XRP/BTC", ] with pytest.raises(SystemExit): pargs = get_args(args) - pargs['config'] = None + pargs["config"] = None start_download_data(pargs) @@ -696,120 +756,140 @@ def test_download_data_keyboardInterrupt(mocker, markets): def test_download_data_timerange(mocker, markets): - dl_mock = mocker.patch('freqtrade.data.history.history_utils.refresh_backtest_ohlcv_data', - MagicMock(return_value=["ETH/BTC", "XRP/BTC"])) + dl_mock = mocker.patch( + "freqtrade.data.history.history_utils.refresh_backtest_ohlcv_data", + MagicMock(return_value=["ETH/BTC", "XRP/BTC"]), + ) patch_exchange(mocker) - mocker.patch(f'{EXMS}.markets', PropertyMock(return_value=markets)) - args = [ - "download-data", - "--exchange", "binance", - "--pairs", "ETH/BTC", "XRP/BTC", - "--days", "20", - "--timerange", "20200101-" - ] - with pytest.raises(OperationalException, - match=r"--days and --timerange are mutually.*"): - pargs = get_args(args) - pargs['config'] = None - start_download_data(pargs) - assert dl_mock.call_count == 0 - - args = [ - "download-data", - "--exchange", "binance", - "--pairs", "ETH/BTC", "XRP/BTC", - "--days", "20", - ] - pargs = get_args(args) - pargs['config'] = None - start_download_data(pargs) - assert dl_mock.call_count == 1 - # 20days ago - days_ago = dt_floor_day(dt_now() - timedelta(days=20)).timestamp() - assert dl_mock.call_args_list[0][1]['timerange'].startts == days_ago - - dl_mock.reset_mock() - args = [ - "download-data", - "--exchange", "binance", - "--pairs", "ETH/BTC", "XRP/BTC", - "--timerange", "20200101-" - ] - pargs = get_args(args) - pargs['config'] = None - start_download_data(pargs) - assert dl_mock.call_count == 1 - - assert dl_mock.call_args_list[0][1]['timerange'].startts == int(dt_utc(2020, 1, 1).timestamp()) - - -def test_download_data_no_markets(mocker, caplog): - dl_mock = mocker.patch('freqtrade.data.history.history_utils.refresh_backtest_ohlcv_data', - MagicMock(return_value=["ETH/BTC", "XRP/BTC"])) - patch_exchange(mocker, id='binance') - mocker.patch(f'{EXMS}.get_markets', return_value={}) - args = [ - "download-data", - "--exchange", "binance", - "--pairs", "ETH/BTC", "XRP/BTC", - "--days", "20" - ] - start_download_data(get_args(args)) - assert dl_mock.call_args[1]['timerange'].starttype == "date" - assert log_has("Pairs [ETH/BTC,XRP/BTC] not available on exchange Binance.", caplog) - - -def test_download_data_no_exchange(mocker): - mocker.patch('freqtrade.data.history.history_utils.refresh_backtest_ohlcv_data', - MagicMock(return_value=["ETH/BTC", "XRP/BTC"])) - patch_exchange(mocker) - mocker.patch(f'{EXMS}.get_markets', return_value={}) - args = [ - "download-data", - ] - pargs = get_args(args) - pargs['config'] = None - with pytest.raises(OperationalException, - match=r"This command requires a configured exchange.*"): - start_download_data(pargs) - - -def test_download_data_no_pairs(mocker): - - mocker.patch('freqtrade.data.history.history_utils.refresh_backtest_ohlcv_data', - MagicMock(return_value=["ETH/BTC", "XRP/BTC"])) - patch_exchange(mocker) - mocker.patch(f'{EXMS}.markets', PropertyMock(return_value={})) - args = [ - "download-data", - "--exchange", - "binance", - ] - pargs = get_args(args) - pargs['config'] = None - with pytest.raises(OperationalException, - match=r"Downloading data requires a list of pairs\..*"): - start_download_data(pargs) - - -def test_download_data_all_pairs(mocker, markets): - - dl_mock = mocker.patch('freqtrade.data.history.history_utils.refresh_backtest_ohlcv_data', - MagicMock(return_value=["ETH/BTC", "XRP/BTC"])) - patch_exchange(mocker) - mocker.patch(f'{EXMS}.markets', PropertyMock(return_value=markets)) + mocker.patch(f"{EXMS}.markets", PropertyMock(return_value=markets)) args = [ "download-data", "--exchange", "binance", "--pairs", - ".*/USDT" + "ETH/BTC", + "XRP/BTC", + "--days", + "20", + "--timerange", + "20200101-", + ] + with pytest.raises(OperationalException, match=r"--days and --timerange are mutually.*"): + pargs = get_args(args) + pargs["config"] = None + start_download_data(pargs) + assert dl_mock.call_count == 0 + + args = [ + "download-data", + "--exchange", + "binance", + "--pairs", + "ETH/BTC", + "XRP/BTC", + "--days", + "20", ] pargs = get_args(args) - pargs['config'] = None + pargs["config"] = None start_download_data(pargs) - expected = set(['BTC/USDT', 'ETH/USDT', 'XRP/USDT', 'NEO/USDT', 'TKN/USDT']) - assert set(dl_mock.call_args_list[0][1]['pairs']) == expected + assert dl_mock.call_count == 1 + # 20days ago + days_ago = dt_floor_day(dt_now() - timedelta(days=20)).timestamp() + assert dl_mock.call_args_list[0][1]["timerange"].startts == days_ago + + dl_mock.reset_mock() + args = [ + "download-data", + "--exchange", + "binance", + "--pairs", + "ETH/BTC", + "XRP/BTC", + "--timerange", + "20200101-", + ] + pargs = get_args(args) + pargs["config"] = None + start_download_data(pargs) + assert dl_mock.call_count == 1 + + assert dl_mock.call_args_list[0][1]["timerange"].startts == int(dt_utc(2020, 1, 1).timestamp()) + + +def test_download_data_no_markets(mocker, caplog): + dl_mock = mocker.patch( + "freqtrade.data.history.history_utils.refresh_backtest_ohlcv_data", + MagicMock(return_value=["ETH/BTC", "XRP/BTC"]), + ) + patch_exchange(mocker, id="binance") + mocker.patch(f"{EXMS}.get_markets", return_value={}) + args = [ + "download-data", + "--exchange", + "binance", + "--pairs", + "ETH/BTC", + "XRP/BTC", + "--days", + "20", + ] + start_download_data(get_args(args)) + assert dl_mock.call_args[1]["timerange"].starttype == "date" + assert log_has("Pairs [ETH/BTC,XRP/BTC] not available on exchange Binance.", caplog) + + +def test_download_data_no_exchange(mocker): + mocker.patch( + "freqtrade.data.history.history_utils.refresh_backtest_ohlcv_data", + MagicMock(return_value=["ETH/BTC", "XRP/BTC"]), + ) + patch_exchange(mocker) + mocker.patch(f"{EXMS}.get_markets", return_value={}) + args = [ + "download-data", + ] + pargs = get_args(args) + pargs["config"] = None + with pytest.raises( + OperationalException, match=r"This command requires a configured exchange.*" + ): + start_download_data(pargs) + + +def test_download_data_no_pairs(mocker): + mocker.patch( + "freqtrade.data.history.history_utils.refresh_backtest_ohlcv_data", + MagicMock(return_value=["ETH/BTC", "XRP/BTC"]), + ) + patch_exchange(mocker) + mocker.patch(f"{EXMS}.markets", PropertyMock(return_value={})) + args = [ + "download-data", + "--exchange", + "binance", + ] + pargs = get_args(args) + pargs["config"] = None + with pytest.raises( + OperationalException, match=r"Downloading data requires a list of pairs\..*" + ): + start_download_data(pargs) + + +def test_download_data_all_pairs(mocker, markets): + dl_mock = mocker.patch( + "freqtrade.data.history.history_utils.refresh_backtest_ohlcv_data", + MagicMock(return_value=["ETH/BTC", "XRP/BTC"]), + ) + patch_exchange(mocker) + mocker.patch(f"{EXMS}.markets", PropertyMock(return_value=markets)) + args = ["download-data", "--exchange", "binance", "--pairs", ".*/USDT"] + pargs = get_args(args) + pargs["config"] = None + start_download_data(pargs) + expected = set(["BTC/USDT", "ETH/USDT", "XRP/USDT", "NEO/USDT", "TKN/USDT"]) + assert set(dl_mock.call_args_list[0][1]["pairs"]) == expected assert dl_mock.call_count == 1 dl_mock.reset_mock() @@ -822,79 +902,98 @@ def test_download_data_all_pairs(mocker, markets): "--include-inactive-pairs", ] pargs = get_args(args) - pargs['config'] = None + pargs["config"] = None start_download_data(pargs) - expected = set(['BTC/USDT', 'ETH/USDT', 'LTC/USDT', 'XRP/USDT', 'NEO/USDT', 'TKN/USDT']) - assert set(dl_mock.call_args_list[0][1]['pairs']) == expected + expected = set(["BTC/USDT", "ETH/USDT", "LTC/USDT", "XRP/USDT", "NEO/USDT", "TKN/USDT"]) + assert set(dl_mock.call_args_list[0][1]["pairs"]) == expected def test_download_data_trades(mocker): - dl_mock = mocker.patch('freqtrade.data.history.history_utils.refresh_backtest_trades_data', - MagicMock(return_value=[])) - convert_mock = mocker.patch('freqtrade.data.history.history_utils.convert_trades_to_ohlcv', - MagicMock(return_value=[])) + dl_mock = mocker.patch( + "freqtrade.data.history.history_utils.refresh_backtest_trades_data", + MagicMock(return_value=[]), + ) + convert_mock = mocker.patch( + "freqtrade.data.history.history_utils.convert_trades_to_ohlcv", MagicMock(return_value=[]) + ) patch_exchange(mocker) - mocker.patch(f'{EXMS}.get_markets', return_value={}) + mocker.patch(f"{EXMS}.get_markets", return_value={}) args = [ "download-data", - "--exchange", "kraken", - "--pairs", "ETH/BTC", "XRP/BTC", - "--days", "20", - "--dl-trades" + "--exchange", + "kraken", + "--pairs", + "ETH/BTC", + "XRP/BTC", + "--days", + "20", + "--dl-trades", ] pargs = get_args(args) - pargs['config'] = None + pargs["config"] = None start_download_data(pargs) - assert dl_mock.call_args[1]['timerange'].starttype == "date" + assert dl_mock.call_args[1]["timerange"].starttype == "date" assert dl_mock.call_count == 1 assert convert_mock.call_count == 1 args = [ "download-data", - "--exchange", "kraken", - "--pairs", "ETH/BTC", "XRP/BTC", - "--days", "20", - "--trading-mode", "futures", - "--dl-trades" + "--exchange", + "kraken", + "--pairs", + "ETH/BTC", + "XRP/BTC", + "--days", + "20", + "--trading-mode", + "futures", + "--dl-trades", ] def test_download_data_data_invalid(mocker): patch_exchange(mocker, id="kraken") - mocker.patch(f'{EXMS}.get_markets', return_value={}) + mocker.patch(f"{EXMS}.get_markets", return_value={}) args = [ "download-data", - "--exchange", "kraken", - "--pairs", "ETH/BTC", "XRP/BTC", - "--days", "20", + "--exchange", + "kraken", + "--pairs", + "ETH/BTC", + "XRP/BTC", + "--days", + "20", ] pargs = get_args(args) - pargs['config'] = None + pargs["config"] = None with pytest.raises(OperationalException, match=r"Historic klines not available for .*"): start_download_data(pargs) def test_start_convert_trades(mocker): - convert_mock = mocker.patch('freqtrade.commands.data_commands.convert_trades_to_ohlcv', - MagicMock(return_value=[])) + convert_mock = mocker.patch( + "freqtrade.commands.data_commands.convert_trades_to_ohlcv", MagicMock(return_value=[]) + ) patch_exchange(mocker) - mocker.patch(f'{EXMS}.get_markets') - mocker.patch(f'{EXMS}.markets', PropertyMock(return_value={})) + mocker.patch(f"{EXMS}.get_markets") + mocker.patch(f"{EXMS}.markets", PropertyMock(return_value={})) args = [ "trades-to-ohlcv", - "--exchange", "kraken", - "--pairs", "ETH/BTC", "XRP/BTC", + "--exchange", + "kraken", + "--pairs", + "ETH/BTC", + "XRP/BTC", ] start_convert_trades(get_args(args)) assert convert_mock.call_count == 1 def test_start_list_strategies(capsys): - args = [ "list-strategies", "--strategy-path", str(Path(__file__).parent.parent / "strategy" / "strats"), - "-1" + "-1", ] pargs = get_args(args) # pargs['config'] = None @@ -909,7 +1008,7 @@ def test_start_list_strategies(capsys): "list-strategies", "--strategy-path", str(Path(__file__).parent.parent / "strategy" / "strats"), - '--no-color', + "--no-color", ] pargs = get_args(args) # pargs['config'] = None @@ -941,8 +1040,8 @@ def test_start_list_strategies(capsys): "list-strategies", "--strategy-path", str(Path(__file__).parent.parent / "strategy" / "strats"), - '--no-color', - '--recursive-strategy-search' + "--no-color", + "--recursive-strategy-search", ] pargs = get_args(args) # pargs['config'] = None @@ -956,13 +1055,9 @@ def test_start_list_strategies(capsys): def test_start_list_freqAI_models(capsys): - - args = [ - "list-freqaimodels", - "-1" - ] + args = ["list-freqaimodels", "-1"] pargs = get_args(args) - pargs['config'] = None + pargs["config"] = None start_list_freqAI_models(pargs) captured = capsys.readouterr() assert "LightGBMClassifier" in captured.out @@ -974,7 +1069,7 @@ def test_start_list_freqAI_models(capsys): "list-freqaimodels", ] pargs = get_args(args) - pargs['config'] = None + pargs["config"] = None start_list_freqAI_models(pargs) captured = capsys.readouterr() assert "LightGBMClassifier" in captured.out @@ -985,12 +1080,13 @@ def test_start_list_freqAI_models(capsys): def test_start_test_pairlist(mocker, caplog, tickers, default_conf, capsys): patch_exchange(mocker, mock_markets=True) - mocker.patch.multiple(EXMS, - exchange_has=MagicMock(return_value=True), - get_tickers=tickers, - ) + mocker.patch.multiple( + EXMS, + exchange_has=MagicMock(return_value=True), + get_tickers=tickers, + ) - default_conf['pairlists'] = [ + default_conf["pairlists"] = [ { "method": "VolumePairList", "number_assets": 5, @@ -1001,10 +1097,7 @@ def test_start_test_pairlist(mocker, caplog, tickers, default_conf, capsys): ] patched_configuration_load_config_file(mocker, default_conf) - args = [ - 'test-pairlist', - '-c', 'tests/testdata/testconfigs/main_test_config.json' - ] + args = ["test-pairlist", "-c", "tests/testdata/testconfigs/main_test_config.json"] start_test_pairlist(get_args(args)) @@ -1016,45 +1109,46 @@ def test_start_test_pairlist(mocker, caplog, tickers, default_conf, capsys): assert re.match("['ETH/BTC', 'TKN/BTC', 'BLK/BTC', 'LTC/BTC', 'XRP/BTC']", captured.out) args = [ - 'test-pairlist', - '-c', 'tests/testdata/testconfigs/main_test_config.json', - '--one-column', + "test-pairlist", + "-c", + "tests/testdata/testconfigs/main_test_config.json", + "--one-column", ] start_test_pairlist(get_args(args)) captured = capsys.readouterr() assert re.match(r"ETH/BTC\nTKN/BTC\nBLK/BTC\nLTC/BTC\nXRP/BTC\n", captured.out) args = [ - 'test-pairlist', - '-c', 'tests/testdata/testconfigs/main_test_config.json', - '--print-json', + "test-pairlist", + "-c", + "tests/testdata/testconfigs/main_test_config.json", + "--print-json", ] start_test_pairlist(get_args(args)) captured = capsys.readouterr() try: json_pairs = json.loads(captured.out) - assert 'ETH/BTC' in json_pairs - assert 'TKN/BTC' in json_pairs - assert 'BLK/BTC' in json_pairs - assert 'LTC/BTC' in json_pairs - assert 'XRP/BTC' in json_pairs + assert "ETH/BTC" in json_pairs + assert "TKN/BTC" in json_pairs + assert "BLK/BTC" in json_pairs + assert "LTC/BTC" in json_pairs + assert "XRP/BTC" in json_pairs except json.decoder.JSONDecodeError: - pytest.fail(f'Expected well formed JSON, but failed to parse: {captured.out}') + pytest.fail(f"Expected well formed JSON, but failed to parse: {captured.out}") def test_hyperopt_list(mocker, capsys, caplog, saved_hyperopt_results, tmp_path): csv_file = tmp_path / "test.csv" mocker.patch( - 'freqtrade.optimize.hyperopt_tools.HyperoptTools._test_hyperopt_results_exist', - return_value=True + "freqtrade.optimize.hyperopt_tools.HyperoptTools._test_hyperopt_results_exist", + return_value=True, ) def fake_iterator(*args, **kwargs): yield from [saved_hyperopt_results] mocker.patch( - 'freqtrade.optimize.hyperopt_tools.HyperoptTools._read_results', - side_effect=fake_iterator + "freqtrade.optimize.hyperopt_tools.HyperoptTools._read_results", side_effect=fake_iterator ) args = [ @@ -1063,13 +1157,26 @@ def test_hyperopt_list(mocker, capsys, caplog, saved_hyperopt_results, tmp_path) "--no-color", ] pargs = get_args(args) - pargs['config'] = None + pargs["config"] = None start_hyperopt_list(pargs) captured = capsys.readouterr() - assert all(x in captured.out - for x in [" 1/12", " 2/12", " 3/12", " 4/12", " 5/12", - " 6/12", " 7/12", " 8/12", " 9/12", " 10/12", - " 11/12", " 12/12"]) + assert all( + x in captured.out + for x in [ + " 1/12", + " 2/12", + " 3/12", + " 4/12", + " 5/12", + " 6/12", + " 7/12", + " 8/12", + " 9/12", + " 10/12", + " 11/12", + " 12/12", + ] + ) args = [ "hyperopt-list", "--best", @@ -1077,14 +1184,14 @@ def test_hyperopt_list(mocker, capsys, caplog, saved_hyperopt_results, tmp_path) "--no-color", ] pargs = get_args(args) - pargs['config'] = None + pargs["config"] = None start_hyperopt_list(pargs) captured = capsys.readouterr() - assert all(x in captured.out - for x in [" 1/12", " 5/12", " 10/12"]) - assert all(x not in captured.out - for x in [" 2/12", " 3/12", " 4/12", " 6/12", " 7/12", " 8/12", " 9/12", - " 11/12", " 12/12"]) + assert all(x in captured.out for x in [" 1/12", " 5/12", " 10/12"]) + assert all( + x not in captured.out + for x in [" 2/12", " 3/12", " 4/12", " 6/12", " 7/12", " 8/12", " 9/12", " 11/12", " 12/12"] + ) args = [ "hyperopt-list", "--profitable", @@ -1092,180 +1199,293 @@ def test_hyperopt_list(mocker, capsys, caplog, saved_hyperopt_results, tmp_path) "--no-color", ] pargs = get_args(args) - pargs['config'] = None + pargs["config"] = None start_hyperopt_list(pargs) captured = capsys.readouterr() - assert all(x in captured.out - for x in [" 2/12", " 10/12"]) - assert all(x not in captured.out - for x in [" 1/12", " 3/12", " 4/12", " 5/12", " 6/12", " 7/12", " 8/12", " 9/12", - " 11/12", " 12/12"]) + assert all(x in captured.out for x in [" 2/12", " 10/12"]) + assert all( + x not in captured.out + for x in [ + " 1/12", + " 3/12", + " 4/12", + " 5/12", + " 6/12", + " 7/12", + " 8/12", + " 9/12", + " 11/12", + " 12/12", + ] + ) args = [ "hyperopt-list", "--profitable", "--no-color", ] pargs = get_args(args) - pargs['config'] = None + pargs["config"] = None start_hyperopt_list(pargs) captured = capsys.readouterr() - assert all(x in captured.out - for x in [" 2/12", " 10/12", "Best result:", "Buy hyperspace params", - "Sell hyperspace params", "ROI table", "Stoploss"]) - assert all(x not in captured.out - for x in [" 1/12", " 3/12", " 4/12", " 5/12", " 6/12", " 7/12", " 8/12", " 9/12", - " 11/12", " 12/12"]) + assert all( + x in captured.out + for x in [ + " 2/12", + " 10/12", + "Best result:", + "Buy hyperspace params", + "Sell hyperspace params", + "ROI table", + "Stoploss", + ] + ) + assert all( + x not in captured.out + for x in [ + " 1/12", + " 3/12", + " 4/12", + " 5/12", + " 6/12", + " 7/12", + " 8/12", + " 9/12", + " 11/12", + " 12/12", + ] + ) args = [ "hyperopt-list", "--no-details", "--no-color", - "--min-trades", "20", + "--min-trades", + "20", ] pargs = get_args(args) - pargs['config'] = None + pargs["config"] = None start_hyperopt_list(pargs) captured = capsys.readouterr() - assert all(x in captured.out - for x in [" 3/12", " 6/12", " 7/12", " 9/12", " 11/12"]) - assert all(x not in captured.out - for x in [" 1/12", " 2/12", " 4/12", " 5/12", " 8/12", " 10/12", " 12/12"]) + assert all(x in captured.out for x in [" 3/12", " 6/12", " 7/12", " 9/12", " 11/12"]) + assert all( + x not in captured.out + for x in [" 1/12", " 2/12", " 4/12", " 5/12", " 8/12", " 10/12", " 12/12"] + ) args = [ "hyperopt-list", "--profitable", "--no-details", "--no-color", - "--max-trades", "20", + "--max-trades", + "20", ] pargs = get_args(args) - pargs['config'] = None + pargs["config"] = None start_hyperopt_list(pargs) captured = capsys.readouterr() - assert all(x in captured.out - for x in [" 2/12", " 10/12"]) - assert all(x not in captured.out - for x in [" 1/12", " 3/12", " 4/12", " 5/12", " 6/12", " 7/12", " 8/12", " 9/12", - " 11/12", " 12/12"]) + assert all(x in captured.out for x in [" 2/12", " 10/12"]) + assert all( + x not in captured.out + for x in [ + " 1/12", + " 3/12", + " 4/12", + " 5/12", + " 6/12", + " 7/12", + " 8/12", + " 9/12", + " 11/12", + " 12/12", + ] + ) args = [ "hyperopt-list", "--profitable", "--no-details", "--no-color", - "--min-avg-profit", "0.11", + "--min-avg-profit", + "0.11", ] pargs = get_args(args) - pargs['config'] = None + pargs["config"] = None start_hyperopt_list(pargs) captured = capsys.readouterr() - assert all(x in captured.out - for x in [" 2/12"]) - assert all(x not in captured.out - for x in [" 1/12", " 3/12", " 4/12", " 5/12", " 6/12", " 7/12", " 8/12", " 9/12", - " 10/12", " 11/12", " 12/12"]) + assert all(x in captured.out for x in [" 2/12"]) + assert all( + x not in captured.out + for x in [ + " 1/12", + " 3/12", + " 4/12", + " 5/12", + " 6/12", + " 7/12", + " 8/12", + " 9/12", + " 10/12", + " 11/12", + " 12/12", + ] + ) args = [ "hyperopt-list", "--no-details", "--no-color", - "--max-avg-profit", "0.10", + "--max-avg-profit", + "0.10", ] pargs = get_args(args) - pargs['config'] = None + pargs["config"] = None start_hyperopt_list(pargs) captured = capsys.readouterr() - assert all(x in captured.out - for x in [" 1/12", " 3/12", " 5/12", " 6/12", " 7/12", " 8/12", " 9/12", - " 11/12"]) - assert all(x not in captured.out - for x in [" 2/12", " 4/12", " 10/12", " 12/12"]) + assert all( + x in captured.out + for x in [" 1/12", " 3/12", " 5/12", " 6/12", " 7/12", " 8/12", " 9/12", " 11/12"] + ) + assert all(x not in captured.out for x in [" 2/12", " 4/12", " 10/12", " 12/12"]) args = [ "hyperopt-list", "--no-details", "--no-color", - "--min-total-profit", "0.4", + "--min-total-profit", + "0.4", ] pargs = get_args(args) - pargs['config'] = None + pargs["config"] = None start_hyperopt_list(pargs) captured = capsys.readouterr() - assert all(x in captured.out - for x in [" 10/12"]) - assert all(x not in captured.out - for x in [" 1/12", " 2/12", " 3/12", " 4/12", " 5/12", " 6/12", " 7/12", " 8/12", - " 9/12", " 11/12", " 12/12"]) + assert all(x in captured.out for x in [" 10/12"]) + assert all( + x not in captured.out + for x in [ + " 1/12", + " 2/12", + " 3/12", + " 4/12", + " 5/12", + " 6/12", + " 7/12", + " 8/12", + " 9/12", + " 11/12", + " 12/12", + ] + ) args = [ "hyperopt-list", "--no-details", "--no-color", - "--max-total-profit", "0.4", + "--max-total-profit", + "0.4", ] pargs = get_args(args) - pargs['config'] = None + pargs["config"] = None start_hyperopt_list(pargs) captured = capsys.readouterr() - assert all(x in captured.out - for x in [" 1/12", " 2/12", " 3/12", " 5/12", " 6/12", " 7/12", " 8/12", - " 9/12", " 11/12"]) - assert all(x not in captured.out - for x in [" 4/12", " 10/12", " 12/12"]) + assert all( + x in captured.out + for x in [" 1/12", " 2/12", " 3/12", " 5/12", " 6/12", " 7/12", " 8/12", " 9/12", " 11/12"] + ) + assert all(x not in captured.out for x in [" 4/12", " 10/12", " 12/12"]) args = [ "hyperopt-list", "--no-details", "--no-color", - "--min-objective", "0.1", + "--min-objective", + "0.1", ] pargs = get_args(args) - pargs['config'] = None + pargs["config"] = None start_hyperopt_list(pargs) captured = capsys.readouterr() - assert all(x in captured.out - for x in [" 10/12"]) - assert all(x not in captured.out - for x in [" 1/12", " 2/12", " 3/12", " 4/12", " 5/12", " 6/12", " 7/12", " 8/12", - " 9/12", " 11/12", " 12/12"]) + assert all(x in captured.out for x in [" 10/12"]) + assert all( + x not in captured.out + for x in [ + " 1/12", + " 2/12", + " 3/12", + " 4/12", + " 5/12", + " 6/12", + " 7/12", + " 8/12", + " 9/12", + " 11/12", + " 12/12", + ] + ) args = [ "hyperopt-list", "--no-details", - "--max-objective", "0.1", + "--max-objective", + "0.1", ] pargs = get_args(args) - pargs['config'] = None + pargs["config"] = None start_hyperopt_list(pargs) captured = capsys.readouterr() - assert all(x in captured.out - for x in [" 1/12", " 2/12", " 3/12", " 5/12", " 6/12", " 7/12", " 8/12", - " 9/12", " 11/12"]) - assert all(x not in captured.out - for x in [" 4/12", " 10/12", " 12/12"]) + assert all( + x in captured.out + for x in [" 1/12", " 2/12", " 3/12", " 5/12", " 6/12", " 7/12", " 8/12", " 9/12", " 11/12"] + ) + assert all(x not in captured.out for x in [" 4/12", " 10/12", " 12/12"]) args = [ "hyperopt-list", "--profitable", "--no-details", "--no-color", - "--min-avg-time", "2000", + "--min-avg-time", + "2000", ] pargs = get_args(args) - pargs['config'] = None + pargs["config"] = None start_hyperopt_list(pargs) captured = capsys.readouterr() - assert all(x in captured.out - for x in [" 10/12"]) - assert all(x not in captured.out - for x in [" 1/12", " 2/12", " 3/12", " 4/12", " 5/12", " 6/12", " 7/12", - " 8/12", " 9/12", " 11/12", " 12/12"]) + assert all(x in captured.out for x in [" 10/12"]) + assert all( + x not in captured.out + for x in [ + " 1/12", + " 2/12", + " 3/12", + " 4/12", + " 5/12", + " 6/12", + " 7/12", + " 8/12", + " 9/12", + " 11/12", + " 12/12", + ] + ) args = [ "hyperopt-list", "--no-details", "--no-color", - "--max-avg-time", "1500", + "--max-avg-time", + "1500", ] pargs = get_args(args) - pargs['config'] = None + pargs["config"] = None start_hyperopt_list(pargs) captured = capsys.readouterr() - assert all(x in captured.out - for x in [" 2/12", " 6/12"]) - assert all(x not in captured.out - for x in [" 1/12", " 3/12", " 4/12", " 5/12", " 7/12", " 8/12" - " 9/12", " 10/12", " 11/12", " 12/12"]) + assert all(x in captured.out for x in [" 2/12", " 6/12"]) + assert all( + x not in captured.out + for x in [ + " 1/12", + " 3/12", + " 4/12", + " 5/12", + " 7/12", + " 8/12", + " 9/12", + " 10/12", + " 11/12", + " 12/12", + ] + ) args = [ "hyperopt-list", "--no-details", @@ -1274,103 +1494,84 @@ def test_hyperopt_list(mocker, capsys, caplog, saved_hyperopt_results, tmp_path) str(csv_file), ] pargs = get_args(args) - pargs['config'] = None + pargs["config"] = None start_hyperopt_list(pargs) captured = capsys.readouterr() log_has("CSV file created: test_file.csv", caplog) assert csv_file.is_file() line = csv_file.read_text() - assert ('Best,1,2,-1.25%,-1.2222,-0.00125625,,-2.51,"3,930.0 m",0.43662' in line - or "Best,1,2,-1.25%,-1.2222,-0.00125625,,-2.51,2 days 17:30:00,2,0,0.43662" in line) + assert ( + 'Best,1,2,-1.25%,-1.2222,-0.00125625,,-2.51,"3,930.0 m",0.43662' in line + or "Best,1,2,-1.25%,-1.2222,-0.00125625,,-2.51,2 days 17:30:00,2,0,0.43662" in line + ) csv_file.unlink() def test_hyperopt_show(mocker, capsys, saved_hyperopt_results): mocker.patch( - 'freqtrade.optimize.hyperopt_tools.HyperoptTools._test_hyperopt_results_exist', - return_value=True + "freqtrade.optimize.hyperopt_tools.HyperoptTools._test_hyperopt_results_exist", + return_value=True, ) def fake_iterator(*args, **kwargs): yield from [saved_hyperopt_results] mocker.patch( - 'freqtrade.optimize.hyperopt_tools.HyperoptTools._read_results', - side_effect=fake_iterator + "freqtrade.optimize.hyperopt_tools.HyperoptTools._read_results", side_effect=fake_iterator ) - mocker.patch('freqtrade.commands.hyperopt_commands.show_backtest_result') + mocker.patch("freqtrade.commands.hyperopt_commands.show_backtest_result") args = [ "hyperopt-show", ] pargs = get_args(args) - pargs['config'] = None + pargs["config"] = None start_hyperopt_show(pargs) captured = capsys.readouterr() assert " 12/12" in captured.out - args = [ - "hyperopt-show", - "--best" - ] + args = ["hyperopt-show", "--best"] pargs = get_args(args) - pargs['config'] = None + pargs["config"] = None start_hyperopt_show(pargs) captured = capsys.readouterr() assert " 10/12" in captured.out - args = [ - "hyperopt-show", - "-n", "1" - ] + args = ["hyperopt-show", "-n", "1"] pargs = get_args(args) - pargs['config'] = None + pargs["config"] = None start_hyperopt_show(pargs) captured = capsys.readouterr() assert " 1/12" in captured.out - args = [ - "hyperopt-show", - "--best", - "-n", "2" - ] + args = ["hyperopt-show", "--best", "-n", "2"] pargs = get_args(args) - pargs['config'] = None + pargs["config"] = None start_hyperopt_show(pargs) captured = capsys.readouterr() assert " 5/12" in captured.out - args = [ - "hyperopt-show", - "--best", - "-n", "-1" - ] + args = ["hyperopt-show", "--best", "-n", "-1"] pargs = get_args(args) - pargs['config'] = None + pargs["config"] = None start_hyperopt_show(pargs) captured = capsys.readouterr() assert " 10/12" in captured.out - args = [ - "hyperopt-show", - "--best", - "-n", "-4" - ] + args = ["hyperopt-show", "--best", "-n", "-4"] pargs = get_args(args) - pargs['config'] = None - with pytest.raises(OperationalException, - match="The index of the epoch to show should be greater than -4."): + pargs["config"] = None + with pytest.raises( + OperationalException, match="The index of the epoch to show should be greater than -4." + ): start_hyperopt_show(pargs) - args = [ - "hyperopt-show", - "--best", - "-n", "4" - ] + args = ["hyperopt-show", "--best", "-n", "4"] pargs = get_args(args) - pargs['config'] = None - with pytest.raises(OperationalException, - match="The index of the epoch to show should be less than 4."): + pargs["config"] = None + with pytest.raises( + OperationalException, match="The index of the epoch to show should be less than 4." + ): start_hyperopt_show(pargs) @@ -1387,13 +1588,13 @@ def test_convert_data(mocker, testdatadir): str(testdatadir), ] pargs = get_args(args) - pargs['config'] = None + pargs["config"] = None start_convert_data(pargs, True) assert trades_mock.call_count == 0 assert ohlcv_mock.call_count == 1 - assert ohlcv_mock.call_args[1]['convert_from'] == 'json' - assert ohlcv_mock.call_args[1]['convert_to'] == 'jsongz' - assert ohlcv_mock.call_args[1]['erase'] is False + assert ohlcv_mock.call_args[1]["convert_from"] == "json" + assert ohlcv_mock.call_args[1]["convert_to"] == "jsongz" + assert ohlcv_mock.call_args[1]["erase"] is False def test_convert_data_trades(mocker, testdatadir): @@ -1409,13 +1610,13 @@ def test_convert_data_trades(mocker, testdatadir): str(testdatadir), ] pargs = get_args(args) - pargs['config'] = None + pargs["config"] = None start_convert_data(pargs, False) assert ohlcv_mock.call_count == 0 assert trades_mock.call_count == 1 - assert trades_mock.call_args[1]['convert_from'] == 'jsongz' - assert trades_mock.call_args[1]['convert_to'] == 'json' - assert trades_mock.call_args[1]['erase'] is False + assert trades_mock.call_args[1]["convert_from"] == "jsongz" + assert trades_mock.call_args[1]["convert_to"] == "json" + assert trades_mock.call_args[1]["erase"] is False def test_start_list_data(testdatadir, capsys): @@ -1425,7 +1626,7 @@ def test_start_list_data(testdatadir, capsys): str(testdatadir), ] pargs = get_args(args) - pargs['config'] = None + pargs["config"] = None start_list_data(pargs) captured = capsys.readouterr() assert "Found 16 pair / timeframe combinations." in captured.out @@ -1436,12 +1637,13 @@ def test_start_list_data(testdatadir, capsys): "list-data", "--data-format-ohlcv", "feather", - "--pairs", "XRP/ETH", + "--pairs", + "XRP/ETH", "--datadir", str(testdatadir), ] pargs = get_args(args) - pargs['config'] = None + pargs["config"] = None start_list_data(pargs) captured = capsys.readouterr() assert "Found 2 pair / timeframe combinations." in captured.out @@ -1451,12 +1653,13 @@ def test_start_list_data(testdatadir, capsys): args = [ "list-data", - "--trading-mode", "futures", + "--trading-mode", + "futures", "--datadir", str(testdatadir), ] pargs = get_args(args) - pargs['config'] = None + pargs["config"] = None start_list_data(pargs) captured = capsys.readouterr() @@ -1467,51 +1670,44 @@ def test_start_list_data(testdatadir, capsys): args = [ "list-data", - "--pairs", "XRP/ETH", + "--pairs", + "XRP/ETH", "--datadir", str(testdatadir), "--show-timerange", ] pargs = get_args(args) - pargs['config'] = None + pargs["config"] = None start_list_data(pargs) captured = capsys.readouterr() assert "Found 2 pair / timeframe combinations." in captured.out assert ( "\n| Pair | Timeframe | Type " - "| From | To | Candles |\n") in captured.out + "| From | To | Candles |\n" + ) in captured.out assert "UNITTEST/BTC" not in captured.out assert ( "\n| XRP/ETH | 1m | spot | " - "2019-10-11 00:00:00 | 2019-10-13 11:19:00 | 2469 |\n") in captured.out + "2019-10-11 00:00:00 | 2019-10-13 11:19:00 | 2469 |\n" + ) in captured.out @pytest.mark.usefixtures("init_persistence") def test_show_trades(mocker, fee, capsys, caplog): mocker.patch("freqtrade.persistence.init_db") create_mock_trades(fee, False) - args = [ - "show-trades", - "--db-url", - "sqlite:///" - ] + args = ["show-trades", "--db-url", "sqlite:///"] pargs = get_args(args) - pargs['config'] = None + pargs["config"] = None start_show_trades(pargs) assert log_has(f"Printing {MOCK_TRADE_COUNT} Trades: ", caplog) captured = capsys.readouterr() assert "Trade(id=1" in captured.out assert "Trade(id=2" in captured.out assert "Trade(id=3" in captured.out - args = [ - "show-trades", - "--db-url", - "sqlite:///", - "--print-json", - "--trade-ids", "1", "2" - ] + args = ["show-trades", "--db-url", "sqlite:///", "--print-json", "--trade-ids", "1", "2"] pargs = get_args(args) - pargs['config'] = None + pargs["config"] = None start_show_trades(pargs) captured = capsys.readouterr() @@ -1523,22 +1719,22 @@ def test_show_trades(mocker, fee, capsys, caplog): "show-trades", ] pargs = get_args(args) - pargs['config'] = None + pargs["config"] = None with pytest.raises(OperationalException, match=r"--db-url is required for this command."): start_show_trades(pargs) def test_backtesting_show(mocker, testdatadir, capsys): - sbr = mocker.patch('freqtrade.optimize.optimize_reports.show_backtest_results') + sbr = mocker.patch("freqtrade.optimize.optimize_reports.show_backtest_results") args = [ "backtesting-show", "--export-filename", f"{testdatadir / 'backtest_results/backtest-result.json'}", - "--show-pair-list" + "--show-pair-list", ] pargs = get_args(args) - pargs['config'] = None + pargs["config"] = None start_backtesting_show(pargs) assert sbr.call_count == 1 out, _err = capsys.readouterr() @@ -1563,21 +1759,21 @@ def test_start_convert_db(fee, tmp_path): create_mock_trades(fee) - PairLocks.timeframe = '5m' - PairLocks.lock_pair('XRP/USDT', datetime.now(), 'Random reason 125', side='long') + PairLocks.timeframe = "5m" + PairLocks.lock_pair("XRP/USDT", datetime.now(), "Random reason 125", side="long") assert db_src_file.is_file() assert not db_target_file.is_file() pargs = get_args(args) - pargs['config'] = None + pargs["config"] = None start_convert_db(pargs) assert db_target_file.is_file() def test_start_strategy_updater(mocker, tmp_path): - sc_mock = mocker.patch('freqtrade.commands.strategy_utils_commands.start_conversion') - teststrats = Path(__file__).parent.parent / 'strategy/strats' + sc_mock = mocker.patch("freqtrade.commands.strategy_utils_commands.start_conversion") + teststrats = Path(__file__).parent.parent / "strategy/strats" args = [ "strategy-updater", "--userdir", @@ -1586,7 +1782,7 @@ def test_start_strategy_updater(mocker, tmp_path): str(teststrats), ] pargs = get_args(args) - pargs['config'] = None + pargs["config"] = None start_strategy_update(pargs) # Number of strategies in the test directory assert sc_mock.call_count == 12 @@ -1600,10 +1796,10 @@ def test_start_strategy_updater(mocker, tmp_path): str(teststrats), "--strategy-list", "StrategyTestV3", - "StrategyTestV2" + "StrategyTestV2", ] pargs = get_args(args) - pargs['config'] = None + pargs["config"] = None start_strategy_update(pargs) # Number of strategies in the test directory assert sc_mock.call_count == 2 @@ -1627,7 +1823,7 @@ def test_start_show_config(capsys, caplog): "show-config", "--config", "tests/testdata/testconfigs/main_test_config.json", - "--show-sensitive" + "--show-sensitive", ] pargs = get_args(args) start_show_config(pargs) @@ -1636,4 +1832,4 @@ def test_start_show_config(capsys, caplog): assert "Your combined configuration is:" in captured.out assert '"max_open_trades":' in captured.out assert '"secret": "REDACTED"' not in captured.out - assert log_has_re(r'Sensitive information will be shown in the upcoming output.*', caplog) + assert log_has_re(r"Sensitive information will be shown in the upcoming output.*", caplog)