import React from "react";
import { vi } from "vitest";
import { render, fireEvent } from "@testing-library/react";
import useReposStore from "../../hooks/useReposStore";
import useRouter from "../../hooks/useRouter";
import Error from "../Error/Error";
import { Route } from "../../routes";
vi.mock("../../hooks/useReposStore");
vi.mock("../../hooks/useRouter");
describe("Error", () => {
const mockGoTo = vi.fn();
const mockRemoveRepo = vi.fn();
beforeEach(() => {
(useReposStore as any).mockReturnValue({
repos: [{ owner: "user1", repo: "repo1" }],
removeRepo: mockRemoveRepo,
});
(useRouter as any).mockReturnValue({ goTo: mockGoTo });
});
afterEach(() => {
vi.resetAllMocks();
});
test("renders error message", () => {
const error = { message: "Error message" };
const { getByText } = render();
expect(getByText("Error message")).not.toBeNull();
});
test("renders remove link if variables exist", () => {
const error = {
message: "Error message",
variables: { owner: "user1", repo: "repo1" },
};
const { getByText } = render();
expect(getByText("Remove this Repo")).not.toBeNull();
});
test("does not render remove link if variables are missing", () => {
const error = { message: "Error message" };
const { queryByText } = render();
expect(queryByText("Remove this Repo")).toBeNull();
});
test("calls removeRepo and goTo when remove link is clicked", () => {
const error = {
message: "Error message",
variables: { owner: "user1", repo: "repo1" },
};
const { getByText } = render();
const removeLink = getByText("Remove this Repo");
fireEvent.click(removeLink);
expect(mockRemoveRepo).toHaveBeenCalledWith("user1", "repo1");
expect(mockGoTo).toHaveBeenCalledWith(Route.repos);
});
test("does not call removeRepo and goTo when remove link is clicked and repos are empty", () => {
(useReposStore as any).mockReturnValue({
repos: [],
removeRepo: mockRemoveRepo,
});
const error = {
message: "Error message",
variables: { owner: "user1", repo: "repo1" },
};
const { getByText } = render();
const removeLink = getByText("Remove this Repo");
fireEvent.click(removeLink);
expect(mockRemoveRepo).not.toHaveBeenCalled();
expect(mockGoTo).not.toHaveBeenCalled();
});
});