From e80b75e7e0cc8402139a5ad13fb729611b453b00 Mon Sep 17 00:00:00 2001 From: Victor Giers Date: Sat, 11 Apr 2026 03:50:56 +0200 Subject: [PATCH] Expand tests for local draft storage and project scenes --- .../serialization/local-draft-storage.test.ts | 143 +++++++++++++----- 1 file changed, 104 insertions(+), 39 deletions(-) diff --git a/tests/serialization/local-draft-storage.test.ts b/tests/serialization/local-draft-storage.test.ts index d8e27a30..578b85fc 100644 --- a/tests/serialization/local-draft-storage.test.ts +++ b/tests/serialization/local-draft-storage.test.ts @@ -1,7 +1,13 @@ import { describe, expect, it } from "vitest"; import { createBoxBrush } from "../../src/document/brushes"; -import { SCENE_DOCUMENT_VERSION, createEmptySceneDocument } from "../../src/document/scene-document"; +import { + SCENE_DOCUMENT_VERSION, + createEmptyProjectDocument, + createEmptyProjectScene, + createEmptySceneDocument, + createProjectDocumentFromSceneDocument +} from "../../src/document/scene-document"; import { serializeSceneDocument } from "../../src/serialization/scene-document-json"; import { DEFAULT_SCENE_DRAFT_STORAGE_KEY, @@ -67,7 +73,7 @@ describe("local draft storage", () => { const result = loadOrCreateSceneDocument(storage); expect(result.document.version).toBe(SCENE_DOCUMENT_VERSION); - expect(result.document).toEqual(createEmptySceneDocument()); + expect(result.document).toEqual(createEmptyProjectDocument()); expect(result.diagnostic).toContain("Stored autosave could not be loaded."); expect(result.diagnostic).toContain("Starting with a fresh empty document."); }); @@ -113,7 +119,7 @@ describe("local draft storage", () => { new ThrowingStorage({ onSetItem: new Error("quota exceeded") }), - createEmptySceneDocument() + createEmptyProjectDocument() ); expect(result.status).toBe("error"); @@ -139,60 +145,109 @@ describe("local draft storage", () => { status: "saved", message: "Autosave updated." }); - const result = loadSceneDocumentDraft(storage); - expect(result).toMatchObject({ - status: "loaded", - document: { - name: "Viewport Draft" - }, - viewportLayoutState: { - layoutMode: "quad", - activePanelId: "bottomRight", - panels: { - topLeft: { - displayMode: "wireframe", - cameraState: { - target: { - x: 8, - y: 3, - z: -5 - }, - perspectiveOrbit: { - theta: 1.25 - }, - orthographicZoom: 2.5 - } + expect(result.status).toBe("loaded"); + + if (result.status !== "loaded") { + return; + } + + expect( + result.document.scenes[result.document.activeSceneId]?.name + ).toBe("Viewport Draft"); + expect(result.viewportLayoutState).toMatchObject({ + layoutMode: "quad", + activePanelId: "bottomRight", + panels: { + topLeft: { + displayMode: "wireframe", + cameraState: { + target: { + x: 8, + y: 3, + z: -5 + }, + perspectiveOrbit: { + theta: 1.25 + }, + orthographicZoom: 2.5 } } } }); }); + it("stores and restores all project scenes in autosave drafts", () => { + const storage = new MemoryStorage(); + const document = { + ...createEmptyProjectDocument({ sceneName: "Entry" }), + activeSceneId: "scene-hall", + scenes: { + scene-main: createEmptyProjectScene({ + id: "scene-main", + name: "Entry" + }), + scene-hall: createEmptyProjectScene({ + id: "scene-hall", + name: "Hallway" + }) + } + }; + + expect(saveSceneDocumentDraft(storage, document)).toEqual({ + status: "saved", + message: "Autosave updated." + }); + + const result = loadSceneDocumentDraft(storage); + + expect(result.status).toBe("loaded"); + + if (result.status !== "loaded") { + return; + } + + expect(result.document.activeSceneId).toBe("scene-hall"); + expect(Object.keys(result.document.scenes)).toEqual([ + "scene-main", + "scene-hall" + ]); + }); + it("loads older raw scene-document drafts without requiring viewport layout state", () => { const storage = new MemoryStorage(); storage.setItem(DEFAULT_SCENE_DRAFT_STORAGE_KEY, serializeSceneDocument(createEmptySceneDocument({ name: "Legacy Draft" }))); const result = loadSceneDocumentDraft(storage); - expect(result).toMatchObject({ - status: "loaded", - document: { - name: "Legacy Draft" - }, - viewportLayoutState: null, - message: "Recovered latest autosave." - }); + expect(result.status).toBe("loaded"); + + if (result.status !== "loaded") { + return; + } + + expect( + result.document.scenes[result.document.activeSceneId]?.name + ).toBe("Legacy Draft"); + expect(result.viewportLayoutState).toBeNull(); + expect(result.message).toBe("Recovered latest autosave."); }); it("reports recovered autosaves through bootstrap diagnostics", () => { const storage = new MemoryStorage(); - saveSceneDocumentDraft(storage, createEmptySceneDocument({ name: "Recovered Scene" })); + saveSceneDocumentDraft( + storage, + createProjectDocumentFromSceneDocument( + createEmptySceneDocument({ name: "Recovered Scene" }) + ) + ); const result = loadOrCreateSceneDocument(storage); - expect(result.document.name).toBe("Recovered Scene"); + expect( + result.document.scenes[result.document.activeSceneId]?.name + ).toBe("Recovered Scene"); expect(result.diagnostic).toBe("Recovered latest autosave."); }); @@ -203,9 +258,19 @@ describe("local draft storage", () => { invalidBrush.faces.posX.materialId = "missing-material"; const result = saveSceneDocumentDraft(new MemoryStorage(), { - ...createEmptySceneDocument(), - brushes: { - [invalidBrush.id]: invalidBrush + ...createProjectDocumentFromSceneDocument(createEmptySceneDocument()), + scenes: { + scene-main: { + id: "scene-main", + name: "Untitled Scene", + world: createEmptySceneDocument().world, + brushes: { + [invalidBrush.id]: invalidBrush + }, + modelInstances: {}, + entities: {}, + interactionLinks: {} + } } });