Files
zkxw/backend/tests/test_sample_payment_progress.py
T
zlwuandCursor 47f873a3e6 feat(backend): add sample payment progress aggregation helper
Pure function for per-sample list progressStatus, paid/due totals, and canConfirm.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-05 12:54:48 +08:00

85 lines
3.2 KiB
Python

"""样本缴费进度:状态码与已缴/待缴汇总"""
from decimal import Decimal
import unittest
from app.services.sample_payment_progress import (
compute_sample_payment_progress,
)
class TestSamplePaymentProgress(unittest.TestCase):
def test_pending_when_no_transfers(self):
r = compute_sample_payment_progress(
schedules=[
{"scheduleStatus": "open", "dueAmount": Decimal("1000")},
],
transfers=[],
)
self.assertEqual(r["progressStatus"], "dfj")
self.assertEqual(r["paidAmount"], Decimal("0"))
self.assertEqual(r["dueRemainAmount"], Decimal("1000"))
self.assertEqual(r["clearedScheduleCount"], 0)
self.assertEqual(r["activeScheduleCount"], 1)
self.assertTrue(r["canConfirm"])
def test_confirming_wins_over_partial(self):
r = compute_sample_payment_progress(
schedules=[
{"id": "s1", "scheduleStatus": "open", "dueAmount": Decimal("1000")},
],
transfers=[
{"scheduleId": "s1", "payStatus": "yjf", "transferAmount": Decimal("200")},
{"scheduleId": "s1", "payStatus": "jfqrz", "transferAmount": Decimal("100")},
],
)
self.assertEqual(r["progressStatus"], "jfqrz")
self.assertEqual(r["paidAmount"], Decimal("200"))
self.assertFalse(r["canConfirm"])
def test_partial_paid(self):
r = compute_sample_payment_progress(
schedules=[
{"id": "s1", "scheduleStatus": "cleared", "dueAmount": Decimal("500")},
{"id": "s2", "scheduleStatus": "open", "dueAmount": Decimal("500")},
],
transfers=[
{"scheduleId": "s1", "payStatus": "yjf", "transferAmount": Decimal("500")},
],
)
self.assertEqual(r["progressStatus"], "bfyj")
self.assertEqual(r["clearedScheduleCount"], 1)
self.assertEqual(r["activeScheduleCount"], 2)
self.assertTrue(r["canConfirm"])
def test_all_cleared(self):
r = compute_sample_payment_progress(
schedules=[
{"id": "s1", "scheduleStatus": "cleared", "dueAmount": Decimal("500")},
{"id": "s2", "scheduleStatus": "void", "dueAmount": Decimal("500")},
],
transfers=[
{"scheduleId": "s1", "payStatus": "yjf", "transferAmount": Decimal("500")},
],
)
self.assertEqual(r["progressStatus"], "yjq")
self.assertEqual(r["activeScheduleCount"], 1)
self.assertEqual(r["clearedScheduleCount"], 1)
self.assertFalse(r["canConfirm"])
self.assertEqual(r["dueRemainAmount"], Decimal("0"))
def test_void_schedules_ignored(self):
r = compute_sample_payment_progress(
schedules=[
{"scheduleStatus": "void", "dueAmount": Decimal("9999")},
{"scheduleStatus": "open", "dueAmount": Decimal("100")},
],
transfers=[],
)
self.assertEqual(r["activeScheduleCount"], 1)
self.assertEqual(r["dueRemainAmount"], Decimal("100"))
if __name__ == "__main__":
unittest.main()