""" Step definitions for agent routing and passthrough features. """ from __future__ import annotations from pytest_bdd import scenarios, given, when, then, parsers from tests.step_defs.common_steps import * # noqa: F401,F403 — import shared steps scenarios( "../features/agent/routing.feature", "../features/agent/passthrough.feature", ) # ── Given: agent-specific setup ────────────────────────────────────────────── @given(parsers.parse('user "{user_id}" is in smart mode')) def set_smart_mode(user_id, pytestconfig): from orchestrator.agent import agent from orchestrator.tools import set_current_user set_current_user(user_id) agent._passthrough[user_id] = False pytestconfig._test_user_id = user_id @given(parsers.parse('user has active session "{conv_id}" in "{cwd}"')) def add_and_activate_session(conv_id, cwd, pytestconfig, tmp_path): from agent.manager import manager, Session from orchestrator.agent import agent user_id = getattr(pytestconfig, "_test_user_id", "user_abc123") session = Session(conv_id=conv_id, cwd=str(tmp_path / conv_id), owner_id=user_id, cc_timeout=50.0) (tmp_path / conv_id).mkdir(exist_ok=True) manager._sessions[conv_id] = session agent._active_conv[user_id] = conv_id @given(parsers.parse('vcr cassette "{cassette_name}"')) def set_vcr_cassette(cassette_name, pytestconfig): pytestconfig._vcr_cassette = cassette_name # ── When: send message through agent ───────────────────────────────────────── @when(parsers.parse('user sends agent message "{text}"')) def send_agent_message(text, pytestconfig, mock_run_claude, feishu_calls): import asyncio from orchestrator.agent import agent from tests.conftest import make_vcr_cassette user_id = getattr(pytestconfig, "_test_user_id", "user_abc123") cassette_name = getattr(pytestconfig, "_vcr_cassette", None) loop = asyncio.get_event_loop() if cassette_name: with make_vcr_cassette(cassette_name): reply = loop.run_until_complete(agent.run(user_id, text)) else: reply = loop.run_until_complete(agent.run(user_id, text)) pytestconfig._reply = reply # ── Then: agent-specific assertions ───────────────────────────────────────── @then(parsers.parse('agent created a session for user "{user_id}"')) def check_session_created(user_id): from orchestrator.agent import agent assert agent._active_conv.get(user_id) is not None, \ f"Expected active session to be set for {user_id}" @then(parsers.parse('no session is created for user "{user_id}"')) def check_no_session(user_id): from orchestrator.agent import agent assert agent._active_conv.get(user_id) is None, \ f"Expected no active session for {user_id}, got {agent._active_conv.get(user_id)}"