mirror of
https://github.com/fawney19/Aether.git
synced 2026-09-02 01:10:23 +08:00
- 将 Antigravity 和 Codex 从独立模块迁移至 src/services/provider/adapters/ 插件体系 - 新增 provider_types 和 oauth_token 模块,移除 maintenance_scheduler 中的 OAuth 定时刷新 - 增强 admin API:扩展 keys 和 provider_query 端点,新增 dashboard 路由 - 大幅增强 ProviderDetailDrawer 组件,新增 AntigravityQuotaDialog - 改进 handler 基类(chat/cli)和错误分类器 - 优化 fetch_scheduler 和 upstream_fetcher - 前端 UI 组件清理和优化 - 更新测试以匹配新模块结构
65 lines
2.2 KiB
Python
65 lines
2.2 KiB
Python
from __future__ import annotations
|
||
|
||
from typing import Any
|
||
|
||
import src.services.provider.adapters.antigravity.url_availability as ua_mod
|
||
from src.services.provider.adapters.antigravity.constants import (
|
||
DAILY_BASE_URL,
|
||
PROD_BASE_URL,
|
||
SANDBOX_BASE_URL,
|
||
URL_UNAVAILABLE_TTL_SECONDS,
|
||
)
|
||
from src.services.provider.adapters.antigravity.url_availability import url_availability
|
||
|
||
|
||
def _reset_state() -> None:
|
||
# Singleton: tests need to reset global state
|
||
with url_availability._mu: # type: ignore[attr-defined]
|
||
url_availability._unavailable.clear() # type: ignore[attr-defined]
|
||
url_availability._last_success = None # type: ignore[attr-defined]
|
||
|
||
|
||
def test_mark_success_priority() -> None:
|
||
_reset_state()
|
||
|
||
url_availability.mark_success(PROD_BASE_URL)
|
||
ordered = url_availability.get_ordered_urls(prefer_daily=True)
|
||
|
||
assert ordered[0] == PROD_BASE_URL
|
||
|
||
|
||
def test_mark_unavailable_filters_url() -> None:
|
||
_reset_state()
|
||
|
||
url_availability.mark_unavailable(DAILY_BASE_URL)
|
||
ordered = url_availability.get_ordered_urls(prefer_daily=True)
|
||
|
||
# Sandbox → Prod(Daily 被标记为不可用,应被过滤掉)
|
||
assert ordered[0] == SANDBOX_BASE_URL
|
||
assert DAILY_BASE_URL not in ordered
|
||
assert url_availability.is_available(DAILY_BASE_URL) is False
|
||
|
||
|
||
def test_ttl_recovery(monkeypatch: Any) -> None:
|
||
_reset_state()
|
||
|
||
t0 = 1000.0
|
||
monkeypatch.setattr(ua_mod.time, "time", lambda: t0)
|
||
url_availability.mark_unavailable(PROD_BASE_URL)
|
||
assert url_availability.is_available(PROD_BASE_URL) is False
|
||
|
||
monkeypatch.setattr(ua_mod.time, "time", lambda: t0 + URL_UNAVAILABLE_TTL_SECONDS + 1)
|
||
assert url_availability.is_available(PROD_BASE_URL) is True
|
||
|
||
|
||
def test_all_unavailable_fallback_returns_base_order() -> None:
|
||
_reset_state()
|
||
|
||
url_availability.mark_unavailable(SANDBOX_BASE_URL)
|
||
url_availability.mark_unavailable(DAILY_BASE_URL)
|
||
url_availability.mark_unavailable(PROD_BASE_URL)
|
||
|
||
ordered = url_availability.get_ordered_urls(prefer_daily=True)
|
||
# 全部不可用时仍返回基础顺序(允许继续尝试,等 TTL 恢复)
|
||
assert ordered == [SANDBOX_BASE_URL, DAILY_BASE_URL, PROD_BASE_URL]
|