1import * as Schema from "effect/Schema";
2import { afterEach, describe, expect, it, vi } from "vite-plus/test";
3
4function createStorage(overrides: Partial<Storage> = {}): Storage {
5 const store = new Map<string, string>();
6 return {
7 clear: () => store.clear(),
8 getItem: (key) => store.get(key) ?? null,
9 key: (index) => [...store.keys()][index] ?? null,
10 get length() {
11 return store.size;
12 },
13 removeItem: (key) => {
14 store.delete(key);
15 },
16 setItem: (key, value) => {
17 store.set(key, value);
18 },
19 ...overrides,
20 };
21}
22
23afterEach(() => {
24 vi.resetModules();
25 vi.unstubAllGlobals();
26});
27
28describe("local storage errors", () => {
29 it("retries when access to browser storage becomes available", async () => {
30 const storage = createStorage();
31 storage.setItem("read-key", JSON.stringify("saved value"));
32 let blocked = true;
33 vi.stubGlobal("window", {
34 get localStorage() {
35 if (blocked) throw new Error("storage unavailable");
36 return storage;
37 },
38 });
39 const { getLocalStorageItem, LocalStorageOperationError } = await import("./useLocalStorage");
40
41 expect(() => getLocalStorageItem("read-key", Schema.String)).toThrow(
42 LocalStorageOperationError,
43 );
44 blocked = false;
45 expect(getLocalStorageItem("read-key", Schema.String)).toBe("saved value");
46 });
47});