/** * E2E Tests: Export Functionality * * Tests for PDF and ZIP export features. */ import { test, expect, selectors, navigateToStep } from '../fixtures/sdk-fixtures' test.describe('Export Functionality', () => { test('export button is visible', async ({ withDemoData }) => { // Navigate to dashboard or any step await navigateToStep(withDemoData, 'use-case-workshop') // Look for export button in header or command bar const exportButton = withDemoData.locator(selectors.exportButton) if (await exportButton.isVisible()) { await expect(exportButton).toBeVisible() } }) test('can trigger PDF export from command bar', async ({ withDemoData }) => { // Open command bar await withDemoData.keyboard.press('Meta+k') // Type export command await withDemoData.fill(selectors.commandInput, 'PDF Export') // Wait for export suggestion await withDemoData.waitForSelector(selectors.commandSuggestion(0), { timeout: 5000 }) // Set up download listener const downloadPromise = withDemoData.waitForEvent('download', { timeout: 30000 }) // Click export suggestion await withDemoData.click(selectors.commandSuggestion(0)) // Verify download started try { const download = await downloadPromise expect(download.suggestedFilename()).toMatch(/\.pdf$/i) } catch { // If download doesn't happen, that's acceptable for this test // (export might open in new tab or have different behavior) } }) test('can trigger ZIP export from command bar', async ({ withDemoData }) => { await withDemoData.keyboard.press('Meta+k') await withDemoData.fill(selectors.commandInput, 'ZIP Export') await withDemoData.waitForSelector(selectors.commandSuggestion(0), { timeout: 5000 }) const downloadPromise = withDemoData.waitForEvent('download', { timeout: 30000 }) await withDemoData.click(selectors.commandSuggestion(0)) try { const download = await downloadPromise expect(download.suggestedFilename()).toMatch(/\.zip$/i) } catch { // Acceptable if download behavior differs } }) test('can export JSON data', async ({ withDemoData }) => { await withDemoData.keyboard.press('Meta+k') await withDemoData.fill(selectors.commandInput, 'JSON Export') await withDemoData.waitForSelector(selectors.commandSuggestion(0), { timeout: 5000 }) const downloadPromise = withDemoData.waitForEvent('download', { timeout: 30000 }) await withDemoData.click(selectors.commandSuggestion(0)) try { const download = await downloadPromise expect(download.suggestedFilename()).toMatch(/\.json$/i) } catch { // Acceptable } }) }) test.describe('Export Content Verification', () => { test('PDF export contains expected content', async ({ withDemoData }) => { // This test verifies the export process completes without errors // Actual PDF content verification would require additional tools await withDemoData.keyboard.press('Meta+k') await withDemoData.fill(selectors.commandInput, 'PDF') await withDemoData.waitForSelector(selectors.commandSuggestion(0), { timeout: 5000 }) // Just verify the action is available const suggestion = withDemoData.locator(selectors.commandSuggestion(0)) await expect(suggestion).toContainText(/PDF|Export/i) }) test('export with no data shows appropriate message', async ({ sdkPage }) => { // Without demo data, export might show warning or be disabled await navigateToStep(sdkPage, 'use-case-workshop') // Open command bar await sdkPage.keyboard.press('Meta+k') await sdkPage.fill(selectors.commandInput, 'Export') // Export should still be available, but might show "no data" message await sdkPage.waitForSelector(selectors.commandSuggestion(0), { timeout: 5000 }) }) }) test.describe('Export Button Direct Access', () => { test('clicking export button opens export options', async ({ withDemoData }) => { await navigateToStep(withDemoData, 'vvt') const exportButton = withDemoData.locator(selectors.exportButton) if (await exportButton.isVisible()) { await exportButton.click() // Should show export options dropdown or modal const pdfOption = withDemoData.locator(selectors.exportPdfButton) const zipOption = withDemoData.locator(selectors.exportZipButton) const pdfVisible = await pdfOption.isVisible({ timeout: 2000 }) const zipVisible = await zipOption.isVisible({ timeout: 2000 }) expect(pdfVisible || zipVisible).toBe(true) } }) }) test.describe('Export API Integration', () => { test('API export endpoint is accessible', async ({ withDemoData }) => { // Test direct API call const response = await withDemoData.evaluate(async () => { try { const res = await fetch('/api/sdk/v1/export?format=json', { method: 'GET', headers: { 'Content-Type': 'application/json', }, }) return { status: res.status, ok: res.ok } } catch (error) { return { status: 0, ok: false, error: String(error) } } }) // API should respond (status might vary based on implementation) expect(response.status).toBeGreaterThanOrEqual(200) }) })