fix(qdreader): align tasks with upstream flow

This commit is contained in:
2026-05-22 18:09:14 +08:00
parent 25d3f2c73b
commit eaae089589
3 changed files with 131 additions and 109 deletions
+63 -45
View File
@@ -88,7 +88,7 @@ test('README documents QDReader task schedule windows and required endpoints', (
'receivegifts',
'mainPage',
'finishWatch',
'packagelist',
'mainPage',
'lottery',
'checkinexchangepage',
'exchangegoods',
@@ -397,7 +397,6 @@ test('optional QDReader full tasks use upstream executable endpoints and sign ab
qdreader_user_bind_json: JSON.stringify({ '12345': 'user-a' }),
qdreader_task_pref_json: JSON.stringify({ '12345': { adv: true, extraAdv: true, lottery: true, weeklyExchange: true, chapterCard: true, messageBox: true } }),
};
const originalDate = Date;
const sunday = fixedDateClass('2026-05-24T20:01:00.000+08:00');
const r = runPlugin({
content: '启点签到',
@@ -410,13 +409,25 @@ test('optional QDReader full tasks use upstream executable endpoints and sign ab
(req) => String(req.url).includes('/sign') ? { body: { code: 0, data: { headers: { 'QD-Sign': 'sig' } } } } : { statusCode: 200, body: { code: 0, msg: 'ok' } },
{ statusCode: 200, body: { code: 0, msg: '奖励完成' } },
(req) => String(req.url).includes('/sign') ? { body: { code: 0, data: { headers: { 'QD-Sign': 'sig' } } } } : { statusCode: 200, body: { code: 0, msg: 'ok' } },
{ statusCode: 200, body: { code: 0, Data: { VideoRewardTab: { TaskList: [{ TaskId: 'adv-1', IsFinished: 0 }] } } } },
{ statusCode: 200, body: { code: 0, Data: { DailyBenefitModule: { TaskList: [{ TaskId: 'adv-1', Title: '激励碎片', IsFinished: 0 }] } } } },
(req) => String(req.url).includes('/sign') ? { body: { code: 0, data: { headers: { 'QD-Sign': 'sig' } } } } : { statusCode: 200, body: { code: 0, msg: 'ok' } },
{ statusCode: 200, body: { code: 0, msg: '视频完成' } },
(req) => String(req.url).includes('/sign') ? { body: { code: 0, data: { headers: { 'QD-Sign': 'sig' } } } } : { statusCode: 200, body: { code: 0, msg: 'ok' } },
{ statusCode: 200, body: { code: 0, Data: { VideoRewardTab: { TaskList: [{ TaskId: 'adv-1', IsFinished: 1 }] } } } },
{ statusCode: 200, body: { code: 0, Data: { DailyBenefitModule: { TaskList: [{ TaskId: 'adv-1', Title: '激励碎片', IsFinished: 1 }] } } } },
(req) => String(req.url).includes('/sign') ? { body: { code: 0, data: { headers: { 'QD-Sign': 'sig' } } } } : { statusCode: 200, body: { code: 0, msg: 'ok' } },
{ statusCode: 200, body: { code: 0, Data: { TaskList: [{ TaskId: 'daily-1', TaskName: '每日任务', IsFinished: 1, NeedWatchCount: 1 }] } } },
{ statusCode: 200, body: { code: 0, Data: { SurpriseBenefit: { TaskId: 'surprise-1', IsFinished: 0 }, VideoRewardTab: { TaskList: [{ TaskId: 'one-ad', Title: '完成1个广告任务得奖励', IsReceived: 0 }, { TaskId: 'daily-3', Title: '完成3个广告任务得奖励', IsReceived: 0 }] } } } },
(req) => String(req.url).includes('/sign') ? { body: { code: 0, data: { headers: { 'QD-Sign': 'sig' } } } } : { statusCode: 200, body: { code: 0, msg: 'ok' } },
{ statusCode: 200, body: { code: 0, msg: '惊喜福利完成' } },
(req) => String(req.url).includes('/sign') ? { body: { code: 0, data: { headers: { 'QD-Sign': 'sig' } } } } : { statusCode: 200, body: { code: 0, msg: 'ok' } },
{ statusCode: 200, body: { code: 0, msg: '一个广告完成' } },
(req) => String(req.url).includes('/sign') ? { body: { code: 0, data: { headers: { 'QD-Sign': 'sig' } } } } : { statusCode: 200, body: { code: 0, msg: 'ok' } },
{ statusCode: 200, body: { code: 0, msg: '每日广告1完成' } },
(req) => String(req.url).includes('/sign') ? { body: { code: 0, data: { headers: { 'QD-Sign': 'sig' } } } } : { statusCode: 200, body: { code: 0, msg: 'ok' } },
{ statusCode: 200, body: { code: 0, msg: '每日广告2完成' } },
(req) => String(req.url).includes('/sign') ? { body: { code: 0, data: { headers: { 'QD-Sign': 'sig' } } } } : { statusCode: 200, body: { code: 0, msg: 'ok' } },
{ statusCode: 200, body: { code: 0, msg: '每日广告3完成' } },
(req) => String(req.url).includes('/sign') ? { body: { code: 0, data: { headers: { 'QD-Sign': 'sig' } } } } : { statusCode: 200, body: { code: 0, msg: 'ok' } },
{ statusCode: 200, body: { code: 0, Data: { VideoRewardTab: { TaskList: [{ TaskId: 'daily-3', Title: '完成3个广告任务得奖励', IsReceived: 1 }] } } } },
(req) => String(req.url).includes('/sign') ? { body: { code: 0, data: { headers: { 'QD-Sign': 'sig' } } } } : { statusCode: 200, body: { code: 0, msg: 'ok' } },
{ statusCode: 200, body: { code: 0, Data: { HasVideoUrge: 0, LotteryCount: 1 } } },
(req) => String(req.url).includes('/sign') ? { body: { code: 0, data: { headers: { 'QD-Sign': 'sig' } } } } : { statusCode: 200, body: { code: 0, msg: 'ok' } },
@@ -435,7 +446,7 @@ test('optional QDReader full tasks use upstream executable endpoints and sign ab
assert.ok(urls.some(u => /argus\/api\/v3\/checkin\/receivegifts$/.test(u)));
assert.ok(urls.some(u => /argus\/api\/v2\/video\/adv\/mainPage$/.test(u)));
assert.ok(urls.some(u => /argus\/api\/v1\/video\/adv\/finishWatch$/.test(u)));
assert.ok(urls.some(u => /argus\/api\/v3\/checkin\/packagelist$/.test(u)));
assert.ok(!urls.some(u => /argus\/api\/v3\/checkin\/packagelist$/.test(u)));
assert.ok(urls.some(u => /argus\/api\/v2\/checkin\/detail$/.test(u)));
assert.ok(urls.some(u => /argus\/api\/v2\/checkin\/lottery$/.test(u)));
assert.ok(urls.some(u => /argus\/api\/v3\/checkin\/checkinexchangepage$/.test(u)));
@@ -444,6 +455,10 @@ test('optional QDReader full tasks use upstream executable endpoints and sign ab
assert.ok(urls.some(u => /^https:\/\/magev6\.if\.qidian\.com\/argus\/api\/v2\/message\/pullmessage/.test(u)));
const signed = r.calls.filter(c => /api\.120399\.xyz\/qdreader\/sign$/.test(c.url)).map(c => JSON.parse(c.body).url);
assert.ok(signed.includes('https://magev6.if.qidian.com/argus/api/v2/message/pullmessage'));
const finishCalls = r.calls.filter(c => /argus\/api\/v1\/video\/adv\/finishWatch$/.test(c.url));
assert.equal(finishCalls.length, 6);
assert.deepEqual(finishCalls.map(c => new URLSearchParams(c.body).get('taskId')), ['adv-1', 'surprise-1', 'one-ad', 'daily-3', 'daily-3', 'daily-3']);
assert.match(r.replies[0], /激励任务✅/);
assert.match(r.replies[0], /每日任务✅/);
assert.match(r.replies[0], /每日抽奖✅/);
@@ -825,14 +840,14 @@ test('adv task treats upstream result 9 as accepted and verifies finished state'
{ body: { code: 0, data: { headers: { 'QD-Sign': 'sig' } } } },
{ statusCode: 200, body: { code: 1, msg: '无可领取礼包' } },
{ body: { code: 0, data: { headers: { 'QD-Sign': 'sig' } } } },
{ statusCode: 200, body: { code: 0, Data: { VideoRewardTab: { TaskList: [{ TaskId: 'old-done', Title: '已完成旧任务', IsFinished: 1 }, { TaskId: '1165585369246138372', Title: '看视频领福利', IsFinished: 0 }] } } } },
{ statusCode: 200, body: { code: 0, Data: { DailyBenefitModule: { TaskList: [{ TaskId: 'old-done', Title: '已完成旧任务', IsFinished: 1 }, { TaskId: '1165585369246138372', Title: '看视频领福利', IsFinished: 0 }] } } } },
{ body: { code: 0, data: { headers: { 'QD-Sign': 'sig' } } } },
{ statusCode: 200, body: { result: 9, message: '' } },
{ body: { code: 0, data: { headers: { 'QD-Sign': 'sig' } } } },
{ statusCode: 200, body: { code: 0, Data: { VideoRewardTab: { TaskList: [{ TaskId: 'old-done', Title: '已完成旧任务', IsFinished: 1 }, { TaskId: '1165585369246138372', Title: '看视频领福利', IsFinished: 1 }] } } } },
{ statusCode: 200, body: { code: 0, Data: { DailyBenefitModule: { TaskList: [{ TaskId: 'old-done', Title: '已完成旧任务', IsFinished: 1 }, { TaskId: '1165585369246138372', Title: '看视频领福利', IsFinished: 1 }] } } } },
],
});
assert.match(r.replies[0], /激励任务✅\(已完成\)/);
assert.match(r.replies[0], /激励任务✅\(任务已完成\)/);
assert.match(r.replies[0], /汇总:成功 1 \/ 失败 0 \/ 总计 1/);
assert.equal(r.calls.filter(c => /video\/adv\/finishWatch$/.test(c.url)).length, 1);
assert.match(r.calls.find(c => /video\/adv\/finishWatch$/.test(c.url)).body, /1165585369246138372/);
@@ -854,18 +869,18 @@ test('adv task does not report success when only unrelated task is finished afte
{ body: { code: 0, data: { headers: { 'QD-Sign': 'sig' } } } },
{ statusCode: 200, body: { code: 1, msg: '无可领取礼包' } },
{ body: { code: 0, data: { headers: { 'QD-Sign': 'sig' } } } },
{ statusCode: 200, body: { code: 0, Data: { VideoRewardTab: { TaskList: [{ TaskId: 'old-done', Title: '已完成旧任务', IsFinished: 1 }, { TaskId: '1165585369246138372', Title: '看视频领福利', IsFinished: 0 }] } } } },
{ statusCode: 200, body: { code: 0, Data: { DailyBenefitModule: { TaskList: [{ TaskId: 'old-done', Title: '已完成旧任务', IsFinished: 1 }, { TaskId: '1165585369246138372', Title: '看视频领福利', IsFinished: 0 }] } } } },
{ body: { code: 0, data: { headers: { 'QD-Sign': 'sig' } } } },
{ statusCode: 200, body: { result: 9, message: '' } },
{ body: { code: 0, data: { headers: { 'QD-Sign': 'sig' } } } },
{ statusCode: 200, body: { code: 0, Data: { VideoRewardTab: { TaskList: [{ TaskId: 'old-done', Title: '已完成旧任务', IsFinished: 1 }, { TaskId: '1165585369246138372', Title: '看视频领福利', IsFinished: 0 }] } } } },
{ statusCode: 200, body: { code: 0, Data: { DailyBenefitModule: { TaskList: [{ TaskId: 'old-done', Title: '已完成旧任务', IsFinished: 1 }, { TaskId: '1165585369246138372', Title: '看视频领福利', IsFinished: 0 }] } } } },
],
});
assert.match(r.replies[0], /激励任务❌\(任务未完成\)/);
assert.match(r.replies[0], /激励任务❌\(部分任务未完成\)/);
assert.match(r.replies[0], /汇总:成功 0 \/ 失败 1 \/ 总计 1/);
});
test('adv task follows upstream final-item completion instead of submitted-id inference', () => {
test('adv task requires every upstream DailyBenefitModule entry finished after callbacks', () => {
const store = {
qdreader_cookie_json: JSON.stringify({ '12345': cookie }),
qdreader_user_bind_json: JSON.stringify({ '12345': 'user-a' }),
@@ -881,7 +896,7 @@ test('adv task follows upstream final-item completion instead of submitted-id in
{ body: { code: 0, data: { headers: { 'QD-Sign': 'sig' } } } },
{ statusCode: 200, body: { code: 1, msg: '无可领取礼包' } },
{ body: { code: 0, data: { headers: { 'QD-Sign': 'sig' } } } },
{ statusCode: 200, body: { code: 0, Data: { VideoRewardTab: { TaskList: [
{ statusCode: 200, body: { code: 0, Data: { DailyBenefitModule: { TaskList: [
{ TaskId: 'target-a', Title: '看视频领福利A', IsFinished: 0 },
{ TaskId: 'target-b', Title: '看视频领福利B', IsFinished: 0 },
{ TaskId: '1165585369246138370', Title: '每日签到', IsFinished: 0 },
@@ -893,15 +908,15 @@ test('adv task follows upstream final-item completion instead of submitted-id in
{ body: { code: 0, data: { headers: { 'QD-Sign': 'sig' } } } },
{ statusCode: 200, body: { result: 9, message: '' } },
{ body: { code: 0, data: { headers: { 'QD-Sign': 'sig' } } } },
{ statusCode: 200, body: { code: 0, Data: { VideoRewardTab: { TaskList: [
{ statusCode: 200, body: { code: 0, Data: { DailyBenefitModule: { TaskList: [
{ TaskId: 'target-a', Title: '看视频领福利A', IsFinished: 0 },
{ TaskId: 'target-b', Title: '看视频领福利B', IsFinished: 0 },
{ TaskId: '1165585369246138370', Title: '每日签到', IsFinished: 1 },
] } } } },
],
});
assert.match(r.replies[0], /激励任务\(完成\)/);
assert.match(r.replies[0], /汇总:成功 1 \/ 失败 0 \/ 总计 1/);
assert.match(r.replies[0], /激励任务\(部分任务未完成\)/);
assert.match(r.replies[0], /汇总:成功 0 \/ 失败 1 \/ 总计 1/);
});
test('adv task iterates every unfinished upstream entry without local non-ad filtering', () => {
@@ -920,20 +935,22 @@ test('adv task iterates every unfinished upstream entry without local non-ad fil
{ body: { code: 0, data: { headers: { 'QD-Sign': 'sig' } } } },
{ statusCode: 200, body: { code: 1, msg: '无可领取礼包' } },
{ body: { code: 0, data: { headers: { 'QD-Sign': 'sig' } } } },
{ statusCode: 200, body: { code: 0, Data: { VideoRewardTab: { TaskList: [
{ statusCode: 200, body: { code: 0, Data: { DailyBenefitModule: { TaskList: [
{ TaskId: '1165585369246138372', Title: '看视频领福利', IsFinished: 0 },
{ TaskId: '1165585369246138370', Title: '每日签到', IsFinished: 0 }
] } } } },
{ body: { code: 0, data: { headers: { 'QD-Sign': 'sig' } } } },
{ statusCode: 200, body: { result: 9, message: '' } },
{ body: { code: 0, data: { headers: { 'QD-Sign': 'sig' } } } },
{ statusCode: 200, body: { code: 0, Data: { VideoRewardTab: { TaskList: [
{ statusCode: 200, body: { result: 9, message: '' } },
{ body: { code: 0, data: { headers: { 'QD-Sign': 'sig' } } } },
{ statusCode: 200, body: { code: 0, Data: { DailyBenefitModule: { TaskList: [
{ TaskId: '1165585369246138372', Title: '看视频领福利', IsFinished: 1 },
{ TaskId: '1165585369246138370', Title: '每日签到', IsFinished: 0 }
{ TaskId: '1165585369246138370', Title: '每日签到', IsFinished: 1 }
] } } } },
],
});
assert.match(r.replies[0], /激励任务\(任务完成\)/);
assert.match(r.replies[0], /激励任务\(任务完成\)/);
assert.equal(r.calls.filter(c => /video\/adv\/finishWatch$/.test(c.url)).length, 2);
assert.ok(r.calls.some(c => /video\/adv\/finishWatch$/.test(c.url) && /1165585369246138370/.test(c.body)));
});
@@ -954,14 +971,14 @@ test('adv task accepts nested data result 9 with empty message from sign gateway
{ body: { code: 0, data: { headers: { 'QD-Sign': 'sig' } } } },
{ statusCode: 200, body: { code: 1, msg: '无可领取礼包' } },
{ body: { code: 0, data: { headers: { 'QD-Sign': 'sig' } } } },
{ statusCode: 200, body: { code: 0, Data: { VideoRewardTab: { TaskList: [{ TaskId: '1165585369246138372', Title: '看视频领福利', IsFinished: 0 }] } } } },
{ statusCode: 200, body: { code: 0, Data: { DailyBenefitModule: { TaskList: [{ TaskId: '1165585369246138372', Title: '看视频领福利', IsFinished: 0 }] } } } },
{ body: { code: 0, data: { headers: { 'QD-Sign': 'sig' } } } },
{ statusCode: 200, body: { code: 200, data: { result: 9, message: '' } } },
{ body: { code: 0, data: { headers: { 'QD-Sign': 'sig' } } } },
{ statusCode: 200, body: { code: 0, Data: { VideoRewardTab: { TaskList: [{ TaskId: '1165585369246138372', Title: '看视频领福利', IsFinished: 1 }] } } } },
{ statusCode: 200, body: { code: 0, Data: { DailyBenefitModule: { TaskList: [{ TaskId: '1165585369246138372', Title: '看视频领福利', IsFinished: 1 }] } } } },
],
});
assert.match(r.replies[0], /激励任务✅\(已完成\)/);
assert.match(r.replies[0], /激励任务✅\(任务已完成\)/);
assert.doesNotMatch(r.replies[0], /任务 1165585369246138372 失败/);
});
@@ -984,11 +1001,11 @@ test('finishWatch payload matches upstream lowercase taskId and full captcha fie
{ body: { code: 0, data: { headers: { 'QD-Sign': 'sig' } } } },
{ statusCode: 200, body: { code: 1, msg: '无可领取礼包' } },
{ body: { code: 0, data: { headers: { 'QD-Sign': 'sig' } } } },
{ statusCode: 200, body: { code: 0, Data: { VideoRewardTab: { TaskList: [{ TaskId: '1187767793786748928', Title: '激励碎片', IsFinished: 0 }] } } } },
{ statusCode: 200, body: { code: 0, Data: { DailyBenefitModule: { TaskList: [{ TaskId: '1187767793786748928', Title: '激励碎片', IsFinished: 0 }] } } } },
{ body: { code: 0, data: { headers: { 'QD-Sign': 'sig' } } } },
{ statusCode: 200, body: { result: 9, message: '' } },
{ body: { code: 0, data: { headers: { 'QD-Sign': 'sig' } } } },
{ statusCode: 200, body: { code: 0, Data: { VideoRewardTab: { TaskList: [{ TaskId: '1187767793786748928', Title: '激励碎片', IsFinished: 1 }] } } } },
{ statusCode: 200, body: { code: 0, Data: { DailyBenefitModule: { TaskList: [{ TaskId: '1187767793786748928', Title: '激励碎片', IsFinished: 1 }] } } } },
],
});
const finishCall = r.calls.find(c => /video\/adv\/finishWatch$/.test(c.url));
@@ -1013,20 +1030,20 @@ test('adv task submits each unfinished upstream list item once before verificati
{ body: { code: 0, data: { headers: { 'QD-Sign': 'sig' } } } },
{ statusCode: 200, body: { code: 1, msg: '无可领取礼包' } },
{ body: { code: 0, data: { headers: { 'QD-Sign': 'sig' } } } },
{ statusCode: 200, body: { code: 0, Data: { VideoRewardTab: { TaskList: [{ TaskId: '1187767793786748928', Title: '激励碎片', IsFinished: 0, NeedCount: 3 }] } } } },
{ statusCode: 200, body: { code: 0, Data: { DailyBenefitModule: { TaskList: [{ TaskId: '1187767793786748928', Title: '激励碎片', IsFinished: 0, NeedCount: 3 }] } } } },
{ body: { code: 0, data: { headers: { 'QD-Sign': 'sig' } } } },
{ statusCode: 200, body: { result: 9, message: '' } },
{ body: { code: 0, data: { headers: { 'QD-Sign': 'sig' } } } },
{ statusCode: 200, body: { code: 0, Data: { VideoRewardTab: { TaskList: [{ TaskId: '1187767793786748928', Title: '激励碎片', IsFinished: 1, NeedCount: 3 }] } } } },
{ statusCode: 200, body: { code: 0, Data: { DailyBenefitModule: { TaskList: [{ TaskId: '1187767793786748928', Title: '激励碎片', IsFinished: 1, NeedCount: 3 }] } } } },
],
});
assert.match(r.replies[0], /激励任务✅\(已完成\)/);
assert.match(r.replies[0], /激励任务✅\(任务已完成\)/);
const finishCalls = r.calls.filter(c => /video\/adv\/finishWatch$/.test(c.url));
assert.equal(finishCalls.length, 1);
assert.ok(finishCalls.every(c => /1187767793786748928/.test(c.body)));
});
test('adv task follows upstream completion when final list item is finished after callbacks', () => {
test('adv task follows upstream completion when every upstream list item is finished after callbacks', () => {
const store = {
qdreader_cookie_json: JSON.stringify({ '12345': cookie }),
qdreader_user_bind_json: JSON.stringify({ '12345': 'user-a' }),
@@ -1042,7 +1059,7 @@ test('adv task follows upstream completion when final list item is finished afte
{ body: { code: 0, data: { headers: { 'QD-Sign': 'sig' } } } },
{ statusCode: 200, body: { code: 1, msg: '无可领取礼包' } },
{ body: { code: 0, data: { headers: { 'QD-Sign': 'sig' } } } },
{ statusCode: 200, body: { code: 0, Data: { VideoRewardTab: { TaskList: [
{ statusCode: 200, body: { code: 0, Data: { DailyBenefitModule: { TaskList: [
{ TaskId: 'target-a', Title: '看视频领福利A', IsFinished: 0 },
{ TaskId: 'target-b', Title: '看视频领福利B', IsFinished: 0 },
{ TaskId: '1165585369246138370', Title: '每日签到', IsFinished: 0 },
@@ -1054,14 +1071,14 @@ test('adv task follows upstream completion when final list item is finished afte
{ body: { code: 0, data: { headers: { 'QD-Sign': 'sig' } } } },
{ statusCode: 200, body: { result: 9, message: '' } },
{ body: { code: 0, data: { headers: { 'QD-Sign': 'sig' } } } },
{ statusCode: 200, body: { code: 0, Data: { VideoRewardTab: { TaskList: [
{ TaskId: 'target-a', Title: '看视频领福利A', IsFinished: 0 },
{ TaskId: 'target-b', Title: '看视频领福利B', IsFinished: 0 },
{ statusCode: 200, body: { code: 0, Data: { DailyBenefitModule: { TaskList: [
{ TaskId: 'target-a', Title: '看视频领福利A', IsFinished: 1 },
{ TaskId: 'target-b', Title: '看视频领福利B', IsFinished: 1 },
{ TaskId: '1165585369246138370', Title: '每日签到', IsFinished: 1 },
] } } } },
],
});
assert.match(r.replies[0], /激励任务✅\(已完成\)/);
assert.match(r.replies[0], /激励任务✅\(任务已完成\)/);
assert.match(r.replies[0], /汇总:成功 1 \/ 失败 0 \/ 总计 1/);
assert.equal(r.calls.filter(c => /video\/adv\/finishWatch$/.test(c.url)).length, 3);
});
@@ -1082,14 +1099,14 @@ test('adv task ignores count metadata and submits each unfinished upstream task
{ body: { code: 0, data: { headers: { 'QD-Sign': 'sig' } } } },
{ statusCode: 200, body: { code: 1, msg: '无可领取礼包' } },
{ body: { code: 0, data: { headers: { 'QD-Sign': 'sig' } } } },
{ statusCode: 200, body: { code: 0, Data: { VideoRewardTab: { TaskList: [{ TaskId: 'partial-task', Title: '看视频领福利', IsFinished: 0, Count: 1, NeedCount: 3 }] } } } },
{ statusCode: 200, body: { code: 0, Data: { DailyBenefitModule: { TaskList: [{ TaskId: 'partial-task', Title: '看视频领福利', IsFinished: 0, Count: 1, NeedCount: 3 }] } } } },
{ body: { code: 0, data: { headers: { 'QD-Sign': 'sig' } } } },
{ statusCode: 200, body: { result: 9, message: '' } },
{ body: { code: 0, data: { headers: { 'QD-Sign': 'sig' } } } },
{ statusCode: 200, body: { code: 0, Data: { VideoRewardTab: { TaskList: [{ TaskId: 'partial-task', Title: '看视频领福利', IsFinished: 1, Count: 3, NeedCount: 3 }] } } } },
{ statusCode: 200, body: { code: 0, Data: { DailyBenefitModule: { TaskList: [{ TaskId: 'partial-task', Title: '看视频领福利', IsFinished: 1, Count: 3, NeedCount: 3 }] } } } },
],
});
assert.match(r.replies[0], /激励任务✅\(已完成\)/);
assert.match(r.replies[0], /激励任务✅\(任务已完成\)/);
const finishCalls = r.calls.filter(c => /video\/adv\/finishWatch$/.test(c.url));
assert.equal(finishCalls.length, 1);
assert.ok(finishCalls.every(c => /partial-task/.test(c.body)));
@@ -1112,10 +1129,10 @@ test('daily task follows upstream sequence: surprise task, one-ad task, then thr
{ statusCode: 200, body: { code: 1, msg: '无可领取礼包' } },
{ body: { code: 0, data: { headers: { 'QD-Sign': 'sig' } } } },
{ statusCode: 200, body: { code: 0, Data: {
CurrentTask: { TaskId: '1209756598013788162', Title: '惊喜福利任务', IsFinished: 0 },
PackageList: { TaskList: [
{ TaskId: '1165585369246138373', Title: '完成1个广告任务', IsFinished: 0 },
{ TaskId: '1165585369246138372', Title: '每日任务', IsFinished: 0, NeedCount: 3 },
SurpriseBenefit: { TaskId: '1209756598013788162', Title: '惊喜福利任务', IsFinished: 0 },
VideoRewardTab: { TaskList: [
{ TaskId: '1165585369246138373', Title: '完成1个广告任务得奖励', IsReceived: 0 },
{ TaskId: '1165585369246138372', Title: '完成3个广告任务得奖励', IsReceived: 0 },
] }
} } },
{ body: { code: 0, data: { headers: { 'QD-Sign': 'sig' } } } },
@@ -1130,12 +1147,12 @@ test('daily task follows upstream sequence: surprise task, one-ad task, then thr
{ statusCode: 200, body: { result: 9, message: '' } },
{ body: { code: 0, data: { headers: { 'QD-Sign': 'sig' } } } },
{ statusCode: 200, body: { code: 0, Data: { VideoRewardTab: { TaskList: [
{ TaskId: '1165585369246138373', Title: '完成1个广告任务', IsFinished: 1 },
{ TaskId: '1165585369246138372', Title: '每日任务', IsFinished: 1, NeedCount: 3 },
{ TaskId: '1165585369246138373', Title: '完成1个广告任务得奖励', IsReceived: 1 },
{ TaskId: '1165585369246138372', Title: '完成3个广告任务得奖励', IsReceived: 1 },
] } } } },
],
});
assert.match(r.replies[0], /每日任务✅\(已完成\)/);
assert.match(r.replies[0], /每日任务✅\(任务已完成\)/);
const bodies = r.calls.filter(c => /video\/adv\/finishWatch$/.test(c.url)).map(c => c.body);
assert.equal(bodies.length, 5);
assert.match(bodies[0], /1209756598013788162/);
@@ -1234,3 +1251,4 @@ test('stream uid message token matches upstream operator precedence and avoids p
assert.equal(JSON.parse(firstMessageSign.body).data.token, '24QAcr');
assert.notEqual(JSON.parse(firstMessageSign.body).data.token, '1903903219');
});