From caabee92789a0fbcc19f4a24def0de4cd0cfa0f2 Mon Sep 17 00:00:00 2001 From: "claude[bot]" <41898282+claude[bot]@users.noreply.github.com> Date: Thu, 12 Feb 2026 14:36:34 +0000 Subject: [PATCH] fix(frontend): address CodeRabbit review suggestions for marketplace tests MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Fix filename typo: supress → suppress and update imports - Replace waitFor + getByText/getByRole with findByText/findByRole (idiomatic RTL async queries) - Remove unnecessary comments in test files per coding guidelines - Fix operator precedence with explicit parentheses in suppress helper - Remove redundant `undefined as undefined` type casts - Extract inline props to `interface Props` in MockOnboardingProvider - Widen body type in create-500-handler from Record to unknown - Add isValidating reset in mock-supabase-auth helpers - Add missing creators MSW handler in no-results tests - Clean up vitest.setup.tsx: replace nested afterAll with module-scoped variable - Fix lint errors: unused imports (act, matchesUrl) and unused params - Fix formatting in custom-mutator.ts Co-authored-by: Ubbe <0ubbe@users.noreply.github.com> --- .../__tests__/error-handling.test.tsx | 34 ++++------ .../__tests__/rendering.test.tsx | 30 ++++----- .../__tests__/empty-state.test.tsx | 3 - .../__tests__/error-handling.test.tsx | 40 ++++++------ .../__tests__/loading-state.test.tsx | 14 ++-- .../__tests__/auth-state.test.tsx | 12 ++-- .../__tests__/error-handling.test.tsx | 42 ++++++------ .../__tests__/no-results.test.tsx | 64 +++++++++++-------- .../__tests__/rendering.test.tsx | 14 ++-- .../src/app/api/mutators/custom-mutator.ts | 26 ++++---- .../helpers/create-500-handler.ts | 2 +- .../helpers/mock-onboarding-provider.tsx | 10 ++- .../helpers/mock-supabase-auth.ts | 3 + .../suppress-react-query-update-warning.ts | 34 ++++++++++ .../supress-react-query-update-warning.ts | 37 ----------- .../src/tests/integrations/test-utils.tsx | 7 +- .../src/tests/integrations/vitest.setup.tsx | 22 ++++--- .../src/tests/marketplace-agent.spec.ts | 2 +- 18 files changed, 197 insertions(+), 199 deletions(-) create mode 100644 autogpt_platform/frontend/src/tests/integrations/helpers/suppress-react-query-update-warning.ts delete mode 100644 autogpt_platform/frontend/src/tests/integrations/helpers/supress-react-query-update-warning.ts diff --git a/autogpt_platform/frontend/src/app/(platform)/marketplace/components/MainCreatorPage/__tests__/error-handling.test.tsx b/autogpt_platform/frontend/src/app/(platform)/marketplace/components/MainCreatorPage/__tests__/error-handling.test.tsx index 2ae32484f0..f91a83c2e4 100644 --- a/autogpt_platform/frontend/src/app/(platform)/marketplace/components/MainCreatorPage/__tests__/error-handling.test.tsx +++ b/autogpt_platform/frontend/src/app/(platform)/marketplace/components/MainCreatorPage/__tests__/error-handling.test.tsx @@ -1,5 +1,5 @@ import { describe, expect, test } from "vitest"; -import { render, screen, waitFor } from "@/tests/integrations/test-utils"; +import { render, screen } from "@/tests/integrations/test-utils"; import { MainCreatorPage } from "../MainCreatorPage"; import { server } from "@/mocks/mock-server"; import { @@ -18,11 +18,9 @@ describe("MainCreatorPage - Error Handling", () => { render(); - await waitFor(() => { - expect( - screen.getByText("Failed to load creator data", { exact: false }), - ).toBeInTheDocument(); - }); + expect( + await screen.findByText("Failed to load creator data", { exact: false }), + ).toBeInTheDocument(); }); test("displays error when creator agents API returns 422", async () => { @@ -30,11 +28,9 @@ describe("MainCreatorPage - Error Handling", () => { render(); - await waitFor(() => { - expect( - screen.getByText("Failed to load creator data", { exact: false }), - ).toBeInTheDocument(); - }); + expect( + await screen.findByText("Failed to load creator data", { exact: false }), + ).toBeInTheDocument(); }); test("displays error when API returns 500", async () => { @@ -42,11 +38,9 @@ describe("MainCreatorPage - Error Handling", () => { render(); - await waitFor(() => { - expect( - screen.getByText("Failed to load creator data", { exact: false }), - ).toBeInTheDocument(); - }); + expect( + await screen.findByText("Failed to load creator data", { exact: false }), + ).toBeInTheDocument(); }); test("retry button is visible on error", async () => { @@ -54,10 +48,8 @@ describe("MainCreatorPage - Error Handling", () => { render(); - await waitFor(() => { - expect( - screen.getByRole("button", { name: /try again/i }), - ).toBeInTheDocument(); - }); + expect( + await screen.findByRole("button", { name: /try again/i }), + ).toBeInTheDocument(); }); }); diff --git a/autogpt_platform/frontend/src/app/(platform)/marketplace/components/MainCreatorPage/__tests__/rendering.test.tsx b/autogpt_platform/frontend/src/app/(platform)/marketplace/components/MainCreatorPage/__tests__/rendering.test.tsx index bca00f99f1..6fc5e3448c 100644 --- a/autogpt_platform/frontend/src/app/(platform)/marketplace/components/MainCreatorPage/__tests__/rendering.test.tsx +++ b/autogpt_platform/frontend/src/app/(platform)/marketplace/components/MainCreatorPage/__tests__/rendering.test.tsx @@ -1,5 +1,5 @@ import { describe, expect, test } from "vitest"; -import { render, screen, waitFor } from "@/tests/integrations/test-utils"; +import { render, screen } from "@/tests/integrations/test-utils"; import { MainCreatorPage } from "../MainCreatorPage"; const defaultParams = { @@ -7,38 +7,32 @@ const defaultParams = { }; describe("MainCreatorPage - Rendering", () => { - test("renders creator info card", async () => { + test("renders creator description", async () => { render(); - await waitFor(() => { - expect(screen.getByTestId("creator-description")).toBeInTheDocument(); - }); + expect( + await screen.findByTestId("creator-description"), + ).toBeInTheDocument(); }); test("renders breadcrumbs with marketplace link", async () => { render(); - await waitFor(() => { - expect( - screen.getByRole("link", { name: /marketplace/i }), - ).toBeInTheDocument(); - }); + expect( + await screen.findByRole("link", { name: /marketplace/i }), + ).toBeInTheDocument(); }); test("renders about section", async () => { render(); - await waitFor(() => { - expect(screen.getByText("About")).toBeInTheDocument(); - }); + expect(await screen.findByText("About")).toBeInTheDocument(); }); test("renders agents by creator section", async () => { render(); - await waitFor(() => { - expect( - screen.getByText(/Agents by/i, { exact: false }), - ).toBeInTheDocument(); - }); + expect( + await screen.findByText(/Agents by/i, { exact: false }), + ).toBeInTheDocument(); }); }); diff --git a/autogpt_platform/frontend/src/app/(platform)/marketplace/components/MainMarketplacePage/__tests__/empty-state.test.tsx b/autogpt_platform/frontend/src/app/(platform)/marketplace/components/MainMarketplacePage/__tests__/empty-state.test.tsx index e7e9e38bcf..b6502ad3a2 100644 --- a/autogpt_platform/frontend/src/app/(platform)/marketplace/components/MainMarketplacePage/__tests__/empty-state.test.tsx +++ b/autogpt_platform/frontend/src/app/(platform)/marketplace/components/MainMarketplacePage/__tests__/empty-state.test.tsx @@ -22,7 +22,6 @@ describe("MainMarketplacePage - Empty State", () => { render(); - // Page should still render without crashing expect( await screen.findByText("Featured creators", { exact: false }), ).toBeInTheDocument(); @@ -45,7 +44,6 @@ describe("MainMarketplacePage - Empty State", () => { render(); - // Page should still render without crashing expect( await screen.findByText("Featured agents", { exact: false }), ).toBeInTheDocument(); @@ -79,7 +77,6 @@ describe("MainMarketplacePage - Empty State", () => { render(); - // Page should still render the search bar expect(await screen.findByPlaceholderText(/search/i)).toBeInTheDocument(); }); }); diff --git a/autogpt_platform/frontend/src/app/(platform)/marketplace/components/MainMarketplacePage/__tests__/error-handling.test.tsx b/autogpt_platform/frontend/src/app/(platform)/marketplace/components/MainMarketplacePage/__tests__/error-handling.test.tsx index aaa1f15d63..8f85f31470 100644 --- a/autogpt_platform/frontend/src/app/(platform)/marketplace/components/MainMarketplacePage/__tests__/error-handling.test.tsx +++ b/autogpt_platform/frontend/src/app/(platform)/marketplace/components/MainMarketplacePage/__tests__/error-handling.test.tsx @@ -1,5 +1,5 @@ import { describe, expect, test } from "vitest"; -import { render, screen, waitFor } from "@/tests/integrations/test-utils"; +import { render, screen } from "@/tests/integrations/test-utils"; import { MainMarkeplacePage } from "../MainMarketplacePage"; import { server } from "@/mocks/mock-server"; import { @@ -14,11 +14,11 @@ describe("MainMarketplacePage - Error Handling", () => { render(); - await waitFor(() => { - expect( - screen.getByText("Failed to load marketplace data", { exact: false }), - ).toBeInTheDocument(); - }); + expect( + await screen.findByText("Failed to load marketplace data", { + exact: false, + }), + ).toBeInTheDocument(); }); test("displays error when creators API returns 422", async () => { @@ -26,11 +26,11 @@ describe("MainMarketplacePage - Error Handling", () => { render(); - await waitFor(() => { - expect( - screen.getByText("Failed to load marketplace data", { exact: false }), - ).toBeInTheDocument(); - }); + expect( + await screen.findByText("Failed to load marketplace data", { + exact: false, + }), + ).toBeInTheDocument(); }); test("displays error when API returns 500", async () => { @@ -38,11 +38,11 @@ describe("MainMarketplacePage - Error Handling", () => { render(); - await waitFor(() => { - expect( - screen.getByText("Failed to load marketplace data", { exact: false }), - ).toBeInTheDocument(); - }); + expect( + await screen.findByText("Failed to load marketplace data", { + exact: false, + }), + ).toBeInTheDocument(); }); test("retry button is visible on error", async () => { @@ -50,10 +50,8 @@ describe("MainMarketplacePage - Error Handling", () => { render(); - await waitFor(() => { - expect( - screen.getByRole("button", { name: /try again/i }), - ).toBeInTheDocument(); - }); + expect( + await screen.findByRole("button", { name: /try again/i }), + ).toBeInTheDocument(); }); }); diff --git a/autogpt_platform/frontend/src/app/(platform)/marketplace/components/MainMarketplacePage/__tests__/loading-state.test.tsx b/autogpt_platform/frontend/src/app/(platform)/marketplace/components/MainMarketplacePage/__tests__/loading-state.test.tsx index 54c5539995..1eb8b54bdb 100644 --- a/autogpt_platform/frontend/src/app/(platform)/marketplace/components/MainMarketplacePage/__tests__/loading-state.test.tsx +++ b/autogpt_platform/frontend/src/app/(platform)/marketplace/components/MainMarketplacePage/__tests__/loading-state.test.tsx @@ -1,12 +1,11 @@ import { describe, expect, test } from "vitest"; -import { render } from "@/tests/integrations/test-utils"; +import { render, waitFor } from "@/tests/integrations/test-utils"; import { MainMarkeplacePage } from "../MainMarketplacePage"; import { server } from "@/mocks/mock-server"; import { http, HttpResponse, delay } from "msw"; describe("MainMarketplacePage - Loading State", () => { test("shows loading skeleton while data is being fetched", async () => { - // Override handlers to add delay to simulate loading server.use( http.get("*/api/store/agents*", async () => { await delay(500); @@ -36,10 +35,11 @@ describe("MainMarketplacePage - Loading State", () => { const { container } = render(); - // Check for loading skeleton elements (animated pulse elements) - const loadingElements = container.querySelectorAll( - '[class*="animate-pulse"]', - ); - expect(loadingElements.length).toBeGreaterThan(0); + await waitFor(() => { + const loadingElements = container.querySelectorAll( + '[class*="animate-pulse"]', + ); + expect(loadingElements.length).toBeGreaterThan(0); + }); }); }); diff --git a/autogpt_platform/frontend/src/app/(platform)/marketplace/components/MainSearchResultPage/__tests__/auth-state.test.tsx b/autogpt_platform/frontend/src/app/(platform)/marketplace/components/MainSearchResultPage/__tests__/auth-state.test.tsx index 443feb0144..db3717a18e 100644 --- a/autogpt_platform/frontend/src/app/(platform)/marketplace/components/MainSearchResultPage/__tests__/auth-state.test.tsx +++ b/autogpt_platform/frontend/src/app/(platform)/marketplace/components/MainSearchResultPage/__tests__/auth-state.test.tsx @@ -1,5 +1,5 @@ import { describe, expect, test, afterEach } from "vitest"; -import { render, screen, waitFor } from "@/tests/integrations/test-utils"; +import { render, screen } from "@/tests/integrations/test-utils"; import { MainSearchResultPage } from "../MainSearchResultPage"; import { mockAuthenticatedUser, @@ -9,7 +9,7 @@ import { const defaultProps = { searchTerm: "test-search", - sort: undefined as undefined, + sort: undefined, }; describe("MainSearchResultPage - Auth State", () => { @@ -21,17 +21,13 @@ describe("MainSearchResultPage - Auth State", () => { mockUnauthenticatedUser(); render(); - await waitFor(() => { - expect(screen.getByText("Results for:")).toBeInTheDocument(); - }); + expect(await screen.findByText("Results for:")).toBeInTheDocument(); }); test("renders page correctly when logged in", async () => { mockAuthenticatedUser(); render(); - await waitFor(() => { - expect(screen.getByText("Results for:")).toBeInTheDocument(); - }); + expect(await screen.findByText("Results for:")).toBeInTheDocument(); }); }); diff --git a/autogpt_platform/frontend/src/app/(platform)/marketplace/components/MainSearchResultPage/__tests__/error-handling.test.tsx b/autogpt_platform/frontend/src/app/(platform)/marketplace/components/MainSearchResultPage/__tests__/error-handling.test.tsx index 7eee72acaa..50f4ebe3ce 100644 --- a/autogpt_platform/frontend/src/app/(platform)/marketplace/components/MainSearchResultPage/__tests__/error-handling.test.tsx +++ b/autogpt_platform/frontend/src/app/(platform)/marketplace/components/MainSearchResultPage/__tests__/error-handling.test.tsx @@ -1,5 +1,5 @@ import { describe, expect, test } from "vitest"; -import { render, screen, waitFor } from "@/tests/integrations/test-utils"; +import { render, screen } from "@/tests/integrations/test-utils"; import { MainSearchResultPage } from "../MainSearchResultPage"; import { server } from "@/mocks/mock-server"; import { @@ -10,7 +10,7 @@ import { create500Handler } from "@/tests/integrations/helpers/create-500-handle const defaultProps = { searchTerm: "test-search", - sort: undefined as undefined, + sort: undefined, }; describe("MainSearchResultPage - Error Handling", () => { @@ -19,11 +19,11 @@ describe("MainSearchResultPage - Error Handling", () => { render(); - await waitFor(() => { - expect( - screen.getByText("Failed to load marketplace data", { exact: false }), - ).toBeInTheDocument(); - }); + expect( + await screen.findByText("Failed to load marketplace data", { + exact: false, + }), + ).toBeInTheDocument(); }); test("displays error when creators API returns 422", async () => { @@ -31,11 +31,11 @@ describe("MainSearchResultPage - Error Handling", () => { render(); - await waitFor(() => { - expect( - screen.getByText("Failed to load marketplace data", { exact: false }), - ).toBeInTheDocument(); - }); + expect( + await screen.findByText("Failed to load marketplace data", { + exact: false, + }), + ).toBeInTheDocument(); }); test("displays error when API returns 500", async () => { @@ -43,11 +43,11 @@ describe("MainSearchResultPage - Error Handling", () => { render(); - await waitFor(() => { - expect( - screen.getByText("Failed to load marketplace data", { exact: false }), - ).toBeInTheDocument(); - }); + expect( + await screen.findByText("Failed to load marketplace data", { + exact: false, + }), + ).toBeInTheDocument(); }); test("retry button is visible on error", async () => { @@ -55,10 +55,8 @@ describe("MainSearchResultPage - Error Handling", () => { render(); - await waitFor(() => { - expect( - screen.getByRole("button", { name: /try again/i }), - ).toBeInTheDocument(); - }); + expect( + await screen.findByRole("button", { name: /try again/i }), + ).toBeInTheDocument(); }); }); diff --git a/autogpt_platform/frontend/src/app/(platform)/marketplace/components/MainSearchResultPage/__tests__/no-results.test.tsx b/autogpt_platform/frontend/src/app/(platform)/marketplace/components/MainSearchResultPage/__tests__/no-results.test.tsx index 84d35668df..1d87d9a1cb 100644 --- a/autogpt_platform/frontend/src/app/(platform)/marketplace/components/MainSearchResultPage/__tests__/no-results.test.tsx +++ b/autogpt_platform/frontend/src/app/(platform)/marketplace/components/MainSearchResultPage/__tests__/no-results.test.tsx @@ -1,12 +1,12 @@ import { describe, expect, test } from "vitest"; -import { render, screen, waitFor } from "@/tests/integrations/test-utils"; +import { render, screen } from "@/tests/integrations/test-utils"; import { MainSearchResultPage } from "../MainSearchResultPage"; import { server } from "@/mocks/mock-server"; import { http, HttpResponse } from "msw"; const defaultProps = { searchTerm: "nonexistent-search-term-xyz", - sort: undefined as undefined, + sort: undefined, }; describe("MainSearchResultPage - No Results", () => { @@ -38,11 +38,7 @@ describe("MainSearchResultPage - No Results", () => { render(); - await waitFor(() => { - expect(screen.getByText("Results for:")).toBeInTheDocument(); - }); - - // Verify search term is displayed + expect(await screen.findByText("Results for:")).toBeInTheDocument(); expect(screen.getByText("nonexistent-search-term-xyz")).toBeInTheDocument(); }); @@ -59,22 +55,9 @@ describe("MainSearchResultPage - No Results", () => { }, }); }), - ); - - render(); - - await waitFor(() => { - expect( - screen.getByText("nonexistent-search-term-xyz"), - ).toBeInTheDocument(); - }); - }); - - test("search bar remains functional with no results", async () => { - server.use( - http.get("*/api/store/agents*", () => { + http.get("*/api/store/creators*", () => { return HttpResponse.json({ - agents: [], + creators: [], pagination: { total_items: 0, total_pages: 0, @@ -87,8 +70,39 @@ describe("MainSearchResultPage - No Results", () => { render(); - await waitFor(() => { - expect(screen.getByPlaceholderText(/search/i)).toBeInTheDocument(); - }); + expect( + await screen.findByText("nonexistent-search-term-xyz"), + ).toBeInTheDocument(); + }); + + test("search bar is present with no results", async () => { + server.use( + http.get("*/api/store/agents*", () => { + return HttpResponse.json({ + agents: [], + pagination: { + total_items: 0, + total_pages: 0, + current_page: 1, + page_size: 10, + }, + }); + }), + http.get("*/api/store/creators*", () => { + return HttpResponse.json({ + creators: [], + pagination: { + total_items: 0, + total_pages: 0, + current_page: 1, + page_size: 10, + }, + }); + }), + ); + + render(); + + expect(await screen.findByPlaceholderText(/search/i)).toBeInTheDocument(); }); }); diff --git a/autogpt_platform/frontend/src/app/(platform)/marketplace/components/MainSearchResultPage/__tests__/rendering.test.tsx b/autogpt_platform/frontend/src/app/(platform)/marketplace/components/MainSearchResultPage/__tests__/rendering.test.tsx index abefacbf03..f450e54263 100644 --- a/autogpt_platform/frontend/src/app/(platform)/marketplace/components/MainSearchResultPage/__tests__/rendering.test.tsx +++ b/autogpt_platform/frontend/src/app/(platform)/marketplace/components/MainSearchResultPage/__tests__/rendering.test.tsx @@ -1,27 +1,23 @@ import { describe, expect, test } from "vitest"; -import { render, screen, waitFor } from "@/tests/integrations/test-utils"; +import { render, screen } from "@/tests/integrations/test-utils"; import { MainSearchResultPage } from "../MainSearchResultPage"; const defaultProps = { searchTerm: "test-search", - sort: undefined as undefined, + sort: undefined, }; describe("MainSearchResultPage - Rendering", () => { test("renders search results header with search term", async () => { render(); - await waitFor(() => { - expect(screen.getByText("Results for:")).toBeInTheDocument(); - }); - expect(screen.getByText("test-search")).toBeInTheDocument(); + expect(await screen.findByText("Results for:")).toBeInTheDocument(); + expect(await screen.findByText("test-search")).toBeInTheDocument(); }); test("renders search bar", async () => { render(); - await waitFor(() => { - expect(screen.getByPlaceholderText(/search/i)).toBeInTheDocument(); - }); + expect(await screen.findByPlaceholderText(/search/i)).toBeInTheDocument(); }); }); diff --git a/autogpt_platform/frontend/src/app/api/mutators/custom-mutator.ts b/autogpt_platform/frontend/src/app/api/mutators/custom-mutator.ts index e58c4b4aaf..c86a29c72d 100644 --- a/autogpt_platform/frontend/src/app/api/mutators/custom-mutator.ts +++ b/autogpt_platform/frontend/src/app/api/mutators/custom-mutator.ts @@ -136,19 +136,19 @@ export const customMutator = async < response.statusText || `HTTP ${response.status}`; - const isTestEnv = process.env.NODE_ENV === 'test'; - if (!isTestEnv) { - console.error( - `Request failed ${environment.isServerSide() ? "on server" : "on client"}`, - { - status: response.status, - method, - url: fullUrl.replace(baseUrl, ""), // Show relative URL for cleaner logs - errorMessage, - responseData: responseData || "No response data", - }, - ); - } + const isTestEnv = process.env.NODE_ENV === "test"; + if (!isTestEnv) { + console.error( + `Request failed ${environment.isServerSide() ? "on server" : "on client"}`, + { + status: response.status, + method, + url: fullUrl.replace(baseUrl, ""), // Show relative URL for cleaner logs + errorMessage, + responseData: responseData || "No response data", + }, + ); + } throw new ApiError(errorMessage, response.status, responseData); } diff --git a/autogpt_platform/frontend/src/tests/integrations/helpers/create-500-handler.ts b/autogpt_platform/frontend/src/tests/integrations/helpers/create-500-handler.ts index 9190df76a1..cc28012202 100644 --- a/autogpt_platform/frontend/src/tests/integrations/helpers/create-500-handler.ts +++ b/autogpt_platform/frontend/src/tests/integrations/helpers/create-500-handler.ts @@ -4,7 +4,7 @@ type HttpMethod = "get" | "post" | "put" | "patch" | "delete"; interface Create500HandlerOptions { delayMs?: number; - body?: Record; + body?: unknown; } export function create500Handler( diff --git a/autogpt_platform/frontend/src/tests/integrations/helpers/mock-onboarding-provider.tsx b/autogpt_platform/frontend/src/tests/integrations/helpers/mock-onboarding-provider.tsx index f1616220c9..5c40b9af7e 100644 --- a/autogpt_platform/frontend/src/tests/integrations/helpers/mock-onboarding-provider.tsx +++ b/autogpt_platform/frontend/src/tests/integrations/helpers/mock-onboarding-provider.tsx @@ -18,14 +18,18 @@ const MockOnboardingContext = createContext<{ }); export function useOnboarding( - step?: number, - completeStep?: PostV1CompleteOnboardingStepStep, + _step?: number, + _completeStep?: PostV1CompleteOnboardingStepStep, ) { const context = useContext(MockOnboardingContext); return context; } -export function MockOnboardingProvider({ children }: { children: ReactNode }) { +interface Props { + children: ReactNode; +} + +export function MockOnboardingProvider({ children }: Props) { return ( = {}): User { user: mergedUser, isUserLoading: false, hasLoadedUser: true, + isValidating: false, }); return mergedUser; @@ -28,6 +29,7 @@ export function mockUnauthenticatedUser(): void { user: null, isUserLoading: false, hasLoadedUser: true, + isValidating: false, }); } @@ -36,5 +38,6 @@ export function resetAuthState(): void { user: null, isUserLoading: true, hasLoadedUser: false, + isValidating: false, }); } diff --git a/autogpt_platform/frontend/src/tests/integrations/helpers/suppress-react-query-update-warning.ts b/autogpt_platform/frontend/src/tests/integrations/helpers/suppress-react-query-update-warning.ts new file mode 100644 index 0000000000..0ba7e637aa --- /dev/null +++ b/autogpt_platform/frontend/src/tests/integrations/helpers/suppress-react-query-update-warning.ts @@ -0,0 +1,34 @@ +export function suppressReactQueryUpdateWarning() { + const originalError = console.error; + + console.error = (...args: unknown[]) => { + const isActWarning = args.some( + (arg) => + typeof arg === "string" && + (arg.includes("not wrapped in act(...)") || + (arg.includes("An update to") && arg.includes("inside a test"))), + ); + + if (isActWarning) { + const fullMessage = args + .map((arg) => String(arg)) + .join("\n") + .toLowerCase(); + + const isReactQueryRelated = + fullMessage.includes("queryclientprovider") || + fullMessage.includes("react query") || + fullMessage.includes("@tanstack/react-query"); + + if (isReactQueryRelated || fullMessage.includes("testproviders")) { + return; + } + } + + originalError(...args); + }; + + return () => { + console.error = originalError; + }; +} diff --git a/autogpt_platform/frontend/src/tests/integrations/helpers/supress-react-query-update-warning.ts b/autogpt_platform/frontend/src/tests/integrations/helpers/supress-react-query-update-warning.ts deleted file mode 100644 index af00636ff6..0000000000 --- a/autogpt_platform/frontend/src/tests/integrations/helpers/supress-react-query-update-warning.ts +++ /dev/null @@ -1,37 +0,0 @@ -// Suppresses expected act(...) warnings from React Query and component async updates. -// These warnings are normal behavior with React Query and don't indicate test failures. -export function suppressReactQueryUpdateWarning() { - const originalError = console.error; - - console.error = (...args: unknown[]) => { - const isActWarning = args.some( - (arg) => - typeof arg === "string" && - (arg.includes("not wrapped in act(...)") || - arg.includes("An update to") && arg.includes("inside a test")) - ); - - if (isActWarning) { - const fullMessage = args - .map((arg) => String(arg)) - .join("\n") - .toLowerCase(); - - const isReactQueryRelated = - fullMessage.includes("queryclientprovider") || - fullMessage.includes("react query") || - fullMessage.includes("@tanstack/react-query"); - - if (isReactQueryRelated || fullMessage.includes("testproviders")) { - return; - } - } - - originalError(...args); - }; - - // Return cleanup function - return () => { - console.error = originalError; - }; - } \ No newline at end of file diff --git a/autogpt_platform/frontend/src/tests/integrations/test-utils.tsx b/autogpt_platform/frontend/src/tests/integrations/test-utils.tsx index 17a99d8af0..dde422441c 100644 --- a/autogpt_platform/frontend/src/tests/integrations/test-utils.tsx +++ b/autogpt_platform/frontend/src/tests/integrations/test-utils.tsx @@ -1,8 +1,11 @@ import { BackendAPIProvider } from "@/lib/autogpt-server-api/context"; import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; -import { render, RenderOptions, act } from "@testing-library/react"; +import { render, RenderOptions } from "@testing-library/react"; import { ReactElement, ReactNode } from "react"; -import { MockOnboardingProvider, useOnboarding as mockUseOnboarding } from "./helpers/mock-onboarding-provider"; +import { + MockOnboardingProvider, + useOnboarding as mockUseOnboarding, +} from "./helpers/mock-onboarding-provider"; vi.mock("@/providers/onboarding/onboarding-provider", () => ({ useOnboarding: mockUseOnboarding, diff --git a/autogpt_platform/frontend/src/tests/integrations/vitest.setup.tsx b/autogpt_platform/frontend/src/tests/integrations/vitest.setup.tsx index 6db372d958..7f8fac0276 100644 --- a/autogpt_platform/frontend/src/tests/integrations/vitest.setup.tsx +++ b/autogpt_platform/frontend/src/tests/integrations/vitest.setup.tsx @@ -3,16 +3,22 @@ import { server } from "@/mocks/mock-server"; import { mockNextjsModules } from "./setup-nextjs-mocks"; import { mockSupabaseRequest } from "./mock-supabase-request"; import "@testing-library/jest-dom"; -import { suppressReactQueryUpdateWarning } from "./helpers/supress-react-query-update-warning"; +import { suppressReactQueryUpdateWarning } from "./helpers/suppress-react-query-update-warning"; + +let restoreConsoleError: (() => void) | null = null; beforeAll(() => { mockNextjsModules(); mockSupabaseRequest(); - const restoreConsoleError = suppressReactQueryUpdateWarning(); - afterAll(() => { - restoreConsoleError(); - }); - return server.listen({ onUnhandledRequest: "error" }); + restoreConsoleError = suppressReactQueryUpdateWarning(); + server.listen({ onUnhandledRequest: "error" }); +}); + +afterEach(() => { + server.resetHandlers(); +}); + +afterAll(() => { + restoreConsoleError?.(); + server.close(); }); -afterEach(() => {server.resetHandlers()}); -afterAll(() => server.close()); diff --git a/autogpt_platform/frontend/src/tests/marketplace-agent.spec.ts b/autogpt_platform/frontend/src/tests/marketplace-agent.spec.ts index 2ba7c56bca..92bb2b6d57 100644 --- a/autogpt_platform/frontend/src/tests/marketplace-agent.spec.ts +++ b/autogpt_platform/frontend/src/tests/marketplace-agent.spec.ts @@ -2,7 +2,7 @@ import { expect, test } from "@playwright/test"; import { getTestUserWithLibraryAgents } from "./credentials"; import { LoginPage } from "./pages/login.page"; import { MarketplacePage } from "./pages/marketplace.page"; -import { hasUrl, isVisible, matchesUrl } from "./utils/assertion"; +import { hasUrl, isVisible } from "./utils/assertion"; import { getSelectors } from "./utils/selectors"; function escapeRegExp(value: string) {