/ tests / gateway / test_native_image_buffer_isolation.py
test_native_image_buffer_isolation.py
 1  import pytest
 2  
 3  from gateway.config import GatewayConfig, Platform, PlatformConfig
 4  from gateway.platforms.base import MessageEvent, MessageType
 5  from gateway.run import GatewayRunner
 6  from gateway.session import SessionSource, build_session_key
 7  
 8  
 9  def _make_runner() -> GatewayRunner:
10      runner = GatewayRunner.__new__(GatewayRunner)
11      runner.config = GatewayConfig(
12          platforms={Platform.TELEGRAM: PlatformConfig(enabled=True, token="fake")},
13      )
14      runner.adapters = {}
15      runner._model = "openai/gpt-4.1-mini"
16      runner._base_url = None
17      runner._decide_image_input_mode = lambda: "native"
18      return runner
19  
20  
21  def _source(chat_id: str) -> SessionSource:
22      return SessionSource(
23          platform=Platform.TELEGRAM,
24          chat_id=chat_id,
25          chat_type="private",
26          user_name=f"user-{chat_id}",
27      )
28  
29  
30  def _image_event(source: SessionSource, path: str) -> MessageEvent:
31      return MessageEvent(
32          text="see image",
33          message_type=MessageType.PHOTO,
34          source=source,
35          media_urls=[path],
36          media_types=["image/png"],
37      )
38  
39  
40  @pytest.mark.asyncio
41  async def test_native_image_buffer_isolated_per_session():
42      runner = _make_runner()
43      source_a = _source("chat-a")
44      source_b = _source("chat-b")
45  
46      await runner._prepare_inbound_message_text(
47          event=_image_event(source_a, "/tmp/a.png"),
48          source=source_a,
49          history=[],
50      )
51      await runner._prepare_inbound_message_text(
52          event=_image_event(source_b, "/tmp/b.png"),
53          source=source_b,
54          history=[],
55      )
56  
57      assert runner._consume_pending_native_image_paths(build_session_key(source_a)) == ["/tmp/a.png"]
58      assert runner._consume_pending_native_image_paths(build_session_key(source_b)) == ["/tmp/b.png"]
59  
60  
61  @pytest.mark.asyncio
62  async def test_native_image_buffer_not_cleared_by_other_sessions_without_images():
63      runner = _make_runner()
64      source_a = _source("chat-a")
65      source_b = _source("chat-b")
66  
67      await runner._prepare_inbound_message_text(
68          event=_image_event(source_a, "/tmp/a.png"),
69          source=source_a,
70          history=[],
71      )
72      await runner._prepare_inbound_message_text(
73          event=MessageEvent(text="plain text", source=source_b),
74          source=source_b,
75          history=[],
76      )
77  
78      assert runner._consume_pending_native_image_paths(build_session_key(source_a)) == ["/tmp/a.png"]
79      assert runner._consume_pending_native_image_paths(build_session_key(source_b)) == []