Files
openai--openai-agents-python/tests/test_repl.py
T
2026-07-13 12:39:17 +08:00

101 lines
3.0 KiB
Python

import pytest
from agents import Agent, run_demo_loop
from .fake_model import FakeModel
from .test_responses import (
get_function_tool,
get_function_tool_call,
get_handoff_tool_call,
get_text_input_item,
get_text_message,
)
@pytest.mark.asyncio
async def test_run_demo_loop_conversation(monkeypatch, capsys):
model = FakeModel()
model.add_multiple_turn_outputs([[get_text_message("hello")], [get_text_message("good")]])
agent = Agent(name="test", model=model)
inputs = iter(["Hi", "How are you?", "quit"])
monkeypatch.setattr("builtins.input", lambda _=" > ": next(inputs))
await run_demo_loop(agent, stream=False)
output = capsys.readouterr().out
assert "hello" in output
assert "good" in output
assert model.last_turn_args["input"] == [
get_text_input_item("Hi"),
get_text_message("hello").model_dump(exclude_unset=True),
get_text_input_item("How are you?"),
]
@pytest.mark.asyncio
async def test_run_demo_loop_streaming(monkeypatch, capsys):
model = FakeModel()
target_agent = Agent(name="target", model=model)
agent = Agent(
name="test",
model=model,
tools=[get_function_tool("foo", "tool_result")],
handoffs=[target_agent],
)
# A single user turn that exercises every streamed event branch:
# a tool call, the tool output, a handoff (agent update), then a text answer.
model.add_multiple_turn_outputs(
[
[get_function_tool_call("foo", "{}")],
[get_handoff_tool_call(target_agent)],
[get_text_message("all done")],
]
)
inputs = iter(["Hello", "exit"])
monkeypatch.setattr("builtins.input", lambda _=" > ": next(inputs))
await run_demo_loop(agent, stream=True)
output = capsys.readouterr().out
assert "all done" in output
assert "[tool called]" in output
assert "[tool output: tool_result]" in output
assert "[Agent updated: target]" in output
@pytest.mark.asyncio
async def test_run_demo_loop_exits_on_eof(monkeypatch, capsys):
model = FakeModel()
agent = Agent(name="test", model=model)
def raise_eof(_=" > ") -> str:
raise EOFError
monkeypatch.setattr("builtins.input", raise_eof)
await run_demo_loop(agent, stream=False)
# The loop should terminate cleanly without ever invoking the model.
assert model.last_turn_args == {}
@pytest.mark.asyncio
async def test_run_demo_loop_skips_empty_input(monkeypatch, capsys):
model = FakeModel()
model.add_multiple_turn_outputs([[get_text_message("hello")]])
agent = Agent(name="test", model=model)
# Empty lines are ignored; only the non-empty input reaches the runner.
inputs = iter(["", "Hi", "quit"])
monkeypatch.setattr("builtins.input", lambda _=" > ": next(inputs))
await run_demo_loop(agent, stream=False)
output = capsys.readouterr().out
assert "hello" in output
assert model.last_turn_args["input"] == [get_text_input_item("Hi")]