Files
Aether/tests/services/test_provider_transport_codex.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

159 lines
4.7 KiB
Python

from __future__ import annotations
import sys
import types
from dataclasses import dataclass
from types import SimpleNamespace
from src.services.provider.adapters.codex.context import (
CodexRequestContext,
set_codex_request_context,
)
from src.services.provider.transport import build_provider_url
@dataclass
class _DummyEndpoint:
base_url: str
api_format: str
custom_path: str | None = None
provider: object | None = None
provider_id: str | None = None
class _FakeQuery:
def __init__(self, row: object | None) -> None:
self._row = row
def filter(self, *_args: object, **_kwargs: object) -> "_FakeQuery":
return self
def first(self) -> object | None:
return self._row
class _FakeSessionCtx:
def __init__(self, row: object | None) -> None:
self._row = row
def __enter__(self) -> "_FakeSessionCtx":
return self
def __exit__(self, exc_type: object, exc: object, tb: object) -> bool:
_ = exc_type, exc, tb
return False
def query(self, _model: object) -> _FakeQuery:
return _FakeQuery(self._row)
def test_codex_openai_cli_uses_responses_path_without_v1_prefix() -> None:
endpoint = _DummyEndpoint(
base_url="https://chatgpt.com/backend-api/codex",
api_format="openai:cli",
provider=SimpleNamespace(provider_type="codex"),
)
url = build_provider_url(
endpoint, # type: ignore[arg-type]
path_params={"model": "ignored"},
is_stream=True,
)
assert url == "https://chatgpt.com/backend-api/codex/responses"
def test_codex_openai_cli_does_not_duplicate_responses_suffix() -> None:
endpoint = _DummyEndpoint(
base_url="https://chatgpt.com/backend-api/codex/responses",
api_format="openai:cli",
provider=SimpleNamespace(provider_type="codex"),
)
url = build_provider_url(
endpoint, # type: ignore[arg-type]
path_params={"model": "ignored"},
is_stream=False,
)
assert url == "https://chatgpt.com/backend-api/codex/responses"
def test_codex_openai_cli_supports_backendapi_variant() -> None:
endpoint = _DummyEndpoint(
base_url="https://chatgpt.com/backendapi/codex",
api_format="openai:cli",
provider=SimpleNamespace(provider_type="codex"),
)
url = build_provider_url(
endpoint, # type: ignore[arg-type]
path_params={"model": "ignored"},
is_stream=True,
)
assert url == "https://chatgpt.com/backendapi/codex/responses"
def test_codex_openai_cli_uses_compact_suffix_when_context_marked_compact() -> None:
endpoint = _DummyEndpoint(
base_url="https://chatgpt.com/backend-api/codex",
api_format="openai:cli",
provider=SimpleNamespace(provider_type="codex"),
)
try:
set_codex_request_context(CodexRequestContext(is_compact=True))
url = build_provider_url(
endpoint, # type: ignore[arg-type]
path_params={"model": "ignored"},
is_stream=False,
)
assert url == "https://chatgpt.com/backend-api/codex/responses/compact"
finally:
set_codex_request_context(None)
def test_codex_openai_compact_uses_compact_path_without_v1_prefix() -> None:
endpoint = _DummyEndpoint(
base_url="https://chatgpt.com/backend-api/codex",
api_format="openai:compact",
provider=SimpleNamespace(provider_type="codex"),
)
url = build_provider_url(
endpoint, # type: ignore[arg-type]
path_params={"model": "ignored"},
is_stream=False,
)
assert url == "https://chatgpt.com/backend-api/codex/responses/compact"
def test_codex_openai_cli_uses_provider_id_lookup_without_touching_endpoint_provider(
monkeypatch,
) -> None:
class _DetachedEndpoint:
base_url = "https://chatgpt.com/backend-api/codex"
api_format = "openai:cli"
custom_path = None
provider_id = "provider-1"
@property
def provider(self) -> object:
raise RuntimeError("detached endpoint provider should not be lazy-loaded")
fake_provider = SimpleNamespace(id="provider-1", provider_type="codex", proxy=None)
fake_database = types.ModuleType("src.database")
fake_database.create_session = lambda: _FakeSessionCtx(fake_provider)
fake_models = types.ModuleType("src.models.database")
fake_models.Provider = type("Provider", (), {"id": "id"})
monkeypatch.setitem(sys.modules, "src.database", fake_database)
monkeypatch.setitem(sys.modules, "src.models.database", fake_models)
url = build_provider_url(
_DetachedEndpoint(), # type: ignore[arg-type]
path_params={"model": "ignored"},
is_stream=True,
)
assert url == "https://chatgpt.com/backend-api/codex/responses"