151 lines
7.0 KiB
JavaScript
151 lines
7.0 KiB
JavaScript
const { chromium } = require('playwright');
|
|
|
|
(async () => {
|
|
const browser = await chromium.launch({ headless: false, slowMo: 300 });
|
|
const context = await browser.newContext({
|
|
viewport: { width: 1920, height: 1080 }
|
|
});
|
|
const page = await context.newPage();
|
|
|
|
// Listen for console messages
|
|
page.on('console', msg => {
|
|
const text = msg.text();
|
|
const type = msg.type();
|
|
if (type === 'error' || text.toLowerCase().includes('error')) {
|
|
console.log('❌ CONSOLE ERROR:', text);
|
|
} else if (text.includes('Toggle sync')) {
|
|
console.log('📝', text);
|
|
}
|
|
});
|
|
page.on('pageerror', error => console.log('❌ PAGE EXCEPTION:', error.message));
|
|
|
|
console.log('📄 Loading page...\n');
|
|
await page.goto('http://localhost:1999/?lang=en');
|
|
await page.waitForLoadState('networkidle');
|
|
await page.waitForTimeout(1000);
|
|
|
|
// Clear localStorage to start fresh
|
|
console.log('🧹 Clearing localStorage...');
|
|
await page.evaluate(() => {
|
|
localStorage.removeItem('cv-theme');
|
|
localStorage.removeItem('cv-length');
|
|
localStorage.removeItem('cv-logos');
|
|
});
|
|
await page.reload();
|
|
await page.waitForLoadState('networkidle');
|
|
await page.waitForTimeout(500);
|
|
|
|
console.log('\n🎨 TEST 1: Theme toggle (hyperscript - should be instant)');
|
|
console.log(' Toggling theme ON...');
|
|
await page.locator('.selector-group').filter({ hasText: 'View' }).locator('label.icon-toggle').click();
|
|
await page.waitForTimeout(1000);
|
|
const themeApplied = await page.evaluate(() => document.body.classList.contains('theme-clean'));
|
|
console.log(` ✅ Theme clean: ${themeApplied}`);
|
|
|
|
console.log(' Toggling theme OFF...');
|
|
await page.locator('.selector-group').filter({ hasText: 'View' }).locator('label.icon-toggle').click();
|
|
await page.waitForTimeout(1000);
|
|
const themeRemoved = await page.evaluate(() => !document.body.classList.contains('theme-clean'));
|
|
console.log(` ✅ Theme default: ${themeRemoved}`);
|
|
|
|
console.log('\n📄 TEST 2: Length toggle (hyperscript - should be instant)');
|
|
console.log(' Toggling length to LONG...');
|
|
await page.locator('.selector-group').filter({ hasText: 'Length' }).locator('label.icon-toggle').click();
|
|
await page.waitForTimeout(1000);
|
|
const lengthLong = await page.evaluate(() => document.querySelector('.cv-paper').classList.contains('cv-long'));
|
|
console.log(` ✅ Length long: ${lengthLong}`);
|
|
|
|
console.log(' Toggling length to SHORT...');
|
|
await page.locator('.selector-group').filter({ hasText: 'Length' }).locator('label.icon-toggle').click();
|
|
await page.waitForTimeout(1000);
|
|
const lengthShort = await page.evaluate(() => document.querySelector('.cv-paper').classList.contains('cv-short'));
|
|
console.log(` ✅ Length short: ${lengthShort}`);
|
|
|
|
console.log('\n🖼️ TEST 3: Logo toggle (hyperscript - should be instant)');
|
|
console.log(' Toggling logos OFF...');
|
|
await page.locator('.selector-group').filter({ hasText: 'Logos' }).locator('label.icon-toggle').click();
|
|
await page.waitForTimeout(1000);
|
|
const logosOff = await page.evaluate(() => !document.querySelector('.cv-paper').classList.contains('show-logos'));
|
|
console.log(` ✅ Logos hidden: ${logosOff}`);
|
|
|
|
console.log(' Toggling logos ON...');
|
|
await page.locator('.selector-group').filter({ hasText: 'Logos' }).locator('label.icon-toggle').click();
|
|
await page.waitForTimeout(1000);
|
|
const logosOn = await page.evaluate(() => document.querySelector('.cv-paper').classList.contains('show-logos'));
|
|
console.log(` ✅ Logos visible: ${logosOn}`);
|
|
|
|
console.log('\n💾 TEST 4: localStorage persistence');
|
|
const storage = await page.evaluate(() => ({
|
|
theme: localStorage.getItem('cv-theme'),
|
|
length: localStorage.getItem('cv-length'),
|
|
logos: localStorage.getItem('cv-logos')
|
|
}));
|
|
console.log(` Theme: ${storage.theme}`);
|
|
console.log(` Length: ${storage.length}`);
|
|
console.log(` Logos: ${storage.logos}`);
|
|
console.log(` ✅ All preferences saved to localStorage`);
|
|
|
|
console.log('\n🔄 TEST 5: Refresh and verify preferences persist');
|
|
await page.reload();
|
|
await page.waitForLoadState('networkidle');
|
|
await page.waitForTimeout(500);
|
|
|
|
const afterRefresh = await page.evaluate(() => ({
|
|
themeClean: document.body.classList.contains('theme-clean'),
|
|
lengthShort: document.querySelector('.cv-paper').classList.contains('cv-short'),
|
|
showLogos: document.querySelector('.cv-paper').classList.contains('show-logos')
|
|
}));
|
|
console.log(` Theme clean: ${afterRefresh.themeClean}`);
|
|
console.log(` Length short: ${afterRefresh.lengthShort}`);
|
|
console.log(` Show logos: ${afterRefresh.showLogos}`);
|
|
console.log(` ✅ Preferences persisted after refresh`);
|
|
|
|
console.log('\n📱 TEST 6: Toggle sync between desktop and mobile');
|
|
console.log(' Setting desktop toggles...');
|
|
await page.locator('.selector-group').filter({ hasText: 'View' }).locator('label.icon-toggle').click();
|
|
await page.locator('.selector-group').filter({ hasText: 'Length' }).locator('label.icon-toggle').click();
|
|
await page.waitForTimeout(500);
|
|
|
|
console.log(' Resizing to mobile...');
|
|
await page.setViewportSize({ width: 600, height: 800 });
|
|
await page.waitForTimeout(500);
|
|
|
|
console.log(' Opening hamburger menu...');
|
|
await page.click('.hamburger-btn');
|
|
await page.waitForTimeout(500);
|
|
|
|
const mobileStates = await page.evaluate(() => ({
|
|
theme: document.getElementById('themeToggleMenu').checked,
|
|
length: document.getElementById('lengthToggleMenu').checked,
|
|
logo: document.getElementById('logoToggleMenu').checked
|
|
}));
|
|
console.log(` Mobile theme toggle: ${mobileStates.theme}`);
|
|
console.log(` Mobile length toggle: ${mobileStates.length}`);
|
|
console.log(` Mobile logo toggle: ${mobileStates.logo}`);
|
|
|
|
const desktopStates = await page.evaluate(() => ({
|
|
theme: document.getElementById('themeToggle').checked,
|
|
length: document.getElementById('lengthToggle').checked,
|
|
logo: document.getElementById('logoToggle').checked
|
|
}));
|
|
|
|
const synced = (
|
|
mobileStates.theme === desktopStates.theme &&
|
|
mobileStates.length === desktopStates.length &&
|
|
mobileStates.logo === desktopStates.logo
|
|
);
|
|
console.log(` ✅ Desktop and mobile are ${synced ? 'SYNCED' : 'OUT OF SYNC'}`);
|
|
|
|
console.log('\n✅ All tests complete!');
|
|
console.log('\n📊 SUMMARY:');
|
|
console.log(' - Theme toggle: Pure hyperscript (instant, no server call)');
|
|
console.log(' - Length toggle: Pure hyperscript (instant, no server call)');
|
|
console.log(' - Logo toggle: Pure hyperscript (instant, no server call)');
|
|
console.log(' - Persistence: localStorage (client-side)');
|
|
console.log(' - Sync: Bidirectional between desktop and mobile');
|
|
console.log(' - No HTMX swaps = No flickering = Smooth experience! 🎉');
|
|
|
|
await page.waitForTimeout(2000);
|
|
await browser.close();
|
|
})();
|