148 lines
4.5 KiB
TypeScript
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: "",
|
|
});
|
|
});
|
|
});
|