Files
live-hub-py/tests/test_huya_live_goods.py
T

144 lines
4.4 KiB
Python

"""Huya live goods selection and stale snapshot protection tests."""
from __future__ import annotations
from datetime import UTC, datetime, timedelta
from types import SimpleNamespace
from web.backend.models import HuyaAccount, HuyaGoodsSnapshot, User
from web.backend.routers.huya import list_goods, list_live_goods
from web.backend.services import huya_points_exchange as exchange
from web.backend.services import huya_runner_goods
from web.backend.services.huya_runner import HuyaBatchRunner
def _seed_account(db) -> tuple[User, HuyaAccount]:
user = User(username="operator", password_hash="hash", role="super_admin")
account = HuyaAccount(
uid="1199669301102",
yyuid="1199669301102",
nickname="小银紫资源",
cookie="yyuid=1199669301102; udb_uid=1199669301102",
)
db.add_all([user, account])
db.commit()
return user, account
def test_live_goods_endpoint_returns_current_spu(db, monkeypatch):
user, account = _seed_account(db)
monkeypatch.setattr(
"web.backend.routers.huya.workbench.fetch_points_center_catalog",
lambda *_args, **_kwargs: SimpleNamespace(
goods=[
{
"product_id": "hy-9391246",
"name": "小狗蛇点点大礼包",
"price": 3960,
"remain_text": "2703",
}
],
message="已拉取 1 个礼包",
sid=2277,
),
)
rows = list_live_goods(account_id=account.id, db=db, current=user)
assert [row.product_id for row in rows] == ["hy-9391246"]
assert rows[0].raw["product_id"] == "hy-9391246"
def test_list_goods_ignores_legacy_numeric_prize_ids(db):
user, account = _seed_account(db)
now = datetime.now(UTC)
db.add_all(
[
HuyaGoodsSnapshot(
account_id=account.id,
sid=2277,
product_id="13649",
name="小狗蛇点点大礼包",
updated_at=now,
),
HuyaGoodsSnapshot(
account_id=account.id,
sid=2277,
product_id="hy-9391246",
name="小狗蛇点点大礼包",
updated_at=now - timedelta(minutes=1),
),
]
)
db.commit()
rows = list_goods(db=db, current=user)
assert [row.product_id for row in rows] == ["hy-9391246"]
def test_exchange_resolves_stale_prize_id_to_current_live_spu(monkeypatch):
runner = HuyaBatchRunner(
db=None,
batch_id="live-goods-repair",
task_type="exchange_goods",
payload={
"product_id": "hy-13649",
"product_name": "小狗蛇点点大礼包",
},
)
client = SimpleNamespace()
marks = []
prepared_args = {}
monkeypatch.setattr(runner, "_http_client", lambda **_kwargs: client)
monkeypatch.setattr(
huya_runner_goods,
"fetch_points_center_catalog",
lambda *_args, **_kwargs: SimpleNamespace(
goods=[
{
"product_id": "hy-9391246",
"name": "小狗蛇点点大礼包",
"price": 3960,
"remain_text": "2703",
}
],
message="已拉取 1 个礼包",
),
)
def fake_prepare(_client, **kwargs):
prepared_args.update(kwargs)
return exchange.PointsExchangeOutcome(
exchange.EXCHANGE_STATUS_EXCHANGED,
"兑换成功",
target={"name": "小狗蛇点点大礼包"},
order={"order_id": 101},
)
monkeypatch.setattr(huya_runner_goods, "prepare_exchange", fake_prepare)
monkeypatch.setattr(
runner,
"_mark_task",
lambda _db, _task, status, message, result=None: marks.append(
(status, message, result)
),
)
runner._execute_exchange_goods(
None,
SimpleNamespace(id=1),
HuyaAccount(uid="1199669301102", cookie="yyuid=1199669301102"),
{
"uid": 1199669301102,
"cookie": "yyuid=1199669301102",
},
{"room_pid": "1199650619883", "pay_channel": "Zfb"},
)
assert prepared_args["spu_id"] == "hy-9391246"
assert marks[-1][0] == "success"
assert marks[-1][2]["submitted_product_id"] == "hy-13649"
assert marks[-1][2]["resolved_product_id"] == "hy-9391246"