Fix some initial tests towards fastAPI
This commit is contained in:
parent
4b86700a0f
commit
f37ea4ba24
@ -7,6 +7,7 @@ from pathlib import Path
|
|||||||
from unittest.mock import ANY, MagicMock, PropertyMock
|
from unittest.mock import ANY, MagicMock, PropertyMock
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
|
from fastapi.testclient import TestClient
|
||||||
from flask import Flask
|
from flask import Flask
|
||||||
from requests.auth import _basic_auth_str
|
from requests.auth import _basic_auth_str
|
||||||
|
|
||||||
@ -14,7 +15,8 @@ from freqtrade.__init__ import __version__
|
|||||||
from freqtrade.loggers import setup_logging, setup_logging_pre
|
from freqtrade.loggers import setup_logging, setup_logging_pre
|
||||||
from freqtrade.persistence import PairLocks, Trade
|
from freqtrade.persistence import PairLocks, Trade
|
||||||
from freqtrade.rpc import RPC
|
from freqtrade.rpc import RPC
|
||||||
from freqtrade.rpc.api_server import BASE_URI, ApiServer
|
from freqtrade.rpc.api_server import BASE_URI # , ApiServer
|
||||||
|
from freqtrade.rpc.api_server2 import ApiServer
|
||||||
from freqtrade.state import RunMode, State
|
from freqtrade.state import RunMode, State
|
||||||
from tests.conftest import create_mock_trades, get_patched_freqtradebot, log_has, patch_get_signal
|
from tests.conftest import create_mock_trades, get_patched_freqtradebot, log_has, patch_get_signal
|
||||||
|
|
||||||
@ -38,18 +40,19 @@ def botclient(default_conf, mocker):
|
|||||||
|
|
||||||
ftbot = get_patched_freqtradebot(mocker, default_conf)
|
ftbot = get_patched_freqtradebot(mocker, default_conf)
|
||||||
rpc = RPC(ftbot)
|
rpc = RPC(ftbot)
|
||||||
mocker.patch('freqtrade.rpc.api_server.ApiServer.run', MagicMock())
|
mocker.patch('freqtrade.rpc.api_server2.ApiServer.start_api', MagicMock())
|
||||||
apiserver = ApiServer(rpc, default_conf)
|
apiserver = ApiServer(rpc, default_conf)
|
||||||
yield ftbot, apiserver.app.test_client()
|
yield ftbot, TestClient(apiserver.app)
|
||||||
# Cleanup ... ?
|
# Cleanup ... ?
|
||||||
|
|
||||||
|
|
||||||
def client_post(client, url, data={}):
|
def client_post(client, url, data={}):
|
||||||
return client.post(url,
|
return client.post(url,
|
||||||
content_type="application/json",
|
|
||||||
data=data,
|
data=data,
|
||||||
headers={'Authorization': _basic_auth_str(_TEST_USER, _TEST_PASS),
|
headers={'Authorization': _basic_auth_str(_TEST_USER, _TEST_PASS),
|
||||||
'Origin': 'http://example.com'})
|
'Origin': 'http://example.com',
|
||||||
|
'content-type': 'application/json'
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
def client_get(client, url):
|
def client_get(client, url):
|
||||||
@ -66,10 +69,10 @@ def client_delete(client, url):
|
|||||||
|
|
||||||
def assert_response(response, expected_code=200, needs_cors=True):
|
def assert_response(response, expected_code=200, needs_cors=True):
|
||||||
assert response.status_code == expected_code
|
assert response.status_code == expected_code
|
||||||
assert response.content_type == "application/json"
|
assert response.headers.get('content-type') == "application/json"
|
||||||
if needs_cors:
|
if needs_cors:
|
||||||
assert ('Access-Control-Allow-Credentials', 'true') in response.headers._list
|
assert ('access-control-allow-credentials', 'true') in response.headers.items()
|
||||||
assert ('Access-Control-Allow-Origin', 'http://example.com') in response.headers._list
|
assert ('access-control-allow-origin', 'http://example.com') in response.headers.items()
|
||||||
|
|
||||||
|
|
||||||
def test_api_not_found(botclient):
|
def test_api_not_found(botclient):
|
||||||
@ -77,7 +80,7 @@ def test_api_not_found(botclient):
|
|||||||
|
|
||||||
rc = client_post(client, f"{BASE_URI}/invalid_url")
|
rc = client_post(client, f"{BASE_URI}/invalid_url")
|
||||||
assert_response(rc, 404)
|
assert_response(rc, 404)
|
||||||
assert rc.json == {"status": "error",
|
assert rc.json() == {"status": "error",
|
||||||
"reason": f"There's no API call for http://localhost{BASE_URI}/invalid_url.",
|
"reason": f"There's no API call for http://localhost{BASE_URI}/invalid_url.",
|
||||||
"code": 404
|
"code": 404
|
||||||
}
|
}
|
||||||
@ -87,45 +90,44 @@ def test_api_unauthorized(botclient):
|
|||||||
ftbot, client = botclient
|
ftbot, client = botclient
|
||||||
rc = client.get(f"{BASE_URI}/ping")
|
rc = client.get(f"{BASE_URI}/ping")
|
||||||
assert_response(rc, needs_cors=False)
|
assert_response(rc, needs_cors=False)
|
||||||
assert rc.json == {'status': 'pong'}
|
assert rc.json() == {'status': 'pong'}
|
||||||
|
|
||||||
# Don't send user/pass information
|
# Don't send user/pass information
|
||||||
rc = client.get(f"{BASE_URI}/version")
|
rc = client.get(f"{BASE_URI}/version")
|
||||||
assert_response(rc, 401, needs_cors=False)
|
assert_response(rc, 401, needs_cors=False)
|
||||||
assert rc.json == {'error': 'Unauthorized'}
|
assert rc.json() == {'error': 'Unauthorized'}
|
||||||
|
|
||||||
# Change only username
|
# Change only username
|
||||||
ftbot.config['api_server']['username'] = 'Ftrader'
|
ftbot.config['api_server']['username'] = 'Ftrader'
|
||||||
rc = client_get(client, f"{BASE_URI}/version")
|
rc = client_get(client, f"{BASE_URI}/version")
|
||||||
assert_response(rc, 401)
|
assert_response(rc, 401)
|
||||||
assert rc.json == {'error': 'Unauthorized'}
|
assert rc.json() == {'error': 'Unauthorized'}
|
||||||
|
|
||||||
# Change only password
|
# Change only password
|
||||||
ftbot.config['api_server']['username'] = _TEST_USER
|
ftbot.config['api_server']['username'] = _TEST_USER
|
||||||
ftbot.config['api_server']['password'] = 'WrongPassword'
|
ftbot.config['api_server']['password'] = 'WrongPassword'
|
||||||
rc = client_get(client, f"{BASE_URI}/version")
|
rc = client_get(client, f"{BASE_URI}/version")
|
||||||
assert_response(rc, 401)
|
assert_response(rc, 401)
|
||||||
assert rc.json == {'error': 'Unauthorized'}
|
assert rc.json() == {'error': 'Unauthorized'}
|
||||||
|
|
||||||
ftbot.config['api_server']['username'] = 'Ftrader'
|
ftbot.config['api_server']['username'] = 'Ftrader'
|
||||||
ftbot.config['api_server']['password'] = 'WrongPassword'
|
ftbot.config['api_server']['password'] = 'WrongPassword'
|
||||||
|
|
||||||
rc = client_get(client, f"{BASE_URI}/version")
|
rc = client_get(client, f"{BASE_URI}/version")
|
||||||
assert_response(rc, 401)
|
assert_response(rc, 401)
|
||||||
assert rc.json == {'error': 'Unauthorized'}
|
assert rc.json() == {'error': 'Unauthorized'}
|
||||||
|
|
||||||
|
|
||||||
def test_api_token_login(botclient):
|
def test_api_token_login(botclient):
|
||||||
ftbot, client = botclient
|
ftbot, client = botclient
|
||||||
rc = client_post(client, f"{BASE_URI}/token/login")
|
rc = client_post(client, f"{BASE_URI}/token/login")
|
||||||
assert_response(rc)
|
assert_response(rc)
|
||||||
assert 'access_token' in rc.json
|
assert 'access_token' in rc.json()
|
||||||
assert 'refresh_token' in rc.json
|
assert 'refresh_token' in rc.json()
|
||||||
|
|
||||||
# test Authentication is working with JWT tokens too
|
# test Authentication is working with JWT tokens too
|
||||||
rc = client.get(f"{BASE_URI}/count",
|
rc = client.get(f"{BASE_URI}/count",
|
||||||
content_type="application/json",
|
headers={'Authorization': f'Bearer {rc.json()["access_token"]}',
|
||||||
headers={'Authorization': f'Bearer {rc.json["access_token"]}',
|
|
||||||
'Origin': 'http://example.com'})
|
'Origin': 'http://example.com'})
|
||||||
assert_response(rc)
|
assert_response(rc)
|
||||||
|
|
||||||
@ -268,7 +270,7 @@ def test_api_reloadconf(botclient):
|
|||||||
|
|
||||||
rc = client_post(client, f"{BASE_URI}/reload_config")
|
rc = client_post(client, f"{BASE_URI}/reload_config")
|
||||||
assert_response(rc)
|
assert_response(rc)
|
||||||
assert rc.json == {'status': 'Reloading config ...'}
|
assert rc.json() == {'status': 'Reloading config ...'}
|
||||||
assert ftbot.state == State.RELOAD_CONFIG
|
assert ftbot.state == State.RELOAD_CONFIG
|
||||||
|
|
||||||
|
|
||||||
@ -278,7 +280,7 @@ def test_api_stopbuy(botclient):
|
|||||||
|
|
||||||
rc = client_post(client, f"{BASE_URI}/stopbuy")
|
rc = client_post(client, f"{BASE_URI}/stopbuy")
|
||||||
assert_response(rc)
|
assert_response(rc)
|
||||||
assert rc.json == {'status': 'No more buy will occur from now. Run /reload_config to reset.'}
|
assert rc.json() == {'status': 'No more buy will occur from now. Run /reload_config to reset.'}
|
||||||
assert ftbot.config['max_open_trades'] == 0
|
assert ftbot.config['max_open_trades'] == 0
|
||||||
|
|
||||||
|
|
||||||
@ -293,9 +295,9 @@ def test_api_balance(botclient, mocker, rpc_balance):
|
|||||||
|
|
||||||
rc = client_get(client, f"{BASE_URI}/balance")
|
rc = client_get(client, f"{BASE_URI}/balance")
|
||||||
assert_response(rc)
|
assert_response(rc)
|
||||||
assert "currencies" in rc.json
|
assert "currencies" in rc.json()
|
||||||
assert len(rc.json["currencies"]) == 5
|
assert len(rc.json()["currencies"]) == 5
|
||||||
assert rc.json['currencies'][0] == {
|
assert rc.json()['currencies'][0] == {
|
||||||
'currency': 'BTC',
|
'currency': 'BTC',
|
||||||
'free': 12.0,
|
'free': 12.0,
|
||||||
'balance': 12.0,
|
'balance': 12.0,
|
||||||
@ -318,15 +320,15 @@ def test_api_count(botclient, mocker, ticker, fee, markets):
|
|||||||
rc = client_get(client, f"{BASE_URI}/count")
|
rc = client_get(client, f"{BASE_URI}/count")
|
||||||
assert_response(rc)
|
assert_response(rc)
|
||||||
|
|
||||||
assert rc.json["current"] == 0
|
assert rc.json()["current"] == 0
|
||||||
assert rc.json["max"] == 1.0
|
assert rc.json()["max"] == 1.0
|
||||||
|
|
||||||
# Create some test data
|
# Create some test data
|
||||||
ftbot.enter_positions()
|
ftbot.enter_positions()
|
||||||
rc = client_get(client, f"{BASE_URI}/count")
|
rc = client_get(client, f"{BASE_URI}/count")
|
||||||
assert_response(rc)
|
assert_response(rc)
|
||||||
assert rc.json["current"] == 1.0
|
assert rc.json()["current"] == 1.0
|
||||||
assert rc.json["max"] == 1.0
|
assert rc.json()["max"] == 1.0
|
||||||
|
|
||||||
|
|
||||||
def test_api_locks(botclient):
|
def test_api_locks(botclient):
|
||||||
@ -359,15 +361,15 @@ def test_api_show_config(botclient, mocker):
|
|||||||
|
|
||||||
rc = client_get(client, f"{BASE_URI}/show_config")
|
rc = client_get(client, f"{BASE_URI}/show_config")
|
||||||
assert_response(rc)
|
assert_response(rc)
|
||||||
assert 'dry_run' in rc.json
|
assert 'dry_run' in rc.json()
|
||||||
assert rc.json['exchange'] == 'bittrex'
|
assert rc.json()['exchange'] == 'bittrex'
|
||||||
assert rc.json['timeframe'] == '5m'
|
assert rc.json()['timeframe'] == '5m'
|
||||||
assert rc.json['timeframe_ms'] == 300000
|
assert rc.json()['timeframe_ms'] == 300000
|
||||||
assert rc.json['timeframe_min'] == 5
|
assert rc.json()['timeframe_min'] == 5
|
||||||
assert rc.json['state'] == 'running'
|
assert rc.json()['state'] == 'running'
|
||||||
assert not rc.json['trailing_stop']
|
assert not rc.json()['trailing_stop']
|
||||||
assert 'bid_strategy' in rc.json
|
assert 'bid_strategy' in rc.json()
|
||||||
assert 'ask_strategy' in rc.json
|
assert 'ask_strategy' in rc.json()
|
||||||
|
|
||||||
|
|
||||||
def test_api_daily(botclient, mocker, ticker, fee, markets):
|
def test_api_daily(botclient, mocker, ticker, fee, markets):
|
||||||
@ -722,7 +724,7 @@ def test_api_version(botclient):
|
|||||||
|
|
||||||
rc = client_get(client, f"{BASE_URI}/version")
|
rc = client_get(client, f"{BASE_URI}/version")
|
||||||
assert_response(rc)
|
assert_response(rc)
|
||||||
assert rc.json == {"version": __version__}
|
assert rc.json() == {"version": __version__}
|
||||||
|
|
||||||
|
|
||||||
def test_api_blacklist(botclient, mocker):
|
def test_api_blacklist(botclient, mocker):
|
||||||
|
Loading…
Reference in New Issue
Block a user