import { cleanup, fireEvent, render, screen, waitFor, within } from "@testing-library/react";
import { afterEach, describe, expect, it, vi } from "vitest";
import type { SavedPreset } from "./saved-preset-model";
import { PresetsSidebar } from "./presets-sidebar";
afterEach(() => {
cleanup();
Object.defineProperty(window, "innerWidth", { configurable: true, value: 1024 });
});
const savedPreset: SavedPreset = {
id: "saved-pr",
kind: "pr",
label: "Kandev PRs",
customQuery: "author:@me is:open",
repoFilter: "kdlbs/kandev",
createdAt: "2026-08-10T00:00:00Z",
isDefault: false,
};
async function expectDeleteDoesNotSelect(phone = false) {
if (phone) Object.defineProperty(window, "innerWidth", { configurable: true, value: 390 });
const onSelect = vi.fn();
const onDeleteSaved = vi.fn();
render(
,
);
const trigger = screen.getByRole("button", { name: "Delete Kandev PRs saved query" });
fireEvent.click(trigger);
if (phone) {
expect(trigger.isConnected).toBe(true);
expect(
screen.getByRole("dialog", { name: "Delete Kandev PRs?" }).getAttribute("data-slot"),
).toBe("drawer-content");
}
expect(onDeleteSaved).not.toHaveBeenCalled();
expect(onSelect).not.toHaveBeenCalled();
const confirmation = screen.getByRole("group", { name: "Delete Kandev PRs?" });
fireEvent.click(within(confirmation).getByRole("button", { name: "Cancel" }));
expect(onDeleteSaved).not.toHaveBeenCalled();
fireEvent.click(screen.getByRole("button", { name: "Delete Kandev PRs saved query" }));
fireEvent.click(screen.getByRole("button", { name: "Delete Kandev PRs" }));
await waitFor(() => expect(onDeleteSaved).toHaveBeenCalledWith(savedPreset.id));
expect(onDeleteSaved).toHaveBeenCalledOnce();
expect(onSelect).not.toHaveBeenCalled();
}
describe("PresetsSidebar saved defaults", () => {
it("disables saved-query actions while a default mutation is pending", () => {
render(
,
);
expect(
(
screen.getByRole("button", {
name: "Updating default view… Delete Kandev PRs saved query",
}) as HTMLButtonElement
).disabled,
).toBe(true);
const defaultAction = screen.getByRole("button", {
name: "Updating default view… Set Kandev PRs as default view",
}) as HTMLButtonElement;
expect(defaultAction.disabled).toBe(true);
expect(defaultAction.getAttribute("aria-busy")).toBeNull();
expect(defaultAction.querySelector("svg")?.getAttribute("class")).toContain("animate-pulse");
});
it("sends only the destination kind when switching views", () => {
const onSelect = vi.fn();
render(
,
);
fireEvent.click(screen.getByRole("button", { name: "Issues" }));
expect(onSelect).toHaveBeenCalledWith({ kind: "issue", source: "kind-switch" });
});
it("ignores reselecting the active kind", () => {
const onSelect = vi.fn();
render(
,
);
fireEvent.click(screen.getByRole("button", { name: "Pull requests" }));
expect(onSelect).not.toHaveBeenCalled();
});
it("deletes a saved query without selecting it", () => expectDeleteDoesNotSelect());
it("keeps a phone saved query row mounted during confirmation", () =>
expectDeleteDoesNotSelect(true));
});