/** * E2E test: Sources CRUD. * * Validates: * 1. Adding a single source * 2. Bulk-importing a source via textarea * 3. Deleting a source (two-click confirm) */ import { test, expect } from '@playwright/test'; import { loginAsUser } from '../helpers/auth'; test.describe('Sources management', () => { test('should add, bulk-import, and delete sources', async ({ page }) => { // Step 1: Login as regular user via cookie injection await loginAsUser(page); // Clean up any leftover sources from previous test runs via API await page.goto('/', { waitUntil: 'domcontentloaded' }); await page.waitForLoadState('domcontentloaded'); const existingSources: { id: string }[] = await page.evaluate(async () => { const resp = await fetch('/api/v1/sources', { headers: { 'X-Requested-With': 'XMLHttpRequest' }, credentials: 'same-origin', }); return resp.ok ? resp.json() : []; }); for (const source of existingSources) { await page.evaluate(async (id: string) => { await fetch(`/api/v1/sources/${id}`, { method: 'DELETE', headers: { 'X-Requested-With': 'XMLHttpRequest' }, credentials: 'same-origin', }); }, source.id); } // Step 2: Navigate to sources await page.goto('/sources', { waitUntil: 'domcontentloaded' }); // Wait for the sources page to load await expect( page.locator('h1', { hasText: 'Sources Personnalisees' }), ).toBeVisible({ timeout: 10_000 }); // Step 3: Add a single source await page.locator('#source-title').fill('Test Blog'); await page.locator('#source-url').fill('https://test.example.com/blog'); // Click the "Ajouter" submit button await page.locator('button[type="submit"]', { hasText: 'Ajouter' }).click(); // Wait for the source to appear in the list await expect(page.getByText('Test Blog')).toBeVisible({ timeout: 5_000 }); await expect( page.getByText('https://test.example.com/blog'), ).toBeVisible(); // Step 4: Bulk import another source via textarea const bulkTextarea = page.locator('#bulk-import'); await bulkTextarea.fill('News Site;https://news.example.com'); // Click the bulk import button await page .locator('button[type="submit"]', { hasText: 'Importer les sources' }) .click(); // Wait for the second source to appear await expect(page.getByText('News Site')).toBeVisible({ timeout: 5_000 }); // Verify we have 2 sources in the list // Each source is an