36 lines
1.9 KiB
TypeScript
36 lines
1.9 KiB
TypeScript
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();
|
||
});
|
||
});
|