#!/usr/bin/env bun /** * ZOOM FUNCTIONALITY TEST * ======================== * Tests zoom control visibility, interaction, and real-time updates */ import { chromium } from 'playwright'; const URL = "http://localhost:1999"; async function testZoom() { console.log('šŸ” ZOOM FUNCTIONALITY TEST\n'); console.log('='.repeat(70)); 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); }); console.log(`\n1ļøāƒ£ Loading: ${URL}\n`); await page.goto(URL, { waitUntil: 'networkidle' }); await page.waitForTimeout(2000); // TEST 1: Check zoom-control exists console.log('2ļøāƒ£ ZOOM CONTROL ELEMENTS:'); const elements = await page.evaluate(() => { return { zoomControl: !!document.querySelector('#zoom-control'), zoomSlider: !!document.querySelector('#zoom-slider'), zoomWrapper: !!document.querySelector('#zoom-wrapper'), zoomToggleButton: !!document.querySelector('#zoom-toggle-button') }; }); const allExist = Object.values(elements).every(v => v); console.log(` - Zoom control: ${elements.zoomControl ? 'āœ…' : 'āŒ'}`); console.log(` - Zoom slider: ${elements.zoomSlider ? 'āœ…' : 'āŒ'}`); console.log(` - Zoom wrapper: ${elements.zoomWrapper ? 'āœ…' : 'āŒ'}`); console.log(` - Zoom toggle button: ${elements.zoomToggleButton ? 'āœ…' : 'āŒ'}`); console.log(` ${allExist ? 'āœ… All elements present' : 'āŒ Some elements missing'}\n`); // TEST 2: Check if zoom control is visible console.log('3ļøāƒ£ ZOOM CONTROL VISIBILITY:'); const visibility = await page.evaluate(() => { const ctrl = document.querySelector('#zoom-control'); return { hasHiddenClass: ctrl?.classList.contains('zoom-hidden'), displayStyle: ctrl ? window.getComputedStyle(ctrl).display : 'N/A', visibilityStyle: ctrl ? window.getComputedStyle(ctrl).visibility : 'N/A' }; }); const isVisible = !visibility.hasHiddenClass && visibility.displayStyle !== 'none'; console.log(` - Has .zoom-hidden class: ${visibility.hasHiddenClass ? 'YES' : 'NO'}`); console.log(` - Display: ${visibility.displayStyle}`); console.log(` - Visibility: ${visibility.visibilityStyle}`); console.log(` ${isVisible ? 'āœ… Visible' : 'āš ļø Hidden (expected on load)'}\n`); // TEST 3: Show zoom control (click toggle button) console.log('4ļøāƒ£ SHOWING ZOOM CONTROL:'); await page.click('#zoom-toggle-button'); await page.waitForTimeout(500); const afterShow = await page.evaluate(() => { const ctrl = document.querySelector('#zoom-control'); return { hasHiddenClass: ctrl?.classList.contains('zoom-hidden'), displayStyle: ctrl ? window.getComputedStyle(ctrl).display : 'N/A' }; }); const isVisibleAfter = !afterShow.hasHiddenClass && afterShow.displayStyle !== 'none'; console.log(` - After clicking toggle:`); console.log(` - Has .zoom-hidden class: ${afterShow.hasHiddenClass ? 'YES' : 'NO'}`); console.log(` - Display: ${afterShow.displayStyle}`); console.log(` ${isVisibleAfter ? 'āœ… Now visible' : 'āŒ Still hidden - BUG!'}\n`); // TEST 4: Test zoom functionality console.log('5ļøāƒ£ ZOOM FUNCTIONALITY TEST:'); const zoomTest = await page.evaluate(() => { const slider = document.querySelector('#zoom-slider'); const wrapper = document.querySelector('#zoom-wrapper'); if (!slider || !wrapper) { return { error: 'Zoom elements not found' }; } // Get initial state const initialZoom = wrapper.style.zoom || window.getComputedStyle(wrapper).zoom || '1'; // Set zoom to 150% slider.value = '150'; slider.dispatchEvent(new Event('input', { bubbles: true })); // Wait for event to process const newZoom = wrapper.style.zoom || window.getComputedStyle(wrapper).zoom || '1'; // Reset to 100% slider.value = '100'; slider.dispatchEvent(new Event('input', { bubbles: true })); const resetZoom = wrapper.style.zoom || window.getComputedStyle(wrapper).zoom || '1'; return { initialZoom, zoomAt150: newZoom, zoomAfterReset: resetZoom, sliderValue: slider.value }; }); console.log(` - Initial zoom: ${zoomTest.initialZoom}`); console.log(` - Zoom after setting to 150%: ${zoomTest.zoomAt150}`); console.log(` - Zoom after reset to 100%: ${zoomTest.zoomAfterReset}`); console.log(` - Slider value: ${zoomTest.sliderValue}`); const zoomWorks = zoomTest.zoomAt150 !== '1' && zoomTest.zoomAt150 !== zoomTest.initialZoom; console.log(` ${zoomWorks ? 'āœ… Zoom changes value (WORKING)' : 'āŒ Zoom does not change (BROKEN)'}\n`); // SUMMARY console.log('='.repeat(70)); console.log('šŸ“Š TEST SUMMARY\n'); const allTestsPassed = allExist && isVisibleAfter && zoomWorks; console.log(` ${allExist ? 'āœ…' : 'āŒ'} All zoom elements present`); console.log(` ${isVisibleAfter ? 'āœ…' : 'āŒ'} Zoom control shows on toggle`); console.log(` ${zoomWorks ? 'āœ…' : 'āŒ'} Zoom functionality works`); console.log(` ${errors.length === 0 ? 'āœ…' : 'āŒ'} No console errors`); if (errors.length > 0) { console.log(`\n Errors found: ${errors.length}`); errors.forEach((err, i) => console.log(` ${i + 1}. ${err}`)); } console.log('\n' + '='.repeat(70)); if (allTestsPassed && errors.length === 0) { console.log('\nāœ… ALL ZOOM TESTS PASSED!'); } else { console.log('\nāŒ SOME ZOOM TESTS FAILED - See details above'); } console.log('\nšŸ’” Browser window left open for manual testing'); console.log(' Try moving the slider manually to verify'); console.log('\nPress Ctrl+C to exit\n'); await new Promise(() => {}); } await testZoom();