import { expect, test } from '@playwright/test'; /** Rellena el formulario con datos válidos, salvo lo que se sobrescriba. */ async function rellenar( page: import('@playwright/test').Page, campos: Partial<{ nombre: string; email: string; motivo: string; mensaje: string }> = {} ) { await page.getByLabel('Nombre').fill(campos.nombre ?? 'Ana Ruiz'); await page.getByLabel('Correo electrónico').fill(campos.email ?? 'ana@example.com'); await page.getByLabel('Motivo').selectOption(campos.motivo ?? 'colaboracion'); await page .getByLabel('Mensaje') .fill(campos.mensaje ?? 'Me gustaría hablar contigo sobre una colaboración para un disco.'); } test.describe('Formulario de contacto', () => { test('la validación del servidor devuelve los errores por campo', async ({ page }) => { await page.goto('/contacto'); // "A" y "Hola" pasan la validación del navegador y fallan en el servidor, // que es justo lo que interesa comprobar aquí. await rellenar(page, { nombre: 'A', mensaje: 'Hola' }); await page.getByRole('button', { name: 'Enviar mensaje' }).click(); await expect(page.getByText('Indica tu nombre.')).toBeVisible(); await expect(page.getByText(/Cuenta un poco más/)).toBeVisible(); }); test('lo escrito no se pierde cuando la validación falla', async ({ page }) => { await page.goto('/contacto'); await rellenar(page, { nombre: 'A' }); await page.getByRole('button', { name: 'Enviar mensaje' }).click(); await expect(page.getByText('Indica tu nombre.')).toBeVisible(); await expect(page.getByLabel('Correo electrónico')).toHaveValue('ana@example.com'); await expect(page.getByLabel('Motivo')).toHaveValue('colaboracion'); await expect(page.getByLabel('Mensaje')).not.toBeEmpty(); }); test('el campo trampa descarta los envíos automáticos', async ({ page }) => { await page.goto('/contacto'); await rellenar(page); // Solo un cliente automático rellena este campo: está fuera de la vista // y fuera del recorrido de tabulación. await page.evaluate(() => { const trampa = document.querySelector('#companiaWeb'); if (trampa instanceof HTMLInputElement) trampa.value = 'https://spam.example'; }); await page.getByRole('button', { name: 'Enviar mensaje' }).click(); await expect(page.getByText('No se ha podido enviar el mensaje.')).toBeVisible(); }); test('un envío válido no muestra errores de campo', async ({ page }) => { await page.goto('/contacto'); await rellenar(page); await page.getByRole('button', { name: 'Enviar mensaje' }).click(); // El resultado final depende de si hay proveedor de correo configurado // (ver src/lib/server/correo.ts), así que solo se comprueba que la // validación ha quedado atrás. await expect(page.getByText('Indica tu nombre.')).toHaveCount(0); await expect(page.getByText(/Cuenta un poco más/)).toHaveCount(0); await expect(page.getByText('Ese correo no parece válido.')).toHaveCount(0); }); });