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) params = self.client._request.call_args.kwargs['params'] self.assertEqual(params['excludeFields'], 'iCategoryId_76') self.assertNotIn('category', params) def test_list_goods_fetches_every_page_and_deduplicates_goods(self): first_page = [ {'iGoodsId': f'goods-{index}', 'sGoodsName': f'商品 {index}'} for index in range(10) ] second_page = [ {'iGoodsId': 'goods-9', 'sGoodsName': '重复商品'}, {'iGoodsId': 'goods-10', 'sGoodsName': '商品 10'}, ] self.client._request = Mock(side_effect=[ SimpleNamespace(text=f'var recommend={{"errcode":0,"data":{{"client_data":{{"itemsdetail":{json.dumps(first_page)}}}}}}};'), SimpleNamespace(text=f'var recommend={{"errcode":0,"data":{{"client_data":{{"itemsdetail":{json.dumps(second_page)}}}}}}};'), ]) result = self.client.xpd_list_goods( embed_query={}, act_id='46195', openid='openid', roleid='roleid', ) self.assertEqual(len(result['goods']), 11) self.assertEqual([item['commodity_id'] for item in result['goods']][-1], 'goods-10') self.assertEqual(self.client._request.call_count, 2) first_params = self.client._request.call_args_list[0].kwargs['params'] second_params = self.client._request.call_args_list[1].kwargs['params'] self.assertEqual((first_params['page_begin'], first_params['page_num']), ('0', '1')) self.assertEqual((second_params['page_begin'], second_params['page_num']), ('10', '2')) if __name__ == '__main__': unittest.main()