"""用户上下文提取测试.""" from src.ai.middleware.auth import UserContext, extract_user_context_from_metadata class TestUserContext: """UserContext dataclass 测试.""" def test_empty_context(self) -> None: """空上下文.""" ctx = UserContext() assert ctx.is_authenticated is False assert ctx.is_empty is True def test_authenticated(self) -> None: """有 user_id 即认证.""" ctx = UserContext(user_id="u-1", role="teacher") assert ctx.is_authenticated is True assert ctx.is_empty is False def test_only_role_not_authenticated(self) -> None: """仅有 role 无 user_id 仍非认证.""" ctx = UserContext(role="teacher") assert ctx.is_authenticated is False assert ctx.is_empty is False # role 非空故 not empty class TestExtractFromMetadata: """gRPC metadata 提取测试.""" def test_none_metadata(self) -> None: """None metadata 返回空上下文.""" ctx = extract_user_context_from_metadata(None) assert ctx.user_id == "" def test_list_metadata(self) -> None: """list[tuple] 格式 metadata.""" metadata = [ ("x-user-id", "u-123"), ("x-user-role", "teacher"), ("x-school-id", "s-1"), ("x-request-id", "r-1"), ] ctx = extract_user_context_from_metadata(metadata) assert ctx.user_id == "u-123" assert ctx.role == "teacher" assert ctx.school_id == "s-1" assert ctx.request_id == "r-1" def test_dict_metadata(self) -> None: """dict 格式 metadata.""" metadata = {"x-user-id": "u-456", "x-user-role": "admin"} ctx = extract_user_context_from_metadata(metadata) assert ctx.user_id == "u-456" assert ctx.role == "admin" def test_case_insensitive_keys(self) -> None: """metadata key 大小写不敏感.""" metadata = [("X-User-Id", "u-789")] ctx = extract_user_context_from_metadata(metadata) assert ctx.user_id == "u-789" def test_non_string_value_in_dict(self) -> None: """dict 中非字符串值被忽略.""" metadata = {"x-user-id": 12345} # type: ignore[dict-item] ctx = extract_user_context_from_metadata(metadata) assert ctx.user_id == "" def test_empty_list_metadata(self) -> None: """空 list metadata.""" ctx = extract_user_context_from_metadata([]) assert ctx.is_empty is True