// @vitest-environment happy-dom import { cleanup, fireEvent, render, screen, waitFor } from "@testing-library/react"; import { afterEach, describe, expect, it, vi } from "vitest"; import { KillDialog } from "./KillDialog.js"; afterEach(() => { cleanup(); }); describe("KillDialog", () => { it("focuses the kill button, so Enter confirms", () => { render( Promise.resolve()} onCancel={vi.fn()} />); expect(document.activeElement).toBe(screen.getByRole("button", { name: "Kill" })); }); it("focuses the force button too", () => { render( Promise.resolve()} onCancel={vi.fn()} />, ); expect(document.activeElement).toBe(screen.getByRole("button", { name: "Force kill" })); }); it("names the blockers in the confirm body", () => { render( Promise.resolve()} onCancel={vi.fn()} />, ); expect(screen.getByText(/will be refused unless it is forced/)).not.toBeNull(); }); it("cancels on Cancel, on Escape and on a backdrop click", () => { const onCancel = vi.fn(); const first = render( Promise.resolve()} onCancel={onCancel} />); fireEvent.click(screen.getByRole("button", { name: "Cancel" })); expect(onCancel).toHaveBeenCalledTimes(1); first.unmount(); const second = render( Promise.resolve()} onCancel={onCancel} />); fireEvent.keyDown(screen.getByRole("dialog"), { key: "Escape" }); expect(onCancel).toHaveBeenCalledTimes(2); second.unmount(); render( Promise.resolve()} onCancel={onCancel} />); fireEvent.click(screen.getByRole("dialog")); expect(onCancel).toHaveBeenCalledTimes(3); }); it("disables the button while pending and shows a rejection inline, so the press can be retried", async () => { let reject: (e: Error) => void = () => {}; const onConfirm = vi.fn(() => new Promise((_, r) => (reject = r))); render(); const kill = screen.getByRole("button", { name: "Kill" }) as HTMLButtonElement; fireEvent.click(kill); expect(onConfirm).toHaveBeenCalledOnce(); expect(kill.disabled).toBe(true); reject(new Error("daemon unreachable")); await waitFor(() => expect(kill.disabled).toBe(false)); expect(screen.getByText("Failed to kill: daemon unreachable")).not.toBeNull(); }); });