@@ -6,21 +6,21 @@ import {
6
6
MockUser ,
7
7
MockWorkspace ,
8
8
MockWorkspaceQuota ,
9
+ MockWorkspaceRequest ,
9
10
MockWorkspaceRichParametersRequest ,
10
11
MockTemplateVersionParameter1 ,
11
12
MockTemplateVersionParameter2 ,
12
13
MockTemplateVersionParameter3 ,
13
14
MockTemplateVersionExternalAuthGithub ,
14
15
MockOrganization ,
16
+ MockTemplateVersionExternalAuthGithubAuthenticated ,
15
17
} from "testHelpers/entities" ;
16
18
import {
17
19
renderWithAuth ,
18
20
waitForLoaderToBeRemoved ,
19
21
} from "testHelpers/renderHelpers" ;
20
22
import CreateWorkspacePage from "./CreateWorkspacePage" ;
21
23
import { Language } from "./CreateWorkspacePageView" ;
22
- import { server } from "testHelpers/server" ;
23
- import { rest } from "msw" ;
24
24
25
25
const nameLabelText = "Workspace Name" ;
26
26
const createWorkspaceText = "Create Workspace" ;
@@ -185,6 +185,67 @@ describe("CreateWorkspacePage", () => {
185
185
expect ( validationError ) . toBeInTheDocument ( ) ;
186
186
} ) ;
187
187
188
+ it ( "external auth authenticates and succeeds" , async ( ) => {
189
+ jest
190
+ . spyOn ( API , "getWorkspaceQuota" )
191
+ . mockResolvedValueOnce ( MockWorkspaceQuota ) ;
192
+ jest
193
+ . spyOn ( API , "getUsers" )
194
+ . mockResolvedValueOnce ( { users : [ MockUser ] , count : 1 } ) ;
195
+ jest . spyOn ( API , "createWorkspace" ) . mockResolvedValueOnce ( MockWorkspace ) ;
196
+ jest
197
+ . spyOn ( API , "getTemplateVersionExternalAuth" )
198
+ . mockResolvedValue ( [ MockTemplateVersionExternalAuthGithub ] ) ;
199
+
200
+ renderCreateWorkspacePage ( ) ;
201
+ await waitForLoaderToBeRemoved ( ) ;
202
+
203
+ const nameField = await screen . findByLabelText ( nameLabelText ) ;
204
+ // have to use fireEvent b/c userEvent isn't cleaning up properly between tests
205
+ fireEvent . change ( nameField , {
206
+ target : { value : "test" } ,
207
+ } ) ;
208
+
209
+ const githubButton = await screen . findByText ( "Login with GitHub" ) ;
210
+ await userEvent . click ( githubButton ) ;
211
+
212
+ jest
213
+ . spyOn ( API , "getTemplateVersionExternalAuth" )
214
+ . mockResolvedValue ( [ MockTemplateVersionExternalAuthGithubAuthenticated ] ) ;
215
+
216
+ await screen . findByText (
217
+ "Authenticated with GitHub" ,
218
+ { } ,
219
+ { interval : 500 , timeout : 5000 } ,
220
+ ) ;
221
+
222
+ const submitButton = screen . getByText ( createWorkspaceText ) ;
223
+ await userEvent . click ( submitButton ) ;
224
+
225
+ await waitFor ( ( ) =>
226
+ expect ( API . createWorkspace ) . toBeCalledWith (
227
+ MockUser . organization_ids [ 0 ] ,
228
+ MockUser . id ,
229
+ expect . objectContaining ( {
230
+ ...MockWorkspaceRequest ,
231
+ } ) ,
232
+ ) ,
233
+ ) ;
234
+ } ) ;
235
+
236
+ it ( "external auth errors if unauthenticated" , async ( ) => {
237
+ jest
238
+ . spyOn ( API , "getTemplateVersionExternalAuth" )
239
+ . mockResolvedValueOnce ( [ MockTemplateVersionExternalAuthGithub ] ) ;
240
+
241
+ renderCreateWorkspacePage ( ) ;
242
+ await waitForLoaderToBeRemoved ( ) ;
243
+
244
+ await screen . findByText (
245
+ "To create a workspace using the selected template, please ensure you are authenticated with all the external providers listed below." ,
246
+ ) ;
247
+ } ) ;
248
+
188
249
it ( "auto create a workspace if uses mode=auto" , async ( ) => {
189
250
const param = "first_parameter" ;
190
251
const paramValue = "It works!" ;
@@ -259,46 +320,4 @@ describe("CreateWorkspacePage", () => {
259
320
expect ( warningMessage ) . toHaveTextContent ( Language . duplicationWarning ) ;
260
321
expect ( nameInput ) . toHaveValue ( `${ MockWorkspace . name } -copy` ) ;
261
322
} ) ;
262
-
263
- it ( "displays the form after connecting to all the external services" , async ( ) => {
264
- jest . spyOn ( window , "open" ) . mockImplementation ( ( ) => null ) ;
265
- const user = userEvent . setup ( ) ;
266
- const notAuthenticatedExternalAuth = {
267
- ...MockTemplateVersionExternalAuthGithub ,
268
- authenticated : false ,
269
- } ;
270
- server . use (
271
- rest . get (
272
- "/api/v2/templateversions/:versionId/external-auth" ,
273
- ( req , res , ctx ) => {
274
- return res ( ctx . json ( [ notAuthenticatedExternalAuth ] ) ) ;
275
- } ,
276
- ) ,
277
- ) ;
278
- renderCreateWorkspacePage ( ) ;
279
-
280
- await screen . findByText ( "External authentication" ) ;
281
- expect ( screen . queryByRole ( "form" ) ) . not . toBeInTheDocument ( ) ;
282
-
283
- const connectButton = screen . getByRole ( "button" , {
284
- name : / c o n n e c t / i,
285
- } ) ;
286
- server . use (
287
- rest . get (
288
- "/api/v2/templateversions/:versionId/external-auth" ,
289
- ( req , res , ctx ) => {
290
- const authenticatedExternalAuth = {
291
- ...MockTemplateVersionExternalAuthGithub ,
292
- authenticated : true ,
293
- } ;
294
- return res ( ctx . json ( [ authenticatedExternalAuth ] ) ) ;
295
- } ,
296
- ) ,
297
- ) ;
298
- await user . click ( connectButton ) ;
299
- // TODO: Consider improving the timeout by simulating react-query polling.
300
- // Current implementation could not achieve this, further research is
301
- // needed.
302
- await screen . findByRole ( "form" , undefined , { timeout : 10_000 } ) ;
303
- } ) ;
304
323
} ) ;
0 commit comments