code/07-ai-coding/test_retry_after.py
52 行 · 1.4 KB程式碼和執行結果保留原樣(簡體中文),與實際執行時完全一致。
"""retry_after.py 的验收测试。先写好测试,再让 AI 写实现:测试就是"做完的标准"。
HTTP 的 Retry-After 响应头有两种写法:一个秒数("120"),或者一个 HTTP 日期("Wed, 21 Oct 2026 07:28:00 GMT")。
parse_retry_after(value, now) 返回还需要等待的秒数(float),无法解析时返回 None。
"""
from datetime import datetime, timezone
from retry_after import parse_retry_after
NOW = datetime(2026, 10, 21, 7, 0, 0, tzinfo=timezone.utc)
def test_seconds():
assert parse_retry_after("120", NOW) == 120.0
def test_seconds_with_spaces():
assert parse_retry_after(" 30 ", NOW) == 30.0
def test_zero_seconds():
assert parse_retry_after("0", NOW) == 0.0
def test_http_date_in_future():
assert parse_retry_after("Wed, 21 Oct 2026 07:28:00 GMT", NOW) == 28 * 60.0
def test_http_date_in_past_means_no_wait():
assert parse_retry_after("Wed, 21 Oct 2026 06:00:00 GMT", NOW) == 0.0
def test_negative_seconds_is_invalid():
assert parse_retry_after("-5", NOW) is None
def test_decimal_seconds_is_invalid():
# 标准规定秒数是非负整数,"1.5" 不合法
assert parse_retry_after("1.5", NOW) is None
def test_garbage_is_invalid():
assert parse_retry_after("soon", NOW) is None
def test_empty_is_invalid():
assert parse_retry_after("", NOW) is None
def test_none_is_invalid():
assert parse_retry_after(None, NOW) is None