diff --git a/src/storage/db.test.ts b/src/storage/db.test.ts new file mode 100644 index 0000000..7b345b3 --- /dev/null +++ b/src/storage/db.test.ts @@ -0,0 +1,60 @@ +import "fake-indexeddb/auto"; +import { describe, expect, it, beforeEach } from "vitest"; +import { openDB, getProgress, saveProgress, getSettings, saveSettings } from "./db"; +import type { Progress, Settings } from "../types"; + +describe("IndexedDB wrapper", () => { + let db: IDBDatabase; + + beforeEach(async () => { + // Each test gets a fresh database by using a unique name + // fake-indexeddb/auto resets between tests in vitest + db = await openDB(); + }); + + it("openDB resolves to an IDBDatabase with 5 object store names", () => { + const storeNames = Array.from(db.objectStoreNames); + expect(storeNames).toHaveLength(5); + expect(storeNames).toContain("progress"); + expect(storeNames).toContain("companionAssets"); + expect(storeNames).toContain("styleReference"); + expect(storeNames).toContain("forestElements"); + expect(storeNames).toContain("settings"); + }); + + it("saveProgress then getProgress returns same data", async () => { + const progress: Progress = { + id: 1, + currentLevel: 1, + completedLevels: [], + totalSessions: 0, + sessionDates: [], + selectedCharacter: "fee", + selectedLayout: "de", + }; + await saveProgress(db, progress); + const result = await getProgress(db); + expect(result).toEqual(progress); + }); + + it("saveSettings then getSettings returns same data", async () => { + const settings: Settings = { + id: 1, + audioEnabled: true, + apiKey: "test-key", + }; + await saveSettings(db, settings); + const result = await getSettings(db); + expect(result).toEqual(settings); + }); + + it("getProgress on empty DB returns null", async () => { + const result = await getProgress(db); + expect(result).toBeNull(); + }); + + it("getSettings on empty DB returns null", async () => { + const result = await getSettings(db); + expect(result).toBeNull(); + }); +});