// Points the app at a throwaway database and uploads directory before any app // module is evaluated. api/config.ts reads the environment and api/model/db.ts // opens the database at import time, so this module must be the first import // of every test file — directly, or as helpers.ts's first import. It imports // nothing from the app itself, and it is synchronous on purpose: a module with // a top-level await doesn't hold back the sibling imports that follow it. import { DatabaseSync } from "node:sqlite"; export const TEST_DIR = Deno.makeTempDirSync({ prefix: "gerbeur-test-" }); Deno.env.set("GERBEUR_DB_PATH", `${TEST_DIR}/gerbeur.db`); Deno.env.set("GERBEUR_UPLOADS_DIR", `${TEST_DIR}/uploads`); Deno.env.set("GERBEUR_JWT_SECRET", "test-secret-test-secret-test-secret"); Deno.env.set("GERBEUR_PUBLIC_URL", "http://gerbeur.test"); Deno.env.set("GERBEUR_ALLOWED_ORIGINS", "http://allowed.test"); // The suite never sends mail; the routes behave as on an instance without SMTP. Deno.env.delete("GERBEUR_SMTPS_URL"); // The migrations, the error middleware and failed fetches all log; a passing // run shouldn't drown in them. TEST_VERBOSE=1 brings them back for debugging. if (!Deno.env.get("TEST_VERBOSE")) { console.log = () => {}; console.error = () => {}; } // A fresh database is built from schema.sql, exactly as api/db/init.ts does. const db = new DatabaseSync(`${TEST_DIR}/gerbeur.db`); db.exec( Deno.readTextFileSync(new URL("../db/schema.sql", import.meta.url)), ); db.close();