Update config to use single quotes
This commit is contained in:
@@ -78,7 +78,7 @@ def patch_exchange(mocker, api_mock=None, id='bittrex', mock_markets=True) -> No
|
||||
def get_patched_exchange(mocker, config, api_mock=None, id='bittrex',
|
||||
mock_markets=True) -> Exchange:
|
||||
patch_exchange(mocker, api_mock, id, mock_markets)
|
||||
config["exchange"]["name"] = id
|
||||
config['exchange']['name'] = id
|
||||
try:
|
||||
exchange = ExchangeResolver.load_exchange(id, config)
|
||||
except ImportError:
|
||||
|
@@ -87,20 +87,20 @@ def test_api_unauthorized(botclient):
|
||||
assert rc.json == {'error': 'Unauthorized'}
|
||||
|
||||
# Change only username
|
||||
ftbot.config['api_server']['username'] = "Ftrader"
|
||||
ftbot.config['api_server']['username'] = 'Ftrader'
|
||||
rc = client_get(client, f"{BASE_URI}/version")
|
||||
assert_response(rc, 401)
|
||||
assert rc.json == {'error': 'Unauthorized'}
|
||||
|
||||
# Change only password
|
||||
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")
|
||||
assert_response(rc, 401)
|
||||
assert rc.json == {'error': 'Unauthorized'}
|
||||
|
||||
ftbot.config['api_server']['username'] = "Ftrader"
|
||||
ftbot.config['api_server']['password'] = "WrongPassword"
|
||||
ftbot.config['api_server']['username'] = 'Ftrader'
|
||||
ftbot.config['api_server']['password'] = 'WrongPassword'
|
||||
|
||||
rc = client_get(client, f"{BASE_URI}/version")
|
||||
assert_response(rc, 401)
|
||||
@@ -677,7 +677,7 @@ def test_api_forcebuy(botclient, mocker, fee):
|
||||
assert rc.json == {"error": "Error querying _forcebuy: Forcebuy not enabled."}
|
||||
|
||||
# enable forcebuy
|
||||
ftbot.config["forcebuy_enable"] = True
|
||||
ftbot.config['forcebuy_enable'] = True
|
||||
|
||||
fbuy_mock = MagicMock(return_value=None)
|
||||
mocker.patch("freqtrade.rpc.RPC._rpc_forcebuy", fbuy_mock)
|
||||
|
@@ -19,64 +19,64 @@ def test_parse_args_none() -> None:
|
||||
|
||||
|
||||
def test_parse_args_defaults(mocker) -> None:
|
||||
mocker.patch.object(Path, "is_file", MagicMock(side_effect=[False, True]))
|
||||
mocker.patch.object(Path, 'is_file', MagicMock(side_effect=[False, True]))
|
||||
args = Arguments(['trade']).get_parsed_arg()
|
||||
assert args["config"] == ['config.json']
|
||||
assert args["strategy_path"] is None
|
||||
assert args["datadir"] is None
|
||||
assert args["verbosity"] == 0
|
||||
assert args['config'] == ['config.json']
|
||||
assert args['strategy_path'] is None
|
||||
assert args['datadir'] is None
|
||||
assert args['verbosity'] == 0
|
||||
|
||||
|
||||
def test_parse_args_default_userdatadir(mocker) -> None:
|
||||
mocker.patch.object(Path, "is_file", MagicMock(return_value=True))
|
||||
mocker.patch.object(Path, 'is_file', MagicMock(return_value=True))
|
||||
args = Arguments(['trade']).get_parsed_arg()
|
||||
# configuration defaults to user_data if that is available.
|
||||
assert args["config"] == [str(Path('user_data/config.json'))]
|
||||
assert args["strategy_path"] is None
|
||||
assert args["datadir"] is None
|
||||
assert args["verbosity"] == 0
|
||||
assert args['config'] == [str(Path('user_data/config.json'))]
|
||||
assert args['strategy_path'] is None
|
||||
assert args['datadir'] is None
|
||||
assert args['verbosity'] == 0
|
||||
|
||||
|
||||
def test_parse_args_userdatadir(mocker) -> None:
|
||||
mocker.patch.object(Path, "is_file", MagicMock(return_value=True))
|
||||
mocker.patch.object(Path, 'is_file', MagicMock(return_value=True))
|
||||
args = Arguments(['trade', '--user-data-dir', 'user_data']).get_parsed_arg()
|
||||
# configuration defaults to user_data if that is available.
|
||||
assert args["config"] == [str(Path('user_data/config.json'))]
|
||||
assert args["strategy_path"] is None
|
||||
assert args["datadir"] is None
|
||||
assert args["verbosity"] == 0
|
||||
assert args['config'] == [str(Path('user_data/config.json'))]
|
||||
assert args['strategy_path'] is None
|
||||
assert args['datadir'] is None
|
||||
assert args['verbosity'] == 0
|
||||
|
||||
|
||||
def test_parse_args_config() -> None:
|
||||
args = Arguments(['trade', '-c', '/dev/null']).get_parsed_arg()
|
||||
assert args["config"] == ['/dev/null']
|
||||
assert args['config'] == ['/dev/null']
|
||||
|
||||
args = Arguments(['trade', '--config', '/dev/null']).get_parsed_arg()
|
||||
assert args["config"] == ['/dev/null']
|
||||
assert args['config'] == ['/dev/null']
|
||||
|
||||
args = Arguments(['trade', '--config', '/dev/null',
|
||||
'--config', '/dev/zero'],).get_parsed_arg()
|
||||
assert args["config"] == ['/dev/null', '/dev/zero']
|
||||
assert args['config'] == ['/dev/null', '/dev/zero']
|
||||
|
||||
|
||||
def test_parse_args_db_url() -> None:
|
||||
args = Arguments(['trade', '--db-url', 'sqlite:///test.sqlite']).get_parsed_arg()
|
||||
assert args["db_url"] == 'sqlite:///test.sqlite'
|
||||
assert args['db_url'] == 'sqlite:///test.sqlite'
|
||||
|
||||
|
||||
def test_parse_args_verbose() -> None:
|
||||
args = Arguments(['trade', '-v']).get_parsed_arg()
|
||||
assert args["verbosity"] == 1
|
||||
assert args['verbosity'] == 1
|
||||
|
||||
args = Arguments(['trade', '--verbose']).get_parsed_arg()
|
||||
assert args["verbosity"] == 1
|
||||
assert args['verbosity'] == 1
|
||||
|
||||
|
||||
def test_common_scripts_options() -> None:
|
||||
args = Arguments(['download-data', '-p', 'ETH/BTC', 'XRP/BTC']).get_parsed_arg()
|
||||
|
||||
assert args["pairs"] == ['ETH/BTC', 'XRP/BTC']
|
||||
assert "func" in args
|
||||
assert args['pairs'] == ['ETH/BTC', 'XRP/BTC']
|
||||
assert 'func' in args
|
||||
|
||||
|
||||
def test_parse_args_version() -> None:
|
||||
@@ -91,7 +91,7 @@ def test_parse_args_invalid() -> None:
|
||||
|
||||
def test_parse_args_strategy() -> None:
|
||||
args = Arguments(['trade', '--strategy', 'SomeStrategy']).get_parsed_arg()
|
||||
assert args["strategy"] == 'SomeStrategy'
|
||||
assert args['strategy'] == 'SomeStrategy'
|
||||
|
||||
|
||||
def test_parse_args_strategy_invalid() -> None:
|
||||
@@ -101,7 +101,7 @@ def test_parse_args_strategy_invalid() -> None:
|
||||
|
||||
def test_parse_args_strategy_path() -> None:
|
||||
args = Arguments(['trade', '--strategy-path', '/some/path']).get_parsed_arg()
|
||||
assert args["strategy_path"] == '/some/path'
|
||||
assert args['strategy_path'] == '/some/path'
|
||||
|
||||
|
||||
def test_parse_args_strategy_path_invalid() -> None:
|
||||
@@ -127,13 +127,13 @@ def test_parse_args_backtesting_custom() -> None:
|
||||
'SampleStrategy'
|
||||
]
|
||||
call_args = Arguments(args).get_parsed_arg()
|
||||
assert call_args["config"] == ['test_conf.json']
|
||||
assert call_args["verbosity"] == 0
|
||||
assert call_args["command"] == 'backtesting'
|
||||
assert call_args["func"] is not None
|
||||
assert call_args["timeframe"] == '1m'
|
||||
assert type(call_args["strategy_list"]) is list
|
||||
assert len(call_args["strategy_list"]) == 2
|
||||
assert call_args['config'] == ['test_conf.json']
|
||||
assert call_args['verbosity'] == 0
|
||||
assert call_args['command'] == 'backtesting'
|
||||
assert call_args['func'] is not None
|
||||
assert call_args['timeframe'] == '1m'
|
||||
assert type(call_args['strategy_list']) is list
|
||||
assert len(call_args['strategy_list']) == 2
|
||||
|
||||
|
||||
def test_parse_args_hyperopt_custom() -> None:
|
||||
@@ -144,13 +144,13 @@ def test_parse_args_hyperopt_custom() -> None:
|
||||
'--spaces', 'buy'
|
||||
]
|
||||
call_args = Arguments(args).get_parsed_arg()
|
||||
assert call_args["config"] == ['test_conf.json']
|
||||
assert call_args["epochs"] == 20
|
||||
assert call_args["verbosity"] == 0
|
||||
assert call_args["command"] == 'hyperopt'
|
||||
assert call_args["spaces"] == ['buy']
|
||||
assert call_args["func"] is not None
|
||||
assert callable(call_args["func"])
|
||||
assert call_args['config'] == ['test_conf.json']
|
||||
assert call_args['epochs'] == 20
|
||||
assert call_args['verbosity'] == 0
|
||||
assert call_args['command'] == 'hyperopt'
|
||||
assert call_args['spaces'] == ['buy']
|
||||
assert call_args['func'] is not None
|
||||
assert callable(call_args['func'])
|
||||
|
||||
|
||||
def test_download_data_options() -> None:
|
||||
@@ -163,10 +163,10 @@ def test_download_data_options() -> None:
|
||||
]
|
||||
pargs = Arguments(args).get_parsed_arg()
|
||||
|
||||
assert pargs["pairs_file"] == 'file_with_pairs'
|
||||
assert pargs["datadir"] == 'datadir/directory'
|
||||
assert pargs["days"] == 30
|
||||
assert pargs["exchange"] == 'binance'
|
||||
assert pargs['pairs_file'] == 'file_with_pairs'
|
||||
assert pargs['datadir'] == 'datadir/directory'
|
||||
assert pargs['days'] == 30
|
||||
assert pargs['exchange'] == 'binance'
|
||||
|
||||
|
||||
def test_plot_dataframe_options() -> None:
|
||||
@@ -180,10 +180,10 @@ def test_plot_dataframe_options() -> None:
|
||||
]
|
||||
pargs = Arguments(args).get_parsed_arg()
|
||||
|
||||
assert pargs["indicators1"] == ["sma10", "sma100"]
|
||||
assert pargs["indicators2"] == ["macd", "fastd", "fastk"]
|
||||
assert pargs["plot_limit"] == 30
|
||||
assert pargs["pairs"] == ["UNITTEST/BTC"]
|
||||
assert pargs['indicators1'] == ['sma10', 'sma100']
|
||||
assert pargs['indicators2'] == ['macd', 'fastd', 'fastk']
|
||||
assert pargs['plot_limit'] == 30
|
||||
assert pargs['pairs'] == ['UNITTEST/BTC']
|
||||
|
||||
|
||||
def test_plot_profit_options() -> None:
|
||||
@@ -191,66 +191,66 @@ def test_plot_profit_options() -> None:
|
||||
'plot-profit',
|
||||
'-p', 'UNITTEST/BTC',
|
||||
'--trade-source', 'DB',
|
||||
"--db-url", "sqlite:///whatever.sqlite",
|
||||
'--db-url', 'sqlite:///whatever.sqlite',
|
||||
]
|
||||
pargs = Arguments(args).get_parsed_arg()
|
||||
|
||||
assert pargs["trade_source"] == "DB"
|
||||
assert pargs["pairs"] == ["UNITTEST/BTC"]
|
||||
assert pargs["db_url"] == "sqlite:///whatever.sqlite"
|
||||
assert pargs['trade_source'] == 'DB'
|
||||
assert pargs['pairs'] == ['UNITTEST/BTC']
|
||||
assert pargs['db_url'] == 'sqlite:///whatever.sqlite'
|
||||
|
||||
|
||||
def test_config_notallowed(mocker) -> None:
|
||||
mocker.patch.object(Path, "is_file", MagicMock(return_value=False))
|
||||
mocker.patch.object(Path, 'is_file', MagicMock(return_value=False))
|
||||
args = [
|
||||
'create-userdir',
|
||||
]
|
||||
pargs = Arguments(args).get_parsed_arg()
|
||||
|
||||
assert "config" not in pargs
|
||||
assert 'config' not in pargs
|
||||
|
||||
# When file exists:
|
||||
mocker.patch.object(Path, "is_file", MagicMock(return_value=True))
|
||||
mocker.patch.object(Path, 'is_file', MagicMock(return_value=True))
|
||||
args = [
|
||||
'create-userdir',
|
||||
]
|
||||
pargs = Arguments(args).get_parsed_arg()
|
||||
# config is not added even if it exists, since create-userdir is in the notallowed list
|
||||
assert "config" not in pargs
|
||||
assert 'config' not in pargs
|
||||
|
||||
|
||||
def test_config_notrequired(mocker) -> None:
|
||||
mocker.patch.object(Path, "is_file", MagicMock(return_value=False))
|
||||
mocker.patch.object(Path, 'is_file', MagicMock(return_value=False))
|
||||
args = [
|
||||
'download-data',
|
||||
]
|
||||
pargs = Arguments(args).get_parsed_arg()
|
||||
|
||||
assert pargs["config"] is None
|
||||
assert pargs['config'] is None
|
||||
|
||||
# When file exists:
|
||||
mocker.patch.object(Path, "is_file", MagicMock(side_effect=[False, True]))
|
||||
mocker.patch.object(Path, 'is_file', MagicMock(side_effect=[False, True]))
|
||||
args = [
|
||||
'download-data',
|
||||
]
|
||||
pargs = Arguments(args).get_parsed_arg()
|
||||
# config is added if it exists
|
||||
assert pargs["config"] == ['config.json']
|
||||
assert pargs['config'] == ['config.json']
|
||||
|
||||
|
||||
def test_check_int_positive() -> None:
|
||||
assert check_int_positive("3") == 3
|
||||
assert check_int_positive("1") == 1
|
||||
assert check_int_positive("100") == 100
|
||||
assert check_int_positive('3') == 3
|
||||
assert check_int_positive('1') == 1
|
||||
assert check_int_positive('100') == 100
|
||||
|
||||
with pytest.raises(argparse.ArgumentTypeError):
|
||||
check_int_positive("-2")
|
||||
check_int_positive('-2')
|
||||
|
||||
with pytest.raises(argparse.ArgumentTypeError):
|
||||
check_int_positive("0")
|
||||
check_int_positive('0')
|
||||
|
||||
with pytest.raises(argparse.ArgumentTypeError):
|
||||
check_int_positive("3.5")
|
||||
check_int_positive('3.5')
|
||||
|
||||
with pytest.raises(argparse.ArgumentTypeError):
|
||||
check_int_positive("DeadBeef")
|
||||
check_int_positive('DeadBeef')
|
||||
|
@@ -1005,7 +1005,7 @@ def test_pairlist_resolving_fallback(mocker):
|
||||
|
||||
args = Arguments(arglist).get_parsed_arg()
|
||||
# Fix flaky tests if config.json exists
|
||||
args["config"] = None
|
||||
args['config'] = None
|
||||
|
||||
configuration = Configuration(args, RunMode.OTHER)
|
||||
config = configuration.get_config()
|
||||
|
@@ -44,19 +44,19 @@ def test_parse_args_backtesting(mocker) -> None:
|
||||
|
||||
|
||||
def test_main_start_hyperopt(mocker) -> None:
|
||||
mocker.patch.object(Path, "is_file", MagicMock(side_effect=[False, True]))
|
||||
mocker.patch.object(Path, 'is_file', MagicMock(side_effect=[False, True]))
|
||||
hyperopt_mock = mocker.patch('freqtrade.commands.start_hyperopt', MagicMock())
|
||||
hyperopt_mock.__name__ = PropertyMock("start_hyperopt")
|
||||
hyperopt_mock.__name__ = PropertyMock('start_hyperopt')
|
||||
# it's sys.exit(0) at the end of hyperopt
|
||||
with pytest.raises(SystemExit):
|
||||
main(['hyperopt'])
|
||||
assert hyperopt_mock.call_count == 1
|
||||
call_args = hyperopt_mock.call_args[0][0]
|
||||
assert call_args["config"] == ['config.json']
|
||||
assert call_args["verbosity"] == 0
|
||||
assert call_args["command"] == 'hyperopt'
|
||||
assert call_args["func"] is not None
|
||||
assert callable(call_args["func"])
|
||||
assert call_args['config'] == ['config.json']
|
||||
assert call_args['verbosity'] == 0
|
||||
assert call_args['command'] == 'hyperopt'
|
||||
assert call_args['func'] is not None
|
||||
assert callable(call_args['func'])
|
||||
|
||||
|
||||
def test_main_fatal_exception(mocker, default_conf, caplog) -> None:
|
||||
|
@@ -362,22 +362,22 @@ def test_start_plot_profit(mocker):
|
||||
def test_start_plot_profit_error(mocker):
|
||||
|
||||
args = [
|
||||
"plot-profit",
|
||||
"--pairs", "ETH/BTC"
|
||||
'plot-profit',
|
||||
'--pairs', 'ETH/BTC'
|
||||
]
|
||||
argsp = get_args(args)
|
||||
# Make sure we use no config. Details: #2241
|
||||
# not resetting config causes random failures if config.json exists
|
||||
argsp["config"] = []
|
||||
argsp['config'] = []
|
||||
with pytest.raises(OperationalException):
|
||||
start_plot_profit(argsp)
|
||||
|
||||
|
||||
def test_plot_profit(default_conf, mocker, testdatadir, caplog):
|
||||
default_conf['trade_source'] = 'file'
|
||||
default_conf["datadir"] = testdatadir
|
||||
default_conf['exportfilename'] = testdatadir / "backtest-result_test_nofile.json"
|
||||
default_conf['pairs'] = ["ETH/BTC", "LTC/BTC"]
|
||||
default_conf['datadir'] = testdatadir
|
||||
default_conf['exportfilename'] = testdatadir / 'backtest-result_test_nofile.json'
|
||||
default_conf['pairs'] = ['ETH/BTC', 'LTC/BTC']
|
||||
|
||||
profit_mock = MagicMock()
|
||||
store_mock = MagicMock()
|
||||
|
Reference in New Issue
Block a user