import { describe, test, expect, vi, afterEach } from "vitest"; /** * checkUploadVolume() erkennt, ob UPLOAD_DIR ein eigenes, von aussen * gemountetes Dateisystem ist. Liegt es stattdessen im Container, sind alle * Bilder und Videos beim naechsten Redeploy weg. * * UPLOAD_DIR wird beim Import des Moduls aus der Umgebung gelesen, deshalb * wird das Modul je Fall frisch geladen (resetModules + dynamischer Import) * statt einmal oben. */ async function loadWithEnv(env: Record) { vi.resetModules(); for (const [key, value] of Object.entries(env)) { if (value === undefined) delete process.env[key]; else process.env[key] = value; } return import("./uploads"); } const originalEnv = { ...process.env }; afterEach(() => { process.env = { ...originalEnv }; vi.resetModules(); }); describe("checkUploadVolume", () => { test("meldet ausserhalb der Produktion immer 'gemountet'", async () => { // Lokal liegt UPLOAD_DIR als "./uploads" im Projektverzeichnis — dort // waere die Warnung ein Daueralarm ohne Aussagewert. const { checkUploadVolume } = await loadWithEnv({ NODE_ENV: "development", UPLOAD_DIR: "./uploads", }); await expect(checkUploadVolume()).resolves.toMatchObject({ mounted: true }); }); test("erkennt in Produktion ein gewoehnliches Verzeichnis als NICHT dauerhaft", async () => { // Ein Unterverzeichnis des Projekts liegt auf demselben Dateisystem wie // sein uebergeordnetes Verzeichnis — genau das Merkmal eines // Container-Verzeichnisses ohne gemountetes Volume. const { checkUploadVolume } = await loadWithEnv({ NODE_ENV: "production", UPLOAD_DIR: "./src", }); await expect(checkUploadVolume()).resolves.toMatchObject({ mounted: false }); }); test("meldet kein Problem, wenn das Verzeichnis gar nicht existiert", async () => { // Aus einem fehlenden Verzeichnis laesst sich nichts ableiten — ein // Fehlalarm waere hier schlimmer als keine Meldung. const { checkUploadVolume } = await loadWithEnv({ NODE_ENV: "production", UPLOAD_DIR: "./gibt-es-garantiert-nicht-xyz", }); await expect(checkUploadVolume()).resolves.toMatchObject({ mounted: true }); }); test("gibt den geprueften Pfad mit zurueck, damit die Warnung ihn nennen kann", async () => { const { checkUploadVolume, UPLOAD_DIR } = await loadWithEnv({ NODE_ENV: "production", UPLOAD_DIR: "./src", }); await expect(checkUploadVolume()).resolves.toMatchObject({ uploadDir: UPLOAD_DIR }); }); });