/** * Search E2E Tests * * Parcours critique : aller sur /search, saisir une requête, vérifier que des résultats * (tracks/playlists) s'affichent ou que l'état vide est affiché. */ import { test, expect } from '@playwright/test'; import { TEST_CONFIG, TEST_USERS, loginAsUser, fillField, forceSubmitForm, setupErrorCapture, } from '../utils/test-helpers'; test.describe('Search Flow', () => { test.use({ storageState: { cookies: [], origins: [] } }); let consoleErrors: string[] = []; let networkErrors: Array<{ url: string; status: number; method: string }> = []; test.beforeEach(async ({ page }) => { const errorCapture = setupErrorCapture(page); consoleErrors = errorCapture.consoleErrors; networkErrors = errorCapture.networkErrors; }); test('should show search page and display results or empty state', async ({ page }) => { test.setTimeout(60000); await loginAsUser(page, TEST_USERS.default.email, TEST_USERS.default.password); await page.goto(`${TEST_CONFIG.FRONTEND_URL}/search`, { waitUntil: 'domcontentloaded' }); await page.waitForLoadState('networkidle', { timeout: 10000 }).catch(() => {}); await expect(page).toHaveURL(/\/search/); const searchInput = page.locator( 'input[type="search"], input[placeholder*="Search" i], input[placeholder*="Recherche" i], input[name="q"]' ).first(); await expect(searchInput).toBeVisible({ timeout: 10000 }); await searchInput.fill('test'); await page.waitForTimeout(800); const resultsArea = page.locator('[data-testid="search-results"], [aria-label*="search" i], .search-results, main').first(); await expect(resultsArea).toBeVisible({ timeout: 10000 }); const noResults = page.getByText(/no results|aucun résultat|no tracks|aucun track/i); const hasResults = page.locator('a[href*="/tracks/"], [data-testid="track-card"], .track-card').first(); const hasResultsOrEmpty = await noResults.isVisible({ timeout: 2000 }).catch(() => false) || await hasResults.isVisible({ timeout: 2000 }).catch(() => false); expect(hasResultsOrEmpty || (await resultsArea.isVisible())).toBe(true); }); });