test_protocol_pay_mode_switch.py 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  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_allows_multiple_dfj_when_sum_matches(self):
  13. validate_payment_details_for_save(
  14. "dj",
  15. 10000,
  16. None,
  17. [
  18. {"payStatus": "dfj", "dueAmount": 2000},
  19. {"payStatus": "dfj", "dueAmount": 8000},
  20. ],
  21. )
  22. def test_dj_rejects_multiple_dfj_wrong_sum(self):
  23. with self.assertRaises(ValueError) as ctx:
  24. validate_payment_details_for_save(
  25. "dj",
  26. 10000,
  27. None,
  28. [
  29. {"payStatus": "dfj", "dueAmount": 2000},
  30. {"payStatus": "dfj", "dueAmount": 7000},
  31. ],
  32. )
  33. self.assertIn("之和应为", str(ctx.exception))
  34. def test_dj_partial_paid_remaining(self):
  35. validate_payment_details_for_save(
  36. "dj",
  37. 10000,
  38. None,
  39. [
  40. {"payStatus": "yjf", "dueAmount": 2000},
  41. {"payStatus": "dfj", "dueAmount": 8000},
  42. ],
  43. )
  44. def test_dj_partial_paid_wrong_remaining(self):
  45. with self.assertRaises(ValueError):
  46. validate_payment_details_for_save(
  47. "dj",
  48. 10000,
  49. None,
  50. [
  51. {"payStatus": "yjf", "dueAmount": 2000},
  52. {"payStatus": "dfj", "dueAmount": 10000},
  53. ],
  54. )
  55. def test_djfq_same_as_fq(self):
  56. validate_payment_details_for_save(
  57. "djfq",
  58. 41000,
  59. 4,
  60. [
  61. {"payStatus": "dfj", "installmentNo": 1, "dueAmount": 29360},
  62. {"payStatus": "dfj", "installmentNo": 2, "dueAmount": 3880},
  63. {"payStatus": "dfj", "installmentNo": 3, "dueAmount": 3880},
  64. {"payStatus": "dfj", "installmentNo": 4, "dueAmount": 3880},
  65. ],
  66. installment_ratios=[29360, 3880, 3880, 3880],
  67. )
  68. def test_fq_count_mismatch(self):
  69. with self.assertRaises(ValueError):
  70. validate_payment_details_for_save(
  71. "fq",
  72. 6000,
  73. 6,
  74. [{"payStatus": "dfj", "dueAmount": 6000}],
  75. )
  76. def test_fq_partial_paid_valid(self):
  77. validate_payment_details_for_save(
  78. "fq",
  79. 10000,
  80. 4,
  81. [
  82. {"payStatus": "yjf", "installmentNo": 1, "dueAmount": 2500},
  83. {"payStatus": "yjf", "installmentNo": 2, "dueAmount": 2500},
  84. {"payStatus": "dfj", "installmentNo": 3, "dueAmount": 2500},
  85. {"payStatus": "dfj", "installmentNo": 4, "dueAmount": 2500},
  86. ],
  87. )
  88. def test_fq_jfqrz_rejected(self):
  89. with self.assertRaises(ValueError):
  90. validate_payment_details_for_save(
  91. "fq",
  92. 6000,
  93. 2,
  94. [
  95. {"payStatus": "jfqrz", "dueAmount": 3000},
  96. {"payStatus": "dfj", "dueAmount": 3000},
  97. ],
  98. )
  99. def test_dj_ytf_allowed(self):
  100. """已退费为终态,保存协议单时不应阻断。"""
  101. validate_payment_details_for_save(
  102. "dj",
  103. 10000,
  104. None,
  105. [{"payStatus": "ytf", "dueAmount": 10000}],
  106. )
  107. def test_fq_ytf_allowed(self):
  108. validate_payment_details_for_save(
  109. "fq",
  110. 6000,
  111. 2,
  112. [
  113. {"payStatus": "ytf", "installmentNo": 1, "dueAmount": 3000},
  114. {"payStatus": "dfj", "installmentNo": 2, "dueAmount": 3000},
  115. ],
  116. )
  117. def test_blocking_status_rejected(self):
  118. with self.assertRaises(ValueError):
  119. validate_payment_details_for_save(
  120. "dj",
  121. 10000,
  122. None,
  123. [{"payStatus": "jfqrz", "dueAmount": 10000}],
  124. )
  125. def test_tfqrz_blocking_rejected(self):
  126. with self.assertRaises(ValueError):
  127. validate_payment_details_for_save(
  128. "dj",
  129. 10000,
  130. None,
  131. [{"payStatus": "tfqrz", "dueAmount": 10000}],
  132. )
  133. if __name__ == "__main__":
  134. unittest.main()