"""资金冻结拆分算法单元测试""" 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'))