shoc-frontend-new/src/test/domain/team-members/use-create-team-member.test.tsx

66 lines
2.2 KiB
TypeScript

import type { ReactNode } from "react";
import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
import { act, renderHook, waitFor } from "@testing-library/react";
import { toast } from "react-toastify";
import { beforeEach, describe, expect, it, vi } from "vitest";
import { teamMembersApi } from "@/domain/team-members/api/team-members-api";
import type {
CreateTeamMemberInput,
TeamMemberCreated,
} from "@/domain/team-members/types/team-member";
import {
INVITE_EMAIL_FAILED_MESSAGE,
useCreateTeamMember,
} from "@/domain/team-members/use-cases/use-create-team-member";
vi.mock("react-toastify", () => ({
toast: { success: vi.fn(), warning: vi.fn(), error: vi.fn() },
}));
vi.mock("@/domain/team-members/api/team-members-api", () => ({
teamMembersApi: { create: vi.fn() },
}));
const CREATED: TeamMemberCreated = {
id: "user-7",
name: "Taylor Reed",
role: "Dispatcher",
color: "#0D9488",
email: "taylor@example.com",
phone: "555-0100",
serviceAreas: ["East"],
pendingRegistration: true,
};
function wrapper({ children }: { children: ReactNode }) {
const client = new QueryClient({ defaultOptions: { mutations: { retry: false } } });
return <QueryClientProvider client={client}>{children}</QueryClientProvider>;
}
async function create(created: TeamMemberCreated) {
vi.mocked(teamMembersApi.create).mockResolvedValue(created);
const { result } = renderHook(() => useCreateTeamMember(), { wrapper });
act(() => result.current.mutate({} as CreateTeamMemberInput));
await waitFor(() => expect(result.current.isSuccess).toBe(true));
}
describe("useCreateTeamMember", () => {
beforeEach(() => {
vi.clearAllMocks();
});
it("confirms the pending member when the invite email went out", async () => {
await create({ ...CREATED, inviteEmailSent: true });
expect(toast.success).toHaveBeenCalledWith("Team member created with pending registration.");
expect(toast.warning).not.toHaveBeenCalled();
});
it("warns the admin to re-send when the invite email could not be sent", async () => {
await create({ ...CREATED, inviteEmailSent: false });
expect(toast.warning).toHaveBeenCalledWith(INVITE_EMAIL_FAILED_MESSAGE);
expect(toast.success).not.toHaveBeenCalled();
});
});