Files
kandev/apps/web/components/github/my-github/saved-preset-model.test.ts
T
2026-08-11 11:52:34 +01:00

148 lines
4.5 KiB
TypeScript

import { describe, expect, it } from "vitest";
import {
findDefaultSavedPreset,
readSavedPresets,
resolveDefaultSidebarTarget,
setSavedPresetDefault,
type SavedPreset,
type SavedPresetKind,
} from "./saved-preset-model";
function preset(id: string, kind: SavedPresetKind, isDefault = false): SavedPreset {
return {
id,
kind,
label: id,
customQuery: `query:${id}`,
repoFilter: `repo/${id}`,
createdAt: "2026-08-07T00:00:00Z",
isDefault,
};
}
describe("saved preset parsing", () => {
it("returns an empty list for non-array input", () => {
expect(readSavedPresets(undefined)).toEqual([]);
});
it.each([
{ field: "customQuery", value: undefined },
{ field: "customQuery", value: 42 },
{ field: "createdAt", value: undefined },
{ field: "createdAt", value: 42 },
])("rejects an entry with an invalid $field", ({ field, value }) => {
const valid = preset("valid", "pr");
const malformed = { ...preset("malformed", "pr"), [field]: value };
expect(readSavedPresets([malformed, valid])).toEqual([valid]);
});
it("drops entries that omit required query or timestamp fields", () => {
const valid = preset("valid", "pr");
const missingCustomQuery = {
id: "missing-query",
kind: "pr",
label: "Missing query",
repoFilter: "repo/missing-query",
createdAt: "2026-08-07T00:00:00Z",
isDefault: false,
};
const missingCreatedAt = {
id: "missing-created-at",
kind: "pr",
label: "Missing created at",
customQuery: "query:missing-created-at",
repoFilter: "repo/missing-created-at",
isDefault: false,
};
expect(readSavedPresets([missingCustomQuery, missingCreatedAt, valid])).toEqual([valid]);
});
it("returns only validated saved-preset fields", () => {
const valid = preset("valid", "pr");
expect(readSavedPresets([{ ...valid, serverOnly: "discard me" }])).toEqual([valid]);
});
});
describe("saved preset defaults", () => {
it("replaces one kind's default without changing the other kind", () => {
const initial = [
preset("pr-a", "pr", true),
preset("pr-b", "pr"),
preset("issue-a", "issue", true),
];
const next = setSavedPresetDefault(initial, "pr", "pr-b");
expect(next.map(({ id, isDefault }) => ({ id, isDefault }))).toEqual([
{ id: "pr-a", isDefault: false },
{ id: "pr-b", isDefault: true },
{ id: "issue-a", isDefault: true },
]);
expect(initial[0].isDefault).toBe(true);
});
it("clears only the requested kind's default", () => {
const initial = [preset("pr-a", "pr", true), preset("issue-a", "issue", true)];
const next = setSavedPresetDefault(initial, "pr", null);
expect(next.map(({ id, isDefault }) => ({ id, isDefault }))).toEqual([
{ id: "pr-a", isDefault: false },
{ id: "issue-a", isDefault: true },
]);
});
it("keeps the current default when the requested saved query does not exist", () => {
const initial = [preset("pr-a", "pr", true)];
expect(setSavedPresetDefault(initial, "pr", "missing")).toBe(initial);
});
it("returns the original list when the target is already the default", () => {
const initial = [preset("pr-a", "pr", true), preset("pr-b", "pr")];
expect(setSavedPresetDefault(initial, "pr", "pr-a")).toBe(initial);
});
it("finds the effective default for a result kind", () => {
const issueDefault = preset("issue-a", "issue", true);
expect(findDefaultSavedPreset([preset("pr-a", "pr", true), issueDefault], "issue")).toBe(
issueDefault,
);
});
it("resolves a saved default with its query and repository", () => {
const saved = preset("pr-default", "pr", true);
expect(
resolveDefaultSidebarTarget("pr", [saved], [{ value: "review", filter: "review:@me" }]),
).toEqual({
selection: { kind: "pr", source: "saved", id: "pr-default" },
query: "query:pr-default",
repoFilter: "repo/pr-default",
});
});
it("falls back to the first configured query with all repositories", () => {
expect(
resolveDefaultSidebarTarget("issue", [], [{ value: "assigned", filter: "assignee:@me" }]),
).toEqual({
selection: { kind: "issue", source: "preset", id: "assigned" },
query: "assignee:@me",
repoFilter: "",
});
});
it("falls back to an empty query when no query is configured", () => {
expect(resolveDefaultSidebarTarget("issue", [], [])).toEqual({
selection: { kind: "issue", source: "preset", id: "" },
query: "",
repoFilter: "",
});
});
});