test: add explicit test for prepare_balance_distribution
This commit is contained in:
@@ -1,6 +1,7 @@
|
|||||||
from datetime import datetime, timedelta
|
from datetime import datetime, timedelta
|
||||||
from unittest.mock import MagicMock
|
from unittest.mock import MagicMock
|
||||||
|
|
||||||
|
import pandas as pd
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
from freqtrade.enums import CandleType
|
from freqtrade.enums import CandleType
|
||||||
@@ -8,6 +9,7 @@ from freqtrade.persistence import KeyValueStore, Order, Trade, WalletHistory
|
|||||||
from freqtrade.util import dt_now, dt_utc
|
from freqtrade.util import dt_now, dt_utc
|
||||||
from freqtrade.util.migrations.migrate_wallet_history import (
|
from freqtrade.util.migrations.migrate_wallet_history import (
|
||||||
_migrate_wallet_history,
|
_migrate_wallet_history,
|
||||||
|
_prepare_balance_distribution,
|
||||||
migrate_wallet_history,
|
migrate_wallet_history,
|
||||||
)
|
)
|
||||||
from tests.conftest import EXMS, generate_test_data, get_patched_exchange, log_has_re
|
from tests.conftest import EXMS, generate_test_data, get_patched_exchange, log_has_re
|
||||||
@@ -420,3 +422,77 @@ def test_migrate_wallet_history_db_error_handling(
|
|||||||
|
|
||||||
# Migration flag should still be set even after error in _migrate
|
# Migration flag should still be set even after error in _migrate
|
||||||
assert KeyValueStore.get_int_value("wallet_history_migration") == 1
|
assert KeyValueStore.get_int_value("wallet_history_migration") == 1
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.usefixtures("init_persistence")
|
||||||
|
def test__prepare_balance_distribution(default_conf_usdt, fee, time_machine, markets):
|
||||||
|
"""Test migration with multiple trading pairs."""
|
||||||
|
start_time = dt_utc(2024, 1, 15, 12, 0, 0)
|
||||||
|
time_machine.move_to(start_time, tick=False)
|
||||||
|
|
||||||
|
# Bot started 15 days ago
|
||||||
|
bot_start = start_time - timedelta(days=15)
|
||||||
|
KeyValueStore.store_value("bot_start_time", bot_start)
|
||||||
|
|
||||||
|
# Create mock trades for multiple pairs within the date range
|
||||||
|
trade1 = create_mock_trade_for_wallet(
|
||||||
|
fee,
|
||||||
|
"ETH/USDT",
|
||||||
|
open_date=start_time - timedelta(days=10),
|
||||||
|
close_date=start_time - timedelta(days=6),
|
||||||
|
)
|
||||||
|
trade2 = create_mock_trade_for_wallet(
|
||||||
|
fee,
|
||||||
|
"BTC/USDT",
|
||||||
|
open_date=start_time - timedelta(days=7),
|
||||||
|
close_date=start_time - timedelta(days=5),
|
||||||
|
)
|
||||||
|
Trade.session.add(trade1)
|
||||||
|
Trade.session.add(trade2)
|
||||||
|
Trade.commit()
|
||||||
|
|
||||||
|
# Generate mock OHLCV data for both pairs starting from bot_start
|
||||||
|
candle_type = default_conf_usdt.get("candle_type_def", CandleType.SPOT)
|
||||||
|
ohlcv_data = {}
|
||||||
|
ohlcv_data[("ETH/USDT", "1d", candle_type)] = generate_test_data(
|
||||||
|
"1d", size=20, start=bot_start.strftime("%Y-%m-%d"), base=1500
|
||||||
|
)
|
||||||
|
|
||||||
|
ohlcv_data[("BTC/USDT", "1d", candle_type)] = generate_test_data(
|
||||||
|
"1d", size=20, start=bot_start.strftime("%Y-%m-%d"), base=30000
|
||||||
|
)
|
||||||
|
|
||||||
|
exchange = MagicMock()
|
||||||
|
exchange.get_option.return_value = True
|
||||||
|
exchange.markets = markets
|
||||||
|
exchange.refresh_latest_ohlcv.return_value = ohlcv_data
|
||||||
|
|
||||||
|
balance_dist, pairlist_valid = _prepare_balance_distribution(
|
||||||
|
default_conf_usdt, exchange, 1000.0
|
||||||
|
)
|
||||||
|
assert not balance_dist.empty
|
||||||
|
assert len(pairlist_valid) == 2
|
||||||
|
assert "ETH/USDT" in pairlist_valid
|
||||||
|
assert "BTC/USDT" in pairlist_valid
|
||||||
|
|
||||||
|
assert len(balance_dist) == 16 # 16 days from bot_start to now
|
||||||
|
assert balance_dist["USDT"].iloc[0] == 1000.0
|
||||||
|
assert pd.isna(balance_dist["USDT"]).sum() == 0
|
||||||
|
|
||||||
|
assert all(
|
||||||
|
col in balance_dist.columns
|
||||||
|
for col in [
|
||||||
|
"USDT",
|
||||||
|
"ETH/USDT",
|
||||||
|
"ETH/USDT_collateral",
|
||||||
|
"ETH/USDT_leverage",
|
||||||
|
"BTC/USDT",
|
||||||
|
"BTC/USDT_collateral",
|
||||||
|
"BTC/USDT_leverage",
|
||||||
|
"ETH/USDT_open",
|
||||||
|
"BTC/USDT_open",
|
||||||
|
"ETH/USDT_value",
|
||||||
|
"BTC/USDT_value",
|
||||||
|
"total_value",
|
||||||
|
]
|
||||||
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user