import json import threading import unittest import urllib.error import urllib.request import prain.chat as chat from prain.config import Draft, Serve from prain.web import make_server from tests.helpers import StubVllm, wait_for def events(response): """The proxy's stream as a list: content pieces, and ""-style markers.""" out = [] for raw in response: line = raw.decode().strip() if line == "data: [DONE]": out.append("") elif line.startswith("data: "): data = json.loads(line[6:]) out.append(f"<{data['prain']}>" if "prain" in data else data["choices"][0]["delta"]["content"]) return out class Web(unittest.TestCase): def setUp(self): self.stub = StubVllm() self.addCleanup(self.stub.close) self.start() def start(self, **options): self.server = make_server(self.stub.url, 0, **options) threading.Thread(target=self.server.serve_forever, daemon=True).start() self.addCleanup(self.server.server_close) self.addCleanup(self.server.shutdown) self.url = f"http://127.0.0.1:{self.server.server_port}" def warm(self, session, draft): chat.post(self.url, "/warm", {"session": session, "messages": [], "draft": draft}).read() def ask(self, session, text): return chat.post(self.url, "/chat", {"session": session, "messages": [{"role": "user", "content": text}]}) def test_page_warm_up_and_chat(self): with urllib.request.urlopen(self.url) as response: self.assertIn(b'