Skip to content

Test design: fixed-TZ assertion to catch symmetric TZ mutations #16

@kiki830621

Description

@kiki830621

Problem

testUntilDateUsesEndOfDay 是 round-trip 一致性 test:producer (parseUntilDate) 和 consumer (Calendar.current.dateComponents) 都用 Calendar.current。這代表它只能抓 asymmetric TZ regressions——例如 producer 改用 UTC 但 consumer 仍用 local(或反之)。

From verification of #15 by devils-advocate (HIGH):
「TZ assertion 是 round-trip 一致性 test:producer 寫什麼,consumer 讀什麼。它無法抓『producer 邏輯本身錯了』的 bug,只能抓『producer 和 test environment 的 TZ 不一致』的 bug。」

漏網的 mutation 範例

如果有人同時把 producer 和 consumer 都從 Calendar.current 改成 Calendar(identifier: .gregorian) (預設 UTC),當前 test 仍 pass。但實務 production 下,parseUntilDate 產生的 Date 對 Taipei 用戶會變成隔天 07:59:59,until_date 過濾漏掉一整天的訊息

Type

enhancement

Expected

新增 fixed-TZ test 鎖死 producer 的絕對行為(不依賴 Calendar.current):

func testUntilDateInFixedUTCAsserts() {
    var cal = Calendar(identifier: .gregorian)
    cal.timeZone = TimeZone(identifier: "UTC")!
    let parsed = try! parseGetChatHistoryArgs([
        "chat_id": .int(100),
        "until_date": .string("2026-04-17"),
    ])
    let utcComponents = cal.dateComponents(
        [.year, .month, .day, .hour],
        from: parsed.untilDate!
    )
    // Assert producer 的絕對 TZ 行為,不依賴 test environment
    // 例: 如果 producer 用 local TZ + Asia/Taipei,UTC = 2026-04-17 15:59:59
    //     hour=15 ≠ Calendar.current 抽出的 23
}

需要決定:

  • 預期 producer 是什麼 TZ 行為(local vs UTC vs configurable)?
  • 如果是 local,test 環境如何 lock TZ(CI 跨平台跑會在不同 TZ)?

Code Reference

  • Sources/CheTelegramAllMCPCore/DateParsing.swift:58-67 (parseUntilDate)
  • Tests/CheTelegramAllMCPTests/ServerHandlerLogicTests.swift:96-122 (現有 round-trip test)

Related: #15

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions