feat(douyu): 支持管理员取消作废协作单

This commit is contained in:
yml2213
2026-11-06 15:42:19 +08:00
parent 973042288f
commit afcbff2207
3 changed files with 233 additions and 7 deletions
+116
View File
@@ -317,6 +317,122 @@ class TestDouyuCollabOrders:
assert result["order"].status == collab.STATUS_DONE
assert result["order"].done_at is not None
def test_admin_can_restore_voided_order_to_another_status(self):
order = collab.create_order(
self.session,
self.admin,
order_no="DY-RESTORE-1",
shop="店铺A",
account_username="douyu-account-a",
gift_name="礼包A",
required_points=100,
home_images=["collab/home-restore-1.png"],
client=FakeClient(),
)
collab.set_status(
self.session,
self.admin,
order,
status=collab.STATUS_VOID,
reason="误作废",
)
restored = collab.set_status(
self.session,
self.admin,
order,
status=collab.STATUS_SCRIPTED,
reason="管理员确认恢复",
)
assert restored.status == collab.STATUS_SCRIPTED
assert restored.void_reason == ""
assert restored.recharged_at is not None
assert restored.scripted_at is not None
payload = collab.serialize_one(self.session, restored)
serialized = DouyuCollabOrderOut.model_validate(payload).model_dump()
assert serialized["status"] == collab.STATUS_SCRIPTED
assert serialized["void_reason"] == ""
audit = (
self.session.query(AuditLog)
.filter(AuditLog.action == "douyu:collab:void_restore")
.order_by(AuditLog.id.desc())
.first()
)
assert audit is not None
assert audit.username == self.admin.username
assert '"from":"void"' in audit.detail
assert '"to":"scripted"' in audit.detail
assert '"previous_void_reason":"误作废"' in audit.detail
def test_non_admin_cannot_restore_voided_order(self):
operator = User(
username="douyu-collab-restore-operator",
password_hash="hash",
role="operation",
is_active=True,
)
self.session.add(operator)
self.session.commit()
order = collab.create_order(
self.session,
self.admin,
order_no="DY-RESTORE-2",
account_username="douyu-account-a",
draft=True,
)
collab.set_status(
self.session,
self.admin,
order,
status=collab.STATUS_VOID,
reason="测试权限",
)
with pytest.raises(collab.CollabError) as excinfo:
collab.set_status(
self.session,
operator,
order,
status=collab.STATUS_INCOMPLETE,
reason="越权恢复",
)
assert excinfo.value.status_code == 403
assert excinfo.value.code == "admin_required"
assert order.status == collab.STATUS_VOID
assert order.void_reason == "测试权限"
def test_void_restore_still_enforces_recharge_fields(self):
order = collab.create_order(
self.session,
self.admin,
order_no="DY-RESTORE-3",
account_username="douyu-account-a",
draft=True,
)
collab.set_status(
self.session,
self.admin,
order,
status=collab.STATUS_VOID,
reason="资料不全",
)
with pytest.raises(collab.CollabError) as excinfo:
collab.set_status(
self.session,
self.admin,
order,
status=collab.STATUS_RECHARGED,
reason="直接恢复",
)
assert excinfo.value.code == "recharge_precondition"
assert order.status == collab.STATUS_VOID
assert order.void_reason == "资料不全"
def test_points_shortage_enters_points_error(self):
order = collab.create_order(
self.session,