Skip to content

Commit 6145da8

Browse files
refactor(site): verify external auth before display ws form (#11777)
1 parent 5cbb76b commit 6145da8

11 files changed

+533
-377
lines changed

site/src/pages/CreateWorkspacePage/CreateWorkspacePage.test.tsx

Lines changed: 44 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -6,21 +6,21 @@ import {
66
MockUser,
77
MockWorkspace,
88
MockWorkspaceQuota,
9-
MockWorkspaceRequest,
109
MockWorkspaceRichParametersRequest,
1110
MockTemplateVersionParameter1,
1211
MockTemplateVersionParameter2,
1312
MockTemplateVersionParameter3,
1413
MockTemplateVersionExternalAuthGithub,
1514
MockOrganization,
16-
MockTemplateVersionExternalAuthGithubAuthenticated,
1715
} from "testHelpers/entities";
1816
import {
1917
renderWithAuth,
2018
waitForLoaderToBeRemoved,
2119
} from "testHelpers/renderHelpers";
2220
import CreateWorkspacePage from "./CreateWorkspacePage";
2321
import { Language } from "./CreateWorkspacePageView";
22+
import { server } from "testHelpers/server";
23+
import { rest } from "msw";
2424

2525
const nameLabelText = "Workspace Name";
2626
const createWorkspaceText = "Create Workspace";
@@ -157,63 +157,6 @@ describe("CreateWorkspacePage", () => {
157157
expect(validationError).toBeInTheDocument();
158158
});
159159

160-
it("external auth authenticates and succeeds", async () => {
161-
jest
162-
.spyOn(API, "getWorkspaceQuota")
163-
.mockResolvedValueOnce(MockWorkspaceQuota);
164-
jest
165-
.spyOn(API, "getUsers")
166-
.mockResolvedValueOnce({ users: [MockUser], count: 1 });
167-
jest.spyOn(API, "createWorkspace").mockResolvedValueOnce(MockWorkspace);
168-
jest
169-
.spyOn(API, "getTemplateVersionExternalAuth")
170-
.mockResolvedValue([MockTemplateVersionExternalAuthGithub]);
171-
172-
renderCreateWorkspacePage();
173-
await waitForLoaderToBeRemoved();
174-
175-
const nameField = await screen.findByLabelText(nameLabelText);
176-
// have to use fireEvent b/c userEvent isn't cleaning up properly between tests
177-
fireEvent.change(nameField, {
178-
target: { value: "test" },
179-
});
180-
181-
const githubButton = await screen.findByText("Login with GitHub");
182-
await userEvent.click(githubButton);
183-
184-
jest
185-
.spyOn(API, "getTemplateVersionExternalAuth")
186-
.mockResolvedValue([MockTemplateVersionExternalAuthGithubAuthenticated]);
187-
188-
await screen.findByText("Authenticated with GitHub");
189-
190-
const submitButton = screen.getByText(createWorkspaceText);
191-
await userEvent.click(submitButton);
192-
193-
await waitFor(() =>
194-
expect(API.createWorkspace).toBeCalledWith(
195-
MockUser.organization_ids[0],
196-
MockUser.id,
197-
expect.objectContaining({
198-
...MockWorkspaceRequest,
199-
}),
200-
),
201-
);
202-
});
203-
204-
it("external auth: errors if unauthenticated", async () => {
205-
jest
206-
.spyOn(API, "getTemplateVersionExternalAuth")
207-
.mockResolvedValueOnce([MockTemplateVersionExternalAuthGithub]);
208-
209-
renderCreateWorkspacePage();
210-
await waitForLoaderToBeRemoved();
211-
212-
await screen.findByText(
213-
"To create a workspace using the selected template, please ensure you are authenticated with all the external providers listed below.",
214-
);
215-
});
216-
217160
it("auto create a workspace if uses mode=auto", async () => {
218161
const param = "first_parameter";
219162
const paramValue = "It works!";
@@ -284,4 +227,46 @@ describe("CreateWorkspacePage", () => {
284227
expect(warningMessage).toHaveTextContent(Language.duplicationWarning);
285228
expect(nameInput).toHaveValue(`${MockWorkspace.name}-copy`);
286229
});
230+
231+
it("displays the form after connecting to all the external services", async () => {
232+
jest.spyOn(window, "open").mockImplementation(() => null);
233+
const user = userEvent.setup();
234+
const notAuthenticatedExternalAuth = {
235+
...MockTemplateVersionExternalAuthGithub,
236+
authenticated: false,
237+
};
238+
server.use(
239+
rest.get(
240+
"/api/v2/templateversions/:versionId/external-auth",
241+
(req, res, ctx) => {
242+
return res(ctx.json([notAuthenticatedExternalAuth]));
243+
},
244+
),
245+
);
246+
renderCreateWorkspacePage();
247+
248+
await screen.findByText("External authentication");
249+
expect(screen.queryByRole("form")).not.toBeInTheDocument();
250+
251+
const connectButton = screen.getByRole("button", {
252+
name: /connect/i,
253+
});
254+
server.use(
255+
rest.get(
256+
"/api/v2/templateversions/:versionId/external-auth",
257+
(req, res, ctx) => {
258+
const authenticatedExternalAuth = {
259+
...MockTemplateVersionExternalAuthGithub,
260+
authenticated: true,
261+
};
262+
return res(ctx.json([authenticatedExternalAuth]));
263+
},
264+
),
265+
);
266+
await user.click(connectButton);
267+
// TODO: Consider improving the timeout by simulating react-query polling.
268+
// Current implementation could not achieve this, further research is
269+
// needed.
270+
await screen.findByRole("form", undefined, { timeout: 10_000 });
271+
});
287272
});

site/src/pages/CreateWorkspacePage/CreateWorkspacePageView.stories.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ export const Parameters: Story = {
8989
},
9090
};
9191

92-
export const ExternalAuth: Story = {
92+
export const RequiresExternalAuth: Story = {
9393
args: {
9494
externalAuth: [
9595
{

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy