- claude_settings: 目标文件改为全局 ~/.claude/settings.json,与 cc-switch 行为一致 - claude_settings: 切回 claude 时保留用户已有的 ANTHROPIC_API_KEY - backend: 修正 save_project_settings -> save_settings,提示文本同步 - test_backends: 清理未用 import - test_entrypoints: 新增 backend 命令注册测试 - 新增 test_claude_settings / test_secrets / test_backend_command(共 36 tests)
95 lines
3.3 KiB
Python
95 lines
3.3 KiB
Python
"""Tests for myagents.backends."""
|
|
|
|
import pytest
|
|
|
|
from myagents.backends import (
|
|
build_provider_env,
|
|
detect_provider,
|
|
get_provider,
|
|
is_third_party,
|
|
list_providers,
|
|
normalize_provider_id,
|
|
)
|
|
|
|
|
|
class TestProviderRegistry:
|
|
def test_list_providers_includes_all(self) -> None:
|
|
ids = {p.id for p in list_providers()}
|
|
assert ids == {"deepseek", "kimi", "kimi-code", "claude"}
|
|
|
|
def test_get_provider_by_id(self) -> None:
|
|
provider = get_provider("kimi")
|
|
assert provider.id == "kimi"
|
|
assert provider.base_url == "https://api.moonshot.ai/anthropic"
|
|
|
|
def test_get_provider_normalizes_name(self) -> None:
|
|
assert get_provider("Kimi").id == "kimi"
|
|
assert get_provider("kimi_code").id == "kimi-code"
|
|
|
|
def test_unknown_provider_raises(self) -> None:
|
|
with pytest.raises(KeyError):
|
|
get_provider("openai")
|
|
|
|
|
|
class TestNormalizeProviderId:
|
|
def test_hyphenates_underscores(self) -> None:
|
|
assert normalize_provider_id("kimi_code") == "kimi-code"
|
|
|
|
def test_lowercases(self) -> None:
|
|
assert normalize_provider_id("DeepSeek") == "deepseek"
|
|
|
|
|
|
class TestBuildProviderEnv:
|
|
def test_deepseek_env(self) -> None:
|
|
provider = get_provider("deepseek")
|
|
env = build_provider_env(provider, "sk-test")
|
|
assert env["ANTHROPIC_AUTH_TOKEN"] == "sk-test"
|
|
assert env["ANTHROPIC_BASE_URL"] == "https://api.deepseek.com/anthropic"
|
|
assert env["ANTHROPIC_MODEL"] == "deepseek-v4-pro"
|
|
assert env["ANTHROPIC_DEFAULT_FABLE_MODEL"] == "deepseek-v4-pro"
|
|
|
|
def test_kimi_code_env(self) -> None:
|
|
provider = get_provider("kimi-code")
|
|
env = build_provider_env(provider, "sk-test")
|
|
assert env["ANTHROPIC_BASE_URL"] == "https://api.kimi.com/coding"
|
|
assert env["ANTHROPIC_MODEL"] == "kimi-for-coding"
|
|
|
|
def test_model_override(self) -> None:
|
|
provider = get_provider("kimi")
|
|
env = build_provider_env(provider, "sk-test", model="kimi-k2.5")
|
|
assert env["ANTHROPIC_MODEL"] == "kimi-k2.5"
|
|
|
|
def test_official_claude_returns_empty(self) -> None:
|
|
provider = get_provider("claude")
|
|
assert build_provider_env(provider, "sk-test") == {}
|
|
|
|
|
|
class TestDetectProvider:
|
|
def test_detects_deepseek(self) -> None:
|
|
env = {"ANTHROPIC_BASE_URL": "https://api.deepseek.com/anthropic"}
|
|
assert detect_provider(env) == get_provider("deepseek")
|
|
|
|
def test_detects_kimi_code(self) -> None:
|
|
env = {"ANTHROPIC_BASE_URL": "https://api.kimi.com/coding"}
|
|
assert detect_provider(env) == get_provider("kimi-code")
|
|
|
|
def test_no_base_url_with_api_key_is_claude(self) -> None:
|
|
env = {"ANTHROPIC_API_KEY": "sk-test"}
|
|
assert detect_provider(env) == get_provider("claude")
|
|
|
|
def test_empty_env_returns_none(self) -> None:
|
|
assert detect_provider({}) is None
|
|
|
|
def test_unknown_base_url_returns_none(self) -> None:
|
|
assert detect_provider({"ANTHROPIC_BASE_URL": "https://example.com"}) is None
|
|
|
|
|
|
class TestIsThirdParty:
|
|
def test_third_party_providers(self) -> None:
|
|
assert is_third_party(get_provider("deepseek"))
|
|
assert is_third_party(get_provider("kimi"))
|
|
assert is_third_party(get_provider("kimi-code"))
|
|
|
|
def test_claude_is_not_third_party(self) -> None:
|
|
assert not is_third_party(get_provider("claude"))
|