166 lines
6.4 KiB
Python
166 lines
6.4 KiB
Python
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()
|