mirror of
https://github.com/fawney19/Aether.git
synced 2026-09-02 17:30:23 +08:00
feat(wallet): 钱包系统替代配额系统,新增支付与退款机制
- 新增钱包余额管理、充值、扣费、退款完整流程 - 新增支付网关抽象层(支持手动/支付宝/微信) - 用量计费从配额系统迁移到钱包余额扣费 - 新增管理员钱包管理与支付订单管理页面 - 新增用户钱包中心页面 - 移除独立 Key 锁定机制,统一由钱包余额控制 - 新增相关 API 路由、序列化器与数据库迁移 - 新增钱包、支付、退款相关测试
This commit is contained in:
87
tests/services/test_user_service_delete_user.py
Normal file
87
tests/services/test_user_service_delete_user.py
Normal file
@@ -0,0 +1,87 @@
|
||||
from __future__ import annotations
|
||||
|
||||
from types import SimpleNamespace
|
||||
from unittest.mock import MagicMock
|
||||
|
||||
import pytest
|
||||
|
||||
from src.models.database import PaymentOrder, RefundRequest, User, Wallet
|
||||
from src.services.user.service import UserService
|
||||
|
||||
|
||||
def test_delete_user_blocks_when_unfinished_refund_exists() -> None:
|
||||
user = SimpleNamespace(id="user-1", email="u1@example.com")
|
||||
|
||||
user_query = MagicMock()
|
||||
user_query.filter.return_value = user_query
|
||||
user_query.first.return_value = user
|
||||
|
||||
wallet_ids_query = MagicMock()
|
||||
wallet_ids_query.outerjoin.return_value = wallet_ids_query
|
||||
wallet_ids_query.filter.return_value = wallet_ids_query
|
||||
wallet_ids_query.all.return_value = [("wallet-1",)]
|
||||
|
||||
refund_query = MagicMock()
|
||||
refund_query.filter.return_value = refund_query
|
||||
refund_query.count.return_value = 1
|
||||
|
||||
db = MagicMock()
|
||||
db.in_transaction.return_value = True
|
||||
|
||||
def _query(model: object) -> MagicMock:
|
||||
if model is User:
|
||||
return user_query
|
||||
if model is Wallet.id:
|
||||
return wallet_ids_query
|
||||
if model is RefundRequest:
|
||||
return refund_query
|
||||
raise AssertionError(f"unexpected query target: {model}")
|
||||
|
||||
db.query.side_effect = _query
|
||||
|
||||
with pytest.raises(ValueError, match="未完结退款"):
|
||||
UserService.delete_user.__wrapped__(db, "user-1")
|
||||
|
||||
db.delete.assert_not_called()
|
||||
|
||||
|
||||
def test_delete_user_blocks_when_unfinished_payment_order_exists() -> None:
|
||||
user = SimpleNamespace(id="user-2", email="u2@example.com")
|
||||
|
||||
user_query = MagicMock()
|
||||
user_query.filter.return_value = user_query
|
||||
user_query.first.return_value = user
|
||||
|
||||
wallet_ids_query = MagicMock()
|
||||
wallet_ids_query.outerjoin.return_value = wallet_ids_query
|
||||
wallet_ids_query.filter.return_value = wallet_ids_query
|
||||
wallet_ids_query.all.return_value = [("wallet-2",)]
|
||||
|
||||
refund_query = MagicMock()
|
||||
refund_query.filter.return_value = refund_query
|
||||
refund_query.count.return_value = 0
|
||||
|
||||
order_query = MagicMock()
|
||||
order_query.filter.return_value = order_query
|
||||
order_query.count.return_value = 2
|
||||
|
||||
db = MagicMock()
|
||||
db.in_transaction.return_value = True
|
||||
|
||||
def _query(model: object) -> MagicMock:
|
||||
if model is User:
|
||||
return user_query
|
||||
if model is Wallet.id:
|
||||
return wallet_ids_query
|
||||
if model is RefundRequest:
|
||||
return refund_query
|
||||
if model is PaymentOrder:
|
||||
return order_query
|
||||
raise AssertionError(f"unexpected query target: {model}")
|
||||
|
||||
db.query.side_effect = _query
|
||||
|
||||
with pytest.raises(ValueError, match="未完结充值订单"):
|
||||
UserService.delete_user.__wrapped__(db, "user-2")
|
||||
|
||||
db.delete.assert_not_called()
|
||||
Reference in New Issue
Block a user