"""P2：request_id 头校验——安全字符集白名单（字母数字 . _ -，1–128 位），非法则生成新 uuid。

放行 uuid.hex / 常见 trace id / 客户端自定义短 id；丢弃含空白/控制字符/换行/注入序列/
超长（>128）的值，防止把未经校验的客户端值原样写进日志/响应头（日志注入防护）。
"""

from __future__ import annotations

import re

from ww_api.middleware import _sanitize_request_id

_HEX_32 = re.compile(r"^[0-9a-f]{32}$")


def test_valid_hex_passthrough() -> None:
    raw = "a" * 32
    assert _sanitize_request_id(raw) == raw


def test_valid_uppercase_hex_passthrough() -> None:
    raw = "ABCDEF0123456789"
    assert _sanitize_request_id(raw) == raw


def test_none_generates_new_uuid() -> None:
    out = _sanitize_request_id(None)
    assert _HEX_32.match(out)


def test_short_alnum_passthrough() -> None:
    # 客户端自定义短 id（如 'abc123'）属合法字符集 → 原样透传（与 /health 传播契约一致）。
    raw = "abc123"
    assert _sanitize_request_id(raw) == raw


def test_too_long_rejected() -> None:
    out = _sanitize_request_id("a" * 129)  # 129 位 > 128 上限 → 丢弃改生成。
    assert _HEX_32.match(out)


def test_whitespace_rejected() -> None:
    # 含空格（日志注入风险，非白名单字符）→ 丢弃改生成。
    out = _sanitize_request_id("abc 123")
    assert out != "abc 123"
    assert _HEX_32.match(out)


def test_injection_rejected() -> None:
    # 含非十六进制字符（注入/控制字符）→ 丢弃改生成。
    out = _sanitize_request_id("../../etc/passwd\n")
    assert "/" not in out
    assert "\n" not in out
    assert _HEX_32.match(out)
