mirror of
https://github.com/shy3130/tick-stock-panel.git
synced 2026-11-02 10:26:13 +00:00
- 判坏改 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 指向手动修正; 数据页手动修正不受限
55 lines
2.2 KiB
Python
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()})"
|