feat: require gate reset before post-stop reentry
This commit is contained in:
@@ -48,22 +48,18 @@ async def test_create_and_list_open(session):
|
||||
assert row["current_price"] == 110.0 # marked to the latest close
|
||||
|
||||
|
||||
async def test_create_trade_enforces_post_stop_lockdown_at_service_boundary(session):
|
||||
async def test_create_trade_enforces_post_stop_gate_reset_at_service_boundary(session):
|
||||
blocked_id = await _seed(session, "LOCKQ", close=100.0)
|
||||
released_id = await _seed(session, "FREEQ", close=100.0)
|
||||
today = date.today()
|
||||
market_sessions = [
|
||||
today - timedelta(days=8),
|
||||
today - timedelta(days=7),
|
||||
today - timedelta(days=6),
|
||||
today - timedelta(days=3),
|
||||
today - timedelta(days=2),
|
||||
today - timedelta(days=1),
|
||||
]
|
||||
for market_date in market_sessions:
|
||||
session.add(BenchmarkPrice(symbol="SPY", date=market_date, close=400.0))
|
||||
|
||||
def stopped_trade(ticker_id: int, closed_on: date) -> PaperTrade:
|
||||
def stopped_trade(ticker_id: int, *, gate_reset_complete: bool) -> PaperTrade:
|
||||
closed_on = today - timedelta(days=10)
|
||||
reset_at = datetime.combine(
|
||||
closed_on + timedelta(days=1),
|
||||
datetime.min.time(),
|
||||
tzinfo=timezone.utc,
|
||||
)
|
||||
return PaperTrade(
|
||||
user_id=1,
|
||||
ticker_id=ticker_id,
|
||||
@@ -81,17 +77,21 @@ async def test_create_trade_enforces_post_stop_lockdown_at_service_boundary(sess
|
||||
closed_on, datetime.min.time(), tzinfo=timezone.utc
|
||||
),
|
||||
close_reason="stop",
|
||||
reentry_gate_failed_at=reset_at if gate_reset_complete else None,
|
||||
reentry_gate_requalified_at=(
|
||||
reset_at + timedelta(days=1) if gate_reset_complete else None
|
||||
),
|
||||
)
|
||||
|
||||
session.add_all(
|
||||
[
|
||||
stopped_trade(blocked_id, market_sessions[1]),
|
||||
stopped_trade(released_id, market_sessions[0]),
|
||||
stopped_trade(blocked_id, gate_reset_complete=False),
|
||||
stopped_trade(released_id, gate_reset_complete=True),
|
||||
]
|
||||
)
|
||||
await session.commit()
|
||||
|
||||
with pytest.raises(ValidationError, match="1 market session remaining"):
|
||||
with pytest.raises(ValidationError, match="requires a post-stop gate reset"):
|
||||
await svc.create_trade(
|
||||
session,
|
||||
1,
|
||||
|
||||
Reference in New Issue
Block a user