Files
juzi/h5/test/splash-brand-browser.mjs
T

57 lines
3.2 KiB
JavaScript

// Read-only fixture: no accounts/reports created.
import assert from 'node:assert/strict';
import { execSync } from 'node:child_process';
import { pathToFileURL } from 'node:url';
const { chromium } = await import(pathToFileURL(execSync('npm root -g', { encoding:'utf8' }).trim() + '/playwright/index.mjs').href);
const browser = await chromium.launch();
try {
const page = await browser.newPage({ viewport:{ width:375, height:726 } });
await page.route('**/api/**', route => {
assert.equal(route.request().method(), 'GET');
return route.fulfill({ json:{ ok:true, user:null } });
});
await page.goto(process.env.H5_BASE_URL || 'http://127.0.0.1:8080/');
await page.click('[data-action="guest-experience"]');
await page.waitForSelector('#s-splash.active');
const brand = page.locator('#s-splash .splash-slogan');
assert.match(await brand.getAttribute('aria-label'), /^1'me/);
await page.waitForFunction(() => [...document.querySelectorAll('#s-splash .splash-slogan img')].every(i => i.complete && i.naturalWidth));
assert.equal(await page.locator('#s-splash .splash-slogan-brand').isVisible(), true);
assert.equal(await page.locator('#s-splash .splash-slogan-brand').textContent(), "1'me,");
assert.equal(await page.locator('#s-splash .splash-slogan-brand').evaluate(el => getComputedStyle(el).fontWeight), '400');
for (const root of ['#s-splash', '#p-photoguide']) {
assert.equal(await page.locator(root + ' .splash-slogan-brand').textContent(), "1'me,");
const fonts = await page.locator(root + ' .splash-slogan').evaluate(el => {
return ['.splash-slogan-brand', '.splash-slogan-english'].map(selector => {
const s = getComputedStyle(el.querySelector(selector));
return [s.fontFamily, s.fontSize, s.fontWeight, s.lineHeight];
});
});
assert.equal(fonts[0][0], fonts[1][0], root + ': same font family');
assert.equal(fonts[0][1], '28px', 'lowercase brand has optical size compensation');
assert.equal(fonts[1][1], '23px', 'English tagline remains unchanged');
assert.equal(fonts[0][2], '400');
assert.equal(fonts[1][2], '400');
assert.match(await page.locator(root + ' .splash-slogan').getAttribute('aria-label'), /^1'me/);
}
const button = page.locator('#s-splash [data-action="open-privacy"]');
await button.focus();
const style = await button.evaluate(el => {
const s = getComputedStyle(el);
return { border:s.borderTopWidth, outline:s.outlineStyle, shadow:s.boxShadow, background:s.backgroundColor };
});
assert.deepEqual(style, { border:'0px', outline:'none', shadow:'none', background:'rgb(245, 240, 120)' });
await button.evaluate(el => el.blur());
await page.waitForTimeout(400); // finish the entry screen fade before the screenshot
await page.screenshot({ path:'/tmp/juzi-splash-brand-20261013.png' });
await button.click();
await page.waitForSelector('#p-privacy.show');
await page.evaluate(() => {
document.querySelector('#p-privacy').classList.remove('show');
document.querySelector('#p-photoguide').classList.add('show');
});
await page.waitForTimeout(400);
await page.screenshot({ path:'/tmp/juzi-photoguide-brand-20261013.png' });
console.log('PASS splash brand, borderless focused start button, yellow fill, privacy entry');
} finally { await browser.close(); }