Skärp testdatabas: TEST_DATABASE_URL endast, cibello_test, auto-migrate
This commit is contained in:
@@ -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
@@ -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å
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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
@@ -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,
|
||||||
|
|||||||
Reference in New Issue
Block a user