You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
67 lines
2.9 KiB
67 lines
2.9 KiB
|
1 month ago
|
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);
|
||
|
|
});
|
||
|
|
});
|