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 {children}; } 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(); }); });