veza/apps/web/e2e/tests/search.spec.ts
senke ae586f6134 Phase 2 stabilisation: code mort, Modal→Dialog, feature flags, tests, router split, Rust legacy
Bloc A - Code mort:
- Suppression Studio (components, views, features)
- Suppression gamification + services mock (projectService, storageService, gamificationService)
- Mise à jour Sidebar, Navbar, locales

Bloc B - Frontend:
- Suppression modal.tsx deprecated, Modal.stories (doublon Dialog)
- Feature flags: PLAYLIST_SEARCH, PLAYLIST_RECOMMENDATIONS, ROLE_MANAGEMENT = true
- Suppression 19 tests orphelins, retrait exclusions vitest.config

Bloc C - Backend:
- Extraction routes_auth.go depuis router.go

Bloc D - Rust:
- Suppression security_legacy.rs (code mort, patterns déjà dans security/)
2026-02-14 17:23:32 +01:00

57 lines
2.1 KiB
TypeScript

/**
* 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);
});
});