diff --git a/freqtrade/rpc/api_server.py b/freqtrade/rpc/api_server.py index bfde304bd..be9f8a6fd 100644 --- a/freqtrade/rpc/api_server.py +++ b/freqtrade/rpc/api_server.py @@ -1,3 +1,4 @@ +import json import threading import logging # import json @@ -138,7 +139,7 @@ class ApiServer(RPC): Starts TradeThread in bot if stopped. """ msg = self._rpc_start() - return jsonify(msg) + return json.dumps(msg) def stop(self): """ @@ -147,4 +148,4 @@ class ApiServer(RPC): Stops TradeThread in bot if running """ msg = self._rpc_stop() - return jsonify(msg) + return json.dumps(msg) diff --git a/freqtrade/tests/conftest.py b/freqtrade/tests/conftest.py index ce22cd193..25a9b8d00 100644 --- a/freqtrade/tests/conftest.py +++ b/freqtrade/tests/conftest.py @@ -83,6 +83,15 @@ def patch_coinmarketcap(mocker, value: Optional[Dict[str, float]] = None) -> Non ) +def patch_apiserver(mocker) -> None: + mocker.patch.multiple( + 'freqtrade.rpc.api_server.ApiServer', + run=MagicMock(), + register_rest_other=MagicMock(), + register_rest_rpc_urls=MagicMock(), + ) + + @pytest.fixture(scope="function") def default_conf(): """ Returns validated configuration suitable for most tests """ diff --git a/freqtrade/tests/rpc/test_rpc_apiserver.py b/freqtrade/tests/rpc/test_rpc_apiserver.py new file mode 100644 index 000000000..14c35a38e --- /dev/null +++ b/freqtrade/tests/rpc/test_rpc_apiserver.py @@ -0,0 +1,52 @@ +""" +Unit test file for rpc/api_server.py +""" + +from unittest.mock import MagicMock + +from freqtrade.rpc.api_server import ApiServer +from freqtrade.state import State +from freqtrade.tests.conftest import get_patched_freqtradebot, patch_apiserver + + +def test__init__(default_conf, mocker): + """ + Test __init__() method + """ + mocker.patch('freqtrade.rpc.telegram.Updater', MagicMock()) + mocker.patch('freqtrade.rpc.api_server.ApiServer.run', MagicMock()) + + apiserver = ApiServer(get_patched_freqtradebot(mocker, default_conf)) + assert apiserver._config == default_conf + + +def test_start_endpoint(default_conf, mocker): + """Test /start endpoint""" + patch_apiserver(mocker) + bot = get_patched_freqtradebot(mocker, default_conf) + apiserver = ApiServer(bot) + + bot.state = State.STOPPED + assert bot.state == State.STOPPED + result = apiserver.start() + assert result == '{"status": "starting trader ..."}' + assert bot.state == State.RUNNING + + result = apiserver.start() + assert result == '{"status": "already running"}' + + +def test_stop_endpoint(default_conf, mocker): + """Test /stop endpoint""" + patch_apiserver(mocker) + bot = get_patched_freqtradebot(mocker, default_conf) + apiserver = ApiServer(bot) + + bot.state = State.RUNNING + assert bot.state == State.RUNNING + result = apiserver.stop() + assert result == '{"status": "stopping trader ..."}' + assert bot.state == State.STOPPED + + result = apiserver.stop() + assert result == '{"status": "already stopped"}'