It was never in the enabled timeframes, so it held zero bars and produced no levels, but it still carried weight 8 in the scoring table and forced bucket_start to special-case a wall-clock ET anchor whose entire purpose was surviving DST transitions. That was the most intricate logic in session.py, maintained for a timeframe nobody used. Daily is now the only session-anchored bucket, which is a much easier rule to state and to keep correct. The DST parametrised tests go with it; the Sunday open and daily boundary cases remain. Manual-line tests move to 1h, so the weight assertions drop from 8 to 4. The plan document keeps its 4h examples — rewriting a dozen illustrative sentences would churn more than it clarifies — but the timeframe-roles section now records the removal so nothing reads as a spec to build. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
45 lines
1.4 KiB
Python
45 lines
1.4 KiB
Python
from datetime import datetime
|
|
from zoneinfo import ZoneInfo
|
|
|
|
import pytest
|
|
|
|
from app.bars.models import Timeframe
|
|
from app.bars.session import bucket_start
|
|
|
|
UTC = ZoneInfo("UTC")
|
|
ET = ZoneInfo("America/New_York")
|
|
|
|
|
|
def epoch(value: str, zone=UTC) -> int:
|
|
return int(datetime.fromisoformat(value).replace(tzinfo=zone).timestamp())
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
("value", "tf", "expected"),
|
|
[
|
|
("2026-08-09T22:00:00", Timeframe.D1, "2026-08-09T22:00:00"),
|
|
("2026-08-10T16:37:00", Timeframe.D1, "2026-08-09T22:00:00"),
|
|
("2026-08-14T20:59:00", Timeframe.D1, "2026-08-13T22:00:00"),
|
|
("2026-08-10T21:30:00", Timeframe.D1, "2026-08-09T22:00:00"),
|
|
("2026-08-10T22:00:00", Timeframe.D1, "2026-08-10T22:00:00"),
|
|
],
|
|
)
|
|
def test_session_boundaries(value, tf, expected):
|
|
assert bucket_start(epoch(value), tf) == epoch(expected)
|
|
|
|
|
|
def test_intraday_buckets_use_utc_boundaries():
|
|
assert bucket_start(epoch("2026-08-10T12:37:45"), Timeframe.M15) == epoch(
|
|
"2026-08-10T12:30:00"
|
|
)
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
("local_value", "expected_local"),
|
|
[
|
|
("2026-03-08T18:00:00", "2026-03-08T18:00:00"),
|
|
("2026-11-01T18:00:00", "2026-11-01T18:00:00"),
|
|
],
|
|
)
|
|
def test_sunday_open_across_dst(local_value, expected_local):
|
|
assert bucket_start(epoch(local_value, ET), Timeframe.D1) == epoch(expected_local, ET)
|