import json import unittest from types import SimpleNamespace from unittest.mock import Mock from core.douyu.activity_client import DouyuActivityClient, DouyuActivityError class XpdExchangeTests(unittest.TestCase): def setUp(self): self.client = DouyuActivityClient( 'acf_uid=100; acf_stk=stk; acf_ltkid=ltkid', ) def test_exchange_uses_fresh_embed_authorization_and_point_price(self): self.client._request = Mock(return_value=SimpleNamespace( text='var buyInfo={"ret":"0","msg":"ok","serial":"order-1","newBalance":88};', )) result = self.client.xpd_exchange_goods( embed_query={ 'gameId': 'cjm', 'actId': '46195', 'appId': 'bp_cf', 'livePlatId': 'douyu', 'code': 'fresh-code', 'timestamp': '123', 'v': '2.0', 'sig': 'fresh-signature', }, act_id='46195', rid='9263298', commodity_id='goods-1', price=1200, picture='https://cdn.example/item.jpg', pay_type=1, action_id='46195', ) self.assertEqual(result['serial'], 'order-1') self.assertEqual(result['new_balance'], 88) call = self.client._request.call_args self.assertEqual(call.args[:2], ('get', self.client.XPD_LIVE_BUY_API)) params = call.kwargs['params'] self.assertEqual(params['code'], 'fresh-code') self.assertEqual(params['sig'], 'fresh-signature') self.assertEqual(params['propid'], 'goods-1') self.assertEqual(params['paytype'], '1') self.assertEqual(json.loads(params['appext']), { 'user_price': 1200, 'sGoodsPic': 'https://cdn.example/item.jpg', 'paytype': 1, }) def test_exchange_surfaces_daoju_failure_message(self): self.client._request = Mock(return_value=SimpleNamespace( text='var buyInfo={"ret":"-1","msg":"点券不足"};', )) with self.assertRaisesRegex(DouyuActivityError, '点券不足'): self.client.xpd_exchange_goods( embed_query={'code': 'fresh-code'}, act_id='46195', rid='9263298', commodity_id='goods-1', price=1200, ) def test_list_goods_requests_and_preserves_inventory(self): self.client._request = Mock(return_value=SimpleNamespace( text=( 'var recommend={"data":{"client_data":{"itemsdetail":[{' '"iGoodsId":"goods-1","sGoodsName":"测试商品","iPrice":"6800",' '"iJb2Price":"0","iGoodsLeft":"0"}]}}};' ), )) result = self.client.xpd_list_goods( embed_query={}, act_id='46195', openid='openid', roleid='roleid', ) self.assertEqual(result['goods'][0]['price'], 6800) self.assertEqual(result['goods'][0]['goods_left'], 0) fields = self.client._request.call_args.kwargs['params']['fields'] self.assertIn('iGoodsLeft', fields.split(',')) if __name__ == '__main__': unittest.main()