Files
Aether/tests/api/admin/test_provider_oauth_shell.py
fawney19 ddf18fed9a feat: 扩展 Rust gateway 全功能模块,新增 billing/crypto/wallet crate 及完整数据层
- 新增 aether-billing、aether-crypto、aether-wallet 独立 crate
- aether-data 扩展 repository 层:announcements、auth_modules、billing、
  candidate_selection、gemini_file_mappings、global_models、management_tokens、
  oauth_providers、proxy_nodes、quota、users、wallet 等模块
- aether-gateway 新增 api/auth/billing/control/middleware/scheduler/usage/
  video_tasks/hooks/maintenance/model_fetch/provider_transport 等功能模块
- 重构 executor decision 和 gateway state 为模块目录结构
- 新增 gateway router、frontdoor 路由层及对应测试
- Python 侧 API 路由重构,新增 compat/support 模块
- 前端 Logo 组件更新及 Provider 管理页面调整
2026-03-31 19:19:04 +08:00

165 lines
5.5 KiB
Python

from __future__ import annotations
from types import SimpleNamespace
from typing import Any
import pytest
@pytest.mark.asyncio
@pytest.mark.parametrize(
("route_name", "expected_adapter", "expected_state"),
[
("supported_types", "AdminProviderOAuthUnavailableAdapter", {"operation": "supported_types"}),
("start_oauth", "AdminProviderOAuthUnavailableAdapter", {"operation": "start_oauth"}),
("complete_oauth", "AdminProviderOAuthUnavailableAdapter", {"operation": "complete_oauth"}),
("refresh_oauth", "AdminProviderOAuthUnavailableAdapter", {"operation": "refresh_oauth"}),
(
"start_provider_oauth",
"AdminProviderOAuthUnavailableAdapter",
{"operation": "start_provider_oauth"},
),
(
"complete_provider_oauth",
"AdminProviderOAuthUnavailableAdapter",
{"operation": "complete_provider_oauth"},
),
(
"import_refresh_token",
"AdminProviderOAuthUnavailableAdapter",
{"operation": "import_refresh_token"},
),
(
"batch_import_oauth",
"AdminProviderOAuthUnavailableAdapter",
{"operation": "batch_import_oauth"},
),
(
"start_batch_import_oauth_task",
"AdminProviderOAuthUnavailableAdapter",
{"operation": "start_batch_import_oauth_task"},
),
(
"get_batch_import_oauth_task_status",
"AdminProviderOAuthUnavailableAdapter",
{"operation": "get_batch_import_oauth_task_status"},
),
(
"device_authorize",
"AdminProviderOAuthUnavailableAdapter",
{"operation": "device_authorize"},
),
("device_poll", "AdminProviderOAuthUnavailableAdapter", {"operation": "device_poll"}),
],
)
async def test_admin_provider_oauth_routes_use_pipeline_shell(
monkeypatch: pytest.MonkeyPatch,
route_name: str,
expected_adapter: str,
expected_state: dict[str, Any],
) -> None:
from src.api.admin import provider_oauth as mod
captured: dict[str, Any] = {}
async def fake_run(*, adapter, http_request, db, mode, **_kwargs):
captured.update(
{
"adapter": adapter,
"request": http_request,
"db": db,
"mode": mode,
}
)
if route_name == "supported_types":
return []
return {"ok": True}
monkeypatch.setattr(mod.pipeline, "run", fake_run)
request = SimpleNamespace(state=SimpleNamespace())
db = object()
if route_name == "supported_types":
result = await mod.supported_types(request=request, db=db, _=None)
elif route_name == "start_oauth":
result = await mod.start_oauth("key_1", request=request, db=db, _=None)
elif route_name == "complete_oauth":
result = await mod.complete_oauth(
"key_1",
mod.CompleteOAuthRequest(callback_url="http://localhost/?code=x&state=y"),
request=request,
db=db,
_=None,
)
elif route_name == "refresh_oauth":
result = await mod.refresh_oauth("key_1", request=request, db=db, _=None)
elif route_name == "start_provider_oauth":
result = await mod.start_provider_oauth("provider_1", request=request, db=db, _=None)
elif route_name == "complete_provider_oauth":
result = await mod.complete_provider_oauth(
"provider_1",
mod.ProviderCompleteOAuthRequest(callback_url="http://localhost/?code=x&state=y"),
request=request,
db=db,
_=None,
)
elif route_name == "import_refresh_token":
result = await mod.import_refresh_token(
"provider_1",
mod.ImportRefreshTokenRequest(refresh_token="refresh-token"),
request=request,
db=db,
_=None,
)
elif route_name == "batch_import_oauth":
result = await mod.batch_import_oauth(
"provider_1",
mod.BatchImportRequest(credentials="refresh-token"),
request=request,
db=db,
_=None,
)
elif route_name == "start_batch_import_oauth_task":
result = await mod.start_batch_import_oauth_task(
"provider_1",
mod.BatchImportRequest(credentials="refresh-token"),
request=request,
db=db,
_=None,
)
elif route_name == "get_batch_import_oauth_task_status":
result = await mod.get_batch_import_oauth_task_status(
"provider_1",
"task_1",
request=request,
db=db,
_=None,
)
elif route_name == "device_authorize":
result = await mod.device_authorize(
"provider_1",
mod.DeviceAuthorizeRequest(),
request=request,
db=db,
_=None,
)
else:
result = await mod.device_poll(
"provider_1",
mod.DevicePollRequest(session_id="session_1"),
request=request,
db=db,
_=None,
)
assert captured["request"] is request
assert captured["db"] is db
assert captured["mode"] == captured["adapter"].mode
assert type(captured["adapter"]).__name__ == expected_adapter
assert getattr(captured["adapter"], "__dict__", {}) == expected_state
if route_name == "supported_types":
assert result == []
else:
assert result == {"ok": True}