Files
along_django/yonghu/tests/test_freeze_service.py
XingQue 8678f54459 实现提现资金冻结:手动/自动打款共用冻结拆分,驳回仅退 shenqing_jine。
新增公共/用户冻结配置、流水表与后台解冻接口;修复冻结与扣款重复扣余额问题。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-10 04:06:08 +08:00

71 lines
3.1 KiB
Python

"""资金冻结拆分算法单元测试"""
import decimal
from unittest import TestCase
from yonghu.freeze_service import (
DONGJIE_MODE_FIXED,
DONGJIE_MODE_RATIO,
FreezeConfig,
compute_freeze_split,
)
class ComputeFreezeSplitTests(TestCase):
def test_no_config_returns_full_withdraw(self):
r = compute_freeze_split(
decimal.Decimal('100'), decimal.Decimal('0'), None, decimal.Decimal('50'),
)
self.assertEqual(r.withdraw_jine, decimal.Decimal('50.00'))
self.assertEqual(r.freeze_jine, decimal.Decimal('0.00'))
self.assertFalse(r.freeze_only)
def test_ratio_partial_freeze(self):
cfg = FreezeConfig(DONGJIE_MODE_RATIO, decimal.Decimal('0.30'), decimal.Decimal('0'), 'public')
r = compute_freeze_split(
decimal.Decimal('100'), decimal.Decimal('0'), cfg, decimal.Decimal('50'),
)
self.assertEqual(r.freeze_jine, decimal.Decimal('30.00'))
self.assertEqual(r.withdraw_jine, decimal.Decimal('50.00'))
self.assertFalse(r.freeze_only)
def test_ratio_exceed_max_raises(self):
cfg = FreezeConfig(DONGJIE_MODE_RATIO, decimal.Decimal('0.30'), decimal.Decimal('0'), 'public')
with self.assertRaises(ValueError):
compute_freeze_split(
decimal.Decimal('100'), decimal.Decimal('0'), cfg, decimal.Decimal('80'),
)
def test_ratio_100_percent_freeze_only(self):
cfg = FreezeConfig(DONGJIE_MODE_RATIO, decimal.Decimal('1'), decimal.Decimal('0'), 'public')
r = compute_freeze_split(
decimal.Decimal('100'), decimal.Decimal('0'), cfg, decimal.Decimal('40'),
)
self.assertTrue(r.freeze_only)
self.assertEqual(r.freeze_jine, decimal.Decimal('40.00'))
self.assertEqual(r.withdraw_jine, decimal.Decimal('0.00'))
def test_fixed_pool_not_full_freeze_only(self):
cfg = FreezeConfig(DONGJIE_MODE_FIXED, decimal.Decimal('0'), decimal.Decimal('500'), 'public')
r = compute_freeze_split(
decimal.Decimal('100'), decimal.Decimal('200'), cfg, decimal.Decimal('80'),
)
self.assertTrue(r.freeze_only)
self.assertEqual(r.freeze_jine, decimal.Decimal('80.00'))
def test_fixed_pool_partial_then_withdraw(self):
cfg = FreezeConfig(DONGJIE_MODE_FIXED, decimal.Decimal('0'), decimal.Decimal('500'), 'public')
r = compute_freeze_split(
decimal.Decimal('200'), decimal.Decimal('400'), cfg, decimal.Decimal('150'),
)
self.assertFalse(r.freeze_only)
self.assertEqual(r.freeze_jine, decimal.Decimal('100.00'))
self.assertEqual(r.withdraw_jine, decimal.Decimal('50.00'))
def test_fixed_pool_already_full(self):
cfg = FreezeConfig(DONGJIE_MODE_FIXED, decimal.Decimal('0'), decimal.Decimal('500'), 'public')
r = compute_freeze_split(
decimal.Decimal('100'), decimal.Decimal('500'), cfg, decimal.Decimal('60'),
)
self.assertEqual(r.freeze_jine, decimal.Decimal('0.00'))
self.assertEqual(r.withdraw_jine, decimal.Decimal('60.00'))