Lägesmedveten DB-URL: runtime endast DATABASE_URL, tester endast TEST_DATABASE_URL
This commit is contained in:
@@ -11,7 +11,7 @@
|
||||
},
|
||||
"scripts": {
|
||||
"typecheck": "tsc --noEmit",
|
||||
"test": "tsx src/migrate.ts && vitest run --passWithNoTests",
|
||||
"test": "tsx src/migrate.ts --test && vitest run --passWithNoTests",
|
||||
"db:generate": "drizzle-kit generate",
|
||||
"db:migrate": "tsx src/migrate.ts",
|
||||
"db:seed": "tsx src/seed/run.ts"
|
||||
|
||||
@@ -13,7 +13,7 @@ let sharedPool: pg.Pool | undefined;
|
||||
*/
|
||||
export function createDatabase(connectionString?: string) {
|
||||
const isTest = process.env.NODE_ENV === "test" || process.env.VITEST !== undefined;
|
||||
const url = connectionString ?? process.env.TEST_DATABASE_URL ?? process.env.DATABASE_URL;
|
||||
const url = connectionString ?? (isTest ? process.env.TEST_DATABASE_URL : process.env.DATABASE_URL);
|
||||
|
||||
if (!url) {
|
||||
if (isTest) {
|
||||
@@ -24,12 +24,6 @@ export function createDatabase(connectionString?: string) {
|
||||
throw new Error("Missing DATABASE_URL. Set it in your .env or environment before starting the app.");
|
||||
}
|
||||
|
||||
if (isTest && !process.env.TEST_DATABASE_URL) {
|
||||
throw new Error(
|
||||
"Sätt TEST_DATABASE_URL till en dedikerad testdatabas. Tester får aldrig använda DATABASE_URL.",
|
||||
);
|
||||
}
|
||||
|
||||
const pool = new pg.Pool({
|
||||
connectionString: url,
|
||||
max: Number(process.env.DATABASE_POOL_MAX ?? 10),
|
||||
|
||||
@@ -17,14 +17,27 @@ import { createDatabase } from "./client.js";
|
||||
/**
|
||||
* Kör alla väntande SQL-migrationer från infrastructure/migrations.
|
||||
* Används i dev, CI och deploy (spec §63: migration + rollback + kontroll).
|
||||
*
|
||||
* `--test` eller `MIGRATE_TARGET=test` migrerar TEST_DATABASE_URL.
|
||||
* Utan flagga används ENDAST DATABASE_URL – deploy kan aldrig röra testdatabasen.
|
||||
*/
|
||||
const isTestTarget = process.argv.includes("--test") || process.env.MIGRATE_TARGET === "test";
|
||||
const connectionString = isTestTarget ? process.env.TEST_DATABASE_URL : process.env.DATABASE_URL;
|
||||
|
||||
if (!connectionString) {
|
||||
if (isTestTarget) {
|
||||
throw new Error("Sätt TEST_DATABASE_URL för test-migrationer.");
|
||||
}
|
||||
throw new Error("Sätt DATABASE_URL innan migration körs.");
|
||||
}
|
||||
|
||||
const migrationsFolder = path.resolve(
|
||||
path.dirname(fileURLToPath(import.meta.url)),
|
||||
"../../../infrastructure/migrations",
|
||||
);
|
||||
|
||||
async function main() {
|
||||
const { db, pool } = createDatabase();
|
||||
const { db, pool } = createDatabase(connectionString);
|
||||
console.log(`[migrate] Kör migrationer från ${migrationsFolder}`);
|
||||
await migrate(db, { migrationsFolder });
|
||||
|
||||
|
||||
@@ -27,11 +27,25 @@ import { SEED_SEASON_EVENTS } from "./data/seasonEvents.js";
|
||||
/**
|
||||
* Seed-körning. Idempotent: onConflictDoNothing/Update där det är säkert.
|
||||
*
|
||||
* `--test` eller `SEED_TARGET=test` kör mot TEST_DATABASE_URL.
|
||||
* Utan flagga används ENDAST DATABASE_URL – deploy seedar aldrig testdatabasen.
|
||||
*/
|
||||
const isTestTarget = process.argv.includes("--test") || process.env.SEED_TARGET === "test";
|
||||
const connectionString = isTestTarget ? process.env.TEST_DATABASE_URL : process.env.DATABASE_URL;
|
||||
|
||||
if (!connectionString) {
|
||||
if (isTestTarget) {
|
||||
throw new Error("Sätt TEST_DATABASE_URL för test-seed.");
|
||||
}
|
||||
throw new Error("Sätt DATABASE_URL innan seed körs.");
|
||||
}
|
||||
|
||||
/**
|
||||
* Näring, allergener och kostnad för recepten beräknas HÄR, deterministiskt,
|
||||
* ur ingredienserna (spec §61.1–2) – aldrig hårdkodade och aldrig från AI.
|
||||
*/
|
||||
async function main() {
|
||||
const { db, pool } = createDatabase();
|
||||
const { db, pool } = createDatabase(connectionString);
|
||||
console.log("[seed] Startar …");
|
||||
|
||||
// 1. Kanoniska ingredienser
|
||||
|
||||
Reference in New Issue
Block a user