test: add explicit test for prepare_balance_distribution

This commit is contained in:
Matthias
2026-01-27 19:56:37 +01:00
parent 518092a0ad
commit 138b70a2bf
@@ -1,6 +1,7 @@
from datetime import datetime, timedelta
from unittest.mock import MagicMock
import pandas as pd
import pytest
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.migrations.migrate_wallet_history import (
_migrate_wallet_history,
_prepare_balance_distribution,
migrate_wallet_history,
)
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
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",
]
)