From cc9c1e264d392cc711d7a01f3b248f902ca4300d Mon Sep 17 00:00:00 2001 From: GitHub Date: Fri, 3 Jul 2026 15:42:06 +0800 Subject: [PATCH] =?UTF-8?q?test(tick=5Fcharts):=20=E8=A1=A5=20partial-day?= =?UTF-8?q?=20=E5=9B=9E=E5=BD=92=E6=B5=8B=E8=AF=95=E8=A6=86=E7=9B=96=20PR?= =?UTF-8?q?=20#13=20=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PR #13 修复了 start_date=None 且最新交易日数据不完整时 tail_offset 越界/读错位的 bug。原 3 个测试构造的都是完整数据 (total = days*page_size),走 fallback 分支,未覆盖真正的 partial 分支。 新增 test_multi_tick_charts_partial_day: 构造 days=3, page_size=4, total=6 的 body,验证 tick_counts 分配为 [2,4,0]、尾部元数据在 actual_total 反推的偏移处正确解析。已反向验证(回退旧 tail_offset 公式时该测试立即失败复现 '偏移 239 越界'),非空壳测试。 --- tests/unit/test_mac_tick_charts.py | 77 ++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) diff --git a/tests/unit/test_mac_tick_charts.py b/tests/unit/test_mac_tick_charts.py index bd544cb..eee7a75 100644 --- a/tests/unit/test_mac_tick_charts.py +++ b/tests/unit/test_mac_tick_charts.py @@ -93,6 +93,83 @@ def test_multi_tick_charts_oversized_minutes_no_crash(): assert str(chart.charts[1].ticks[3].time) == "14:59:00" +def _build_multi_tick_body_partial( + days: int, + page_size: int, + total: int, + flat_minutes: list[int], +) -> bytes: + """构造一个 partial-day 多日分时图响应 body(PR #13 修复场景)。 + + 与 _build_multi_tick_body 的区别:body 里只塞 total 条 tick(而非 + days*page_size),用于模拟 start_date=None 且最新交易日数据不完整时 + 服务器实际返回的包。 + + Args: + days: 天数(写入 count)。 + page_size: 每天额定分时点数。 + total: 写入 total 字段的实际 tick 总数(< days*page_size)。 + flat_minutes: 长度 total 的 minutes 值列表(按天连续铺开)。 + """ + body = bytearray(struct.pack(" tick_counts = [2, 4, 0] + """ + body = _build_multi_tick_body_partial( + days=3, page_size=4, total=6, flat_minutes=[570, 571, 570, 571, 572, 573] + ) + + chart = TickChartsCmd(int(Market.SH), "600519", None, 3).parse_response(body) + + assert len(chart.charts) == 3 + # 首日(最新交易日)部分数据:2 条 tick + assert len(chart.charts[0].ticks) == 2 + assert str(chart.charts[0].ticks[0].time) == "09:30:00" + assert str(chart.charts[0].ticks[1].time) == "09:31:00" + # 第二天完整:4 条 tick + assert len(chart.charts[1].ticks) == 4 + assert str(chart.charts[1].ticks[0].time) == "09:30:00" + # 第三天无数据(盘前/非交易日) + assert len(chart.charts[2].ticks) == 0 + # 尾部元数据解析正确(未因偏移错误而乱码/越界) + assert chart.name == "贵州茅台" + assert chart.pre_close == 1509.0 + assert chart.open == 1510.0 + + def test_multi_tick_charts_request_layout(): """验证请求包布局与文档一致:market + code(22) + start_ymd + days + 1。""" from datetime import date as date_cls