parent
4ce062fbb5
commit
fe42b4b6ce
@ -0,0 +1,68 @@
|
||||
import { page } from 'vitest/browser';
|
||||
import { describe, expect, it, vi } from 'vitest';
|
||||
import { render } from 'vitest-browser-svelte';
|
||||
import Valoracion from './Valoracion.svelte';
|
||||
|
||||
vi.mock('$app/state', () => ({
|
||||
page: {
|
||||
url: new URL('http://localhost/canciones/prometiste'),
|
||||
data: { usuario: { id: 'usuario-prueba' } },
|
||||
form: null
|
||||
}
|
||||
}));
|
||||
|
||||
type AlEnviar = (entrada: {
|
||||
formData: FormData;
|
||||
}) => (salida: {
|
||||
result: { type: 'success'; status: number; data: Record<string, unknown> };
|
||||
update: (opciones: { reset: boolean }) => Promise<void>;
|
||||
}) => Promise<void>;
|
||||
|
||||
/*
|
||||
* El componente solo necesita aquí el contrato de mejora progresiva: capturar
|
||||
* el formulario, ejecutar su callback y confirmar una respuesta correcta. La
|
||||
* persistencia se comprueba en el módulo del servidor; esta prueba protege el
|
||||
* estado que ve y puede volver a pulsar la persona.
|
||||
*/
|
||||
vi.mock('$app/forms', () => ({
|
||||
enhance(formulario: HTMLFormElement, alEnviar: AlEnviar) {
|
||||
const enviar = async (evento: SubmitEvent) => {
|
||||
evento.preventDefault();
|
||||
const formData = new FormData(formulario);
|
||||
const completar = alEnviar({ formData });
|
||||
await completar({
|
||||
result: {
|
||||
type: 'success',
|
||||
status: 200,
|
||||
data: { valoracion: { puntuacion: Number(formData.get('puntuacion')) } }
|
||||
},
|
||||
update: async () => {}
|
||||
});
|
||||
};
|
||||
|
||||
formulario.addEventListener('submit', enviar);
|
||||
return { destroy: () => formulario.removeEventListener('submit', enviar) };
|
||||
}
|
||||
}));
|
||||
|
||||
describe('Valoracion', () => {
|
||||
it('permite reemplazar una valoración ya emitida', async () => {
|
||||
const vista = render(Valoracion, { cancionSlug: 'prometiste', media: 2, mia: 2 });
|
||||
|
||||
const dos = page.getByRole('radio', { name: '2 de 5' });
|
||||
const cuatro = page.getByRole('radio', { name: '4 de 5' });
|
||||
await expect.element(dos).toBeChecked();
|
||||
|
||||
await cuatro.click();
|
||||
|
||||
await expect.element(cuatro).toBeChecked();
|
||||
await expect.element(dos).not.toBeChecked();
|
||||
await expect.element(cuatro).toBeEnabled();
|
||||
|
||||
// La confirmación local pertenece a ese tema, no al componente reutilizado
|
||||
// al navegar a otra ficha de canción.
|
||||
await vista.rerender({ cancionSlug: 'otra-cancion', media: 1, mia: 1 });
|
||||
await expect.element(page.getByRole('radio', { name: '1 de 5' })).toBeChecked();
|
||||
await expect.element(cuatro).not.toBeChecked();
|
||||
});
|
||||
});
|
||||
Loading…
Reference in new issue