diff --git a/freqtrade/strategy/strategyupdater.py b/freqtrade/strategy/strategyupdater.py index 6fe1f326c..bc692b71c 100644 --- a/freqtrade/strategy/strategyupdater.py +++ b/freqtrade/strategy/strategyupdater.py @@ -3,6 +3,8 @@ from pathlib import Path import ast_comments +from freqtrade.constants import Config + class StrategyUpdater: name_mapping = { @@ -42,7 +44,7 @@ class StrategyUpdater: # create a dictionary that maps the old column names to the new ones rename_dict = {'buy': 'enter_long', 'sell': 'exit_long', 'buy_tag': 'enter_tag'} - def start(self, config, strategy_obj: dict) -> None: + def start(self, config: Config, strategy_obj: dict) -> None: """ Run strategy updater It updates a strategy to v3 with the help of the ast-module diff --git a/tests/commands/test_commands.py b/tests/commands/test_commands.py index 179712c6d..318590b32 100644 --- a/tests/commands/test_commands.py +++ b/tests/commands/test_commands.py @@ -1549,7 +1549,7 @@ def test_start_convert_db(mocker, fee, tmpdir, caplog): assert db_target_file.is_file() -def test_start_strategy_updater(mocker, tmpdir): +def test_start_strategy_updater(mocker, tmpdir): sc_mock = mocker.patch('freqtrade.commands.strategy_utils_commands.start_conversion') teststrats = Path(__file__).parent.parent / 'strategy/strats' args = [ diff --git a/tests/test_strategy_updater.py b/tests/test_strategy_updater.py index 4aad152bf..d3bdd27b5 100644 --- a/tests/test_strategy_updater.py +++ b/tests/test_strategy_updater.py @@ -1,16 +1,56 @@ # pragma pylint: disable=missing-docstring, protected-access, invalid-name +import re +import shutil import sys +from pathlib import Path import pytest +from freqtrade.commands.strategy_utils_commands import start_strategy_update from freqtrade.strategy.strategyupdater import StrategyUpdater +from tests.conftest import get_args 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: + # Effective test without mocks. + teststrats = Path(__file__).parent / 'strategy/strats' + tmpdirp = Path(tmpdir) / "strategies" + tmpdirp.mkdir() + shutil.copy(teststrats / 'strategy_test_v2.py', tmpdirp) + old_code = (teststrats / 'strategy_test_v2.py').read_text() + + args = [ + "strategy-updater", + "--userdir", + str(tmpdir), + "--strategy-list", + "StrategyTestV2" + ] + pargs = get_args(args) + pargs['config'] = None + + start_strategy_update(pargs) + + assert Path(tmpdir / "strategies_orig_updater").exists() + # Backup file exists + assert Path(tmpdir / "strategies_orig_updater" / 'strategy_test_v2.py').exists() + # updated file exists + new_file = Path(tmpdirp / 'strategy_test_v2.py') + assert new_file.exists() + new_code = new_file.read_text() + assert 'INTERFACE_VERSION = 3' in new_code + assert 'INTERFACE_VERSION = 2' in old_code + captured = capsys.readouterr() + + assert 'Conversion of strategy_test_v2.py started.' in captured.out + assert re.search(r'Conversion of strategy_test_v2\.py took .* seconds', captured.out) + + def test_strategy_updater_methods(default_conf, caplog) -> None: instance_strategy_updater = StrategyUpdater() @@ -155,6 +195,7 @@ import freqtrade.vendor.qtpylib.indicators as qtpylib class someStrategy(IStrategy): + INTERFACE_VERSION = 2 # This is the 3rd comment # This attribute will be overridden if the config file contains "minimal_roi" minimal_roi = { @@ -168,5 +209,6 @@ class someStrategy(IStrategy): assert "This is the 1st comment" in modified_code assert "This is the 2nd comment" in modified_code assert "This is the 3rd comment" in modified_code + assert "INTERFACE_VERSION = 3" in modified_code # currently still missing: # Webhook terminology, Telegram notification settings, Strategy/Config settings