fix(h5): show raw skin age, support Harmony touch pickers and add WeChat logout

This commit is contained in:
xsl
2026-10-13 16:12:54 +08:00
parent 4e42e33994
commit e71368db6d
23 changed files with 1984 additions and 1325 deletions
+43
View File
@@ -72,6 +72,7 @@ try {
await page.click('[data-action="login-confirm"]');
assert.equal(await page.locator('#p-login-success.show').count(), 0);
assert.equal(await page.locator('#s-splash').evaluate(e => e.inert), false);
assert.equal(await page.locator('#s-splash [data-action="logout-wechat"]').isVisible(), true);
}
for (let device = 0; device < 2; device++) {
const context = await browser.newContext({ ignoreHTTPSErrors: true, userAgent: 'Mozilla/5.0 MicroMessenger/8.0', viewport: { width: 375, height: 726 } });
@@ -165,6 +166,48 @@ try {
assert.equal(await page.evaluate(() => AccountClient.user()), null);
assert.equal(await page.locator('#p-login-success.show').count(), 0, 'session restore must not repeatedly open a success dialog');
}
if (device === 1) {
const reportFile = path.join(root, 'accounts/reports', user.id, saved.id + '.json');
const originalBytes = fs.readFileSync(reportFile, 'utf8');
const logout = page.locator('#s-history [data-action="logout-wechat"]');
assert.equal(await logout.textContent(), '退出登录');
page.once('dialog', dialog => { assert(dialog.message().includes('历史报告将保留')); dialog.dismiss(); });
await logout.click();
assert.equal((await api(page, 'auth/session')).data.user.id, user.id, 'cancel leaves session intact');
await page.route('**/api/auth/logout', route => route.fulfill({ status: 503, json: { ok: false, message: '退出测试失败' } }));
page.once('dialog', dialog => dialog.accept()); await logout.click();
await page.waitForFunction(() => document.querySelector('#toast').textContent.includes('退出失败'));
assert.equal(await page.evaluate(() => AccountClient.user().id), user.id, 'failure does not fake local logout');
assert.equal((await api(page, 'auth/session')).data.user.id, user.id);
await page.unroute('**/api/auth/logout');
await page.waitForFunction(() => !document.querySelector('#s-history [data-action="logout-wechat"]').disabled);
let heldReport, markHeld;
const reportHeld = new Promise(resolve => { markHeld = resolve; });
await page.route('**/api/reports/' + saved.id, route => { heldReport = route; markHeld(); }, { times: 1 });
await page.click('[data-report-id="RwechatCrossDevice"]'); await reportHeld;
page.once('dialog', dialog => dialog.accept()); await logout.click();
await page.waitForSelector('#s-login.active');
assert.equal(await page.evaluate(() => AccountClient.user()), null);
assert.equal((await api(page, 'auth/session')).data.user, null);
assert.equal((await api(page, 'reports/' + saved.id)).status, 401);
assert.equal(await page.locator('#login-consent').isChecked(), false);
assert.equal(fs.readFileSync(reportFile, 'utf8'), originalBytes, 'logout retains exact historical file');
await page.goBack(); await page.waitForSelector('#s-login.active');
await page.click('[data-action="guest-experience"]'); await page.waitForSelector('#s-splash.active');
await page.click('[data-action="history"]'); await page.waitForSelector('#s-history.active');
await heldReport.fulfill({ json: { ok: true, report: JSON.parse(originalBytes) } });
await page.waitForTimeout(250);
assert.equal(await page.locator('#s-report.active').count(), 0, 'late WeChat report response cannot open under guest identity');
await page.unroute('**/api/reports/' + saved.id);
await page.click('[data-action="open-wechat-login"]');
await page.check('#login-consent'); await page.click('[data-action="login-wechat"]');
await page.waitForSelector('#s-splash.active'); await confirmLogin(page, 'wechat');
assert.equal(await page.evaluate(() => AccountClient.user().id), user.id);
await page.click('[data-action="history"]'); await page.waitForSelector('[data-report-id="RwechatCrossDevice"]');
assert.deepEqual((await api(page, 'reports/' + saved.id)).data.report, JSON.parse(originalBytes));
assert.equal(fs.readFileSync(reportFile, 'utf8'), originalBytes);
console.log('PASS WeChat logout: confirm/cancel/failure, server session revoked, back guarded, re-login retains exact report');
}
assert.deepEqual(errors, []);
await context.close();
}