diff --git a/autogpt_platform/frontend/src/app/(no-navbar)/onboarding/__tests__/page.test.tsx b/autogpt_platform/frontend/src/app/(no-navbar)/onboarding/__tests__/page.test.tsx
index 1f46b967d4..062aedf7c0 100644
--- a/autogpt_platform/frontend/src/app/(no-navbar)/onboarding/__tests__/page.test.tsx
+++ b/autogpt_platform/frontend/src/app/(no-navbar)/onboarding/__tests__/page.test.tsx
@@ -1,5 +1,12 @@
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
-import { cleanup, render, screen } from "@/tests/integrations/test-utils";
+import {
+ act,
+ cleanup,
+ fireEvent,
+ render,
+ screen,
+ waitFor,
+} from "@/tests/integrations/test-utils";
import OnboardingPage from "../page";
import { useOnboardingWizardStore } from "../store";
@@ -16,8 +23,12 @@ vi.mock("../steps/SubscriptionStep/SubscriptionStep", () => ({
SubscriptionStep: () =>
,
}));
vi.mock("../steps/PreparingStep", () => ({
- PreparingStep: ({ onComplete: _onComplete }: { onComplete: () => void }) => (
-
+ PreparingStep: ({ onComplete }: { onComplete: () => void }) => (
+
+
+
),
}));
@@ -37,14 +48,16 @@ vi.mock("@/lib/supabase/hooks/useSupabase", () => ({
useSupabase: () => ({ isLoggedIn: true, isUserLoading: false, user: null }),
}));
+const completeStepMock = vi.fn();
+const submitProfileMock = vi.fn();
vi.mock("@/app/api/__generated__/endpoints/onboarding/onboarding", () => ({
getV1OnboardingState: () =>
Promise.resolve({ status: 200, data: { completedSteps: [] } }),
getV1CheckIfOnboardingIsCompleted: () =>
Promise.resolve({ status: 200, data: false }),
patchV1UpdateOnboardingState: () => Promise.resolve({ status: 200 }),
- postV1CompleteOnboardingStep: () => Promise.resolve({ status: 200 }),
- postV1SubmitOnboardingProfile: () => Promise.resolve({ status: 200 }),
+ postV1CompleteOnboardingStep: (body: unknown) => completeStepMock(body),
+ postV1SubmitOnboardingProfile: (body: unknown) => submitProfileMock(body),
}));
vi.mock("@/app/api/helpers", () => ({
@@ -67,6 +80,10 @@ beforeEach(() => {
currentSearchParams = new URLSearchParams();
mockFlagValue = false;
routerReplace.mockClear();
+ completeStepMock.mockClear();
+ completeStepMock.mockReturnValue(Promise.resolve({ status: 200 }));
+ submitProfileMock.mockClear();
+ submitProfileMock.mockReturnValue(Promise.resolve({ status: 200 }));
useOnboardingWizardStore.getState().reset();
});
@@ -128,4 +145,54 @@ describe("OnboardingPage — flag-gated SubscriptionStep", () => {
render();
expect(await screen.findByTestId("step-welcome")).toBeDefined();
});
+
+ it("submits the profile after the user advances into Preparing", async () => {
+ mockFlagValue = false;
+ currentSearchParams = new URLSearchParams("step=1");
+ render();
+ expect(await screen.findByTestId("step-welcome")).toBeDefined();
+ await act(async () => {
+ useOnboardingWizardStore.setState({
+ name: "Avery",
+ role: "Engineering",
+ painPoints: ["Research", "Something else"],
+ otherPainPoint: " drafting status updates ",
+ });
+ useOnboardingWizardStore.getState().goToStep(4);
+ });
+ expect(await screen.findByTestId("step-preparing")).toBeDefined();
+ await waitFor(() => expect(submitProfileMock).toHaveBeenCalledTimes(1));
+ expect(submitProfileMock).toHaveBeenCalledWith({
+ user_name: "Avery",
+ user_role: "Engineering",
+ pain_points: ["Research", "drafting status updates"],
+ });
+ });
+
+ it("redirects to /copilot when handlePreparingComplete fires", async () => {
+ mockFlagValue = false;
+ currentSearchParams = new URLSearchParams("step=4");
+ render();
+ const finish = await screen.findByTestId("preparing-finish");
+ await act(async () => {
+ fireEvent.click(finish);
+ });
+ await waitFor(() => expect(completeStepMock).toHaveBeenCalledTimes(1));
+ await waitFor(() => expect(routerReplace).toHaveBeenCalledWith("/copilot"));
+ });
+
+ it("syncs URL when the store advances past the URL step", async () => {
+ mockFlagValue = false;
+ currentSearchParams = new URLSearchParams("step=1");
+ render();
+ expect(await screen.findByTestId("step-welcome")).toBeDefined();
+ await act(async () => {
+ useOnboardingWizardStore.getState().goToStep(3);
+ });
+ await waitFor(() =>
+ expect(routerReplace).toHaveBeenCalledWith("/onboarding?step=3", {
+ scroll: false,
+ }),
+ );
+ });
});