Files
tick-stock-panel/backend/tests/test_pipeline_beijing_today.py
T
shy3130 285dd9b701 fix(data): #514 symbol 级判坏 + 精确修复 + 后置校验 + 自动修复退避
- 判坏改 symbol 级: 盘中快照行中 symbol 同分区无权威行才算缺陷 (两者兼有=无害残留); IntegrityIssue.symbols 带出坏票清单; 旧比例兜底保留, 37 个锁定用例全绿
- 修复只拉坏 symbol (override_symbols 链路: boot 自检/实时 gate/数据修正), 不再一只坏票全市场重拉; 单票失败 failed_out 上浮 stage_errors
- 修复分支末尾重扫覆盖日, 仍有 issue 则任务如实 failed
- 自动修复退避 .integrity_repair_backoff.json (6h): 期内 boot/gate 跳过, gate 409 指向手动修正; 数据页手动修正不受限
2026-10-27 18:45:17 +08:00

55 lines
2.2 KiB
Python

"""盘后管道的「今天」必须是北京日期, 不能用服务器本地 date.today()。
调度默认 15:35 北京时间。美西主机此时本地日历日仍是昨天: 未修复代码
today_exists 把「北京昨天的日K」当成今天已齐, 窗口右端停在昨天, 当日官方
收盘价永远拉不进来。UTC 主机在北京 00:00-08:00 有同样错位。
"""
from __future__ import annotations
from datetime import date
from types import SimpleNamespace
import pytest
from app.jobs import daily_pipeline
from app.services import instrument_sync, kline_sync
BJ = date(2026, 3, 2)
LOCAL = date(2026, 3, 1)
class _StopError(Exception):
"""日K窗口已经记下, 后面的管道阶段与本 bug 无关。"""
def test_pipeline_daily_window_ends_on_beijing_today(monkeypatch, tmp_path) -> None:
"""数据修正/补拉路径的窗口右端必须是北京今天。
raising=False: 未修复代码没有调用 cn_today, 钉了也不会被用到,
仍走 date.today() → 与 2026-03-02 不等。
"""
captured: list[date] = []
def fake_batch(universe, repo, capset, start_date=None, end_date=None, on_chunk_done=None,
failed_out=None):
captured.append(end_date.date() if hasattr(end_date, "date") else end_date)
raise _StopError()
monkeypatch.setattr(daily_pipeline, "cn_today", lambda: BJ, raising=False)
monkeypatch.setattr(instrument_sync, "sync_instruments", lambda data_dir: 0)
monkeypatch.setattr(daily_pipeline, "_resolve_universe", lambda capset, repo=None: ["600000.SH"])
monkeypatch.setattr(daily_pipeline, "_invalidate", lambda table=None: None)
monkeypatch.setattr(kline_sync, "sync_and_persist_daily_batch", fake_batch)
repo = SimpleNamespace(
store=SimpleNamespace(data_dir=tmp_path),
latest_daily_date=lambda: LOCAL,
)
capset = SimpleNamespace(has=lambda key: False)
with pytest.raises(_StopError):
daily_pipeline.run_now(repo, capset, override_start_date=LOCAL) # type: ignore[arg-type]
assert captured, "应发起日K范围拉取"
assert captured[0] == BJ, f"窗口右端必须是北京日期 {BJ}, 实际 {captured[0]} (服务器本地 {date.today()})"