Spaces:
Build error
Build error
| import { render, screen } from "@testing-library/react"; | |
| import { it, describe, expect, vi, beforeEach, afterEach } from "vitest"; | |
| import userEvent from "@testing-library/user-event"; | |
| import AcceptTOS from "#/routes/accept-tos"; | |
| import * as CaptureConsent from "#/utils/handle-capture-consent"; | |
| import * as ToastHandlers from "#/utils/custom-toast-handlers"; | |
| import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; | |
| import { openHands } from "#/api/open-hands-axios"; | |
| // Mock the react-router hooks | |
| vi.mock("react-router", () => ({ | |
| useNavigate: () => vi.fn(), | |
| useSearchParams: () => [ | |
| { | |
| get: (param: string) => { | |
| if (param === "redirect_url") { | |
| return "/dashboard"; | |
| } | |
| return null; | |
| }, | |
| }, | |
| ], | |
| })); | |
| // Mock the axios instance | |
| vi.mock("#/api/open-hands-axios", () => ({ | |
| openHands: { | |
| post: vi.fn(), | |
| }, | |
| })); | |
| // Mock the toast handlers | |
| vi.mock("#/utils/custom-toast-handlers", () => ({ | |
| displayErrorToast: vi.fn(), | |
| })); | |
| // Create a wrapper with QueryClientProvider | |
| const createWrapper = () => { | |
| const queryClient = new QueryClient({ | |
| defaultOptions: { | |
| queries: { | |
| retry: false, | |
| }, | |
| }, | |
| }); | |
| return ({ children }: { children: React.ReactNode }) => ( | |
| <QueryClientProvider client={queryClient}>{children}</QueryClientProvider> | |
| ); | |
| }; | |
| describe("AcceptTOS", () => { | |
| beforeEach(() => { | |
| vi.stubGlobal("location", { href: "" }); | |
| }); | |
| afterEach(() => { | |
| vi.unstubAllGlobals(); | |
| vi.resetAllMocks(); | |
| }); | |
| it("should render a TOS checkbox that is unchecked by default", () => { | |
| render(<AcceptTOS />, { wrapper: createWrapper() }); | |
| const checkbox = screen.getByRole("checkbox"); | |
| const continueButton = screen.getByRole("button", { name: "TOS$CONTINUE" }); | |
| expect(checkbox).not.toBeChecked(); | |
| expect(continueButton).toBeDisabled(); | |
| }); | |
| it("should enable the continue button when the TOS checkbox is checked", async () => { | |
| const user = userEvent.setup(); | |
| render(<AcceptTOS />, { wrapper: createWrapper() }); | |
| const checkbox = screen.getByRole("checkbox"); | |
| const continueButton = screen.getByRole("button", { name: "TOS$CONTINUE" }); | |
| expect(continueButton).toBeDisabled(); | |
| await user.click(checkbox); | |
| expect(continueButton).not.toBeDisabled(); | |
| }); | |
| it("should set user analytics consent to true when the user accepts TOS", async () => { | |
| const handleCaptureConsentSpy = vi.spyOn( | |
| CaptureConsent, | |
| "handleCaptureConsent", | |
| ); | |
| // Mock the API response | |
| vi.mocked(openHands.post).mockResolvedValue({ | |
| data: { redirect_url: "/dashboard" }, | |
| }); | |
| const user = userEvent.setup(); | |
| render(<AcceptTOS />, { wrapper: createWrapper() }); | |
| const checkbox = screen.getByRole("checkbox"); | |
| await user.click(checkbox); | |
| const continueButton = screen.getByRole("button", { name: "TOS$CONTINUE" }); | |
| await user.click(continueButton); | |
| // Wait for the mutation to complete | |
| await new Promise(process.nextTick); | |
| expect(handleCaptureConsentSpy).toHaveBeenCalledWith(true); | |
| expect(openHands.post).toHaveBeenCalledWith("/api/accept_tos", { | |
| redirect_url: "/dashboard", | |
| }); | |
| }); | |
| it("should handle external redirect URLs", async () => { | |
| // Mock the API response with an external URL | |
| const externalUrl = "https://example.com/callback"; | |
| vi.mocked(openHands.post).mockResolvedValue({ | |
| data: { redirect_url: externalUrl }, | |
| }); | |
| const user = userEvent.setup(); | |
| render(<AcceptTOS />, { wrapper: createWrapper() }); | |
| const checkbox = screen.getByRole("checkbox"); | |
| await user.click(checkbox); | |
| const continueButton = screen.getByRole("button", { name: "TOS$CONTINUE" }); | |
| await user.click(continueButton); | |
| // Wait for the mutation to complete | |
| await new Promise(process.nextTick); | |
| expect(window.location.href).toBe(externalUrl); | |
| }); | |
| }); | |