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.
senzapaura_es/e2e/musica.e2e.ts

93 lines
3.6 KiB

import { expect, test } from '@playwright/test';
test.describe('Página de música', () => {
test('los estilos están siempre a la vista, con su recuento', async ({ page }) => {
await page.goto('/musica');
const lateral = page.getByRole('navigation', { name: 'Estilos' });
await expect(lateral).toBeVisible();
await expect(lateral.getByRole('link', { name: /Baladas románticas/ })).toBeVisible();
await expect(lateral.getByRole('link', { name: /Clásica/ })).toBeVisible();
});
test('la tabla ordena por la columna que se pulsa', async ({ page }) => {
await page.goto('/musica');
await page.getByRole('button', { name: 'Tabla' }).click();
const columna = page.getByRole('columnheader', { name: 'Duración' });
await expect(columna).toHaveAttribute('aria-sort', 'none');
// Las cifras empiezan de mayor a menor: lo más largo arriba.
await columna.getByRole('button').click();
await expect(columna).toHaveAttribute('aria-sort', 'descending');
const duraciones = await page.locator('tbody tr td:nth-child(6)').allInnerTexts();
const enSegundos = duraciones.map((d) => {
const [m, s] = d.trim().split(':').map(Number);
return m * 60 + s;
});
expect(enSegundos).toEqual([...enSegundos].sort((a, b) => b - a));
// Y volver a pulsarla le da la vuelta.
await columna.getByRole('button').click();
await expect(columna).toHaveAttribute('aria-sort', 'ascending');
});
test('la búsqueda encuentra por etiqueta, no solo por título', async ({ page }) => {
await page.goto('/musica');
await page.getByLabel('Buscar un tema').fill('desamor');
// Ningún tema se llama «desamor»: si aparecen, es por sus etiquetas.
const estado = page.getByRole('status');
await expect(estado).toContainText('para «desamor»');
await expect(page.getByRole('heading', { name: 'Media verdad' })).toBeVisible();
});
test('una búsqueda sin resultados lo dice', async ({ page }) => {
await page.goto('/musica');
await page.getByLabel('Buscar un tema').fill('zzzzz');
await expect(page.getByRole('status')).toContainText('0 temas');
await expect(page.getByText('Ningún tema coincide.')).toBeVisible();
});
test('en la página de un estilo se ven todos sus temas', async ({ page }) => {
// No solo los destacados: si no, un tema recién añadido no se ve.
await page.goto('/musica/baladas-romanticas');
await expect(page.getByRole('heading', { name: 'Todos los temas' })).toBeVisible();
await expect(page.getByRole('heading', { name: 'Dorina' })).toBeVisible();
});
});
test.describe('Etiquetas', () => {
test('la ficha de un tema enlaza sus etiquetas', async ({ page }) => {
await page.goto('/canciones/como-si-nada');
await page.getByRole('link', { name: 'Desamor', exact: true }).click();
await expect(page).toHaveURL('/etiquetas/desamor');
await expect(page.getByRole('heading', { level: 1 })).toHaveText('Desamor');
});
test('una etiqueta reúne temas de discos distintos', async ({ page }) => {
await page.goto('/etiquetas/desamor');
await expect(page.getByRole('heading', { name: 'Como si nada' })).toBeVisible();
await expect(page.getByRole('heading', { name: 'La última carta' })).toBeVisible();
});
test('el índice ordena de más usada a menos', async ({ page }) => {
await page.goto('/etiquetas');
const nombres = await page.locator('.nube a').allInnerTexts();
const cuentas = nombres.map((t) => Number(t.trim().split(/\s+/).pop()));
expect(cuentas).toEqual([...cuentas].sort((a, b) => b - a));
});
test('una etiqueta que no existe da 404', async ({ page }) => {
const respuesta = await page.goto('/etiquetas/no-existe');
expect(respuesta?.status()).toBe(404);
});
});

Powered by TurnKey Linux.