import sys from unittest.mock import MagicMock, patch # Mock dependencies before importing the module under test class MockHTTPException(Exception): def __init__(self, status_code, detail=None, headers=None): self.status_code = status_code self.detail = detail self.headers = headers class MockValidationError(Exception): pass mock_fastapi = MagicMock() mock_fastapi.HTTPException = MockHTTPException mock_fastapi.status.HTTP_401_UNAUTHORIZED = 401 mock_pydantic = MagicMock() mock_pydantic.ValidationError = MockValidationError sys.modules["fastapi"] = mock_fastapi sys.modules["pydantic"] = mock_pydantic sys.modules["sqlmodel"] = MagicMock() sys.modules["passlib"] = MagicMock() sys.modules["passlib.context"] = MagicMock() sys.modules["pretor.core.database.table.user"] = MagicMock() import pytest import jwt from pretor.utils.access import Accessor def test_decode_token_success(): """Test successful token decoding.""" token = "valid.token.here" payload = {"user_id": "123", "username": "testuser", "exp": 1234567890} with patch("jwt.decode", return_value=payload) as mock_decode: with patch("pretor.utils.access.TokenData") as mock_token_data_cls: mock_token_data_instance = MagicMock() mock_token_data_cls.return_value = mock_token_data_instance result = Accessor._decode_token(token) mock_decode.assert_called_once() mock_token_data_cls.assert_called_once_with(**payload) assert result == mock_token_data_instance def test_decode_token_expired(): """Test token decoding with an expired token.""" token = "expired.token.here" from fastapi import HTTPException with patch("jwt.decode", side_effect=jwt.ExpiredSignatureError): with patch("pretor.utils.access.HTTPException", HTTPException): with pytest.raises(HTTPException) as excinfo: Accessor._decode_token(token) assert excinfo.value.status_code == 401 assert excinfo.value.detail == "Token 已过期" def test_decode_token_invalid(): """Test token decoding with an invalid token.""" token = "invalid.token.here" from fastapi import HTTPException with patch("jwt.decode", side_effect=jwt.InvalidTokenError): with patch("pretor.utils.access.HTTPException", HTTPException): with pytest.raises(HTTPException) as excinfo: Accessor._decode_token(token) assert excinfo.value.status_code == 401 assert excinfo.value.detail == "无效的认证凭证" def test_decode_token_validation_error(): """Test token decoding with a payload that fails validation.""" token = "valid.jwt.invalid.payload" payload = {"wrong": "payload"} from fastapi import HTTPException with patch("jwt.decode", return_value=payload): with patch("pretor.utils.access.TokenData", side_effect=MockValidationError): with patch("pretor.utils.access.ValidationError", MockValidationError): with patch("pretor.utils.access.HTTPException", HTTPException): with pytest.raises(HTTPException) as excinfo: Accessor._decode_token(token) assert excinfo.value.status_code == 401 assert excinfo.value.detail == "无效的认证凭证"