import { test, expect, _electron as electron } from '@playwright/test'; import path from 'path'; test.describe('History Page E2E', () => { let electronApp: any; let window: any; test.beforeAll(async () => { electronApp = await electron.launch({ args: ['out/main/index.js'], env: { ...process.env, NODE_ENV: 'test', }, recordVideo: { dir: 'test-results/videos/', size: { width: 1280, height: 720 } } }); // Wait for the main window to be ready let found = false; for (const w of electronApp.windows()) { await w.waitForLoadState('domcontentloaded'); const t = await w.title(); if (t === 'D3RO Voice' || t === 'd3ro-voice') { window = w; found = true; break; } } if (!found) { window = await electronApp.waitForEvent('window', { predicate: async (page) => { await page.waitForLoadState('domcontentloaded'); const t = await page.title(); return t === 'D3RO Voice' || t === 'd3ro-voice'; } }); } // Bypass onboarding using the injected IPC API await window.evaluate(async () => { if ((window as any).electronAPI) { await (window as any).electronAPI.config.set({ key: 'onboardingCompleted', value: true }); await (window as any).electronAPI.config.set({ key: 'system.startupBackend', value: 'online' }); } }); // Reload to apply the bypassed config await window.reload(); await window.waitForLoadState('domcontentloaded'); }); test.afterAll(async () => { if (electronApp) { await electronApp.close(); } }); test('should clear all history', async () => { // Wait for Dashboard to load first await expect(window.locator('text=/^(Dashboard|대시보드)$/').first()).toBeVisible({ timeout: 10000 }); // Navigate to History Tab await window.locator('text=/^(History|히스토리|기록)$/').first().click(); await expect(window.locator('text=/^(History|히스토리|변환 기록)$/').first()).toBeVisible(); // Look for a Clear All button (this should fail in TDD RED) const clearButton = window.getByTestId('clear-all-history-button'); await expect(clearButton).toBeVisible(); // Click it and confirm await clearButton.click(); // Expect empty state to appear await expect(window.getByTestId('empty-state-card')).toBeVisible(); }); });