import { render, screen } from "@testing-library/react";
import userEvent from "@testing-library/user-event";
import { describe, expect, it, vi, beforeEach } from "vitest";
import type { LlmProfileSummary } from "#/api/settings-service/profiles-service.api";
import { DeleteProfileModal } from "#/components/features/settings/delete-profile-modal";
const deleteMock = vi.fn();
vi.mock("#/hooks/mutation/use-delete-llm-profile", () => ({
useDeleteLlmProfile: () => ({ mutateAsync: deleteMock, isPending: false }),
}));
const toastMocks = vi.hoisted(() => ({
displayErrorToast: vi.fn(),
displaySuccessToast: vi.fn(),
}));
vi.mock("#/utils/custom-toast-handlers", () => toastMocks);
const profile: LlmProfileSummary = {
name: "openai_gpt-4o",
model: "openai/gpt-4o",
base_url: null,
api_key_set: true,
};
beforeEach(() => {
deleteMock.mockReset().mockResolvedValue(undefined);
toastMocks.displayErrorToast.mockReset();
toastMocks.displaySuccessToast.mockReset();
});
describe("DeleteProfileModal", () => {
it("renders nothing when profile is null", () => {
const { container } = render(
,
);
expect(container).toBeEmptyDOMElement();
});
it("renders the confirmation copy interpolated with the profile name", () => {
render();
expect(
screen.getByText("SETTINGS$PROFILE_DELETE_CONFIRMATION"),
).toBeInTheDocument();
});
it("calls deleteProfile and onClose when the user confirms", async () => {
const onClose = vi.fn();
render();
await userEvent.click(screen.getByTestId("delete-profile-confirm"));
expect(deleteMock).toHaveBeenCalledWith("openai_gpt-4o");
expect(onClose).toHaveBeenCalledTimes(1);
});
it("calls onClose without invoking the mutation on Cancel", async () => {
const onClose = vi.fn();
render();
await userEvent.click(
screen.getByRole("button", { name: "BUTTON$CANCEL" }),
);
expect(deleteMock).not.toHaveBeenCalled();
expect(onClose).toHaveBeenCalledTimes(1);
});
});