|
3 | 3 | import asyncio |
4 | 4 | import tempfile |
5 | 5 | from pathlib import Path |
6 | | -from typing import Any |
| 6 | +from typing import Any, cast |
7 | 7 |
|
8 | 8 | import pytest |
9 | 9 |
|
@@ -166,6 +166,35 @@ async def clear_session(self) -> None: |
166 | 166 | self.items.clear() |
167 | 167 |
|
168 | 168 |
|
| 169 | +class WrapperOnlySession: |
| 170 | + session_id = "wrapper-only" |
| 171 | + session_settings: SessionSettings | None = None |
| 172 | + |
| 173 | + def __init__(self) -> None: |
| 174 | + self.items: list[TResponseInputItem] = [] |
| 175 | + self.get_wrappers: list[RunContextWrapper[Any] | None] = [] |
| 176 | + |
| 177 | + async def get_items( |
| 178 | + self, |
| 179 | + wrapper: RunContextWrapper[Any] | None = None, |
| 180 | + ) -> list[TResponseInputItem]: |
| 181 | + self.get_wrappers.append(wrapper) |
| 182 | + return list(self.items) |
| 183 | + |
| 184 | + async def add_items( |
| 185 | + self, |
| 186 | + items: list[TResponseInputItem], |
| 187 | + wrapper: RunContextWrapper[Any] | None = None, |
| 188 | + ) -> None: |
| 189 | + self.items.extend(items) |
| 190 | + |
| 191 | + async def pop_item(self) -> TResponseInputItem | None: |
| 192 | + return self.items.pop() if self.items else None |
| 193 | + |
| 194 | + async def clear_session(self) -> None: |
| 195 | + self.items.clear() |
| 196 | + |
| 197 | + |
169 | 198 | # Parametrized tests for different runner methods |
170 | 199 | @pytest.mark.parametrize("runner_method", ["run", "run_sync", "run_streamed"]) |
171 | 200 | @pytest.mark.asyncio |
@@ -351,6 +380,31 @@ async def test_get_items_preserves_default_limit_when_none_is_unset() -> None: |
351 | 380 | assert session.get_call_count == 1 |
352 | 381 |
|
353 | 382 |
|
| 383 | +@pytest.mark.asyncio |
| 384 | +async def test_get_items_with_limit_preserves_wrapper_only_delegate_shape() -> None: |
| 385 | + session = WrapperOnlySession() |
| 386 | + session.items = [ |
| 387 | + {"role": "user", "content": "one"}, |
| 388 | + {"role": "assistant", "content": "two"}, |
| 389 | + ] |
| 390 | + wrapper = RunContextWrapper(context={"request_id": "wrapper-only"}) |
| 391 | + |
| 392 | + prepared_input, _ = await prepare_input_with_session( |
| 393 | + "new", |
| 394 | + cast(SessionABC, session), |
| 395 | + session_input_callback=None, |
| 396 | + session_settings=SessionSettings(limit=1), |
| 397 | + wrapper=wrapper, |
| 398 | + ) |
| 399 | + |
| 400 | + assert isinstance(prepared_input, list) |
| 401 | + first = prepared_input[0] |
| 402 | + second = prepared_input[1] |
| 403 | + assert isinstance(first, dict) and first.get("content") == "two" |
| 404 | + assert isinstance(second, dict) and second.get("content") == "new" |
| 405 | + assert session.get_wrappers == [wrapper] |
| 406 | + |
| 407 | + |
354 | 408 | @pytest.mark.parametrize("runner_method", ["run", "run_sync", "run_streamed"]) |
355 | 409 | @pytest.mark.asyncio |
356 | 410 | async def test_session_memory_different_sessions_parametrized(runner_method): |
|
0 commit comments