| """Regression tests for interactive CLI rendering and research model routing.""" |
|
|
| import sys |
| from io import StringIO |
| from types import SimpleNamespace |
|
|
| import pytest |
| from rich.console import Console |
|
|
| import agent.main as main_mod |
| from agent.tools.research_tool import _get_research_model |
| from agent.utils import terminal_display |
|
|
|
|
| def test_direct_anthropic_research_model_stays_off_bedrock(): |
| assert ( |
| _get_research_model("anthropic/claude-opus-4-6") |
| == "anthropic/claude-sonnet-4-6" |
| ) |
|
|
|
|
| def test_bedrock_anthropic_research_model_stays_on_bedrock(): |
| assert ( |
| _get_research_model("bedrock/us.anthropic.claude-opus-4-6-v1") |
| == "bedrock/us.anthropic.claude-sonnet-4-6" |
| ) |
|
|
|
|
| def test_non_anthropic_research_model_is_unchanged(): |
| assert _get_research_model("openai/gpt-5.4") == "openai/gpt-5.4" |
|
|
|
|
| def test_help_output_keeps_descriptions_aligned(monkeypatch): |
| output = StringIO() |
| console = Console( |
| file=output, |
| color_system=None, |
| theme=terminal_display._THEME, |
| width=120, |
| ) |
| monkeypatch.setattr(terminal_display, "_console", console) |
|
|
| terminal_display.print_help() |
|
|
| lines = [line.rstrip() for line in output.getvalue().splitlines() if line.strip()] |
| description_columns = [] |
| for command, args, description in terminal_display.HELP_ROWS: |
| line = next(line for line in lines if command in line) |
| if args: |
| assert args in line |
| description_columns.append(line.index(description)) |
|
|
| assert len(set(description_columns)) == 1 |
|
|
|
|
| def test_help_output_recomputes_widths_from_rows(): |
| rows = terminal_display.HELP_ROWS + ( |
| ("/longer-command", "[longer-args]", "Synthetic help row"), |
| ) |
| output = StringIO() |
| Console( |
| file=output, |
| color_system=None, |
| theme=terminal_display._THEME, |
| width=140, |
| ).print(terminal_display.format_help_text(rows)) |
|
|
| lines = [line.rstrip() for line in output.getvalue().splitlines() if line.strip()] |
| description_columns = [ |
| next(line for line in lines if command in line).index(description) |
| for command, _args, description in rows |
| ] |
|
|
| assert len(set(description_columns)) == 1 |
|
|
|
|
| def test_subagent_display_does_not_spawn_background_redraw(monkeypatch): |
| calls: list[object] = [] |
|
|
| def _unexpected_future(*args, **kwargs): |
| calls.append((args, kwargs)) |
| raise AssertionError("background redraw task should not be created") |
|
|
| monkeypatch.setattr("asyncio.ensure_future", _unexpected_future) |
| monkeypatch.setattr( |
| terminal_display, |
| "_console", |
| SimpleNamespace(file=StringIO(), width=100), |
| ) |
|
|
| mgr = terminal_display.SubAgentDisplayManager() |
| mgr.start("agent-1", "research") |
| mgr.add_call("agent-1", '▸ hf_papers {"operation": "search"}') |
| mgr.clear("agent-1") |
|
|
| assert calls == [] |
|
|
|
|
| def test_cli_forwards_model_flag_to_interactive_main(monkeypatch): |
| seen: dict[str, str | None] = {} |
|
|
| async def fake_main(*, model=None): |
| seen["model"] = model |
|
|
| monkeypatch.setattr(sys, "argv", ["ml-intern", "--model", "openai/gpt-5.5"]) |
| monkeypatch.setattr(main_mod, "main", fake_main) |
|
|
| main_mod.cli() |
|
|
| assert seen["model"] == "openai/gpt-5.5" |
|
|
|
|
| @pytest.mark.asyncio |
| async def test_interactive_main_applies_model_override_before_banner(monkeypatch): |
| class StopAfterBanner(Exception): |
| pass |
|
|
| def fake_banner(*, model=None, hf_user=None): |
| assert model == "openai/gpt-5.5" |
| assert hf_user == "tester" |
| raise StopAfterBanner |
|
|
| monkeypatch.setattr(main_mod.os, "system", lambda *_args, **_kwargs: 0) |
| monkeypatch.setattr(main_mod, "PromptSession", lambda: object()) |
| monkeypatch.setattr(main_mod, "resolve_hf_token", lambda: "hf-token") |
| monkeypatch.setattr(main_mod, "_get_hf_user", lambda _token: "tester") |
| monkeypatch.setattr( |
| main_mod, |
| "load_config", |
| lambda _path, **_kwargs: SimpleNamespace( |
| model_name="moonshotai/Kimi-K2.6", |
| mcpServers={}, |
| ), |
| ) |
| monkeypatch.setattr(main_mod, "print_banner", fake_banner) |
|
|
| with pytest.raises(StopAfterBanner): |
| await main_mod.main(model="openai/gpt-5.5") |
|
|