import { render, screen } from "@testing-library/react";
import userEvent from "@testing-library/user-event";
import { beforeEach, describe, expect, it, vi } from "vitest";
// Mock external dependencies (navigation, auth, data fetching) so the test
// covers only this component's behavior.
type MeResult = [{ data: { me: { id: string; name: string; email: string } | null } | undefined }];
const { logout, navigate, useQueryMock } = vi.hoisted(() => ({
logout: vi.fn(),
navigate: vi.fn(),
useQueryMock: vi.fn<() => MeResult>(),
}));
vi.mock("@tailor-platform/app-shell", () => ({
useAuth: () => ({ logout }),
useNavigate: () => navigate,
}));
vi.mock("urql", () => ({
useQuery: () => useQueryMock(),
}));
vi.mock("@/graphql", () => ({
graphql: (query: string) => query,
}));
import { UserProfileMenu } from "./user-profile-menu";
describe("user-profile-menu", () => {
beforeEach(() => {
vi.clearAllMocks();
useQueryMock.mockReturnValue([
{ data: { me: { id: "user-1", name: "Ada Lovelace", email: "ada@example.com" } } },
]);
});
it("renders the signed-in user's name and email", () => {
render();
expect(screen.getByText("Ada Lovelace")).toBeInTheDocument();
expect(screen.getByText("ada@example.com")).toBeInTheDocument();
});
it("shows a placeholder while the profile is loading", () => {
useQueryMock.mockReturnValue([{ data: undefined }]);
render();
expect(screen.getByText("...")).toBeInTheDocument();
});
it("navigates to the profile page when the profile button is clicked", async () => {
render();
await userEvent.click(screen.getByTitle("View profile"));
expect(navigate).toHaveBeenCalledWith("/user-management/profile");
});
it("logs out when the sign out button is clicked", async () => {
render();
await userEvent.click(screen.getByTitle("Sign out"));
expect(logout).toHaveBeenCalledOnce();
});
});