Systematic prune per AGENTS.md test policy, one pass over every major test tree (gateway, hermes_cli, tools, agent, run_agent, plugins, cli, cron, tui_gateway, honcho/openviking, root-level): - DELETE: source-reading tests (read_text/getsource on prod files), change-detector tests (exact catalog counts, model-name snapshots, config version literals), mock-echo tests (assert a mock returns what it was told), assertion-free/trivial tests, near-duplicate parametrizations (boundaries + one representative kept), async/sync twin duplicates, cosmetic within-file variations. - KEEP (mandatory): security/redaction/approval guards, message-role alternation invariants, prompt-caching/deterministic-call-id invariants, issue-number regression tests (deduped), E2E tests. - 6 test files deleted outright (script-style/no-assert or fully redundant); conftest.py, fakes/, fixtures/ untouched. - tests/acp/conftest.py added: autouse fixture stubs the live models.dev/GitHub/Copilot/Anthropic inventory fetches that ACP server tests performed on every session create — test_server.py 147s → 3.4s, and the tests are now genuinely hermetic. - Sleep-based slowness shrunk where safe (codex_ttfb_watchdog, compression_concurrent_fork, etc.); no wall-clock assertion tightened. Verification: full hermetic suite via scripts/run_tests.sh — 2439 files, 31,130 tests passed, 0 failed, 0 flaky retries, 315s wall (baseline: 583s wall, 13,564s subprocess CPU).
72 lines
2.3 KiB
Python
72 lines
2.3 KiB
Python
"""Regression tests for Copilot api_mode recomputation during /model switch.
|
|
|
|
When switching models within the Copilot provider (e.g. GPT-5 → Claude),
|
|
the stale api_mode from resolve_runtime_provider must be overridden with
|
|
a fresh value computed from the *new* model. Without the fix, Claude
|
|
requests went through the Responses API and failed with
|
|
``unsupported_api_for_model``.
|
|
"""
|
|
|
|
from unittest.mock import patch
|
|
|
|
from hermes_cli.model_switch import switch_model
|
|
|
|
|
|
_MOCK_VALIDATION = {
|
|
"accepted": True,
|
|
"persist": True,
|
|
"recognized": True,
|
|
"message": None,
|
|
}
|
|
|
|
|
|
def _run_copilot_switch(
|
|
raw_input: str,
|
|
current_provider: str = "copilot",
|
|
current_model: str = "gpt-5.4",
|
|
explicit_provider: str = "",
|
|
runtime_api_mode: str = "codex_responses",
|
|
):
|
|
"""Run switch_model with Copilot mocks and return the result."""
|
|
with (
|
|
patch("hermes_cli.model_switch.resolve_alias", return_value=None),
|
|
patch("hermes_cli.model_switch.list_provider_models", return_value=[]),
|
|
patch(
|
|
"hermes_cli.runtime_provider.resolve_runtime_provider",
|
|
return_value={
|
|
"api_key": "ghu_test_token",
|
|
"base_url": "https://api.githubcopilot.com",
|
|
"api_mode": runtime_api_mode,
|
|
},
|
|
),
|
|
patch(
|
|
"hermes_cli.models.validate_requested_model",
|
|
return_value=_MOCK_VALIDATION,
|
|
),
|
|
patch("hermes_cli.model_switch.get_model_info", return_value=None),
|
|
patch("hermes_cli.model_switch.get_model_capabilities", return_value=None),
|
|
patch("hermes_cli.models.detect_provider_for_model", return_value=None),
|
|
):
|
|
return switch_model(
|
|
raw_input=raw_input,
|
|
current_provider=current_provider,
|
|
current_model=current_model,
|
|
explicit_provider=explicit_provider,
|
|
)
|
|
|
|
|
|
def test_same_provider_copilot_switch_recomputes_api_mode():
|
|
"""GPT-5 → Claude on copilot: api_mode must flip to chat_completions."""
|
|
result = _run_copilot_switch(
|
|
raw_input="claude-opus-4.6",
|
|
current_provider="copilot",
|
|
current_model="gpt-5.4",
|
|
)
|
|
|
|
assert result.success, f"switch_model failed: {result.error_message}"
|
|
assert result.new_model == "claude-opus-4.6"
|
|
assert result.target_provider == "copilot"
|
|
assert result.api_mode == "chat_completions"
|
|
|
|
|