frontend/test/util/ha-pref-storage.test.ts

114 lines
3.4 KiB
TypeScript

import { describe, expect, afterEach, vi, test, beforeEach } from "vitest";
import type { HomeAssistant } from "../../src/types";
import { FallbackStorage } from "../test_helper/local-storage-fallback";
describe("ha-pref-storage", () => {
const mockHass = {
dockedSidebar: "auto",
selectedTheme: { theme: "default" },
unknownKey: "unknownValue",
};
beforeEach(() => {
window.localStorage = new FallbackStorage();
});
afterEach(() => {
vi.resetModules();
vi.resetAllMocks();
});
test("storeState", async () => {
const { storeState } = await import("../../src/util/ha-pref-storage");
window.localStorage.setItem = vi.fn();
storeState(mockHass as unknown as HomeAssistant);
expect(window.localStorage.setItem).toHaveBeenCalledTimes(8);
expect(window.localStorage.setItem).toHaveBeenCalledWith(
"dockedSidebar",
JSON.stringify("auto")
);
expect(window.localStorage.setItem).toHaveBeenCalledWith(
"selectedTheme",
JSON.stringify({ theme: "default" })
);
expect(window.localStorage.setItem).toHaveBeenCalledWith(
"selectedLanguage",
JSON.stringify(null)
);
expect(window.localStorage.setItem).not.toHaveBeenCalledWith(
"unknownKey",
JSON.stringify("unknownValue")
);
});
test("storeState fails", async () => {
const { storeState } = await import("../../src/util/ha-pref-storage");
window.localStorage.setItem = vi.fn((key) => {
if (key === "selectedTheme") {
throw new Error("Test error");
}
});
// eslint-disable-next-line no-global-assign
console = {
warn: vi.fn(),
error: vi.fn(),
} as unknown as Console;
storeState(mockHass as unknown as HomeAssistant);
expect(window.localStorage.setItem).toHaveBeenCalledTimes(2);
expect(window.localStorage.setItem).toHaveBeenCalledWith(
"dockedSidebar",
JSON.stringify("auto")
);
expect(window.localStorage.setItem).toHaveBeenCalledWith(
"selectedTheme",
JSON.stringify({ theme: "default" })
);
expect(window.localStorage.setItem).not.toHaveBeenCalledWith(
"selectedLanguage",
JSON.stringify(null)
);
// eslint-disable-next-line no-console
expect(console.warn).toHaveBeenCalledOnce();
// eslint-disable-next-line no-console
expect(console.warn).toHaveBeenCalledWith(
"Cannot store state; Are you in private mode or is your storage full?"
);
// eslint-disable-next-line no-console
expect(console.error).toHaveBeenCalledOnce();
});
test("getState", async () => {
const { getState } = await import("../../src/util/ha-pref-storage");
window.localStorage.setItem("selectedTheme", JSON.stringify("test"));
window.localStorage.setItem("dockedSidebar", JSON.stringify(true));
window.localStorage.setItem("selectedLanguage", JSON.stringify("german"));
// should not be in state
window.localStorage.setItem("testEntry", JSON.stringify("this is a test"));
const state = getState();
expect(state).toEqual({
dockedSidebar: "docked",
selectedTheme: { theme: "test" },
selectedLanguage: "german",
});
});
test("clearState", async () => {
const { clearState } = await import("../../src/util/ha-pref-storage");
window.localStorage.setItem("test", "test");
expect(window.localStorage.length).toEqual(1);
clearState();
expect(window.localStorage.length).toEqual(0);
});
});