import os import tempfile import unittest os.environ["DATABASE_URL"] = f"sqlite:///{tempfile.NamedTemporaryFile(delete=False).name}" os.environ["JWT_SECRET_KEY"] = "test-secret" from fastapi.testclient import TestClient # noqa: E402 from app.main import app # noqa: E402 class SmokeTest(unittest.TestCase): def setUp(self) -> None: self.client_context = TestClient(app) self.client = self.client_context.__enter__() def tearDown(self) -> None: self.client_context.__exit__(None, None, None) def auth_headers(self) -> dict[str, str]: response = self.client.post( "/api/auth/login", json={"phone": "13800000000", "code": "123456"}, ) self.assertEqual(response.status_code, 200, response.text) token = response.json()["access_token"] return {"Authorization": f"Bearer {token}"} def test_health(self) -> None: response = self.client.get("/health") self.assertEqual(response.status_code, 200) self.assertEqual(response.json()["status"], "ok") def test_login_me_documents_stats_and_session(self) -> None: headers = self.auth_headers() me = self.client.get("/api/auth/me", headers=headers) self.assertEqual(me.status_code, 200, me.text) self.assertEqual(me.json()["phone"], "13800000000") document = self.client.post( "/api/documents", headers=headers, json={ "title": "差旅费报销管理办法.pdf", "secrecy_level": "internal", "owner_dept": "财务部", "tags": ["差旅", "报销"], }, ) self.assertEqual(document.status_code, 200, document.text) self.assertEqual(document.json()["status"], "parsed") session = self.client.post("/api/chat/sessions", headers=headers, json={"title": "差旅咨询"}) self.assertEqual(session.status_code, 200, session.text) self.assertEqual(session.json()["title"], "差旅咨询") session_id = session.json()["id"] with self.client.stream( "POST", "/api/chat/stream", headers=headers, json={"conversation_id": session_id, "question": "差旅报销需要哪些材料?"}, ) as stream: body = "".join(stream.iter_text()) self.assertEqual(stream.status_code, 200, body) self.assertIn("answer.delta", body) messages = self.client.get(f"/api/chat/sessions/{session_id}/messages", headers=headers) self.assertEqual(messages.status_code, 200, messages.text) self.assertEqual(len(messages.json()), 1) self.assertEqual(messages.json()[0]["status"], "done") stats = self.client.get("/api/stats/overview", headers=headers) self.assertEqual(stats.status_code, 200, stats.text) self.assertGreaterEqual(stats.json()["document_count"], 1) self.assertGreaterEqual(stats.json()["question_count"], 1) if __name__ == "__main__": unittest.main()