import { afterEach, describe, expect, it, vi } from "vitest"; import type { Project } from "../api/types.ts"; import { rememberedProject, rememberProject, REMEMBER_KEY, resolveProject, withProject } from "./current.ts"; const A = { label: "AWPCA", name: "АРМ КА" } as Project, S = { label: "STOCKS_DRRK", name: "Запасы ДРРК" } as Project; describe("текущий проект", () => { afterEach(() => vi.restoreAllMocks()); it("адрес, затем запомненный, затем первый", () => { expect(resolveProject("STOCKS_DRRK", "AWPCA", [A, S])).toEqual({ kind: "ok", project: S, fromUrl: true }); expect(resolveProject(null, "STOCKS_DRRK", [A, S])).toEqual({ kind: "ok", project: S, fromUrl: false }); expect(resolveProject(null, "GONE", [A, S])).toEqual({ kind: "ok", project: A, fromUrl: false }); expect(resolveProject("NOPE", "AWPCA", [A, S])).toEqual({ kind: "unknown", label: "NOPE" }); expect(resolveProject(null, null, [])).toEqual({ kind: "none" }); }); it("withProject сохраняет фильтры", () => { expect(withProject("?sprint=С2&project=AWPCA", "STOCKS_DRRK")).toBe("?sprint=%D0%A12&project=STOCKS_DRRK"); expect(withProject("", "AWPCA")).toBe("?project=AWPCA"); }); it("запоминание проекта в localStorage", () => { rememberProject("STOCKS_DRRK"); expect(localStorage.getItem(REMEMBER_KEY)).toBe("STOCKS_DRRK"); expect(rememberedProject()).toBe("STOCKS_DRRK"); }); it("память выбора переживает недоступное хранилище", () => { vi.spyOn(Storage.prototype, "getItem").mockImplementation(() => { throw new Error("закрыто"); }); vi.spyOn(Storage.prototype, "setItem").mockImplementation(() => { throw new Error("закрыто"); }); expect(rememberedProject()).toBeNull(); expect(() => rememberProject("AWPCA")).not.toThrow(); }); });