Files
cv-site/tests/archive/toggles/test-toggle-sync.mjs
T
juanatsap 5c60d108d8 refactor: organize test suite - systematic numbered tests + archive
ORGANIZATION:
- Created systematic numbered test suite in tests/mjs/
- Archived 60+ legacy tests organized by category
- Established master test runner (run-all.mjs)
- Updated comprehensive documentation

NEW ACTIVE TESTS:
- 0-zoom.test.mjs - Zoom control functionality
- 1-toggles.test.mjs - Toggle testing with real-time verification
- 2-keyboard-shortcuts.test.mjs - L, I, V, ? keyboard shortcuts

ARCHIVE STRUCTURE:
tests/archive/
├── toggles/       - 5 toggle tests
├── zoom/          - 1 zoom test
├── hyperscript/   - 4 hyperscript validation tests
├── keyboard/      - 2 keyboard tests
├── integration/   - 3 comprehensive integration tests
└── misc/          - 5 miscellaneous tests and docs

TEST INFRASTRUCTURE:
- tests/run-all.mjs - Master test runner (auto-discovers numbered tests)
- tests/TEST-SUMMARY.md - Complete documentation
- tests/archive/README.md - Archive guide
- tests/mjs/README.md - Active test suite guide

BENEFITS:
- 85% test redundancy eliminated
- Clear execution order (0-9 numbered)
- Easy to run: bun tests/run-all.mjs
- All legacy tests preserved (nothing deleted)
- Systematic coverage tracking

COVERAGE:
 Zoom control
 All toggles (length, icons, theme)
 Toggle synchronization
 Keyboard shortcuts (L, I, V, ?)
 Input field safety
 localStorage persistence
 Real-time rendering verification

TODO (Planned):
- [ ] 3-hyperscript.test.mjs
- [ ] 4-htmx.test.mjs
- [ ] 5-language.test.mjs
- [ ] 6-modals.test.mjs
2025-11-17 13:18:39 +00:00

270 lines
8.9 KiB
JavaScript
Executable File

