@@ -13,29 +13,135 @@ import {
13
13
Provision_Complete ,
14
14
Provision_Response ,
15
15
Resource ,
16
+ RichParameter ,
16
17
} from "./provisionerGenerated"
17
18
import { port } from "./playwright.config"
18
19
import * as ssh from "ssh2"
19
20
import { Duplex } from "stream"
21
+ import { WorkspaceBuildParameter } from "api/typesGenerated"
20
22
21
23
// createWorkspace creates a workspace for a template.
22
24
// It does not wait for it to be running, but it does navigate to the page.
23
25
export const createWorkspace = async (
24
26
page : Page ,
25
27
templateName : string ,
28
+ richParameters : RichParameter [ ] = [ ] ,
29
+ buildParameters : WorkspaceBuildParameter [ ] = [ ] ,
26
30
) : Promise < string > => {
27
31
await page . goto ( "/templates/" + templateName + "/workspace" , {
28
32
waitUntil : "networkidle" ,
29
33
} )
30
34
const name = randomName ( )
31
35
await page . getByLabel ( "name" ) . fill ( name )
36
+
37
+ for ( const buildParameter of buildParameters ) {
38
+ const richParameter = richParameters . find (
39
+ ( richParam ) => richParam . name === buildParameter . name ,
40
+ )
41
+ if ( ! richParameter ) {
42
+ throw new Error (
43
+ "build parameter is expected to be present in rich parameter schema" ,
44
+ )
45
+ }
46
+
47
+ const parameterLabel = await page . waitForSelector (
48
+ "[data-testid='parameter-field-" + richParameter . name + "']" ,
49
+ { state : "visible" } ,
50
+ )
51
+
52
+ if ( richParameter . type === "bool" ) {
53
+ const parameterField = await parameterLabel . waitForSelector (
54
+ "[data-testid='parameter-field-bool'] .MuiRadio-root input[value='" +
55
+ buildParameter . value +
56
+ "']" ,
57
+ )
58
+ await parameterField . check ( )
59
+ } else if ( richParameter . options . length > 0 ) {
60
+ const parameterField = await parameterLabel . waitForSelector (
61
+ "[data-testid='parameter-field-options'] .MuiRadio-root input[value='" +
62
+ buildParameter . value +
63
+ "']" ,
64
+ )
65
+ await parameterField . check ( )
66
+ } else if ( richParameter . type === "list(string)" ) {
67
+ throw new Error ( "not implemented yet" ) // FIXME
68
+ } else {
69
+ // text or number
70
+ const parameterField = await parameterLabel . waitForSelector (
71
+ "[data-testid='parameter-field-text'] input" ,
72
+ )
73
+ await parameterField . fill ( buildParameter . value )
74
+ }
75
+ }
76
+
32
77
await page . getByTestId ( "form-submit" ) . click ( )
33
78
34
79
await expect ( page ) . toHaveURL ( "/@admin/" + name )
35
- await page . getByTestId ( "build-status" ) . isVisible ( )
80
+ await page . waitForSelector ( "[data-testid='build-status']" , {
81
+ state : "visible" ,
82
+ } )
36
83
return name
37
84
}
38
85
86
+ export const verifyParameters = async (
87
+ page : Page ,
88
+ workspaceName : string ,
89
+ richParameters : RichParameter [ ] ,
90
+ expectedBuildParameters : WorkspaceBuildParameter [ ] ,
91
+ ) => {
92
+ await page . goto ( "/@admin/" + workspaceName + "/settings/parameters" , {
93
+ waitUntil : "networkidle" ,
94
+ } )
95
+ await expect ( page ) . toHaveURL (
96
+ "/@admin/" + workspaceName + "/settings/parameters" ,
97
+ )
98
+
99
+ for ( const buildParameter of expectedBuildParameters ) {
100
+ const richParameter = richParameters . find (
101
+ ( richParam ) => richParam . name === buildParameter . name ,
102
+ )
103
+ if ( ! richParameter ) {
104
+ throw new Error (
105
+ "build parameter is expected to be present in rich parameter schema" ,
106
+ )
107
+ }
108
+
109
+ const parameterLabel = await page . waitForSelector (
110
+ "[data-testid='parameter-field-" + richParameter . name + "']" ,
111
+ { state : "visible" } ,
112
+ )
113
+
114
+ const muiDisabled = richParameter . mutable ? "" : ".Mui-disabled"
115
+
116
+ if ( richParameter . type === "bool" ) {
117
+ const parameterField = await parameterLabel . waitForSelector (
118
+ "[data-testid='parameter-field-bool'] .MuiRadio-root.Mui-checked" +
119
+ muiDisabled +
120
+ " input" ,
121
+ )
122
+ const value = await parameterField . inputValue ( )
123
+ expect ( value ) . toEqual ( buildParameter . value )
124
+ } else if ( richParameter . options . length > 0 ) {
125
+ const parameterField = await parameterLabel . waitForSelector (
126
+ "[data-testid='parameter-field-options'] .MuiRadio-root.Mui-checked" +
127
+ muiDisabled +
128
+ " input" ,
129
+ )
130
+ const value = await parameterField . inputValue ( )
131
+ expect ( value ) . toEqual ( buildParameter . value )
132
+ } else if ( richParameter . type === "list(string)" ) {
133
+ throw new Error ( "not implemented yet" ) // FIXME
134
+ } else {
135
+ // text or number
136
+ const parameterField = await parameterLabel . waitForSelector (
137
+ "[data-testid='parameter-field-text'] input" + muiDisabled ,
138
+ )
139
+ const value = await parameterField . inputValue ( )
140
+ expect ( value ) . toEqual ( buildParameter . value )
141
+ }
142
+ }
143
+ }
144
+
39
145
// createTemplate navigates to the /templates/new page and uploads a template
40
146
// with the resources provided in the responses argument.
41
147
export const createTemplate = async (
@@ -401,3 +507,28 @@ const findSessionToken = async (page: Page): Promise<string> => {
401
507
}
402
508
return sessionCookie . value
403
509
}
510
+
511
+ export const echoResponsesWithParameters = (
512
+ richParameters : RichParameter [ ] ,
513
+ ) : EchoProvisionerResponses => {
514
+ return {
515
+ plan : [
516
+ {
517
+ complete : {
518
+ parameters : richParameters ,
519
+ } ,
520
+ } ,
521
+ ] ,
522
+ apply : [
523
+ {
524
+ complete : {
525
+ resources : [
526
+ {
527
+ name : "example" ,
528
+ } ,
529
+ ] ,
530
+ } ,
531
+ } ,
532
+ ] ,
533
+ }
534
+ }
0 commit comments