@digital-ai/devops-page-object-deploy 0.0.0-snapshot-20251104102306

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 ADDED
@@ -0,0 +1,57 @@
1
+ # @digital-ai/devops-page-object-deploy
2
+
3
+ ## 0.0.0-snapshot-20251104102306
4
+
5
+ ### Patch Changes
6
+
7
+ - fc2cbb0: Cmd App Deployment workflow
8
+
9
+ ## 0.0.7
10
+
11
+ ### Patch Changes
12
+
13
+ - d85951c: Page objects for Deploy Playwright
14
+
15
+ ## 0.0.6
16
+
17
+ ### Patch Changes
18
+
19
+ - 95c5229: Pages updated with parentLocators and with dataGrid class
20
+ This PR holds revamp of the pages with its parentLocator.
21
+ - 512af21: Added Move-Ci function, optimized application util methods
22
+
23
+ ## 0.0.5
24
+
25
+ ### Patch Changes
26
+
27
+ - e68ca43: Created methods for validating duplicate context-menu
28
+ inlineRename() method is created to rename CI's
29
+ duplicate() method is created to duplicate the CI's
30
+ Fixed the conditional check on expanding node path which was not working with isVisible method.
31
+ - 518605e: Fixed pages for context-menu delete ci scenario's
32
+ Pages to work with delete context-menu is created newly.
33
+ Methods for tab verification is added in Tab page file.
34
+
35
+ ## 0.0.4
36
+
37
+ ### Patch Changes
38
+
39
+ - 52b8a07: Re-structuring explorer pages
40
+ - 713c5ef: Created page objects for create-ci-scenario test cases.
41
+ Re-structured page object to avoid duplication of code structure.
42
+ Commonly used methods, code is described under explorer directory structure.
43
+
44
+ S 94677
45
+
46
+ ## 0.0.3
47
+
48
+ ### Patch Changes
49
+
50
+ - 44ba67e: Created page files for add-new-ci-scenario test suite migration
51
+ - 2930770: Method created to handle multiple contextual menu clicks
52
+
53
+ ## 0.0.2
54
+
55
+ ### Patch Changes
56
+
57
+ - d47a9be: [S-94130] Initialize Page Objects for Deploy
package/LICENSE.md ADDED
@@ -0,0 +1 @@
1
+ All materials included in this package are subject to your existing commercial license or subscription agreement terms with Digital.ai Software Inc. or its Affiliates.
package/README.md ADDED
@@ -0,0 +1,7 @@
1
+ ## Release page objects
2
+
3
+ ### Compatibility matrix
4
+
5
+ | devops-page-object-deploy | Digital.ai Deploy |
6
+ |----------------------------|:------------------:|
7
+ | 1.x | 23.3.x |
package/dist/main.js ADDED
@@ -0,0 +1,409 @@
1
+ var $1UEKj$playwrighttest = require("@playwright/test");
2
+
3
+ function $parcel$export(e, n, v, s) {
4
+ Object.defineProperty(e, n, {get: v, set: s, enumerable: true, configurable: true});
5
+ }
6
+
7
+ $parcel$export(module.exports, "test", () => $3352700e95ddc19e$export$e0969da9b8fb378d);
8
+
9
+
10
+ class $ae23b16684112d0b$export$2b65d1d97338f32b {
11
+ constructor(page){
12
+ this.page = page;
13
+ }
14
+ }
15
+
16
+
17
+ class $f280624787ceceed$export$36d69433c4f81145 extends (0, $ae23b16684112d0b$export$2b65d1d97338f32b) {
18
+ async clickUserManagement() {
19
+ await this.page.locator("p.MuiTypography-root", {
20
+ hasText: "User management"
21
+ }).click();
22
+ await this.page.getByRole("link", {
23
+ name: "Users"
24
+ }).click();
25
+ }
26
+ async verifyDeployLogoIsPresent() {
27
+ const logo = this.page.getByAltText("Deploy");
28
+ await (0, $1UEKj$playwrighttest.expect)(logo).toBeVisible();
29
+ }
30
+ async verifyDeployTextIsPresent() {
31
+ const title = this.page.getByTitle("digital.ai");
32
+ await (0, $1UEKj$playwrighttest.expect)(title).toBeVisible();
33
+ }
34
+ async clickReports() {
35
+ await this.page.locator("p.MuiTypography-root", {
36
+ hasText: "Reports"
37
+ }).click();
38
+ }
39
+ }
40
+
41
+
42
+
43
+
44
+ class $c949c453826379e3$export$ecdc3cf9d1cfe143 extends (0, $ae23b16684112d0b$export$2b65d1d97338f32b) {
45
+ /**
46
+ * Login with username and password
47
+ * @param userName
48
+ * @param password
49
+ */ // this should be refactored to take an object and not disable the rule!!
50
+ // eslint-disable-next-line max-params
51
+ async createNewUser(username, fullName, email, password, confirmPassword) {
52
+ await this.page.locator("p.MuiTypography-root", {
53
+ hasText: "Users"
54
+ }).click();
55
+ await this.page.getByRole("button", {
56
+ name: "Add user"
57
+ }).click();
58
+ await this.page.locator('input[name="username"]').fill(username);
59
+ await this.page.locator('input[name="fullName"]').fill(fullName);
60
+ await this.page.locator('input[name="email"]').fill(email);
61
+ const passwordInput = this.page.locator('input[name="password"]');
62
+ await passwordInput.click({
63
+ force: true
64
+ });
65
+ await passwordInput.fill(password);
66
+ await this.page.locator('input[name="confirmPassword"]').fill(confirmPassword);
67
+ await this.page.getByRole("button", {
68
+ name: "Save"
69
+ }).click();
70
+ }
71
+ async verifySuccessMessage() {
72
+ const SuccessMessage = this.page.getByRole("alertdialog");
73
+ await (0, $1UEKj$playwrighttest.expect)(SuccessMessage).toBeVisible();
74
+ await (0, $1UEKj$playwrighttest.expect)(SuccessMessage).toHaveText(/User ".*" created/i);
75
+ }
76
+ async verifyUserErrorMessage() {
77
+ await (0, $1UEKj$playwrighttest.expect)(this.page.locator('.rrt-middle-container[role="alertdialog"]').nth(1)).toContainText(/already in use/i);
78
+ }
79
+ async deleteTheUserAndVerifyItIsDeleted(username) {
80
+ await this.page.locator("p.MuiTypography-root", {
81
+ hasText: "Users"
82
+ }).click();
83
+ await this.page.waitForTimeout(10000);
84
+ await this.page.getByPlaceholder("Filter...").fill(username);
85
+ await this.page.waitForTimeout(10000);
86
+ await this.page.locator("td.users-table-actions button.delete.xl-icon.table-action").click();
87
+ await this.page.getByRole("button", {
88
+ name: "Delete",
89
+ exact: true
90
+ }).click();
91
+ const DeleteMessage = this.page.getByRole("alertdialog");
92
+ await (0, $1UEKj$playwrighttest.expect)(DeleteMessage).toBeVisible();
93
+ await (0, $1UEKj$playwrighttest.expect)(DeleteMessage).toHaveText(/User ".*" deleted/i);
94
+ }
95
+ async editUserAndVerify(username, editfullname) {
96
+ await this.page.locator("p.MuiTypography-root", {
97
+ hasText: "Users"
98
+ }).click();
99
+ await this.page.waitForTimeout(10000);
100
+ await this.page.getByPlaceholder("Filter...").fill(username);
101
+ await this.page.waitForTimeout(10000);
102
+ await this.page.locator("i.icon-edit.dot-i").first().click();
103
+ await this.page.locator('input[name="fullName"]').fill(editfullname);
104
+ await this.page.getByRole("button", {
105
+ name: "Save",
106
+ exact: true
107
+ }).click();
108
+ const EditMessage = this.page.getByRole("alertdialog");
109
+ await (0, $1UEKj$playwrighttest.expect)(EditMessage).toBeVisible();
110
+ const editedUsername = this.page.locator("td.users-table-fullName div").textContent();
111
+ // eslint-disable-next-line no-console
112
+ console.log(editedUsername);
113
+ }
114
+ }
115
+
116
+
117
+
118
+ class $8506c0ab2b7a06f6$export$c88e1d16f82516d extends (0, $ae23b16684112d0b$export$2b65d1d97338f32b) {
119
+ /* Helps to navigate to the Overthere LocalHost page */ async navigateToOverthereLocalHostPage() {
120
+ const configNode = this.page.locator('span[data-id="Infrastructure"]');
121
+ await configNode.hover();
122
+ await this.page.waitForTimeout(500); // small delay for hover animation
123
+ const menuButton = this.page.locator('i.context-menu-button[data-id="Infrastructure"]');
124
+ await menuButton.click();
125
+ await this.page.getByTitle("New").click();
126
+ await this.page.getByText("overthere").click();
127
+ await this.page.getByText("LocalHost").click();
128
+ }
129
+ /* Helps to create a LocalHost of type UNIX */ async createLocalHostForUnixType(name) {
130
+ await this.page.locator('input[name="name"]').fill(name);
131
+ await this.page.locator('input[type="text"]').nth(7).click();
132
+ await this.page.getByTitle("UNIX").click();
133
+ await this.page.getByRole("button", {
134
+ name: "Save and close"
135
+ }).click();
136
+ }
137
+ /* Helps to create a LocalHost of type WINDOWS */ async createLocalHostForWindowsType(name) {
138
+ await this.page.locator('input[name="name"]').fill(name);
139
+ await this.page.locator('input[type="text"]').nth(7).click();
140
+ await this.page.getByTitle("WINDOWS").click();
141
+ await this.page.getByRole("button", {
142
+ name: "Save and close"
143
+ }).click();
144
+ }
145
+ /* Helps to create a LocalHost of type ZOS */ async createLocalHostForZosType(name) {
146
+ await this.page.locator('input[name="name"]').fill(name);
147
+ await this.page.locator('input[type="text"]').nth(7).click();
148
+ await this.page.getByTitle("ZOS").click();
149
+ await this.page.getByRole("button", {
150
+ name: "Save and close"
151
+ }).click();
152
+ }
153
+ }
154
+
155
+
156
+
157
+ class $64bc587a017c1e89$export$12530425267834a9 extends (0, $ae23b16684112d0b$export$2b65d1d97338f32b) {
158
+ /* Helps to navigate to the Environments page */ async navigateToEnvironmentsPage() {
159
+ const configNode = this.page.locator('span[data-id="Environments"]');
160
+ await configNode.hover();
161
+ await this.page.waitForTimeout(500); // small delay for hover animation
162
+ const menuButton = this.page.locator('i.context-menu-button[data-id="Environments"]');
163
+ await menuButton.click();
164
+ await this.page.getByTitle("New").click();
165
+ await this.page.getByTitle("udm.Environment").click();
166
+ }
167
+ /* Helps to create a new Environment */ async createEnvironment(name) {
168
+ await this.page.locator('input[name="name"]').fill(name);
169
+ await this.page.locator("i.xl-icon.arrow-down-icon.show-all").nth(0).click();
170
+ await this.page.getByTitle("Infrastructure/UnixHost").click();
171
+ await this.page.getByRole("button", {
172
+ name: "Save and close"
173
+ }).click();
174
+ }
175
+ }
176
+
177
+
178
+
179
+
180
+ class $29f18122ec27b03a$export$1533b625ec0c75e2 extends (0, $ae23b16684112d0b$export$2b65d1d97338f32b) {
181
+ taskId = "";
182
+ executedText = "";
183
+ /* Helps to navigate to the Applications page */ async navigateToApplicationsPage() {
184
+ const configNode = this.page.locator('span[data-id="Applications"]');
185
+ await configNode.hover();
186
+ await this.page.waitForTimeout(500); // small delay for hover animation
187
+ await this.page.locator('i.context-menu-button[data-id="Applications"]').click();
188
+ await this.page.getByTitle("New").click();
189
+ await this.page.getByTitle("udm.Application").click();
190
+ }
191
+ /*Create a New Application and Deployment Package */ async createNewDeploymentPackage(applicationName, packageName, cmdAppName, cmdAppCommand) {
192
+ await this.page.locator('input[name="name"]').fill(applicationName);
193
+ await this.page.getByRole("button", {
194
+ name: "Save and close"
195
+ }).click();
196
+ await this.page.locator('div[data-id="Applications"] .infinite-tree-node > a').click();
197
+ const configNode = this.page.locator('span[data-id="Applications/Test Application"]');
198
+ await configNode.hover();
199
+ await this.page.waitForTimeout(500);
200
+ await this.page.locator('i.context-menu-button[data-id="Applications/Test Application"]').click();
201
+ await this.page.getByTitle("New").click();
202
+ await this.page.getByTitle("udm.DeploymentPackage").click();
203
+ await this.page.locator('input[name="name"]').fill(packageName);
204
+ await this.page.getByRole("button", {
205
+ name: "Save and close"
206
+ }).click();
207
+ await this.page.waitForTimeout(1000);
208
+ await this.page.locator('div[data-id="Applications/Test Application"] .infinite-tree-node > a').click();
209
+ await this.page.waitForTimeout(500);
210
+ await this.page.locator('span[data-id="Applications/Test Application/1.0.0"]').click();
211
+ await this.page.locator('i.context-menu-button[data-id="Applications/Test Application/1.0.0"]').click();
212
+ await this.page.getByTitle("New").click();
213
+ await this.page.getByTitle("cmd", {
214
+ exact: true
215
+ }).click();
216
+ await this.page.getByTitle("cmd.Command", {
217
+ exact: true
218
+ }).click();
219
+ await this.page.locator('input[name="name"]').fill(cmdAppName);
220
+ await this.page.locator('textarea[name="commandLine"]').fill(cmdAppCommand);
221
+ await this.page.waitForTimeout(500);
222
+ await this.page.locator("button", {
223
+ hasText: /^Save$/
224
+ }).first().click();
225
+ await this.page.waitForTimeout(1000);
226
+ await this.page.locator("i.xl-icon.close-icon").first().click();
227
+ }
228
+ /*Deploy the application*/ async deployApp() {
229
+ /* await this.page.locator('span[data-id="Applications"]').click();
230
+ await this.page.waitForTimeout(1000);
231
+ await this.page.locator('div[data-id="Applications"] .infinite-tree-toggler').click({ force: true });
232
+ //await this.page.locator('div[data-id="Applications"] .infinite-tree-node > a').click({ force: true });
233
+ await this.page.waitForTimeout(1000);
234
+ await this.page.locator('div[data-id="Applications/Test Application"] .infinite-tree-node > a').click();
235
+ await this.page.locator('span[data-id="Applications/Test Application/1.0.0"]').click(); */ await this.page.waitForTimeout(3000);
236
+ await this.page.locator('i.context-menu-button[data-id="Applications/Test Application/1.0.0"]').click();
237
+ await this.page.locator('a[title="Deploy"]').click();
238
+ await this.page.locator('input[name="selections"][value="Environments/Test Environment"]').click();
239
+ await this.page.getByRole("button", {
240
+ name: "Continue"
241
+ }).click();
242
+ await this.page.waitForTimeout(1000);
243
+ await this.page.locator("button.deploy.xl-primary").click();
244
+ await this.page.waitForTimeout(5000);
245
+ //Get the task id
246
+ this.taskId = await this.page.locator("div.task-id").textContent() || "";
247
+ console.log(`Deployment Task ID in applications page: ${this.taskId}`);
248
+ //Verify no failure and all are done
249
+ const labels = this.page.locator("span.label");
250
+ await (0, $1UEKj$playwrighttest.expect)(labels).toHaveCount(3);
251
+ await (0, $1UEKj$playwrighttest.expect)(labels).toHaveText([
252
+ "EXECUTED",
253
+ "DONE",
254
+ "DONE"
255
+ ]);
256
+ //Get the text executed
257
+ await this.page.locator('div[data-id="0_1_1"] .infinite-tree-node > a').click();
258
+ await this.page.getByTitle("Execute Test Command").click();
259
+ this.executedText = await this.page.locator("div.step-log-body pre").nth(1).innerText();
260
+ console.log(`Executed Text in applications page: ${this.executedText}`);
261
+ //Verify in monitoring tab searching with the task id
262
+ await this.page.locator('div[data-id="TASK_MONITOR"] .infinite-tree-node > a').click();
263
+ await this.page.locator('span[data-id="DEPLOYMENT_TASKS"]').dblclick();
264
+ await this.page.waitForTimeout(5000);
265
+ await this.page.locator('div.deployment-task-filter-task-id input[placeholder="Search"]').first().fill(this.taskId);
266
+ const stateText = await this.page.locator("td.tasks-table-state").first().innerText();
267
+ console.log(`Task state: ${stateText}`);
268
+ (0, $1UEKj$playwrighttest.expect)(stateText.trim()).toBe("Executed");
269
+ //Click the row to go to deployment screen
270
+ await this.page.locator("table.table.table-striped tbody tr").first().dblclick();
271
+ await this.page.waitForTimeout(5000);
272
+ await this.page.locator("button.finish.xl-primary").click();
273
+ }
274
+ }
275
+
276
+
277
+
278
+
279
+ class $fea68740c371df96$export$b8a443164510a1b4 extends (0, $ae23b16684112d0b$export$2b65d1d97338f32b) {
280
+ async clickDeploymentTasks() {
281
+ await this.page.locator("p.MuiTypography-root", {
282
+ hasText: "Deployments"
283
+ }).click();
284
+ }
285
+ async verifyTheRowValues() {
286
+ const firstRow = this.page.locator("tbody tr").first();
287
+ await (0, $1UEKj$playwrighttest.expect)(firstRow.locator(".report-table-package")).toHaveText("Test Application/1.0.0");
288
+ await (0, $1UEKj$playwrighttest.expect)(firstRow.locator(".report-table-originalType")).toHaveText(/Initial/i); // Regex ignores case
289
+ await (0, $1UEKj$playwrighttest.expect)(firstRow.locator(".report-table-user")).toHaveText("admin");
290
+ }
291
+ async verifyTheDeploymentValues(taskID, executedText) {
292
+ /*const searchInput = this.page.locator('div.deployment-task-filter-task-id input[placeholder="Search"]').first();
293
+ await searchInput.waitFor({ state: 'visible' });
294
+ await searchInput.scrollIntoViewIfNeeded();
295
+ await searchInput.click({ force: true });
296
+ await searchInput.fill(taskID);*/ await this.page.locator('div.deployment-task-filter-task-id input[placeholder="Search"]:visible').first().fill(taskID);
297
+ await this.page.waitForTimeout(5000);
298
+ // await this.page.waitForSelector('table.table.table-striped tbody tr', { timeout: 60000 });
299
+ //await this.page.locator('table.table.table-striped tbody tr').first().waitFor();
300
+ //await expect(this.page.locator('table.table.table-striped tbody tr').first().locator('td.report-table-package .deployment-report-package')).toHaveText('Test Application/1.0.0');
301
+ await this.page.waitForSelector("td.report-table-package .deployment-report-package", {
302
+ timeout: 30000
303
+ });
304
+ await (0, $1UEKj$playwrighttest.expect)(this.page.locator("td.report-table-package .deployment-report-package")).toHaveText(/Test Application\/1\.0\.0/i);
305
+ await (0, $1UEKj$playwrighttest.expect)(this.page.locator("td.report-table-originalType .deployment-report-task-type")).toHaveText(/Initial/i); // Regex ignores case
306
+ await (0, $1UEKj$playwrighttest.expect)(this.page.locator("td.report-table-user .deployment-report-user")).toHaveText("admin");
307
+ //Click the row
308
+ await this.page.locator("td.report-table-package .deployment-report-package").dblclick();
309
+ await this.page.locator('div[data-id="0_1_1"] .infinite-tree-node > a').click();
310
+ await this.page.getByTitle("Execute Test Command").click();
311
+ //Get the log text
312
+ const text = await this.page.locator("div.step-log-body pre").nth(1).innerText();
313
+ console.log(`Executed Text in Reports page: ${text}`);
314
+ //Verify both the log text are same
315
+ (0, $1UEKj$playwrighttest.expect)(text).toContain(executedText);
316
+ }
317
+ }
318
+
319
+
320
+ class $28788a34e6bbbe3d$export$b8a61e5c71402559 {
321
+ constructor(page){
322
+ this.page = page;
323
+ this.homePage = new (0, $f280624787ceceed$export$36d69433c4f81145)(page);
324
+ this.userPage = new (0, $c949c453826379e3$export$ecdc3cf9d1cfe143)(page);
325
+ this.overthereLocalHostPage = new (0, $8506c0ab2b7a06f6$export$c88e1d16f82516d)(page);
326
+ this.environmentsPage = new (0, $64bc587a017c1e89$export$12530425267834a9)(page);
327
+ this.applicationsPage = new (0, $29f18122ec27b03a$export$1533b625ec0c75e2)(page);
328
+ this.reportsPage = new (0, $fea68740c371df96$export$b8a443164510a1b4)(page);
329
+ }
330
+ async navigateToHomePage() {
331
+ await this.page.goto("/home");
332
+ }
333
+ async navigateToUserPage() {
334
+ await this.page.locator("p.MuiTypography-root", {
335
+ hasText: "User management"
336
+ }).click();
337
+ }
338
+ async clickCollapseSideView() {
339
+ const collapseButton = this.page.getByTestId("back-button");
340
+ await collapseButton.click();
341
+ }
342
+ }
343
+
344
+
345
+
346
+
347
+ class $365fc3920b0d055f$export$f14c0e3f98d164c0 extends (0, $ae23b16684112d0b$export$2b65d1d97338f32b) {
348
+ /**
349
+ * Login with username and password
350
+ * @param userName
351
+ * @param password
352
+ */ async login(userName, password) {
353
+ await this.page.goto("/#/login");
354
+ await (0, $1UEKj$playwrighttest.expect)(this.page).toHaveTitle("Digital.ai Deploy");
355
+ await this.page.getByPlaceholder("user").fill(userName, {
356
+ timeout: 1000
357
+ });
358
+ await this.page.getByPlaceholder("Password").fill(password, {
359
+ timeout: 10000
360
+ });
361
+ await this.page.getByRole("button", {
362
+ name: "Log in"
363
+ }).click({
364
+ timeout: 10000
365
+ });
366
+ }
367
+ async verifyInvalidPasswordMessage() {
368
+ const errorMessage = this.page.getByText("The username and/or password you have entered is incorrect.");
369
+ await (0, $1UEKj$playwrighttest.expect)(errorMessage).toBeVisible();
370
+ }
371
+ /**
372
+ * Logout as authenticated user
373
+ */ async logout() {
374
+ await this.page.locator("button.dot-avatar").click();
375
+ await this.page.getByText("Log out", {
376
+ exact: true
377
+ }).click();
378
+ await (0, $1UEKj$playwrighttest.expect)(this.page.getByText("Log in").first()).toBeVisible();
379
+ }
380
+ }
381
+
382
+
383
+ const $3352700e95ddc19e$export$e0969da9b8fb378d = (0, $1UEKj$playwrighttest.test).extend({
384
+ fixtures: async ({ page: page }, use)=>{
385
+ const fixtures = new $3352700e95ddc19e$var$Fixtures(page);
386
+ await use(fixtures);
387
+ return fixtures;
388
+ },
389
+ loginPage: async ({ page: page }, use)=>{
390
+ const loginPage = new (0, $365fc3920b0d055f$export$f14c0e3f98d164c0)(page);
391
+ await use(loginPage);
392
+ return loginPage;
393
+ },
394
+ navigation: async ({ page: page }, use)=>{
395
+ const navigationPage = new (0, $28788a34e6bbbe3d$export$b8a61e5c71402559)(page);
396
+ await use(navigationPage);
397
+ return navigationPage;
398
+ }
399
+ });
400
+ class $3352700e95ddc19e$var$Fixtures {
401
+ constructor(page){
402
+ this.page = page;
403
+ }
404
+ }
405
+
406
+
407
+
408
+
409
+ //# sourceMappingURL=main.js.map
@@ -0,0 +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/overthereLocaHostPage.ts","apps/deploy/pages/environmentsPage.ts","apps/deploy/pages/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 './overthereLocaHostPage';\nimport { EnvironmentsPage } from './environmentsPage';\nimport { ApplicationsPage } from './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);\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","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 /**\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 OverthereLocalHostPage extends WithPage {\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.waitForTimeout(500); // small delay for hover animation\n const menuButton = this.page.locator('i.context-menu-button[data-id=\"Infrastructure\"]');\n await menuButton.click();\n await this.page.getByTitle('New').click();\n await this.page.getByText('overthere').click();\n await this.page.getByText('LocalHost').click();\n }\n\n /* Helps to create a LocalHost of type UNIX */\n async createLocalHostForUnixType(name: string): Promise<void> {\n await this.page.locator('input[name=\"name\"]').fill(name);\n await this.page.locator('input[type=\"text\"]').nth(7).click();\n await this.page.getByTitle('UNIX').click();\n await this.page.getByRole('button', { name: 'Save and close' }).click();\n }\n\n /* Helps to create a LocalHost of type WINDOWS */\n async createLocalHostForWindowsType(name: string): Promise<void> {\n await this.page.locator('input[name=\"name\"]').fill(name);\n await this.page.locator('input[type=\"text\"]').nth(7).click();\n await this.page.getByTitle('WINDOWS').click();\n await this.page.getByRole('button', { name: 'Save and close' }).click();\n }\n\n /* Helps to create a LocalHost of type ZOS */\n async createLocalHostForZosType(name: string): Promise<void> {\n await this.page.locator('input[name=\"name\"]').fill(name);\n await this.page.locator('input[type=\"text\"]').nth(7).click();\n await this.page.getByTitle('ZOS').click();\n await this.page.getByRole('button', { name: 'Save and close' }).click();\n }\n}\n","import { expect } from '@playwright/test';\nimport { WithPage } from './withPage';\n\nexport class EnvironmentsPage extends WithPage {\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.waitForTimeout(500); // small delay for hover animation\n const menuButton = this.page.locator('i.context-menu-button[data-id=\"Environments\"]');\n await menuButton.click();\n await this.page.getByTitle('New').click();\n await this.page.getByTitle('udm.Environment').click();\n }\n\n /* Helps to create a new Environment */\n async createEnvironment(name: string): Promise<void> {\n await this.page.locator('input[name=\"name\"]').fill(name);\n await this.page.locator('i.xl-icon.arrow-down-icon.show-all').nth(0).click();\n await this.page.getByTitle('Infrastructure/UnixHost').click();\n await this.page.getByRole('button', { name: 'Save and close' }).click();\n }\n}\n","import { expect } from '@playwright/test';\nimport { WithPage } from './withPage';\n\nexport class ApplicationsPage extends WithPage {\n taskId: string = '';\n executedText: string = '';\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.waitForTimeout(500); // small delay for hover animation\n await this.page.locator('i.context-menu-button[data-id=\"Applications\"]').click();\n await this.page.getByTitle('New').click();\n await this.page.getByTitle('udm.Application').click();\n }\n\n /*Create a New Application and Deployment Package */\n async createNewDeploymentPackage(\n applicationName: string,\n packageName: string,\n cmdAppName: string,\n cmdAppCommand: string,\n ): Promise<void> {\n await this.page.locator('input[name=\"name\"]').fill(applicationName);\n await this.page.getByRole('button', { name: 'Save and close' }).click();\n await this.page.locator('div[data-id=\"Applications\"] .infinite-tree-node > a').click();\n const configNode = this.page.locator('span[data-id=\"Applications/Test Application\"]');\n await configNode.hover();\n await this.page.waitForTimeout(500);\n await this.page.locator('i.context-menu-button[data-id=\"Applications/Test Application\"]').click();\n await this.page.getByTitle('New').click();\n await this.page.getByTitle('udm.DeploymentPackage').click();\n await this.page.locator('input[name=\"name\"]').fill(packageName);\n await this.page.getByRole('button', { name: 'Save and close' }).click();\n await this.page.waitForTimeout(1000);\n await this.page.locator('div[data-id=\"Applications/Test Application\"] .infinite-tree-node > a').click();\n await this.page.waitForTimeout(500);\n await this.page.locator('span[data-id=\"Applications/Test Application/1.0.0\"]').click();\n await this.page.locator('i.context-menu-button[data-id=\"Applications/Test Application/1.0.0\"]').click();\n await this.page.getByTitle('New').click();\n await this.page.getByTitle('cmd', { exact: true }).click();\n await this.page.getByTitle('cmd.Command', { exact: true }).click();\n await this.page.locator('input[name=\"name\"]').fill(cmdAppName);\n await this.page.locator('textarea[name=\"commandLine\"]').fill(cmdAppCommand);\n await this.page.waitForTimeout(500);\n await this.page\n .locator('button', { hasText: /^Save$/ })\n .first()\n .click();\n await this.page.waitForTimeout(1000);\n await this.page.locator('i.xl-icon.close-icon').first().click();\n }\n\n /*Deploy the application*/\n async deployApp(): Promise<void> {\n /* await this.page.locator('span[data-id=\"Applications\"]').click();\n await this.page.waitForTimeout(1000);\n await this.page.locator('div[data-id=\"Applications\"] .infinite-tree-toggler').click({ force: true }); \n //await this.page.locator('div[data-id=\"Applications\"] .infinite-tree-node > a').click({ force: true }); \n await this.page.waitForTimeout(1000);\n await this.page.locator('div[data-id=\"Applications/Test Application\"] .infinite-tree-node > a').click(); \n await this.page.locator('span[data-id=\"Applications/Test Application/1.0.0\"]').click(); */\n await this.page.waitForTimeout(3000);\n await this.page.locator('i.context-menu-button[data-id=\"Applications/Test Application/1.0.0\"]').click();\n await this.page.locator('a[title=\"Deploy\"]').click();\n await this.page.locator('input[name=\"selections\"][value=\"Environments/Test Environment\"]').click();\n await this.page.getByRole('button', { name: 'Continue' }).click();\n await this.page.waitForTimeout(1000);\n await this.page.locator('button.deploy.xl-primary').click();\n await this.page.waitForTimeout(5000);\n\n //Get the task id\n this.taskId = (await this.page.locator('div.task-id').textContent()) || '';\n console.log(`Deployment Task ID in applications page: ${this.taskId}`);\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 console.log(`Executed Text in applications page: ${this.executedText}`);\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 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 console.log(`Task state: ${stateText}`);\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 await this.page.waitForTimeout(5000);\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 async clickDeploymentTasks(): Promise<void> {\n await this.page.locator('p.MuiTypography-root', { hasText: 'Deployments' }).click();\n }\n\n async verifyTheRowValues(): Promise<void> {\n const firstRow = this.page.locator('tbody tr').first();\n await expect(firstRow.locator('.report-table-package')).toHaveText('Test Application/1.0.0');\n await expect(firstRow.locator('.report-table-originalType')).toHaveText(/Initial/i); // Regex ignores case\n await expect(firstRow.locator('.report-table-user')).toHaveText('admin');\n }\n\n async verifyTheDeploymentValues(taskID: string, executedText: string): Promise<void> {\n /*const searchInput = this.page.locator('div.deployment-task-filter-task-id input[placeholder=\"Search\"]').first();\n await searchInput.waitFor({ state: 'visible' });\n await searchInput.scrollIntoViewIfNeeded();\n await searchInput.click({ force: true });\n await searchInput.fill(taskID);*/\n await this.page\n .locator('div.deployment-task-filter-task-id input[placeholder=\"Search\"]:visible')\n .first()\n .fill(taskID!);\n await this.page.waitForTimeout(5000);\n // await this.page.waitForSelector('table.table.table-striped tbody tr', { timeout: 60000 });\n //await this.page.locator('table.table.table-striped tbody tr').first().waitFor();\n //await expect(this.page.locator('table.table.table-striped tbody tr').first().locator('td.report-table-package .deployment-report-package')).toHaveText('Test Application/1.0.0');\n await this.page.waitForSelector('td.report-table-package .deployment-report-package', { timeout: 30000 });\n await expect(this.page.locator('td.report-table-package .deployment-report-package')).toHaveText(\n /Test Application\\/1\\.0\\.0/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 console.log(`Executed Text in Reports page: ${text}`);\n\n //Verify both the log text are same\n expect(text).toContain(executedText);\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"}
package/dist/module.js ADDED
@@ -0,0 +1,405 @@
1
+ import {test as $lE6ZQ$test, expect as $lE6ZQ$expect} from "@playwright/test";
2
+
3
+
4
+
5
+ class $7d546dcaafadc158$export$2b65d1d97338f32b {
6
+ constructor(page){
7
+ this.page = page;
8
+ }
9
+ }
10
+
11
+
12
+ class $e18c8d3707c8c74c$export$36d69433c4f81145 extends (0, $7d546dcaafadc158$export$2b65d1d97338f32b) {
13
+ async clickUserManagement() {
14
+ await this.page.locator("p.MuiTypography-root", {
15
+ hasText: "User management"
16
+ }).click();
17
+ await this.page.getByRole("link", {
18
+ name: "Users"
19
+ }).click();
20
+ }
21
+ async verifyDeployLogoIsPresent() {
22
+ const logo = this.page.getByAltText("Deploy");
23
+ await (0, $lE6ZQ$expect)(logo).toBeVisible();
24
+ }
25
+ async verifyDeployTextIsPresent() {
26
+ const title = this.page.getByTitle("digital.ai");
27
+ await (0, $lE6ZQ$expect)(title).toBeVisible();
28
+ }
29
+ async clickReports() {
30
+ await this.page.locator("p.MuiTypography-root", {
31
+ hasText: "Reports"
32
+ }).click();
33
+ }
34
+ }
35
+
36
+
37
+
38
+
39
+ class $ca2721b1aeb903c5$export$ecdc3cf9d1cfe143 extends (0, $7d546dcaafadc158$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) {
47
+ await this.page.locator("p.MuiTypography-root", {
48
+ hasText: "Users"
49
+ }).click();
50
+ await this.page.getByRole("button", {
51
+ name: "Add user"
52
+ }).click();
53
+ await this.page.locator('input[name="username"]').fill(username);
54
+ await this.page.locator('input[name="fullName"]').fill(fullName);
55
+ await this.page.locator('input[name="email"]').fill(email);
56
+ const passwordInput = this.page.locator('input[name="password"]');
57
+ await passwordInput.click({
58
+ force: true
59
+ });
60
+ await passwordInput.fill(password);
61
+ await this.page.locator('input[name="confirmPassword"]').fill(confirmPassword);
62
+ await this.page.getByRole("button", {
63
+ name: "Save"
64
+ }).click();
65
+ }
66
+ async verifySuccessMessage() {
67
+ const SuccessMessage = this.page.getByRole("alertdialog");
68
+ await (0, $lE6ZQ$expect)(SuccessMessage).toBeVisible();
69
+ await (0, $lE6ZQ$expect)(SuccessMessage).toHaveText(/User ".*" created/i);
70
+ }
71
+ async verifyUserErrorMessage() {
72
+ await (0, $lE6ZQ$expect)(this.page.locator('.rrt-middle-container[role="alertdialog"]').nth(1)).toContainText(/already in use/i);
73
+ }
74
+ async deleteTheUserAndVerifyItIsDeleted(username) {
75
+ await this.page.locator("p.MuiTypography-root", {
76
+ hasText: "Users"
77
+ }).click();
78
+ await this.page.waitForTimeout(10000);
79
+ await this.page.getByPlaceholder("Filter...").fill(username);
80
+ await this.page.waitForTimeout(10000);
81
+ await this.page.locator("td.users-table-actions button.delete.xl-icon.table-action").click();
82
+ await this.page.getByRole("button", {
83
+ name: "Delete",
84
+ exact: true
85
+ }).click();
86
+ const DeleteMessage = this.page.getByRole("alertdialog");
87
+ await (0, $lE6ZQ$expect)(DeleteMessage).toBeVisible();
88
+ await (0, $lE6ZQ$expect)(DeleteMessage).toHaveText(/User ".*" deleted/i);
89
+ }
90
+ async editUserAndVerify(username, editfullname) {
91
+ await this.page.locator("p.MuiTypography-root", {
92
+ hasText: "Users"
93
+ }).click();
94
+ await this.page.waitForTimeout(10000);
95
+ await this.page.getByPlaceholder("Filter...").fill(username);
96
+ await this.page.waitForTimeout(10000);
97
+ await this.page.locator("i.icon-edit.dot-i").first().click();
98
+ await this.page.locator('input[name="fullName"]').fill(editfullname);
99
+ await this.page.getByRole("button", {
100
+ name: "Save",
101
+ exact: true
102
+ }).click();
103
+ const EditMessage = this.page.getByRole("alertdialog");
104
+ await (0, $lE6ZQ$expect)(EditMessage).toBeVisible();
105
+ const editedUsername = this.page.locator("td.users-table-fullName div").textContent();
106
+ // eslint-disable-next-line no-console
107
+ console.log(editedUsername);
108
+ }
109
+ }
110
+
111
+
112
+
113
+ class $a5210fff9cad7e1b$export$c88e1d16f82516d extends (0, $7d546dcaafadc158$export$2b65d1d97338f32b) {
114
+ /* Helps to navigate to the Overthere LocalHost page */ async navigateToOverthereLocalHostPage() {
115
+ const configNode = this.page.locator('span[data-id="Infrastructure"]');
116
+ await configNode.hover();
117
+ await this.page.waitForTimeout(500); // small delay for hover animation
118
+ const menuButton = this.page.locator('i.context-menu-button[data-id="Infrastructure"]');
119
+ await menuButton.click();
120
+ await this.page.getByTitle("New").click();
121
+ await this.page.getByText("overthere").click();
122
+ await this.page.getByText("LocalHost").click();
123
+ }
124
+ /* Helps to create a LocalHost of type UNIX */ async createLocalHostForUnixType(name) {
125
+ await this.page.locator('input[name="name"]').fill(name);
126
+ await this.page.locator('input[type="text"]').nth(7).click();
127
+ await this.page.getByTitle("UNIX").click();
128
+ await this.page.getByRole("button", {
129
+ name: "Save and close"
130
+ }).click();
131
+ }
132
+ /* Helps to create a LocalHost of type WINDOWS */ async createLocalHostForWindowsType(name) {
133
+ await this.page.locator('input[name="name"]').fill(name);
134
+ await this.page.locator('input[type="text"]').nth(7).click();
135
+ await this.page.getByTitle("WINDOWS").click();
136
+ await this.page.getByRole("button", {
137
+ name: "Save and close"
138
+ }).click();
139
+ }
140
+ /* Helps to create a LocalHost of type ZOS */ async createLocalHostForZosType(name) {
141
+ await this.page.locator('input[name="name"]').fill(name);
142
+ await this.page.locator('input[type="text"]').nth(7).click();
143
+ await this.page.getByTitle("ZOS").click();
144
+ await this.page.getByRole("button", {
145
+ name: "Save and close"
146
+ }).click();
147
+ }
148
+ }
149
+
150
+
151
+
152
+ class $8f7dd2349a88e8b2$export$12530425267834a9 extends (0, $7d546dcaafadc158$export$2b65d1d97338f32b) {
153
+ /* Helps to navigate to the Environments page */ async navigateToEnvironmentsPage() {
154
+ const configNode = this.page.locator('span[data-id="Environments"]');
155
+ await configNode.hover();
156
+ await this.page.waitForTimeout(500); // small delay for hover animation
157
+ const menuButton = this.page.locator('i.context-menu-button[data-id="Environments"]');
158
+ await menuButton.click();
159
+ await this.page.getByTitle("New").click();
160
+ await this.page.getByTitle("udm.Environment").click();
161
+ }
162
+ /* Helps to create a new Environment */ async createEnvironment(name) {
163
+ await this.page.locator('input[name="name"]').fill(name);
164
+ await this.page.locator("i.xl-icon.arrow-down-icon.show-all").nth(0).click();
165
+ await this.page.getByTitle("Infrastructure/UnixHost").click();
166
+ await this.page.getByRole("button", {
167
+ name: "Save and close"
168
+ }).click();
169
+ }
170
+ }
171
+
172
+
173
+
174
+
175
+ class $821992227d07c10c$export$1533b625ec0c75e2 extends (0, $7d546dcaafadc158$export$2b65d1d97338f32b) {
176
+ taskId = "";
177
+ executedText = "";
178
+ /* Helps to navigate to the Applications page */ async navigateToApplicationsPage() {
179
+ const configNode = this.page.locator('span[data-id="Applications"]');
180
+ await configNode.hover();
181
+ await this.page.waitForTimeout(500); // small delay for hover animation
182
+ await this.page.locator('i.context-menu-button[data-id="Applications"]').click();
183
+ await this.page.getByTitle("New").click();
184
+ await this.page.getByTitle("udm.Application").click();
185
+ }
186
+ /*Create a New Application and Deployment Package */ async createNewDeploymentPackage(applicationName, packageName, cmdAppName, cmdAppCommand) {
187
+ await this.page.locator('input[name="name"]').fill(applicationName);
188
+ await this.page.getByRole("button", {
189
+ name: "Save and close"
190
+ }).click();
191
+ await this.page.locator('div[data-id="Applications"] .infinite-tree-node > a').click();
192
+ const configNode = this.page.locator('span[data-id="Applications/Test Application"]');
193
+ await configNode.hover();
194
+ await this.page.waitForTimeout(500);
195
+ await this.page.locator('i.context-menu-button[data-id="Applications/Test Application"]').click();
196
+ await this.page.getByTitle("New").click();
197
+ await this.page.getByTitle("udm.DeploymentPackage").click();
198
+ await this.page.locator('input[name="name"]').fill(packageName);
199
+ await this.page.getByRole("button", {
200
+ name: "Save and close"
201
+ }).click();
202
+ await this.page.waitForTimeout(1000);
203
+ await this.page.locator('div[data-id="Applications/Test Application"] .infinite-tree-node > a').click();
204
+ await this.page.waitForTimeout(500);
205
+ await this.page.locator('span[data-id="Applications/Test Application/1.0.0"]').click();
206
+ await this.page.locator('i.context-menu-button[data-id="Applications/Test Application/1.0.0"]').click();
207
+ await this.page.getByTitle("New").click();
208
+ await this.page.getByTitle("cmd", {
209
+ exact: true
210
+ }).click();
211
+ await this.page.getByTitle("cmd.Command", {
212
+ exact: true
213
+ }).click();
214
+ await this.page.locator('input[name="name"]').fill(cmdAppName);
215
+ await this.page.locator('textarea[name="commandLine"]').fill(cmdAppCommand);
216
+ await this.page.waitForTimeout(500);
217
+ await this.page.locator("button", {
218
+ hasText: /^Save$/
219
+ }).first().click();
220
+ await this.page.waitForTimeout(1000);
221
+ await this.page.locator("i.xl-icon.close-icon").first().click();
222
+ }
223
+ /*Deploy the application*/ async deployApp() {
224
+ /* await this.page.locator('span[data-id="Applications"]').click();
225
+ await this.page.waitForTimeout(1000);
226
+ await this.page.locator('div[data-id="Applications"] .infinite-tree-toggler').click({ force: true });
227
+ //await this.page.locator('div[data-id="Applications"] .infinite-tree-node > a').click({ force: true });
228
+ await this.page.waitForTimeout(1000);
229
+ await this.page.locator('div[data-id="Applications/Test Application"] .infinite-tree-node > a').click();
230
+ await this.page.locator('span[data-id="Applications/Test Application/1.0.0"]').click(); */ await this.page.waitForTimeout(3000);
231
+ await this.page.locator('i.context-menu-button[data-id="Applications/Test Application/1.0.0"]').click();
232
+ await this.page.locator('a[title="Deploy"]').click();
233
+ await this.page.locator('input[name="selections"][value="Environments/Test Environment"]').click();
234
+ await this.page.getByRole("button", {
235
+ name: "Continue"
236
+ }).click();
237
+ await this.page.waitForTimeout(1000);
238
+ await this.page.locator("button.deploy.xl-primary").click();
239
+ await this.page.waitForTimeout(5000);
240
+ //Get the task id
241
+ this.taskId = await this.page.locator("div.task-id").textContent() || "";
242
+ console.log(`Deployment Task ID in applications page: ${this.taskId}`);
243
+ //Verify no failure and all are done
244
+ const labels = this.page.locator("span.label");
245
+ await (0, $lE6ZQ$expect)(labels).toHaveCount(3);
246
+ await (0, $lE6ZQ$expect)(labels).toHaveText([
247
+ "EXECUTED",
248
+ "DONE",
249
+ "DONE"
250
+ ]);
251
+ //Get the text executed
252
+ await this.page.locator('div[data-id="0_1_1"] .infinite-tree-node > a').click();
253
+ await this.page.getByTitle("Execute Test Command").click();
254
+ this.executedText = await this.page.locator("div.step-log-body pre").nth(1).innerText();
255
+ console.log(`Executed Text in applications page: ${this.executedText}`);
256
+ //Verify in monitoring tab searching with the task id
257
+ await this.page.locator('div[data-id="TASK_MONITOR"] .infinite-tree-node > a').click();
258
+ await this.page.locator('span[data-id="DEPLOYMENT_TASKS"]').dblclick();
259
+ await this.page.waitForTimeout(5000);
260
+ await this.page.locator('div.deployment-task-filter-task-id input[placeholder="Search"]').first().fill(this.taskId);
261
+ const stateText = await this.page.locator("td.tasks-table-state").first().innerText();
262
+ console.log(`Task state: ${stateText}`);
263
+ (0, $lE6ZQ$expect)(stateText.trim()).toBe("Executed");
264
+ //Click the row to go to deployment screen
265
+ await this.page.locator("table.table.table-striped tbody tr").first().dblclick();
266
+ await this.page.waitForTimeout(5000);
267
+ await this.page.locator("button.finish.xl-primary").click();
268
+ }
269
+ }
270
+
271
+
272
+
273
+
274
+ class $76bad9b9e6741f37$export$b8a443164510a1b4 extends (0, $7d546dcaafadc158$export$2b65d1d97338f32b) {
275
+ async clickDeploymentTasks() {
276
+ await this.page.locator("p.MuiTypography-root", {
277
+ hasText: "Deployments"
278
+ }).click();
279
+ }
280
+ async verifyTheRowValues() {
281
+ const firstRow = this.page.locator("tbody tr").first();
282
+ await (0, $lE6ZQ$expect)(firstRow.locator(".report-table-package")).toHaveText("Test Application/1.0.0");
283
+ await (0, $lE6ZQ$expect)(firstRow.locator(".report-table-originalType")).toHaveText(/Initial/i); // Regex ignores case
284
+ await (0, $lE6ZQ$expect)(firstRow.locator(".report-table-user")).toHaveText("admin");
285
+ }
286
+ async verifyTheDeploymentValues(taskID, executedText) {
287
+ /*const searchInput = this.page.locator('div.deployment-task-filter-task-id input[placeholder="Search"]').first();
288
+ await searchInput.waitFor({ state: 'visible' });
289
+ await searchInput.scrollIntoViewIfNeeded();
290
+ await searchInput.click({ force: true });
291
+ await searchInput.fill(taskID);*/ await this.page.locator('div.deployment-task-filter-task-id input[placeholder="Search"]:visible').first().fill(taskID);
292
+ await this.page.waitForTimeout(5000);
293
+ // await this.page.waitForSelector('table.table.table-striped tbody tr', { timeout: 60000 });
294
+ //await this.page.locator('table.table.table-striped tbody tr').first().waitFor();
295
+ //await expect(this.page.locator('table.table.table-striped tbody tr').first().locator('td.report-table-package .deployment-report-package')).toHaveText('Test Application/1.0.0');
296
+ await this.page.waitForSelector("td.report-table-package .deployment-report-package", {
297
+ timeout: 30000
298
+ });
299
+ await (0, $lE6ZQ$expect)(this.page.locator("td.report-table-package .deployment-report-package")).toHaveText(/Test Application\/1\.0\.0/i);
300
+ await (0, $lE6ZQ$expect)(this.page.locator("td.report-table-originalType .deployment-report-task-type")).toHaveText(/Initial/i); // Regex ignores case
301
+ await (0, $lE6ZQ$expect)(this.page.locator("td.report-table-user .deployment-report-user")).toHaveText("admin");
302
+ //Click the row
303
+ await this.page.locator("td.report-table-package .deployment-report-package").dblclick();
304
+ await this.page.locator('div[data-id="0_1_1"] .infinite-tree-node > a').click();
305
+ await this.page.getByTitle("Execute Test Command").click();
306
+ //Get the log text
307
+ const text = await this.page.locator("div.step-log-body pre").nth(1).innerText();
308
+ console.log(`Executed Text in Reports page: ${text}`);
309
+ //Verify both the log text are same
310
+ (0, $lE6ZQ$expect)(text).toContain(executedText);
311
+ }
312
+ }
313
+
314
+
315
+ class $95d5ebc9765b570f$export$b8a61e5c71402559 {
316
+ constructor(page){
317
+ this.page = page;
318
+ this.homePage = new (0, $e18c8d3707c8c74c$export$36d69433c4f81145)(page);
319
+ this.userPage = new (0, $ca2721b1aeb903c5$export$ecdc3cf9d1cfe143)(page);
320
+ this.overthereLocalHostPage = new (0, $a5210fff9cad7e1b$export$c88e1d16f82516d)(page);
321
+ this.environmentsPage = new (0, $8f7dd2349a88e8b2$export$12530425267834a9)(page);
322
+ this.applicationsPage = new (0, $821992227d07c10c$export$1533b625ec0c75e2)(page);
323
+ this.reportsPage = new (0, $76bad9b9e6741f37$export$b8a443164510a1b4)(page);
324
+ }
325
+ async navigateToHomePage() {
326
+ await this.page.goto("/home");
327
+ }
328
+ async navigateToUserPage() {
329
+ await this.page.locator("p.MuiTypography-root", {
330
+ hasText: "User management"
331
+ }).click();
332
+ }
333
+ async clickCollapseSideView() {
334
+ const collapseButton = this.page.getByTestId("back-button");
335
+ await collapseButton.click();
336
+ }
337
+ }
338
+
339
+
340
+
341
+
342
+ class $c5e912d43cd579b2$export$f14c0e3f98d164c0 extends (0, $7d546dcaafadc158$export$2b65d1d97338f32b) {
343
+ /**
344
+ * Login with username and password
345
+ * @param userName
346
+ * @param password
347
+ */ async login(userName, password) {
348
+ await this.page.goto("/#/login");
349
+ await (0, $lE6ZQ$expect)(this.page).toHaveTitle("Digital.ai Deploy");
350
+ await this.page.getByPlaceholder("user").fill(userName, {
351
+ timeout: 1000
352
+ });
353
+ await this.page.getByPlaceholder("Password").fill(password, {
354
+ timeout: 10000
355
+ });
356
+ await this.page.getByRole("button", {
357
+ name: "Log in"
358
+ }).click({
359
+ timeout: 10000
360
+ });
361
+ }
362
+ async verifyInvalidPasswordMessage() {
363
+ const errorMessage = this.page.getByText("The username and/or password you have entered is incorrect.");
364
+ await (0, $lE6ZQ$expect)(errorMessage).toBeVisible();
365
+ }
366
+ /**
367
+ * Logout as authenticated user
368
+ */ async logout() {
369
+ await this.page.locator("button.dot-avatar").click();
370
+ await this.page.getByText("Log out", {
371
+ exact: true
372
+ }).click();
373
+ await (0, $lE6ZQ$expect)(this.page.getByText("Log in").first()).toBeVisible();
374
+ }
375
+ }
376
+
377
+
378
+ const $114b0b206b8d644f$export$e0969da9b8fb378d = (0, $lE6ZQ$test).extend({
379
+ fixtures: async ({ page: page }, use)=>{
380
+ const fixtures = new $114b0b206b8d644f$var$Fixtures(page);
381
+ await use(fixtures);
382
+ return fixtures;
383
+ },
384
+ loginPage: async ({ page: page }, use)=>{
385
+ const loginPage = new (0, $c5e912d43cd579b2$export$f14c0e3f98d164c0)(page);
386
+ await use(loginPage);
387
+ return loginPage;
388
+ },
389
+ navigation: async ({ page: page }, use)=>{
390
+ const navigationPage = new (0, $95d5ebc9765b570f$export$b8a61e5c71402559)(page);
391
+ await use(navigationPage);
392
+ return navigationPage;
393
+ }
394
+ });
395
+ class $114b0b206b8d644f$var$Fixtures {
396
+ constructor(page){
397
+ this.page = page;
398
+ }
399
+ }
400
+
401
+
402
+
403
+
404
+ export {$114b0b206b8d644f$export$e0969da9b8fb378d as test};
405
+ //# sourceMappingURL=module.js.map
@@ -0,0 +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/overthereLocaHostPage.ts","apps/deploy/pages/environmentsPage.ts","apps/deploy/pages/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 './overthereLocaHostPage';\nimport { EnvironmentsPage } from './environmentsPage';\nimport { ApplicationsPage } from './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);\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","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 /**\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 OverthereLocalHostPage extends WithPage {\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.waitForTimeout(500); // small delay for hover animation\n const menuButton = this.page.locator('i.context-menu-button[data-id=\"Infrastructure\"]');\n await menuButton.click();\n await this.page.getByTitle('New').click();\n await this.page.getByText('overthere').click();\n await this.page.getByText('LocalHost').click();\n }\n\n /* Helps to create a LocalHost of type UNIX */\n async createLocalHostForUnixType(name: string): Promise<void> {\n await this.page.locator('input[name=\"name\"]').fill(name);\n await this.page.locator('input[type=\"text\"]').nth(7).click();\n await this.page.getByTitle('UNIX').click();\n await this.page.getByRole('button', { name: 'Save and close' }).click();\n }\n\n /* Helps to create a LocalHost of type WINDOWS */\n async createLocalHostForWindowsType(name: string): Promise<void> {\n await this.page.locator('input[name=\"name\"]').fill(name);\n await this.page.locator('input[type=\"text\"]').nth(7).click();\n await this.page.getByTitle('WINDOWS').click();\n await this.page.getByRole('button', { name: 'Save and close' }).click();\n }\n\n /* Helps to create a LocalHost of type ZOS */\n async createLocalHostForZosType(name: string): Promise<void> {\n await this.page.locator('input[name=\"name\"]').fill(name);\n await this.page.locator('input[type=\"text\"]').nth(7).click();\n await this.page.getByTitle('ZOS').click();\n await this.page.getByRole('button', { name: 'Save and close' }).click();\n }\n}\n","import { expect } from '@playwright/test';\nimport { WithPage } from './withPage';\n\nexport class EnvironmentsPage extends WithPage {\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.waitForTimeout(500); // small delay for hover animation\n const menuButton = this.page.locator('i.context-menu-button[data-id=\"Environments\"]');\n await menuButton.click();\n await this.page.getByTitle('New').click();\n await this.page.getByTitle('udm.Environment').click();\n }\n\n /* Helps to create a new Environment */\n async createEnvironment(name: string): Promise<void> {\n await this.page.locator('input[name=\"name\"]').fill(name);\n await this.page.locator('i.xl-icon.arrow-down-icon.show-all').nth(0).click();\n await this.page.getByTitle('Infrastructure/UnixHost').click();\n await this.page.getByRole('button', { name: 'Save and close' }).click();\n }\n}\n","import { expect } from '@playwright/test';\nimport { WithPage } from './withPage';\n\nexport class ApplicationsPage extends WithPage {\n taskId: string = '';\n executedText: string = '';\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.waitForTimeout(500); // small delay for hover animation\n await this.page.locator('i.context-menu-button[data-id=\"Applications\"]').click();\n await this.page.getByTitle('New').click();\n await this.page.getByTitle('udm.Application').click();\n }\n\n /*Create a New Application and Deployment Package */\n async createNewDeploymentPackage(\n applicationName: string,\n packageName: string,\n cmdAppName: string,\n cmdAppCommand: string,\n ): Promise<void> {\n await this.page.locator('input[name=\"name\"]').fill(applicationName);\n await this.page.getByRole('button', { name: 'Save and close' }).click();\n await this.page.locator('div[data-id=\"Applications\"] .infinite-tree-node > a').click();\n const configNode = this.page.locator('span[data-id=\"Applications/Test Application\"]');\n await configNode.hover();\n await this.page.waitForTimeout(500);\n await this.page.locator('i.context-menu-button[data-id=\"Applications/Test Application\"]').click();\n await this.page.getByTitle('New').click();\n await this.page.getByTitle('udm.DeploymentPackage').click();\n await this.page.locator('input[name=\"name\"]').fill(packageName);\n await this.page.getByRole('button', { name: 'Save and close' }).click();\n await this.page.waitForTimeout(1000);\n await this.page.locator('div[data-id=\"Applications/Test Application\"] .infinite-tree-node > a').click();\n await this.page.waitForTimeout(500);\n await this.page.locator('span[data-id=\"Applications/Test Application/1.0.0\"]').click();\n await this.page.locator('i.context-menu-button[data-id=\"Applications/Test Application/1.0.0\"]').click();\n await this.page.getByTitle('New').click();\n await this.page.getByTitle('cmd', { exact: true }).click();\n await this.page.getByTitle('cmd.Command', { exact: true }).click();\n await this.page.locator('input[name=\"name\"]').fill(cmdAppName);\n await this.page.locator('textarea[name=\"commandLine\"]').fill(cmdAppCommand);\n await this.page.waitForTimeout(500);\n await this.page\n .locator('button', { hasText: /^Save$/ })\n .first()\n .click();\n await this.page.waitForTimeout(1000);\n await this.page.locator('i.xl-icon.close-icon').first().click();\n }\n\n /*Deploy the application*/\n async deployApp(): Promise<void> {\n /* await this.page.locator('span[data-id=\"Applications\"]').click();\n await this.page.waitForTimeout(1000);\n await this.page.locator('div[data-id=\"Applications\"] .infinite-tree-toggler').click({ force: true }); \n //await this.page.locator('div[data-id=\"Applications\"] .infinite-tree-node > a').click({ force: true }); \n await this.page.waitForTimeout(1000);\n await this.page.locator('div[data-id=\"Applications/Test Application\"] .infinite-tree-node > a').click(); \n await this.page.locator('span[data-id=\"Applications/Test Application/1.0.0\"]').click(); */\n await this.page.waitForTimeout(3000);\n await this.page.locator('i.context-menu-button[data-id=\"Applications/Test Application/1.0.0\"]').click();\n await this.page.locator('a[title=\"Deploy\"]').click();\n await this.page.locator('input[name=\"selections\"][value=\"Environments/Test Environment\"]').click();\n await this.page.getByRole('button', { name: 'Continue' }).click();\n await this.page.waitForTimeout(1000);\n await this.page.locator('button.deploy.xl-primary').click();\n await this.page.waitForTimeout(5000);\n\n //Get the task id\n this.taskId = (await this.page.locator('div.task-id').textContent()) || '';\n console.log(`Deployment Task ID in applications page: ${this.taskId}`);\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 console.log(`Executed Text in applications page: ${this.executedText}`);\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 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 console.log(`Task state: ${stateText}`);\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 await this.page.waitForTimeout(5000);\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 async clickDeploymentTasks(): Promise<void> {\n await this.page.locator('p.MuiTypography-root', { hasText: 'Deployments' }).click();\n }\n\n async verifyTheRowValues(): Promise<void> {\n const firstRow = this.page.locator('tbody tr').first();\n await expect(firstRow.locator('.report-table-package')).toHaveText('Test Application/1.0.0');\n await expect(firstRow.locator('.report-table-originalType')).toHaveText(/Initial/i); // Regex ignores case\n await expect(firstRow.locator('.report-table-user')).toHaveText('admin');\n }\n\n async verifyTheDeploymentValues(taskID: string, executedText: string): Promise<void> {\n /*const searchInput = this.page.locator('div.deployment-task-filter-task-id input[placeholder=\"Search\"]').first();\n await searchInput.waitFor({ state: 'visible' });\n await searchInput.scrollIntoViewIfNeeded();\n await searchInput.click({ force: true });\n await searchInput.fill(taskID);*/\n await this.page\n .locator('div.deployment-task-filter-task-id input[placeholder=\"Search\"]:visible')\n .first()\n .fill(taskID!);\n await this.page.waitForTimeout(5000);\n // await this.page.waitForSelector('table.table.table-striped tbody tr', { timeout: 60000 });\n //await this.page.locator('table.table.table-striped tbody tr').first().waitFor();\n //await expect(this.page.locator('table.table.table-striped tbody tr').first().locator('td.report-table-package .deployment-report-package')).toHaveText('Test Application/1.0.0');\n await this.page.waitForSelector('td.report-table-package .deployment-report-package', { timeout: 30000 });\n await expect(this.page.locator('td.report-table-package .deployment-report-package')).toHaveText(\n /Test Application\\/1\\.0\\.0/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 console.log(`Executed Text in Reports page: ${text}`);\n\n //Verify both the log text are same\n expect(text).toContain(executedText);\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"}
@@ -0,0 +1,81 @@
1
+ import { Page } from "@playwright/test";
2
+ declare class WithPage {
3
+ protected readonly page: Page;
4
+ constructor(page: Page);
5
+ }
6
+ declare class HomePage extends WithPage {
7
+ clickUserManagement(): Promise<void>;
8
+ verifyDeployLogoIsPresent(): Promise<void>;
9
+ verifyDeployTextIsPresent(): Promise<void>;
10
+ clickReports(): Promise<void>;
11
+ }
12
+ declare class UserPage extends WithPage {
13
+ /**
14
+ * Login with username and password
15
+ * @param userName
16
+ * @param password
17
+ */
18
+ createNewUser(username: string, fullName: string, email: string, password: string, confirmPassword: string): Promise<void>;
19
+ verifySuccessMessage(): Promise<void>;
20
+ verifyUserErrorMessage(): Promise<void>;
21
+ deleteTheUserAndVerifyItIsDeleted(username: string): Promise<void>;
22
+ editUserAndVerify(username: string, editfullname: string): Promise<void>;
23
+ }
24
+ declare class OverthereLocalHostPage extends WithPage {
25
+ navigateToOverthereLocalHostPage(): Promise<void>;
26
+ createLocalHostForUnixType(name: string): Promise<void>;
27
+ createLocalHostForWindowsType(name: string): Promise<void>;
28
+ createLocalHostForZosType(name: string): Promise<void>;
29
+ }
30
+ declare class EnvironmentsPage extends WithPage {
31
+ navigateToEnvironmentsPage(): Promise<void>;
32
+ createEnvironment(name: string): Promise<void>;
33
+ }
34
+ declare class ApplicationsPage extends WithPage {
35
+ taskId: string;
36
+ executedText: string;
37
+ navigateToApplicationsPage(): Promise<void>;
38
+ createNewDeploymentPackage(applicationName: string, packageName: string, cmdAppName: string, cmdAppCommand: string): Promise<void>;
39
+ deployApp(): Promise<void>;
40
+ }
41
+ declare class ReportsPage extends WithPage {
42
+ clickDeploymentTasks(): Promise<void>;
43
+ verifyTheRowValues(): Promise<void>;
44
+ verifyTheDeploymentValues(taskID: string, executedText: string): Promise<void>;
45
+ }
46
+ declare class Navigation {
47
+ homePage: HomePage;
48
+ userPage: UserPage;
49
+ overthereLocalHostPage: OverthereLocalHostPage;
50
+ environmentsPage: EnvironmentsPage;
51
+ applicationsPage: ApplicationsPage;
52
+ reportsPage: ReportsPage;
53
+ constructor(page: Page);
54
+ navigateToHomePage(): Promise<void>;
55
+ navigateToUserPage(): Promise<void>;
56
+ clickCollapseSideView(): Promise<void>;
57
+ }
58
+ declare class LoginPage extends WithPage {
59
+ /**
60
+ * Login with username and password
61
+ * @param userName
62
+ * @param password
63
+ */
64
+ login(userName: string, password: string): Promise<void>;
65
+ verifyInvalidPasswordMessage(): Promise<void>;
66
+ /**
67
+ * Logout as authenticated user
68
+ */
69
+ logout(): Promise<void>;
70
+ }
71
+ type DeployFixtures = {
72
+ fixtures: Fixtures;
73
+ loginPage: LoginPage;
74
+ navigation: Navigation;
75
+ };
76
+ export const test: import("@playwright/test").TestType<import("@playwright/test").PlaywrightTestArgs & import("@playwright/test").PlaywrightTestOptions & DeployFixtures, import("@playwright/test").PlaywrightWorkerArgs & import("@playwright/test").PlaywrightWorkerOptions>;
77
+ declare class Fixtures {
78
+ constructor(page: Page);
79
+ }
80
+
81
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
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/overthereLocaHostPage.ts","apps/deploy/pages/environmentsPage.ts","apps/deploy/pages/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 /**\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 OverthereLocalHostPage extends WithPage {\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.waitForTimeout(500); // small delay for hover animation\n const menuButton = this.page.locator('i.context-menu-button[data-id=\"Infrastructure\"]');\n await menuButton.click();\n await this.page.getByTitle('New').click();\n await this.page.getByText('overthere').click();\n await this.page.getByText('LocalHost').click();\n }\n\n /* Helps to create a LocalHost of type UNIX */\n async createLocalHostForUnixType(name: string): Promise<void> {\n await this.page.locator('input[name=\"name\"]').fill(name);\n await this.page.locator('input[type=\"text\"]').nth(7).click();\n await this.page.getByTitle('UNIX').click();\n await this.page.getByRole('button', { name: 'Save and close' }).click();\n }\n\n /* Helps to create a LocalHost of type WINDOWS */\n async createLocalHostForWindowsType(name: string): Promise<void> {\n await this.page.locator('input[name=\"name\"]').fill(name);\n await this.page.locator('input[type=\"text\"]').nth(7).click();\n await this.page.getByTitle('WINDOWS').click();\n await this.page.getByRole('button', { name: 'Save and close' }).click();\n }\n\n /* Helps to create a LocalHost of type ZOS */\n async createLocalHostForZosType(name: string): Promise<void> {\n await this.page.locator('input[name=\"name\"]').fill(name);\n await this.page.locator('input[type=\"text\"]').nth(7).click();\n await this.page.getByTitle('ZOS').click();\n await this.page.getByRole('button', { name: 'Save and close' }).click();\n }\n}\n","import { expect } from '@playwright/test';\nimport { WithPage } from './withPage';\n\nexport class EnvironmentsPage extends WithPage {\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.waitForTimeout(500); // small delay for hover animation\n const menuButton = this.page.locator('i.context-menu-button[data-id=\"Environments\"]');\n await menuButton.click();\n await this.page.getByTitle('New').click();\n await this.page.getByTitle('udm.Environment').click();\n }\n\n /* Helps to create a new Environment */\n async createEnvironment(name: string): Promise<void> {\n await this.page.locator('input[name=\"name\"]').fill(name);\n await this.page.locator('i.xl-icon.arrow-down-icon.show-all').nth(0).click();\n await this.page.getByTitle('Infrastructure/UnixHost').click();\n await this.page.getByRole('button', { name: 'Save and close' }).click();\n }\n}\n","import { expect } from '@playwright/test';\nimport { WithPage } from './withPage';\n\nexport class ApplicationsPage extends WithPage {\n taskId: string = '';\n executedText: string = '';\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.waitForTimeout(500); // small delay for hover animation\n await this.page.locator('i.context-menu-button[data-id=\"Applications\"]').click();\n await this.page.getByTitle('New').click();\n await this.page.getByTitle('udm.Application').click();\n }\n\n /*Create a New Application and Deployment Package */\n async createNewDeploymentPackage(\n applicationName: string,\n packageName: string,\n cmdAppName: string,\n cmdAppCommand: string,\n ): Promise<void> {\n await this.page.locator('input[name=\"name\"]').fill(applicationName);\n await this.page.getByRole('button', { name: 'Save and close' }).click();\n await this.page.locator('div[data-id=\"Applications\"] .infinite-tree-node > a').click();\n const configNode = this.page.locator('span[data-id=\"Applications/Test Application\"]');\n await configNode.hover();\n await this.page.waitForTimeout(500);\n await this.page.locator('i.context-menu-button[data-id=\"Applications/Test Application\"]').click();\n await this.page.getByTitle('New').click();\n await this.page.getByTitle('udm.DeploymentPackage').click();\n await this.page.locator('input[name=\"name\"]').fill(packageName);\n await this.page.getByRole('button', { name: 'Save and close' }).click();\n await this.page.waitForTimeout(1000);\n await this.page.locator('div[data-id=\"Applications/Test Application\"] .infinite-tree-node > a').click();\n await this.page.waitForTimeout(500);\n await this.page.locator('span[data-id=\"Applications/Test Application/1.0.0\"]').click();\n await this.page.locator('i.context-menu-button[data-id=\"Applications/Test Application/1.0.0\"]').click();\n await this.page.getByTitle('New').click();\n await this.page.getByTitle('cmd', { exact: true }).click();\n await this.page.getByTitle('cmd.Command', { exact: true }).click();\n await this.page.locator('input[name=\"name\"]').fill(cmdAppName);\n await this.page.locator('textarea[name=\"commandLine\"]').fill(cmdAppCommand);\n await this.page.waitForTimeout(500);\n await this.page\n .locator('button', { hasText: /^Save$/ })\n .first()\n .click();\n await this.page.waitForTimeout(1000);\n await this.page.locator('i.xl-icon.close-icon').first().click();\n }\n\n /*Deploy the application*/\n async deployApp(): Promise<void> {\n /* await this.page.locator('span[data-id=\"Applications\"]').click();\n await this.page.waitForTimeout(1000);\n await this.page.locator('div[data-id=\"Applications\"] .infinite-tree-toggler').click({ force: true }); \n //await this.page.locator('div[data-id=\"Applications\"] .infinite-tree-node > a').click({ force: true }); \n await this.page.waitForTimeout(1000);\n await this.page.locator('div[data-id=\"Applications/Test Application\"] .infinite-tree-node > a').click(); \n await this.page.locator('span[data-id=\"Applications/Test Application/1.0.0\"]').click(); */\n await this.page.waitForTimeout(3000);\n await this.page.locator('i.context-menu-button[data-id=\"Applications/Test Application/1.0.0\"]').click();\n await this.page.locator('a[title=\"Deploy\"]').click();\n await this.page.locator('input[name=\"selections\"][value=\"Environments/Test Environment\"]').click();\n await this.page.getByRole('button', { name: 'Continue' }).click();\n await this.page.waitForTimeout(1000);\n await this.page.locator('button.deploy.xl-primary').click();\n await this.page.waitForTimeout(5000);\n\n //Get the task id\n this.taskId = (await this.page.locator('div.task-id').textContent()) || '';\n console.log(`Deployment Task ID in applications page: ${this.taskId}`);\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 console.log(`Executed Text in applications page: ${this.executedText}`);\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 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 console.log(`Task state: ${stateText}`);\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 await this.page.waitForTimeout(5000);\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 async clickDeploymentTasks(): Promise<void> {\n await this.page.locator('p.MuiTypography-root', { hasText: 'Deployments' }).click();\n }\n\n async verifyTheRowValues(): Promise<void> {\n const firstRow = this.page.locator('tbody tr').first();\n await expect(firstRow.locator('.report-table-package')).toHaveText('Test Application/1.0.0');\n await expect(firstRow.locator('.report-table-originalType')).toHaveText(/Initial/i); // Regex ignores case\n await expect(firstRow.locator('.report-table-user')).toHaveText('admin');\n }\n\n async verifyTheDeploymentValues(taskID: string, executedText: string): Promise<void> {\n /*const searchInput = this.page.locator('div.deployment-task-filter-task-id input[placeholder=\"Search\"]').first();\n await searchInput.waitFor({ state: 'visible' });\n await searchInput.scrollIntoViewIfNeeded();\n await searchInput.click({ force: true });\n await searchInput.fill(taskID);*/\n await this.page\n .locator('div.deployment-task-filter-task-id input[placeholder=\"Search\"]:visible')\n .first()\n .fill(taskID!);\n await this.page.waitForTimeout(5000);\n // await this.page.waitForSelector('table.table.table-striped tbody tr', { timeout: 60000 });\n //await this.page.locator('table.table.table-striped tbody tr').first().waitFor();\n //await expect(this.page.locator('table.table.table-striped tbody tr').first().locator('td.report-table-package .deployment-report-package')).toHaveText('Test Application/1.0.0');\n await this.page.waitForSelector('td.report-table-package .deployment-report-package', { timeout: 30000 });\n await expect(this.page.locator('td.report-table-package .deployment-report-package')).toHaveText(\n /Test Application\\/1\\.0\\.0/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 console.log(`Executed Text in Reports page: ${text}`);\n\n //Verify both the log text are same\n expect(text).toContain(executedText);\n }\n}\n","import { Page } from '@playwright/test';\nimport { HomePage } from './homePage';\nimport { UserPage } from './usersPage';\nimport { OverthereLocalHostPage } from './overthereLocaHostPage';\nimport { EnvironmentsPage } from './environmentsPage';\nimport { ApplicationsPage } from './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);\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","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"}
package/package.json ADDED
@@ -0,0 +1,47 @@
1
+ {
2
+ "name": "@digital-ai/devops-page-object-deploy",
3
+ "version": "0.0.0-snapshot-20251104102306",
4
+ "source": "index.ts",
5
+ "main": "dist/main.js",
6
+ "module": "dist/module.js",
7
+ "types": "dist/types.d.ts",
8
+ "license": "SEE LICENSE IN <LICENSE.md>",
9
+ "private": false,
10
+ "repository": {
11
+ "type": "git",
12
+ "url": "git@github.com:digital-ai/devops-page-objects.git"
13
+ },
14
+ "description": "This is a collection of page objects for Playwright that can be used to automate actions on Digital.ai Deploy",
15
+ "dependencies": {
16
+ "lodash": "4.17.21",
17
+ "rambda": "^8.2.0"
18
+ },
19
+ "devDependencies": {
20
+ "@parcel/packager-ts": "2.8.3",
21
+ "@parcel/transformer-typescript-types": "^2.8.3",
22
+ "@types/lodash": "4.14.192",
23
+ "parcel": "2.8.3",
24
+ "typescript": "4.5.3",
25
+ "eslint-config-custom": "0.0.0",
26
+ "tsconfig": "0.0.0"
27
+ },
28
+ "peerDependencies": {
29
+ "@playwright/test": "^1.34.3"
30
+ },
31
+ "targets": {
32
+ "main": {
33
+ "includeNodeModules": [
34
+ "lodash"
35
+ ]
36
+ }
37
+ },
38
+ "publishConfig": {
39
+ "access": "public"
40
+ },
41
+ "scripts": {
42
+ "lint": "eslint . --ext .js,.jsx,.ts,.tsx",
43
+ "tsc": "tsc --noEmit",
44
+ "build": "parcel build --cache-dir .parcel-cache",
45
+ "e2e": "e2e-test"
46
+ }
47
+ }