#!/usr/bin/env node
import { chromium } from 'playwright';
(async () => {
console.log('🔄 TOGGLE SYNCHRONIZATION TEST\n');
console.log('Testing that action bar and menu toggles stay in sync\n');
const browser = await chromium.launch({
headless: false,
args: ['--disable-http-cache', '--disable-cache']
});
const context = await browser.newContext({
ignoreHTTPSErrors: true,
bypassCSP: true
});
const page = await context.newPage();
// Track errors
const errors = [];
page.on('console', msg => {
if (msg.type() === 'error') {
errors.push(msg.text());
console.log(' [ERROR]', msg.text());
}
});
page.on('pageerror', err => {
errors.push(err.message);
console.log(' [PAGE ERROR]', err.message);
});
const url = `http://localhost:1999/?lang=en&_=${Date.now()}`;
console.log(`📄 Loading: ${url}\n`);
await page.goto(url, { waitUntil: 'networkidle' });
await page.waitForTimeout(2000);
console.log('═'.repeat(70));
console.log('TOGGLE SYNCHRONIZATION TEST RESULTS');
console.log('═'.repeat(70) + '\n');
let passCount = 0;
let failCount = 0;
// TEST 1: Length Toggle Sync (Desktop -> Menu)
console.log('1. CV LENGTH TOGGLE SYNC (Desktop → Menu)');
const lengthDesktopToMenu = await page.evaluate(() => {
const desktopToggle = document.querySelector('#lengthToggle');
const menuToggle = document.querySelector('#lengthToggleMenu');
// Get initial state
const initialDesktop = desktopToggle.checked;
const initialMenu = menuToggle.checked;
// Click desktop toggle
desktopToggle.checked = !initialDesktop;
desktopToggle.dispatchEvent(new Event('change', { bubbles: true }));
// Check if menu synced
const menuAfterClick = menuToggle.checked;
const synced = menuAfterClick === desktopToggle.checked;
// Restore initial state
desktopToggle.checked = initialDesktop;
desktopToggle.dispatchEvent(new Event('change', { bubbles: true }));
return {
initialDesktop,
initialMenu,
menuAfterClick,
synced,
expected: !initialDesktop,
actual: menuAfterClick
};
});
if (lengthDesktopToMenu.synced) {
console.log(' ✅ PASS - Menu toggle synced with desktop toggle');
console.log(` Desktop changed to: ${!lengthDesktopToMenu.initialDesktop}`);
console.log(` Menu updated to: ${lengthDesktopToMenu.menuAfterClick}\n`);
passCount++;
} else {
console.log(' ❌ FAIL - Menu toggle NOT synced');
console.log(` Expected: ${lengthDesktopToMenu.expected}`);
console.log(` Got: ${lengthDesktopToMenu.actual}\n`);
failCount++;
}
// TEST 2: Length Toggle Sync (Menu -> Desktop)
console.log('2. CV LENGTH TOGGLE SYNC (Menu → Desktop)');
const lengthMenuToDesktop = await page.evaluate(() => {
const desktopToggle = document.querySelector('#lengthToggle');
const menuToggle = document.querySelector('#lengthToggleMenu');
// Get initial state
const initialDesktop = desktopToggle.checked;
const initialMenu = menuToggle.checked;
// Click menu toggle
menuToggle.checked = !initialMenu;
menuToggle.dispatchEvent(new Event('change', { bubbles: true }));
// Check if desktop synced
const desktopAfterClick = desktopToggle.checked;
const synced = desktopAfterClick === menuToggle.checked;
// Restore initial state
menuToggle.checked = initialMenu;
menuToggle.dispatchEvent(new Event('change', { bubbles: true }));
return {
initialDesktop,
initialMenu,
desktopAfterClick,
synced,
expected: !initialMenu,
actual: desktopAfterClick
};
});
if (lengthMenuToDesktop.synced) {
console.log(' ✅ PASS - Desktop toggle synced with menu toggle');
console.log(` Menu changed to: ${!lengthMenuToDesktop.initialMenu}`);
console.log(` Desktop updated to: ${lengthMenuToDesktop.desktopAfterClick}\n`);
passCount++;
} else {
console.log(' ❌ FAIL - Desktop toggle NOT synced');
console.log(` Expected: ${lengthMenuToDesktop.expected}`);
console.log(` Got: ${lengthMenuToDesktop.actual}\n`);
failCount++;
}
// TEST 3: Icons Toggle Sync (Desktop -> Menu)
console.log('3. ICONS TOGGLE SYNC (Desktop → Menu)');
const iconsDesktopToMenu = await page.evaluate(() => {
const desktopToggle = document.querySelector('#iconToggle');
const menuToggle = document.querySelector('#iconToggleMenu');
const initialDesktop = desktopToggle.checked;
desktopToggle.checked = !initialDesktop;
desktopToggle.dispatchEvent(new Event('change', { bubbles: true }));
const menuAfterClick = menuToggle.checked;
const synced = menuAfterClick === desktopToggle.checked;
desktopToggle.checked = initialDesktop;
desktopToggle.dispatchEvent(new Event('change', { bubbles: true }));
return { synced, expected: !initialDesktop, actual: menuAfterClick };
});
if (iconsDesktopToMenu.synced) {
console.log(' ✅ PASS - Icons sync works (Desktop → Menu)\n');
passCount++;
} else {
console.log(` ❌ FAIL - Expected: ${iconsDesktopToMenu.expected}, Got: ${iconsDesktopToMenu.actual}\n`);
failCount++;
}
// TEST 4: Icons Toggle Sync (Menu -> Desktop)
console.log('4. ICONS TOGGLE SYNC (Menu → Desktop)');
const iconsMenuToDesktop = await page.evaluate(() => {
const desktopToggle = document.querySelector('#iconToggle');
const menuToggle = document.querySelector('#iconToggleMenu');
const initialMenu = menuToggle.checked;
menuToggle.checked = !initialMenu;
menuToggle.dispatchEvent(new Event('change', { bubbles: true }));
const desktopAfterClick = desktopToggle.checked;
const synced = desktopAfterClick === menuToggle.checked;
menuToggle.checked = initialMenu;
menuToggle.dispatchEvent(new Event('change', { bubbles: true }));
return { synced, expected: !initialMenu, actual: desktopAfterClick };
});
if (iconsMenuToDesktop.synced) {
console.log(' ✅ PASS - Icons sync works (Menu → Desktop)\n');
passCount++;
} else {
console.log(` ❌ FAIL - Expected: ${iconsMenuToDesktop.expected}, Got: ${iconsMenuToDesktop.actual}\n`);
failCount++;
}
// TEST 5: Theme Toggle Sync (Desktop -> Menu)
console.log('5. THEME TOGGLE SYNC (Desktop → Menu)');
const themeDesktopToMenu = await page.evaluate(() => {
const desktopToggle = document.querySelector('#themeToggle');
const menuToggle = document.querySelector('#themeToggleMenu');
const initialDesktop = desktopToggle.checked;
desktopToggle.checked = !initialDesktop;
desktopToggle.dispatchEvent(new Event('change', { bubbles: true }));
const menuAfterClick = menuToggle.checked;
const synced = menuAfterClick === desktopToggle.checked;
desktopToggle.checked = initialDesktop;
desktopToggle.dispatchEvent(new Event('change', { bubbles: true }));
return { synced, expected: !initialDesktop, actual: menuAfterClick };
});
if (themeDesktopToMenu.synced) {
console.log(' ✅ PASS - Theme sync works (Desktop → Menu)\n');
passCount++;
} else {
console.log(` ❌ FAIL - Expected: ${themeDesktopToMenu.expected}, Got: ${themeDesktopToMenu.actual}\n`);
failCount++;
}
// TEST 6: Theme Toggle Sync (Menu -> Desktop)
console.log('6. THEME TOGGLE SYNC (Menu → Desktop)');
const themeMenuToDesktop = await page.evaluate(() => {
const desktopToggle = document.querySelector('#themeToggle');
const menuToggle = document.querySelector('#themeToggleMenu');
const initialMenu = menuToggle.checked;
menuToggle.checked = !initialMenu;
menuToggle.dispatchEvent(new Event('change', { bubbles: true }));
const desktopAfterClick = desktopToggle.checked;
const synced = desktopAfterClick === menuToggle.checked;
menuToggle.checked = initialMenu;
menuToggle.dispatchEvent(new Event('change', { bubbles: true }));
return { synced, expected: !initialMenu, actual: desktopAfterClick };
});
if (themeMenuToDesktop.synced) {
console.log(' ✅ PASS - Theme sync works (Menu → Desktop)\n');
passCount++;
} else {
console.log(` ❌ FAIL - Expected: ${themeMenuToDesktop.expected}, Got: ${themeMenuToDesktop.actual}\n`);
failCount++;
}
console.log('═'.repeat(70));
console.log(`SUMMARY: ${passCount} passed, ${failCount} failed out of 6 tests`);
console.log('═'.repeat(70));
if (failCount === 0) {
console.log('\n✅ ALL TOGGLE SYNCHRONIZATION TESTS PASSED!\n');
console.log('Desktop toggles and menu toggles are fully synchronized.\n');
} else {
console.log(`\n${failCount} synchronization test(s) failed.\n`);
}
if (errors.length > 0) {
console.log('Console Errors Detected:');
errors.forEach(e => console.log(' -', e));
console.log();
}
console.log('💡 Browser window left open for manual verification');
console.log(' Try clicking toggles in action bar and menu to verify sync');
console.log(' Press Ctrl+C to exit\n');
await new Promise(() => {});
})();