From 3e3436e432e95364aab76bd2aee421ed01936757 Mon Sep 17 00:00:00 2001 From: Matthias Date: Tue, 21 Apr 2026 07:17:32 +0200 Subject: [PATCH] test: add explicit test for db_migration --- tests/persistence/test_db_migration.py | 69 ++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 tests/persistence/test_db_migration.py diff --git a/tests/persistence/test_db_migration.py b/tests/persistence/test_db_migration.py new file mode 100644 index 000000000..5cd75f038 --- /dev/null +++ b/tests/persistence/test_db_migration.py @@ -0,0 +1,69 @@ +from unittest.mock import MagicMock + +from freqtrade.persistence.base import ModelBase +from freqtrade.persistence.custom_data import _CustomData +from freqtrade.persistence.db_migration import migrate_db +from freqtrade.persistence.key_value_store import _KeyValueStoreModel +from freqtrade.persistence.pairlock import PairLock +from freqtrade.persistence.trade_model import Trade +from freqtrade.persistence.wallet_history import WalletHistory + + +def test_migrate_db_detail(mocker): + # Expected models to be migrated based on the registered models + expected_models = {mapper.class_.__name__ for mapper in ModelBase.registry.mappers} + session_target = MagicMock() + + order = MagicMock() + trade = MagicMock(orders=[order]) + pairlock = MagicMock() + kv = MagicMock() + custom_data = MagicMock() + wallet_history = MagicMock() + + kv_session = MagicMock() + kv_session.scalars.return_value = [kv] + custom_data_session = MagicMock() + custom_data_session.scalars.return_value = [custom_data] + wallet_history_session = MagicMock() + wallet_history_session.scalars.return_value = [wallet_history] + + mocker.patch.object(Trade, "get_trades", return_value=[trade]) + mocker.patch.object(PairLock, "get_all_locks", return_value=[pairlock]) + mocker.patch.object(_KeyValueStoreModel, "session", kv_session, create=True) + mocker.patch.object(_CustomData, "session", custom_data_session, create=True) + mocker.patch.object(WalletHistory, "session", wallet_history_session, create=True) + + make_transient_mock = mocker.patch("freqtrade.persistence.db_migration.make_transient") + set_sequence_ids_mock = mocker.patch("freqtrade.persistence.db_migration.set_sequence_ids") + + # max ids for Trade, Order, PairLock, KeyValueStore, CustomData, WalletHistory + session_target.scalar.side_effect = [10, 11, 12, 13, 14, 15] + session_target.get_bind.return_value = "bind" + + migrate_db(session_target) + + assert session_target.add.call_count == 5 + # Order objects are linked to trades, so they are not added explicitly + + assert session_target.add.call_count == len(expected_models) - 1 + session_target.add.assert_any_call(trade) + session_target.add.assert_any_call(pairlock) + session_target.add.assert_any_call(kv) + session_target.add.assert_any_call(custom_data) + session_target.add.assert_any_call(wallet_history) + + assert session_target.commit.call_count == 5 + assert make_transient_mock.call_count == 6 + make_transient_mock.assert_any_call(trade) + make_transient_mock.assert_any_call(order) + + set_sequence_ids_mock.assert_called_once_with( + "bind", + trade_id=11, + order_id=12, + pairlock_id=13, + kv_id=14, + custom_data_id=15, + wallet_history_id=16, + )