feat: improve operations admin
This commit is contained in:
@@ -34,6 +34,9 @@ from apps.billing.services import (
|
||||
RechargeAmountMismatchError,
|
||||
RechargeOrderCreateError,
|
||||
RechargePayment,
|
||||
WalletAdjustmentError,
|
||||
WalletAdjustmentWouldOverdrawError,
|
||||
adjust_wallet_points,
|
||||
apply_recharge_payment,
|
||||
create_recharge_order,
|
||||
mark_call_success,
|
||||
@@ -683,6 +686,72 @@ class BillingServiceTests(TestCase):
|
||||
self.assertEqual(order.status, RechargeOrder.Status.PAID)
|
||||
self.assertEqual(order.payment_txn_no, "queried-txn-001")
|
||||
|
||||
def test_adjust_wallet_points_credits_wallet_and_writes_adjust_ledger(self):
|
||||
result = adjust_wallet_points(
|
||||
user=self.user,
|
||||
points_delta=25,
|
||||
reason="运营补偿",
|
||||
)
|
||||
|
||||
self.wallet.refresh_from_db()
|
||||
self.assertEqual(result.points_delta, 25)
|
||||
self.assertEqual(result.balance_after, 125)
|
||||
self.assertEqual(self.wallet.points_balance, 125)
|
||||
|
||||
ledger = PointsLedger.objects.get(
|
||||
user=self.user,
|
||||
change_type=PointsLedger.ChangeType.ADJUST,
|
||||
)
|
||||
self.assertEqual(ledger.points_delta, 25)
|
||||
self.assertEqual(ledger.balance_after, 125)
|
||||
self.assertEqual(ledger.reason, "运营补偿")
|
||||
|
||||
def test_adjust_wallet_points_debits_wallet_without_overdraft(self):
|
||||
result = adjust_wallet_points(
|
||||
user=self.user,
|
||||
points_delta=-40,
|
||||
reason="纠正误充值",
|
||||
)
|
||||
|
||||
self.wallet.refresh_from_db()
|
||||
self.assertEqual(result.balance_after, 60)
|
||||
self.assertEqual(self.wallet.points_balance, 60)
|
||||
self.assertEqual(result.ledger_entry.points_delta, -40)
|
||||
self.assertEqual(result.ledger_entry.reason, "纠正误充值")
|
||||
|
||||
def test_adjust_wallet_points_requires_non_zero_delta_and_reason(self):
|
||||
with self.assertRaises(WalletAdjustmentError):
|
||||
adjust_wallet_points(user=self.user, points_delta=0, reason="无变化")
|
||||
with self.assertRaises(WalletAdjustmentError):
|
||||
adjust_wallet_points(user=self.user, points_delta=10, reason=" ")
|
||||
|
||||
self.wallet.refresh_from_db()
|
||||
self.assertEqual(self.wallet.points_balance, 100)
|
||||
self.assertFalse(
|
||||
PointsLedger.objects.filter(
|
||||
user=self.user,
|
||||
change_type=PointsLedger.ChangeType.ADJUST,
|
||||
).exists()
|
||||
)
|
||||
|
||||
def test_adjust_wallet_points_rejects_overdraft_without_writing_ledger(self):
|
||||
with self.assertRaises(WalletAdjustmentWouldOverdrawError) as context:
|
||||
adjust_wallet_points(
|
||||
user=self.user,
|
||||
points_delta=-101,
|
||||
reason="扣回异常点数",
|
||||
)
|
||||
|
||||
self.assertEqual(context.exception.available_points, 100)
|
||||
self.wallet.refresh_from_db()
|
||||
self.assertEqual(self.wallet.points_balance, 100)
|
||||
self.assertFalse(
|
||||
PointsLedger.objects.filter(
|
||||
user=self.user,
|
||||
change_type=PointsLedger.ChangeType.ADJUST,
|
||||
).exists()
|
||||
)
|
||||
|
||||
|
||||
class ConcurrentDebitTests(TransactionTestCase):
|
||||
def setUp(self):
|
||||
|
||||
Reference in New Issue
Block a user