import unittest from fastapi.testclient import TestClient from app.api.pilot_requests import get_pilot_request_service, require_current_user from app.main import app class StubPilotRequestService: def submit_request(self, **kwargs): return { "id": "pilot-123", "tenant_id": "tenant-demo-001", "contact_name": kwargs["contact_name"], "company_name": kwargs["company_name"], "role_title": kwargs.get("role_title"), "email": kwargs["email"], "phone": kwargs.get("phone"), "expected_contract_volume": kwargs.get("expected_contract_volume"), "primary_goal": kwargs["primary_goal"], "deployment_preference": kwargs.get("deployment_preference"), "scenario_description": kwargs["scenario_description"], "status": "new", "source": "website", "admin_notes": None, "last_contact_at": None, "created_at": "2026-05-12T00:00:00+00:00", "updated_at": "2026-05-12T00:00:00+00:00", } def list_requests(self, current_user, page=1, page_size=20, status_value=None): return { "items": [ { "id": "pilot-123", "tenant_id": current_user["tenant_id"], "contact_name": "张三", "company_name": "示例企业", "role_title": "法务负责人", "email": "pilot@example.com", "phone": "13800000000", "expected_contract_volume": "每月 300 份", "primary_goal": "contract_review", "deployment_preference": "saas", "scenario_description": "试点合同审查", "status": status_value or "new", "source": "website", "admin_notes": None, "last_contact_at": None, "created_at": "2026-05-12T00:00:00+00:00", "updated_at": "2026-05-12T00:00:00+00:00", } ], "total": 1, "page": page, "page_size": page_size, } def get_summary(self, current_user): return { "total": 1, "counts": {"new": 1, "contacted": 0, "scheduled": 0, "closed": 0}, "latest_items": [ { "id": "pilot-123", "tenant_id": current_user["tenant_id"], "contact_name": "张三", "company_name": "示例企业", "role_title": "法务负责人", "email": "pilot@example.com", "phone": "13800000000", "expected_contract_volume": "每月 300 份", "primary_goal": "contract_review", "deployment_preference": "saas", "scenario_description": "试点合同审查", "status": "new", "source": "website", "admin_notes": None, "last_contact_at": None, "created_at": "2026-05-12T00:00:00+00:00", "updated_at": "2026-05-12T00:00:00+00:00", } ], } def update_request(self, current_user, request_id, status_value, admin_notes=None): return { "id": request_id, "tenant_id": current_user["tenant_id"], "contact_name": "张三", "company_name": "示例企业", "role_title": "法务负责人", "email": "pilot@example.com", "phone": "13800000000", "expected_contract_volume": "每月 300 份", "primary_goal": "contract_review", "deployment_preference": "saas", "scenario_description": "试点合同审查", "status": status_value, "source": "website", "admin_notes": admin_notes, "last_contact_at": "2026-05-12T01:00:00+00:00", "created_at": "2026-05-12T00:00:00+00:00", "updated_at": "2026-05-12T01:00:00+00:00", } class PilotRequestsApiTestCase(unittest.TestCase): def setUp(self): app.dependency_overrides[get_pilot_request_service] = lambda: StubPilotRequestService() app.dependency_overrides[require_current_user] = lambda: { "id": "user-admin", "tenant_id": "tenant-demo-001", "role": "admin", } self.client = TestClient(app) def tearDown(self): app.dependency_overrides.clear() def test_submit_pilot_request(self): response = self.client.post( "/api/v1/pilot-requests", json={ "contact_name": "张三", "company_name": "示例企业", "role_title": "法务负责人", "email": "pilot@example.com", "phone": "13800000000", "expected_contract_volume": "每月 300 份", "primary_goal": "contract_review", "deployment_preference": "saas", "scenario_description": "希望先验证合同审查和报告输出。", }, ) self.assertEqual(response.status_code, 200) body = response.json() self.assertEqual(body["code"], 0) self.assertEqual(body["data"]["id"], "pilot-123") self.assertEqual(body["data"]["status"], "new") def test_list_and_summary_pilot_requests(self): list_response = self.client.get("/api/v1/pilot-requests", params={"status_value": "new"}) summary_response = self.client.get("/api/v1/pilot-requests/summary") self.assertEqual(list_response.status_code, 200) self.assertEqual(list_response.json()["data"]["total"], 1) self.assertEqual(summary_response.status_code, 200) self.assertEqual(summary_response.json()["data"]["counts"]["new"], 1) def test_update_pilot_request(self): response = self.client.put( "/api/v1/pilot-requests/pilot-123", json={"status": "scheduled", "admin_notes": "已约演示"}, ) self.assertEqual(response.status_code, 200) body = response.json() self.assertEqual(body["data"]["status"], "scheduled") self.assertEqual(body["data"]["admin_notes"], "已约演示") if __name__ == "__main__": unittest.main()