feat(douyu): support elite handbook lock orders
This commit is contained in:
@@ -0,0 +1,105 @@
|
||||
import unittest
|
||||
from unittest.mock import Mock
|
||||
|
||||
from core.douyu.activity_client import DouyuActivityClient, DouyuActivityError
|
||||
|
||||
|
||||
class EliteLockExchangeTests(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.client = DouyuActivityClient("acf_uid=100")
|
||||
self.client.csrf_token = Mock(side_effect=["csrf-create", "csrf-pay"])
|
||||
|
||||
@staticmethod
|
||||
def multipart_values(files):
|
||||
return {key: value[1] for key, value in files.items()}
|
||||
|
||||
def test_exchange_locks_then_pays_with_fresh_csrf_tokens(self):
|
||||
self.client._request_json = Mock(side_effect=[
|
||||
{
|
||||
"error": 0,
|
||||
"msg": "请求正常",
|
||||
"data": {
|
||||
"orderId": "5874",
|
||||
"commodityName": "套装-兔兔白日梦",
|
||||
"commodityImage": "https://example.test/item.png",
|
||||
"score": 1280,
|
||||
"num": 1,
|
||||
"expireSeconds": "300",
|
||||
},
|
||||
},
|
||||
{
|
||||
"error": 0,
|
||||
"msg": "请求正常",
|
||||
"data": {
|
||||
"orderId": "5874",
|
||||
"exchangeId": "11098933",
|
||||
"commodityType": 3,
|
||||
"commodityImage": "https://example.test/item.png",
|
||||
"exchangeNum": 1,
|
||||
"sType": 1,
|
||||
"gType": 2,
|
||||
},
|
||||
},
|
||||
])
|
||||
|
||||
result = self.client.exchange_goods(
|
||||
manual_id="G4KA4Qnz4LDp7",
|
||||
rid="9263298",
|
||||
commodity_id="20260120QYOOB_bag10",
|
||||
)
|
||||
|
||||
self.assertEqual(result["order_id"], "5874")
|
||||
self.assertEqual(result["exchange_id"], "11098933")
|
||||
self.assertEqual(self.client.csrf_token.call_count, 2)
|
||||
create_call, pay_call = self.client._request_json.call_args_list
|
||||
self.assertEqual(create_call.args[:3], (
|
||||
"post", self.client.CREATE_EXCHANGE_ORDER_API, "锁定兑换商品",
|
||||
))
|
||||
self.assertEqual(self.multipart_values(create_call.kwargs["files"]), {
|
||||
"manualID": "G4KA4Qnz4LDp7",
|
||||
"rid": "9263298",
|
||||
"commodityID": "20260120QYOOB_bag10",
|
||||
"num": "1",
|
||||
"csrfToken": "csrf-create",
|
||||
})
|
||||
self.assertNotIn("Content-Type", create_call.kwargs["headers"])
|
||||
self.assertEqual(pay_call.args[:3], (
|
||||
"post", self.client.PAY_EXCHANGE_ORDER_API, "支付锁单",
|
||||
))
|
||||
self.assertEqual(self.multipart_values(pay_call.kwargs["files"]), {
|
||||
"orderID": "5874",
|
||||
"manualID": "G4KA4Qnz4LDp7",
|
||||
"csrfToken": "csrf-pay",
|
||||
})
|
||||
|
||||
def test_lock_requires_order_id_in_success_response(self):
|
||||
self.client._request_json = Mock(return_value={"error": 0, "data": {}})
|
||||
|
||||
with self.assertRaisesRegex(DouyuActivityError, "没有 orderId"):
|
||||
self.client.create_exchange_order(
|
||||
manual_id="manual",
|
||||
rid="9263298",
|
||||
commodity_id="goods",
|
||||
)
|
||||
|
||||
def test_locked_order_list_uses_captured_query_shape(self):
|
||||
self.client._request_json = Mock(return_value={
|
||||
"error": 0,
|
||||
"data": {"total": 1, "list": [{"orderId": "5874"}]},
|
||||
})
|
||||
|
||||
result = self.client.exchange_orders(manual_id="manual", page=2, page_size=20)
|
||||
|
||||
self.assertEqual(result["total"], 1)
|
||||
self.assertEqual(result["orders"], [{"orderId": "5874"}])
|
||||
call = self.client._request_json.call_args
|
||||
self.assertEqual(call.args[:3], (
|
||||
"get", self.client.EXCHANGE_ORDER_LIST_API, "查询锁单",
|
||||
))
|
||||
self.assertEqual(call.kwargs["params"], {
|
||||
"page": 2, "pageSize": 20, "manualID": "manual",
|
||||
})
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
@@ -90,6 +90,31 @@ class DouyuWorkbenchScopeTests(unittest.TestCase):
|
||||
self.session, [self.account.id], "get_xpd_bind_qr", "elite", self.user.id,
|
||||
)
|
||||
|
||||
def test_elite_workbench_accepts_lock_goods_task(self):
|
||||
batch_id, count = create_douyu_planned_tasks(
|
||||
self.session,
|
||||
[self.account.id],
|
||||
"lock_goods",
|
||||
"elite",
|
||||
self.user.id,
|
||||
{"commodity_id": "goods-1"},
|
||||
)
|
||||
|
||||
task = self.session.query(DouyuTask).filter(DouyuTask.batch_id == batch_id).one()
|
||||
self.assertEqual(count, 1)
|
||||
self.assertEqual(task.task_type, "lock_goods")
|
||||
self.assertEqual(task.result, {"payload": {"commodity_id": "goods-1"}})
|
||||
|
||||
_, pay_count = create_douyu_planned_tasks(
|
||||
self.session,
|
||||
[self.account.id],
|
||||
"pay_locked_order",
|
||||
"elite",
|
||||
self.user.id,
|
||||
{"order_id": "5874", "commodity_id": "goods-1"},
|
||||
)
|
||||
self.assertEqual(pay_count, 1)
|
||||
|
||||
def test_account_deletion_removes_workbench_membership(self):
|
||||
self.session.add(DouyuWorkbenchAccount(
|
||||
user_id=self.user.id,
|
||||
|
||||
Reference in New Issue
Block a user