test_protocol_pay_mode_switch.py 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. """缴费模式切换校验"""
  2. import unittest
  3. from app.services.protocol_pay_mode_switch import validate_payment_details_for_save
  4. class TestValidatePaymentDetailsForSave(unittest.TestCase):
  5. def test_dj_single_dfj_full_contract(self):
  6. validate_payment_details_for_save(
  7. "dj",
  8. 10000,
  9. None,
  10. [{"payStatus": "dfj", "dueAmount": 10000}],
  11. )
  12. def test_dj_rejects_multiple_dfj(self):
  13. with self.assertRaises(ValueError) as ctx:
  14. validate_payment_details_for_save(
  15. "dj",
  16. 10000,
  17. None,
  18. [
  19. {"payStatus": "dfj", "dueAmount": 5000},
  20. {"payStatus": "dfj", "dueAmount": 5000},
  21. ],
  22. )
  23. self.assertIn("仅允许一条待缴费", str(ctx.exception))
  24. def test_dj_partial_paid_remaining(self):
  25. validate_payment_details_for_save(
  26. "dj",
  27. 10000,
  28. None,
  29. [
  30. {"payStatus": "yjf", "dueAmount": 2000},
  31. {"payStatus": "dfj", "dueAmount": 8000},
  32. ],
  33. )
  34. def test_dj_partial_paid_wrong_remaining(self):
  35. with self.assertRaises(ValueError):
  36. validate_payment_details_for_save(
  37. "dj",
  38. 10000,
  39. None,
  40. [
  41. {"payStatus": "yjf", "dueAmount": 2000},
  42. {"payStatus": "dfj", "dueAmount": 10000},
  43. ],
  44. )
  45. def test_fq_count_mismatch(self):
  46. with self.assertRaises(ValueError):
  47. validate_payment_details_for_save(
  48. "fq",
  49. 6000,
  50. 6,
  51. [{"payStatus": "dfj", "dueAmount": 6000}],
  52. )
  53. def test_fq_partial_paid_valid(self):
  54. validate_payment_details_for_save(
  55. "fq",
  56. 10000,
  57. 4,
  58. [
  59. {"payStatus": "yjf", "installmentNo": 1, "dueAmount": 2500},
  60. {"payStatus": "yjf", "installmentNo": 2, "dueAmount": 2500},
  61. {"payStatus": "dfj", "installmentNo": 3, "dueAmount": 2500},
  62. {"payStatus": "dfj", "installmentNo": 4, "dueAmount": 2500},
  63. ],
  64. )
  65. def test_fq_jfqrz_rejected(self):
  66. with self.assertRaises(ValueError):
  67. validate_payment_details_for_save(
  68. "fq",
  69. 6000,
  70. 2,
  71. [
  72. {"payStatus": "jfqrz", "dueAmount": 3000},
  73. {"payStatus": "dfj", "dueAmount": 3000},
  74. ],
  75. )
  76. def test_dj_ytf_allowed(self):
  77. """已退费为终态,保存协议单时不应阻断。"""
  78. validate_payment_details_for_save(
  79. "dj",
  80. 10000,
  81. None,
  82. [{"payStatus": "ytf", "dueAmount": 10000}],
  83. )
  84. def test_fq_ytf_allowed(self):
  85. validate_payment_details_for_save(
  86. "fq",
  87. 6000,
  88. 2,
  89. [
  90. {"payStatus": "ytf", "installmentNo": 1, "dueAmount": 3000},
  91. {"payStatus": "dfj", "installmentNo": 2, "dueAmount": 3000},
  92. ],
  93. )
  94. def test_blocking_status_rejected(self):
  95. with self.assertRaises(ValueError):
  96. validate_payment_details_for_save(
  97. "dj",
  98. 10000,
  99. None,
  100. [{"payStatus": "jfqrz", "dueAmount": 10000}],
  101. )
  102. def test_tfqrz_blocking_rejected(self):
  103. with self.assertRaises(ValueError):
  104. validate_payment_details_for_save(
  105. "dj",
  106. 10000,
  107. None,
  108. [{"payStatus": "tfqrz", "dueAmount": 10000}],
  109. )
  110. if __name__ == "__main__":
  111. unittest.main()