209ba45477
Removes the deprecated `workflow_template` concept entirely across both backend API routers, internal logic handling within the `supervisory_node` and `consciousness_node`, and front-end components. Enables `consciousness_node` to work autonomously. Also refactors core package structure to enforce the "one python package, one Ray Actor" architectural rule. `GlobalWorkflowManager`, `WorkflowRunningEngine`, `PostgresDatabase`, and `WorkerCluster` have been moved to their own top-level decoupled package directories with properly exported `__init__.py` modules. Test suites have been relocated and import paths updated across the system. Co-authored-by: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com> Co-authored-by: zhaoxi826 <198742034+zhaoxi826@users.noreply.github.com>
100 lines
3.4 KiB
Python
100 lines
3.4 KiB
Python
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 # noqa: E402
|
|
import jwt # noqa: E402
|
|
from pretor.utils.access import Accessor # noqa: E402
|
|
|
|
|
|
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 == "无效的认证凭证"
|
|
# noqa: E402
|