diff --git a/tests/test_routing_golden.py b/tests/test_routing_golden.py index 3e318b8..8584201 100644 --- a/tests/test_routing_golden.py +++ b/tests/test_routing_golden.py @@ -1,8 +1,9 @@ """Golden-set routing test for the structured router. -20 labelled tasks → expected agent. Skipped if provider keys are missing -(ANTHROPIC for the router LLM, COMPOSIO because importing the graph eagerly -loads tools). Run with: +20 labelled tasks → expected agent. Live tests require ANTHROPIC_API_KEY + +COMPOSIO_API_KEY; without them the parametrized cases skip at runtime but +the module still collects (so `pytest --collect-only` in CI works without +secrets). Run with: pytest tests/test_routing_golden.py -v """ @@ -14,17 +15,12 @@ from dotenv import load_dotenv load_dotenv(os.path.join(os.path.dirname(__file__), "..", ".env")) -if not os.getenv("ANTHROPIC_API_KEY"): - pytest.skip( - "ANTHROPIC_API_KEY not set; skipping live router tests.", - allow_module_level=True, - ) -if not os.getenv("COMPOSIO_API_KEY"): - pytest.skip( - "COMPOSIO_API_KEY not set; skipping live router tests.", allow_module_level=True - ) - -from graph import router_node # noqa: E402 +_REQUIRED_KEYS = ("ANTHROPIC_API_KEY", "COMPOSIO_API_KEY") +_missing = [k for k in _REQUIRED_KEYS if not os.getenv(k)] +requires_keys = pytest.mark.skipif( + bool(_missing), + reason=f"Requires {', '.join(_REQUIRED_KEYS)}; missing: {', '.join(_missing)}", +) GOLDEN_SET: list[tuple[str, str]] = [ @@ -107,8 +103,13 @@ def test_golden_set_size(): assert len(GOLDEN_SET) == 20 +@requires_keys @pytest.mark.parametrize("task,expected", GOLDEN_SET) def test_router_picks_expected_agent(task: str, expected: str): + # Lazy import — graph.py loads composio_tools at module import and needs + # COMPOSIO_API_KEY. Keep the import inside the skipif-guarded test body. + from graph import router_node + out = router_node({"task": task, "messages": []}) assert out["route"] == expected, ( f"task={task!r} got={out['route']} expected={expected}"