Files
signal-platform/tests/unit/test_migration_022.py
T

101 lines
2.9 KiB
Python

from __future__ import annotations
import importlib.util
from pathlib import Path
import sqlalchemy as sa
from alembic.migration import MigrationContext
from alembic.operations import Operations
def _load_migration_module():
path = (
Path(__file__).resolve().parents[2]
/ "alembic"
/ "versions"
/ "022_add_paper_trade_reentry_gate_reset.py"
)
spec = importlib.util.spec_from_file_location("migration_022", path)
assert spec is not None and spec.loader is not None
module = importlib.util.module_from_spec(spec)
spec.loader.exec_module(module)
return module
def test_upgrade_grandfathers_only_preexisting_initial_stops():
migration = _load_migration_module()
engine = sa.create_engine("sqlite://")
with engine.begin() as connection:
connection.execute(
sa.text(
"""
CREATE TABLE paper_trades (
id INTEGER PRIMARY KEY,
status VARCHAR NOT NULL,
close_reason VARCHAR,
closed_at DATETIME
)
"""
)
)
connection.execute(
sa.text(
"""
INSERT INTO paper_trades (id, status, close_reason, closed_at)
VALUES
(1, 'closed', 'stop', '2026-07-01 12:00:00'),
(2, 'closed', 'manual', '2026-07-02 12:00:00'),
(3, 'open', NULL, NULL)
"""
)
)
context = MigrationContext.configure(connection)
migration.op = Operations(context)
migration.upgrade()
historical = connection.execute(
sa.text(
"""
SELECT closed_at, reentry_gate_failed_at,
reentry_gate_requalified_at
FROM paper_trades
WHERE id = 1
"""
)
).one()
assert historical[1] == historical[0]
assert historical[2] == historical[0]
unaffected = connection.execute(
sa.text(
"""
SELECT reentry_gate_failed_at, reentry_gate_requalified_at
FROM paper_trades
WHERE id IN (2, 3)
ORDER BY id
"""
)
).all()
assert unaffected == [(None, None), (None, None)]
connection.execute(
sa.text(
"""
INSERT INTO paper_trades (id, status, close_reason, closed_at)
VALUES (4, 'closed', 'stop', '2026-07-18 12:00:00')
"""
)
)
new_stop = connection.execute(
sa.text(
"""
SELECT reentry_gate_failed_at, reentry_gate_requalified_at
FROM paper_trades
WHERE id = 4
"""
)
).one()
assert new_stop == (None, None)