77 lines
3.0 KiB
Python
77 lines
3.0 KiB
Python
"""
|
|
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)}"
|