feat: improve operations admin

This commit is contained in:
QiuSW
2026-07-03 16:36:06 +08:00
parent 547196f39a
commit 79605449ef
15 changed files with 520 additions and 31 deletions
+69
View File
@@ -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):