71 lines
3.1 KiB
Python
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'))
|