Skip to content

chore(site): fix inconsistent fetching results on tests #10215

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Oct 11, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
chore(site): fix inconsistent fetching results on tests
  • Loading branch information
BrunoQuaresma committed Oct 11, 2023
commit 69acb36d2325ee3ed7c671a31164dc75e5f8a5d0
50 changes: 32 additions & 18 deletions site/src/App.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import CssBaseline from "@mui/material/CssBaseline";
import { QueryClient, QueryClientProvider } from "react-query";
import { AuthProvider } from "components/AuthProvider/AuthProvider";
import { FC, PropsWithChildren } from "react";
import { FC, PropsWithChildren, ReactNode } from "react";
import { HelmetProvider } from "react-helmet-async";
import { AppRouter } from "./AppRouter";
import { ErrorBoundary } from "./components/ErrorBoundary/ErrorBoundary";
Expand All @@ -14,7 +14,7 @@ import {
} from "@mui/material/styles";
import { ThemeProvider as EmotionThemeProvider } from "@emotion/react";

const queryClient = new QueryClient({
const defaultQueryClient = new QueryClient({
defaultOptions: {
queries: {
retry: false,
Expand All @@ -25,24 +25,38 @@ const queryClient = new QueryClient({
},
});

export const AppProviders: FC<PropsWithChildren> = ({ children }) => {
export const ThemeProviders: FC<PropsWithChildren> = ({ children }) => {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Really like the decision to split these up into a separate provider

return (
<StyledEngineProvider injectFirst>
<MuiThemeProvider theme={dark}>
<EmotionThemeProvider theme={dark}>
<CssBaseline enableColorScheme />
{children}
</EmotionThemeProvider>
</MuiThemeProvider>
</StyledEngineProvider>
);
};

export const AppProviders = ({
children,
queryClient = defaultQueryClient,
}: {
children: ReactNode;
queryClient?: QueryClient;
}) => {
return (
<HelmetProvider>
<StyledEngineProvider injectFirst>
<MuiThemeProvider theme={dark}>
<EmotionThemeProvider theme={dark}>
<CssBaseline enableColorScheme />
<ErrorBoundary>
<QueryClientProvider client={queryClient}>
<AuthProvider>
{children}
<GlobalSnackbar />
</AuthProvider>
</QueryClientProvider>
</ErrorBoundary>
</EmotionThemeProvider>
</MuiThemeProvider>
</StyledEngineProvider>
<ThemeProviders>
<ErrorBoundary>
<QueryClientProvider client={queryClient}>
<AuthProvider>
{children}
<GlobalSnackbar />
</AuthProvider>
</QueryClientProvider>
</ErrorBoundary>
</ThemeProviders>
</HelmetProvider>
);
};
Expand Down
8 changes: 2 additions & 6 deletions site/src/pages/WorkspacePage/WorkspacePage.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -26,10 +26,7 @@ import {
} from "testHelpers/entities";
import * as api from "api/api";
import { Workspace } from "api/typesGenerated";
import {
renderWithAuth,
waitForLoaderToBeRemoved,
} from "testHelpers/renderHelpers";
import { renderWithAuth } from "testHelpers/renderHelpers";
import { server } from "testHelpers/server";
import { WorkspacePage } from "./WorkspacePage";

Expand All @@ -50,8 +47,7 @@ const renderWorkspacePage = async () => {
route: `/@${MockWorkspace.owner_name}/${MockWorkspace.name}`,
path: "/:username/:workspace",
});

await waitForLoaderToBeRemoved();
await screen.findByText(MockWorkspace.name);
};

/**
Expand Down
47 changes: 32 additions & 15 deletions site/src/testHelpers/renderHelpers.tsx
Original file line number Diff line number Diff line change
@@ -1,9 +1,5 @@
import {
render as tlRender,
screen,
waitForElementToBeRemoved,
} from "@testing-library/react";
import { AppProviders } from "App";
import { render as tlRender, screen, waitFor } from "@testing-library/react";
import { AppProviders, ThemeProviders } from "App";
import { DashboardLayout } from "components/Dashboard/DashboardLayout";
import { TemplateSettingsLayout } from "pages/TemplateSettingsPage/TemplateSettingsLayout";
import { WorkspaceSettingsLayout } from "pages/WorkspaceSettingsPage/WorkspaceSettingsLayout";
Expand All @@ -15,14 +11,28 @@ import {
import { RequireAuth } from "../components/RequireAuth/RequireAuth";
import { MockUser } from "./entities";
import { ReactNode } from "react";
import { QueryClient } from "react-query";

export const renderWithRouter = (
router: ReturnType<typeof createMemoryRouter>,
) => {
// Create one query client for each render isolate it avoid other
// tests to be affected
const queryClient = new QueryClient({
defaultOptions: {
queries: {
retry: false,
cacheTime: 0,
refetchOnWindowFocus: false,
networkMode: "offlineFirst",
},
},
});

return {
...tlRender(
<AppProviders>
(<RouterProvider router={router} />)
<AppProviders queryClient={queryClient}>
<RouterProvider router={router} />
</AppProviders>,
),
router,
Expand Down Expand Up @@ -159,10 +169,17 @@ export function renderWithWorkspaceSettingsLayout(
};
}

export const waitForLoaderToBeRemoved = (): Promise<void> =>
// Sometimes, we have pages that are doing a lot of requests to get done, so the
// default timeout of 1_000 is not enough. We should revisit this when we unify
// some of the endpoints
waitForElementToBeRemoved(() => screen.queryByTestId("loader"), {
timeout: 5_000,
});
export const waitForLoaderToBeRemoved = async (): Promise<void> => {
return waitFor(
() => {
expect(screen.queryByTestId("loader")).not.toBeInTheDocument();
},
{
timeout: 5_000,
},
);
};

export const renderComponent = (component: React.ReactNode) => {
return tlRender(<ThemeProviders>{component}</ThemeProviders>);
};