Skärp testdatabas: TEST_DATABASE_URL endast, cibello_test, auto-migrate

This commit is contained in:
Sven (AAMOS AI)
2026-08-06 17:01:17 +07:00
parent 03e30755dc
commit fd5c828f96
5 changed files with 24 additions and 8 deletions
+1
View File
@@ -13,6 +13,7 @@ LOG_LEVEL=info
# --- Databas (separat databas + minsta möjliga privilegier, spec §52) --- # --- Databas (separat databas + minsta möjliga privilegier, spec §52) ---
DATABASE_URL=postgres://app_user:app_dev_password@localhost:5432/app 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 (BullMQ-köer + cache) ---
REDIS_URL=redis://localhost:6379 REDIS_URL=redis://localhost:6379
+12 -4
View File
@@ -9,10 +9,18 @@
förbjudna överallt utanför konfigurationen; `Cibello` tillåtet endast i förbjudna överallt utanför konfigurationen; `Cibello` tillåtet endast i
`brand.config.json`. `brand.config.json`.
- Stale platshållare rensade ur docs och loggar. - Stale platshållare rensade ur docs och loggar.
- `turbo.json`: test-tasken deklarerar nu `DATABASE_URL`/`TEST_DATABASE_URL` - `turbo.json`: test-tasken deklarerar `TEST_DATABASE_URL` i strict
så strict env-mode släpper igenom dem. env-mode (`DATABASE_URL` tas bort därifrån; tester får inte längre
- `packages/database/src/client.ts`: tyst dev-URL-fallback borttagen för använda den).
tester `DATABASE_URL`/`TEST_DATABASE_URL` krävs explicit. - `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. - Staging-databasen städad från testanvändare (4 st) och deras samtycken.
- **Analytics tracker kopplad i mobilappen**: `AnalyticsProvider` initierar - **Analytics tracker kopplad i mobilappen**: `AnalyticsProvider` initierar
trackern i app-roten; events gate:as klientsidigt på trackern i app-roten; events gate:as klientsidigt på
+1 -1
View File
@@ -11,7 +11,7 @@
}, },
"scripts": { "scripts": {
"typecheck": "tsc --noEmit", "typecheck": "tsc --noEmit",
"test": "vitest run --passWithNoTests", "test": "tsx src/migrate.ts && vitest run --passWithNoTests",
"db:generate": "drizzle-kit generate", "db:generate": "drizzle-kit generate",
"db:migrate": "tsx src/migrate.ts", "db:migrate": "tsx src/migrate.ts",
"db:seed": "tsx src/seed/run.ts" "db:seed": "tsx src/seed/run.ts"
+9 -2
View File
@@ -12,17 +12,24 @@ let sharedPool: pg.Pool | undefined;
* (minsta möjliga privilegier, spec §52). * (minsta möjliga privilegier, spec §52).
*/ */
export function createDatabase(connectionString?: string) { 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 ?? process.env.TEST_DATABASE_URL ?? process.env.DATABASE_URL;
if (!url) { if (!url) {
if (process.env.NODE_ENV === "test" || process.env.VITEST !== undefined) { if (isTest) {
throw new Error( 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."); 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({ const pool = new pg.Pool({
connectionString: url, connectionString: url,
max: Number(process.env.DATABASE_POOL_MAX ?? 10), max: Number(process.env.DATABASE_POOL_MAX ?? 10),
+1 -1
View File
@@ -13,7 +13,7 @@
"test": { "test": {
"dependsOn": ["^typecheck"], "dependsOn": ["^typecheck"],
"outputs": [], "outputs": [],
"env": ["DATABASE_URL", "TEST_DATABASE_URL"] "env": ["TEST_DATABASE_URL"]
}, },
"dev": { "dev": {
"cache": false, "cache": false,