feat(weibo): 区分充值资金来源并完善协作单记录
This commit is contained in:
@@ -35,7 +35,7 @@ TESTS_DIR = Path(__file__).resolve().parent
|
||||
PROJECT_ROOT = TESTS_DIR.parent
|
||||
VERSIONS_DIR = PROJECT_ROOT / "web" / "backend" / "migrations" / "versions"
|
||||
|
||||
HEAD_REVISION = "20261113_0081"
|
||||
HEAD_REVISION = "20261113_0082"
|
||||
|
||||
# 迁移新增、但不声明在模型里的复合查询索引。
|
||||
EXTRA_INDEXES = (
|
||||
|
||||
@@ -19,7 +19,13 @@ from core.weibo import (
|
||||
WeiboRechargeError,
|
||||
WeiboRechargeOrder,
|
||||
)
|
||||
from web.backend.models import AuditLog, User, WeiboAccount, WeiboWorkbenchAccount
|
||||
from web.backend.models import (
|
||||
AuditLog,
|
||||
User,
|
||||
WeiboAccount,
|
||||
WeiboRechargeRecord,
|
||||
WeiboWorkbenchAccount,
|
||||
)
|
||||
from web.backend.permissions import ROLE_PERMISSIONS
|
||||
from web.backend.routers import weibo as weibo_router
|
||||
from web.backend.routers.weibo import (
|
||||
@@ -1587,6 +1593,11 @@ def test_manual_recharge_order_and_status_routes_serialize(
|
||||
assert order["single_reward"] == 100
|
||||
assert order["alipay_qr_code"] == "https://qr.alipay.com/upx-test"
|
||||
assert status["status"] == "PAY_STATUS_PENDING"
|
||||
record = db.query(WeiboRechargeRecord).filter_by(order_id="order-1").one()
|
||||
assert record.pay_id == "pay-1"
|
||||
assert record.amount_yuan == 1
|
||||
assert record.status == "pending"
|
||||
assert record.status_checked_at is not None
|
||||
|
||||
|
||||
def test_recharge_failure_keeps_valid_ck_status(monkeypatch, db, current_user):
|
||||
|
||||
@@ -2,10 +2,18 @@
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
from datetime import UTC, datetime
|
||||
|
||||
from sqlalchemy.orm import Session
|
||||
|
||||
from core.weibo import WeiboAuthError
|
||||
from web.backend.models import AuditLog, User, WeiboAccount, WeiboExternalOrderMetric
|
||||
from web.backend.models import (
|
||||
AuditLog,
|
||||
User,
|
||||
WeiboAccount,
|
||||
WeiboExternalOrderMetric,
|
||||
WeiboRechargeRecord,
|
||||
)
|
||||
from web.backend.routers import weibo_collab as weibo_collab_router
|
||||
from web.backend.schemas import WeiboCollabCkExportOut
|
||||
from web.backend.services import weibo_collab_service as collab
|
||||
@@ -98,9 +106,58 @@ def test_create_orders_groups_and_balance_check(monkeypatch, db):
|
||||
assert first.status == collab.STATUS_RECHARGED
|
||||
assert second.status == collab.STATUS_RECHARGED
|
||||
assert first.recharged_at is not None
|
||||
assert first.funding_source == collab.FUNDING_SOURCE_ACCOUNT_BALANCE
|
||||
assert second.funding_source == collab.FUNDING_SOURCE_ACCOUNT_BALANCE
|
||||
assert db.query(WeiboExternalOrderMetric).count() == 2
|
||||
|
||||
|
||||
def test_balance_check_recognizes_paid_web_recharge(monkeypatch, db):
|
||||
user = make_user(db)
|
||||
account = make_account(db)
|
||||
order = collab.create_order(
|
||||
db,
|
||||
user,
|
||||
order_no="WB-WEB-RECHARGE",
|
||||
shop="店铺A",
|
||||
account_id=account.id,
|
||||
goods_name="商品A",
|
||||
required_weidou=100,
|
||||
require_verified=False,
|
||||
)
|
||||
db.add(
|
||||
WeiboRechargeRecord(
|
||||
account_id=account.id,
|
||||
order_id="recharge-order-1",
|
||||
pay_id="pay-1",
|
||||
amount_yuan=1,
|
||||
single_reward=100,
|
||||
status="paid",
|
||||
paid_at=datetime.now(UTC),
|
||||
created_by=user.id,
|
||||
)
|
||||
)
|
||||
db.commit()
|
||||
|
||||
class FakeClient:
|
||||
def __init__(self, *_args, **_kwargs):
|
||||
pass
|
||||
|
||||
def list_mall(self, *_args, **_kwargs):
|
||||
return {"weidou_balance": 100, "list": []}
|
||||
|
||||
monkeypatch.setattr(weibo_service, "WeiboClient", FakeClient)
|
||||
|
||||
collab.check_balance_groups(db, user, [order], threshold=100)
|
||||
|
||||
db.refresh(order)
|
||||
assert order.funding_source == collab.FUNDING_SOURCE_WEB_RECHARGE
|
||||
assert order.funding_recharge_record_id is not None
|
||||
detail = collab.serialize_one(db, order)
|
||||
assert detail["funding_source_label"] == "系统 Web 充值"
|
||||
assert detail["recharge_records"][0]["order_id"] == "recharge-order-1"
|
||||
assert detail["recharge_records"][0]["is_paid"] is True
|
||||
|
||||
|
||||
def test_exchange_record_unique_match_and_archive(monkeypatch, db):
|
||||
user = make_user(db)
|
||||
account = make_account(db)
|
||||
|
||||
Reference in New Issue
Block a user