@digital-ai/devops-page-object-deploy 0.0.7 → 0.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +6 -0
- package/dist/main.js +268 -29
- package/dist/main.js.map +1 -1
- package/dist/module.js +268 -29
- package/dist/module.js.map +1 -1
- package/dist/types.d.ts +28 -14
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
package/dist/main.js
CHANGED
|
@@ -31,19 +31,18 @@ class $f280624787ceceed$export$36d69433c4f81145 extends (0, $ae23b16684112d0b$ex
|
|
|
31
31
|
const title = this.page.getByTitle("digital.ai");
|
|
32
32
|
await (0, $1UEKj$playwrighttest.expect)(title).toBeVisible();
|
|
33
33
|
}
|
|
34
|
+
async clickReports() {
|
|
35
|
+
await this.page.locator("p.MuiTypography-root", {
|
|
36
|
+
hasText: "Reports"
|
|
37
|
+
}).click();
|
|
38
|
+
}
|
|
34
39
|
}
|
|
35
40
|
|
|
36
41
|
|
|
37
42
|
|
|
38
43
|
|
|
39
44
|
class $c949c453826379e3$export$ecdc3cf9d1cfe143 extends (0, $ae23b16684112d0b$export$2b65d1d97338f32b) {
|
|
40
|
-
|
|
41
|
-
* Login with username and password
|
|
42
|
-
* @param userName
|
|
43
|
-
* @param password
|
|
44
|
-
*/ // this should be refactored to take an object and not disable the rule!!
|
|
45
|
-
// eslint-disable-next-line max-params
|
|
46
|
-
async createNewUser(username, fullName, email, password, confirmPassword) {
|
|
45
|
+
/* Create a new user */ async createNewUser(username, email, password) {
|
|
47
46
|
await this.page.locator("p.MuiTypography-root", {
|
|
48
47
|
hasText: "Users"
|
|
49
48
|
}).click();
|
|
@@ -51,33 +50,31 @@ class $c949c453826379e3$export$ecdc3cf9d1cfe143 extends (0, $ae23b16684112d0b$ex
|
|
|
51
50
|
name: "Add user"
|
|
52
51
|
}).click();
|
|
53
52
|
await this.page.locator('input[name="username"]').fill(username);
|
|
54
|
-
await this.page.locator('input[name="fullName"]').fill(
|
|
53
|
+
await this.page.locator('input[name="fullName"]').fill(username);
|
|
55
54
|
await this.page.locator('input[name="email"]').fill(email);
|
|
56
55
|
const passwordInput = this.page.locator('input[name="password"]');
|
|
57
56
|
await passwordInput.click({
|
|
58
57
|
force: true
|
|
59
58
|
});
|
|
60
59
|
await passwordInput.fill(password);
|
|
61
|
-
await this.page.locator('input[name="confirmPassword"]').fill(
|
|
60
|
+
await this.page.locator('input[name="confirmPassword"]').fill(password);
|
|
62
61
|
await this.page.getByRole("button", {
|
|
63
62
|
name: "Save"
|
|
64
63
|
}).click();
|
|
65
64
|
}
|
|
66
|
-
async verifySuccessMessage() {
|
|
65
|
+
/* Verify success message */ async verifySuccessMessage() {
|
|
67
66
|
const SuccessMessage = this.page.getByRole("alertdialog");
|
|
68
67
|
await (0, $1UEKj$playwrighttest.expect)(SuccessMessage).toBeVisible();
|
|
69
68
|
await (0, $1UEKj$playwrighttest.expect)(SuccessMessage).toHaveText(/User ".*" created/i);
|
|
70
69
|
}
|
|
71
|
-
async verifyUserErrorMessage() {
|
|
70
|
+
/* Verify user error message */ async verifyUserErrorMessage() {
|
|
72
71
|
await (0, $1UEKj$playwrighttest.expect)(this.page.locator('.rrt-middle-container[role="alertdialog"]').nth(1)).toContainText(/already in use/i);
|
|
73
72
|
}
|
|
74
|
-
async deleteTheUserAndVerifyItIsDeleted(username) {
|
|
73
|
+
/* Delete the user and verify it is deleted */ async deleteTheUserAndVerifyItIsDeleted(username) {
|
|
75
74
|
await this.page.locator("p.MuiTypography-root", {
|
|
76
75
|
hasText: "Users"
|
|
77
76
|
}).click();
|
|
78
|
-
await this.page.waitForTimeout(10000);
|
|
79
77
|
await this.page.getByPlaceholder("Filter...").fill(username);
|
|
80
|
-
await this.page.waitForTimeout(10000);
|
|
81
78
|
await this.page.locator("td.users-table-actions button.delete.xl-icon.table-action").click();
|
|
82
79
|
await this.page.getByRole("button", {
|
|
83
80
|
name: "Delete",
|
|
@@ -87,13 +84,11 @@ class $c949c453826379e3$export$ecdc3cf9d1cfe143 extends (0, $ae23b16684112d0b$ex
|
|
|
87
84
|
await (0, $1UEKj$playwrighttest.expect)(DeleteMessage).toBeVisible();
|
|
88
85
|
await (0, $1UEKj$playwrighttest.expect)(DeleteMessage).toHaveText(/User ".*" deleted/i);
|
|
89
86
|
}
|
|
90
|
-
async editUserAndVerify(username, editfullname) {
|
|
87
|
+
/* Edit the user and verify the changes */ async editUserAndVerify(username, editfullname) {
|
|
91
88
|
await this.page.locator("p.MuiTypography-root", {
|
|
92
89
|
hasText: "Users"
|
|
93
90
|
}).click();
|
|
94
|
-
await this.page.waitForTimeout(10000);
|
|
95
91
|
await this.page.getByPlaceholder("Filter...").fill(username);
|
|
96
|
-
await this.page.waitForTimeout(10000);
|
|
97
92
|
await this.page.locator("i.icon-edit.dot-i").first().click();
|
|
98
93
|
await this.page.locator('input[name="fullName"]').fill(editfullname);
|
|
99
94
|
await this.page.getByRole("button", {
|
|
@@ -102,9 +97,218 @@ class $c949c453826379e3$export$ecdc3cf9d1cfe143 extends (0, $ae23b16684112d0b$ex
|
|
|
102
97
|
}).click();
|
|
103
98
|
const EditMessage = this.page.getByRole("alertdialog");
|
|
104
99
|
await (0, $1UEKj$playwrighttest.expect)(EditMessage).toBeVisible();
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
100
|
+
await (0, $1UEKj$playwrighttest.expect)(EditMessage).toContainText("Your change was saved");
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
class $647b67e126f2dbe0$export$c88e1d16f82516d extends (0, $ae23b16684112d0b$export$2b65d1d97338f32b) {
|
|
108
|
+
/* Helps to create a LocalHost of type UNIX/Windows/Zos */ async createHostForGivenType(name, type) {
|
|
109
|
+
await this.page.locator('input[name="name"]').fill(name);
|
|
110
|
+
await this.page.locator('label:has-text("Operating system")').locator("xpath=following::input[1]").click();
|
|
111
|
+
await this.page.getByText(type, {
|
|
112
|
+
exact: true
|
|
113
|
+
}).click();
|
|
114
|
+
await this.page.getByRole("button", {
|
|
115
|
+
name: "Save and close"
|
|
116
|
+
}).click();
|
|
117
|
+
const toastMessage = this.page.locator(".redux-toastr .rrt-text:visible");
|
|
118
|
+
await (0, $1UEKj$playwrighttest.expect)(toastMessage).toHaveText("Your change was saved.", {
|
|
119
|
+
timeout: 2000
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
class $64bc587a017c1e89$export$12530425267834a9 extends (0, $ae23b16684112d0b$export$2b65d1d97338f32b) {
|
|
128
|
+
/* Helps to create a new Environment */ async createEnvironment(environmentName, hostName) {
|
|
129
|
+
await this.page.locator('input[name="name"]').fill(environmentName);
|
|
130
|
+
await this.page.locator("i.xl-icon.arrow-down-icon.show-all").nth(0).click();
|
|
131
|
+
await this.page.getByTitle(`Infrastructure/${hostName}`, {
|
|
132
|
+
exact: true
|
|
133
|
+
}).click();
|
|
134
|
+
await this.page.getByRole("button", {
|
|
135
|
+
name: "Save and close"
|
|
136
|
+
}).click();
|
|
137
|
+
const toastMessage = this.page.locator(".redux-toastr .rrt-text:visible");
|
|
138
|
+
await (0, $1UEKj$playwrighttest.expect)(toastMessage).toHaveText("Your change was saved.", {
|
|
139
|
+
timeout: 2000
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
class $408106958eb335da$export$1533b625ec0c75e2 extends (0, $ae23b16684112d0b$export$2b65d1d97338f32b) {
|
|
148
|
+
constructor(page, navigation){
|
|
149
|
+
super(page);
|
|
150
|
+
this.navigation = navigation;
|
|
151
|
+
}
|
|
152
|
+
/* Creates a new application */ async createNewApplication(applicationName) {
|
|
153
|
+
await this.navigation.navigateToApplicationsPage();
|
|
154
|
+
await this.page.locator('input[name="name"]').waitFor({
|
|
155
|
+
state: "visible"
|
|
156
|
+
});
|
|
157
|
+
await this.page.locator('input[name="name"]').click();
|
|
158
|
+
await this.page.locator('input[name="name"]').fill(applicationName);
|
|
159
|
+
await this.page.getByRole("button", {
|
|
160
|
+
name: "Save and close"
|
|
161
|
+
}).click();
|
|
162
|
+
const toastMessage = this.page.locator(".redux-toastr .rrt-text:visible");
|
|
163
|
+
await (0, $1UEKj$playwrighttest.expect)(toastMessage).toHaveText("Your change was saved.", {
|
|
164
|
+
timeout: 2000
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
/* Creates a new deployment package */ async createNewDeploymentPackage(applicationName, packageName) {
|
|
168
|
+
const appDataId = `Applications/${applicationName}`;
|
|
169
|
+
// Expand Applications
|
|
170
|
+
const root = this.page.locator('div[data-id="Applications"] .infinite-tree-node > a');
|
|
171
|
+
await root.click();
|
|
172
|
+
// Hover over app node
|
|
173
|
+
const appNode = this.page.locator(`span[data-id="${appDataId}"]`);
|
|
174
|
+
await (0, $1UEKj$playwrighttest.expect)(appNode).toBeVisible();
|
|
175
|
+
await appNode.hover();
|
|
176
|
+
// Open context menu + create new deployment package
|
|
177
|
+
const contextMenu = this.page.locator(`i.context-menu-button[data-id="${appDataId}"]`);
|
|
178
|
+
await (0, $1UEKj$playwrighttest.expect)(contextMenu).toBeVisible();
|
|
179
|
+
await contextMenu.click();
|
|
180
|
+
await this.page.getByRole("link", {
|
|
181
|
+
name: "New"
|
|
182
|
+
}).click();
|
|
183
|
+
await this.page.getByRole("link", {
|
|
184
|
+
name: "Deployment Package"
|
|
185
|
+
}).click();
|
|
186
|
+
// Fill & save
|
|
187
|
+
const nameInput = this.page.locator('input[name="name"]');
|
|
188
|
+
await nameInput.fill(packageName);
|
|
189
|
+
await this.page.getByRole("button", {
|
|
190
|
+
name: "Save and close"
|
|
191
|
+
}).click();
|
|
192
|
+
const toastMessage = this.page.locator(".redux-toastr .rrt-text:visible");
|
|
193
|
+
await (0, $1UEKj$playwrighttest.expect)(toastMessage).toHaveText("Your change was saved.", {
|
|
194
|
+
timeout: 2000
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
/* Creates a new command application */ async createNewCmdApplication(values) {
|
|
198
|
+
const appDataId = `Applications/${values[0]}`;
|
|
199
|
+
const packageDataId = `Applications/${values[0]}/${values[1]}`;
|
|
200
|
+
// Expand app node and click package
|
|
201
|
+
await this.page.locator(`div[data-id="${appDataId}"] .infinite-tree-node > a`).click();
|
|
202
|
+
const packageNode = this.page.locator(`span[data-id="${packageDataId}"]`).first();
|
|
203
|
+
await (0, $1UEKj$playwrighttest.expect)(packageNode).toBeVisible();
|
|
204
|
+
await packageNode.click();
|
|
205
|
+
// Open context menu
|
|
206
|
+
const packageMenu = this.page.locator(`i.context-menu-button[data-id="${packageDataId}"]`);
|
|
207
|
+
await (0, $1UEKj$playwrighttest.expect)(packageMenu).toBeVisible();
|
|
208
|
+
await packageMenu.click();
|
|
209
|
+
// Create Command application
|
|
210
|
+
await this.page.getByRole("link", {
|
|
211
|
+
name: "New"
|
|
212
|
+
}).click();
|
|
213
|
+
await this.page.getByRole("link", {
|
|
214
|
+
name: "cmd"
|
|
215
|
+
}).click();
|
|
216
|
+
await this.page.getByRole("link", {
|
|
217
|
+
name: "Command"
|
|
218
|
+
}).click();
|
|
219
|
+
await this.page.locator('input[name="name"]').fill(values[2]);
|
|
220
|
+
await this.page.locator('textarea[name="commandLine"]').fill(values[3]);
|
|
221
|
+
const saveBtn = this.page.locator("button", {
|
|
222
|
+
hasText: /^Save$/
|
|
223
|
+
}).first();
|
|
224
|
+
await (0, $1UEKj$playwrighttest.expect)(saveBtn).toBeEnabled();
|
|
225
|
+
await saveBtn.click();
|
|
226
|
+
await this.page.waitForTimeout(3000);
|
|
227
|
+
const toastMessage = this.page.locator(".redux-toastr .rrt-text:visible");
|
|
228
|
+
await (0, $1UEKj$playwrighttest.expect)(toastMessage).toHaveText("Your change was saved.", {
|
|
229
|
+
timeout: 2000
|
|
230
|
+
});
|
|
231
|
+
// Close dialog
|
|
232
|
+
await this.page.locator("i.xl-icon.close-icon").first().click();
|
|
233
|
+
}
|
|
234
|
+
/*Deploy the application*/ async deployApp(values) {
|
|
235
|
+
const versionNode = `Applications/${values[0]}/${values[1]}`;
|
|
236
|
+
await this.page.locator(`i.context-menu-button[data-id="${versionNode}"]`).click();
|
|
237
|
+
await this.page.getByRole("link", {
|
|
238
|
+
name: "Deploy",
|
|
239
|
+
exact: true
|
|
240
|
+
}).click();
|
|
241
|
+
await this.page.locator(`input[name="selections"][value="Environments/${values[2]}"]`).click();
|
|
242
|
+
await this.page.getByRole("button", {
|
|
243
|
+
name: "Continue"
|
|
244
|
+
}).click();
|
|
245
|
+
await this.page.locator(".errors-wrapper").waitFor({
|
|
246
|
+
state: "attached",
|
|
247
|
+
timeout: 2000
|
|
248
|
+
});
|
|
249
|
+
const errorIcon = this.page.locator("a.validation-icons-wrapper.error");
|
|
250
|
+
if (await errorIcon.isVisible()) {
|
|
251
|
+
await this.page.getByRole("button", {
|
|
252
|
+
name: "Deployment Properties"
|
|
253
|
+
}).click();
|
|
254
|
+
await this.page.locator('input[name="username"]').fill(values[3]);
|
|
255
|
+
await this.page.getByRole("button", {
|
|
256
|
+
name: "Save"
|
|
257
|
+
}).click();
|
|
258
|
+
}
|
|
259
|
+
await this.page.locator("button.deploy.xl-primary").click();
|
|
260
|
+
//Get the task id
|
|
261
|
+
this.taskId = await this.page.locator("div.task-id").textContent() || "";
|
|
262
|
+
//Verify no failure and all are done
|
|
263
|
+
const labels = this.page.locator("span.label");
|
|
264
|
+
await (0, $1UEKj$playwrighttest.expect)(labels).toHaveCount(3);
|
|
265
|
+
await (0, $1UEKj$playwrighttest.expect)(labels).toHaveText([
|
|
266
|
+
"EXECUTED",
|
|
267
|
+
"DONE",
|
|
268
|
+
"DONE"
|
|
269
|
+
]);
|
|
270
|
+
//Get the text executed
|
|
271
|
+
await this.page.locator('div[data-id="0_1_1"] .infinite-tree-node > a').click();
|
|
272
|
+
await this.page.getByTitle("Execute Test Command").click();
|
|
273
|
+
this.executedText = await this.page.locator("div.step-log-body pre").nth(1).innerText();
|
|
274
|
+
//Verify in monitoring tab searching with the task id
|
|
275
|
+
await this.page.locator('div[data-id="TASK_MONITOR"] .infinite-tree-node > a').click();
|
|
276
|
+
await this.page.locator('span[data-id="DEPLOYMENT_TASKS"]').dblclick();
|
|
277
|
+
await this.page.waitForTimeout(5000);
|
|
278
|
+
await this.page.locator('div.deployment-task-filter-task-id input[placeholder="Search"]').first().fill(this.taskId);
|
|
279
|
+
const stateText = await this.page.locator("td.tasks-table-state").first().innerText();
|
|
280
|
+
(0, $1UEKj$playwrighttest.expect)(stateText.trim()).toBe("Executed");
|
|
281
|
+
//Click the row to go to deployment screen
|
|
282
|
+
await this.page.locator("table.table.table-striped tbody tr").first().dblclick();
|
|
283
|
+
await this.page.locator("button.finish.xl-primary").click();
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
|
|
288
|
+
|
|
289
|
+
|
|
290
|
+
class $fea68740c371df96$export$b8a443164510a1b4 extends (0, $ae23b16684112d0b$export$2b65d1d97338f32b) {
|
|
291
|
+
/* Clicks on the Deployment Tasks section */ async clickDeploymentTasks() {
|
|
292
|
+
await this.page.locator("p.MuiTypography-root", {
|
|
293
|
+
hasText: "Deployments"
|
|
294
|
+
}).click();
|
|
295
|
+
}
|
|
296
|
+
async verifyTheDeploymentValues(values) {
|
|
297
|
+
await this.page.locator('div.deployment-task-filter-task-id input[placeholder="Search"]:visible').first().fill(values[0]);
|
|
298
|
+
await this.page.waitForSelector("td.report-table-package .deployment-report-package", {
|
|
299
|
+
timeout: 5000
|
|
300
|
+
});
|
|
301
|
+
await (0, $1UEKj$playwrighttest.expect)(this.page.locator("td.report-table-package .deployment-report-package")).toContainText(new RegExp(`${values[2]}\\/${values[3]}`, "i"));
|
|
302
|
+
await (0, $1UEKj$playwrighttest.expect)(this.page.locator("td.report-table-originalType .deployment-report-task-type")).toHaveText(/Initial/i); // Regex ignores case
|
|
303
|
+
await (0, $1UEKj$playwrighttest.expect)(this.page.locator("td.report-table-user .deployment-report-user")).toHaveText("admin");
|
|
304
|
+
//Click the row
|
|
305
|
+
await this.page.locator("td.report-table-package .deployment-report-package").dblclick();
|
|
306
|
+
await this.page.locator('div[data-id="0_1_1"] .infinite-tree-node > a').click();
|
|
307
|
+
await this.page.getByTitle("Execute Test Command").click();
|
|
308
|
+
//Get the log text
|
|
309
|
+
const text = await this.page.locator("div.step-log-body pre").nth(1).innerText();
|
|
310
|
+
//Verify both the log text are same
|
|
311
|
+
(0, $1UEKj$playwrighttest.expect)(text).toContain(values[1]);
|
|
108
312
|
}
|
|
109
313
|
}
|
|
110
314
|
|
|
@@ -114,6 +318,10 @@ class $28788a34e6bbbe3d$export$b8a61e5c71402559 {
|
|
|
114
318
|
this.page = page;
|
|
115
319
|
this.homePage = new (0, $f280624787ceceed$export$36d69433c4f81145)(page);
|
|
116
320
|
this.userPage = new (0, $c949c453826379e3$export$ecdc3cf9d1cfe143)(page);
|
|
321
|
+
this.overthereLocalHostPage = new (0, $647b67e126f2dbe0$export$c88e1d16f82516d)(page);
|
|
322
|
+
this.environmentsPage = new (0, $64bc587a017c1e89$export$12530425267834a9)(page);
|
|
323
|
+
this.applicationsPage = new (0, $408106958eb335da$export$1533b625ec0c75e2)(page, this);
|
|
324
|
+
this.reportsPage = new (0, $fea68740c371df96$export$b8a443164510a1b4)(page);
|
|
117
325
|
}
|
|
118
326
|
async navigateToHomePage() {
|
|
119
327
|
await this.page.goto("/home");
|
|
@@ -127,17 +335,50 @@ class $28788a34e6bbbe3d$export$b8a61e5c71402559 {
|
|
|
127
335
|
const collapseButton = this.page.getByTestId("back-button");
|
|
128
336
|
await collapseButton.click();
|
|
129
337
|
}
|
|
338
|
+
/* Helps to navigate to the Applications page */ async navigateToApplicationsPage() {
|
|
339
|
+
const configNode = this.page.locator('span[data-id="Applications"]');
|
|
340
|
+
await configNode.hover();
|
|
341
|
+
await this.page.locator('i.context-menu-button[data-id="Applications"]').click();
|
|
342
|
+
await this.page.getByRole("link", {
|
|
343
|
+
name: "New"
|
|
344
|
+
}).click();
|
|
345
|
+
await this.page.getByRole("link", {
|
|
346
|
+
name: "Application"
|
|
347
|
+
}).click();
|
|
348
|
+
}
|
|
349
|
+
/* Helps to navigate to the Environments page */ async navigateToEnvironmentsPage() {
|
|
350
|
+
const configNode = this.page.locator('span[data-id="Environments"]');
|
|
351
|
+
await configNode.hover();
|
|
352
|
+
await this.page.locator('i.context-menu-button[data-id="Environments"]').click();
|
|
353
|
+
await this.page.getByRole("link", {
|
|
354
|
+
name: "New"
|
|
355
|
+
}).click();
|
|
356
|
+
await this.page.getByRole("link", {
|
|
357
|
+
name: "Environment"
|
|
358
|
+
}).click();
|
|
359
|
+
}
|
|
360
|
+
/* Helps to navigate to the Overthere LocalHost page */ async navigateToOverthereLocalHostPage() {
|
|
361
|
+
const configNode = this.page.locator('span[data-id="Infrastructure"]');
|
|
362
|
+
await configNode.hover();
|
|
363
|
+
await this.page.locator('i.context-menu-button[data-id="Infrastructure"]').click();
|
|
364
|
+
// await this.page.waitForTimeout(5000);
|
|
365
|
+
await this.page.getByRole("link", {
|
|
366
|
+
name: "New"
|
|
367
|
+
}).click();
|
|
368
|
+
await this.page.getByRole("link", {
|
|
369
|
+
name: "overthere"
|
|
370
|
+
}).click();
|
|
371
|
+
await this.page.getByRole("link", {
|
|
372
|
+
name: "LocalHost"
|
|
373
|
+
}).click();
|
|
374
|
+
}
|
|
130
375
|
}
|
|
131
376
|
|
|
132
377
|
|
|
133
378
|
|
|
134
379
|
|
|
135
380
|
class $365fc3920b0d055f$export$f14c0e3f98d164c0 extends (0, $ae23b16684112d0b$export$2b65d1d97338f32b) {
|
|
136
|
-
|
|
137
|
-
* Login with username and password
|
|
138
|
-
* @param userName
|
|
139
|
-
* @param password
|
|
140
|
-
*/ async login(userName, password) {
|
|
381
|
+
/* Login with username and password*/ async login(userName, password) {
|
|
141
382
|
await this.page.goto("/#/login");
|
|
142
383
|
await (0, $1UEKj$playwrighttest.expect)(this.page).toHaveTitle("Digital.ai Deploy");
|
|
143
384
|
await this.page.getByPlaceholder("user").fill(userName, {
|
|
@@ -152,13 +393,11 @@ class $365fc3920b0d055f$export$f14c0e3f98d164c0 extends (0, $ae23b16684112d0b$ex
|
|
|
152
393
|
timeout: 10000
|
|
153
394
|
});
|
|
154
395
|
}
|
|
155
|
-
async verifyInvalidPasswordMessage() {
|
|
396
|
+
/* Verify invalid password message */ async verifyInvalidPasswordMessage() {
|
|
156
397
|
const errorMessage = this.page.getByText("The username and/or password you have entered is incorrect.");
|
|
157
398
|
await (0, $1UEKj$playwrighttest.expect)(errorMessage).toBeVisible();
|
|
158
399
|
}
|
|
159
|
-
|
|
160
|
-
* Logout as authenticated user
|
|
161
|
-
*/ async logout() {
|
|
400
|
+
/* Logout as authenticated user */ async logout() {
|
|
162
401
|
await this.page.locator("button.dot-avatar").click();
|
|
163
402
|
await this.page.getByText("Log out", {
|
|
164
403
|
exact: true
|
package/dist/main.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"mappings":"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","sources":["apps/deploy/index.ts","apps/deploy/fixtures/index.ts","apps/deploy/pages/index.ts","apps/deploy/pages/homePage.ts","apps/deploy/pages/withPage.ts","apps/deploy/pages/usersPage.ts","apps/deploy/pages/loginPage.ts"],"sourcesContent":["export { test } from './fixtures';\n","import { test as base, Page } from '@playwright/test';\nimport { Navigation } from '../pages';\nimport { LoginPage } from '../pages/loginPage';\n\ntype DeployFixtures = {\n fixtures: Fixtures;\n loginPage: LoginPage;\n navigation: Navigation;\n};\n\nexport const test = base.extend<DeployFixtures>({\n fixtures: async ({ page }, use) => {\n const fixtures = new Fixtures(page);\n await use(fixtures);\n return fixtures;\n },\n loginPage: async ({ page }, use) => {\n const loginPage = new LoginPage(page);\n await use(loginPage);\n return loginPage;\n },\n navigation: async ({ page }, use) => {\n const navigationPage = new Navigation(page);\n await use(navigationPage);\n return navigationPage;\n },\n});\n\nclass Fixtures {\n private readonly page: Page;\n\n constructor(page: Page) {\n this.page = page;\n }\n}\n","import { Page } from '@playwright/test';\nimport { HomePage } from './homePage';\nimport { UserPage } from './usersPage';\n\nexport class Navigation {\n private readonly page: Page;\n homePage: HomePage;\n userPage: UserPage;\n\n constructor(page: Page) {\n this.page = page;\n this.homePage = new HomePage(page);\n this.userPage = new UserPage(page);\n }\n\n async navigateToHomePage(): Promise<void> {\n await this.page.goto('/home');\n }\n\n async navigateToUserPage(): Promise<void> {\n await this.page.locator('p.MuiTypography-root', { hasText: 'User management' }).click();\n }\n\n async clickCollapseSideView(): Promise<void> {\n const collapseButton = this.page.getByTestId('back-button');\n await collapseButton.click();\n }\n}\n","import { expect } from '@playwright/test';\nimport { WithPage } from './withPage';\n\nexport class HomePage extends WithPage {\n async clickUserManagement(): Promise<void> {\n await this.page.locator('p.MuiTypography-root', { hasText: 'User management' }).click();\n await this.page.getByRole('link', { name: 'Users' }).click();\n }\n\n async verifyDeployLogoIsPresent(): Promise<void> {\n const logo = this.page.getByAltText('Deploy');\n await expect(logo).toBeVisible();\n }\n\n async verifyDeployTextIsPresent(): Promise<void> {\n const title = this.page.getByTitle('digital.ai');\n await expect(title).toBeVisible();\n }\n}\n","import { Page } from '@playwright/test';\n\nexport class WithPage {\n protected readonly page: Page;\n\n constructor(page: Page) {\n this.page = page;\n }\n}\n","import { expect } from '@playwright/test';\nimport { WithPage } from './withPage';\n\nexport class UserPage extends WithPage {\n /**\n * Login with username and password\n * @param userName\n * @param password\n */\n // this should be refactored to take an object and not disable the rule!!\n // eslint-disable-next-line max-params\n async createNewUser(\n username: string,\n fullName: string,\n email: string,\n password: string,\n confirmPassword: string,\n ): Promise<void> {\n await this.page.locator('p.MuiTypography-root', { hasText: 'Users' }).click();\n await this.page.getByRole('button', { name: 'Add user' }).click();\n await this.page.locator('input[name=\"username\"]').fill(username);\n await this.page.locator('input[name=\"fullName\"]').fill(fullName);\n await this.page.locator('input[name=\"email\"]').fill(email);\n const passwordInput = this.page.locator('input[name=\"password\"]');\n await passwordInput.click({ force: true });\n await passwordInput.fill(password);\n await this.page.locator('input[name=\"confirmPassword\"]').fill(confirmPassword);\n await this.page.getByRole('button', { name: 'Save' }).click();\n }\n\n async verifySuccessMessage(): Promise<void> {\n const SuccessMessage = this.page.getByRole('alertdialog');\n await expect(SuccessMessage).toBeVisible();\n await expect(SuccessMessage).toHaveText(/User \".*\" created/i);\n }\n\n async verifyUserErrorMessage(): Promise<void> {\n await expect(this.page.locator('.rrt-middle-container[role=\"alertdialog\"]').nth(1)).toContainText(\n /already in use/i,\n );\n }\n\n async deleteTheUserAndVerifyItIsDeleted(username: string): Promise<void> {\n await this.page.locator('p.MuiTypography-root', { hasText: 'Users' }).click();\n await this.page.waitForTimeout(10000);\n await this.page.getByPlaceholder('Filter...').fill(username);\n await this.page.waitForTimeout(10000);\n await this.page.locator('td.users-table-actions button.delete.xl-icon.table-action').click();\n await this.page.getByRole('button', { name: 'Delete', exact: true }).click();\n const DeleteMessage = this.page.getByRole('alertdialog');\n await expect(DeleteMessage).toBeVisible();\n await expect(DeleteMessage).toHaveText(/User \".*\" deleted/i);\n }\n\n async editUserAndVerify(username: string, editfullname: string): Promise<void> {\n await this.page.locator('p.MuiTypography-root', { hasText: 'Users' }).click();\n await this.page.waitForTimeout(10000);\n await this.page.getByPlaceholder('Filter...').fill(username);\n await this.page.waitForTimeout(10000);\n await this.page.locator('i.icon-edit.dot-i').first().click();\n await this.page.locator('input[name=\"fullName\"]').fill(editfullname);\n await this.page.getByRole('button', { name: 'Save', exact: true }).click();\n const EditMessage = this.page.getByRole('alertdialog');\n await expect(EditMessage).toBeVisible();\n const editedUsername = this.page.locator('td.users-table-fullName div').textContent();\n // eslint-disable-next-line no-console\n console.log(editedUsername);\n }\n}\n","import { expect } from '@playwright/test';\nimport { WithPage } from './withPage';\n\nexport class LoginPage extends WithPage {\n /**\n * Login with username and password\n * @param userName\n * @param password\n */\n async login(userName: string, password: string): Promise<void> {\n await this.page.goto('/#/login');\n await expect(this.page).toHaveTitle('Digital.ai Deploy');\n await this.page.getByPlaceholder('user').fill(userName, { timeout: 1000 });\n await this.page.getByPlaceholder('Password').fill(password, { timeout: 10000 });\n await this.page.getByRole('button', { name: 'Log in' }).click({ timeout: 10000 });\n }\n\n async verifyInvalidPasswordMessage(): Promise<void> {\n const errorMessage = this.page.getByText('The username and/or password you have entered is incorrect.');\n await expect(errorMessage).toBeVisible();\n }\n\n /**\n * Logout as authenticated user\n */\n async logout(): Promise<void> {\n await this.page.locator('button.dot-avatar').click();\n await this.page.getByText('Log out', { exact: true }).click();\n await expect(this.page.getByText('Log in').first()).toBeVisible();\n }\n}\n"],"names":[],"version":3,"file":"main.js.map"}
|
|
1
|
+
{"mappings":"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","sources":["apps/deploy/index.ts","apps/deploy/fixtures/index.ts","apps/deploy/pages/index.ts","apps/deploy/pages/homePage.ts","apps/deploy/pages/withPage.ts","apps/deploy/pages/usersPage.ts","apps/deploy/pages/infrastructure/overthereLocalHostPage.ts","apps/deploy/pages/environmentsPage.ts","apps/deploy/pages/applications/applicationsPage.ts","apps/deploy/pages/reportsPage.ts","apps/deploy/pages/loginPage.ts"],"sourcesContent":["export { test } from './fixtures';\n","import { test as base, Page } from '@playwright/test';\nimport { Navigation } from '../pages';\nimport { LoginPage } from '../pages/loginPage';\n\ntype DeployFixtures = {\n fixtures: Fixtures;\n loginPage: LoginPage;\n navigation: Navigation;\n};\n\nexport const test = base.extend<DeployFixtures>({\n fixtures: async ({ page }, use) => {\n const fixtures = new Fixtures(page);\n await use(fixtures);\n return fixtures;\n },\n loginPage: async ({ page }, use) => {\n const loginPage = new LoginPage(page);\n await use(loginPage);\n return loginPage;\n },\n navigation: async ({ page }, use) => {\n const navigationPage = new Navigation(page);\n await use(navigationPage);\n return navigationPage;\n },\n});\n\nclass Fixtures {\n private readonly page: Page;\n\n constructor(page: Page) {\n this.page = page;\n }\n}\n","import { Page } from '@playwright/test';\nimport { HomePage } from './homePage';\nimport { UserPage } from './usersPage';\nimport { OverthereLocalHostPage } from './infrastructure/overthereLocalHostPage';\nimport { EnvironmentsPage } from './environmentsPage';\nimport { ApplicationsPage } from './applications/applicationsPage';\nimport { ReportsPage } from './reportsPage';\n\nexport class Navigation {\n private readonly page: Page;\n homePage: HomePage;\n userPage: UserPage;\n overthereLocalHostPage: OverthereLocalHostPage;\n environmentsPage: EnvironmentsPage;\n applicationsPage: ApplicationsPage;\n reportsPage: ReportsPage;\n\n constructor(page: Page) {\n this.page = page;\n this.homePage = new HomePage(page);\n this.userPage = new UserPage(page);\n this.overthereLocalHostPage = new OverthereLocalHostPage(page);\n this.environmentsPage = new EnvironmentsPage(page);\n this.applicationsPage = new ApplicationsPage(page, this);\n this.reportsPage = new ReportsPage(page);\n }\n\n async navigateToHomePage(): Promise<void> {\n await this.page.goto('/home');\n }\n\n async navigateToUserPage(): Promise<void> {\n await this.page.locator('p.MuiTypography-root', { hasText: 'User management' }).click();\n }\n\n async clickCollapseSideView(): Promise<void> {\n const collapseButton = this.page.getByTestId('back-button');\n await collapseButton.click();\n }\n\n /* Helps to navigate to the Applications page */\n async navigateToApplicationsPage(): Promise<void> {\n const configNode = this.page.locator('span[data-id=\"Applications\"]');\n await configNode.hover();\n await this.page.locator('i.context-menu-button[data-id=\"Applications\"]').click();\n await this.page.getByRole('link', { name: 'New' }).click();\n await this.page.getByRole('link', { name: 'Application' }).click();\n }\n\n /* Helps to navigate to the Environments page */\n async navigateToEnvironmentsPage(): Promise<void> {\n const configNode = this.page.locator('span[data-id=\"Environments\"]');\n await configNode.hover();\n await this.page.locator('i.context-menu-button[data-id=\"Environments\"]').click();\n await this.page.getByRole('link', { name: 'New' }).click();\n await this.page.getByRole('link', { name: 'Environment' }).click();\n }\n\n /* Helps to navigate to the Overthere LocalHost page */\n async navigateToOverthereLocalHostPage(): Promise<void> {\n const configNode = this.page.locator('span[data-id=\"Infrastructure\"]');\n await configNode.hover();\n await this.page.locator('i.context-menu-button[data-id=\"Infrastructure\"]').click();\n // await this.page.waitForTimeout(5000);\n await this.page.getByRole('link', { name: 'New' }).click();\n await this.page.getByRole('link', { name: 'overthere' }).click();\n await this.page.getByRole('link', { name: 'LocalHost' }).click();\n }\n}\n","import { expect } from '@playwright/test';\nimport { WithPage } from './withPage';\n\nexport class HomePage extends WithPage {\n async clickUserManagement(): Promise<void> {\n await this.page.locator('p.MuiTypography-root', { hasText: 'User management' }).click();\n await this.page.getByRole('link', { name: 'Users' }).click();\n }\n\n async verifyDeployLogoIsPresent(): Promise<void> {\n const logo = this.page.getByAltText('Deploy');\n await expect(logo).toBeVisible();\n }\n\n async verifyDeployTextIsPresent(): Promise<void> {\n const title = this.page.getByTitle('digital.ai');\n await expect(title).toBeVisible();\n }\n\n async clickReports(): Promise<void> {\n await this.page.locator('p.MuiTypography-root', { hasText: 'Reports' }).click();\n }\n}\n","import { Page } from '@playwright/test';\n\nexport class WithPage {\n protected readonly page: Page;\n\n constructor(page: Page) {\n this.page = page;\n }\n}\n","import { expect } from '@playwright/test';\nimport { WithPage } from './withPage';\n\nexport class UserPage extends WithPage {\n /* Create a new user */\n async createNewUser(username: string, email: string, password: string): Promise<void> {\n await this.page.locator('p.MuiTypography-root', { hasText: 'Users' }).click();\n await this.page.getByRole('button', { name: 'Add user' }).click();\n await this.page.locator('input[name=\"username\"]').fill(username);\n await this.page.locator('input[name=\"fullName\"]').fill(username);\n await this.page.locator('input[name=\"email\"]').fill(email);\n const passwordInput = this.page.locator('input[name=\"password\"]');\n await passwordInput.click({ force: true });\n await passwordInput.fill(password);\n await this.page.locator('input[name=\"confirmPassword\"]').fill(password);\n await this.page.getByRole('button', { name: 'Save' }).click();\n }\n\n /* Verify success message */\n async verifySuccessMessage(): Promise<void> {\n const SuccessMessage = this.page.getByRole('alertdialog');\n await expect(SuccessMessage).toBeVisible();\n await expect(SuccessMessage).toHaveText(/User \".*\" created/i);\n }\n\n /* Verify user error message */\n async verifyUserErrorMessage(): Promise<void> {\n await expect(this.page.locator('.rrt-middle-container[role=\"alertdialog\"]').nth(1)).toContainText(\n /already in use/i,\n );\n }\n\n /* Delete the user and verify it is deleted */\n async deleteTheUserAndVerifyItIsDeleted(username: string): Promise<void> {\n await this.page.locator('p.MuiTypography-root', { hasText: 'Users' }).click();\n await this.page.getByPlaceholder('Filter...').fill(username);\n await this.page.locator('td.users-table-actions button.delete.xl-icon.table-action').click();\n await this.page.getByRole('button', { name: 'Delete', exact: true }).click();\n const DeleteMessage = this.page.getByRole('alertdialog');\n await expect(DeleteMessage).toBeVisible();\n await expect(DeleteMessage).toHaveText(/User \".*\" deleted/i);\n }\n\n /* Edit the user and verify the changes */\n async editUserAndVerify(username: string, editfullname: string): Promise<void> {\n await this.page.locator('p.MuiTypography-root', { hasText: 'Users' }).click();\n await this.page.getByPlaceholder('Filter...').fill(username);\n await this.page.locator('i.icon-edit.dot-i').first().click();\n await this.page.locator('input[name=\"fullName\"]').fill(editfullname);\n await this.page.getByRole('button', { name: 'Save', exact: true }).click();\n const EditMessage = this.page.getByRole('alertdialog');\n await expect(EditMessage).toBeVisible();\n await expect(EditMessage).toContainText('Your change was saved');\n }\n}\n","import { expect } from '@playwright/test';\nimport { WithPage } from '../withPage';\n\nexport class OverthereLocalHostPage extends WithPage {\n /* Helps to create a LocalHost of type UNIX/Windows/Zos */\n async createHostForGivenType(name: string, type: string): Promise<void> {\n await this.page.locator('input[name=\"name\"]').fill(name);\n await this.page.locator('label:has-text(\"Operating system\")').locator('xpath=following::input[1]').click();\n await this.page.getByText(type, { exact: true }).click();\n await this.page.getByRole('button', { name: 'Save and close' }).click();\n const toastMessage = this.page.locator('.redux-toastr .rrt-text:visible');\n await expect(toastMessage).toHaveText('Your change was saved.', { timeout: 2000 });\n }\n}\n","import { WithPage } from './withPage';\nimport { expect } from '@playwright/test';\n\nexport class EnvironmentsPage extends WithPage {\n /* Helps to create a new Environment */\n async createEnvironment(environmentName: string, hostName: string): Promise<void> {\n await this.page.locator('input[name=\"name\"]').fill(environmentName);\n await this.page.locator('i.xl-icon.arrow-down-icon.show-all').nth(0).click();\n await this.page.getByTitle(`Infrastructure/${hostName}`, { exact: true }).click();\n await this.page.getByRole('button', { name: 'Save and close' }).click();\n const toastMessage = this.page.locator('.redux-toastr .rrt-text:visible');\n await expect(toastMessage).toHaveText('Your change was saved.', { timeout: 2000 });\n }\n}\n","import { expect, Page } from '@playwright/test';\nimport { WithPage } from '../withPage';\nimport { Navigation } from '../index';\n\nexport class ApplicationsPage extends WithPage {\n taskId!: string;\n executedText!: string;\n private navigation: Navigation;\n\n constructor(page: Page, navigation: Navigation) {\n super(page);\n this.navigation = navigation;\n }\n\n /* Creates a new application */\n async createNewApplication(applicationName: string): Promise<void> {\n await this.navigation.navigateToApplicationsPage();\n await this.page.locator('input[name=\"name\"]').waitFor({ state: 'visible' });\n await this.page.locator('input[name=\"name\"]').click();\n await this.page.locator('input[name=\"name\"]').fill(applicationName);\n await this.page.getByRole('button', { name: 'Save and close' }).click();\n const toastMessage = this.page.locator('.redux-toastr .rrt-text:visible');\n await expect(toastMessage).toHaveText('Your change was saved.', { timeout: 2000 });\n }\n\n /* Creates a new deployment package */\n async createNewDeploymentPackage(applicationName: string, packageName: string): Promise<void> {\n const appDataId = `Applications/${applicationName}`;\n\n // Expand Applications\n const root = this.page.locator('div[data-id=\"Applications\"] .infinite-tree-node > a');\n await root.click();\n\n // Hover over app node\n const appNode = this.page.locator(`span[data-id=\"${appDataId}\"]`);\n await expect(appNode).toBeVisible();\n await appNode.hover();\n\n // Open context menu + create new deployment package\n const contextMenu = this.page.locator(`i.context-menu-button[data-id=\"${appDataId}\"]`);\n await expect(contextMenu).toBeVisible();\n await contextMenu.click();\n\n await this.page.getByRole('link', { name: 'New' }).click();\n await this.page.getByRole('link', { name: 'Deployment Package' }).click();\n\n // Fill & save\n const nameInput = this.page.locator('input[name=\"name\"]');\n await nameInput.fill(packageName);\n\n await this.page.getByRole('button', { name: 'Save and close' }).click();\n\n const toastMessage = this.page.locator('.redux-toastr .rrt-text:visible');\n await expect(toastMessage).toHaveText('Your change was saved.', { timeout: 2000 });\n }\n\n /* Creates a new command application */\n async createNewCmdApplication(values: string[]): Promise<void> {\n const appDataId = `Applications/${values[0]}`;\n const packageDataId = `Applications/${values[0]}/${values[1]}`;\n\n // Expand app node and click package\n await this.page.locator(`div[data-id=\"${appDataId}\"] .infinite-tree-node > a`).click();\n const packageNode = this.page.locator(`span[data-id=\"${packageDataId}\"]`).first();\n await expect(packageNode).toBeVisible();\n await packageNode.click();\n\n // Open context menu\n const packageMenu = this.page.locator(`i.context-menu-button[data-id=\"${packageDataId}\"]`);\n await expect(packageMenu).toBeVisible();\n await packageMenu.click();\n\n // Create Command application\n await this.page.getByRole('link', { name: 'New' }).click();\n await this.page.getByRole('link', { name: 'cmd' }).click();\n await this.page.getByRole('link', { name: 'Command' }).click();\n\n await this.page.locator('input[name=\"name\"]').fill(values[2]);\n\n await this.page.locator('textarea[name=\"commandLine\"]').fill(values[3]);\n\n const saveBtn = this.page.locator('button', { hasText: /^Save$/ }).first();\n await expect(saveBtn).toBeEnabled();\n await saveBtn.click();\n await this.page.waitForTimeout(3000);\n\n const toastMessage = this.page.locator('.redux-toastr .rrt-text:visible');\n await expect(toastMessage).toHaveText('Your change was saved.', { timeout: 2000 });\n\n // Close dialog\n await this.page.locator('i.xl-icon.close-icon').first().click();\n }\n\n /*Deploy the application*/\n async deployApp(values: string[]): Promise<void> {\n const versionNode = `Applications/${values[0]}/${values[1]}`;\n await this.page.locator(`i.context-menu-button[data-id=\"${versionNode}\"]`).click();\n await this.page.getByRole('link', { name: 'Deploy', exact: true }).click();\n await this.page.locator(`input[name=\"selections\"][value=\"Environments/${values[2]}\"]`).click();\n await this.page.getByRole('button', { name: 'Continue' }).click();\n\n await this.page.locator('.errors-wrapper').waitFor({ state: 'attached', timeout: 2000 });\n\n const errorIcon = this.page.locator('a.validation-icons-wrapper.error');\n\n if (await errorIcon.isVisible()) {\n await this.page.getByRole('button', { name: 'Deployment Properties' }).click();\n await this.page.locator('input[name=\"username\"]').fill(values[3]);\n await this.page.getByRole('button', { name: 'Save' }).click();\n }\n\n await this.page.locator('button.deploy.xl-primary').click();\n\n //Get the task id\n this.taskId = (await this.page.locator('div.task-id').textContent()) || '';\n\n //Verify no failure and all are done\n const labels = this.page.locator('span.label');\n await expect(labels).toHaveCount(3);\n await expect(labels).toHaveText(['EXECUTED', 'DONE', 'DONE']);\n\n //Get the text executed\n await this.page.locator('div[data-id=\"0_1_1\"] .infinite-tree-node > a').click();\n await this.page.getByTitle('Execute Test Command').click();\n this.executedText = await this.page.locator('div.step-log-body pre').nth(1).innerText();\n\n //Verify in monitoring tab searching with the task id\n await this.page.locator('div[data-id=\"TASK_MONITOR\"] .infinite-tree-node > a').click();\n await this.page.locator('span[data-id=\"DEPLOYMENT_TASKS\"]').dblclick();\n await this.page.waitForTimeout(5000);\n\n await this.page.locator('div.deployment-task-filter-task-id input[placeholder=\"Search\"]').first().fill(this.taskId);\n const stateText = await this.page.locator('td.tasks-table-state').first().innerText();\n expect(stateText.trim()).toBe('Executed');\n\n //Click the row to go to deployment screen\n await this.page.locator('table.table.table-striped tbody tr').first().dblclick();\n\n await this.page.locator('button.finish.xl-primary').click();\n }\n}\n","import { expect } from '@playwright/test';\nimport { WithPage } from './withPage';\n\nexport class ReportsPage extends WithPage {\n /* Clicks on the Deployment Tasks section */\n async clickDeploymentTasks(): Promise<void> {\n await this.page.locator('p.MuiTypography-root', { hasText: 'Deployments' }).click();\n }\n\n async verifyTheDeploymentValues(values: string[]): Promise<void> {\n await this.page\n .locator('div.deployment-task-filter-task-id input[placeholder=\"Search\"]:visible')\n .first()\n .fill(values[0]);\n await this.page.waitForSelector('td.report-table-package .deployment-report-package', { timeout: 5000 });\n await expect(this.page.locator('td.report-table-package .deployment-report-package')).toContainText(\n new RegExp(`${values[2]}\\\\/${values[3]}`, 'i'),\n );\n await expect(this.page.locator('td.report-table-originalType .deployment-report-task-type')).toHaveText(/Initial/i); // Regex ignores case\n await expect(this.page.locator('td.report-table-user .deployment-report-user')).toHaveText('admin');\n\n //Click the row\n await this.page.locator('td.report-table-package .deployment-report-package').dblclick();\n await this.page.locator('div[data-id=\"0_1_1\"] .infinite-tree-node > a').click();\n await this.page.getByTitle('Execute Test Command').click();\n\n //Get the log text\n const text = await this.page.locator('div.step-log-body pre').nth(1).innerText();\n\n //Verify both the log text are same\n expect(text).toContain(values[1]);\n }\n}\n","import { expect } from '@playwright/test';\nimport { WithPage } from './withPage';\n\nexport class LoginPage extends WithPage {\n /* Login with username and password*/\n async login(userName: string, password: string): Promise<void> {\n await this.page.goto('/#/login');\n await expect(this.page).toHaveTitle('Digital.ai Deploy');\n await this.page.getByPlaceholder('user').fill(userName, { timeout: 1000 });\n await this.page.getByPlaceholder('Password').fill(password, { timeout: 10000 });\n await this.page.getByRole('button', { name: 'Log in' }).click({ timeout: 10000 });\n }\n\n /* Verify invalid password message */\n async verifyInvalidPasswordMessage(): Promise<void> {\n const errorMessage = this.page.getByText('The username and/or password you have entered is incorrect.');\n await expect(errorMessage).toBeVisible();\n }\n\n /* Logout as authenticated user */\n async logout(): Promise<void> {\n await this.page.locator('button.dot-avatar').click();\n await this.page.getByText('Log out', { exact: true }).click();\n await expect(this.page.getByText('Log in').first()).toBeVisible();\n }\n}\n"],"names":[],"version":3,"file":"main.js.map"}
|
package/dist/module.js
CHANGED
|
@@ -26,19 +26,18 @@ class $e18c8d3707c8c74c$export$36d69433c4f81145 extends (0, $7d546dcaafadc158$ex
|
|
|
26
26
|
const title = this.page.getByTitle("digital.ai");
|
|
27
27
|
await (0, $lE6ZQ$expect)(title).toBeVisible();
|
|
28
28
|
}
|
|
29
|
+
async clickReports() {
|
|
30
|
+
await this.page.locator("p.MuiTypography-root", {
|
|
31
|
+
hasText: "Reports"
|
|
32
|
+
}).click();
|
|
33
|
+
}
|
|
29
34
|
}
|
|
30
35
|
|
|
31
36
|
|
|
32
37
|
|
|
33
38
|
|
|
34
39
|
class $ca2721b1aeb903c5$export$ecdc3cf9d1cfe143 extends (0, $7d546dcaafadc158$export$2b65d1d97338f32b) {
|
|
35
|
-
|
|
36
|
-
* Login with username and password
|
|
37
|
-
* @param userName
|
|
38
|
-
* @param password
|
|
39
|
-
*/ // this should be refactored to take an object and not disable the rule!!
|
|
40
|
-
// eslint-disable-next-line max-params
|
|
41
|
-
async createNewUser(username, fullName, email, password, confirmPassword) {
|
|
40
|
+
/* Create a new user */ async createNewUser(username, email, password) {
|
|
42
41
|
await this.page.locator("p.MuiTypography-root", {
|
|
43
42
|
hasText: "Users"
|
|
44
43
|
}).click();
|
|
@@ -46,33 +45,31 @@ class $ca2721b1aeb903c5$export$ecdc3cf9d1cfe143 extends (0, $7d546dcaafadc158$ex
|
|
|
46
45
|
name: "Add user"
|
|
47
46
|
}).click();
|
|
48
47
|
await this.page.locator('input[name="username"]').fill(username);
|
|
49
|
-
await this.page.locator('input[name="fullName"]').fill(
|
|
48
|
+
await this.page.locator('input[name="fullName"]').fill(username);
|
|
50
49
|
await this.page.locator('input[name="email"]').fill(email);
|
|
51
50
|
const passwordInput = this.page.locator('input[name="password"]');
|
|
52
51
|
await passwordInput.click({
|
|
53
52
|
force: true
|
|
54
53
|
});
|
|
55
54
|
await passwordInput.fill(password);
|
|
56
|
-
await this.page.locator('input[name="confirmPassword"]').fill(
|
|
55
|
+
await this.page.locator('input[name="confirmPassword"]').fill(password);
|
|
57
56
|
await this.page.getByRole("button", {
|
|
58
57
|
name: "Save"
|
|
59
58
|
}).click();
|
|
60
59
|
}
|
|
61
|
-
async verifySuccessMessage() {
|
|
60
|
+
/* Verify success message */ async verifySuccessMessage() {
|
|
62
61
|
const SuccessMessage = this.page.getByRole("alertdialog");
|
|
63
62
|
await (0, $lE6ZQ$expect)(SuccessMessage).toBeVisible();
|
|
64
63
|
await (0, $lE6ZQ$expect)(SuccessMessage).toHaveText(/User ".*" created/i);
|
|
65
64
|
}
|
|
66
|
-
async verifyUserErrorMessage() {
|
|
65
|
+
/* Verify user error message */ async verifyUserErrorMessage() {
|
|
67
66
|
await (0, $lE6ZQ$expect)(this.page.locator('.rrt-middle-container[role="alertdialog"]').nth(1)).toContainText(/already in use/i);
|
|
68
67
|
}
|
|
69
|
-
async deleteTheUserAndVerifyItIsDeleted(username) {
|
|
68
|
+
/* Delete the user and verify it is deleted */ async deleteTheUserAndVerifyItIsDeleted(username) {
|
|
70
69
|
await this.page.locator("p.MuiTypography-root", {
|
|
71
70
|
hasText: "Users"
|
|
72
71
|
}).click();
|
|
73
|
-
await this.page.waitForTimeout(10000);
|
|
74
72
|
await this.page.getByPlaceholder("Filter...").fill(username);
|
|
75
|
-
await this.page.waitForTimeout(10000);
|
|
76
73
|
await this.page.locator("td.users-table-actions button.delete.xl-icon.table-action").click();
|
|
77
74
|
await this.page.getByRole("button", {
|
|
78
75
|
name: "Delete",
|
|
@@ -82,13 +79,11 @@ class $ca2721b1aeb903c5$export$ecdc3cf9d1cfe143 extends (0, $7d546dcaafadc158$ex
|
|
|
82
79
|
await (0, $lE6ZQ$expect)(DeleteMessage).toBeVisible();
|
|
83
80
|
await (0, $lE6ZQ$expect)(DeleteMessage).toHaveText(/User ".*" deleted/i);
|
|
84
81
|
}
|
|
85
|
-
async editUserAndVerify(username, editfullname) {
|
|
82
|
+
/* Edit the user and verify the changes */ async editUserAndVerify(username, editfullname) {
|
|
86
83
|
await this.page.locator("p.MuiTypography-root", {
|
|
87
84
|
hasText: "Users"
|
|
88
85
|
}).click();
|
|
89
|
-
await this.page.waitForTimeout(10000);
|
|
90
86
|
await this.page.getByPlaceholder("Filter...").fill(username);
|
|
91
|
-
await this.page.waitForTimeout(10000);
|
|
92
87
|
await this.page.locator("i.icon-edit.dot-i").first().click();
|
|
93
88
|
await this.page.locator('input[name="fullName"]').fill(editfullname);
|
|
94
89
|
await this.page.getByRole("button", {
|
|
@@ -97,9 +92,218 @@ class $ca2721b1aeb903c5$export$ecdc3cf9d1cfe143 extends (0, $7d546dcaafadc158$ex
|
|
|
97
92
|
}).click();
|
|
98
93
|
const EditMessage = this.page.getByRole("alertdialog");
|
|
99
94
|
await (0, $lE6ZQ$expect)(EditMessage).toBeVisible();
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
95
|
+
await (0, $lE6ZQ$expect)(EditMessage).toContainText("Your change was saved");
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
class $a4d71fd851704781$export$c88e1d16f82516d extends (0, $7d546dcaafadc158$export$2b65d1d97338f32b) {
|
|
103
|
+
/* Helps to create a LocalHost of type UNIX/Windows/Zos */ async createHostForGivenType(name, type) {
|
|
104
|
+
await this.page.locator('input[name="name"]').fill(name);
|
|
105
|
+
await this.page.locator('label:has-text("Operating system")').locator("xpath=following::input[1]").click();
|
|
106
|
+
await this.page.getByText(type, {
|
|
107
|
+
exact: true
|
|
108
|
+
}).click();
|
|
109
|
+
await this.page.getByRole("button", {
|
|
110
|
+
name: "Save and close"
|
|
111
|
+
}).click();
|
|
112
|
+
const toastMessage = this.page.locator(".redux-toastr .rrt-text:visible");
|
|
113
|
+
await (0, $lE6ZQ$expect)(toastMessage).toHaveText("Your change was saved.", {
|
|
114
|
+
timeout: 2000
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
class $8f7dd2349a88e8b2$export$12530425267834a9 extends (0, $7d546dcaafadc158$export$2b65d1d97338f32b) {
|
|
123
|
+
/* Helps to create a new Environment */ async createEnvironment(environmentName, hostName) {
|
|
124
|
+
await this.page.locator('input[name="name"]').fill(environmentName);
|
|
125
|
+
await this.page.locator("i.xl-icon.arrow-down-icon.show-all").nth(0).click();
|
|
126
|
+
await this.page.getByTitle(`Infrastructure/${hostName}`, {
|
|
127
|
+
exact: true
|
|
128
|
+
}).click();
|
|
129
|
+
await this.page.getByRole("button", {
|
|
130
|
+
name: "Save and close"
|
|
131
|
+
}).click();
|
|
132
|
+
const toastMessage = this.page.locator(".redux-toastr .rrt-text:visible");
|
|
133
|
+
await (0, $lE6ZQ$expect)(toastMessage).toHaveText("Your change was saved.", {
|
|
134
|
+
timeout: 2000
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
class $3fb4750cbb53e5e6$export$1533b625ec0c75e2 extends (0, $7d546dcaafadc158$export$2b65d1d97338f32b) {
|
|
143
|
+
constructor(page, navigation){
|
|
144
|
+
super(page);
|
|
145
|
+
this.navigation = navigation;
|
|
146
|
+
}
|
|
147
|
+
/* Creates a new application */ async createNewApplication(applicationName) {
|
|
148
|
+
await this.navigation.navigateToApplicationsPage();
|
|
149
|
+
await this.page.locator('input[name="name"]').waitFor({
|
|
150
|
+
state: "visible"
|
|
151
|
+
});
|
|
152
|
+
await this.page.locator('input[name="name"]').click();
|
|
153
|
+
await this.page.locator('input[name="name"]').fill(applicationName);
|
|
154
|
+
await this.page.getByRole("button", {
|
|
155
|
+
name: "Save and close"
|
|
156
|
+
}).click();
|
|
157
|
+
const toastMessage = this.page.locator(".redux-toastr .rrt-text:visible");
|
|
158
|
+
await (0, $lE6ZQ$expect)(toastMessage).toHaveText("Your change was saved.", {
|
|
159
|
+
timeout: 2000
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
/* Creates a new deployment package */ async createNewDeploymentPackage(applicationName, packageName) {
|
|
163
|
+
const appDataId = `Applications/${applicationName}`;
|
|
164
|
+
// Expand Applications
|
|
165
|
+
const root = this.page.locator('div[data-id="Applications"] .infinite-tree-node > a');
|
|
166
|
+
await root.click();
|
|
167
|
+
// Hover over app node
|
|
168
|
+
const appNode = this.page.locator(`span[data-id="${appDataId}"]`);
|
|
169
|
+
await (0, $lE6ZQ$expect)(appNode).toBeVisible();
|
|
170
|
+
await appNode.hover();
|
|
171
|
+
// Open context menu + create new deployment package
|
|
172
|
+
const contextMenu = this.page.locator(`i.context-menu-button[data-id="${appDataId}"]`);
|
|
173
|
+
await (0, $lE6ZQ$expect)(contextMenu).toBeVisible();
|
|
174
|
+
await contextMenu.click();
|
|
175
|
+
await this.page.getByRole("link", {
|
|
176
|
+
name: "New"
|
|
177
|
+
}).click();
|
|
178
|
+
await this.page.getByRole("link", {
|
|
179
|
+
name: "Deployment Package"
|
|
180
|
+
}).click();
|
|
181
|
+
// Fill & save
|
|
182
|
+
const nameInput = this.page.locator('input[name="name"]');
|
|
183
|
+
await nameInput.fill(packageName);
|
|
184
|
+
await this.page.getByRole("button", {
|
|
185
|
+
name: "Save and close"
|
|
186
|
+
}).click();
|
|
187
|
+
const toastMessage = this.page.locator(".redux-toastr .rrt-text:visible");
|
|
188
|
+
await (0, $lE6ZQ$expect)(toastMessage).toHaveText("Your change was saved.", {
|
|
189
|
+
timeout: 2000
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
/* Creates a new command application */ async createNewCmdApplication(values) {
|
|
193
|
+
const appDataId = `Applications/${values[0]}`;
|
|
194
|
+
const packageDataId = `Applications/${values[0]}/${values[1]}`;
|
|
195
|
+
// Expand app node and click package
|
|
196
|
+
await this.page.locator(`div[data-id="${appDataId}"] .infinite-tree-node > a`).click();
|
|
197
|
+
const packageNode = this.page.locator(`span[data-id="${packageDataId}"]`).first();
|
|
198
|
+
await (0, $lE6ZQ$expect)(packageNode).toBeVisible();
|
|
199
|
+
await packageNode.click();
|
|
200
|
+
// Open context menu
|
|
201
|
+
const packageMenu = this.page.locator(`i.context-menu-button[data-id="${packageDataId}"]`);
|
|
202
|
+
await (0, $lE6ZQ$expect)(packageMenu).toBeVisible();
|
|
203
|
+
await packageMenu.click();
|
|
204
|
+
// Create Command application
|
|
205
|
+
await this.page.getByRole("link", {
|
|
206
|
+
name: "New"
|
|
207
|
+
}).click();
|
|
208
|
+
await this.page.getByRole("link", {
|
|
209
|
+
name: "cmd"
|
|
210
|
+
}).click();
|
|
211
|
+
await this.page.getByRole("link", {
|
|
212
|
+
name: "Command"
|
|
213
|
+
}).click();
|
|
214
|
+
await this.page.locator('input[name="name"]').fill(values[2]);
|
|
215
|
+
await this.page.locator('textarea[name="commandLine"]').fill(values[3]);
|
|
216
|
+
const saveBtn = this.page.locator("button", {
|
|
217
|
+
hasText: /^Save$/
|
|
218
|
+
}).first();
|
|
219
|
+
await (0, $lE6ZQ$expect)(saveBtn).toBeEnabled();
|
|
220
|
+
await saveBtn.click();
|
|
221
|
+
await this.page.waitForTimeout(3000);
|
|
222
|
+
const toastMessage = this.page.locator(".redux-toastr .rrt-text:visible");
|
|
223
|
+
await (0, $lE6ZQ$expect)(toastMessage).toHaveText("Your change was saved.", {
|
|
224
|
+
timeout: 2000
|
|
225
|
+
});
|
|
226
|
+
// Close dialog
|
|
227
|
+
await this.page.locator("i.xl-icon.close-icon").first().click();
|
|
228
|
+
}
|
|
229
|
+
/*Deploy the application*/ async deployApp(values) {
|
|
230
|
+
const versionNode = `Applications/${values[0]}/${values[1]}`;
|
|
231
|
+
await this.page.locator(`i.context-menu-button[data-id="${versionNode}"]`).click();
|
|
232
|
+
await this.page.getByRole("link", {
|
|
233
|
+
name: "Deploy",
|
|
234
|
+
exact: true
|
|
235
|
+
}).click();
|
|
236
|
+
await this.page.locator(`input[name="selections"][value="Environments/${values[2]}"]`).click();
|
|
237
|
+
await this.page.getByRole("button", {
|
|
238
|
+
name: "Continue"
|
|
239
|
+
}).click();
|
|
240
|
+
await this.page.locator(".errors-wrapper").waitFor({
|
|
241
|
+
state: "attached",
|
|
242
|
+
timeout: 2000
|
|
243
|
+
});
|
|
244
|
+
const errorIcon = this.page.locator("a.validation-icons-wrapper.error");
|
|
245
|
+
if (await errorIcon.isVisible()) {
|
|
246
|
+
await this.page.getByRole("button", {
|
|
247
|
+
name: "Deployment Properties"
|
|
248
|
+
}).click();
|
|
249
|
+
await this.page.locator('input[name="username"]').fill(values[3]);
|
|
250
|
+
await this.page.getByRole("button", {
|
|
251
|
+
name: "Save"
|
|
252
|
+
}).click();
|
|
253
|
+
}
|
|
254
|
+
await this.page.locator("button.deploy.xl-primary").click();
|
|
255
|
+
//Get the task id
|
|
256
|
+
this.taskId = await this.page.locator("div.task-id").textContent() || "";
|
|
257
|
+
//Verify no failure and all are done
|
|
258
|
+
const labels = this.page.locator("span.label");
|
|
259
|
+
await (0, $lE6ZQ$expect)(labels).toHaveCount(3);
|
|
260
|
+
await (0, $lE6ZQ$expect)(labels).toHaveText([
|
|
261
|
+
"EXECUTED",
|
|
262
|
+
"DONE",
|
|
263
|
+
"DONE"
|
|
264
|
+
]);
|
|
265
|
+
//Get the text executed
|
|
266
|
+
await this.page.locator('div[data-id="0_1_1"] .infinite-tree-node > a').click();
|
|
267
|
+
await this.page.getByTitle("Execute Test Command").click();
|
|
268
|
+
this.executedText = await this.page.locator("div.step-log-body pre").nth(1).innerText();
|
|
269
|
+
//Verify in monitoring tab searching with the task id
|
|
270
|
+
await this.page.locator('div[data-id="TASK_MONITOR"] .infinite-tree-node > a').click();
|
|
271
|
+
await this.page.locator('span[data-id="DEPLOYMENT_TASKS"]').dblclick();
|
|
272
|
+
await this.page.waitForTimeout(5000);
|
|
273
|
+
await this.page.locator('div.deployment-task-filter-task-id input[placeholder="Search"]').first().fill(this.taskId);
|
|
274
|
+
const stateText = await this.page.locator("td.tasks-table-state").first().innerText();
|
|
275
|
+
(0, $lE6ZQ$expect)(stateText.trim()).toBe("Executed");
|
|
276
|
+
//Click the row to go to deployment screen
|
|
277
|
+
await this.page.locator("table.table.table-striped tbody tr").first().dblclick();
|
|
278
|
+
await this.page.locator("button.finish.xl-primary").click();
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
|
|
283
|
+
|
|
284
|
+
|
|
285
|
+
class $76bad9b9e6741f37$export$b8a443164510a1b4 extends (0, $7d546dcaafadc158$export$2b65d1d97338f32b) {
|
|
286
|
+
/* Clicks on the Deployment Tasks section */ async clickDeploymentTasks() {
|
|
287
|
+
await this.page.locator("p.MuiTypography-root", {
|
|
288
|
+
hasText: "Deployments"
|
|
289
|
+
}).click();
|
|
290
|
+
}
|
|
291
|
+
async verifyTheDeploymentValues(values) {
|
|
292
|
+
await this.page.locator('div.deployment-task-filter-task-id input[placeholder="Search"]:visible').first().fill(values[0]);
|
|
293
|
+
await this.page.waitForSelector("td.report-table-package .deployment-report-package", {
|
|
294
|
+
timeout: 5000
|
|
295
|
+
});
|
|
296
|
+
await (0, $lE6ZQ$expect)(this.page.locator("td.report-table-package .deployment-report-package")).toContainText(new RegExp(`${values[2]}\\/${values[3]}`, "i"));
|
|
297
|
+
await (0, $lE6ZQ$expect)(this.page.locator("td.report-table-originalType .deployment-report-task-type")).toHaveText(/Initial/i); // Regex ignores case
|
|
298
|
+
await (0, $lE6ZQ$expect)(this.page.locator("td.report-table-user .deployment-report-user")).toHaveText("admin");
|
|
299
|
+
//Click the row
|
|
300
|
+
await this.page.locator("td.report-table-package .deployment-report-package").dblclick();
|
|
301
|
+
await this.page.locator('div[data-id="0_1_1"] .infinite-tree-node > a').click();
|
|
302
|
+
await this.page.getByTitle("Execute Test Command").click();
|
|
303
|
+
//Get the log text
|
|
304
|
+
const text = await this.page.locator("div.step-log-body pre").nth(1).innerText();
|
|
305
|
+
//Verify both the log text are same
|
|
306
|
+
(0, $lE6ZQ$expect)(text).toContain(values[1]);
|
|
103
307
|
}
|
|
104
308
|
}
|
|
105
309
|
|
|
@@ -109,6 +313,10 @@ class $95d5ebc9765b570f$export$b8a61e5c71402559 {
|
|
|
109
313
|
this.page = page;
|
|
110
314
|
this.homePage = new (0, $e18c8d3707c8c74c$export$36d69433c4f81145)(page);
|
|
111
315
|
this.userPage = new (0, $ca2721b1aeb903c5$export$ecdc3cf9d1cfe143)(page);
|
|
316
|
+
this.overthereLocalHostPage = new (0, $a4d71fd851704781$export$c88e1d16f82516d)(page);
|
|
317
|
+
this.environmentsPage = new (0, $8f7dd2349a88e8b2$export$12530425267834a9)(page);
|
|
318
|
+
this.applicationsPage = new (0, $3fb4750cbb53e5e6$export$1533b625ec0c75e2)(page, this);
|
|
319
|
+
this.reportsPage = new (0, $76bad9b9e6741f37$export$b8a443164510a1b4)(page);
|
|
112
320
|
}
|
|
113
321
|
async navigateToHomePage() {
|
|
114
322
|
await this.page.goto("/home");
|
|
@@ -122,17 +330,50 @@ class $95d5ebc9765b570f$export$b8a61e5c71402559 {
|
|
|
122
330
|
const collapseButton = this.page.getByTestId("back-button");
|
|
123
331
|
await collapseButton.click();
|
|
124
332
|
}
|
|
333
|
+
/* Helps to navigate to the Applications page */ async navigateToApplicationsPage() {
|
|
334
|
+
const configNode = this.page.locator('span[data-id="Applications"]');
|
|
335
|
+
await configNode.hover();
|
|
336
|
+
await this.page.locator('i.context-menu-button[data-id="Applications"]').click();
|
|
337
|
+
await this.page.getByRole("link", {
|
|
338
|
+
name: "New"
|
|
339
|
+
}).click();
|
|
340
|
+
await this.page.getByRole("link", {
|
|
341
|
+
name: "Application"
|
|
342
|
+
}).click();
|
|
343
|
+
}
|
|
344
|
+
/* Helps to navigate to the Environments page */ async navigateToEnvironmentsPage() {
|
|
345
|
+
const configNode = this.page.locator('span[data-id="Environments"]');
|
|
346
|
+
await configNode.hover();
|
|
347
|
+
await this.page.locator('i.context-menu-button[data-id="Environments"]').click();
|
|
348
|
+
await this.page.getByRole("link", {
|
|
349
|
+
name: "New"
|
|
350
|
+
}).click();
|
|
351
|
+
await this.page.getByRole("link", {
|
|
352
|
+
name: "Environment"
|
|
353
|
+
}).click();
|
|
354
|
+
}
|
|
355
|
+
/* Helps to navigate to the Overthere LocalHost page */ async navigateToOverthereLocalHostPage() {
|
|
356
|
+
const configNode = this.page.locator('span[data-id="Infrastructure"]');
|
|
357
|
+
await configNode.hover();
|
|
358
|
+
await this.page.locator('i.context-menu-button[data-id="Infrastructure"]').click();
|
|
359
|
+
// await this.page.waitForTimeout(5000);
|
|
360
|
+
await this.page.getByRole("link", {
|
|
361
|
+
name: "New"
|
|
362
|
+
}).click();
|
|
363
|
+
await this.page.getByRole("link", {
|
|
364
|
+
name: "overthere"
|
|
365
|
+
}).click();
|
|
366
|
+
await this.page.getByRole("link", {
|
|
367
|
+
name: "LocalHost"
|
|
368
|
+
}).click();
|
|
369
|
+
}
|
|
125
370
|
}
|
|
126
371
|
|
|
127
372
|
|
|
128
373
|
|
|
129
374
|
|
|
130
375
|
class $c5e912d43cd579b2$export$f14c0e3f98d164c0 extends (0, $7d546dcaafadc158$export$2b65d1d97338f32b) {
|
|
131
|
-
|
|
132
|
-
* Login with username and password
|
|
133
|
-
* @param userName
|
|
134
|
-
* @param password
|
|
135
|
-
*/ async login(userName, password) {
|
|
376
|
+
/* Login with username and password*/ async login(userName, password) {
|
|
136
377
|
await this.page.goto("/#/login");
|
|
137
378
|
await (0, $lE6ZQ$expect)(this.page).toHaveTitle("Digital.ai Deploy");
|
|
138
379
|
await this.page.getByPlaceholder("user").fill(userName, {
|
|
@@ -147,13 +388,11 @@ class $c5e912d43cd579b2$export$f14c0e3f98d164c0 extends (0, $7d546dcaafadc158$ex
|
|
|
147
388
|
timeout: 10000
|
|
148
389
|
});
|
|
149
390
|
}
|
|
150
|
-
async verifyInvalidPasswordMessage() {
|
|
391
|
+
/* Verify invalid password message */ async verifyInvalidPasswordMessage() {
|
|
151
392
|
const errorMessage = this.page.getByText("The username and/or password you have entered is incorrect.");
|
|
152
393
|
await (0, $lE6ZQ$expect)(errorMessage).toBeVisible();
|
|
153
394
|
}
|
|
154
|
-
|
|
155
|
-
* Logout as authenticated user
|
|
156
|
-
*/ async logout() {
|
|
395
|
+
/* Logout as authenticated user */ async logout() {
|
|
157
396
|
await this.page.locator("button.dot-avatar").click();
|
|
158
397
|
await this.page.getByText("Log out", {
|
|
159
398
|
exact: true
|
package/dist/module.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"mappings":"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","sources":["apps/deploy/index.ts","apps/deploy/fixtures/index.ts","apps/deploy/pages/index.ts","apps/deploy/pages/homePage.ts","apps/deploy/pages/withPage.ts","apps/deploy/pages/usersPage.ts","apps/deploy/pages/loginPage.ts"],"sourcesContent":["export { test } from './fixtures';\n","import { test as base, Page } from '@playwright/test';\nimport { Navigation } from '../pages';\nimport { LoginPage } from '../pages/loginPage';\n\ntype DeployFixtures = {\n fixtures: Fixtures;\n loginPage: LoginPage;\n navigation: Navigation;\n};\n\nexport const test = base.extend<DeployFixtures>({\n fixtures: async ({ page }, use) => {\n const fixtures = new Fixtures(page);\n await use(fixtures);\n return fixtures;\n },\n loginPage: async ({ page }, use) => {\n const loginPage = new LoginPage(page);\n await use(loginPage);\n return loginPage;\n },\n navigation: async ({ page }, use) => {\n const navigationPage = new Navigation(page);\n await use(navigationPage);\n return navigationPage;\n },\n});\n\nclass Fixtures {\n private readonly page: Page;\n\n constructor(page: Page) {\n this.page = page;\n }\n}\n","import { Page } from '@playwright/test';\nimport { HomePage } from './homePage';\nimport { UserPage } from './usersPage';\n\nexport class Navigation {\n private readonly page: Page;\n homePage: HomePage;\n userPage: UserPage;\n\n constructor(page: Page) {\n this.page = page;\n this.homePage = new HomePage(page);\n this.userPage = new UserPage(page);\n }\n\n async navigateToHomePage(): Promise<void> {\n await this.page.goto('/home');\n }\n\n async navigateToUserPage(): Promise<void> {\n await this.page.locator('p.MuiTypography-root', { hasText: 'User management' }).click();\n }\n\n async clickCollapseSideView(): Promise<void> {\n const collapseButton = this.page.getByTestId('back-button');\n await collapseButton.click();\n }\n}\n","import { expect } from '@playwright/test';\nimport { WithPage } from './withPage';\n\nexport class HomePage extends WithPage {\n async clickUserManagement(): Promise<void> {\n await this.page.locator('p.MuiTypography-root', { hasText: 'User management' }).click();\n await this.page.getByRole('link', { name: 'Users' }).click();\n }\n\n async verifyDeployLogoIsPresent(): Promise<void> {\n const logo = this.page.getByAltText('Deploy');\n await expect(logo).toBeVisible();\n }\n\n async verifyDeployTextIsPresent(): Promise<void> {\n const title = this.page.getByTitle('digital.ai');\n await expect(title).toBeVisible();\n }\n}\n","import { Page } from '@playwright/test';\n\nexport class WithPage {\n protected readonly page: Page;\n\n constructor(page: Page) {\n this.page = page;\n }\n}\n","import { expect } from '@playwright/test';\nimport { WithPage } from './withPage';\n\nexport class UserPage extends WithPage {\n /**\n * Login with username and password\n * @param userName\n * @param password\n */\n // this should be refactored to take an object and not disable the rule!!\n // eslint-disable-next-line max-params\n async createNewUser(\n username: string,\n fullName: string,\n email: string,\n password: string,\n confirmPassword: string,\n ): Promise<void> {\n await this.page.locator('p.MuiTypography-root', { hasText: 'Users' }).click();\n await this.page.getByRole('button', { name: 'Add user' }).click();\n await this.page.locator('input[name=\"username\"]').fill(username);\n await this.page.locator('input[name=\"fullName\"]').fill(fullName);\n await this.page.locator('input[name=\"email\"]').fill(email);\n const passwordInput = this.page.locator('input[name=\"password\"]');\n await passwordInput.click({ force: true });\n await passwordInput.fill(password);\n await this.page.locator('input[name=\"confirmPassword\"]').fill(confirmPassword);\n await this.page.getByRole('button', { name: 'Save' }).click();\n }\n\n async verifySuccessMessage(): Promise<void> {\n const SuccessMessage = this.page.getByRole('alertdialog');\n await expect(SuccessMessage).toBeVisible();\n await expect(SuccessMessage).toHaveText(/User \".*\" created/i);\n }\n\n async verifyUserErrorMessage(): Promise<void> {\n await expect(this.page.locator('.rrt-middle-container[role=\"alertdialog\"]').nth(1)).toContainText(\n /already in use/i,\n );\n }\n\n async deleteTheUserAndVerifyItIsDeleted(username: string): Promise<void> {\n await this.page.locator('p.MuiTypography-root', { hasText: 'Users' }).click();\n await this.page.waitForTimeout(10000);\n await this.page.getByPlaceholder('Filter...').fill(username);\n await this.page.waitForTimeout(10000);\n await this.page.locator('td.users-table-actions button.delete.xl-icon.table-action').click();\n await this.page.getByRole('button', { name: 'Delete', exact: true }).click();\n const DeleteMessage = this.page.getByRole('alertdialog');\n await expect(DeleteMessage).toBeVisible();\n await expect(DeleteMessage).toHaveText(/User \".*\" deleted/i);\n }\n\n async editUserAndVerify(username: string, editfullname: string): Promise<void> {\n await this.page.locator('p.MuiTypography-root', { hasText: 'Users' }).click();\n await this.page.waitForTimeout(10000);\n await this.page.getByPlaceholder('Filter...').fill(username);\n await this.page.waitForTimeout(10000);\n await this.page.locator('i.icon-edit.dot-i').first().click();\n await this.page.locator('input[name=\"fullName\"]').fill(editfullname);\n await this.page.getByRole('button', { name: 'Save', exact: true }).click();\n const EditMessage = this.page.getByRole('alertdialog');\n await expect(EditMessage).toBeVisible();\n const editedUsername = this.page.locator('td.users-table-fullName div').textContent();\n // eslint-disable-next-line no-console\n console.log(editedUsername);\n }\n}\n","import { expect } from '@playwright/test';\nimport { WithPage } from './withPage';\n\nexport class LoginPage extends WithPage {\n /**\n * Login with username and password\n * @param userName\n * @param password\n */\n async login(userName: string, password: string): Promise<void> {\n await this.page.goto('/#/login');\n await expect(this.page).toHaveTitle('Digital.ai Deploy');\n await this.page.getByPlaceholder('user').fill(userName, { timeout: 1000 });\n await this.page.getByPlaceholder('Password').fill(password, { timeout: 10000 });\n await this.page.getByRole('button', { name: 'Log in' }).click({ timeout: 10000 });\n }\n\n async verifyInvalidPasswordMessage(): Promise<void> {\n const errorMessage = this.page.getByText('The username and/or password you have entered is incorrect.');\n await expect(errorMessage).toBeVisible();\n }\n\n /**\n * Logout as authenticated user\n */\n async logout(): Promise<void> {\n await this.page.locator('button.dot-avatar').click();\n await this.page.getByText('Log out', { exact: true }).click();\n await expect(this.page.getByText('Log in').first()).toBeVisible();\n }\n}\n"],"names":[],"version":3,"file":"module.js.map"}
|
|
1
|
+
{"mappings":"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","sources":["apps/deploy/index.ts","apps/deploy/fixtures/index.ts","apps/deploy/pages/index.ts","apps/deploy/pages/homePage.ts","apps/deploy/pages/withPage.ts","apps/deploy/pages/usersPage.ts","apps/deploy/pages/infrastructure/overthereLocalHostPage.ts","apps/deploy/pages/environmentsPage.ts","apps/deploy/pages/applications/applicationsPage.ts","apps/deploy/pages/reportsPage.ts","apps/deploy/pages/loginPage.ts"],"sourcesContent":["export { test } from './fixtures';\n","import { test as base, Page } from '@playwright/test';\nimport { Navigation } from '../pages';\nimport { LoginPage } from '../pages/loginPage';\n\ntype DeployFixtures = {\n fixtures: Fixtures;\n loginPage: LoginPage;\n navigation: Navigation;\n};\n\nexport const test = base.extend<DeployFixtures>({\n fixtures: async ({ page }, use) => {\n const fixtures = new Fixtures(page);\n await use(fixtures);\n return fixtures;\n },\n loginPage: async ({ page }, use) => {\n const loginPage = new LoginPage(page);\n await use(loginPage);\n return loginPage;\n },\n navigation: async ({ page }, use) => {\n const navigationPage = new Navigation(page);\n await use(navigationPage);\n return navigationPage;\n },\n});\n\nclass Fixtures {\n private readonly page: Page;\n\n constructor(page: Page) {\n this.page = page;\n }\n}\n","import { Page } from '@playwright/test';\nimport { HomePage } from './homePage';\nimport { UserPage } from './usersPage';\nimport { OverthereLocalHostPage } from './infrastructure/overthereLocalHostPage';\nimport { EnvironmentsPage } from './environmentsPage';\nimport { ApplicationsPage } from './applications/applicationsPage';\nimport { ReportsPage } from './reportsPage';\n\nexport class Navigation {\n private readonly page: Page;\n homePage: HomePage;\n userPage: UserPage;\n overthereLocalHostPage: OverthereLocalHostPage;\n environmentsPage: EnvironmentsPage;\n applicationsPage: ApplicationsPage;\n reportsPage: ReportsPage;\n\n constructor(page: Page) {\n this.page = page;\n this.homePage = new HomePage(page);\n this.userPage = new UserPage(page);\n this.overthereLocalHostPage = new OverthereLocalHostPage(page);\n this.environmentsPage = new EnvironmentsPage(page);\n this.applicationsPage = new ApplicationsPage(page, this);\n this.reportsPage = new ReportsPage(page);\n }\n\n async navigateToHomePage(): Promise<void> {\n await this.page.goto('/home');\n }\n\n async navigateToUserPage(): Promise<void> {\n await this.page.locator('p.MuiTypography-root', { hasText: 'User management' }).click();\n }\n\n async clickCollapseSideView(): Promise<void> {\n const collapseButton = this.page.getByTestId('back-button');\n await collapseButton.click();\n }\n\n /* Helps to navigate to the Applications page */\n async navigateToApplicationsPage(): Promise<void> {\n const configNode = this.page.locator('span[data-id=\"Applications\"]');\n await configNode.hover();\n await this.page.locator('i.context-menu-button[data-id=\"Applications\"]').click();\n await this.page.getByRole('link', { name: 'New' }).click();\n await this.page.getByRole('link', { name: 'Application' }).click();\n }\n\n /* Helps to navigate to the Environments page */\n async navigateToEnvironmentsPage(): Promise<void> {\n const configNode = this.page.locator('span[data-id=\"Environments\"]');\n await configNode.hover();\n await this.page.locator('i.context-menu-button[data-id=\"Environments\"]').click();\n await this.page.getByRole('link', { name: 'New' }).click();\n await this.page.getByRole('link', { name: 'Environment' }).click();\n }\n\n /* Helps to navigate to the Overthere LocalHost page */\n async navigateToOverthereLocalHostPage(): Promise<void> {\n const configNode = this.page.locator('span[data-id=\"Infrastructure\"]');\n await configNode.hover();\n await this.page.locator('i.context-menu-button[data-id=\"Infrastructure\"]').click();\n // await this.page.waitForTimeout(5000);\n await this.page.getByRole('link', { name: 'New' }).click();\n await this.page.getByRole('link', { name: 'overthere' }).click();\n await this.page.getByRole('link', { name: 'LocalHost' }).click();\n }\n}\n","import { expect } from '@playwright/test';\nimport { WithPage } from './withPage';\n\nexport class HomePage extends WithPage {\n async clickUserManagement(): Promise<void> {\n await this.page.locator('p.MuiTypography-root', { hasText: 'User management' }).click();\n await this.page.getByRole('link', { name: 'Users' }).click();\n }\n\n async verifyDeployLogoIsPresent(): Promise<void> {\n const logo = this.page.getByAltText('Deploy');\n await expect(logo).toBeVisible();\n }\n\n async verifyDeployTextIsPresent(): Promise<void> {\n const title = this.page.getByTitle('digital.ai');\n await expect(title).toBeVisible();\n }\n\n async clickReports(): Promise<void> {\n await this.page.locator('p.MuiTypography-root', { hasText: 'Reports' }).click();\n }\n}\n","import { Page } from '@playwright/test';\n\nexport class WithPage {\n protected readonly page: Page;\n\n constructor(page: Page) {\n this.page = page;\n }\n}\n","import { expect } from '@playwright/test';\nimport { WithPage } from './withPage';\n\nexport class UserPage extends WithPage {\n /* Create a new user */\n async createNewUser(username: string, email: string, password: string): Promise<void> {\n await this.page.locator('p.MuiTypography-root', { hasText: 'Users' }).click();\n await this.page.getByRole('button', { name: 'Add user' }).click();\n await this.page.locator('input[name=\"username\"]').fill(username);\n await this.page.locator('input[name=\"fullName\"]').fill(username);\n await this.page.locator('input[name=\"email\"]').fill(email);\n const passwordInput = this.page.locator('input[name=\"password\"]');\n await passwordInput.click({ force: true });\n await passwordInput.fill(password);\n await this.page.locator('input[name=\"confirmPassword\"]').fill(password);\n await this.page.getByRole('button', { name: 'Save' }).click();\n }\n\n /* Verify success message */\n async verifySuccessMessage(): Promise<void> {\n const SuccessMessage = this.page.getByRole('alertdialog');\n await expect(SuccessMessage).toBeVisible();\n await expect(SuccessMessage).toHaveText(/User \".*\" created/i);\n }\n\n /* Verify user error message */\n async verifyUserErrorMessage(): Promise<void> {\n await expect(this.page.locator('.rrt-middle-container[role=\"alertdialog\"]').nth(1)).toContainText(\n /already in use/i,\n );\n }\n\n /* Delete the user and verify it is deleted */\n async deleteTheUserAndVerifyItIsDeleted(username: string): Promise<void> {\n await this.page.locator('p.MuiTypography-root', { hasText: 'Users' }).click();\n await this.page.getByPlaceholder('Filter...').fill(username);\n await this.page.locator('td.users-table-actions button.delete.xl-icon.table-action').click();\n await this.page.getByRole('button', { name: 'Delete', exact: true }).click();\n const DeleteMessage = this.page.getByRole('alertdialog');\n await expect(DeleteMessage).toBeVisible();\n await expect(DeleteMessage).toHaveText(/User \".*\" deleted/i);\n }\n\n /* Edit the user and verify the changes */\n async editUserAndVerify(username: string, editfullname: string): Promise<void> {\n await this.page.locator('p.MuiTypography-root', { hasText: 'Users' }).click();\n await this.page.getByPlaceholder('Filter...').fill(username);\n await this.page.locator('i.icon-edit.dot-i').first().click();\n await this.page.locator('input[name=\"fullName\"]').fill(editfullname);\n await this.page.getByRole('button', { name: 'Save', exact: true }).click();\n const EditMessage = this.page.getByRole('alertdialog');\n await expect(EditMessage).toBeVisible();\n await expect(EditMessage).toContainText('Your change was saved');\n }\n}\n","import { expect } from '@playwright/test';\nimport { WithPage } from '../withPage';\n\nexport class OverthereLocalHostPage extends WithPage {\n /* Helps to create a LocalHost of type UNIX/Windows/Zos */\n async createHostForGivenType(name: string, type: string): Promise<void> {\n await this.page.locator('input[name=\"name\"]').fill(name);\n await this.page.locator('label:has-text(\"Operating system\")').locator('xpath=following::input[1]').click();\n await this.page.getByText(type, { exact: true }).click();\n await this.page.getByRole('button', { name: 'Save and close' }).click();\n const toastMessage = this.page.locator('.redux-toastr .rrt-text:visible');\n await expect(toastMessage).toHaveText('Your change was saved.', { timeout: 2000 });\n }\n}\n","import { WithPage } from './withPage';\nimport { expect } from '@playwright/test';\n\nexport class EnvironmentsPage extends WithPage {\n /* Helps to create a new Environment */\n async createEnvironment(environmentName: string, hostName: string): Promise<void> {\n await this.page.locator('input[name=\"name\"]').fill(environmentName);\n await this.page.locator('i.xl-icon.arrow-down-icon.show-all').nth(0).click();\n await this.page.getByTitle(`Infrastructure/${hostName}`, { exact: true }).click();\n await this.page.getByRole('button', { name: 'Save and close' }).click();\n const toastMessage = this.page.locator('.redux-toastr .rrt-text:visible');\n await expect(toastMessage).toHaveText('Your change was saved.', { timeout: 2000 });\n }\n}\n","import { expect, Page } from '@playwright/test';\nimport { WithPage } from '../withPage';\nimport { Navigation } from '../index';\n\nexport class ApplicationsPage extends WithPage {\n taskId!: string;\n executedText!: string;\n private navigation: Navigation;\n\n constructor(page: Page, navigation: Navigation) {\n super(page);\n this.navigation = navigation;\n }\n\n /* Creates a new application */\n async createNewApplication(applicationName: string): Promise<void> {\n await this.navigation.navigateToApplicationsPage();\n await this.page.locator('input[name=\"name\"]').waitFor({ state: 'visible' });\n await this.page.locator('input[name=\"name\"]').click();\n await this.page.locator('input[name=\"name\"]').fill(applicationName);\n await this.page.getByRole('button', { name: 'Save and close' }).click();\n const toastMessage = this.page.locator('.redux-toastr .rrt-text:visible');\n await expect(toastMessage).toHaveText('Your change was saved.', { timeout: 2000 });\n }\n\n /* Creates a new deployment package */\n async createNewDeploymentPackage(applicationName: string, packageName: string): Promise<void> {\n const appDataId = `Applications/${applicationName}`;\n\n // Expand Applications\n const root = this.page.locator('div[data-id=\"Applications\"] .infinite-tree-node > a');\n await root.click();\n\n // Hover over app node\n const appNode = this.page.locator(`span[data-id=\"${appDataId}\"]`);\n await expect(appNode).toBeVisible();\n await appNode.hover();\n\n // Open context menu + create new deployment package\n const contextMenu = this.page.locator(`i.context-menu-button[data-id=\"${appDataId}\"]`);\n await expect(contextMenu).toBeVisible();\n await contextMenu.click();\n\n await this.page.getByRole('link', { name: 'New' }).click();\n await this.page.getByRole('link', { name: 'Deployment Package' }).click();\n\n // Fill & save\n const nameInput = this.page.locator('input[name=\"name\"]');\n await nameInput.fill(packageName);\n\n await this.page.getByRole('button', { name: 'Save and close' }).click();\n\n const toastMessage = this.page.locator('.redux-toastr .rrt-text:visible');\n await expect(toastMessage).toHaveText('Your change was saved.', { timeout: 2000 });\n }\n\n /* Creates a new command application */\n async createNewCmdApplication(values: string[]): Promise<void> {\n const appDataId = `Applications/${values[0]}`;\n const packageDataId = `Applications/${values[0]}/${values[1]}`;\n\n // Expand app node and click package\n await this.page.locator(`div[data-id=\"${appDataId}\"] .infinite-tree-node > a`).click();\n const packageNode = this.page.locator(`span[data-id=\"${packageDataId}\"]`).first();\n await expect(packageNode).toBeVisible();\n await packageNode.click();\n\n // Open context menu\n const packageMenu = this.page.locator(`i.context-menu-button[data-id=\"${packageDataId}\"]`);\n await expect(packageMenu).toBeVisible();\n await packageMenu.click();\n\n // Create Command application\n await this.page.getByRole('link', { name: 'New' }).click();\n await this.page.getByRole('link', { name: 'cmd' }).click();\n await this.page.getByRole('link', { name: 'Command' }).click();\n\n await this.page.locator('input[name=\"name\"]').fill(values[2]);\n\n await this.page.locator('textarea[name=\"commandLine\"]').fill(values[3]);\n\n const saveBtn = this.page.locator('button', { hasText: /^Save$/ }).first();\n await expect(saveBtn).toBeEnabled();\n await saveBtn.click();\n await this.page.waitForTimeout(3000);\n\n const toastMessage = this.page.locator('.redux-toastr .rrt-text:visible');\n await expect(toastMessage).toHaveText('Your change was saved.', { timeout: 2000 });\n\n // Close dialog\n await this.page.locator('i.xl-icon.close-icon').first().click();\n }\n\n /*Deploy the application*/\n async deployApp(values: string[]): Promise<void> {\n const versionNode = `Applications/${values[0]}/${values[1]}`;\n await this.page.locator(`i.context-menu-button[data-id=\"${versionNode}\"]`).click();\n await this.page.getByRole('link', { name: 'Deploy', exact: true }).click();\n await this.page.locator(`input[name=\"selections\"][value=\"Environments/${values[2]}\"]`).click();\n await this.page.getByRole('button', { name: 'Continue' }).click();\n\n await this.page.locator('.errors-wrapper').waitFor({ state: 'attached', timeout: 2000 });\n\n const errorIcon = this.page.locator('a.validation-icons-wrapper.error');\n\n if (await errorIcon.isVisible()) {\n await this.page.getByRole('button', { name: 'Deployment Properties' }).click();\n await this.page.locator('input[name=\"username\"]').fill(values[3]);\n await this.page.getByRole('button', { name: 'Save' }).click();\n }\n\n await this.page.locator('button.deploy.xl-primary').click();\n\n //Get the task id\n this.taskId = (await this.page.locator('div.task-id').textContent()) || '';\n\n //Verify no failure and all are done\n const labels = this.page.locator('span.label');\n await expect(labels).toHaveCount(3);\n await expect(labels).toHaveText(['EXECUTED', 'DONE', 'DONE']);\n\n //Get the text executed\n await this.page.locator('div[data-id=\"0_1_1\"] .infinite-tree-node > a').click();\n await this.page.getByTitle('Execute Test Command').click();\n this.executedText = await this.page.locator('div.step-log-body pre').nth(1).innerText();\n\n //Verify in monitoring tab searching with the task id\n await this.page.locator('div[data-id=\"TASK_MONITOR\"] .infinite-tree-node > a').click();\n await this.page.locator('span[data-id=\"DEPLOYMENT_TASKS\"]').dblclick();\n await this.page.waitForTimeout(5000);\n\n await this.page.locator('div.deployment-task-filter-task-id input[placeholder=\"Search\"]').first().fill(this.taskId);\n const stateText = await this.page.locator('td.tasks-table-state').first().innerText();\n expect(stateText.trim()).toBe('Executed');\n\n //Click the row to go to deployment screen\n await this.page.locator('table.table.table-striped tbody tr').first().dblclick();\n\n await this.page.locator('button.finish.xl-primary').click();\n }\n}\n","import { expect } from '@playwright/test';\nimport { WithPage } from './withPage';\n\nexport class ReportsPage extends WithPage {\n /* Clicks on the Deployment Tasks section */\n async clickDeploymentTasks(): Promise<void> {\n await this.page.locator('p.MuiTypography-root', { hasText: 'Deployments' }).click();\n }\n\n async verifyTheDeploymentValues(values: string[]): Promise<void> {\n await this.page\n .locator('div.deployment-task-filter-task-id input[placeholder=\"Search\"]:visible')\n .first()\n .fill(values[0]);\n await this.page.waitForSelector('td.report-table-package .deployment-report-package', { timeout: 5000 });\n await expect(this.page.locator('td.report-table-package .deployment-report-package')).toContainText(\n new RegExp(`${values[2]}\\\\/${values[3]}`, 'i'),\n );\n await expect(this.page.locator('td.report-table-originalType .deployment-report-task-type')).toHaveText(/Initial/i); // Regex ignores case\n await expect(this.page.locator('td.report-table-user .deployment-report-user')).toHaveText('admin');\n\n //Click the row\n await this.page.locator('td.report-table-package .deployment-report-package').dblclick();\n await this.page.locator('div[data-id=\"0_1_1\"] .infinite-tree-node > a').click();\n await this.page.getByTitle('Execute Test Command').click();\n\n //Get the log text\n const text = await this.page.locator('div.step-log-body pre').nth(1).innerText();\n\n //Verify both the log text are same\n expect(text).toContain(values[1]);\n }\n}\n","import { expect } from '@playwright/test';\nimport { WithPage } from './withPage';\n\nexport class LoginPage extends WithPage {\n /* Login with username and password*/\n async login(userName: string, password: string): Promise<void> {\n await this.page.goto('/#/login');\n await expect(this.page).toHaveTitle('Digital.ai Deploy');\n await this.page.getByPlaceholder('user').fill(userName, { timeout: 1000 });\n await this.page.getByPlaceholder('Password').fill(password, { timeout: 10000 });\n await this.page.getByRole('button', { name: 'Log in' }).click({ timeout: 10000 });\n }\n\n /* Verify invalid password message */\n async verifyInvalidPasswordMessage(): Promise<void> {\n const errorMessage = this.page.getByText('The username and/or password you have entered is incorrect.');\n await expect(errorMessage).toBeVisible();\n }\n\n /* Logout as authenticated user */\n async logout(): Promise<void> {\n await this.page.locator('button.dot-avatar').click();\n await this.page.getByText('Log out', { exact: true }).click();\n await expect(this.page.getByText('Log in').first()).toBeVisible();\n }\n}\n"],"names":[],"version":3,"file":"module.js.map"}
|
package/dist/types.d.ts
CHANGED
|
@@ -7,38 +7,52 @@ declare class HomePage extends WithPage {
|
|
|
7
7
|
clickUserManagement(): Promise<void>;
|
|
8
8
|
verifyDeployLogoIsPresent(): Promise<void>;
|
|
9
9
|
verifyDeployTextIsPresent(): Promise<void>;
|
|
10
|
+
clickReports(): Promise<void>;
|
|
10
11
|
}
|
|
11
12
|
declare class UserPage extends WithPage {
|
|
12
|
-
|
|
13
|
-
* Login with username and password
|
|
14
|
-
* @param userName
|
|
15
|
-
* @param password
|
|
16
|
-
*/
|
|
17
|
-
createNewUser(username: string, fullName: string, email: string, password: string, confirmPassword: string): Promise<void>;
|
|
13
|
+
createNewUser(username: string, email: string, password: string): Promise<void>;
|
|
18
14
|
verifySuccessMessage(): Promise<void>;
|
|
19
15
|
verifyUserErrorMessage(): Promise<void>;
|
|
20
16
|
deleteTheUserAndVerifyItIsDeleted(username: string): Promise<void>;
|
|
21
17
|
editUserAndVerify(username: string, editfullname: string): Promise<void>;
|
|
22
18
|
}
|
|
19
|
+
declare class OverthereLocalHostPage extends WithPage {
|
|
20
|
+
createHostForGivenType(name: string, type: string): Promise<void>;
|
|
21
|
+
}
|
|
22
|
+
declare class EnvironmentsPage extends WithPage {
|
|
23
|
+
createEnvironment(environmentName: string, hostName: string): Promise<void>;
|
|
24
|
+
}
|
|
25
|
+
declare class ApplicationsPage extends WithPage {
|
|
26
|
+
taskId: string;
|
|
27
|
+
executedText: string;
|
|
28
|
+
constructor(page: Page, navigation: Navigation);
|
|
29
|
+
createNewApplication(applicationName: string): Promise<void>;
|
|
30
|
+
createNewDeploymentPackage(applicationName: string, packageName: string): Promise<void>;
|
|
31
|
+
createNewCmdApplication(values: string[]): Promise<void>;
|
|
32
|
+
deployApp(values: string[]): Promise<void>;
|
|
33
|
+
}
|
|
34
|
+
declare class ReportsPage extends WithPage {
|
|
35
|
+
clickDeploymentTasks(): Promise<void>;
|
|
36
|
+
verifyTheDeploymentValues(values: string[]): Promise<void>;
|
|
37
|
+
}
|
|
23
38
|
declare class Navigation {
|
|
24
39
|
homePage: HomePage;
|
|
25
40
|
userPage: UserPage;
|
|
41
|
+
overthereLocalHostPage: OverthereLocalHostPage;
|
|
42
|
+
environmentsPage: EnvironmentsPage;
|
|
43
|
+
applicationsPage: ApplicationsPage;
|
|
44
|
+
reportsPage: ReportsPage;
|
|
26
45
|
constructor(page: Page);
|
|
27
46
|
navigateToHomePage(): Promise<void>;
|
|
28
47
|
navigateToUserPage(): Promise<void>;
|
|
29
48
|
clickCollapseSideView(): Promise<void>;
|
|
49
|
+
navigateToApplicationsPage(): Promise<void>;
|
|
50
|
+
navigateToEnvironmentsPage(): Promise<void>;
|
|
51
|
+
navigateToOverthereLocalHostPage(): Promise<void>;
|
|
30
52
|
}
|
|
31
53
|
declare class LoginPage extends WithPage {
|
|
32
|
-
/**
|
|
33
|
-
* Login with username and password
|
|
34
|
-
* @param userName
|
|
35
|
-
* @param password
|
|
36
|
-
*/
|
|
37
54
|
login(userName: string, password: string): Promise<void>;
|
|
38
55
|
verifyInvalidPasswordMessage(): Promise<void>;
|
|
39
|
-
/**
|
|
40
|
-
* Logout as authenticated user
|
|
41
|
-
*/
|
|
42
56
|
logout(): Promise<void>;
|
|
43
57
|
}
|
|
44
58
|
type DeployFixtures = {
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"mappings":";AAEA;IACE,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;gBAElB,IAAI,EAAE,IAAI;CAGvB;ACLD,sBAAsB,SAAQ,QAAQ;IAC9B,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC;IAKpC,yBAAyB,IAAI,OAAO,CAAC,IAAI,CAAC;IAK1C,yBAAyB,IAAI,OAAO,CAAC,IAAI,CAAC;CAIjD;ACfD,sBAAsB,SAAQ,QAAQ;IACpC;;;;OAIG;IAGG,aAAa,CACjB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,eAAe,EAAE,MAAM,GACtB,OAAO,CAAC,IAAI,CAAC;IAaV,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC;IAMrC,sBAAsB,IAAI,OAAO,CAAC,IAAI,CAAC;IAMvC,iCAAiC,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAYlE,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAc/E;AChED;IAEE,QAAQ,EAAE,QAAQ,CAAC;IACnB,QAAQ,EAAE,QAAQ,CAAC;gBAEP,IAAI,EAAE,IAAI;IAMhB,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC;IAInC,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC;IAInC,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC;CAI7C;ACxBD,uBAAuB,SAAQ,QAAQ;IACrC;;;;OAIG;IACG,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQxD,4BAA4B,IAAI,OAAO,CAAC,IAAI,CAAC;IAKnD;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;CAK9B;AC1BD,sBAAsB;IACpB,QAAQ,EAAE,QAAQ,CAAC;IACnB,SAAS,EAAE,SAAS,CAAC;IACrB,UAAU,EAAE,UAAU,CAAC;CACxB,CAAC;AAEF,OAAO,MAAM,kQAgBX,CAAC;AAEH;gBAGc,IAAI,EAAE,IAAI;CAGvB","sources":["apps/deploy/pages/withPage.ts","apps/deploy/pages/homePage.ts","apps/deploy/pages/usersPage.ts","apps/deploy/pages/index.ts","apps/deploy/pages/loginPage.ts","apps/deploy/fixtures/index.ts","apps/deploy/index.ts"],"sourcesContent":["import { Page } from '@playwright/test';\n\nexport class WithPage {\n protected readonly page: Page;\n\n constructor(page: Page) {\n this.page = page;\n }\n}\n","import { expect } from '@playwright/test';\nimport { WithPage } from './withPage';\n\nexport class HomePage extends WithPage {\n async clickUserManagement(): Promise<void> {\n await this.page.locator('p.MuiTypography-root', { hasText: 'User management' }).click();\n await this.page.getByRole('link', { name: 'Users' }).click();\n }\n\n async verifyDeployLogoIsPresent(): Promise<void> {\n const logo = this.page.getByAltText('Deploy');\n await expect(logo).toBeVisible();\n }\n\n async verifyDeployTextIsPresent(): Promise<void> {\n const title = this.page.getByTitle('digital.ai');\n await expect(title).toBeVisible();\n }\n}\n","import { expect } from '@playwright/test';\nimport { WithPage } from './withPage';\n\nexport class UserPage extends WithPage {\n /**\n * Login with username and password\n * @param userName\n * @param password\n */\n // this should be refactored to take an object and not disable the rule!!\n // eslint-disable-next-line max-params\n async createNewUser(\n username: string,\n fullName: string,\n email: string,\n password: string,\n confirmPassword: string,\n ): Promise<void> {\n await this.page.locator('p.MuiTypography-root', { hasText: 'Users' }).click();\n await this.page.getByRole('button', { name: 'Add user' }).click();\n await this.page.locator('input[name=\"username\"]').fill(username);\n await this.page.locator('input[name=\"fullName\"]').fill(fullName);\n await this.page.locator('input[name=\"email\"]').fill(email);\n const passwordInput = this.page.locator('input[name=\"password\"]');\n await passwordInput.click({ force: true });\n await passwordInput.fill(password);\n await this.page.locator('input[name=\"confirmPassword\"]').fill(confirmPassword);\n await this.page.getByRole('button', { name: 'Save' }).click();\n }\n\n async verifySuccessMessage(): Promise<void> {\n const SuccessMessage = this.page.getByRole('alertdialog');\n await expect(SuccessMessage).toBeVisible();\n await expect(SuccessMessage).toHaveText(/User \".*\" created/i);\n }\n\n async verifyUserErrorMessage(): Promise<void> {\n await expect(this.page.locator('.rrt-middle-container[role=\"alertdialog\"]').nth(1)).toContainText(\n /already in use/i,\n );\n }\n\n async deleteTheUserAndVerifyItIsDeleted(username: string): Promise<void> {\n await this.page.locator('p.MuiTypography-root', { hasText: 'Users' }).click();\n await this.page.waitForTimeout(10000);\n await this.page.getByPlaceholder('Filter...').fill(username);\n await this.page.waitForTimeout(10000);\n await this.page.locator('td.users-table-actions button.delete.xl-icon.table-action').click();\n await this.page.getByRole('button', { name: 'Delete', exact: true }).click();\n const DeleteMessage = this.page.getByRole('alertdialog');\n await expect(DeleteMessage).toBeVisible();\n await expect(DeleteMessage).toHaveText(/User \".*\" deleted/i);\n }\n\n async editUserAndVerify(username: string, editfullname: string): Promise<void> {\n await this.page.locator('p.MuiTypography-root', { hasText: 'Users' }).click();\n await this.page.waitForTimeout(10000);\n await this.page.getByPlaceholder('Filter...').fill(username);\n await this.page.waitForTimeout(10000);\n await this.page.locator('i.icon-edit.dot-i').first().click();\n await this.page.locator('input[name=\"fullName\"]').fill(editfullname);\n await this.page.getByRole('button', { name: 'Save', exact: true }).click();\n const EditMessage = this.page.getByRole('alertdialog');\n await expect(EditMessage).toBeVisible();\n const editedUsername = this.page.locator('td.users-table-fullName div').textContent();\n // eslint-disable-next-line no-console\n console.log(editedUsername);\n }\n}\n","import { Page } from '@playwright/test';\nimport { HomePage } from './homePage';\nimport { UserPage } from './usersPage';\n\nexport class Navigation {\n private readonly page: Page;\n homePage: HomePage;\n userPage: UserPage;\n\n constructor(page: Page) {\n this.page = page;\n this.homePage = new HomePage(page);\n this.userPage = new UserPage(page);\n }\n\n async navigateToHomePage(): Promise<void> {\n await this.page.goto('/home');\n }\n\n async navigateToUserPage(): Promise<void> {\n await this.page.locator('p.MuiTypography-root', { hasText: 'User management' }).click();\n }\n\n async clickCollapseSideView(): Promise<void> {\n const collapseButton = this.page.getByTestId('back-button');\n await collapseButton.click();\n }\n}\n","import { expect } from '@playwright/test';\nimport { WithPage } from './withPage';\n\nexport class LoginPage extends WithPage {\n /**\n * Login with username and password\n * @param userName\n * @param password\n */\n async login(userName: string, password: string): Promise<void> {\n await this.page.goto('/#/login');\n await expect(this.page).toHaveTitle('Digital.ai Deploy');\n await this.page.getByPlaceholder('user').fill(userName, { timeout: 1000 });\n await this.page.getByPlaceholder('Password').fill(password, { timeout: 10000 });\n await this.page.getByRole('button', { name: 'Log in' }).click({ timeout: 10000 });\n }\n\n async verifyInvalidPasswordMessage(): Promise<void> {\n const errorMessage = this.page.getByText('The username and/or password you have entered is incorrect.');\n await expect(errorMessage).toBeVisible();\n }\n\n /**\n * Logout as authenticated user\n */\n async logout(): Promise<void> {\n await this.page.locator('button.dot-avatar').click();\n await this.page.getByText('Log out', { exact: true }).click();\n await expect(this.page.getByText('Log in').first()).toBeVisible();\n }\n}\n","import { test as base, Page } from '@playwright/test';\nimport { Navigation } from '../pages';\nimport { LoginPage } from '../pages/loginPage';\n\ntype DeployFixtures = {\n fixtures: Fixtures;\n loginPage: LoginPage;\n navigation: Navigation;\n};\n\nexport const test = base.extend<DeployFixtures>({\n fixtures: async ({ page }, use) => {\n const fixtures = new Fixtures(page);\n await use(fixtures);\n return fixtures;\n },\n loginPage: async ({ page }, use) => {\n const loginPage = new LoginPage(page);\n await use(loginPage);\n return loginPage;\n },\n navigation: async ({ page }, use) => {\n const navigationPage = new Navigation(page);\n await use(navigationPage);\n return navigationPage;\n },\n});\n\nclass Fixtures {\n private readonly page: Page;\n\n constructor(page: Page) {\n this.page = page;\n }\n}\n","export { test } from './fixtures';\n"],"names":[],"version":3,"file":"types.d.ts.map"}
|
|
1
|
+
{"mappings":"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","sources":["apps/deploy/pages/withPage.ts","apps/deploy/pages/homePage.ts","apps/deploy/pages/usersPage.ts","apps/deploy/pages/infrastructure/overthereLocalHostPage.ts","apps/deploy/pages/environmentsPage.ts","apps/deploy/pages/applications/applicationsPage.ts","apps/deploy/pages/reportsPage.ts","apps/deploy/pages/index.ts","apps/deploy/pages/loginPage.ts","apps/deploy/fixtures/index.ts","apps/deploy/index.ts"],"sourcesContent":["import { Page } from '@playwright/test';\n\nexport class WithPage {\n protected readonly page: Page;\n\n constructor(page: Page) {\n this.page = page;\n }\n}\n","import { expect } from '@playwright/test';\nimport { WithPage } from './withPage';\n\nexport class HomePage extends WithPage {\n async clickUserManagement(): Promise<void> {\n await this.page.locator('p.MuiTypography-root', { hasText: 'User management' }).click();\n await this.page.getByRole('link', { name: 'Users' }).click();\n }\n\n async verifyDeployLogoIsPresent(): Promise<void> {\n const logo = this.page.getByAltText('Deploy');\n await expect(logo).toBeVisible();\n }\n\n async verifyDeployTextIsPresent(): Promise<void> {\n const title = this.page.getByTitle('digital.ai');\n await expect(title).toBeVisible();\n }\n\n async clickReports(): Promise<void> {\n await this.page.locator('p.MuiTypography-root', { hasText: 'Reports' }).click();\n }\n}\n","import { expect } from '@playwright/test';\nimport { WithPage } from './withPage';\n\nexport class UserPage extends WithPage {\n /* Create a new user */\n async createNewUser(username: string, email: string, password: string): Promise<void> {\n await this.page.locator('p.MuiTypography-root', { hasText: 'Users' }).click();\n await this.page.getByRole('button', { name: 'Add user' }).click();\n await this.page.locator('input[name=\"username\"]').fill(username);\n await this.page.locator('input[name=\"fullName\"]').fill(username);\n await this.page.locator('input[name=\"email\"]').fill(email);\n const passwordInput = this.page.locator('input[name=\"password\"]');\n await passwordInput.click({ force: true });\n await passwordInput.fill(password);\n await this.page.locator('input[name=\"confirmPassword\"]').fill(password);\n await this.page.getByRole('button', { name: 'Save' }).click();\n }\n\n /* Verify success message */\n async verifySuccessMessage(): Promise<void> {\n const SuccessMessage = this.page.getByRole('alertdialog');\n await expect(SuccessMessage).toBeVisible();\n await expect(SuccessMessage).toHaveText(/User \".*\" created/i);\n }\n\n /* Verify user error message */\n async verifyUserErrorMessage(): Promise<void> {\n await expect(this.page.locator('.rrt-middle-container[role=\"alertdialog\"]').nth(1)).toContainText(\n /already in use/i,\n );\n }\n\n /* Delete the user and verify it is deleted */\n async deleteTheUserAndVerifyItIsDeleted(username: string): Promise<void> {\n await this.page.locator('p.MuiTypography-root', { hasText: 'Users' }).click();\n await this.page.getByPlaceholder('Filter...').fill(username);\n await this.page.locator('td.users-table-actions button.delete.xl-icon.table-action').click();\n await this.page.getByRole('button', { name: 'Delete', exact: true }).click();\n const DeleteMessage = this.page.getByRole('alertdialog');\n await expect(DeleteMessage).toBeVisible();\n await expect(DeleteMessage).toHaveText(/User \".*\" deleted/i);\n }\n\n /* Edit the user and verify the changes */\n async editUserAndVerify(username: string, editfullname: string): Promise<void> {\n await this.page.locator('p.MuiTypography-root', { hasText: 'Users' }).click();\n await this.page.getByPlaceholder('Filter...').fill(username);\n await this.page.locator('i.icon-edit.dot-i').first().click();\n await this.page.locator('input[name=\"fullName\"]').fill(editfullname);\n await this.page.getByRole('button', { name: 'Save', exact: true }).click();\n const EditMessage = this.page.getByRole('alertdialog');\n await expect(EditMessage).toBeVisible();\n await expect(EditMessage).toContainText('Your change was saved');\n }\n}\n","import { expect } from '@playwright/test';\nimport { WithPage } from '../withPage';\n\nexport class OverthereLocalHostPage extends WithPage {\n /* Helps to create a LocalHost of type UNIX/Windows/Zos */\n async createHostForGivenType(name: string, type: string): Promise<void> {\n await this.page.locator('input[name=\"name\"]').fill(name);\n await this.page.locator('label:has-text(\"Operating system\")').locator('xpath=following::input[1]').click();\n await this.page.getByText(type, { exact: true }).click();\n await this.page.getByRole('button', { name: 'Save and close' }).click();\n const toastMessage = this.page.locator('.redux-toastr .rrt-text:visible');\n await expect(toastMessage).toHaveText('Your change was saved.', { timeout: 2000 });\n }\n}\n","import { WithPage } from './withPage';\nimport { expect } from '@playwright/test';\n\nexport class EnvironmentsPage extends WithPage {\n /* Helps to create a new Environment */\n async createEnvironment(environmentName: string, hostName: string): Promise<void> {\n await this.page.locator('input[name=\"name\"]').fill(environmentName);\n await this.page.locator('i.xl-icon.arrow-down-icon.show-all').nth(0).click();\n await this.page.getByTitle(`Infrastructure/${hostName}`, { exact: true }).click();\n await this.page.getByRole('button', { name: 'Save and close' }).click();\n const toastMessage = this.page.locator('.redux-toastr .rrt-text:visible');\n await expect(toastMessage).toHaveText('Your change was saved.', { timeout: 2000 });\n }\n}\n","import { expect, Page } from '@playwright/test';\nimport { WithPage } from '../withPage';\nimport { Navigation } from '../index';\n\nexport class ApplicationsPage extends WithPage {\n taskId!: string;\n executedText!: string;\n private navigation: Navigation;\n\n constructor(page: Page, navigation: Navigation) {\n super(page);\n this.navigation = navigation;\n }\n\n /* Creates a new application */\n async createNewApplication(applicationName: string): Promise<void> {\n await this.navigation.navigateToApplicationsPage();\n await this.page.locator('input[name=\"name\"]').waitFor({ state: 'visible' });\n await this.page.locator('input[name=\"name\"]').click();\n await this.page.locator('input[name=\"name\"]').fill(applicationName);\n await this.page.getByRole('button', { name: 'Save and close' }).click();\n const toastMessage = this.page.locator('.redux-toastr .rrt-text:visible');\n await expect(toastMessage).toHaveText('Your change was saved.', { timeout: 2000 });\n }\n\n /* Creates a new deployment package */\n async createNewDeploymentPackage(applicationName: string, packageName: string): Promise<void> {\n const appDataId = `Applications/${applicationName}`;\n\n // Expand Applications\n const root = this.page.locator('div[data-id=\"Applications\"] .infinite-tree-node > a');\n await root.click();\n\n // Hover over app node\n const appNode = this.page.locator(`span[data-id=\"${appDataId}\"]`);\n await expect(appNode).toBeVisible();\n await appNode.hover();\n\n // Open context menu + create new deployment package\n const contextMenu = this.page.locator(`i.context-menu-button[data-id=\"${appDataId}\"]`);\n await expect(contextMenu).toBeVisible();\n await contextMenu.click();\n\n await this.page.getByRole('link', { name: 'New' }).click();\n await this.page.getByRole('link', { name: 'Deployment Package' }).click();\n\n // Fill & save\n const nameInput = this.page.locator('input[name=\"name\"]');\n await nameInput.fill(packageName);\n\n await this.page.getByRole('button', { name: 'Save and close' }).click();\n\n const toastMessage = this.page.locator('.redux-toastr .rrt-text:visible');\n await expect(toastMessage).toHaveText('Your change was saved.', { timeout: 2000 });\n }\n\n /* Creates a new command application */\n async createNewCmdApplication(values: string[]): Promise<void> {\n const appDataId = `Applications/${values[0]}`;\n const packageDataId = `Applications/${values[0]}/${values[1]}`;\n\n // Expand app node and click package\n await this.page.locator(`div[data-id=\"${appDataId}\"] .infinite-tree-node > a`).click();\n const packageNode = this.page.locator(`span[data-id=\"${packageDataId}\"]`).first();\n await expect(packageNode).toBeVisible();\n await packageNode.click();\n\n // Open context menu\n const packageMenu = this.page.locator(`i.context-menu-button[data-id=\"${packageDataId}\"]`);\n await expect(packageMenu).toBeVisible();\n await packageMenu.click();\n\n // Create Command application\n await this.page.getByRole('link', { name: 'New' }).click();\n await this.page.getByRole('link', { name: 'cmd' }).click();\n await this.page.getByRole('link', { name: 'Command' }).click();\n\n await this.page.locator('input[name=\"name\"]').fill(values[2]);\n\n await this.page.locator('textarea[name=\"commandLine\"]').fill(values[3]);\n\n const saveBtn = this.page.locator('button', { hasText: /^Save$/ }).first();\n await expect(saveBtn).toBeEnabled();\n await saveBtn.click();\n await this.page.waitForTimeout(3000);\n\n const toastMessage = this.page.locator('.redux-toastr .rrt-text:visible');\n await expect(toastMessage).toHaveText('Your change was saved.', { timeout: 2000 });\n\n // Close dialog\n await this.page.locator('i.xl-icon.close-icon').first().click();\n }\n\n /*Deploy the application*/\n async deployApp(values: string[]): Promise<void> {\n const versionNode = `Applications/${values[0]}/${values[1]}`;\n await this.page.locator(`i.context-menu-button[data-id=\"${versionNode}\"]`).click();\n await this.page.getByRole('link', { name: 'Deploy', exact: true }).click();\n await this.page.locator(`input[name=\"selections\"][value=\"Environments/${values[2]}\"]`).click();\n await this.page.getByRole('button', { name: 'Continue' }).click();\n\n await this.page.locator('.errors-wrapper').waitFor({ state: 'attached', timeout: 2000 });\n\n const errorIcon = this.page.locator('a.validation-icons-wrapper.error');\n\n if (await errorIcon.isVisible()) {\n await this.page.getByRole('button', { name: 'Deployment Properties' }).click();\n await this.page.locator('input[name=\"username\"]').fill(values[3]);\n await this.page.getByRole('button', { name: 'Save' }).click();\n }\n\n await this.page.locator('button.deploy.xl-primary').click();\n\n //Get the task id\n this.taskId = (await this.page.locator('div.task-id').textContent()) || '';\n\n //Verify no failure and all are done\n const labels = this.page.locator('span.label');\n await expect(labels).toHaveCount(3);\n await expect(labels).toHaveText(['EXECUTED', 'DONE', 'DONE']);\n\n //Get the text executed\n await this.page.locator('div[data-id=\"0_1_1\"] .infinite-tree-node > a').click();\n await this.page.getByTitle('Execute Test Command').click();\n this.executedText = await this.page.locator('div.step-log-body pre').nth(1).innerText();\n\n //Verify in monitoring tab searching with the task id\n await this.page.locator('div[data-id=\"TASK_MONITOR\"] .infinite-tree-node > a').click();\n await this.page.locator('span[data-id=\"DEPLOYMENT_TASKS\"]').dblclick();\n await this.page.waitForTimeout(5000);\n\n await this.page.locator('div.deployment-task-filter-task-id input[placeholder=\"Search\"]').first().fill(this.taskId);\n const stateText = await this.page.locator('td.tasks-table-state').first().innerText();\n expect(stateText.trim()).toBe('Executed');\n\n //Click the row to go to deployment screen\n await this.page.locator('table.table.table-striped tbody tr').first().dblclick();\n\n await this.page.locator('button.finish.xl-primary').click();\n }\n}\n","import { expect } from '@playwright/test';\nimport { WithPage } from './withPage';\n\nexport class ReportsPage extends WithPage {\n /* Clicks on the Deployment Tasks section */\n async clickDeploymentTasks(): Promise<void> {\n await this.page.locator('p.MuiTypography-root', { hasText: 'Deployments' }).click();\n }\n\n async verifyTheDeploymentValues(values: string[]): Promise<void> {\n await this.page\n .locator('div.deployment-task-filter-task-id input[placeholder=\"Search\"]:visible')\n .first()\n .fill(values[0]);\n await this.page.waitForSelector('td.report-table-package .deployment-report-package', { timeout: 5000 });\n await expect(this.page.locator('td.report-table-package .deployment-report-package')).toContainText(\n new RegExp(`${values[2]}\\\\/${values[3]}`, 'i'),\n );\n await expect(this.page.locator('td.report-table-originalType .deployment-report-task-type')).toHaveText(/Initial/i); // Regex ignores case\n await expect(this.page.locator('td.report-table-user .deployment-report-user')).toHaveText('admin');\n\n //Click the row\n await this.page.locator('td.report-table-package .deployment-report-package').dblclick();\n await this.page.locator('div[data-id=\"0_1_1\"] .infinite-tree-node > a').click();\n await this.page.getByTitle('Execute Test Command').click();\n\n //Get the log text\n const text = await this.page.locator('div.step-log-body pre').nth(1).innerText();\n\n //Verify both the log text are same\n expect(text).toContain(values[1]);\n }\n}\n","import { Page } from '@playwright/test';\nimport { HomePage } from './homePage';\nimport { UserPage } from './usersPage';\nimport { OverthereLocalHostPage } from './infrastructure/overthereLocalHostPage';\nimport { EnvironmentsPage } from './environmentsPage';\nimport { ApplicationsPage } from './applications/applicationsPage';\nimport { ReportsPage } from './reportsPage';\n\nexport class Navigation {\n private readonly page: Page;\n homePage: HomePage;\n userPage: UserPage;\n overthereLocalHostPage: OverthereLocalHostPage;\n environmentsPage: EnvironmentsPage;\n applicationsPage: ApplicationsPage;\n reportsPage: ReportsPage;\n\n constructor(page: Page) {\n this.page = page;\n this.homePage = new HomePage(page);\n this.userPage = new UserPage(page);\n this.overthereLocalHostPage = new OverthereLocalHostPage(page);\n this.environmentsPage = new EnvironmentsPage(page);\n this.applicationsPage = new ApplicationsPage(page, this);\n this.reportsPage = new ReportsPage(page);\n }\n\n async navigateToHomePage(): Promise<void> {\n await this.page.goto('/home');\n }\n\n async navigateToUserPage(): Promise<void> {\n await this.page.locator('p.MuiTypography-root', { hasText: 'User management' }).click();\n }\n\n async clickCollapseSideView(): Promise<void> {\n const collapseButton = this.page.getByTestId('back-button');\n await collapseButton.click();\n }\n\n /* Helps to navigate to the Applications page */\n async navigateToApplicationsPage(): Promise<void> {\n const configNode = this.page.locator('span[data-id=\"Applications\"]');\n await configNode.hover();\n await this.page.locator('i.context-menu-button[data-id=\"Applications\"]').click();\n await this.page.getByRole('link', { name: 'New' }).click();\n await this.page.getByRole('link', { name: 'Application' }).click();\n }\n\n /* Helps to navigate to the Environments page */\n async navigateToEnvironmentsPage(): Promise<void> {\n const configNode = this.page.locator('span[data-id=\"Environments\"]');\n await configNode.hover();\n await this.page.locator('i.context-menu-button[data-id=\"Environments\"]').click();\n await this.page.getByRole('link', { name: 'New' }).click();\n await this.page.getByRole('link', { name: 'Environment' }).click();\n }\n\n /* Helps to navigate to the Overthere LocalHost page */\n async navigateToOverthereLocalHostPage(): Promise<void> {\n const configNode = this.page.locator('span[data-id=\"Infrastructure\"]');\n await configNode.hover();\n await this.page.locator('i.context-menu-button[data-id=\"Infrastructure\"]').click();\n // await this.page.waitForTimeout(5000);\n await this.page.getByRole('link', { name: 'New' }).click();\n await this.page.getByRole('link', { name: 'overthere' }).click();\n await this.page.getByRole('link', { name: 'LocalHost' }).click();\n }\n}\n","import { expect } from '@playwright/test';\nimport { WithPage } from './withPage';\n\nexport class LoginPage extends WithPage {\n /* Login with username and password*/\n async login(userName: string, password: string): Promise<void> {\n await this.page.goto('/#/login');\n await expect(this.page).toHaveTitle('Digital.ai Deploy');\n await this.page.getByPlaceholder('user').fill(userName, { timeout: 1000 });\n await this.page.getByPlaceholder('Password').fill(password, { timeout: 10000 });\n await this.page.getByRole('button', { name: 'Log in' }).click({ timeout: 10000 });\n }\n\n /* Verify invalid password message */\n async verifyInvalidPasswordMessage(): Promise<void> {\n const errorMessage = this.page.getByText('The username and/or password you have entered is incorrect.');\n await expect(errorMessage).toBeVisible();\n }\n\n /* Logout as authenticated user */\n async logout(): Promise<void> {\n await this.page.locator('button.dot-avatar').click();\n await this.page.getByText('Log out', { exact: true }).click();\n await expect(this.page.getByText('Log in').first()).toBeVisible();\n }\n}\n","import { test as base, Page } from '@playwright/test';\nimport { Navigation } from '../pages';\nimport { LoginPage } from '../pages/loginPage';\n\ntype DeployFixtures = {\n fixtures: Fixtures;\n loginPage: LoginPage;\n navigation: Navigation;\n};\n\nexport const test = base.extend<DeployFixtures>({\n fixtures: async ({ page }, use) => {\n const fixtures = new Fixtures(page);\n await use(fixtures);\n return fixtures;\n },\n loginPage: async ({ page }, use) => {\n const loginPage = new LoginPage(page);\n await use(loginPage);\n return loginPage;\n },\n navigation: async ({ page }, use) => {\n const navigationPage = new Navigation(page);\n await use(navigationPage);\n return navigationPage;\n },\n});\n\nclass Fixtures {\n private readonly page: Page;\n\n constructor(page: Page) {\n this.page = page;\n }\n}\n","export { test } from './fixtures';\n"],"names":[],"version":3,"file":"types.d.ts.map"}
|