test_protocol_invoice_request.py 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. """Tests for protocol invoice request CRUD helpers."""
  2. import unittest
  3. from unittest.mock import MagicMock, patch
  4. class TestInstallmentSummary(unittest.TestCase):
  5. def test_build_installment_summary_single(self):
  6. from app.crud.collection_protocol import build_installment_summary
  7. self.assertEqual(build_installment_summary([1]), "第1期")
  8. def test_build_installment_summary_multi(self):
  9. from app.crud.collection_protocol import build_installment_summary
  10. self.assertEqual(build_installment_summary([1, 2, 3]), "第1、2、3期")
  11. def test_build_installment_summary_lump_sum(self):
  12. from app.crud.collection_protocol import build_installment_summary
  13. self.assertEqual(build_installment_summary([None]), "趸交")
  14. class TestCreateInvoiceRequestValidation(unittest.TestCase):
  15. def test_rejects_empty_payment_detail_ids(self):
  16. from app.crud.collection_protocol import create_invoice_request
  17. mock_db = MagicMock()
  18. with self.assertRaises(ValueError) as ctx:
  19. create_invoice_request(
  20. mock_db,
  21. collection_protocol_id="proto-1",
  22. payment_detail_ids=[],
  23. tenant_no="t1",
  24. )
  25. self.assertIn("至少选择", str(ctx.exception))
  26. @patch("app.crud.collection_protocol._active_invoiced_payment_detail_ids", return_value={"pd-1"})
  27. def test_rejects_duplicate_payment_detail_in_active_request(self, _mock_active):
  28. from app.crud.collection_protocol import create_invoice_request
  29. mock_db = MagicMock()
  30. with self.assertRaises(ValueError) as ctx:
  31. create_invoice_request(
  32. mock_db,
  33. collection_protocol_id="proto-1",
  34. payment_detail_ids=["pd-1"],
  35. tenant_no="t1",
  36. user_info={"user_id": "u1"},
  37. )
  38. self.assertIn("已申请开票", str(ctx.exception))
  39. if __name__ == "__main__":
  40. unittest.main()