Skip to content

Commit edbd519

Browse files
chore(site): fix inconsistent fetching results on tests (#10215)
1 parent 43fa434 commit edbd519

File tree

3 files changed

+66
-39
lines changed

3 files changed

+66
-39
lines changed

site/src/App.tsx

Lines changed: 32 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import CssBaseline from "@mui/material/CssBaseline";
22
import { QueryClient, QueryClientProvider } from "react-query";
33
import { AuthProvider } from "components/AuthProvider/AuthProvider";
4-
import { FC, PropsWithChildren } from "react";
4+
import { FC, PropsWithChildren, ReactNode } from "react";
55
import { HelmetProvider } from "react-helmet-async";
66
import { AppRouter } from "./AppRouter";
77
import { ErrorBoundary } from "./components/ErrorBoundary/ErrorBoundary";
@@ -14,7 +14,7 @@ import {
1414
} from "@mui/material/styles";
1515
import { ThemeProvider as EmotionThemeProvider } from "@emotion/react";
1616

17-
const queryClient = new QueryClient({
17+
const defaultQueryClient = new QueryClient({
1818
defaultOptions: {
1919
queries: {
2020
retry: false,
@@ -25,24 +25,38 @@ const queryClient = new QueryClient({
2525
},
2626
});
2727

28-
export const AppProviders: FC<PropsWithChildren> = ({ children }) => {
28+
export const ThemeProviders: FC<PropsWithChildren> = ({ children }) => {
29+
return (
30+
<StyledEngineProvider injectFirst>
31+
<MuiThemeProvider theme={dark}>
32+
<EmotionThemeProvider theme={dark}>
33+
<CssBaseline enableColorScheme />
34+
{children}
35+
</EmotionThemeProvider>
36+
</MuiThemeProvider>
37+
</StyledEngineProvider>
38+
);
39+
};
40+
41+
export const AppProviders = ({
42+
children,
43+
queryClient = defaultQueryClient,
44+
}: {
45+
children: ReactNode;
46+
queryClient?: QueryClient;
47+
}) => {
2948
return (
3049
<HelmetProvider>
31-
<StyledEngineProvider injectFirst>
32-
<MuiThemeProvider theme={dark}>
33-
<EmotionThemeProvider theme={dark}>
34-
<CssBaseline enableColorScheme />
35-
<ErrorBoundary>
36-
<QueryClientProvider client={queryClient}>
37-
<AuthProvider>
38-
{children}
39-
<GlobalSnackbar />
40-
</AuthProvider>
41-
</QueryClientProvider>
42-
</ErrorBoundary>
43-
</EmotionThemeProvider>
44-
</MuiThemeProvider>
45-
</StyledEngineProvider>
50+
<ThemeProviders>
51+
<ErrorBoundary>
52+
<QueryClientProvider client={queryClient}>
53+
<AuthProvider>
54+
{children}
55+
<GlobalSnackbar />
56+
</AuthProvider>
57+
</QueryClientProvider>
58+
</ErrorBoundary>
59+
</ThemeProviders>
4660
</HelmetProvider>
4761
);
4862
};

site/src/pages/WorkspacePage/WorkspacePage.test.tsx

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,7 @@ import {
2626
} from "testHelpers/entities";
2727
import * as api from "api/api";
2828
import { Workspace } from "api/typesGenerated";
29-
import {
30-
renderWithAuth,
31-
waitForLoaderToBeRemoved,
32-
} from "testHelpers/renderHelpers";
29+
import { renderWithAuth } from "testHelpers/renderHelpers";
3330
import { server } from "testHelpers/server";
3431
import { WorkspacePage } from "./WorkspacePage";
3532

@@ -50,8 +47,7 @@ const renderWorkspacePage = async () => {
5047
route: `/@${MockWorkspace.owner_name}/${MockWorkspace.name}`,
5148
path: "/:username/:workspace",
5249
});
53-
54-
await waitForLoaderToBeRemoved();
50+
await screen.findByText(MockWorkspace.name);
5551
};
5652

5753
/**

site/src/testHelpers/renderHelpers.tsx

Lines changed: 32 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,5 @@
1-
import {
2-
render as tlRender,
3-
screen,
4-
waitForElementToBeRemoved,
5-
} from "@testing-library/react";
6-
import { AppProviders } from "App";
1+
import { render as tlRender, screen, waitFor } from "@testing-library/react";
2+
import { AppProviders, ThemeProviders } from "App";
73
import { DashboardLayout } from "components/Dashboard/DashboardLayout";
84
import { TemplateSettingsLayout } from "pages/TemplateSettingsPage/TemplateSettingsLayout";
95
import { WorkspaceSettingsLayout } from "pages/WorkspaceSettingsPage/WorkspaceSettingsLayout";
@@ -15,14 +11,28 @@ import {
1511
import { RequireAuth } from "../components/RequireAuth/RequireAuth";
1612
import { MockUser } from "./entities";
1713
import { ReactNode } from "react";
14+
import { QueryClient } from "react-query";
1815

1916
export const renderWithRouter = (
2017
router: ReturnType<typeof createMemoryRouter>,
2118
) => {
19+
// Create one query client for each render isolate it avoid other
20+
// tests to be affected
21+
const queryClient = new QueryClient({
22+
defaultOptions: {
23+
queries: {
24+
retry: false,
25+
cacheTime: 0,
26+
refetchOnWindowFocus: false,
27+
networkMode: "offlineFirst",
28+
},
29+
},
30+
});
31+
2232
return {
2333
...tlRender(
24-
<AppProviders>
25-
(<RouterProvider router={router} />)
34+
<AppProviders queryClient={queryClient}>
35+
<RouterProvider router={router} />
2636
</AppProviders>,
2737
),
2838
router,
@@ -159,10 +169,17 @@ export function renderWithWorkspaceSettingsLayout(
159169
};
160170
}
161171

162-
export const waitForLoaderToBeRemoved = (): Promise<void> =>
163-
// Sometimes, we have pages that are doing a lot of requests to get done, so the
164-
// default timeout of 1_000 is not enough. We should revisit this when we unify
165-
// some of the endpoints
166-
waitForElementToBeRemoved(() => screen.queryByTestId("loader"), {
167-
timeout: 5_000,
168-
});
172+
export const waitForLoaderToBeRemoved = async (): Promise<void> => {
173+
return waitFor(
174+
() => {
175+
expect(screen.queryByTestId("loader")).not.toBeInTheDocument();
176+
},
177+
{
178+
timeout: 5_000,
179+
},
180+
);
181+
};
182+
183+
export const renderComponent = (component: React.ReactNode) => {
184+
return tlRender(<ThemeProviders>{component}</ThemeProviders>);
185+
};

0 commit comments

Comments
 (0)