import { cleanup, fireEvent, render, screen } from "@testing-library/react"; import userEvent from "@testing-library/user-event"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; import { I18nProvider } from "@/translations/provider"; import FemaleOutcomeSheet from "./female-outcome-sheet"; vi.mock("./swipe-button", () => ({ default: ({ disabled, onSuccess, text, }: { disabled?: boolean; onSuccess: () => void; text: string; }) => ( ), })); function renderSheet(onSubmit = vi.fn()) { render( , ); return onSubmit; } describe("FemaleOutcomeSheet", () => { afterEach(cleanup); beforeEach(() => { vi.useRealTimers(); }); it("keeps the profile unchanged when the acquaintance process is still ongoing", async () => { const onSubmit = renderSheet(); await userEvent.click(screen.getByRole("button", { name: "Continue" })); expect(onSubmit).toHaveBeenCalledWith("success"); }); it("requires a cancellation reason and submits it as a failure", async () => { const onSubmit = renderSheet(); await userEvent.click(screen.getByLabelText("Canceled")); const confirmation = screen.getByRole("button", { name: "Confirm", }); expect(confirmation).toHaveProperty("disabled", true); await userEvent.click( screen.getByRole("button", { name: "No mutual interest" }), ); expect(confirmation).toHaveProperty("disabled", false); fireEvent.click(confirmation); expect(onSubmit).toHaveBeenCalledWith("failure", "No mutual interest"); }); it("requires a written note when the other cancellation reason is selected", async () => { renderSheet(); await userEvent.click(screen.getByLabelText("Canceled")); await userEvent.click( screen.getByRole("button", { name: "Other reasons" }), ); const confirmation = screen.getByRole("button", { name: "Confirm", }); expect(confirmation).toHaveProperty("disabled", true); fireEvent.change( screen.getByPlaceholderText( "Feel free to briefly explain your decision...", ), { target: { value: "The families could not agree on the next steps.", }, }, ); expect(confirmation).toHaveProperty("disabled", false); }); });