Spaces:
Sleeping
Sleeping
| /** | |
| * Unit tests for src/utils/storage.js | |
| */ | |
| import { describe, it, expect, beforeEach } from "vitest"; | |
| import storage from "../../src/utils/storage"; | |
| beforeEach(() => { | |
| window.localStorage.clear(); | |
| }); | |
| // --------------------------------------------------------------------------- | |
| // Basic CRUD | |
| // --------------------------------------------------------------------------- | |
| describe("storage.get / storage.set", () => { | |
| it("returns default value when key does not exist", () => { | |
| expect(storage.get("nonexistent", "fallback")).toBe("fallback"); | |
| }); | |
| it("stores and retrieves a string", () => { | |
| storage.set("key1", "value1"); | |
| expect(storage.get("key1")).toBe("value1"); | |
| }); | |
| it("stores and retrieves an object", () => { | |
| const obj = { a: 1, b: [2, 3] }; | |
| storage.set("key2", obj); | |
| expect(storage.get("key2")).toEqual(obj); | |
| }); | |
| it("stores and retrieves a number", () => { | |
| storage.set("key3", 42); | |
| expect(storage.get("key3")).toBe(42); | |
| }); | |
| it("stores and retrieves a boolean", () => { | |
| storage.set("key4", true); | |
| expect(storage.get("key4")).toBe(true); | |
| }); | |
| it("stores and retrieves null", () => { | |
| storage.set("key5", null); | |
| expect(storage.get("key5")).toBe(null); | |
| }); | |
| }); | |
| // --------------------------------------------------------------------------- | |
| // Remove | |
| // --------------------------------------------------------------------------- | |
| describe("storage.remove", () => { | |
| it("removes a key", () => { | |
| storage.set("toRemove", "data"); | |
| expect(storage.get("toRemove")).toBe("data"); | |
| storage.remove("toRemove"); | |
| expect(storage.get("toRemove")).toBe(null); | |
| }); | |
| it("returns true on success", () => { | |
| storage.set("toRemove2", "data"); | |
| expect(storage.remove("toRemove2")).toBe(true); | |
| }); | |
| }); | |
| // --------------------------------------------------------------------------- | |
| // clearAll (farmhelp_ prefix only) | |
| // --------------------------------------------------------------------------- | |
| describe("storage.clearAll", () => { | |
| it("clears only farmhelp_ prefixed keys", () => { | |
| storage.set("farmhelp_lang", "en"); | |
| storage.set("farmhelp_theme", "dark"); | |
| window.localStorage.setItem("other_key", "keep"); | |
| storage.clearAll(); | |
| expect(storage.get("farmhelp_lang")).toBe(null); | |
| expect(storage.get("farmhelp_theme")).toBe(null); | |
| expect(window.localStorage.getItem("other_key")).toBe("keep"); | |
| }); | |
| }); | |
| // --------------------------------------------------------------------------- | |
| // TTL-based operations | |
| // --------------------------------------------------------------------------- | |
| describe("storage.setWithTTL / storage.getWithTTL", () => { | |
| it("stores and retrieves a value within TTL", () => { | |
| storage.setWithTTL("cached", "data", 60000); | |
| expect(storage.getWithTTL("cached")).toBe("data"); | |
| }); | |
| it("returns default when TTL has expired", () => { | |
| // Manually create an expired record | |
| const expired = { | |
| value: "stale", | |
| expiry: Date.now() - 1000, | |
| }; | |
| window.localStorage.setItem("expired_key", JSON.stringify(expired)); | |
| expect(storage.getWithTTL("expired_key", "default")).toBe("default"); | |
| }); | |
| it("returns default for non-existent keys", () => { | |
| expect(storage.getWithTTL("no_such_key", "fallback")).toBe("fallback"); | |
| }); | |
| it("returns default for malformed records", () => { | |
| window.localStorage.setItem("bad_record", JSON.stringify({ value: "x" })); | |
| expect(storage.getWithTTL("bad_record", "fallback")).toBe("fallback"); | |
| }); | |
| }); | |