// @vitest-environment jsdom import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; import { cleanup, fireEvent, render, screen } from "@testing-library/react"; import PasoResumen from "../../src/components/PasoResumen.jsx"; beforeEach(() => { vi.clearAllMocks(); // los mocks de propsBase se comparten entre pruebas }); afterEach(cleanup); const FORM_BASE = { nombre: "Bar El Olivo", provincia: "Madrid", categoria: "Restauración", subcategoria: "Tapas y raciones", direccion: "Calle Mayor 5, Madrid", enlaceGoogleMaps: "", lat: 40.4168, lng: -3.7038, entradaUbicacion: "40.4168, -3.7038", proveedorUbicacion: "coordenadas", }; const propsBase = { form: FORM_BASE, aceptaPrivacidad: false, setAceptaPrivacidad: vi.fn(), onAbrirPrivacidad: vi.fn(), onEnviar: vi.fn(), onConfirmarDuplicado: vi.fn(), onDescartarDuplicado: vi.fn(), errorFiltro: "", posibleDuplicado: null, comprobandoDuplicado: false, saving: false, }; describe("PasoResumen", () => { it("muestra un resumen legible de todos los datos", () => { render(); expect(screen.getByText("Bar El Olivo")).toBeTruthy(); expect(screen.getByText("Madrid")).toBeTruthy(); expect(screen.getByText(/🍽️ Restauración/)).toBeTruthy(); expect(screen.getByText("Tapas y raciones")).toBeTruthy(); expect(screen.getByText("Calle Mayor 5, Madrid")).toBeTruthy(); expect(screen.getByText(/Coordenadas/)).toBeTruthy(); }); it("botón de envío deshabilitado sin aceptar la privacidad", () => { render(); const boton = screen.getByRole("button", { name: /enviar propuesta/i }); expect(boton.disabled).toBe(true); }); it("al marcar la aceptación se habilita el envío y dispara onEnviar", () => { render(); fireEvent.click(screen.getByRole("checkbox")); expect(propsBase.setAceptaPrivacidad).toHaveBeenCalledWith(true); // con aceptación ya aplicada por el padre cleanup(); render(); const boton = screen.getByRole("button", { name: /enviar propuesta/i }); expect(boton.disabled).toBe(false); fireEvent.click(boton); expect(propsBase.onEnviar).toHaveBeenCalledTimes(1); }); it("el enlace de privacidad abre el modal sin marcar el checkbox", () => { render(); fireEvent.click(screen.getByRole("button", { name: /política de privacidad/i })); expect(propsBase.onAbrirPrivacidad).toHaveBeenCalledTimes(1); expect(propsBase.setAceptaPrivacidad).not.toHaveBeenCalled(); }); it("renderiza el aviso de palabra prohibida dentro del modal", () => { render(); expect(screen.getByRole("alert").textContent).toContain("palabras no permitidas"); }); it("renderiza el aviso de duplicado con las opciones del flujo", () => { render( , ); const aviso = screen.getByRole("alert"); expect(aviso.textContent).toContain("Ya existe un local parecido"); expect(aviso.textContent).toContain("Bar El Olivo"); fireEvent.click(screen.getByRole("button", { name: /enviar de todos modos/i })); expect(propsBase.onConfirmarDuplicado).toHaveBeenCalledTimes(1); fireEvent.click(screen.getByRole("button", { name: /revisar datos/i })); expect(propsBase.onDescartarDuplicado).toHaveBeenCalledTimes(1); }); it("estados Comprobando…/Enviando… deshabilitan el envío", () => { const { rerender } = render(); let boton = screen.getByRole("button", { name: /comprobando/i }); expect(boton.disabled).toBe(true); rerender(); boton = screen.getByRole("button", { name: /enviando/i }); expect(boton.disabled).toBe(true); }); });