diff --git a/.env.example b/.env.example index f1f678e..c71e140 100644 --- a/.env.example +++ b/.env.example @@ -13,6 +13,7 @@ LOG_LEVEL=info # --- Databas (separat databas + minsta möjliga privilegier, spec §52) --- DATABASE_URL=postgres://app_user:app_dev_password@localhost:5432/app +TEST_DATABASE_URL=postgres://app_user:app_dev_password@localhost:5432/cibello_test # --- Redis (BullMQ-köer + cache) --- REDIS_URL=redis://localhost:6379 diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index c25019e..87a7e89 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -9,10 +9,18 @@ förbjudna överallt utanför konfigurationen; `Cibello` tillåtet endast i `brand.config.json`. - Stale platshållare rensade ur docs och loggar. -- `turbo.json`: test-tasken deklarerar nu `DATABASE_URL`/`TEST_DATABASE_URL` - så strict env-mode släpper igenom dem. -- `packages/database/src/client.ts`: tyst dev-URL-fallback borttagen för - tester – `DATABASE_URL`/`TEST_DATABASE_URL` krävs explicit. +- `turbo.json`: test-tasken deklarerar `TEST_DATABASE_URL` i strict + env-mode (`DATABASE_URL` tas bort därifrån; tester får inte längre + använda den). +- `packages/database/src/client.ts`: skärpt – tester läser **endast** + `TEST_DATABASE_URL`; saknas den kastas ett tydligt fel. Dev/runtime + använder `DATABASE_URL`. +- Dedikerad testdatabas `cibello_test` skapad; `TEST_DATABASE_URL` lagd i + `.env` och `.env.example`. `packages/database` test-skript migrerar + automatiskt testdatabasen före varje körning. +- Bevis: radantal i staging-databasen före/efter full `pnpm test` är + identiska (users=6, households=0, household_members=0, + product_analytics_events=0, user_consents=3). - Staging-databasen städad från testanvändare (4 st) och deras samtycken. - **Analytics tracker kopplad i mobilappen**: `AnalyticsProvider` initierar trackern i app-roten; events gate:as klientsidigt på diff --git a/packages/database/package.json b/packages/database/package.json index fb450c4..d46c106 100644 --- a/packages/database/package.json +++ b/packages/database/package.json @@ -11,7 +11,7 @@ }, "scripts": { "typecheck": "tsc --noEmit", - "test": "vitest run --passWithNoTests", + "test": "tsx src/migrate.ts && vitest run --passWithNoTests", "db:generate": "drizzle-kit generate", "db:migrate": "tsx src/migrate.ts", "db:seed": "tsx src/seed/run.ts" diff --git a/packages/database/src/client.ts b/packages/database/src/client.ts index 964fb98..6e22333 100644 --- a/packages/database/src/client.ts +++ b/packages/database/src/client.ts @@ -12,17 +12,24 @@ let sharedPool: pg.Pool | undefined; * (minsta möjliga privilegier, spec §52). */ 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; if (!url) { - if (process.env.NODE_ENV === "test" || process.env.VITEST !== undefined) { + if (isTest) { throw new Error( - "Missing DATABASE_URL / TEST_DATABASE_URL. Database tests must run against an explicit database URL and are not allowed to fall back to the dev database.", + "Sätt TEST_DATABASE_URL till en dedikerad testdatabas. Tester får aldrig använda DATABASE_URL.", ); } 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), diff --git a/turbo.json b/turbo.json index 00f8160..28ed63d 100644 --- a/turbo.json +++ b/turbo.json @@ -13,7 +13,7 @@ "test": { "dependsOn": ["^typecheck"], "outputs": [], - "env": ["DATABASE_URL", "TEST_DATABASE_URL"] + "env": ["TEST_DATABASE_URL"] }, "dev": { "cache": false,