대시보드 이슈 정리 1차
This commit is contained in:
parent
94cc56592f
commit
f472883c31
13 changed files with 592 additions and 311 deletions
|
|
@ -53,6 +53,32 @@ def _model_arg(args):
|
|||
return args[args.index("--model") + 1]
|
||||
|
||||
|
||||
async def _read_streaming_response(response):
|
||||
chunks = []
|
||||
async for chunk in response.body_iterator:
|
||||
if isinstance(chunk, bytes):
|
||||
chunks.append(chunk.decode("utf-8"))
|
||||
else:
|
||||
chunks.append(str(chunk))
|
||||
return "".join(chunks)
|
||||
|
||||
|
||||
class _FakeStreamSession:
|
||||
def __init__(self, events, model="test-model"):
|
||||
self.events = events
|
||||
self.model = model
|
||||
self.closed = False
|
||||
|
||||
async def turn_stream(self, content, timeout=600.0):
|
||||
self.content = content
|
||||
self.timeout = timeout
|
||||
for event in self.events:
|
||||
yield event
|
||||
|
||||
async def close(self):
|
||||
self.closed = True
|
||||
|
||||
|
||||
class GatewayModelTest(unittest.TestCase):
|
||||
def setUp(self):
|
||||
gateway.SESSIONS.clear()
|
||||
|
|
@ -212,6 +238,50 @@ class GatewayModelTest(unittest.TestCase):
|
|||
self.assertEqual(closed, [started[0]])
|
||||
self.assertNotIn(started[0].id, gateway.SESSIONS)
|
||||
|
||||
def test_v1_stream_frames_token_and_done_events(self):
|
||||
session = _FakeStreamSession(
|
||||
[
|
||||
{"type": "delta", "text": "안녕"},
|
||||
{"type": "done", "cost_usd": 0.03, "turns": 2},
|
||||
],
|
||||
model="stream-model",
|
||||
)
|
||||
|
||||
async def fake_resolve(req, system_prompt):
|
||||
return session, True
|
||||
|
||||
with patch.object(gateway, "_resolve_session", fake_resolve):
|
||||
response = asyncio.run(gateway.v1_stream(_request()))
|
||||
body = asyncio.run(_read_streaming_response(response))
|
||||
|
||||
self.assertIn("event: token", body)
|
||||
self.assertIn('data: {"text": "안녕"}', body)
|
||||
self.assertIn("event: done", body)
|
||||
self.assertIn('"provider": "claude_cli"', body)
|
||||
self.assertIn('"model": "stream-model"', body)
|
||||
self.assertIn('"cost_usd": 0.03', body)
|
||||
self.assertEqual(session.content, "hello")
|
||||
self.assertEqual(session.timeout, 600.0)
|
||||
self.assertTrue(session.closed)
|
||||
|
||||
def test_v1_stream_frames_engine_error_event(self):
|
||||
session = _FakeStreamSession(
|
||||
[
|
||||
{"type": "done", "is_error": True, "error": "engine failed"},
|
||||
]
|
||||
)
|
||||
|
||||
async def fake_resolve(req, system_prompt):
|
||||
return session, False
|
||||
|
||||
with patch.object(gateway, "_resolve_session", fake_resolve):
|
||||
response = asyncio.run(gateway.v1_stream(_request()))
|
||||
body = asyncio.run(_read_streaming_response(response))
|
||||
|
||||
self.assertIn("event: error", body)
|
||||
self.assertIn('data: {"detail": "engine failed"}', body)
|
||||
self.assertFalse(session.closed)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue