Files
ai-contract-platform/backend/tests/test_pilot_request_service.py
T

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()