From 68f06b773ceb5ab73f7e84e2e00dcf178e4be204 Mon Sep 17 00:00:00 2001 From: Alex <14327609+alexpolo1@users.noreply.github.com> Date: Sun, 4 Oct 2026 23:21:26 +0200 Subject: [PATCH] fix(ordrestyring): preserve preflight database adapter (#40) * [verified] fix(ordrestyring): initialize database before preflight * [verified] fix(ordrestyring): preserve promise pool preflight adapter * test(ordrestyring): support pool-only service adapters --------- Co-authored-by: alexpolo1 --- .../__tests__/ordrestyringReadModel.test.js | 14 ++++++++++++++ backend/src/services/ordrestyringReadModel.js | 6 ++++-- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/backend/src/services/__tests__/ordrestyringReadModel.test.js b/backend/src/services/__tests__/ordrestyringReadModel.test.js index c21aad8..28f1890 100644 --- a/backend/src/services/__tests__/ordrestyringReadModel.test.js +++ b/backend/src/services/__tests__/ordrestyringReadModel.test.js @@ -14,6 +14,20 @@ describe('consumer read model safety contract', () => { databaseService.pool = { execute: jest.fn().mockResolvedValue([[{ case_number: 'A' }]]) }; await expect(readModel.cases(['A'])).resolves.toEqual([{ case_number: 'A' }]); }); + test('keeps mysql promise pools on their promise execute adapter', async () => { + const execute = jest.fn().mockResolvedValue([[{ case_number: 'A' }]]); + const pool = { pool: { execute: jest.fn() }, execute, query: jest.fn() }; + await expect(new OrdrestyringReadModel(pool, { env: {} }).cases(['A'])) + .resolves.toEqual([{ case_number: 'A' }]); + expect(execute).toHaveBeenCalledTimes(1); + expect(pool.query).not.toHaveBeenCalled(); + }); + test('supports lightweight service wrappers that expose only pool.execute', async () => { + const execute = jest.fn().mockResolvedValue([[{ case_number: 'A' }]]); + await expect(new OrdrestyringReadModel({ pool: { execute } }, { env: {} }).cases(['A'])) + .resolves.toEqual([{ case_number: 'A' }]); + expect(execute).toHaveBeenCalledTimes(1); + }); test('canonical default, domain override and invalid modes fail closed', async () => { expect(model().mode('planning')).toBe('canonical'); expect(model([], { env: { ORDRESTYRING_READ_MODE: 'compare', ORDRESTYRING_READ_MODE_HISTORY: 'legacy' } }).mode('history')).toBe('legacy'); diff --git a/backend/src/services/ordrestyringReadModel.js b/backend/src/services/ordrestyringReadModel.js index 61b03c3..64ace8c 100644 --- a/backend/src/services/ordrestyringReadModel.js +++ b/backend/src/services/ordrestyringReadModel.js @@ -80,10 +80,12 @@ class OrdrestyringReadModel { async rows(sql, params = []) { if (this.connection && Object.prototype.hasOwnProperty.call(this.connection, 'pool') - && typeof this.connection.query === 'function') { + && typeof this.connection.query === 'function' && typeof this.connection.execute !== 'function') { return this.connection.query(sql, params); } - const connection = this.connection?.pool || this.connection; + const connection = typeof this.connection?.execute === 'function' + ? this.connection + : this.connection?.pool || this.connection; if (!connection) throw new Error('Ordrestyring canonical database unavailable'); if (connection.execute) { const [rows] = await connection.execute(sql, params);