const { test, expect } = require('@playwright/test'); test.describe('Theme Toggle Tests', () => { test('theme toggle should cycle through modes', async ({ page }) => { // Serve the site locally for testing await page.goto('http://localhost:8080'); // Get the theme toggle button const themeToggle = await page.locator('#themeToggle'); // Verify initial state (should be auto) let ariaLabel = await themeToggle.getAttribute('aria-label'); expect(ariaLabel).toBe('Theme mode: Auto'); // Click to change to light mode await themeToggle.click(); ariaLabel = await themeToggle.getAttribute('aria-label'); expect(ariaLabel).toBe('Theme mode: Light'); // Verify data-theme attribute is set to light const dataTheme = await page.evaluate(() => document.documentElement.getAttribute('data-theme')); expect(dataTheme).toBe('light'); // Click to change to dark mode await themeToggle.click(); ariaLabel = await themeToggle.getAttribute('aria-label'); expect(ariaLabel).toBe('Theme mode: Dark'); // Verify data-theme attribute is set to dark const darkDataTheme = await page.evaluate(() => document.documentElement.getAttribute('data-theme')); expect(darkDataTheme).toBe('dark'); // Click to change back to auto mode await themeToggle.click(); ariaLabel = await themeToggle.getAttribute('aria-label'); expect(ariaLabel).toBe('Theme mode: Auto'); // Verify data-theme attribute is removed const autoDataTheme = await page.evaluate(() => document.documentElement.getAttribute('data-theme')); expect(autoDataTheme).toBeNull(); }); test('theme toggle should be keyboard accessible', async ({ page }) => { await page.goto('http://localhost:8080'); // Focus the theme toggle button using Tab await page.keyboard.press('Tab'); // Verify the button is focused const isFocused = await page.evaluate(() => { return document.activeElement.id === 'themeToggle'; }); expect(isFocused).toBeTruthy(); // Activate with space key await page.keyboard.press('Space'); // Verify it changes to light mode const ariaLabel = await page.locator('#themeToggle').getAttribute('aria-label'); expect(ariaLabel).toBe('Theme mode: Light'); }); });