From 7e023419de4821a252c253a3a36f3db7d85e3e7e Mon Sep 17 00:00:00 2001 From: Matthias Date: Thu, 11 May 2023 07:05:43 +0200 Subject: [PATCH 1/5] Auto-mock user_dir to tmpdir This will avoid depending on the user directory being present for tests --- tests/conftest.py | 6 ++++++ tests/test_configuration.py | 4 ++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/tests/conftest.py b/tests/conftest.py index 1c737b3aa..b32d0a8bc 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -411,6 +411,12 @@ def patch_gc(mocker) -> None: mocker.patch("freqtrade.main.gc_set_threshold") +@pytest.fixture(autouse=True) +def patched_user_dir(mocker, tmpdir) -> None: + mocker.patch('freqtrade.configuration.configuration.create_userdata_dir', + return_value=Path(tmpdir) / "user_data") + + @pytest.fixture(autouse=True) def patch_coingekko(mocker) -> None: """ diff --git a/tests/test_configuration.py b/tests/test_configuration.py index c445b989d..5b09abbd3 100644 --- a/tests/test_configuration.py +++ b/tests/test_configuration.py @@ -1271,7 +1271,7 @@ def test_pairlist_resolving_with_config_pl_not_exists(mocker, default_conf): configuration.get_config() -def test_pairlist_resolving_fallback(mocker): +def test_pairlist_resolving_fallback(mocker, tmpdir): mocker.patch.object(Path, "exists", MagicMock(return_value=True)) mocker.patch.object(Path, "open", MagicMock(return_value=MagicMock())) mocker.patch("freqtrade.configuration.configuration.load_file", @@ -1290,7 +1290,7 @@ def test_pairlist_resolving_fallback(mocker): assert config['pairs'] == ['ETH/BTC', 'XRP/BTC'] assert config['exchange']['name'] == 'binance' - assert config['datadir'] == Path.cwd() / "user_data/data/binance" + assert config['datadir'] == Path(tmpdir) / "user_data/data/binance" @pytest.mark.parametrize("setting", [ From c60c4b9abb158e0508b9b0bc70f12ce4c94f3f9f Mon Sep 17 00:00:00 2001 From: Matthias Date: Thu, 11 May 2023 07:10:34 +0200 Subject: [PATCH 2/5] Update user_dir fixture to return user_data path --- tests/conftest.py | 6 ++++-- tests/test_strategy_updater.py | 12 ++++++------ 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/tests/conftest.py b/tests/conftest.py index b32d0a8bc..4b725e2db 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -412,9 +412,11 @@ def patch_gc(mocker) -> None: @pytest.fixture(autouse=True) -def patched_user_dir(mocker, tmpdir) -> None: +def user_dir(mocker, tmpdir) -> Path: + user_dir = Path(tmpdir) / "user_data" mocker.patch('freqtrade.configuration.configuration.create_userdata_dir', - return_value=Path(tmpdir) / "user_data") + return_value=user_dir) + return user_dir @pytest.fixture(autouse=True) diff --git a/tests/test_strategy_updater.py b/tests/test_strategy_updater.py index 597d49fda..3b48c952c 100644 --- a/tests/test_strategy_updater.py +++ b/tests/test_strategy_updater.py @@ -16,18 +16,18 @@ if sys.version_info < (3, 9): pytest.skip("StrategyUpdater is not compatible with Python 3.8", allow_module_level=True) -def test_strategy_updater_start(tmpdir, capsys) -> None: +def test_strategy_updater_start(user_dir, capsys) -> None: # Effective test without mocks. teststrats = Path(__file__).parent / 'strategy/strats' - tmpdirp = Path(tmpdir) / "strategies" - tmpdirp.mkdir() + tmpdirp = Path(user_dir) / "strategies" + tmpdirp.mkdir(parents=True, exist_ok=True) shutil.copy(teststrats / 'strategy_test_v2.py', tmpdirp) old_code = (teststrats / 'strategy_test_v2.py').read_text() args = [ "strategy-updater", "--userdir", - str(tmpdir), + str(user_dir), "--strategy-list", "StrategyTestV2" ] @@ -36,9 +36,9 @@ def test_strategy_updater_start(tmpdir, capsys) -> None: start_strategy_update(pargs) - assert Path(tmpdir / "strategies_orig_updater").exists() + assert Path(user_dir / "strategies_orig_updater").exists() # Backup file exists - assert Path(tmpdir / "strategies_orig_updater" / 'strategy_test_v2.py').exists() + assert Path(user_dir / "strategies_orig_updater" / 'strategy_test_v2.py').exists() # updated file exists new_file = Path(tmpdirp / 'strategy_test_v2.py') assert new_file.exists() From 1c1005247e3ff88c07eae8a2596419983ae9fa2f Mon Sep 17 00:00:00 2001 From: Matthias Date: Thu, 11 May 2023 20:09:24 +0200 Subject: [PATCH 3/5] Don't hardcode user_data in tests --- tests/test_plotting.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/test_plotting.py b/tests/test_plotting.py index 9f04ba20a..e43009aee 100644 --- a/tests/test_plotting.py +++ b/tests/test_plotting.py @@ -282,13 +282,13 @@ def test_generate_Plot_filename(): assert fn == "freqtrade-plot-UNITTEST_BTC-5m.html" -def test_generate_plot_file(mocker, caplog): +def test_generate_plot_file(mocker, caplog, user_dir): fig = generate_empty_figure() plot_mock = mocker.patch("freqtrade.plot.plotting.plot", MagicMock()) store_plot_file(fig, filename="freqtrade-plot-UNITTEST_BTC-5m.html", - directory=Path("user_data/plot")) + directory=user_dir / "plot") - expected_fn = str(Path("user_data/plot/freqtrade-plot-UNITTEST_BTC-5m.html")) + expected_fn = str(user_dir / "plot/freqtrade-plot-UNITTEST_BTC-5m.html") assert plot_mock.call_count == 1 assert plot_mock.call_args[0][0] == fig assert (plot_mock.call_args_list[0][1]['filename'] From f7179f7c93be346f4f2910b652d13db39018f78c Mon Sep 17 00:00:00 2001 From: Matthias Date: Thu, 11 May 2023 20:30:24 +0200 Subject: [PATCH 4/5] Fix last test with dependency on local user_data dir --- tests/data/test_entryexitanalysis.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/tests/data/test_entryexitanalysis.py b/tests/data/test_entryexitanalysis.py index 367ad8394..810e2c53b 100644 --- a/tests/data/test_entryexitanalysis.py +++ b/tests/data/test_entryexitanalysis.py @@ -18,8 +18,9 @@ def entryexitanalysis_cleanup() -> None: Backtesting.cleanup() -def test_backtest_analysis_nomock(default_conf, mocker, caplog, testdatadir, tmpdir, capsys): +def test_backtest_analysis_nomock(default_conf, mocker, caplog, testdatadir, user_dir, capsys): caplog.set_level(logging.INFO) + (user_dir / 'backtest_results').mkdir(parents=True, exist_ok=True) default_conf.update({ "use_exit_signal": True, @@ -80,7 +81,7 @@ def test_backtest_analysis_nomock(default_conf, mocker, caplog, testdatadir, tmp 'backtesting', '--config', 'config.json', '--datadir', str(testdatadir), - '--user-data-dir', str(tmpdir), + '--user-data-dir', str(user_dir), '--timeframe', '5m', '--timerange', '1515560100-1517287800', '--export', 'signals', @@ -98,7 +99,7 @@ def test_backtest_analysis_nomock(default_conf, mocker, caplog, testdatadir, tmp 'backtesting-analysis', '--config', 'config.json', '--datadir', str(testdatadir), - '--user-data-dir', str(tmpdir), + '--user-data-dir', str(user_dir), ] # test group 0 and indicator list From b970ddeb660d8ef62b4c0a18dc20e3d5c4072488 Mon Sep 17 00:00:00 2001 From: Matthias Date: Thu, 11 May 2023 20:44:41 +0200 Subject: [PATCH 5/5] Fix unused import --- tests/test_plotting.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/test_plotting.py b/tests/test_plotting.py index e43009aee..377caf59c 100644 --- a/tests/test_plotting.py +++ b/tests/test_plotting.py @@ -1,5 +1,4 @@ from copy import deepcopy -from pathlib import Path from unittest.mock import MagicMock import pandas as pd