diff --git a/tests/LocalStorage.test.svelte b/tests/LocalStorage.test.svelte deleted file mode 100644 index b67e50e3..00000000 --- a/tests/LocalStorage.test.svelte +++ /dev/null @@ -1,22 +0,0 @@ - - - { - events = [...events, { event: "on:save" }]; - }} - on:update={({ detail }) => { - events = [...events, { event: "on:update", detail }]; - }} -/> diff --git a/tests/LocalStorage/LocalStorage.test.svelte b/tests/LocalStorage/LocalStorage.test.svelte new file mode 100644 index 00000000..432f136f --- /dev/null +++ b/tests/LocalStorage/LocalStorage.test.svelte @@ -0,0 +1,19 @@ + + + + + +
+ +
+ + +
+ +
diff --git a/tests/LocalStorage/LocalStorage.test.ts b/tests/LocalStorage/LocalStorage.test.ts new file mode 100644 index 00000000..679b1142 --- /dev/null +++ b/tests/LocalStorage/LocalStorage.test.ts @@ -0,0 +1,103 @@ +import { render } from "@testing-library/svelte"; +import LocalStorage from "./LocalStorage.test.svelte"; + +describe("LocalStorage", () => { + let localStorageMock: { [key: string]: string }; + let originalLocalStorage: Storage; + + beforeEach(() => { + originalLocalStorage = global.localStorage; + localStorageMock = {}; + global.localStorage = { + getItem: vi.fn((key) => localStorageMock[key] || null), + setItem: vi.fn((key, value) => { + localStorageMock[key] = value; + }), + removeItem: vi.fn((key) => { + delete localStorageMock[key]; + }), + clear: vi.fn(() => { + localStorageMock = {}; + }), + length: 0, + key: vi.fn(), + }; + }); + + afterEach(() => { + global.localStorage = originalLocalStorage; + localStorage.clear(); + vi.restoreAllMocks(); + localStorageMock = {}; + }); + + it("saves primitive value to localStorage on mount", () => { + render(LocalStorage); + + expect(localStorage.setItem).toHaveBeenCalledWith( + "local-storage-key", + "test-value", + ); + }); + + it("saves object value as JSON string", () => { + render(LocalStorage); + + expect(localStorage.setItem).toHaveBeenCalledWith( + "theme-settings", + JSON.stringify({ theme: "dark", fontSize: 16 }), + ); + }); + + it("loads existing primitive value from localStorage", () => { + localStorageMock["local-storage-key"] = "existing-value"; + + render(LocalStorage); + expect(localStorage.getItem).toHaveBeenCalledWith("local-storage-key"); + }); + + it("loads existing object value from localStorage", () => { + // Set up existing value + const existingSettings = { theme: "light", fontSize: 14 }; + localStorageMock["theme-settings"] = JSON.stringify(existingSettings); + + render(LocalStorage); + expect(localStorage.getItem).toHaveBeenCalledWith("theme-settings"); + }); + + it("clears specific item from localStorage", () => { + const { component } = render(LocalStorage); + const storage = component.storage; + + if (storage) { + storage.clearItem(); + expect(localStorage.removeItem).toHaveBeenCalledWith("programmatic-key"); + } + }); + + it("clears all items from localStorage", () => { + const { component } = render(LocalStorage); + const storage = component.storage; + + if (storage) { + storage.clearAll(); + expect(localStorage.clear).toHaveBeenCalled(); + } + }); + + it("handles JSON parse errors gracefully", () => { + // Set up invalid JSON + localStorageMock["local-storage-key"] = "{invalid-json}"; + + render(LocalStorage); + expect(localStorage.getItem).toHaveBeenCalledWith("local-storage-key"); + }); + + it("uses default key if none provided", () => { + render(LocalStorage); + + expect(localStorage.getItem).toHaveBeenCalledWith( + expect.stringContaining("local-storage-key"), + ); + }); +}); diff --git a/tests/LocalStorage/LocalStorageObject.test.svelte b/tests/LocalStorage/LocalStorageObject.test.svelte new file mode 100644 index 00000000..23a78c17 --- /dev/null +++ b/tests/LocalStorage/LocalStorageObject.test.svelte @@ -0,0 +1,15 @@ + + +
+ { + console.log("update event", detail); + }} + /> +
diff --git a/tests/LocalStorage/LocalStorageObject.test.ts b/tests/LocalStorage/LocalStorageObject.test.ts new file mode 100644 index 00000000..d7228aac --- /dev/null +++ b/tests/LocalStorage/LocalStorageObject.test.ts @@ -0,0 +1,58 @@ +import { render } from "@testing-library/svelte"; +import LocalStorageObject from "./LocalStorageObject.test.svelte"; + +describe("LocalStorage - Object Values", () => { + let localStorageMock: { [key: string]: string }; + let originalLocalStorage: Storage; + + beforeEach(() => { + originalLocalStorage = global.localStorage; + localStorageMock = {}; + + global.localStorage = { + getItem: vi.fn((key) => localStorageMock[key] || null), + setItem: vi.fn((key, value) => { + localStorageMock[key] = value; + }), + removeItem: vi.fn((key) => { + delete localStorageMock[key]; + }), + clear: vi.fn(() => { + localStorageMock = {}; + }), + length: 0, + key: vi.fn(), + }; + }); + + afterEach(() => { + global.localStorage = originalLocalStorage; + localStorage.clear(); + vi.restoreAllMocks(); + localStorageMock = {}; + }); + + it("saves object value as JSON string", () => { + render(LocalStorageObject); + + expect(localStorage.setItem).toHaveBeenCalledWith( + "theme-settings", + JSON.stringify({ theme: "dark", fontSize: 16 }), + ); + }); + + it("loads existing object value from localStorage", () => { + const existingSettings = { theme: "light", fontSize: 14 }; + localStorageMock["theme-settings"] = JSON.stringify(existingSettings); + + render(LocalStorageObject); + expect(localStorage.getItem).toHaveBeenCalledWith("theme-settings"); + }); + + it("handles malformed JSON gracefully", () => { + localStorageMock["theme-settings"] = "{malformed-json}"; + + render(LocalStorageObject); + expect(localStorage.getItem).toHaveBeenCalledWith("theme-settings"); + }); +}); diff --git a/tests/LocalStorage/LocalStoragePrimitive.test.svelte b/tests/LocalStorage/LocalStoragePrimitive.test.svelte new file mode 100644 index 00000000..60d6a598 --- /dev/null +++ b/tests/LocalStorage/LocalStoragePrimitive.test.svelte @@ -0,0 +1,18 @@ + + +
+ { + console.log("save event"); + }} + on:update={({ detail }) => { + console.log("update event", detail); + }} + /> +
diff --git a/tests/LocalStorage/LocalStoragePrimitive.test.ts b/tests/LocalStorage/LocalStoragePrimitive.test.ts new file mode 100644 index 00000000..6a80e626 --- /dev/null +++ b/tests/LocalStorage/LocalStoragePrimitive.test.ts @@ -0,0 +1,61 @@ +import { render } from "@testing-library/svelte"; +import LocalStoragePrimitive from "./LocalStoragePrimitive.test.svelte"; + +describe("LocalStorage - Primitive Values", () => { + let localStorageMock: { [key: string]: string }; + let originalLocalStorage: Storage; + let consoleSpy: any; + + beforeEach(() => { + originalLocalStorage = global.localStorage; + localStorageMock = {}; + consoleSpy = vi.spyOn(console, "log"); + + global.localStorage = { + getItem: vi.fn((key) => localStorageMock[key] || null), + setItem: vi.fn((key, value) => { + localStorageMock[key] = value; + }), + removeItem: vi.fn((key) => { + delete localStorageMock[key]; + }), + clear: vi.fn(() => { + localStorageMock = {}; + }), + length: 0, + key: vi.fn(), + }; + }); + + afterEach(() => { + global.localStorage = originalLocalStorage; + localStorage.clear(); + vi.restoreAllMocks(); + localStorageMock = {}; + }); + + it("saves primitive value to localStorage on mount", () => { + render(LocalStoragePrimitive); + + expect(localStorage.setItem).toHaveBeenCalledWith("test-key", "test-value"); + }); + + it("loads existing primitive value from localStorage", () => { + localStorageMock["test-key"] = "existing-value"; + + render(LocalStoragePrimitive); + expect(localStorage.getItem).toHaveBeenCalledWith("test-key"); + }); + + it("dispatches save event when setting initial value", () => { + render(LocalStoragePrimitive); + expect(consoleSpy).toHaveBeenCalledWith("save event"); + }); + + it("handles invalid values gracefully", () => { + localStorageMock["test-key"] = "{invalid-value}"; + + render(LocalStoragePrimitive); + expect(localStorage.getItem).toHaveBeenCalledWith("test-key"); + }); +});