feat(pasarela): datos inferidos juntos en una pantalla "Datos del local"
deploy-branch / deploy (push) Successful in 2m18s
deploy-branch / teardown (push) Skipped
tests / Unitarias + componente + build (pull_request) Successful in 2m23s
tests / Integración (Nominatim real, opt-in) (pull_request) Skipped
tests / Unitarias + componente + build (push) Successful in 2m30s
tests / Integración (Nominatim real, opt-in) (push) Skipped

- Nuevo PasoDatosLocal con nombre, provincia y dirección (ahora editable)
  en la misma pantalla, con aviso cuando vienen de la inferencia
- El wizard pasa de 6 a 5 pasos: Ubicación → Datos del local → Categoría
  → Tipo específico → Resumen
- Eliminados PasoNombre y PasoProvincia (absorbidos)
- Spec principal actualizada al nuevo orden de pantallas
This commit is contained in:
2026-09-12 19:00:33 +02:00
parent 30b7cc884e
commit 49e965b248
7 changed files with 117 additions and 95 deletions
+10 -8
View File
@@ -20,6 +20,7 @@ const FORM_RESUELTO = {
proveedorUbicacion: "coordenadas",
lat: 41.3851, lng: 2.1734,
nombre: "Bar X", provincia: "Barcelona",
direccion: "Calle Mayor 5, Alcalá de Henares",
categoria: "Restauración", subcategoria: "Tapas y raciones",
};
@@ -41,14 +42,13 @@ const propsBase = {
const siguiente = () => screen.getByRole("button", { name: "Siguiente" });
describe("ModalPasarela", () => {
it("arranca en la pantalla de Ubicación con las 6 pantallas declaradas", () => {
it("arranca en la pantalla de Ubicación con las 5 pantallas declaradas", () => {
render(<ModalPasarela {...propsBase} form={FORM_VACIO} />);
expect(screen.getByLabelText(/ubicación del local/i)).toBeTruthy();
expect(screen.getByText(/paso 1 de 6/i)).toBeTruthy();
expect(screen.getAllByRole("generic", { hidden: true })).toBeTruthy();
// indicador de progreso: 6 barras
expect(screen.getByText(/paso 1 de 5/i)).toBeTruthy();
// indicador de progreso: 5 barras
const barras = document.querySelectorAll('[aria-hidden="true"] span[style*="width: 16px"]');
expect(barras.length).toBe(6);
expect(barras.length).toBe(5);
});
it("Siguiente deshabilitado sin resolución de ubicación válida", () => {
@@ -56,12 +56,14 @@ describe("ModalPasarela", () => {
expect(siguiente().disabled).toBe(true);
});
it("Siguiente habilitado con datos válidos y navega; Atrás conserva los datos", () => {
it("Siguiente habilitado con datos válidos y navega; los datos inferidos comparten pantalla; Atrás conserva", () => {
render(<ModalPasarela {...propsBase} form={FORM_RESUELTO} />);
expect(siguiente().disabled).toBe(false);
fireEvent.click(siguiente());
// paso 2: nombre pre-rellenado con lo inferido
// paso 2: datos del local (nombre, provincia y dirección) en la misma pantalla
expect(screen.getByLabelText(/nombre del local/i).value).toBe("Bar X");
expect(screen.getByLabelText(/provincia/i).value).toBe("Barcelona");
expect(screen.getByLabelText(/^dirección/i).value).toBe("Calle Mayor 5, Alcalá de Henares");
fireEvent.click(screen.getByRole("button", { name: /atrás/i }));
// vuelve a ubicación con la entrada conservada
@@ -105,7 +107,7 @@ describe("ModalPasarela", () => {
it("en el paso final muestra el resumen con su propio botón de envío", () => {
render(<ModalPasarela {...propsBase} form={FORM_RESUELTO} />);
for (let i = 0; i < 5; i++) fireEvent.click(siguiente());
for (let i = 0; i < 4; i++) fireEvent.click(siguiente());
expect(screen.getByRole("button", { name: /enviar propuesta/i })).toBeTruthy();
expect(screen.queryByRole("button", { name: "Siguiente" })).toBeNull();
});