tests/backends/providers/test_retry_after.py
Rama main · réplica de lectura del repositorio original.
"""Shared ``Retry-After`` parsing (``noeta.backends.providers._common.parse_retry_after``).
All three adapters translate a 429 into ``RateLimited(retry_after=...)``. The
header has two RFC 7231 wire forms — delta-seconds and HTTP-date — and this
helper resolves both to a non-negative seconds delay (or ``None`` when absent
or unparseable, so the retry helper falls back to backoff).
"""
from __future__ import annotations
from datetime import UTC, datetime
from noeta.backends.providers._common import parse_retry_after
def test_integer_seconds() -> None:
assert parse_retry_after("3") == 3.0
def test_float_seconds_and_whitespace() -> None:
assert parse_retry_after(" 7.5 ") == 7.5
def test_negative_seconds_clamped_to_zero() -> None:
# A nonsensical negative delta never asks the loop to "sleep backwards".
assert parse_retry_after("-5") == 0.0
def test_http_date_future_returns_delta_seconds() -> None:
now = datetime(2026, 10, 21, 7, 28, 0, tzinfo=UTC)
assert parse_retry_after("Wed, 21 Oct 2026 07:30:00 GMT", now=now) == 120.0
def test_http_date_in_past_clamped_to_zero() -> None:
now = datetime(2026, 10, 21, 7, 28, 0, tzinfo=UTC)
assert parse_retry_after("Wed, 21 Oct 2026 07:00:00 GMT", now=now) == 0.0
def test_http_date_without_zone_is_gmt() -> None:
now = datetime(2026, 10, 21, 7, 28, 0, tzinfo=UTC)
assert parse_retry_after("Wed, 21 Oct 2026 07:29:00 -0000", now=now) == 60.0
def test_none_header() -> None:
assert parse_retry_after(None) is None
def test_garbage_header() -> None:
assert parse_retry_after("not-a-date-or-number") is None