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/)
57 lines
2.1 KiB
TypeScript
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);
|
|
});
|
|
});
|