From efa6d464a38e60ceeeb88f40668c1c4ac4bfaf54 Mon Sep 17 00:00:00 2001 From: "GitStart-Cal.com" <121884634+gitstart-calcom@users.noreply.github.com> Date: Tue, 29 Aug 2023 21:14:30 +0300 Subject: [PATCH] refactor: removed redundant test (#10785) Co-authored-by: gitstart-calcom Co-authored-by: Shivam Kalra --- .../ui/components/form/wizard/WizardForm.tsx | 18 ++- .../form/wizard/wizardForm.test.tsx | 138 ++++++++++++++++++ 2 files changed, 152 insertions(+), 4 deletions(-) create mode 100644 packages/ui/components/form/wizard/wizardForm.test.tsx diff --git a/packages/ui/components/form/wizard/WizardForm.tsx b/packages/ui/components/form/wizard/WizardForm.tsx index bf5e01a13e..c532a25303 100644 --- a/packages/ui/components/form/wizard/WizardForm.tsx +++ b/packages/ui/components/form/wizard/WizardForm.tsx @@ -43,13 +43,23 @@ function WizardForm(props: { }, [currentStep]); return ( -
+
-

{currentStep.title}

-

{currentStep.description}

+

+ {currentStep.title} +

+

+ {currentStep.description} +

{!props.disableNavigation && ( - + )}
diff --git a/packages/ui/components/form/wizard/wizardForm.test.tsx b/packages/ui/components/form/wizard/wizardForm.test.tsx new file mode 100644 index 0000000000..8cf7004d17 --- /dev/null +++ b/packages/ui/components/form/wizard/wizardForm.test.tsx @@ -0,0 +1,138 @@ +/* eslint-disable playwright/missing-playwright-await */ +import { render, waitFor } from "@testing-library/react"; +import { vi } from "vitest"; + +import WizardForm from "./WizardForm"; + +vi.mock("next/navigation", () => ({ + useRouter() { + return { replace: vi.fn() }; + }, + useSearchParams() { + return { get: vi.fn().mockReturnValue(currentStepNavigation) }; + }, +})); + +const steps = [ + { + title: "Step 1", + description: "Description 1", + content:

Step 1

, + isEnabled: false, + }, + { + title: "Step 2", + description: "Description 2", + content: (setIsLoading: (value: boolean) => void) => ( + + ), + isEnabled: true, + }, + { title: "Step 3", description: "Description 3", content:

Step 3

}, +]; + +const props = { + href: "/test/mock", + steps: steps, + nextLabel: "Next step", + prevLabel: "Previous step", + finishLabel: "Finish", +}; + +let currentStepNavigation: number; + +const renderComponent = (extraProps?: { disableNavigation: boolean }) => + render(); + +describe("Tests for WizardForm component", () => { + test("Should handle all the steps correctly", async () => { + currentStepNavigation = 1; + const { queryByTestId, queryByText, rerender } = renderComponent(); + const { prevLabel, nextLabel, finishLabel } = props; + const stepInfo = { + title: queryByTestId("step-title"), + description: queryByTestId("step-description"), + }; + + await waitFor(() => { + steps.forEach((step, index) => { + rerender(); + + const { title, description } = step; + const buttons = { + prev: queryByText(prevLabel), + next: queryByText(nextLabel), + finish: queryByText(finishLabel), + }; + + expect(stepInfo.title).toHaveTextContent(title); + expect(stepInfo.description).toHaveTextContent(description); + + if (index === 0) { + // case of first step + expect(buttons.prev && buttons.finish).not.toBeInTheDocument(); + expect(buttons.next).toBeInTheDocument(); + } else if (index === steps.length - 1) { + // case of last step + expect(buttons.prev && buttons.finish).toBeInTheDocument(); + expect(buttons.next).not.toBeInTheDocument(); + } else { + // case of in-between steps + expect(buttons.prev && buttons.next).toBeInTheDocument(); + expect(buttons.finish).not.toBeInTheDocument(); + } + + currentStepNavigation++; + }); + }); + }); + + describe("Should handle the visibility of the content", async () => { + test("Should render JSX content correctly", async () => { + currentStepNavigation = 1; + const { getByTestId, getByText } = renderComponent(); + const currentStep = steps[0]; + + expect(getByTestId("content-1")).toBeInTheDocument(); + expect(getByText(currentStep.title && currentStep.description)).toBeInTheDocument(); + }); + + test("Should render function content correctly", async () => { + currentStepNavigation = 2; + const { getByTestId, getByText } = renderComponent(); + const currentStep = steps[1]; + + expect(getByTestId("content-2")).toBeInTheDocument(); + expect(getByText(currentStep.title && currentStep.description)).toBeInTheDocument(); + }); + }); + + test("Should disable 'Next step' button if current step navigation is not enabled", async () => { + currentStepNavigation = 1; + const { nextLabel } = props; + const { getByText } = renderComponent(); + + expect(getByText(nextLabel)).toBeDisabled(); + }); + + test("Should handle when navigation is disabled", async () => { + const { queryByText, queryByTestId } = renderComponent({ disableNavigation: true }); + const { prevLabel, nextLabel, finishLabel } = props; + const stepComponent = queryByTestId("wizard-step-component"); + const stepInfo = { + title: queryByTestId("step-title"), + description: queryByTestId("step-description"), + }; + const buttons = { + prev: queryByText(prevLabel), + next: queryByText(nextLabel), + finish: queryByText(finishLabel), + }; + + expect(stepInfo.title && stepInfo.description).toBeInTheDocument(); + expect(stepComponent).not.toBeInTheDocument(); + expect(buttons.prev && buttons.next && buttons.finish).not.toBeInTheDocument(); + }); +});