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["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, SessionLocal, engine from app.main import app from app.modules.business.constants import BusinessField, StatusValue from app.modules.business.registry import get_domain_model from app.modules.business.service import _model_payload, serialize_model 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 seed_business_record(domain: str, payload: dict) -> dict: db_session = SessionLocal() try: model = get_domain_model(domain) record = model(**_model_payload(domain, model, payload)) db_session.add(record) db_session.commit() db_session.refresh(record) return serialize_model(record) finally: db_session.close() 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, } project = seed_business_record("projects", project_payload) print("project:", project["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()