106 lines
4.2 KiB
Python
106 lines
4.2 KiB
Python
import unittest
|
|
|
|
from fastapi import HTTPException, status
|
|
from sqlalchemy import create_engine
|
|
from sqlalchemy.orm import sessionmaker
|
|
|
|
from app.db import Base
|
|
from app.services.auth_service import DEFAULT_TENANT_ID
|
|
from app.services.pilot_request_service import PilotRequestService
|
|
|
|
|
|
class PilotRequestServiceTestCase(unittest.TestCase):
|
|
def setUp(self):
|
|
self.engine = create_engine("sqlite:///:memory:")
|
|
Base.metadata.create_all(bind=self.engine)
|
|
self.SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=self.engine)
|
|
self.db = self.SessionLocal()
|
|
self.service = PilotRequestService(self.db)
|
|
self.admin_user = {"id": "user-admin", "tenant_id": DEFAULT_TENANT_ID, "role": "admin"}
|
|
self.member_user = {"id": "user-member", "tenant_id": DEFAULT_TENANT_ID, "role": "member"}
|
|
|
|
def tearDown(self):
|
|
self.db.close()
|
|
self.engine.dispose()
|
|
|
|
def test_submit_list_summary_and_update_form_closed_loop(self):
|
|
created = self.service.submit_request(
|
|
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(created["status"], "new")
|
|
self.assertEqual(created["tenant_id"], DEFAULT_TENANT_ID)
|
|
|
|
listing = self.service.list_requests(self.admin_user, page=1, page_size=20)
|
|
self.assertEqual(listing["total"], 1)
|
|
self.assertEqual(listing["items"][0]["company_name"], "示例企业")
|
|
|
|
summary = self.service.get_summary(self.admin_user)
|
|
self.assertEqual(summary["total"], 1)
|
|
self.assertEqual(summary["counts"]["new"], 1)
|
|
self.assertEqual(summary["latest_items"][0]["email"], "pilot@example.com")
|
|
|
|
updated = self.service.update_request(
|
|
self.admin_user,
|
|
created["id"],
|
|
status_value="scheduled",
|
|
admin_notes="已约下周演示。",
|
|
)
|
|
self.assertEqual(updated["status"], "scheduled")
|
|
self.assertEqual(updated["admin_notes"], "已约下周演示。")
|
|
self.assertIsNotNone(updated["last_contact_at"])
|
|
|
|
refreshed_summary = self.service.get_summary(self.admin_user)
|
|
self.assertEqual(refreshed_summary["counts"]["new"], 0)
|
|
self.assertEqual(refreshed_summary["counts"]["scheduled"], 1)
|
|
|
|
def test_member_cannot_access_admin_operations(self):
|
|
self.service.submit_request(
|
|
contact_name="李四",
|
|
company_name="成员企业",
|
|
role_title=None,
|
|
email="member@example.com",
|
|
phone=None,
|
|
expected_contract_volume=None,
|
|
primary_goal="pilot_delivery",
|
|
deployment_preference="undecided",
|
|
scenario_description="想了解是否适合小范围试点。",
|
|
)
|
|
|
|
with self.assertRaises(HTTPException) as list_ctx:
|
|
self.service.list_requests(self.member_user)
|
|
self.assertEqual(list_ctx.exception.status_code, status.HTTP_403_FORBIDDEN)
|
|
|
|
with self.assertRaises(HTTPException) as summary_ctx:
|
|
self.service.get_summary(self.member_user)
|
|
self.assertEqual(summary_ctx.exception.status_code, status.HTTP_403_FORBIDDEN)
|
|
|
|
def test_invalid_status_rejected(self):
|
|
created = self.service.submit_request(
|
|
contact_name="王五",
|
|
company_name="异常企业",
|
|
role_title=None,
|
|
email="invalid@example.com",
|
|
phone=None,
|
|
expected_contract_volume=None,
|
|
primary_goal="knowledge_base",
|
|
deployment_preference="private",
|
|
scenario_description="关注知识库和私有化部署能力。",
|
|
)
|
|
|
|
with self.assertRaises(HTTPException) as ctx:
|
|
self.service.update_request(self.admin_user, created["id"], status_value="unknown", admin_notes=None)
|
|
self.assertEqual(ctx.exception.status_code, status.HTTP_400_BAD_REQUEST)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|