finai/backend/tests/test_smoke.py

83 lines
3.0 KiB
Python

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()