From 3f760338c85bba96be552d24591521af5ce5dbf6 Mon Sep 17 00:00:00 2001 From: jubnl Date: Mon, 25 May 2026 20:52:57 +0200 Subject: [PATCH] fix(tests): use in-memory SQLite per worker in test mode vitest pool:forks spawns parallel worker processes that all called initDb() on the same data/travel.db, causing SQLite "database is locked" and "duplicate column name" races. When NODE_ENV=test each fork now gets an isolated :memory: DB so migrations run independently with no file contention. --- server/src/db/database.ts | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/server/src/db/database.ts b/server/src/db/database.ts index e7057fd4..51fba30e 100644 --- a/server/src/db/database.ts +++ b/server/src/db/database.ts @@ -6,12 +6,20 @@ import { runMigrations } from './migrations'; import { runSeeds } from './seeds'; import { Place, Tag } from '../types'; -const dataDir = path.join(__dirname, '../../data'); -if (!fs.existsSync(dataDir)) { - fs.mkdirSync(dataDir, { recursive: true }); -} +// In test mode each vitest worker gets an isolated in-memory DB so that +// parallel forks can't race on the same file or share migration state. +const isTest = process.env.NODE_ENV === 'test'; -const dbPath = path.join(dataDir, 'travel.db'); +let dbPath: string; +if (isTest) { + dbPath = ':memory:'; +} else { + const dataDir = path.join(__dirname, '../../data'); + if (!fs.existsSync(dataDir)) { + fs.mkdirSync(dataDir, { recursive: true }); + } + dbPath = path.join(dataDir, 'travel.db'); +} let _db: Database.Database | null = null;