55 lines
1.8 KiB
Python
55 lines
1.8 KiB
Python
from __future__ import annotations
|
|
|
|
from typing import cast
|
|
|
|
import pytest
|
|
|
|
from agents.items import TResponseInputItem
|
|
from tests.utils.simple_session import CountingSession, IdStrippingSession, SimpleListSession
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_simple_list_session_preserves_history_and_saved_items() -> None:
|
|
history: list[TResponseInputItem] = [
|
|
cast(TResponseInputItem, {"id": "msg1", "content": "hi", "role": "user"}),
|
|
cast(TResponseInputItem, {"id": "msg2", "content": "hello", "role": "assistant"}),
|
|
]
|
|
session = SimpleListSession(history=history)
|
|
|
|
items = await session.get_items()
|
|
# get_items should return a copy, not the original list.
|
|
assert items == history
|
|
assert items is not history
|
|
# saved_items should mirror the stored list.
|
|
assert session.saved_items == history
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_counting_session_tracks_pop_calls() -> None:
|
|
session = CountingSession(
|
|
history=[cast(TResponseInputItem, {"id": "x", "content": "hi", "role": "user"})]
|
|
)
|
|
|
|
assert session.pop_calls == 0
|
|
await session.pop_item()
|
|
assert session.pop_calls == 1
|
|
await session.pop_item()
|
|
assert session.pop_calls == 2
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_id_stripping_session_removes_ids_on_add() -> None:
|
|
session = IdStrippingSession()
|
|
items: list[TResponseInputItem] = [
|
|
cast(TResponseInputItem, {"id": "keep-removed", "content": "hello", "role": "user"}),
|
|
cast(TResponseInputItem, {"content": "no-id", "role": "assistant"}),
|
|
]
|
|
|
|
await session.add_items(items)
|
|
stored = await session.get_items()
|
|
|
|
assert all("id" not in item for item in stored if isinstance(item, dict))
|
|
# pop_calls should increment when rewinding.
|
|
await session.pop_item()
|
|
assert session.pop_calls == 1
|