From da52788e65b5d99cb4249a3b1ea93ecad334bbb7 Mon Sep 17 00:00:00 2001 From: David Arranz Date: Sun, 25 Oct 2026 19:18:05 +0100 Subject: [PATCH] =?UTF-8?q?feat:=20mejorar=20el=20manejo=20de=20errores=20?= =?UTF-8?q?en=20la=20inicializaci=C3=B3n=20de=20datos=20y=20asegurar=20la?= =?UTF-8?q?=20preservaci=C3=B3n=20de=20fallos=20originales?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../infrastructure/sequelize/initializeData.test.ts | 10 ++++++++++ server/src/infrastructure/sequelize/initializeData.ts | 6 ++++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/server/src/infrastructure/sequelize/initializeData.test.ts b/server/src/infrastructure/sequelize/initializeData.test.ts index a0d0265..aaad435 100644 --- a/server/src/infrastructure/sequelize/initializeData.test.ts +++ b/server/src/infrastructure/sequelize/initializeData.test.ts @@ -69,3 +69,13 @@ it("reports connection cleanup errors", async () => { connection.close.mockRejectedValue(new Error("synthetic private detail")); await expect(initializeData({ ...options, admin: true })).rejects.toThrow("connection cleanup"); }); + +it("preserves the original failure when cleanup also fails", async () => { + const cause = new Error("Account failed"); + users.mockRejectedValue(cause); + connection.close.mockRejectedValue(new Error("Close failed")); + await expect(initializeData({ ...options, admin: true })).rejects.toMatchObject({ + message: "Data initialization failed during accounts.", cause, + }); + expect(connection.close).toHaveBeenCalledTimes(1); +}); diff --git a/server/src/infrastructure/sequelize/initializeData.ts b/server/src/infrastructure/sequelize/initializeData.ts index 90e0448..0e704ff 100644 --- a/server/src/infrastructure/sequelize/initializeData.ts +++ b/server/src/infrastructure/sequelize/initializeData.ts @@ -19,6 +19,7 @@ export const initializeData = async (options: DataInitializationOptions): Promis } let adapter: ReturnType | undefined; let stage = "connection"; + let failure: Error | undefined; try { // Seed errors and SQL logging must not expose account data or password hashes. adapter = createSequelizeAdapter({ logging: false }); @@ -45,12 +46,13 @@ export const initializeData = async (options: DataInitializationOptions): Promis } } catch (cause) { // Only this static message is printed by the CLI; the original cause stays private. - throw new Error(`Data initialization failed during ${stage}.`, { cause }); + failure = new Error(`Data initialization failed during ${stage}.`, { cause }); } finally { try { await adapter?.connection.close(); } catch (cause) { - throw new Error("Data initialization failed during connection cleanup.", { cause }); + failure ??= new Error("Data initialization failed during connection cleanup.", { cause }); } } + if (failure) throw failure; };