Files
DOSSIER-STANDALONE/src/io/saveFile.test.ts
T
karim 35299307d6 Akkumulierten grünen Arbeitsstand landen (Basis für Weiterarbeit)
Bündelt den über mehrere Sessions gewachsenen, uncommitteten Stand in
einem Basis-Commit, damit Folge-Features isoliert darauf aufsetzen.
Verifikation: tsc --noEmit sauber, vitest 600/600 grün.

Enthalten (Details in PENDENZEN.md -Liste / HANDOVER.md):
- truck-Integration: Profil-Extrusion + Verjüngung + Boolean-CSG (csgrs),
  Crate src-tauri/trucksolid, Werkzeug `extrude`, ExtrudedSolid-Modell.
- kernel2d-Port nach Rust/WASM (Phasen 1–5, Diff-Harness).
- render3d 3D-Live-Schnitt = 2D-Schnitt: geschichteter Bodenaufbau,
  Prioritäts-Verschneidung (section_boolean.rs), einstellbare
  Schichttrennlinien, per-Hatch-Strichstärke, relativeToWall-Orientierung.
- Interop-Export IFC4/STL/OBJ (Loch-Ausschnitt wallMeshCut), Schnellexport.
- Projektdatei .obp + OS-Lock (lock.rs, LockConflictDialog).
- Layout-Blätter (Modell/Editor/Panel/PDF), Ausschnitte, Override-Engine,
  Tragwerk-Stützen (Column), BIM-Tree-Panel.
- Bauteil-Typsystem (Tür/Fenster/Treppe-Typen), Betontreppe mit schräger
  Laufplatte, Text-/Textbox-Werkzeug, Mess-Werkzeug, 2D/3D-Griffe für
  Öffnungen/Treppen, Snap-Symbol-Restyle.
2026-07-09 00:57:29 +02:00

52 lines
1.7 KiB
TypeScript

// Tests fuer saveTextFile. Vitest laeuft hier im "node"-Env (kein jsdom), daher
// stubben wir eine minimale DOM-/URL-Umgebung, um den Browser-Fallback-Pfad zu
// pruefen — ohne echten Tauri (kein `__TAURI_INTERNALS__`).
import { afterEach, describe, expect, it, vi } from "vitest";
import { saveTextFile } from "./saveFile";
afterEach(() => {
vi.unstubAllGlobals();
vi.restoreAllMocks();
});
/** Stubt Blob, URL und ein rudimentaeres document fuer den Anchor-Download. */
function stubBrowserEnv() {
const clicked: string[] = [];
const anchor: Record<string, unknown> = {
click: () => clicked.push("click"),
};
vi.stubGlobal("URL", {
createObjectURL: () => "blob:stub",
revokeObjectURL: () => {},
});
vi.stubGlobal("document", {
createElement: () => anchor,
body: { appendChild: () => {}, removeChild: () => {} },
});
return { clicked, anchor };
}
describe("saveTextFile", () => {
it("nimmt im Nicht-Tauri-Umfeld den Browser-Download und liefert true", async () => {
// Kein __TAURI_INTERNALS__ → Browser-Pfad.
const hadWindow = typeof globalThis.window !== "undefined";
if (!hadWindow) vi.stubGlobal("window", {});
const { clicked, anchor } = stubBrowserEnv();
const ok = await saveTextFile("hallo", "modell.txt", "text/plain");
expect(ok).toBe(true);
expect(clicked).toContain("click");
expect(anchor.download).toBe("modell.txt");
});
it("nutzt den Standard-MIME-Typ ohne Angabe, ohne zu crashen", async () => {
const hadWindow = typeof globalThis.window !== "undefined";
if (!hadWindow) vi.stubGlobal("window", {});
stubBrowserEnv();
await expect(saveTextFile("x", "a.bin")).resolves.toBe(true);
});
});