import os import sys import tempfile from pathlib import Path PROJECT_ROOT = Path(__file__).resolve().parents[1] sys.path.insert(0, str(PROJECT_ROOT)) db = tempfile.NamedTemporaryFile(delete=False, suffix=".db") db.close() os.environ["DATABASE_URL"] = "sqlite:///" + db.name.replace("\\", "/") os.environ["API_KEY"] = "test-key" os.environ["APPROVAL_API_KEY"] = "approval-key" os.environ["LEGACY_ALLOWED_QUERIES"] = "{}" os.environ["LEGACY_DATABASE_URL"] = "" os.environ["LEGACY_PROJECT_QUERY"] = "" os.environ["MODEL_PROVIDER"] = "noop" os.environ["SCHEDULER_ENABLED"] = "false" from fastapi.testclient import TestClient from app.core.constants import HttpHeader from app.core.database import Base, engine from app.main import app from app.modules.business.constants import BusinessField, StatusValue def request(method: str, url: str, **kwargs): client = TestClient(app) headers = kwargs.pop("headers", {}) headers.setdefault(HttpHeader.X_API_KEY, "test-key") response = getattr(client, method)(url, headers=headers, **kwargs) response.raise_for_status() return response def approve_change(domain: str, action: str, payload: dict, record_id: str | None = None) -> str: approval_payload: dict[str, object] = { "domain": domain, "action": action, "reason": "smoke verification", "payload": payload, } if record_id is not None: approval_payload["record_id"] = record_id ticket = request("post", "/api/v1/approvals", json=approval_payload).json()["ticket_id"] request( "post", f"/api/v1/approvals/{ticket}/approve", headers={ HttpHeader.X_API_KEY: "test-key", HttpHeader.X_APPROVAL_API_KEY: "approval-key", }, json={"comment": "smoke approved"}, ) return ticket try: Base.metadata.create_all(bind=engine) project_payload = { "code": "P-VERIFY-001", "name": "Verify Project", "owner": "tester", BusinessField.STATUS: StatusValue.RUNNING_CN, "budget_amount": 1000, "actual_amount": 200, } approval_ticket_id = approve_change("projects", "create:projects", project_payload) project = request( "post", "/api/v1/business/projects", json={ "actor": "smoke", "approval_ticket_id": approval_ticket_id, "data": project_payload, }, ).json() print("project:", project["data"]["code"]) report = request("get", "/api/v1/reports/daily-brief").json() print("report:", report["title"]) command = request( "post", "/api/v1/integrations/feishu/commands/preview", json={"text": "日报", "auto_reply": False}, ).json() print("command:", command["command"]) ai = request( "post", "/api/v1/ai/ask", json={"prompt": "生成项目摘要", "context": {"project": "P-VERIFY-001"}}, ).json() print("ai:", ai["provider"]) print("smoke verification ok") finally: engine.dispose() path = Path(db.name) if path.exists(): path.unlink()