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

+44-59
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

+1-1
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)