From b44d215b90a5253d1069a43f6e9b7f6a751108c9 Mon Sep 17 00:00:00 2001 From: Matthias Date: Thu, 1 Apr 2021 19:59:49 +0200 Subject: [PATCH] Add test for backtest via APII --- freqtrade/rpc/api_server/api_backtest.py | 6 +-- tests/rpc/test_rpc_apiserver.py | 66 ++++++++++++++++++++++++ 2 files changed, 69 insertions(+), 3 deletions(-) diff --git a/freqtrade/rpc/api_server/api_backtest.py b/freqtrade/rpc/api_server/api_backtest.py index ea566f1f1..48aee0cc5 100644 --- a/freqtrade/rpc/api_server/api_backtest.py +++ b/freqtrade/rpc/api_server/api_backtest.py @@ -70,7 +70,7 @@ async def api_start_backtest(bt_settings: BacktestRequest, background_tasks: Bac ApiServer._bt.results = generate_backtest_stats( ApiServer._backtestdata, ApiServer._bt.all_results, min_date=min_date, max_date=max_date) - logger.info("Backtesting finished.") + logger.info("Backtest finished.") finally: ApiServer._bgtask_running = False @@ -110,7 +110,7 @@ def api_get_backtest(): "running": False, "step": "", "progress": 0, - "status_msg": "Backtesting not yet executed" + "status_msg": "Backtest not yet executed" } return { @@ -145,5 +145,5 @@ def api_delete_backtest(): "running": False, "step": "", "progress": 0, - "status_msg": "Backtesting reset", + "status_msg": "Backtest reset", } diff --git a/tests/rpc/test_rpc_apiserver.py b/tests/rpc/test_rpc_apiserver.py index a8ffd3eff..329d5e32f 100644 --- a/tests/rpc/test_rpc_apiserver.py +++ b/tests/rpc/test_rpc_apiserver.py @@ -2,6 +2,7 @@ Unit test file for rpc/api_server.py """ +import json from datetime import datetime, timedelta, timezone from pathlib import Path from unittest.mock import ANY, MagicMock, PropertyMock @@ -1227,3 +1228,68 @@ def test_list_available_pairs(botclient): assert rc.json()['length'] == 1 assert rc.json()['pairs'] == ['XRP/ETH'] assert len(rc.json()['pair_interval']) == 1 + + +def test_api_backtesting(botclient, mocker, fee): + ftbot, client = botclient + mocker.patch('freqtrade.exchange.Exchange.get_fee', fee) + + # Backtesting not started yet + rc = client_get(client, f"{BASE_URI}/backtest") + assert_response(rc) + + result = rc.json() + assert result['status'] == 'not_started' + assert not result['running'] + assert result['status_msg'] == 'Backtest not yet executed' + assert result['progress'] == 0 + + # Reset backtesting + rc = client_delete(client, f"{BASE_URI}/backtest") + assert_response(rc) + result = rc.json() + assert result['status'] == 'reset' + assert not result['running'] + assert result['status_msg'] == 'Backtest reset' + + # bt_mock = mocker.patch('freqtrade.optimize.backtesting.Backtesting.backtest_one_strategy', + # return_value=(1, 2)) + # stats_mock = mocker.patch('freqtrade.optimize.optimize_reports.generate_backtest_stats') + # bt_mock.load_bt_data = MagicMock(return_value=(xxx, 'asdfadf')) + # start backtesting + data = { + "strategy": "DefaultStrategy", + "timeframe": "5m", + "timerange": "20180110-20180111", + "max_open_trades": 3, + "stake_amount": 100, + "dry_run_wallet": 1000, + "enable_protections": False + } + rc = client_post(client, f"{BASE_URI}/backtest", data=json.dumps(data)) + assert_response(rc) + result = rc.json() + + assert result['status'] == 'running' + assert result['progress'] == 0 + assert result['running'] + assert result['status_msg'] == 'Backtest started' + + rc = client_get(client, f"{BASE_URI}/backtest") + assert_response(rc) + + result = rc.json() + assert result['status'] == 'ended' + assert not result['running'] + assert result['status_msg'] == 'Backtest ended' + assert result['progress'] == 1 + assert result['backtest_result'] + + # Delete backtesting to avoid leakage since the backtest-object may stick around. + rc = client_delete(client, f"{BASE_URI}/backtest") + assert_response(rc) + + result = rc.json() + assert result['status'] == 'reset' + assert not result['running'] + assert result['status_msg'] == 'Backtest reset'