← back to Dear Bubbe Nextjs

archived/tests/test-pause-resume.js

159 lines

#!/usr/bin/env node

/**
 * Test script for pause/resume voice controls
 * Tests that the new pause/resume functionality is working correctly
 */

const puppeteer = require('puppeteer');

async function testPauseResume() {
  console.log('🎯 Starting Pause/Resume Voice Controls Test...\n');
  
  let browser;
  try {
    // Launch browser
    browser = await puppeteer.launch({
      headless: 'new',
      args: [
        '--no-sandbox',
        '--disable-setuid-sandbox',
        '--disable-web-security',
        '--disable-features=IsolateOrigins,site-per-process'
      ]
    });

    const page = await browser.newPage();
    
    // Set viewport for mobile testing
    await page.setViewport({ width: 390, height: 844 }); // iPhone 14 Pro
    
    console.log('📱 Testing on mobile viewport (390x844)...');
    
    // Navigate to the site
    const url = 'http://localhost:3011';
    console.log(`\n🌐 Navigating to ${url}...`);
    await page.goto(url, { waitUntil: 'networkidle2' });
    
    // Wait for the page to fully load
    await page.waitForTimeout(2000);
    
    // Check if pause button exists
    console.log('\n🔍 Checking for pause/resume button...');
    const pauseButton = await page.$('.pause-resume-button');
    
    if (!pauseButton) {
      throw new Error('❌ Pause/Resume button not found!');
    }
    
    console.log('✅ Pause/Resume button found!');
    
    // Get initial button state
    const initialButtonClass = await page.$eval('.pause-resume-button', el => el.className);
    const initialButtonText = await page.$eval('.pause-text', el => el.textContent);
    
    console.log(`\n📊 Initial button state:`);
    console.log(`   - Classes: ${initialButtonClass}`);
    console.log(`   - Text: ${initialButtonText}`);
    
    // Check if button meets accessibility requirements
    const buttonSize = await page.$eval('.pause-resume-button', el => {
      const rect = el.getBoundingClientRect();
      return { width: rect.width, height: rect.height };
    });
    
    console.log(`\n📏 Button dimensions:`);
    console.log(`   - Width: ${buttonSize.width}px`);
    console.log(`   - Height: ${buttonSize.height}px`);
    
    if (buttonSize.height < 44) {
      console.warn('⚠️  Warning: Button height is less than 44px (WCAG minimum)');
    } else {
      console.log('✅ Button meets minimum touch target size (44px)');
    }
    
    // Click the pause button
    console.log('\n🖱️ Clicking pause button...');
    await pauseButton.click();
    await page.waitForTimeout(500);
    
    // Check if button state changed
    const pausedButtonClass = await page.$eval('.pause-resume-button', el => el.className);
    const pausedButtonText = await page.$eval('.pause-text', el => el.textContent);
    
    console.log(`\n📊 After clicking pause:`);
    console.log(`   - Classes: ${pausedButtonClass}`);
    console.log(`   - Text: ${pausedButtonText}`);
    
    if (pausedButtonClass.includes('paused')) {
      console.log('✅ Button correctly shows paused state');
    } else {
      console.warn('⚠️  Button may not be showing paused state correctly');
    }
    
    // Check if status indicator shows paused
    const statusText = await page.$eval('.mobile-status-text', el => el.textContent).catch(() => null);
    console.log(`   - Status: ${statusText || 'N/A'}`);
    
    // Click resume button
    console.log('\n🖱️ Clicking resume button...');
    await pauseButton.click();
    await page.waitForTimeout(500);
    
    // Check final state
    const resumedButtonClass = await page.$eval('.pause-resume-button', el => el.className);
    const resumedButtonText = await page.$eval('.pause-text', el => el.textContent);
    
    console.log(`\n📊 After clicking resume:`);
    console.log(`   - Classes: ${resumedButtonClass}`);
    console.log(`   - Text: ${resumedButtonText}`);
    
    if (!resumedButtonClass.includes('paused')) {
      console.log('✅ Button correctly returned to active state');
    } else {
      console.warn('⚠️  Button may still be showing paused state');
    }
    
    // Test on desktop viewport
    console.log('\n\n💻 Testing on desktop viewport (1920x1080)...');
    await page.setViewport({ width: 1920, height: 1080 });
    await page.waitForTimeout(500);
    
    const desktopButtonSize = await page.$eval('.pause-resume-button', el => {
      const rect = el.getBoundingClientRect();
      return { width: rect.width, height: rect.height };
    });
    
    console.log(`\n📏 Desktop button dimensions:`);
    console.log(`   - Width: ${desktopButtonSize.width}px`);
    console.log(`   - Height: ${desktopButtonSize.height}px`);
    
    // Check CSS animation
    const hasAnimation = await page.$eval('.pause-resume-button.paused', el => {
      const style = window.getComputedStyle(el);
      return style.animationName !== 'none';
    }).catch(() => false);
    
    if (hasAnimation) {
      console.log('✅ Paused button has pulse animation');
    }
    
    console.log('\n\n✅ All pause/resume tests completed successfully!');
    console.log('\n📝 Summary:');
    console.log('   - Pause/Resume button is present and visible');
    console.log('   - Button changes state correctly when clicked');
    console.log('   - Button meets accessibility requirements');
    console.log('   - Mobile and desktop views work correctly');
    
  } catch (error) {
    console.error('\n❌ Test failed:', error.message);
    process.exit(1);
  } finally {
    if (browser) {
      await browser.close();
    }
  }
}

// Run the test
testPauseResume().catch(console.error);