feat(douyu): 支持管理员取消作废协作单
This commit is contained in:
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user