@digital-ai/devops-page-object-deploy 0.0.7 → 0.0.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # @digital-ai/devops-page-object-deploy
2
2
 
3
+ ## 0.0.8
4
+
5
+ ### Patch Changes
6
+
7
+ - a791aa6: Cmd App Deployment workflow
8
+
3
9
  ## 0.0.7
4
10
 
5
11
  ### Patch Changes
package/dist/main.js CHANGED
@@ -31,19 +31,18 @@ class $f280624787ceceed$export$36d69433c4f81145 extends (0, $ae23b16684112d0b$ex
31
31
  const title = this.page.getByTitle("digital.ai");
32
32
  await (0, $1UEKj$playwrighttest.expect)(title).toBeVisible();
33
33
  }
34
+ async clickReports() {
35
+ await this.page.locator("p.MuiTypography-root", {
36
+ hasText: "Reports"
37
+ }).click();
38
+ }
34
39
  }
35
40
 
36
41
 
37
42
 
38
43
 
39
44
  class $c949c453826379e3$export$ecdc3cf9d1cfe143 extends (0, $ae23b16684112d0b$export$2b65d1d97338f32b) {
40
- /**
41
- * Login with username and password
42
- * @param userName
43
- * @param password
44
- */ // this should be refactored to take an object and not disable the rule!!
45
- // eslint-disable-next-line max-params
46
- async createNewUser(username, fullName, email, password, confirmPassword) {
45
+ /* Create a new user */ async createNewUser(username, email, password) {
47
46
  await this.page.locator("p.MuiTypography-root", {
48
47
  hasText: "Users"
49
48
  }).click();
@@ -51,33 +50,31 @@ class $c949c453826379e3$export$ecdc3cf9d1cfe143 extends (0, $ae23b16684112d0b$ex
51
50
  name: "Add user"
52
51
  }).click();
53
52
  await this.page.locator('input[name="username"]').fill(username);
54
- await this.page.locator('input[name="fullName"]').fill(fullName);
53
+ await this.page.locator('input[name="fullName"]').fill(username);
55
54
  await this.page.locator('input[name="email"]').fill(email);
56
55
  const passwordInput = this.page.locator('input[name="password"]');
57
56
  await passwordInput.click({
58
57
  force: true
59
58
  });
60
59
  await passwordInput.fill(password);
61
- await this.page.locator('input[name="confirmPassword"]').fill(confirmPassword);
60
+ await this.page.locator('input[name="confirmPassword"]').fill(password);
62
61
  await this.page.getByRole("button", {
63
62
  name: "Save"
64
63
  }).click();
65
64
  }
66
- async verifySuccessMessage() {
65
+ /* Verify success message */ async verifySuccessMessage() {
67
66
  const SuccessMessage = this.page.getByRole("alertdialog");
68
67
  await (0, $1UEKj$playwrighttest.expect)(SuccessMessage).toBeVisible();
69
68
  await (0, $1UEKj$playwrighttest.expect)(SuccessMessage).toHaveText(/User ".*" created/i);
70
69
  }
71
- async verifyUserErrorMessage() {
70
+ /* Verify user error message */ async verifyUserErrorMessage() {
72
71
  await (0, $1UEKj$playwrighttest.expect)(this.page.locator('.rrt-middle-container[role="alertdialog"]').nth(1)).toContainText(/already in use/i);
73
72
  }
74
- async deleteTheUserAndVerifyItIsDeleted(username) {
73
+ /* Delete the user and verify it is deleted */ async deleteTheUserAndVerifyItIsDeleted(username) {
75
74
  await this.page.locator("p.MuiTypography-root", {
76
75
  hasText: "Users"
77
76
  }).click();
78
- await this.page.waitForTimeout(10000);
79
77
  await this.page.getByPlaceholder("Filter...").fill(username);
80
- await this.page.waitForTimeout(10000);
81
78
  await this.page.locator("td.users-table-actions button.delete.xl-icon.table-action").click();
82
79
  await this.page.getByRole("button", {
83
80
  name: "Delete",
@@ -87,13 +84,11 @@ class $c949c453826379e3$export$ecdc3cf9d1cfe143 extends (0, $ae23b16684112d0b$ex
87
84
  await (0, $1UEKj$playwrighttest.expect)(DeleteMessage).toBeVisible();
88
85
  await (0, $1UEKj$playwrighttest.expect)(DeleteMessage).toHaveText(/User ".*" deleted/i);
89
86
  }
90
- async editUserAndVerify(username, editfullname) {
87
+ /* Edit the user and verify the changes */ async editUserAndVerify(username, editfullname) {
91
88
  await this.page.locator("p.MuiTypography-root", {
92
89
  hasText: "Users"
93
90
  }).click();
94
- await this.page.waitForTimeout(10000);
95
91
  await this.page.getByPlaceholder("Filter...").fill(username);
96
- await this.page.waitForTimeout(10000);
97
92
  await this.page.locator("i.icon-edit.dot-i").first().click();
98
93
  await this.page.locator('input[name="fullName"]').fill(editfullname);
99
94
  await this.page.getByRole("button", {
@@ -102,9 +97,218 @@ class $c949c453826379e3$export$ecdc3cf9d1cfe143 extends (0, $ae23b16684112d0b$ex
102
97
  }).click();
103
98
  const EditMessage = this.page.getByRole("alertdialog");
104
99
  await (0, $1UEKj$playwrighttest.expect)(EditMessage).toBeVisible();
105
- const editedUsername = this.page.locator("td.users-table-fullName div").textContent();
106
- // eslint-disable-next-line no-console
107
- console.log(editedUsername);
100
+ await (0, $1UEKj$playwrighttest.expect)(EditMessage).toContainText("Your change was saved");
101
+ }
102
+ }
103
+
104
+
105
+
106
+
107
+ class $647b67e126f2dbe0$export$c88e1d16f82516d extends (0, $ae23b16684112d0b$export$2b65d1d97338f32b) {
108
+ /* Helps to create a LocalHost of type UNIX/Windows/Zos */ async createHostForGivenType(name, type) {
109
+ await this.page.locator('input[name="name"]').fill(name);
110
+ await this.page.locator('label:has-text("Operating system")').locator("xpath=following::input[1]").click();
111
+ await this.page.getByText(type, {
112
+ exact: true
113
+ }).click();
114
+ await this.page.getByRole("button", {
115
+ name: "Save and close"
116
+ }).click();
117
+ const toastMessage = this.page.locator(".redux-toastr .rrt-text:visible");
118
+ await (0, $1UEKj$playwrighttest.expect)(toastMessage).toHaveText("Your change was saved.", {
119
+ timeout: 2000
120
+ });
121
+ }
122
+ }
123
+
124
+
125
+
126
+
127
+ class $64bc587a017c1e89$export$12530425267834a9 extends (0, $ae23b16684112d0b$export$2b65d1d97338f32b) {
128
+ /* Helps to create a new Environment */ async createEnvironment(environmentName, hostName) {
129
+ await this.page.locator('input[name="name"]').fill(environmentName);
130
+ await this.page.locator("i.xl-icon.arrow-down-icon.show-all").nth(0).click();
131
+ await this.page.getByTitle(`Infrastructure/${hostName}`, {
132
+ exact: true
133
+ }).click();
134
+ await this.page.getByRole("button", {
135
+ name: "Save and close"
136
+ }).click();
137
+ const toastMessage = this.page.locator(".redux-toastr .rrt-text:visible");
138
+ await (0, $1UEKj$playwrighttest.expect)(toastMessage).toHaveText("Your change was saved.", {
139
+ timeout: 2000
140
+ });
141
+ }
142
+ }
143
+
144
+
145
+
146
+
147
+ class $408106958eb335da$export$1533b625ec0c75e2 extends (0, $ae23b16684112d0b$export$2b65d1d97338f32b) {
148
+ constructor(page, navigation){
149
+ super(page);
150
+ this.navigation = navigation;
151
+ }
152
+ /* Creates a new application */ async createNewApplication(applicationName) {
153
+ await this.navigation.navigateToApplicationsPage();
154
+ await this.page.locator('input[name="name"]').waitFor({
155
+ state: "visible"
156
+ });
157
+ await this.page.locator('input[name="name"]').click();
158
+ await this.page.locator('input[name="name"]').fill(applicationName);
159
+ await this.page.getByRole("button", {
160
+ name: "Save and close"
161
+ }).click();
162
+ const toastMessage = this.page.locator(".redux-toastr .rrt-text:visible");
163
+ await (0, $1UEKj$playwrighttest.expect)(toastMessage).toHaveText("Your change was saved.", {
164
+ timeout: 2000
165
+ });
166
+ }
167
+ /* Creates a new deployment package */ async createNewDeploymentPackage(applicationName, packageName) {
168
+ const appDataId = `Applications/${applicationName}`;
169
+ // Expand Applications
170
+ const root = this.page.locator('div[data-id="Applications"] .infinite-tree-node > a');
171
+ await root.click();
172
+ // Hover over app node
173
+ const appNode = this.page.locator(`span[data-id="${appDataId}"]`);
174
+ await (0, $1UEKj$playwrighttest.expect)(appNode).toBeVisible();
175
+ await appNode.hover();
176
+ // Open context menu + create new deployment package
177
+ const contextMenu = this.page.locator(`i.context-menu-button[data-id="${appDataId}"]`);
178
+ await (0, $1UEKj$playwrighttest.expect)(contextMenu).toBeVisible();
179
+ await contextMenu.click();
180
+ await this.page.getByRole("link", {
181
+ name: "New"
182
+ }).click();
183
+ await this.page.getByRole("link", {
184
+ name: "Deployment Package"
185
+ }).click();
186
+ // Fill & save
187
+ const nameInput = this.page.locator('input[name="name"]');
188
+ await nameInput.fill(packageName);
189
+ await this.page.getByRole("button", {
190
+ name: "Save and close"
191
+ }).click();
192
+ const toastMessage = this.page.locator(".redux-toastr .rrt-text:visible");
193
+ await (0, $1UEKj$playwrighttest.expect)(toastMessage).toHaveText("Your change was saved.", {
194
+ timeout: 2000
195
+ });
196
+ }
197
+ /* Creates a new command application */ async createNewCmdApplication(values) {
198
+ const appDataId = `Applications/${values[0]}`;
199
+ const packageDataId = `Applications/${values[0]}/${values[1]}`;
200
+ // Expand app node and click package
201
+ await this.page.locator(`div[data-id="${appDataId}"] .infinite-tree-node > a`).click();
202
+ const packageNode = this.page.locator(`span[data-id="${packageDataId}"]`).first();
203
+ await (0, $1UEKj$playwrighttest.expect)(packageNode).toBeVisible();
204
+ await packageNode.click();
205
+ // Open context menu
206
+ const packageMenu = this.page.locator(`i.context-menu-button[data-id="${packageDataId}"]`);
207
+ await (0, $1UEKj$playwrighttest.expect)(packageMenu).toBeVisible();
208
+ await packageMenu.click();
209
+ // Create Command application
210
+ await this.page.getByRole("link", {
211
+ name: "New"
212
+ }).click();
213
+ await this.page.getByRole("link", {
214
+ name: "cmd"
215
+ }).click();
216
+ await this.page.getByRole("link", {
217
+ name: "Command"
218
+ }).click();
219
+ await this.page.locator('input[name="name"]').fill(values[2]);
220
+ await this.page.locator('textarea[name="commandLine"]').fill(values[3]);
221
+ const saveBtn = this.page.locator("button", {
222
+ hasText: /^Save$/
223
+ }).first();
224
+ await (0, $1UEKj$playwrighttest.expect)(saveBtn).toBeEnabled();
225
+ await saveBtn.click();
226
+ await this.page.waitForTimeout(3000);
227
+ const toastMessage = this.page.locator(".redux-toastr .rrt-text:visible");
228
+ await (0, $1UEKj$playwrighttest.expect)(toastMessage).toHaveText("Your change was saved.", {
229
+ timeout: 2000
230
+ });
231
+ // Close dialog
232
+ await this.page.locator("i.xl-icon.close-icon").first().click();
233
+ }
234
+ /*Deploy the application*/ async deployApp(values) {
235
+ const versionNode = `Applications/${values[0]}/${values[1]}`;
236
+ await this.page.locator(`i.context-menu-button[data-id="${versionNode}"]`).click();
237
+ await this.page.getByRole("link", {
238
+ name: "Deploy",
239
+ exact: true
240
+ }).click();
241
+ await this.page.locator(`input[name="selections"][value="Environments/${values[2]}"]`).click();
242
+ await this.page.getByRole("button", {
243
+ name: "Continue"
244
+ }).click();
245
+ await this.page.locator(".errors-wrapper").waitFor({
246
+ state: "attached",
247
+ timeout: 2000
248
+ });
249
+ const errorIcon = this.page.locator("a.validation-icons-wrapper.error");
250
+ if (await errorIcon.isVisible()) {
251
+ await this.page.getByRole("button", {
252
+ name: "Deployment Properties"
253
+ }).click();
254
+ await this.page.locator('input[name="username"]').fill(values[3]);
255
+ await this.page.getByRole("button", {
256
+ name: "Save"
257
+ }).click();
258
+ }
259
+ await this.page.locator("button.deploy.xl-primary").click();
260
+ //Get the task id
261
+ this.taskId = await this.page.locator("div.task-id").textContent() || "";
262
+ //Verify no failure and all are done
263
+ const labels = this.page.locator("span.label");
264
+ await (0, $1UEKj$playwrighttest.expect)(labels).toHaveCount(3);
265
+ await (0, $1UEKj$playwrighttest.expect)(labels).toHaveText([
266
+ "EXECUTED",
267
+ "DONE",
268
+ "DONE"
269
+ ]);
270
+ //Get the text executed
271
+ await this.page.locator('div[data-id="0_1_1"] .infinite-tree-node > a').click();
272
+ await this.page.getByTitle("Execute Test Command").click();
273
+ this.executedText = await this.page.locator("div.step-log-body pre").nth(1).innerText();
274
+ //Verify in monitoring tab searching with the task id
275
+ await this.page.locator('div[data-id="TASK_MONITOR"] .infinite-tree-node > a').click();
276
+ await this.page.locator('span[data-id="DEPLOYMENT_TASKS"]').dblclick();
277
+ await this.page.waitForTimeout(5000);
278
+ await this.page.locator('div.deployment-task-filter-task-id input[placeholder="Search"]').first().fill(this.taskId);
279
+ const stateText = await this.page.locator("td.tasks-table-state").first().innerText();
280
+ (0, $1UEKj$playwrighttest.expect)(stateText.trim()).toBe("Executed");
281
+ //Click the row to go to deployment screen
282
+ await this.page.locator("table.table.table-striped tbody tr").first().dblclick();
283
+ await this.page.locator("button.finish.xl-primary").click();
284
+ }
285
+ }
286
+
287
+
288
+
289
+
290
+ class $fea68740c371df96$export$b8a443164510a1b4 extends (0, $ae23b16684112d0b$export$2b65d1d97338f32b) {
291
+ /* Clicks on the Deployment Tasks section */ async clickDeploymentTasks() {
292
+ await this.page.locator("p.MuiTypography-root", {
293
+ hasText: "Deployments"
294
+ }).click();
295
+ }
296
+ async verifyTheDeploymentValues(values) {
297
+ await this.page.locator('div.deployment-task-filter-task-id input[placeholder="Search"]:visible').first().fill(values[0]);
298
+ await this.page.waitForSelector("td.report-table-package .deployment-report-package", {
299
+ timeout: 5000
300
+ });
301
+ await (0, $1UEKj$playwrighttest.expect)(this.page.locator("td.report-table-package .deployment-report-package")).toContainText(new RegExp(`${values[2]}\\/${values[3]}`, "i"));
302
+ await (0, $1UEKj$playwrighttest.expect)(this.page.locator("td.report-table-originalType .deployment-report-task-type")).toHaveText(/Initial/i); // Regex ignores case
303
+ await (0, $1UEKj$playwrighttest.expect)(this.page.locator("td.report-table-user .deployment-report-user")).toHaveText("admin");
304
+ //Click the row
305
+ await this.page.locator("td.report-table-package .deployment-report-package").dblclick();
306
+ await this.page.locator('div[data-id="0_1_1"] .infinite-tree-node > a').click();
307
+ await this.page.getByTitle("Execute Test Command").click();
308
+ //Get the log text
309
+ const text = await this.page.locator("div.step-log-body pre").nth(1).innerText();
310
+ //Verify both the log text are same
311
+ (0, $1UEKj$playwrighttest.expect)(text).toContain(values[1]);
108
312
  }
109
313
  }
110
314
 
@@ -114,6 +318,10 @@ class $28788a34e6bbbe3d$export$b8a61e5c71402559 {
114
318
  this.page = page;
115
319
  this.homePage = new (0, $f280624787ceceed$export$36d69433c4f81145)(page);
116
320
  this.userPage = new (0, $c949c453826379e3$export$ecdc3cf9d1cfe143)(page);
321
+ this.overthereLocalHostPage = new (0, $647b67e126f2dbe0$export$c88e1d16f82516d)(page);
322
+ this.environmentsPage = new (0, $64bc587a017c1e89$export$12530425267834a9)(page);
323
+ this.applicationsPage = new (0, $408106958eb335da$export$1533b625ec0c75e2)(page, this);
324
+ this.reportsPage = new (0, $fea68740c371df96$export$b8a443164510a1b4)(page);
117
325
  }
118
326
  async navigateToHomePage() {
119
327
  await this.page.goto("/home");
@@ -127,17 +335,50 @@ class $28788a34e6bbbe3d$export$b8a61e5c71402559 {
127
335
  const collapseButton = this.page.getByTestId("back-button");
128
336
  await collapseButton.click();
129
337
  }
338
+ /* Helps to navigate to the Applications page */ async navigateToApplicationsPage() {
339
+ const configNode = this.page.locator('span[data-id="Applications"]');
340
+ await configNode.hover();
341
+ await this.page.locator('i.context-menu-button[data-id="Applications"]').click();
342
+ await this.page.getByRole("link", {
343
+ name: "New"
344
+ }).click();
345
+ await this.page.getByRole("link", {
346
+ name: "Application"
347
+ }).click();
348
+ }
349
+ /* Helps to navigate to the Environments page */ async navigateToEnvironmentsPage() {
350
+ const configNode = this.page.locator('span[data-id="Environments"]');
351
+ await configNode.hover();
352
+ await this.page.locator('i.context-menu-button[data-id="Environments"]').click();
353
+ await this.page.getByRole("link", {
354
+ name: "New"
355
+ }).click();
356
+ await this.page.getByRole("link", {
357
+ name: "Environment"
358
+ }).click();
359
+ }
360
+ /* Helps to navigate to the Overthere LocalHost page */ async navigateToOverthereLocalHostPage() {
361
+ const configNode = this.page.locator('span[data-id="Infrastructure"]');
362
+ await configNode.hover();
363
+ await this.page.locator('i.context-menu-button[data-id="Infrastructure"]').click();
364
+ // await this.page.waitForTimeout(5000);
365
+ await this.page.getByRole("link", {
366
+ name: "New"
367
+ }).click();
368
+ await this.page.getByRole("link", {
369
+ name: "overthere"
370
+ }).click();
371
+ await this.page.getByRole("link", {
372
+ name: "LocalHost"
373
+ }).click();
374
+ }
130
375
  }
131
376
 
132
377
 
133
378
 
134
379
 
135
380
  class $365fc3920b0d055f$export$f14c0e3f98d164c0 extends (0, $ae23b16684112d0b$export$2b65d1d97338f32b) {
136
- /**
137
- * Login with username and password
138
- * @param userName
139
- * @param password
140
- */ async login(userName, password) {
381
+ /* Login with username and password*/ async login(userName, password) {
141
382
  await this.page.goto("/#/login");
142
383
  await (0, $1UEKj$playwrighttest.expect)(this.page).toHaveTitle("Digital.ai Deploy");
143
384
  await this.page.getByPlaceholder("user").fill(userName, {
@@ -152,13 +393,11 @@ class $365fc3920b0d055f$export$f14c0e3f98d164c0 extends (0, $ae23b16684112d0b$ex
152
393
  timeout: 10000
153
394
  });
154
395
  }
155
- async verifyInvalidPasswordMessage() {
396
+ /* Verify invalid password message */ async verifyInvalidPasswordMessage() {
156
397
  const errorMessage = this.page.getByText("The username and/or password you have entered is incorrect.");
157
398
  await (0, $1UEKj$playwrighttest.expect)(errorMessage).toBeVisible();
158
399
  }
159
- /**
160
- * Logout as authenticated user
161
- */ async logout() {
400
+ /* Logout as authenticated user */ async logout() {
162
401
  await this.page.locator("button.dot-avatar").click();
163
402
  await this.page.getByText("Log out", {
164
403
  exact: true
package/dist/main.js.map CHANGED
@@ -1 +1 @@
1
- {"mappings":"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","sources":["apps/deploy/index.ts","apps/deploy/fixtures/index.ts","apps/deploy/pages/index.ts","apps/deploy/pages/homePage.ts","apps/deploy/pages/withPage.ts","apps/deploy/pages/usersPage.ts","apps/deploy/pages/loginPage.ts"],"sourcesContent":["export { test } from './fixtures';\n","import { test as base, Page } from '@playwright/test';\nimport { Navigation } from '../pages';\nimport { LoginPage } from '../pages/loginPage';\n\ntype DeployFixtures = {\n fixtures: Fixtures;\n loginPage: LoginPage;\n navigation: Navigation;\n};\n\nexport const test = base.extend<DeployFixtures>({\n fixtures: async ({ page }, use) => {\n const fixtures = new Fixtures(page);\n await use(fixtures);\n return fixtures;\n },\n loginPage: async ({ page }, use) => {\n const loginPage = new LoginPage(page);\n await use(loginPage);\n return loginPage;\n },\n navigation: async ({ page }, use) => {\n const navigationPage = new Navigation(page);\n await use(navigationPage);\n return navigationPage;\n },\n});\n\nclass Fixtures {\n private readonly page: Page;\n\n constructor(page: Page) {\n this.page = page;\n }\n}\n","import { Page } from '@playwright/test';\nimport { HomePage } from './homePage';\nimport { UserPage } from './usersPage';\n\nexport class Navigation {\n private readonly page: Page;\n homePage: HomePage;\n userPage: UserPage;\n\n constructor(page: Page) {\n this.page = page;\n this.homePage = new HomePage(page);\n this.userPage = new UserPage(page);\n }\n\n async navigateToHomePage(): Promise<void> {\n await this.page.goto('/home');\n }\n\n async navigateToUserPage(): Promise<void> {\n await this.page.locator('p.MuiTypography-root', { hasText: 'User management' }).click();\n }\n\n async clickCollapseSideView(): Promise<void> {\n const collapseButton = this.page.getByTestId('back-button');\n await collapseButton.click();\n }\n}\n","import { expect } from '@playwright/test';\nimport { WithPage } from './withPage';\n\nexport class HomePage extends WithPage {\n async clickUserManagement(): Promise<void> {\n await this.page.locator('p.MuiTypography-root', { hasText: 'User management' }).click();\n await this.page.getByRole('link', { name: 'Users' }).click();\n }\n\n async verifyDeployLogoIsPresent(): Promise<void> {\n const logo = this.page.getByAltText('Deploy');\n await expect(logo).toBeVisible();\n }\n\n async verifyDeployTextIsPresent(): Promise<void> {\n const title = this.page.getByTitle('digital.ai');\n await expect(title).toBeVisible();\n }\n}\n","import { Page } from '@playwright/test';\n\nexport class WithPage {\n protected readonly page: Page;\n\n constructor(page: Page) {\n this.page = page;\n }\n}\n","import { expect } from '@playwright/test';\nimport { WithPage } from './withPage';\n\nexport class UserPage extends WithPage {\n /**\n * Login with username and password\n * @param userName\n * @param password\n */\n // this should be refactored to take an object and not disable the rule!!\n // eslint-disable-next-line max-params\n async createNewUser(\n username: string,\n fullName: string,\n email: string,\n password: string,\n confirmPassword: string,\n ): Promise<void> {\n await this.page.locator('p.MuiTypography-root', { hasText: 'Users' }).click();\n await this.page.getByRole('button', { name: 'Add user' }).click();\n await this.page.locator('input[name=\"username\"]').fill(username);\n await this.page.locator('input[name=\"fullName\"]').fill(fullName);\n await this.page.locator('input[name=\"email\"]').fill(email);\n const passwordInput = this.page.locator('input[name=\"password\"]');\n await passwordInput.click({ force: true });\n await passwordInput.fill(password);\n await this.page.locator('input[name=\"confirmPassword\"]').fill(confirmPassword);\n await this.page.getByRole('button', { name: 'Save' }).click();\n }\n\n async verifySuccessMessage(): Promise<void> {\n const SuccessMessage = this.page.getByRole('alertdialog');\n await expect(SuccessMessage).toBeVisible();\n await expect(SuccessMessage).toHaveText(/User \".*\" created/i);\n }\n\n async verifyUserErrorMessage(): Promise<void> {\n await expect(this.page.locator('.rrt-middle-container[role=\"alertdialog\"]').nth(1)).toContainText(\n /already in use/i,\n );\n }\n\n async deleteTheUserAndVerifyItIsDeleted(username: string): Promise<void> {\n await this.page.locator('p.MuiTypography-root', { hasText: 'Users' }).click();\n await this.page.waitForTimeout(10000);\n await this.page.getByPlaceholder('Filter...').fill(username);\n await this.page.waitForTimeout(10000);\n await this.page.locator('td.users-table-actions button.delete.xl-icon.table-action').click();\n await this.page.getByRole('button', { name: 'Delete', exact: true }).click();\n const DeleteMessage = this.page.getByRole('alertdialog');\n await expect(DeleteMessage).toBeVisible();\n await expect(DeleteMessage).toHaveText(/User \".*\" deleted/i);\n }\n\n async editUserAndVerify(username: string, editfullname: string): Promise<void> {\n await this.page.locator('p.MuiTypography-root', { hasText: 'Users' }).click();\n await this.page.waitForTimeout(10000);\n await this.page.getByPlaceholder('Filter...').fill(username);\n await this.page.waitForTimeout(10000);\n await this.page.locator('i.icon-edit.dot-i').first().click();\n await this.page.locator('input[name=\"fullName\"]').fill(editfullname);\n await this.page.getByRole('button', { name: 'Save', exact: true }).click();\n const EditMessage = this.page.getByRole('alertdialog');\n await expect(EditMessage).toBeVisible();\n const editedUsername = this.page.locator('td.users-table-fullName div').textContent();\n // eslint-disable-next-line no-console\n console.log(editedUsername);\n }\n}\n","import { expect } from '@playwright/test';\nimport { WithPage } from './withPage';\n\nexport class LoginPage extends WithPage {\n /**\n * Login with username and password\n * @param userName\n * @param password\n */\n async login(userName: string, password: string): Promise<void> {\n await this.page.goto('/#/login');\n await expect(this.page).toHaveTitle('Digital.ai Deploy');\n await this.page.getByPlaceholder('user').fill(userName, { timeout: 1000 });\n await this.page.getByPlaceholder('Password').fill(password, { timeout: 10000 });\n await this.page.getByRole('button', { name: 'Log in' }).click({ timeout: 10000 });\n }\n\n async verifyInvalidPasswordMessage(): Promise<void> {\n const errorMessage = this.page.getByText('The username and/or password you have entered is incorrect.');\n await expect(errorMessage).toBeVisible();\n }\n\n /**\n * Logout as authenticated user\n */\n async logout(): Promise<void> {\n await this.page.locator('button.dot-avatar').click();\n await this.page.getByText('Log out', { exact: true }).click();\n await expect(this.page.getByText('Log in').first()).toBeVisible();\n }\n}\n"],"names":[],"version":3,"file":"main.js.map"}
1
+ {"mappings":"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","sources":["apps/deploy/index.ts","apps/deploy/fixtures/index.ts","apps/deploy/pages/index.ts","apps/deploy/pages/homePage.ts","apps/deploy/pages/withPage.ts","apps/deploy/pages/usersPage.ts","apps/deploy/pages/infrastructure/overthereLocalHostPage.ts","apps/deploy/pages/environmentsPage.ts","apps/deploy/pages/applications/applicationsPage.ts","apps/deploy/pages/reportsPage.ts","apps/deploy/pages/loginPage.ts"],"sourcesContent":["export { test } from './fixtures';\n","import { test as base, Page } from '@playwright/test';\nimport { Navigation } from '../pages';\nimport { LoginPage } from '../pages/loginPage';\n\ntype DeployFixtures = {\n fixtures: Fixtures;\n loginPage: LoginPage;\n navigation: Navigation;\n};\n\nexport const test = base.extend<DeployFixtures>({\n fixtures: async ({ page }, use) => {\n const fixtures = new Fixtures(page);\n await use(fixtures);\n return fixtures;\n },\n loginPage: async ({ page }, use) => {\n const loginPage = new LoginPage(page);\n await use(loginPage);\n return loginPage;\n },\n navigation: async ({ page }, use) => {\n const navigationPage = new Navigation(page);\n await use(navigationPage);\n return navigationPage;\n },\n});\n\nclass Fixtures {\n private readonly page: Page;\n\n constructor(page: Page) {\n this.page = page;\n }\n}\n","import { Page } from '@playwright/test';\nimport { HomePage } from './homePage';\nimport { UserPage } from './usersPage';\nimport { OverthereLocalHostPage } from './infrastructure/overthereLocalHostPage';\nimport { EnvironmentsPage } from './environmentsPage';\nimport { ApplicationsPage } from './applications/applicationsPage';\nimport { ReportsPage } from './reportsPage';\n\nexport class Navigation {\n private readonly page: Page;\n homePage: HomePage;\n userPage: UserPage;\n overthereLocalHostPage: OverthereLocalHostPage;\n environmentsPage: EnvironmentsPage;\n applicationsPage: ApplicationsPage;\n reportsPage: ReportsPage;\n\n constructor(page: Page) {\n this.page = page;\n this.homePage = new HomePage(page);\n this.userPage = new UserPage(page);\n this.overthereLocalHostPage = new OverthereLocalHostPage(page);\n this.environmentsPage = new EnvironmentsPage(page);\n this.applicationsPage = new ApplicationsPage(page, this);\n this.reportsPage = new ReportsPage(page);\n }\n\n async navigateToHomePage(): Promise<void> {\n await this.page.goto('/home');\n }\n\n async navigateToUserPage(): Promise<void> {\n await this.page.locator('p.MuiTypography-root', { hasText: 'User management' }).click();\n }\n\n async clickCollapseSideView(): Promise<void> {\n const collapseButton = this.page.getByTestId('back-button');\n await collapseButton.click();\n }\n\n /* Helps to navigate to the Applications page */\n async navigateToApplicationsPage(): Promise<void> {\n const configNode = this.page.locator('span[data-id=\"Applications\"]');\n await configNode.hover();\n await this.page.locator('i.context-menu-button[data-id=\"Applications\"]').click();\n await this.page.getByRole('link', { name: 'New' }).click();\n await this.page.getByRole('link', { name: 'Application' }).click();\n }\n\n /* Helps to navigate to the Environments page */\n async navigateToEnvironmentsPage(): Promise<void> {\n const configNode = this.page.locator('span[data-id=\"Environments\"]');\n await configNode.hover();\n await this.page.locator('i.context-menu-button[data-id=\"Environments\"]').click();\n await this.page.getByRole('link', { name: 'New' }).click();\n await this.page.getByRole('link', { name: 'Environment' }).click();\n }\n\n /* Helps to navigate to the Overthere LocalHost page */\n async navigateToOverthereLocalHostPage(): Promise<void> {\n const configNode = this.page.locator('span[data-id=\"Infrastructure\"]');\n await configNode.hover();\n await this.page.locator('i.context-menu-button[data-id=\"Infrastructure\"]').click();\n // await this.page.waitForTimeout(5000);\n await this.page.getByRole('link', { name: 'New' }).click();\n await this.page.getByRole('link', { name: 'overthere' }).click();\n await this.page.getByRole('link', { name: 'LocalHost' }).click();\n }\n}\n","import { expect } from '@playwright/test';\nimport { WithPage } from './withPage';\n\nexport class HomePage extends WithPage {\n async clickUserManagement(): Promise<void> {\n await this.page.locator('p.MuiTypography-root', { hasText: 'User management' }).click();\n await this.page.getByRole('link', { name: 'Users' }).click();\n }\n\n async verifyDeployLogoIsPresent(): Promise<void> {\n const logo = this.page.getByAltText('Deploy');\n await expect(logo).toBeVisible();\n }\n\n async verifyDeployTextIsPresent(): Promise<void> {\n const title = this.page.getByTitle('digital.ai');\n await expect(title).toBeVisible();\n }\n\n async clickReports(): Promise<void> {\n await this.page.locator('p.MuiTypography-root', { hasText: 'Reports' }).click();\n }\n}\n","import { Page } from '@playwright/test';\n\nexport class WithPage {\n protected readonly page: Page;\n\n constructor(page: Page) {\n this.page = page;\n }\n}\n","import { expect } from '@playwright/test';\nimport { WithPage } from './withPage';\n\nexport class UserPage extends WithPage {\n /* Create a new user */\n async createNewUser(username: string, email: string, password: string): Promise<void> {\n await this.page.locator('p.MuiTypography-root', { hasText: 'Users' }).click();\n await this.page.getByRole('button', { name: 'Add user' }).click();\n await this.page.locator('input[name=\"username\"]').fill(username);\n await this.page.locator('input[name=\"fullName\"]').fill(username);\n await this.page.locator('input[name=\"email\"]').fill(email);\n const passwordInput = this.page.locator('input[name=\"password\"]');\n await passwordInput.click({ force: true });\n await passwordInput.fill(password);\n await this.page.locator('input[name=\"confirmPassword\"]').fill(password);\n await this.page.getByRole('button', { name: 'Save' }).click();\n }\n\n /* Verify success message */\n async verifySuccessMessage(): Promise<void> {\n const SuccessMessage = this.page.getByRole('alertdialog');\n await expect(SuccessMessage).toBeVisible();\n await expect(SuccessMessage).toHaveText(/User \".*\" created/i);\n }\n\n /* Verify user error message */\n async verifyUserErrorMessage(): Promise<void> {\n await expect(this.page.locator('.rrt-middle-container[role=\"alertdialog\"]').nth(1)).toContainText(\n /already in use/i,\n );\n }\n\n /* Delete the user and verify it is deleted */\n async deleteTheUserAndVerifyItIsDeleted(username: string): Promise<void> {\n await this.page.locator('p.MuiTypography-root', { hasText: 'Users' }).click();\n await this.page.getByPlaceholder('Filter...').fill(username);\n await this.page.locator('td.users-table-actions button.delete.xl-icon.table-action').click();\n await this.page.getByRole('button', { name: 'Delete', exact: true }).click();\n const DeleteMessage = this.page.getByRole('alertdialog');\n await expect(DeleteMessage).toBeVisible();\n await expect(DeleteMessage).toHaveText(/User \".*\" deleted/i);\n }\n\n /* Edit the user and verify the changes */\n async editUserAndVerify(username: string, editfullname: string): Promise<void> {\n await this.page.locator('p.MuiTypography-root', { hasText: 'Users' }).click();\n await this.page.getByPlaceholder('Filter...').fill(username);\n await this.page.locator('i.icon-edit.dot-i').first().click();\n await this.page.locator('input[name=\"fullName\"]').fill(editfullname);\n await this.page.getByRole('button', { name: 'Save', exact: true }).click();\n const EditMessage = this.page.getByRole('alertdialog');\n await expect(EditMessage).toBeVisible();\n await expect(EditMessage).toContainText('Your change was saved');\n }\n}\n","import { expect } from '@playwright/test';\nimport { WithPage } from '../withPage';\n\nexport class OverthereLocalHostPage extends WithPage {\n /* Helps to create a LocalHost of type UNIX/Windows/Zos */\n async createHostForGivenType(name: string, type: string): Promise<void> {\n await this.page.locator('input[name=\"name\"]').fill(name);\n await this.page.locator('label:has-text(\"Operating system\")').locator('xpath=following::input[1]').click();\n await this.page.getByText(type, { exact: true }).click();\n await this.page.getByRole('button', { name: 'Save and close' }).click();\n const toastMessage = this.page.locator('.redux-toastr .rrt-text:visible');\n await expect(toastMessage).toHaveText('Your change was saved.', { timeout: 2000 });\n }\n}\n","import { WithPage } from './withPage';\nimport { expect } from '@playwright/test';\n\nexport class EnvironmentsPage extends WithPage {\n /* Helps to create a new Environment */\n async createEnvironment(environmentName: string, hostName: string): Promise<void> {\n await this.page.locator('input[name=\"name\"]').fill(environmentName);\n await this.page.locator('i.xl-icon.arrow-down-icon.show-all').nth(0).click();\n await this.page.getByTitle(`Infrastructure/${hostName}`, { exact: true }).click();\n await this.page.getByRole('button', { name: 'Save and close' }).click();\n const toastMessage = this.page.locator('.redux-toastr .rrt-text:visible');\n await expect(toastMessage).toHaveText('Your change was saved.', { timeout: 2000 });\n }\n}\n","import { expect, Page } from '@playwright/test';\nimport { WithPage } from '../withPage';\nimport { Navigation } from '../index';\n\nexport class ApplicationsPage extends WithPage {\n taskId!: string;\n executedText!: string;\n private navigation: Navigation;\n\n constructor(page: Page, navigation: Navigation) {\n super(page);\n this.navigation = navigation;\n }\n\n /* Creates a new application */\n async createNewApplication(applicationName: string): Promise<void> {\n await this.navigation.navigateToApplicationsPage();\n await this.page.locator('input[name=\"name\"]').waitFor({ state: 'visible' });\n await this.page.locator('input[name=\"name\"]').click();\n await this.page.locator('input[name=\"name\"]').fill(applicationName);\n await this.page.getByRole('button', { name: 'Save and close' }).click();\n const toastMessage = this.page.locator('.redux-toastr .rrt-text:visible');\n await expect(toastMessage).toHaveText('Your change was saved.', { timeout: 2000 });\n }\n\n /* Creates a new deployment package */\n async createNewDeploymentPackage(applicationName: string, packageName: string): Promise<void> {\n const appDataId = `Applications/${applicationName}`;\n\n // Expand Applications\n const root = this.page.locator('div[data-id=\"Applications\"] .infinite-tree-node > a');\n await root.click();\n\n // Hover over app node\n const appNode = this.page.locator(`span[data-id=\"${appDataId}\"]`);\n await expect(appNode).toBeVisible();\n await appNode.hover();\n\n // Open context menu + create new deployment package\n const contextMenu = this.page.locator(`i.context-menu-button[data-id=\"${appDataId}\"]`);\n await expect(contextMenu).toBeVisible();\n await contextMenu.click();\n\n await this.page.getByRole('link', { name: 'New' }).click();\n await this.page.getByRole('link', { name: 'Deployment Package' }).click();\n\n // Fill & save\n const nameInput = this.page.locator('input[name=\"name\"]');\n await nameInput.fill(packageName);\n\n await this.page.getByRole('button', { name: 'Save and close' }).click();\n\n const toastMessage = this.page.locator('.redux-toastr .rrt-text:visible');\n await expect(toastMessage).toHaveText('Your change was saved.', { timeout: 2000 });\n }\n\n /* Creates a new command application */\n async createNewCmdApplication(values: string[]): Promise<void> {\n const appDataId = `Applications/${values[0]}`;\n const packageDataId = `Applications/${values[0]}/${values[1]}`;\n\n // Expand app node and click package\n await this.page.locator(`div[data-id=\"${appDataId}\"] .infinite-tree-node > a`).click();\n const packageNode = this.page.locator(`span[data-id=\"${packageDataId}\"]`).first();\n await expect(packageNode).toBeVisible();\n await packageNode.click();\n\n // Open context menu\n const packageMenu = this.page.locator(`i.context-menu-button[data-id=\"${packageDataId}\"]`);\n await expect(packageMenu).toBeVisible();\n await packageMenu.click();\n\n // Create Command application\n await this.page.getByRole('link', { name: 'New' }).click();\n await this.page.getByRole('link', { name: 'cmd' }).click();\n await this.page.getByRole('link', { name: 'Command' }).click();\n\n await this.page.locator('input[name=\"name\"]').fill(values[2]);\n\n await this.page.locator('textarea[name=\"commandLine\"]').fill(values[3]);\n\n const saveBtn = this.page.locator('button', { hasText: /^Save$/ }).first();\n await expect(saveBtn).toBeEnabled();\n await saveBtn.click();\n await this.page.waitForTimeout(3000);\n\n const toastMessage = this.page.locator('.redux-toastr .rrt-text:visible');\n await expect(toastMessage).toHaveText('Your change was saved.', { timeout: 2000 });\n\n // Close dialog\n await this.page.locator('i.xl-icon.close-icon').first().click();\n }\n\n /*Deploy the application*/\n async deployApp(values: string[]): Promise<void> {\n const versionNode = `Applications/${values[0]}/${values[1]}`;\n await this.page.locator(`i.context-menu-button[data-id=\"${versionNode}\"]`).click();\n await this.page.getByRole('link', { name: 'Deploy', exact: true }).click();\n await this.page.locator(`input[name=\"selections\"][value=\"Environments/${values[2]}\"]`).click();\n await this.page.getByRole('button', { name: 'Continue' }).click();\n\n await this.page.locator('.errors-wrapper').waitFor({ state: 'attached', timeout: 2000 });\n\n const errorIcon = this.page.locator('a.validation-icons-wrapper.error');\n\n if (await errorIcon.isVisible()) {\n await this.page.getByRole('button', { name: 'Deployment Properties' }).click();\n await this.page.locator('input[name=\"username\"]').fill(values[3]);\n await this.page.getByRole('button', { name: 'Save' }).click();\n }\n\n await this.page.locator('button.deploy.xl-primary').click();\n\n //Get the task id\n this.taskId = (await this.page.locator('div.task-id').textContent()) || '';\n\n //Verify no failure and all are done\n const labels = this.page.locator('span.label');\n await expect(labels).toHaveCount(3);\n await expect(labels).toHaveText(['EXECUTED', 'DONE', 'DONE']);\n\n //Get the text executed\n await this.page.locator('div[data-id=\"0_1_1\"] .infinite-tree-node > a').click();\n await this.page.getByTitle('Execute Test Command').click();\n this.executedText = await this.page.locator('div.step-log-body pre').nth(1).innerText();\n\n //Verify in monitoring tab searching with the task id\n await this.page.locator('div[data-id=\"TASK_MONITOR\"] .infinite-tree-node > a').click();\n await this.page.locator('span[data-id=\"DEPLOYMENT_TASKS\"]').dblclick();\n await this.page.waitForTimeout(5000);\n\n await this.page.locator('div.deployment-task-filter-task-id input[placeholder=\"Search\"]').first().fill(this.taskId);\n const stateText = await this.page.locator('td.tasks-table-state').first().innerText();\n expect(stateText.trim()).toBe('Executed');\n\n //Click the row to go to deployment screen\n await this.page.locator('table.table.table-striped tbody tr').first().dblclick();\n\n await this.page.locator('button.finish.xl-primary').click();\n }\n}\n","import { expect } from '@playwright/test';\nimport { WithPage } from './withPage';\n\nexport class ReportsPage extends WithPage {\n /* Clicks on the Deployment Tasks section */\n async clickDeploymentTasks(): Promise<void> {\n await this.page.locator('p.MuiTypography-root', { hasText: 'Deployments' }).click();\n }\n\n async verifyTheDeploymentValues(values: string[]): Promise<void> {\n await this.page\n .locator('div.deployment-task-filter-task-id input[placeholder=\"Search\"]:visible')\n .first()\n .fill(values[0]);\n await this.page.waitForSelector('td.report-table-package .deployment-report-package', { timeout: 5000 });\n await expect(this.page.locator('td.report-table-package .deployment-report-package')).toContainText(\n new RegExp(`${values[2]}\\\\/${values[3]}`, 'i'),\n );\n await expect(this.page.locator('td.report-table-originalType .deployment-report-task-type')).toHaveText(/Initial/i); // Regex ignores case\n await expect(this.page.locator('td.report-table-user .deployment-report-user')).toHaveText('admin');\n\n //Click the row\n await this.page.locator('td.report-table-package .deployment-report-package').dblclick();\n await this.page.locator('div[data-id=\"0_1_1\"] .infinite-tree-node > a').click();\n await this.page.getByTitle('Execute Test Command').click();\n\n //Get the log text\n const text = await this.page.locator('div.step-log-body pre').nth(1).innerText();\n\n //Verify both the log text are same\n expect(text).toContain(values[1]);\n }\n}\n","import { expect } from '@playwright/test';\nimport { WithPage } from './withPage';\n\nexport class LoginPage extends WithPage {\n /* Login with username and password*/\n async login(userName: string, password: string): Promise<void> {\n await this.page.goto('/#/login');\n await expect(this.page).toHaveTitle('Digital.ai Deploy');\n await this.page.getByPlaceholder('user').fill(userName, { timeout: 1000 });\n await this.page.getByPlaceholder('Password').fill(password, { timeout: 10000 });\n await this.page.getByRole('button', { name: 'Log in' }).click({ timeout: 10000 });\n }\n\n /* Verify invalid password message */\n async verifyInvalidPasswordMessage(): Promise<void> {\n const errorMessage = this.page.getByText('The username and/or password you have entered is incorrect.');\n await expect(errorMessage).toBeVisible();\n }\n\n /* Logout as authenticated user */\n async logout(): Promise<void> {\n await this.page.locator('button.dot-avatar').click();\n await this.page.getByText('Log out', { exact: true }).click();\n await expect(this.page.getByText('Log in').first()).toBeVisible();\n }\n}\n"],"names":[],"version":3,"file":"main.js.map"}
package/dist/module.js CHANGED
@@ -26,19 +26,18 @@ class $e18c8d3707c8c74c$export$36d69433c4f81145 extends (0, $7d546dcaafadc158$ex
26
26
  const title = this.page.getByTitle("digital.ai");
27
27
  await (0, $lE6ZQ$expect)(title).toBeVisible();
28
28
  }
29
+ async clickReports() {
30
+ await this.page.locator("p.MuiTypography-root", {
31
+ hasText: "Reports"
32
+ }).click();
33
+ }
29
34
  }
30
35
 
31
36
 
32
37
 
33
38
 
34
39
  class $ca2721b1aeb903c5$export$ecdc3cf9d1cfe143 extends (0, $7d546dcaafadc158$export$2b65d1d97338f32b) {
35
- /**
36
- * Login with username and password
37
- * @param userName
38
- * @param password
39
- */ // this should be refactored to take an object and not disable the rule!!
40
- // eslint-disable-next-line max-params
41
- async createNewUser(username, fullName, email, password, confirmPassword) {
40
+ /* Create a new user */ async createNewUser(username, email, password) {
42
41
  await this.page.locator("p.MuiTypography-root", {
43
42
  hasText: "Users"
44
43
  }).click();
@@ -46,33 +45,31 @@ class $ca2721b1aeb903c5$export$ecdc3cf9d1cfe143 extends (0, $7d546dcaafadc158$ex
46
45
  name: "Add user"
47
46
  }).click();
48
47
  await this.page.locator('input[name="username"]').fill(username);
49
- await this.page.locator('input[name="fullName"]').fill(fullName);
48
+ await this.page.locator('input[name="fullName"]').fill(username);
50
49
  await this.page.locator('input[name="email"]').fill(email);
51
50
  const passwordInput = this.page.locator('input[name="password"]');
52
51
  await passwordInput.click({
53
52
  force: true
54
53
  });
55
54
  await passwordInput.fill(password);
56
- await this.page.locator('input[name="confirmPassword"]').fill(confirmPassword);
55
+ await this.page.locator('input[name="confirmPassword"]').fill(password);
57
56
  await this.page.getByRole("button", {
58
57
  name: "Save"
59
58
  }).click();
60
59
  }
61
- async verifySuccessMessage() {
60
+ /* Verify success message */ async verifySuccessMessage() {
62
61
  const SuccessMessage = this.page.getByRole("alertdialog");
63
62
  await (0, $lE6ZQ$expect)(SuccessMessage).toBeVisible();
64
63
  await (0, $lE6ZQ$expect)(SuccessMessage).toHaveText(/User ".*" created/i);
65
64
  }
66
- async verifyUserErrorMessage() {
65
+ /* Verify user error message */ async verifyUserErrorMessage() {
67
66
  await (0, $lE6ZQ$expect)(this.page.locator('.rrt-middle-container[role="alertdialog"]').nth(1)).toContainText(/already in use/i);
68
67
  }
69
- async deleteTheUserAndVerifyItIsDeleted(username) {
68
+ /* Delete the user and verify it is deleted */ async deleteTheUserAndVerifyItIsDeleted(username) {
70
69
  await this.page.locator("p.MuiTypography-root", {
71
70
  hasText: "Users"
72
71
  }).click();
73
- await this.page.waitForTimeout(10000);
74
72
  await this.page.getByPlaceholder("Filter...").fill(username);
75
- await this.page.waitForTimeout(10000);
76
73
  await this.page.locator("td.users-table-actions button.delete.xl-icon.table-action").click();
77
74
  await this.page.getByRole("button", {
78
75
  name: "Delete",
@@ -82,13 +79,11 @@ class $ca2721b1aeb903c5$export$ecdc3cf9d1cfe143 extends (0, $7d546dcaafadc158$ex
82
79
  await (0, $lE6ZQ$expect)(DeleteMessage).toBeVisible();
83
80
  await (0, $lE6ZQ$expect)(DeleteMessage).toHaveText(/User ".*" deleted/i);
84
81
  }
85
- async editUserAndVerify(username, editfullname) {
82
+ /* Edit the user and verify the changes */ async editUserAndVerify(username, editfullname) {
86
83
  await this.page.locator("p.MuiTypography-root", {
87
84
  hasText: "Users"
88
85
  }).click();
89
- await this.page.waitForTimeout(10000);
90
86
  await this.page.getByPlaceholder("Filter...").fill(username);
91
- await this.page.waitForTimeout(10000);
92
87
  await this.page.locator("i.icon-edit.dot-i").first().click();
93
88
  await this.page.locator('input[name="fullName"]').fill(editfullname);
94
89
  await this.page.getByRole("button", {
@@ -97,9 +92,218 @@ class $ca2721b1aeb903c5$export$ecdc3cf9d1cfe143 extends (0, $7d546dcaafadc158$ex
97
92
  }).click();
98
93
  const EditMessage = this.page.getByRole("alertdialog");
99
94
  await (0, $lE6ZQ$expect)(EditMessage).toBeVisible();
100
- const editedUsername = this.page.locator("td.users-table-fullName div").textContent();
101
- // eslint-disable-next-line no-console
102
- console.log(editedUsername);
95
+ await (0, $lE6ZQ$expect)(EditMessage).toContainText("Your change was saved");
96
+ }
97
+ }
98
+
99
+
100
+
101
+
102
+ class $a4d71fd851704781$export$c88e1d16f82516d extends (0, $7d546dcaafadc158$export$2b65d1d97338f32b) {
103
+ /* Helps to create a LocalHost of type UNIX/Windows/Zos */ async createHostForGivenType(name, type) {
104
+ await this.page.locator('input[name="name"]').fill(name);
105
+ await this.page.locator('label:has-text("Operating system")').locator("xpath=following::input[1]").click();
106
+ await this.page.getByText(type, {
107
+ exact: true
108
+ }).click();
109
+ await this.page.getByRole("button", {
110
+ name: "Save and close"
111
+ }).click();
112
+ const toastMessage = this.page.locator(".redux-toastr .rrt-text:visible");
113
+ await (0, $lE6ZQ$expect)(toastMessage).toHaveText("Your change was saved.", {
114
+ timeout: 2000
115
+ });
116
+ }
117
+ }
118
+
119
+
120
+
121
+
122
+ class $8f7dd2349a88e8b2$export$12530425267834a9 extends (0, $7d546dcaafadc158$export$2b65d1d97338f32b) {
123
+ /* Helps to create a new Environment */ async createEnvironment(environmentName, hostName) {
124
+ await this.page.locator('input[name="name"]').fill(environmentName);
125
+ await this.page.locator("i.xl-icon.arrow-down-icon.show-all").nth(0).click();
126
+ await this.page.getByTitle(`Infrastructure/${hostName}`, {
127
+ exact: true
128
+ }).click();
129
+ await this.page.getByRole("button", {
130
+ name: "Save and close"
131
+ }).click();
132
+ const toastMessage = this.page.locator(".redux-toastr .rrt-text:visible");
133
+ await (0, $lE6ZQ$expect)(toastMessage).toHaveText("Your change was saved.", {
134
+ timeout: 2000
135
+ });
136
+ }
137
+ }
138
+
139
+
140
+
141
+
142
+ class $3fb4750cbb53e5e6$export$1533b625ec0c75e2 extends (0, $7d546dcaafadc158$export$2b65d1d97338f32b) {
143
+ constructor(page, navigation){
144
+ super(page);
145
+ this.navigation = navigation;
146
+ }
147
+ /* Creates a new application */ async createNewApplication(applicationName) {
148
+ await this.navigation.navigateToApplicationsPage();
149
+ await this.page.locator('input[name="name"]').waitFor({
150
+ state: "visible"
151
+ });
152
+ await this.page.locator('input[name="name"]').click();
153
+ await this.page.locator('input[name="name"]').fill(applicationName);
154
+ await this.page.getByRole("button", {
155
+ name: "Save and close"
156
+ }).click();
157
+ const toastMessage = this.page.locator(".redux-toastr .rrt-text:visible");
158
+ await (0, $lE6ZQ$expect)(toastMessage).toHaveText("Your change was saved.", {
159
+ timeout: 2000
160
+ });
161
+ }
162
+ /* Creates a new deployment package */ async createNewDeploymentPackage(applicationName, packageName) {
163
+ const appDataId = `Applications/${applicationName}`;
164
+ // Expand Applications
165
+ const root = this.page.locator('div[data-id="Applications"] .infinite-tree-node > a');
166
+ await root.click();
167
+ // Hover over app node
168
+ const appNode = this.page.locator(`span[data-id="${appDataId}"]`);
169
+ await (0, $lE6ZQ$expect)(appNode).toBeVisible();
170
+ await appNode.hover();
171
+ // Open context menu + create new deployment package
172
+ const contextMenu = this.page.locator(`i.context-menu-button[data-id="${appDataId}"]`);
173
+ await (0, $lE6ZQ$expect)(contextMenu).toBeVisible();
174
+ await contextMenu.click();
175
+ await this.page.getByRole("link", {
176
+ name: "New"
177
+ }).click();
178
+ await this.page.getByRole("link", {
179
+ name: "Deployment Package"
180
+ }).click();
181
+ // Fill & save
182
+ const nameInput = this.page.locator('input[name="name"]');
183
+ await nameInput.fill(packageName);
184
+ await this.page.getByRole("button", {
185
+ name: "Save and close"
186
+ }).click();
187
+ const toastMessage = this.page.locator(".redux-toastr .rrt-text:visible");
188
+ await (0, $lE6ZQ$expect)(toastMessage).toHaveText("Your change was saved.", {
189
+ timeout: 2000
190
+ });
191
+ }
192
+ /* Creates a new command application */ async createNewCmdApplication(values) {
193
+ const appDataId = `Applications/${values[0]}`;
194
+ const packageDataId = `Applications/${values[0]}/${values[1]}`;
195
+ // Expand app node and click package
196
+ await this.page.locator(`div[data-id="${appDataId}"] .infinite-tree-node > a`).click();
197
+ const packageNode = this.page.locator(`span[data-id="${packageDataId}"]`).first();
198
+ await (0, $lE6ZQ$expect)(packageNode).toBeVisible();
199
+ await packageNode.click();
200
+ // Open context menu
201
+ const packageMenu = this.page.locator(`i.context-menu-button[data-id="${packageDataId}"]`);
202
+ await (0, $lE6ZQ$expect)(packageMenu).toBeVisible();
203
+ await packageMenu.click();
204
+ // Create Command application
205
+ await this.page.getByRole("link", {
206
+ name: "New"
207
+ }).click();
208
+ await this.page.getByRole("link", {
209
+ name: "cmd"
210
+ }).click();
211
+ await this.page.getByRole("link", {
212
+ name: "Command"
213
+ }).click();
214
+ await this.page.locator('input[name="name"]').fill(values[2]);
215
+ await this.page.locator('textarea[name="commandLine"]').fill(values[3]);
216
+ const saveBtn = this.page.locator("button", {
217
+ hasText: /^Save$/
218
+ }).first();
219
+ await (0, $lE6ZQ$expect)(saveBtn).toBeEnabled();
220
+ await saveBtn.click();
221
+ await this.page.waitForTimeout(3000);
222
+ const toastMessage = this.page.locator(".redux-toastr .rrt-text:visible");
223
+ await (0, $lE6ZQ$expect)(toastMessage).toHaveText("Your change was saved.", {
224
+ timeout: 2000
225
+ });
226
+ // Close dialog
227
+ await this.page.locator("i.xl-icon.close-icon").first().click();
228
+ }
229
+ /*Deploy the application*/ async deployApp(values) {
230
+ const versionNode = `Applications/${values[0]}/${values[1]}`;
231
+ await this.page.locator(`i.context-menu-button[data-id="${versionNode}"]`).click();
232
+ await this.page.getByRole("link", {
233
+ name: "Deploy",
234
+ exact: true
235
+ }).click();
236
+ await this.page.locator(`input[name="selections"][value="Environments/${values[2]}"]`).click();
237
+ await this.page.getByRole("button", {
238
+ name: "Continue"
239
+ }).click();
240
+ await this.page.locator(".errors-wrapper").waitFor({
241
+ state: "attached",
242
+ timeout: 2000
243
+ });
244
+ const errorIcon = this.page.locator("a.validation-icons-wrapper.error");
245
+ if (await errorIcon.isVisible()) {
246
+ await this.page.getByRole("button", {
247
+ name: "Deployment Properties"
248
+ }).click();
249
+ await this.page.locator('input[name="username"]').fill(values[3]);
250
+ await this.page.getByRole("button", {
251
+ name: "Save"
252
+ }).click();
253
+ }
254
+ await this.page.locator("button.deploy.xl-primary").click();
255
+ //Get the task id
256
+ this.taskId = await this.page.locator("div.task-id").textContent() || "";
257
+ //Verify no failure and all are done
258
+ const labels = this.page.locator("span.label");
259
+ await (0, $lE6ZQ$expect)(labels).toHaveCount(3);
260
+ await (0, $lE6ZQ$expect)(labels).toHaveText([
261
+ "EXECUTED",
262
+ "DONE",
263
+ "DONE"
264
+ ]);
265
+ //Get the text executed
266
+ await this.page.locator('div[data-id="0_1_1"] .infinite-tree-node > a').click();
267
+ await this.page.getByTitle("Execute Test Command").click();
268
+ this.executedText = await this.page.locator("div.step-log-body pre").nth(1).innerText();
269
+ //Verify in monitoring tab searching with the task id
270
+ await this.page.locator('div[data-id="TASK_MONITOR"] .infinite-tree-node > a').click();
271
+ await this.page.locator('span[data-id="DEPLOYMENT_TASKS"]').dblclick();
272
+ await this.page.waitForTimeout(5000);
273
+ await this.page.locator('div.deployment-task-filter-task-id input[placeholder="Search"]').first().fill(this.taskId);
274
+ const stateText = await this.page.locator("td.tasks-table-state").first().innerText();
275
+ (0, $lE6ZQ$expect)(stateText.trim()).toBe("Executed");
276
+ //Click the row to go to deployment screen
277
+ await this.page.locator("table.table.table-striped tbody tr").first().dblclick();
278
+ await this.page.locator("button.finish.xl-primary").click();
279
+ }
280
+ }
281
+
282
+
283
+
284
+
285
+ class $76bad9b9e6741f37$export$b8a443164510a1b4 extends (0, $7d546dcaafadc158$export$2b65d1d97338f32b) {
286
+ /* Clicks on the Deployment Tasks section */ async clickDeploymentTasks() {
287
+ await this.page.locator("p.MuiTypography-root", {
288
+ hasText: "Deployments"
289
+ }).click();
290
+ }
291
+ async verifyTheDeploymentValues(values) {
292
+ await this.page.locator('div.deployment-task-filter-task-id input[placeholder="Search"]:visible').first().fill(values[0]);
293
+ await this.page.waitForSelector("td.report-table-package .deployment-report-package", {
294
+ timeout: 5000
295
+ });
296
+ await (0, $lE6ZQ$expect)(this.page.locator("td.report-table-package .deployment-report-package")).toContainText(new RegExp(`${values[2]}\\/${values[3]}`, "i"));
297
+ await (0, $lE6ZQ$expect)(this.page.locator("td.report-table-originalType .deployment-report-task-type")).toHaveText(/Initial/i); // Regex ignores case
298
+ await (0, $lE6ZQ$expect)(this.page.locator("td.report-table-user .deployment-report-user")).toHaveText("admin");
299
+ //Click the row
300
+ await this.page.locator("td.report-table-package .deployment-report-package").dblclick();
301
+ await this.page.locator('div[data-id="0_1_1"] .infinite-tree-node > a').click();
302
+ await this.page.getByTitle("Execute Test Command").click();
303
+ //Get the log text
304
+ const text = await this.page.locator("div.step-log-body pre").nth(1).innerText();
305
+ //Verify both the log text are same
306
+ (0, $lE6ZQ$expect)(text).toContain(values[1]);
103
307
  }
104
308
  }
105
309
 
@@ -109,6 +313,10 @@ class $95d5ebc9765b570f$export$b8a61e5c71402559 {
109
313
  this.page = page;
110
314
  this.homePage = new (0, $e18c8d3707c8c74c$export$36d69433c4f81145)(page);
111
315
  this.userPage = new (0, $ca2721b1aeb903c5$export$ecdc3cf9d1cfe143)(page);
316
+ this.overthereLocalHostPage = new (0, $a4d71fd851704781$export$c88e1d16f82516d)(page);
317
+ this.environmentsPage = new (0, $8f7dd2349a88e8b2$export$12530425267834a9)(page);
318
+ this.applicationsPage = new (0, $3fb4750cbb53e5e6$export$1533b625ec0c75e2)(page, this);
319
+ this.reportsPage = new (0, $76bad9b9e6741f37$export$b8a443164510a1b4)(page);
112
320
  }
113
321
  async navigateToHomePage() {
114
322
  await this.page.goto("/home");
@@ -122,17 +330,50 @@ class $95d5ebc9765b570f$export$b8a61e5c71402559 {
122
330
  const collapseButton = this.page.getByTestId("back-button");
123
331
  await collapseButton.click();
124
332
  }
333
+ /* Helps to navigate to the Applications page */ async navigateToApplicationsPage() {
334
+ const configNode = this.page.locator('span[data-id="Applications"]');
335
+ await configNode.hover();
336
+ await this.page.locator('i.context-menu-button[data-id="Applications"]').click();
337
+ await this.page.getByRole("link", {
338
+ name: "New"
339
+ }).click();
340
+ await this.page.getByRole("link", {
341
+ name: "Application"
342
+ }).click();
343
+ }
344
+ /* Helps to navigate to the Environments page */ async navigateToEnvironmentsPage() {
345
+ const configNode = this.page.locator('span[data-id="Environments"]');
346
+ await configNode.hover();
347
+ await this.page.locator('i.context-menu-button[data-id="Environments"]').click();
348
+ await this.page.getByRole("link", {
349
+ name: "New"
350
+ }).click();
351
+ await this.page.getByRole("link", {
352
+ name: "Environment"
353
+ }).click();
354
+ }
355
+ /* Helps to navigate to the Overthere LocalHost page */ async navigateToOverthereLocalHostPage() {
356
+ const configNode = this.page.locator('span[data-id="Infrastructure"]');
357
+ await configNode.hover();
358
+ await this.page.locator('i.context-menu-button[data-id="Infrastructure"]').click();
359
+ // await this.page.waitForTimeout(5000);
360
+ await this.page.getByRole("link", {
361
+ name: "New"
362
+ }).click();
363
+ await this.page.getByRole("link", {
364
+ name: "overthere"
365
+ }).click();
366
+ await this.page.getByRole("link", {
367
+ name: "LocalHost"
368
+ }).click();
369
+ }
125
370
  }
126
371
 
127
372
 
128
373
 
129
374
 
130
375
  class $c5e912d43cd579b2$export$f14c0e3f98d164c0 extends (0, $7d546dcaafadc158$export$2b65d1d97338f32b) {
131
- /**
132
- * Login with username and password
133
- * @param userName
134
- * @param password
135
- */ async login(userName, password) {
376
+ /* Login with username and password*/ async login(userName, password) {
136
377
  await this.page.goto("/#/login");
137
378
  await (0, $lE6ZQ$expect)(this.page).toHaveTitle("Digital.ai Deploy");
138
379
  await this.page.getByPlaceholder("user").fill(userName, {
@@ -147,13 +388,11 @@ class $c5e912d43cd579b2$export$f14c0e3f98d164c0 extends (0, $7d546dcaafadc158$ex
147
388
  timeout: 10000
148
389
  });
149
390
  }
150
- async verifyInvalidPasswordMessage() {
391
+ /* Verify invalid password message */ async verifyInvalidPasswordMessage() {
151
392
  const errorMessage = this.page.getByText("The username and/or password you have entered is incorrect.");
152
393
  await (0, $lE6ZQ$expect)(errorMessage).toBeVisible();
153
394
  }
154
- /**
155
- * Logout as authenticated user
156
- */ async logout() {
395
+ /* Logout as authenticated user */ async logout() {
157
396
  await this.page.locator("button.dot-avatar").click();
158
397
  await this.page.getByText("Log out", {
159
398
  exact: true
@@ -1 +1 @@
1
- {"mappings":"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","sources":["apps/deploy/index.ts","apps/deploy/fixtures/index.ts","apps/deploy/pages/index.ts","apps/deploy/pages/homePage.ts","apps/deploy/pages/withPage.ts","apps/deploy/pages/usersPage.ts","apps/deploy/pages/loginPage.ts"],"sourcesContent":["export { test } from './fixtures';\n","import { test as base, Page } from '@playwright/test';\nimport { Navigation } from '../pages';\nimport { LoginPage } from '../pages/loginPage';\n\ntype DeployFixtures = {\n fixtures: Fixtures;\n loginPage: LoginPage;\n navigation: Navigation;\n};\n\nexport const test = base.extend<DeployFixtures>({\n fixtures: async ({ page }, use) => {\n const fixtures = new Fixtures(page);\n await use(fixtures);\n return fixtures;\n },\n loginPage: async ({ page }, use) => {\n const loginPage = new LoginPage(page);\n await use(loginPage);\n return loginPage;\n },\n navigation: async ({ page }, use) => {\n const navigationPage = new Navigation(page);\n await use(navigationPage);\n return navigationPage;\n },\n});\n\nclass Fixtures {\n private readonly page: Page;\n\n constructor(page: Page) {\n this.page = page;\n }\n}\n","import { Page } from '@playwright/test';\nimport { HomePage } from './homePage';\nimport { UserPage } from './usersPage';\n\nexport class Navigation {\n private readonly page: Page;\n homePage: HomePage;\n userPage: UserPage;\n\n constructor(page: Page) {\n this.page = page;\n this.homePage = new HomePage(page);\n this.userPage = new UserPage(page);\n }\n\n async navigateToHomePage(): Promise<void> {\n await this.page.goto('/home');\n }\n\n async navigateToUserPage(): Promise<void> {\n await this.page.locator('p.MuiTypography-root', { hasText: 'User management' }).click();\n }\n\n async clickCollapseSideView(): Promise<void> {\n const collapseButton = this.page.getByTestId('back-button');\n await collapseButton.click();\n }\n}\n","import { expect } from '@playwright/test';\nimport { WithPage } from './withPage';\n\nexport class HomePage extends WithPage {\n async clickUserManagement(): Promise<void> {\n await this.page.locator('p.MuiTypography-root', { hasText: 'User management' }).click();\n await this.page.getByRole('link', { name: 'Users' }).click();\n }\n\n async verifyDeployLogoIsPresent(): Promise<void> {\n const logo = this.page.getByAltText('Deploy');\n await expect(logo).toBeVisible();\n }\n\n async verifyDeployTextIsPresent(): Promise<void> {\n const title = this.page.getByTitle('digital.ai');\n await expect(title).toBeVisible();\n }\n}\n","import { Page } from '@playwright/test';\n\nexport class WithPage {\n protected readonly page: Page;\n\n constructor(page: Page) {\n this.page = page;\n }\n}\n","import { expect } from '@playwright/test';\nimport { WithPage } from './withPage';\n\nexport class UserPage extends WithPage {\n /**\n * Login with username and password\n * @param userName\n * @param password\n */\n // this should be refactored to take an object and not disable the rule!!\n // eslint-disable-next-line max-params\n async createNewUser(\n username: string,\n fullName: string,\n email: string,\n password: string,\n confirmPassword: string,\n ): Promise<void> {\n await this.page.locator('p.MuiTypography-root', { hasText: 'Users' }).click();\n await this.page.getByRole('button', { name: 'Add user' }).click();\n await this.page.locator('input[name=\"username\"]').fill(username);\n await this.page.locator('input[name=\"fullName\"]').fill(fullName);\n await this.page.locator('input[name=\"email\"]').fill(email);\n const passwordInput = this.page.locator('input[name=\"password\"]');\n await passwordInput.click({ force: true });\n await passwordInput.fill(password);\n await this.page.locator('input[name=\"confirmPassword\"]').fill(confirmPassword);\n await this.page.getByRole('button', { name: 'Save' }).click();\n }\n\n async verifySuccessMessage(): Promise<void> {\n const SuccessMessage = this.page.getByRole('alertdialog');\n await expect(SuccessMessage).toBeVisible();\n await expect(SuccessMessage).toHaveText(/User \".*\" created/i);\n }\n\n async verifyUserErrorMessage(): Promise<void> {\n await expect(this.page.locator('.rrt-middle-container[role=\"alertdialog\"]').nth(1)).toContainText(\n /already in use/i,\n );\n }\n\n async deleteTheUserAndVerifyItIsDeleted(username: string): Promise<void> {\n await this.page.locator('p.MuiTypography-root', { hasText: 'Users' }).click();\n await this.page.waitForTimeout(10000);\n await this.page.getByPlaceholder('Filter...').fill(username);\n await this.page.waitForTimeout(10000);\n await this.page.locator('td.users-table-actions button.delete.xl-icon.table-action').click();\n await this.page.getByRole('button', { name: 'Delete', exact: true }).click();\n const DeleteMessage = this.page.getByRole('alertdialog');\n await expect(DeleteMessage).toBeVisible();\n await expect(DeleteMessage).toHaveText(/User \".*\" deleted/i);\n }\n\n async editUserAndVerify(username: string, editfullname: string): Promise<void> {\n await this.page.locator('p.MuiTypography-root', { hasText: 'Users' }).click();\n await this.page.waitForTimeout(10000);\n await this.page.getByPlaceholder('Filter...').fill(username);\n await this.page.waitForTimeout(10000);\n await this.page.locator('i.icon-edit.dot-i').first().click();\n await this.page.locator('input[name=\"fullName\"]').fill(editfullname);\n await this.page.getByRole('button', { name: 'Save', exact: true }).click();\n const EditMessage = this.page.getByRole('alertdialog');\n await expect(EditMessage).toBeVisible();\n const editedUsername = this.page.locator('td.users-table-fullName div').textContent();\n // eslint-disable-next-line no-console\n console.log(editedUsername);\n }\n}\n","import { expect } from '@playwright/test';\nimport { WithPage } from './withPage';\n\nexport class LoginPage extends WithPage {\n /**\n * Login with username and password\n * @param userName\n * @param password\n */\n async login(userName: string, password: string): Promise<void> {\n await this.page.goto('/#/login');\n await expect(this.page).toHaveTitle('Digital.ai Deploy');\n await this.page.getByPlaceholder('user').fill(userName, { timeout: 1000 });\n await this.page.getByPlaceholder('Password').fill(password, { timeout: 10000 });\n await this.page.getByRole('button', { name: 'Log in' }).click({ timeout: 10000 });\n }\n\n async verifyInvalidPasswordMessage(): Promise<void> {\n const errorMessage = this.page.getByText('The username and/or password you have entered is incorrect.');\n await expect(errorMessage).toBeVisible();\n }\n\n /**\n * Logout as authenticated user\n */\n async logout(): Promise<void> {\n await this.page.locator('button.dot-avatar').click();\n await this.page.getByText('Log out', { exact: true }).click();\n await expect(this.page.getByText('Log in').first()).toBeVisible();\n }\n}\n"],"names":[],"version":3,"file":"module.js.map"}
1
+ {"mappings":";;ACAA;AEAA;ACEO,MAAM;IAGX,YAAY,IAAU,CAAE;QACtB,IAAI,CAAC,IAAI,GAAG;IACd;AACF;;;ADLO,MAAM,kDAAiB,CAAA,GAAA,yCAAQ,AAAD;IACnC,MAAM,sBAAqC;QACzC,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,wBAAwB;YAAE,SAAS;QAAkB,GAAG,KAAK;QACrF,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ;YAAE,MAAM;QAAQ,GAAG,KAAK;IAC5D;IAEA,MAAM,4BAA2C;QAC/C,MAAM,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC;QACpC,MAAM,CAAA,GAAA,aAAM,AAAD,EAAE,MAAM,WAAW;IAChC;IAEA,MAAM,4BAA2C;QAC/C,MAAM,QAAQ,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC;QACnC,MAAM,CAAA,GAAA,aAAM,AAAD,EAAE,OAAO,WAAW;IACjC;IAEA,MAAM,eAA8B;QAClC,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,wBAAwB;YAAE,SAAS;QAAU,GAAG,KAAK;IAC/E;AACF;;ADtBA;AGAA;;AAGO,MAAM,kDAAiB,CAAA,GAAA,yCAAQ,AAAD;IACnC,qBAAqB,GACrB,MAAM,cAAc,QAAgB,EAAE,KAAa,EAAE,QAAgB,EAAiB;QACpF,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,wBAAwB;YAAE,SAAS;QAAQ,GAAG,KAAK;QAC3E,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU;YAAE,MAAM;QAAW,GAAG,KAAK;QAC/D,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,0BAA0B,IAAI,CAAC;QACvD,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,0BAA0B,IAAI,CAAC;QACvD,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,uBAAuB,IAAI,CAAC;QACpD,MAAM,gBAAgB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;QACxC,MAAM,cAAc,KAAK,CAAC;YAAE,OAAO,IAAI;QAAC;QACxC,MAAM,cAAc,IAAI,CAAC;QACzB,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,iCAAiC,IAAI,CAAC;QAC9D,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU;YAAE,MAAM;QAAO,GAAG,KAAK;IAC7D;IAEA,0BAA0B,GAC1B,MAAM,uBAAsC;QAC1C,MAAM,iBAAiB,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC;QAC3C,MAAM,CAAA,GAAA,aAAM,AAAD,EAAE,gBAAgB,WAAW;QACxC,MAAM,CAAA,GAAA,aAAK,EAAE,gBAAgB,UAAU,CAAC;IAC1C;IAEA,6BAA6B,GAC7B,MAAM,yBAAwC;QAC5C,MAAM,CAAA,GAAA,aAAM,AAAD,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,6CAA6C,GAAG,CAAC,IAAI,aAAa,CAC/F;IAEJ;IAEA,4CAA4C,GAC5C,MAAM,kCAAkC,QAAgB,EAAiB;QACvE,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,wBAAwB;YAAE,SAAS;QAAQ,GAAG,KAAK;QAC3E,MAAM,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,aAAa,IAAI,CAAC;QACnD,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,6DAA6D,KAAK;QAC1F,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU;YAAE,MAAM;YAAU,OAAO,IAAI;QAAC,GAAG,KAAK;QAC1E,MAAM,gBAAgB,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC;QAC1C,MAAM,CAAA,GAAA,aAAM,AAAD,EAAE,eAAe,WAAW;QACvC,MAAM,CAAA,GAAA,aAAK,EAAE,eAAe,UAAU,CAAC;IACzC;IAEA,wCAAwC,GACxC,MAAM,kBAAkB,QAAgB,EAAE,YAAoB,EAAiB;QAC7E,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,wBAAwB;YAAE,SAAS;QAAQ,GAAG,KAAK;QAC3E,MAAM,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,aAAa,IAAI,CAAC;QACnD,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,qBAAqB,KAAK,GAAG,KAAK;QAC1D,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,0BAA0B,IAAI,CAAC;QACvD,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU;YAAE,MAAM;YAAQ,OAAO,IAAI;QAAC,GAAG,KAAK;QACxE,MAAM,cAAc,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC;QACxC,MAAM,CAAA,GAAA,aAAM,AAAD,EAAE,aAAa,WAAW;QACrC,MAAM,CAAA,GAAA,aAAK,EAAE,aAAa,aAAa,CAAC;IAC1C;AACF;;;ACtDA;;AAGO,MAAM,iDAA+B,CAAA,GAAA,yCAAQ,AAAD;IACjD,wDAAwD,GACxD,MAAM,uBAAuB,IAAY,EAAE,IAAY,EAAiB;QACtE,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,sBAAsB,IAAI,CAAC;QACnD,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,sCAAsC,OAAO,CAAC,6BAA6B,KAAK;QACxG,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM;YAAE,OAAO,IAAI;QAAC,GAAG,KAAK;QACtD,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU;YAAE,MAAM;QAAiB,GAAG,KAAK;QACrE,MAAM,eAAe,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;QACvC,MAAM,CAAA,GAAA,aAAK,EAAE,cAAc,UAAU,CAAC,0BAA0B;YAAE,SAAS;QAAK;IAClF;AACF;;;ACbA;;AAGO,MAAM,kDAAyB,CAAA,GAAA,yCAAQ,AAAD;IAC3C,qCAAqC,GACrC,MAAM,kBAAkB,eAAuB,EAAE,QAAgB,EAAiB;QAChF,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,sBAAsB,IAAI,CAAC;QACnD,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,sCAAsC,GAAG,CAAC,GAAG,KAAK;QAC1E,MAAM,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,eAAe,EAAE,SAAS,CAAC,EAAE;YAAE,OAAO,IAAI;QAAC,GAAG,KAAK;QAC/E,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU;YAAE,MAAM;QAAiB,GAAG,KAAK;QACrE,MAAM,eAAe,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;QACvC,MAAM,CAAA,GAAA,aAAK,EAAE,cAAc,UAAU,CAAC,0BAA0B;YAAE,SAAS;QAAK;IAClF;AACF;;;ACbA;;AAIO,MAAM,kDAAyB,CAAA,GAAA,yCAAQ,AAAD;IAK3C,YAAY,IAAU,EAAE,UAAsB,CAAE;QAC9C,KAAK,CAAC;QACN,IAAI,CAAC,UAAU,GAAG;IACpB;IAEA,6BAA6B,GAC7B,MAAM,qBAAqB,eAAuB,EAAiB;QACjE,MAAM,IAAI,CAAC,UAAU,CAAC,0BAA0B;QAChD,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,sBAAsB,OAAO,CAAC;YAAE,OAAO;QAAU;QACzE,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,sBAAsB,KAAK;QACnD,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,sBAAsB,IAAI,CAAC;QACnD,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU;YAAE,MAAM;QAAiB,GAAG,KAAK;QACrE,MAAM,eAAe,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;QACvC,MAAM,CAAA,GAAA,aAAK,EAAE,cAAc,UAAU,CAAC,0BAA0B;YAAE,SAAS;QAAK;IAClF;IAEA,oCAAoC,GACpC,MAAM,2BAA2B,eAAuB,EAAE,WAAmB,EAAiB;QAC5F,MAAM,YAAY,CAAC,aAAa,EAAE,gBAAgB,CAAC;QAEnD,sBAAsB;QACtB,MAAM,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;QAC/B,MAAM,KAAK,KAAK;QAEhB,sBAAsB;QACtB,MAAM,UAAU,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,cAAc,EAAE,UAAU,EAAE,CAAC;QAChE,MAAM,CAAA,GAAA,aAAM,AAAD,EAAE,SAAS,WAAW;QACjC,MAAM,QAAQ,KAAK;QAEnB,oDAAoD;QACpD,MAAM,cAAc,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,+BAA+B,EAAE,UAAU,EAAE,CAAC;QACrF,MAAM,CAAA,GAAA,aAAM,AAAD,EAAE,aAAa,WAAW;QACrC,MAAM,YAAY,KAAK;QAEvB,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ;YAAE,MAAM;QAAM,GAAG,KAAK;QACxD,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ;YAAE,MAAM;QAAqB,GAAG,KAAK;QAEvE,cAAc;QACd,MAAM,YAAY,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;QACpC,MAAM,UAAU,IAAI,CAAC;QAErB,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU;YAAE,MAAM;QAAiB,GAAG,KAAK;QAErE,MAAM,eAAe,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;QACvC,MAAM,CAAA,GAAA,aAAK,EAAE,cAAc,UAAU,CAAC,0BAA0B;YAAE,SAAS;QAAK;IAClF;IAEA,qCAAqC,GACrC,MAAM,wBAAwB,MAAgB,EAAiB;QAC7D,MAAM,YAAY,CAAC,aAAa,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;QAC7C,MAAM,gBAAgB,CAAC,aAAa,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;QAE9D,oCAAoC;QACpC,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,aAAa,EAAE,UAAU,0BAA0B,CAAC,EAAE,KAAK;QACpF,MAAM,cAAc,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,cAAc,EAAE,cAAc,EAAE,CAAC,EAAE,KAAK;QAC/E,MAAM,CAAA,GAAA,aAAM,AAAD,EAAE,aAAa,WAAW;QACrC,MAAM,YAAY,KAAK;QAEvB,oBAAoB;QACpB,MAAM,cAAc,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,+BAA+B,EAAE,cAAc,EAAE,CAAC;QACzF,MAAM,CAAA,GAAA,aAAM,AAAD,EAAE,aAAa,WAAW;QACrC,MAAM,YAAY,KAAK;QAEvB,6BAA6B;QAC7B,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ;YAAE,MAAM;QAAM,GAAG,KAAK;QACxD,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ;YAAE,MAAM;QAAM,GAAG,KAAK;QACxD,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ;YAAE,MAAM;QAAU,GAAG,KAAK;QAE5D,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,sBAAsB,IAAI,CAAC,MAAM,CAAC,EAAE;QAE5D,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,gCAAgC,IAAI,CAAC,MAAM,CAAC,EAAE;QAEtE,MAAM,UAAU,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU;YAAE,SAAS;QAAS,GAAG,KAAK;QACxE,MAAM,CAAA,GAAA,aAAM,AAAD,EAAE,SAAS,WAAW;QACjC,MAAM,QAAQ,KAAK;QACnB,MAAM,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC;QAE/B,MAAM,eAAe,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;QACvC,MAAM,CAAA,GAAA,aAAK,EAAE,cAAc,UAAU,CAAC,0BAA0B;YAAE,SAAS;QAAK;QAEhF,eAAe;QACf,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,wBAAwB,KAAK,GAAG,KAAK;IAC/D;IAEA,wBAAwB,GACxB,MAAM,UAAU,MAAgB,EAAiB;QAC/C,MAAM,cAAc,CAAC,aAAa,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;QAC5D,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,+BAA+B,EAAE,YAAY,EAAE,CAAC,EAAE,KAAK;QAChF,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ;YAAE,MAAM;YAAU,OAAO,IAAI;QAAC,GAAG,KAAK;QACxE,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,6CAA6C,EAAE,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK;QAC5F,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU;YAAE,MAAM;QAAW,GAAG,KAAK;QAE/D,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,mBAAmB,OAAO,CAAC;YAAE,OAAO;YAAY,SAAS;QAAK;QAEtF,MAAM,YAAY,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;QAEpC,IAAI,MAAM,UAAU,SAAS,IAAI;YAC/B,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU;gBAAE,MAAM;YAAwB,GAAG,KAAK;YAC5E,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,0BAA0B,IAAI,CAAC,MAAM,CAAC,EAAE;YAChE,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU;gBAAE,MAAM;YAAO,GAAG,KAAK;QAC7D,CAAC;QAED,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,4BAA4B,KAAK;QAEzD,iBAAiB;QACjB,IAAI,CAAC,MAAM,GAAG,AAAC,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,WAAW,MAAO;QAExE,oCAAoC;QACpC,MAAM,SAAS,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;QACjC,MAAM,CAAA,GAAA,aAAK,EAAE,QAAQ,WAAW,CAAC;QACjC,MAAM,CAAA,GAAA,aAAK,EAAE,QAAQ,UAAU,CAAC;YAAC;YAAY;YAAQ;SAAO;QAE5D,uBAAuB;QACvB,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,gDAAgD,KAAK;QAC7E,MAAM,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,wBAAwB,KAAK;QACxD,IAAI,CAAC,YAAY,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,yBAAyB,GAAG,CAAC,GAAG,SAAS;QAErF,qDAAqD;QACrD,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,uDAAuD,KAAK;QACpF,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,oCAAoC,QAAQ;QACpE,MAAM,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC;QAE/B,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,kEAAkE,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM;QAClH,MAAM,YAAY,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,wBAAwB,KAAK,GAAG,SAAS;QACnF,CAAA,GAAA,aAAK,EAAE,UAAU,IAAI,IAAI,IAAI,CAAC;QAE9B,0CAA0C;QAC1C,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,sCAAsC,KAAK,GAAG,QAAQ;QAE9E,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,4BAA4B,KAAK;IAC3D;AACF;;;AC5IA;;AAGO,MAAM,kDAAoB,CAAA,GAAA,yCAAQ,AAAD;IACtC,0CAA0C,GAC1C,MAAM,uBAAsC;QAC1C,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,wBAAwB;YAAE,SAAS;QAAc,GAAG,KAAK;IACnF;IAEA,MAAM,0BAA0B,MAAgB,EAAiB;QAC/D,MAAM,IAAI,CAAC,IAAI,CACZ,OAAO,CAAC,0EACR,KAAK,GACL,IAAI,CAAC,MAAM,CAAC,EAAE;QACjB,MAAM,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,sDAAsD;YAAE,SAAS;QAAK;QACtG,MAAM,CAAA,GAAA,aAAM,AAAD,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,uDAAuD,aAAa,CACjG,IAAI,OAAO,CAAC,EAAE,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE;QAE5C,MAAM,CAAA,GAAA,aAAM,AAAD,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,8DAA8D,UAAU,CAAC,aAAa,qBAAqB;QAC1I,MAAM,CAAA,GAAA,aAAM,AAAD,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,iDAAiD,UAAU,CAAC;QAE3F,eAAe;QACf,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,sDAAsD,QAAQ;QACtF,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,gDAAgD,KAAK;QAC7E,MAAM,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,wBAAwB,KAAK;QAExD,kBAAkB;QAClB,MAAM,OAAO,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,yBAAyB,GAAG,CAAC,GAAG,SAAS;QAE9E,mCAAmC;QACnC,CAAA,GAAA,aAAM,AAAD,EAAE,MAAM,SAAS,CAAC,MAAM,CAAC,EAAE;IAClC;AACF;;;APxBO,MAAM;IASX,YAAY,IAAU,CAAE;QACtB,IAAI,CAAC,IAAI,GAAG;QACZ,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAA,GAAA,yCAAQ,AAAD,EAAE;QAC7B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAA,GAAA,yCAAQ,AAAD,EAAE;QAC7B,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAA,GAAA,wCAAsB,AAAD,EAAE;QACzD,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAA,GAAA,yCAAgB,AAAD,EAAE;QAC7C,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAA,GAAA,yCAAgB,AAAD,EAAE,MAAM,IAAI;QACvD,IAAI,CAAC,WAAW,GAAG,IAAI,CAAA,GAAA,yCAAW,AAAD,EAAE;IACrC;IAEA,MAAM,qBAAoC;QACxC,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;IACvB;IAEA,MAAM,qBAAoC;QACxC,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,wBAAwB;YAAE,SAAS;QAAkB,GAAG,KAAK;IACvF;IAEA,MAAM,wBAAuC;QAC3C,MAAM,iBAAiB,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC;QAC7C,MAAM,eAAe,KAAK;IAC5B;IAEA,8CAA8C,GAC9C,MAAM,6BAA4C;QAChD,MAAM,aAAa,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;QACrC,MAAM,WAAW,KAAK;QACtB,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,iDAAiD,KAAK;QAC9E,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ;YAAE,MAAM;QAAM,GAAG,KAAK;QACxD,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ;YAAE,MAAM;QAAc,GAAG,KAAK;IAClE;IAEA,8CAA8C,GAC9C,MAAM,6BAA4C;QAChD,MAAM,aAAa,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;QACrC,MAAM,WAAW,KAAK;QACtB,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,iDAAiD,KAAK;QAC9E,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ;YAAE,MAAM;QAAM,GAAG,KAAK;QACxD,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ;YAAE,MAAM;QAAc,GAAG,KAAK;IAClE;IAEA,qDAAqD,GACrD,MAAM,mCAAkD;QACtD,MAAM,aAAa,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;QACrC,MAAM,WAAW,KAAK;QACtB,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,mDAAmD,KAAK;QAChF,wCAAwC;QACxC,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ;YAAE,MAAM;QAAM,GAAG,KAAK;QACxD,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ;YAAE,MAAM;QAAY,GAAG,KAAK;QAC9D,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ;YAAE,MAAM;QAAY,GAAG,KAAK;IAChE;AACF;;;AQpEA;;AAGO,MAAM,kDAAkB,CAAA,GAAA,yCAAQ,AAAD;IACpC,mCAAmC,GACnC,MAAM,MAAM,QAAgB,EAAE,QAAgB,EAAiB;QAC7D,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;QACrB,MAAM,CAAA,GAAA,aAAK,EAAE,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC;QACpC,MAAM,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,IAAI,CAAC,UAAU;YAAE,SAAS;QAAK;QACxE,MAAM,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,YAAY,IAAI,CAAC,UAAU;YAAE,SAAS;QAAM;QAC7E,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU;YAAE,MAAM;QAAS,GAAG,KAAK,CAAC;YAAE,SAAS;QAAM;IACjF;IAEA,mCAAmC,GACnC,MAAM,+BAA8C;QAClD,MAAM,eAAe,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC;QACzC,MAAM,CAAA,GAAA,aAAM,AAAD,EAAE,cAAc,WAAW;IACxC;IAEA,gCAAgC,GAChC,MAAM,SAAwB;QAC5B,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,qBAAqB,KAAK;QAClD,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW;YAAE,OAAO,IAAI;QAAC,GAAG,KAAK;QAC3D,MAAM,CAAA,GAAA,aAAM,AAAD,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,KAAK,IAAI,WAAW;IACjE;AACF;;;ATfO,MAAM,4CAAO,CAAA,GAAA,WAAI,AAAD,EAAE,MAAM,CAAiB;IAC9C,UAAU,OAAO,QAAE,KAAI,EAAE,EAAE,MAAQ;QACjC,MAAM,WAAW,IAAI,+BAAS;QAC9B,MAAM,IAAI;QACV,OAAO;IACT;IACA,WAAW,OAAO,QAAE,KAAI,EAAE,EAAE,MAAQ;QAClC,MAAM,YAAY,IAAI,CAAA,GAAA,yCAAQ,EAAE;QAChC,MAAM,IAAI;QACV,OAAO;IACT;IACA,YAAY,OAAO,QAAE,KAAI,EAAE,EAAE,MAAQ;QACnC,MAAM,iBAAiB,IAAI,CAAA,GAAA,yCAAS,EAAE;QACtC,MAAM,IAAI;QACV,OAAO;IACT;AACF;AAEA,MAAM;IAGJ,YAAY,IAAU,CAAE;QACtB,IAAI,CAAC,IAAI,GAAG;IACd;AACF;;ADlCA","sources":["apps/deploy/index.ts","apps/deploy/fixtures/index.ts","apps/deploy/pages/index.ts","apps/deploy/pages/homePage.ts","apps/deploy/pages/withPage.ts","apps/deploy/pages/usersPage.ts","apps/deploy/pages/infrastructure/overthereLocalHostPage.ts","apps/deploy/pages/environmentsPage.ts","apps/deploy/pages/applications/applicationsPage.ts","apps/deploy/pages/reportsPage.ts","apps/deploy/pages/loginPage.ts"],"sourcesContent":["export { test } from './fixtures';\n","import { test as base, Page } from '@playwright/test';\nimport { Navigation } from '../pages';\nimport { LoginPage } from '../pages/loginPage';\n\ntype DeployFixtures = {\n fixtures: Fixtures;\n loginPage: LoginPage;\n navigation: Navigation;\n};\n\nexport const test = base.extend<DeployFixtures>({\n fixtures: async ({ page }, use) => {\n const fixtures = new Fixtures(page);\n await use(fixtures);\n return fixtures;\n },\n loginPage: async ({ page }, use) => {\n const loginPage = new LoginPage(page);\n await use(loginPage);\n return loginPage;\n },\n navigation: async ({ page }, use) => {\n const navigationPage = new Navigation(page);\n await use(navigationPage);\n return navigationPage;\n },\n});\n\nclass Fixtures {\n private readonly page: Page;\n\n constructor(page: Page) {\n this.page = page;\n }\n}\n","import { Page } from '@playwright/test';\nimport { HomePage } from './homePage';\nimport { UserPage } from './usersPage';\nimport { OverthereLocalHostPage } from './infrastructure/overthereLocalHostPage';\nimport { EnvironmentsPage } from './environmentsPage';\nimport { ApplicationsPage } from './applications/applicationsPage';\nimport { ReportsPage } from './reportsPage';\n\nexport class Navigation {\n private readonly page: Page;\n homePage: HomePage;\n userPage: UserPage;\n overthereLocalHostPage: OverthereLocalHostPage;\n environmentsPage: EnvironmentsPage;\n applicationsPage: ApplicationsPage;\n reportsPage: ReportsPage;\n\n constructor(page: Page) {\n this.page = page;\n this.homePage = new HomePage(page);\n this.userPage = new UserPage(page);\n this.overthereLocalHostPage = new OverthereLocalHostPage(page);\n this.environmentsPage = new EnvironmentsPage(page);\n this.applicationsPage = new ApplicationsPage(page, this);\n this.reportsPage = new ReportsPage(page);\n }\n\n async navigateToHomePage(): Promise<void> {\n await this.page.goto('/home');\n }\n\n async navigateToUserPage(): Promise<void> {\n await this.page.locator('p.MuiTypography-root', { hasText: 'User management' }).click();\n }\n\n async clickCollapseSideView(): Promise<void> {\n const collapseButton = this.page.getByTestId('back-button');\n await collapseButton.click();\n }\n\n /* Helps to navigate to the Applications page */\n async navigateToApplicationsPage(): Promise<void> {\n const configNode = this.page.locator('span[data-id=\"Applications\"]');\n await configNode.hover();\n await this.page.locator('i.context-menu-button[data-id=\"Applications\"]').click();\n await this.page.getByRole('link', { name: 'New' }).click();\n await this.page.getByRole('link', { name: 'Application' }).click();\n }\n\n /* Helps to navigate to the Environments page */\n async navigateToEnvironmentsPage(): Promise<void> {\n const configNode = this.page.locator('span[data-id=\"Environments\"]');\n await configNode.hover();\n await this.page.locator('i.context-menu-button[data-id=\"Environments\"]').click();\n await this.page.getByRole('link', { name: 'New' }).click();\n await this.page.getByRole('link', { name: 'Environment' }).click();\n }\n\n /* Helps to navigate to the Overthere LocalHost page */\n async navigateToOverthereLocalHostPage(): Promise<void> {\n const configNode = this.page.locator('span[data-id=\"Infrastructure\"]');\n await configNode.hover();\n await this.page.locator('i.context-menu-button[data-id=\"Infrastructure\"]').click();\n // await this.page.waitForTimeout(5000);\n await this.page.getByRole('link', { name: 'New' }).click();\n await this.page.getByRole('link', { name: 'overthere' }).click();\n await this.page.getByRole('link', { name: 'LocalHost' }).click();\n }\n}\n","import { expect } from '@playwright/test';\nimport { WithPage } from './withPage';\n\nexport class HomePage extends WithPage {\n async clickUserManagement(): Promise<void> {\n await this.page.locator('p.MuiTypography-root', { hasText: 'User management' }).click();\n await this.page.getByRole('link', { name: 'Users' }).click();\n }\n\n async verifyDeployLogoIsPresent(): Promise<void> {\n const logo = this.page.getByAltText('Deploy');\n await expect(logo).toBeVisible();\n }\n\n async verifyDeployTextIsPresent(): Promise<void> {\n const title = this.page.getByTitle('digital.ai');\n await expect(title).toBeVisible();\n }\n\n async clickReports(): Promise<void> {\n await this.page.locator('p.MuiTypography-root', { hasText: 'Reports' }).click();\n }\n}\n","import { Page } from '@playwright/test';\n\nexport class WithPage {\n protected readonly page: Page;\n\n constructor(page: Page) {\n this.page = page;\n }\n}\n","import { expect } from '@playwright/test';\nimport { WithPage } from './withPage';\n\nexport class UserPage extends WithPage {\n /* Create a new user */\n async createNewUser(username: string, email: string, password: string): Promise<void> {\n await this.page.locator('p.MuiTypography-root', { hasText: 'Users' }).click();\n await this.page.getByRole('button', { name: 'Add user' }).click();\n await this.page.locator('input[name=\"username\"]').fill(username);\n await this.page.locator('input[name=\"fullName\"]').fill(username);\n await this.page.locator('input[name=\"email\"]').fill(email);\n const passwordInput = this.page.locator('input[name=\"password\"]');\n await passwordInput.click({ force: true });\n await passwordInput.fill(password);\n await this.page.locator('input[name=\"confirmPassword\"]').fill(password);\n await this.page.getByRole('button', { name: 'Save' }).click();\n }\n\n /* Verify success message */\n async verifySuccessMessage(): Promise<void> {\n const SuccessMessage = this.page.getByRole('alertdialog');\n await expect(SuccessMessage).toBeVisible();\n await expect(SuccessMessage).toHaveText(/User \".*\" created/i);\n }\n\n /* Verify user error message */\n async verifyUserErrorMessage(): Promise<void> {\n await expect(this.page.locator('.rrt-middle-container[role=\"alertdialog\"]').nth(1)).toContainText(\n /already in use/i,\n );\n }\n\n /* Delete the user and verify it is deleted */\n async deleteTheUserAndVerifyItIsDeleted(username: string): Promise<void> {\n await this.page.locator('p.MuiTypography-root', { hasText: 'Users' }).click();\n await this.page.getByPlaceholder('Filter...').fill(username);\n await this.page.locator('td.users-table-actions button.delete.xl-icon.table-action').click();\n await this.page.getByRole('button', { name: 'Delete', exact: true }).click();\n const DeleteMessage = this.page.getByRole('alertdialog');\n await expect(DeleteMessage).toBeVisible();\n await expect(DeleteMessage).toHaveText(/User \".*\" deleted/i);\n }\n\n /* Edit the user and verify the changes */\n async editUserAndVerify(username: string, editfullname: string): Promise<void> {\n await this.page.locator('p.MuiTypography-root', { hasText: 'Users' }).click();\n await this.page.getByPlaceholder('Filter...').fill(username);\n await this.page.locator('i.icon-edit.dot-i').first().click();\n await this.page.locator('input[name=\"fullName\"]').fill(editfullname);\n await this.page.getByRole('button', { name: 'Save', exact: true }).click();\n const EditMessage = this.page.getByRole('alertdialog');\n await expect(EditMessage).toBeVisible();\n await expect(EditMessage).toContainText('Your change was saved');\n }\n}\n","import { expect } from '@playwright/test';\nimport { WithPage } from '../withPage';\n\nexport class OverthereLocalHostPage extends WithPage {\n /* Helps to create a LocalHost of type UNIX/Windows/Zos */\n async createHostForGivenType(name: string, type: string): Promise<void> {\n await this.page.locator('input[name=\"name\"]').fill(name);\n await this.page.locator('label:has-text(\"Operating system\")').locator('xpath=following::input[1]').click();\n await this.page.getByText(type, { exact: true }).click();\n await this.page.getByRole('button', { name: 'Save and close' }).click();\n const toastMessage = this.page.locator('.redux-toastr .rrt-text:visible');\n await expect(toastMessage).toHaveText('Your change was saved.', { timeout: 2000 });\n }\n}\n","import { WithPage } from './withPage';\nimport { expect } from '@playwright/test';\n\nexport class EnvironmentsPage extends WithPage {\n /* Helps to create a new Environment */\n async createEnvironment(environmentName: string, hostName: string): Promise<void> {\n await this.page.locator('input[name=\"name\"]').fill(environmentName);\n await this.page.locator('i.xl-icon.arrow-down-icon.show-all').nth(0).click();\n await this.page.getByTitle(`Infrastructure/${hostName}`, { exact: true }).click();\n await this.page.getByRole('button', { name: 'Save and close' }).click();\n const toastMessage = this.page.locator('.redux-toastr .rrt-text:visible');\n await expect(toastMessage).toHaveText('Your change was saved.', { timeout: 2000 });\n }\n}\n","import { expect, Page } from '@playwright/test';\nimport { WithPage } from '../withPage';\nimport { Navigation } from '../index';\n\nexport class ApplicationsPage extends WithPage {\n taskId!: string;\n executedText!: string;\n private navigation: Navigation;\n\n constructor(page: Page, navigation: Navigation) {\n super(page);\n this.navigation = navigation;\n }\n\n /* Creates a new application */\n async createNewApplication(applicationName: string): Promise<void> {\n await this.navigation.navigateToApplicationsPage();\n await this.page.locator('input[name=\"name\"]').waitFor({ state: 'visible' });\n await this.page.locator('input[name=\"name\"]').click();\n await this.page.locator('input[name=\"name\"]').fill(applicationName);\n await this.page.getByRole('button', { name: 'Save and close' }).click();\n const toastMessage = this.page.locator('.redux-toastr .rrt-text:visible');\n await expect(toastMessage).toHaveText('Your change was saved.', { timeout: 2000 });\n }\n\n /* Creates a new deployment package */\n async createNewDeploymentPackage(applicationName: string, packageName: string): Promise<void> {\n const appDataId = `Applications/${applicationName}`;\n\n // Expand Applications\n const root = this.page.locator('div[data-id=\"Applications\"] .infinite-tree-node > a');\n await root.click();\n\n // Hover over app node\n const appNode = this.page.locator(`span[data-id=\"${appDataId}\"]`);\n await expect(appNode).toBeVisible();\n await appNode.hover();\n\n // Open context menu + create new deployment package\n const contextMenu = this.page.locator(`i.context-menu-button[data-id=\"${appDataId}\"]`);\n await expect(contextMenu).toBeVisible();\n await contextMenu.click();\n\n await this.page.getByRole('link', { name: 'New' }).click();\n await this.page.getByRole('link', { name: 'Deployment Package' }).click();\n\n // Fill & save\n const nameInput = this.page.locator('input[name=\"name\"]');\n await nameInput.fill(packageName);\n\n await this.page.getByRole('button', { name: 'Save and close' }).click();\n\n const toastMessage = this.page.locator('.redux-toastr .rrt-text:visible');\n await expect(toastMessage).toHaveText('Your change was saved.', { timeout: 2000 });\n }\n\n /* Creates a new command application */\n async createNewCmdApplication(values: string[]): Promise<void> {\n const appDataId = `Applications/${values[0]}`;\n const packageDataId = `Applications/${values[0]}/${values[1]}`;\n\n // Expand app node and click package\n await this.page.locator(`div[data-id=\"${appDataId}\"] .infinite-tree-node > a`).click();\n const packageNode = this.page.locator(`span[data-id=\"${packageDataId}\"]`).first();\n await expect(packageNode).toBeVisible();\n await packageNode.click();\n\n // Open context menu\n const packageMenu = this.page.locator(`i.context-menu-button[data-id=\"${packageDataId}\"]`);\n await expect(packageMenu).toBeVisible();\n await packageMenu.click();\n\n // Create Command application\n await this.page.getByRole('link', { name: 'New' }).click();\n await this.page.getByRole('link', { name: 'cmd' }).click();\n await this.page.getByRole('link', { name: 'Command' }).click();\n\n await this.page.locator('input[name=\"name\"]').fill(values[2]);\n\n await this.page.locator('textarea[name=\"commandLine\"]').fill(values[3]);\n\n const saveBtn = this.page.locator('button', { hasText: /^Save$/ }).first();\n await expect(saveBtn).toBeEnabled();\n await saveBtn.click();\n await this.page.waitForTimeout(3000);\n\n const toastMessage = this.page.locator('.redux-toastr .rrt-text:visible');\n await expect(toastMessage).toHaveText('Your change was saved.', { timeout: 2000 });\n\n // Close dialog\n await this.page.locator('i.xl-icon.close-icon').first().click();\n }\n\n /*Deploy the application*/\n async deployApp(values: string[]): Promise<void> {\n const versionNode = `Applications/${values[0]}/${values[1]}`;\n await this.page.locator(`i.context-menu-button[data-id=\"${versionNode}\"]`).click();\n await this.page.getByRole('link', { name: 'Deploy', exact: true }).click();\n await this.page.locator(`input[name=\"selections\"][value=\"Environments/${values[2]}\"]`).click();\n await this.page.getByRole('button', { name: 'Continue' }).click();\n\n await this.page.locator('.errors-wrapper').waitFor({ state: 'attached', timeout: 2000 });\n\n const errorIcon = this.page.locator('a.validation-icons-wrapper.error');\n\n if (await errorIcon.isVisible()) {\n await this.page.getByRole('button', { name: 'Deployment Properties' }).click();\n await this.page.locator('input[name=\"username\"]').fill(values[3]);\n await this.page.getByRole('button', { name: 'Save' }).click();\n }\n\n await this.page.locator('button.deploy.xl-primary').click();\n\n //Get the task id\n this.taskId = (await this.page.locator('div.task-id').textContent()) || '';\n\n //Verify no failure and all are done\n const labels = this.page.locator('span.label');\n await expect(labels).toHaveCount(3);\n await expect(labels).toHaveText(['EXECUTED', 'DONE', 'DONE']);\n\n //Get the text executed\n await this.page.locator('div[data-id=\"0_1_1\"] .infinite-tree-node > a').click();\n await this.page.getByTitle('Execute Test Command').click();\n this.executedText = await this.page.locator('div.step-log-body pre').nth(1).innerText();\n\n //Verify in monitoring tab searching with the task id\n await this.page.locator('div[data-id=\"TASK_MONITOR\"] .infinite-tree-node > a').click();\n await this.page.locator('span[data-id=\"DEPLOYMENT_TASKS\"]').dblclick();\n await this.page.waitForTimeout(5000);\n\n await this.page.locator('div.deployment-task-filter-task-id input[placeholder=\"Search\"]').first().fill(this.taskId);\n const stateText = await this.page.locator('td.tasks-table-state').first().innerText();\n expect(stateText.trim()).toBe('Executed');\n\n //Click the row to go to deployment screen\n await this.page.locator('table.table.table-striped tbody tr').first().dblclick();\n\n await this.page.locator('button.finish.xl-primary').click();\n }\n}\n","import { expect } from '@playwright/test';\nimport { WithPage } from './withPage';\n\nexport class ReportsPage extends WithPage {\n /* Clicks on the Deployment Tasks section */\n async clickDeploymentTasks(): Promise<void> {\n await this.page.locator('p.MuiTypography-root', { hasText: 'Deployments' }).click();\n }\n\n async verifyTheDeploymentValues(values: string[]): Promise<void> {\n await this.page\n .locator('div.deployment-task-filter-task-id input[placeholder=\"Search\"]:visible')\n .first()\n .fill(values[0]);\n await this.page.waitForSelector('td.report-table-package .deployment-report-package', { timeout: 5000 });\n await expect(this.page.locator('td.report-table-package .deployment-report-package')).toContainText(\n new RegExp(`${values[2]}\\\\/${values[3]}`, 'i'),\n );\n await expect(this.page.locator('td.report-table-originalType .deployment-report-task-type')).toHaveText(/Initial/i); // Regex ignores case\n await expect(this.page.locator('td.report-table-user .deployment-report-user')).toHaveText('admin');\n\n //Click the row\n await this.page.locator('td.report-table-package .deployment-report-package').dblclick();\n await this.page.locator('div[data-id=\"0_1_1\"] .infinite-tree-node > a').click();\n await this.page.getByTitle('Execute Test Command').click();\n\n //Get the log text\n const text = await this.page.locator('div.step-log-body pre').nth(1).innerText();\n\n //Verify both the log text are same\n expect(text).toContain(values[1]);\n }\n}\n","import { expect } from '@playwright/test';\nimport { WithPage } from './withPage';\n\nexport class LoginPage extends WithPage {\n /* Login with username and password*/\n async login(userName: string, password: string): Promise<void> {\n await this.page.goto('/#/login');\n await expect(this.page).toHaveTitle('Digital.ai Deploy');\n await this.page.getByPlaceholder('user').fill(userName, { timeout: 1000 });\n await this.page.getByPlaceholder('Password').fill(password, { timeout: 10000 });\n await this.page.getByRole('button', { name: 'Log in' }).click({ timeout: 10000 });\n }\n\n /* Verify invalid password message */\n async verifyInvalidPasswordMessage(): Promise<void> {\n const errorMessage = this.page.getByText('The username and/or password you have entered is incorrect.');\n await expect(errorMessage).toBeVisible();\n }\n\n /* Logout as authenticated user */\n async logout(): Promise<void> {\n await this.page.locator('button.dot-avatar').click();\n await this.page.getByText('Log out', { exact: true }).click();\n await expect(this.page.getByText('Log in').first()).toBeVisible();\n }\n}\n"],"names":[],"version":3,"file":"module.js.map"}
package/dist/types.d.ts CHANGED
@@ -7,38 +7,52 @@ declare class HomePage extends WithPage {
7
7
  clickUserManagement(): Promise<void>;
8
8
  verifyDeployLogoIsPresent(): Promise<void>;
9
9
  verifyDeployTextIsPresent(): Promise<void>;
10
+ clickReports(): Promise<void>;
10
11
  }
11
12
  declare class UserPage extends WithPage {
12
- /**
13
- * Login with username and password
14
- * @param userName
15
- * @param password
16
- */
17
- createNewUser(username: string, fullName: string, email: string, password: string, confirmPassword: string): Promise<void>;
13
+ createNewUser(username: string, email: string, password: string): Promise<void>;
18
14
  verifySuccessMessage(): Promise<void>;
19
15
  verifyUserErrorMessage(): Promise<void>;
20
16
  deleteTheUserAndVerifyItIsDeleted(username: string): Promise<void>;
21
17
  editUserAndVerify(username: string, editfullname: string): Promise<void>;
22
18
  }
19
+ declare class OverthereLocalHostPage extends WithPage {
20
+ createHostForGivenType(name: string, type: string): Promise<void>;
21
+ }
22
+ declare class EnvironmentsPage extends WithPage {
23
+ createEnvironment(environmentName: string, hostName: string): Promise<void>;
24
+ }
25
+ declare class ApplicationsPage extends WithPage {
26
+ taskId: string;
27
+ executedText: string;
28
+ constructor(page: Page, navigation: Navigation);
29
+ createNewApplication(applicationName: string): Promise<void>;
30
+ createNewDeploymentPackage(applicationName: string, packageName: string): Promise<void>;
31
+ createNewCmdApplication(values: string[]): Promise<void>;
32
+ deployApp(values: string[]): Promise<void>;
33
+ }
34
+ declare class ReportsPage extends WithPage {
35
+ clickDeploymentTasks(): Promise<void>;
36
+ verifyTheDeploymentValues(values: string[]): Promise<void>;
37
+ }
23
38
  declare class Navigation {
24
39
  homePage: HomePage;
25
40
  userPage: UserPage;
41
+ overthereLocalHostPage: OverthereLocalHostPage;
42
+ environmentsPage: EnvironmentsPage;
43
+ applicationsPage: ApplicationsPage;
44
+ reportsPage: ReportsPage;
26
45
  constructor(page: Page);
27
46
  navigateToHomePage(): Promise<void>;
28
47
  navigateToUserPage(): Promise<void>;
29
48
  clickCollapseSideView(): Promise<void>;
49
+ navigateToApplicationsPage(): Promise<void>;
50
+ navigateToEnvironmentsPage(): Promise<void>;
51
+ navigateToOverthereLocalHostPage(): Promise<void>;
30
52
  }
31
53
  declare class LoginPage extends WithPage {
32
- /**
33
- * Login with username and password
34
- * @param userName
35
- * @param password
36
- */
37
54
  login(userName: string, password: string): Promise<void>;
38
55
  verifyInvalidPasswordMessage(): Promise<void>;
39
- /**
40
- * Logout as authenticated user
41
- */
42
56
  logout(): Promise<void>;
43
57
  }
44
58
  type DeployFixtures = {
@@ -1 +1 @@
1
- {"mappings":";AAEA;IACE,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;gBAElB,IAAI,EAAE,IAAI;CAGvB;ACLD,sBAAsB,SAAQ,QAAQ;IAC9B,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC;IAKpC,yBAAyB,IAAI,OAAO,CAAC,IAAI,CAAC;IAK1C,yBAAyB,IAAI,OAAO,CAAC,IAAI,CAAC;CAIjD;ACfD,sBAAsB,SAAQ,QAAQ;IACpC;;;;OAIG;IAGG,aAAa,CACjB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,eAAe,EAAE,MAAM,GACtB,OAAO,CAAC,IAAI,CAAC;IAaV,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC;IAMrC,sBAAsB,IAAI,OAAO,CAAC,IAAI,CAAC;IAMvC,iCAAiC,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAYlE,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAc/E;AChED;IAEE,QAAQ,EAAE,QAAQ,CAAC;IACnB,QAAQ,EAAE,QAAQ,CAAC;gBAEP,IAAI,EAAE,IAAI;IAMhB,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC;IAInC,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC;IAInC,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC;CAI7C;ACxBD,uBAAuB,SAAQ,QAAQ;IACrC;;;;OAIG;IACG,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQxD,4BAA4B,IAAI,OAAO,CAAC,IAAI,CAAC;IAKnD;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;CAK9B;AC1BD,sBAAsB;IACpB,QAAQ,EAAE,QAAQ,CAAC;IACnB,SAAS,EAAE,SAAS,CAAC;IACrB,UAAU,EAAE,UAAU,CAAC;CACxB,CAAC;AAEF,OAAO,MAAM,kQAgBX,CAAC;AAEH;gBAGc,IAAI,EAAE,IAAI;CAGvB","sources":["apps/deploy/pages/withPage.ts","apps/deploy/pages/homePage.ts","apps/deploy/pages/usersPage.ts","apps/deploy/pages/index.ts","apps/deploy/pages/loginPage.ts","apps/deploy/fixtures/index.ts","apps/deploy/index.ts"],"sourcesContent":["import { Page } from '@playwright/test';\n\nexport class WithPage {\n protected readonly page: Page;\n\n constructor(page: Page) {\n this.page = page;\n }\n}\n","import { expect } from '@playwright/test';\nimport { WithPage } from './withPage';\n\nexport class HomePage extends WithPage {\n async clickUserManagement(): Promise<void> {\n await this.page.locator('p.MuiTypography-root', { hasText: 'User management' }).click();\n await this.page.getByRole('link', { name: 'Users' }).click();\n }\n\n async verifyDeployLogoIsPresent(): Promise<void> {\n const logo = this.page.getByAltText('Deploy');\n await expect(logo).toBeVisible();\n }\n\n async verifyDeployTextIsPresent(): Promise<void> {\n const title = this.page.getByTitle('digital.ai');\n await expect(title).toBeVisible();\n }\n}\n","import { expect } from '@playwright/test';\nimport { WithPage } from './withPage';\n\nexport class UserPage extends WithPage {\n /**\n * Login with username and password\n * @param userName\n * @param password\n */\n // this should be refactored to take an object and not disable the rule!!\n // eslint-disable-next-line max-params\n async createNewUser(\n username: string,\n fullName: string,\n email: string,\n password: string,\n confirmPassword: string,\n ): Promise<void> {\n await this.page.locator('p.MuiTypography-root', { hasText: 'Users' }).click();\n await this.page.getByRole('button', { name: 'Add user' }).click();\n await this.page.locator('input[name=\"username\"]').fill(username);\n await this.page.locator('input[name=\"fullName\"]').fill(fullName);\n await this.page.locator('input[name=\"email\"]').fill(email);\n const passwordInput = this.page.locator('input[name=\"password\"]');\n await passwordInput.click({ force: true });\n await passwordInput.fill(password);\n await this.page.locator('input[name=\"confirmPassword\"]').fill(confirmPassword);\n await this.page.getByRole('button', { name: 'Save' }).click();\n }\n\n async verifySuccessMessage(): Promise<void> {\n const SuccessMessage = this.page.getByRole('alertdialog');\n await expect(SuccessMessage).toBeVisible();\n await expect(SuccessMessage).toHaveText(/User \".*\" created/i);\n }\n\n async verifyUserErrorMessage(): Promise<void> {\n await expect(this.page.locator('.rrt-middle-container[role=\"alertdialog\"]').nth(1)).toContainText(\n /already in use/i,\n );\n }\n\n async deleteTheUserAndVerifyItIsDeleted(username: string): Promise<void> {\n await this.page.locator('p.MuiTypography-root', { hasText: 'Users' }).click();\n await this.page.waitForTimeout(10000);\n await this.page.getByPlaceholder('Filter...').fill(username);\n await this.page.waitForTimeout(10000);\n await this.page.locator('td.users-table-actions button.delete.xl-icon.table-action').click();\n await this.page.getByRole('button', { name: 'Delete', exact: true }).click();\n const DeleteMessage = this.page.getByRole('alertdialog');\n await expect(DeleteMessage).toBeVisible();\n await expect(DeleteMessage).toHaveText(/User \".*\" deleted/i);\n }\n\n async editUserAndVerify(username: string, editfullname: string): Promise<void> {\n await this.page.locator('p.MuiTypography-root', { hasText: 'Users' }).click();\n await this.page.waitForTimeout(10000);\n await this.page.getByPlaceholder('Filter...').fill(username);\n await this.page.waitForTimeout(10000);\n await this.page.locator('i.icon-edit.dot-i').first().click();\n await this.page.locator('input[name=\"fullName\"]').fill(editfullname);\n await this.page.getByRole('button', { name: 'Save', exact: true }).click();\n const EditMessage = this.page.getByRole('alertdialog');\n await expect(EditMessage).toBeVisible();\n const editedUsername = this.page.locator('td.users-table-fullName div').textContent();\n // eslint-disable-next-line no-console\n console.log(editedUsername);\n }\n}\n","import { Page } from '@playwright/test';\nimport { HomePage } from './homePage';\nimport { UserPage } from './usersPage';\n\nexport class Navigation {\n private readonly page: Page;\n homePage: HomePage;\n userPage: UserPage;\n\n constructor(page: Page) {\n this.page = page;\n this.homePage = new HomePage(page);\n this.userPage = new UserPage(page);\n }\n\n async navigateToHomePage(): Promise<void> {\n await this.page.goto('/home');\n }\n\n async navigateToUserPage(): Promise<void> {\n await this.page.locator('p.MuiTypography-root', { hasText: 'User management' }).click();\n }\n\n async clickCollapseSideView(): Promise<void> {\n const collapseButton = this.page.getByTestId('back-button');\n await collapseButton.click();\n }\n}\n","import { expect } from '@playwright/test';\nimport { WithPage } from './withPage';\n\nexport class LoginPage extends WithPage {\n /**\n * Login with username and password\n * @param userName\n * @param password\n */\n async login(userName: string, password: string): Promise<void> {\n await this.page.goto('/#/login');\n await expect(this.page).toHaveTitle('Digital.ai Deploy');\n await this.page.getByPlaceholder('user').fill(userName, { timeout: 1000 });\n await this.page.getByPlaceholder('Password').fill(password, { timeout: 10000 });\n await this.page.getByRole('button', { name: 'Log in' }).click({ timeout: 10000 });\n }\n\n async verifyInvalidPasswordMessage(): Promise<void> {\n const errorMessage = this.page.getByText('The username and/or password you have entered is incorrect.');\n await expect(errorMessage).toBeVisible();\n }\n\n /**\n * Logout as authenticated user\n */\n async logout(): Promise<void> {\n await this.page.locator('button.dot-avatar').click();\n await this.page.getByText('Log out', { exact: true }).click();\n await expect(this.page.getByText('Log in').first()).toBeVisible();\n }\n}\n","import { test as base, Page } from '@playwright/test';\nimport { Navigation } from '../pages';\nimport { LoginPage } from '../pages/loginPage';\n\ntype DeployFixtures = {\n fixtures: Fixtures;\n loginPage: LoginPage;\n navigation: Navigation;\n};\n\nexport const test = base.extend<DeployFixtures>({\n fixtures: async ({ page }, use) => {\n const fixtures = new Fixtures(page);\n await use(fixtures);\n return fixtures;\n },\n loginPage: async ({ page }, use) => {\n const loginPage = new LoginPage(page);\n await use(loginPage);\n return loginPage;\n },\n navigation: async ({ page }, use) => {\n const navigationPage = new Navigation(page);\n await use(navigationPage);\n return navigationPage;\n },\n});\n\nclass Fixtures {\n private readonly page: Page;\n\n constructor(page: Page) {\n this.page = page;\n }\n}\n","export { test } from './fixtures';\n"],"names":[],"version":3,"file":"types.d.ts.map"}
1
+ {"mappings":"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","sources":["apps/deploy/pages/withPage.ts","apps/deploy/pages/homePage.ts","apps/deploy/pages/usersPage.ts","apps/deploy/pages/infrastructure/overthereLocalHostPage.ts","apps/deploy/pages/environmentsPage.ts","apps/deploy/pages/applications/applicationsPage.ts","apps/deploy/pages/reportsPage.ts","apps/deploy/pages/index.ts","apps/deploy/pages/loginPage.ts","apps/deploy/fixtures/index.ts","apps/deploy/index.ts"],"sourcesContent":["import { Page } from '@playwright/test';\n\nexport class WithPage {\n protected readonly page: Page;\n\n constructor(page: Page) {\n this.page = page;\n }\n}\n","import { expect } from '@playwright/test';\nimport { WithPage } from './withPage';\n\nexport class HomePage extends WithPage {\n async clickUserManagement(): Promise<void> {\n await this.page.locator('p.MuiTypography-root', { hasText: 'User management' }).click();\n await this.page.getByRole('link', { name: 'Users' }).click();\n }\n\n async verifyDeployLogoIsPresent(): Promise<void> {\n const logo = this.page.getByAltText('Deploy');\n await expect(logo).toBeVisible();\n }\n\n async verifyDeployTextIsPresent(): Promise<void> {\n const title = this.page.getByTitle('digital.ai');\n await expect(title).toBeVisible();\n }\n\n async clickReports(): Promise<void> {\n await this.page.locator('p.MuiTypography-root', { hasText: 'Reports' }).click();\n }\n}\n","import { expect } from '@playwright/test';\nimport { WithPage } from './withPage';\n\nexport class UserPage extends WithPage {\n /* Create a new user */\n async createNewUser(username: string, email: string, password: string): Promise<void> {\n await this.page.locator('p.MuiTypography-root', { hasText: 'Users' }).click();\n await this.page.getByRole('button', { name: 'Add user' }).click();\n await this.page.locator('input[name=\"username\"]').fill(username);\n await this.page.locator('input[name=\"fullName\"]').fill(username);\n await this.page.locator('input[name=\"email\"]').fill(email);\n const passwordInput = this.page.locator('input[name=\"password\"]');\n await passwordInput.click({ force: true });\n await passwordInput.fill(password);\n await this.page.locator('input[name=\"confirmPassword\"]').fill(password);\n await this.page.getByRole('button', { name: 'Save' }).click();\n }\n\n /* Verify success message */\n async verifySuccessMessage(): Promise<void> {\n const SuccessMessage = this.page.getByRole('alertdialog');\n await expect(SuccessMessage).toBeVisible();\n await expect(SuccessMessage).toHaveText(/User \".*\" created/i);\n }\n\n /* Verify user error message */\n async verifyUserErrorMessage(): Promise<void> {\n await expect(this.page.locator('.rrt-middle-container[role=\"alertdialog\"]').nth(1)).toContainText(\n /already in use/i,\n );\n }\n\n /* Delete the user and verify it is deleted */\n async deleteTheUserAndVerifyItIsDeleted(username: string): Promise<void> {\n await this.page.locator('p.MuiTypography-root', { hasText: 'Users' }).click();\n await this.page.getByPlaceholder('Filter...').fill(username);\n await this.page.locator('td.users-table-actions button.delete.xl-icon.table-action').click();\n await this.page.getByRole('button', { name: 'Delete', exact: true }).click();\n const DeleteMessage = this.page.getByRole('alertdialog');\n await expect(DeleteMessage).toBeVisible();\n await expect(DeleteMessage).toHaveText(/User \".*\" deleted/i);\n }\n\n /* Edit the user and verify the changes */\n async editUserAndVerify(username: string, editfullname: string): Promise<void> {\n await this.page.locator('p.MuiTypography-root', { hasText: 'Users' }).click();\n await this.page.getByPlaceholder('Filter...').fill(username);\n await this.page.locator('i.icon-edit.dot-i').first().click();\n await this.page.locator('input[name=\"fullName\"]').fill(editfullname);\n await this.page.getByRole('button', { name: 'Save', exact: true }).click();\n const EditMessage = this.page.getByRole('alertdialog');\n await expect(EditMessage).toBeVisible();\n await expect(EditMessage).toContainText('Your change was saved');\n }\n}\n","import { expect } from '@playwright/test';\nimport { WithPage } from '../withPage';\n\nexport class OverthereLocalHostPage extends WithPage {\n /* Helps to create a LocalHost of type UNIX/Windows/Zos */\n async createHostForGivenType(name: string, type: string): Promise<void> {\n await this.page.locator('input[name=\"name\"]').fill(name);\n await this.page.locator('label:has-text(\"Operating system\")').locator('xpath=following::input[1]').click();\n await this.page.getByText(type, { exact: true }).click();\n await this.page.getByRole('button', { name: 'Save and close' }).click();\n const toastMessage = this.page.locator('.redux-toastr .rrt-text:visible');\n await expect(toastMessage).toHaveText('Your change was saved.', { timeout: 2000 });\n }\n}\n","import { WithPage } from './withPage';\nimport { expect } from '@playwright/test';\n\nexport class EnvironmentsPage extends WithPage {\n /* Helps to create a new Environment */\n async createEnvironment(environmentName: string, hostName: string): Promise<void> {\n await this.page.locator('input[name=\"name\"]').fill(environmentName);\n await this.page.locator('i.xl-icon.arrow-down-icon.show-all').nth(0).click();\n await this.page.getByTitle(`Infrastructure/${hostName}`, { exact: true }).click();\n await this.page.getByRole('button', { name: 'Save and close' }).click();\n const toastMessage = this.page.locator('.redux-toastr .rrt-text:visible');\n await expect(toastMessage).toHaveText('Your change was saved.', { timeout: 2000 });\n }\n}\n","import { expect, Page } from '@playwright/test';\nimport { WithPage } from '../withPage';\nimport { Navigation } from '../index';\n\nexport class ApplicationsPage extends WithPage {\n taskId!: string;\n executedText!: string;\n private navigation: Navigation;\n\n constructor(page: Page, navigation: Navigation) {\n super(page);\n this.navigation = navigation;\n }\n\n /* Creates a new application */\n async createNewApplication(applicationName: string): Promise<void> {\n await this.navigation.navigateToApplicationsPage();\n await this.page.locator('input[name=\"name\"]').waitFor({ state: 'visible' });\n await this.page.locator('input[name=\"name\"]').click();\n await this.page.locator('input[name=\"name\"]').fill(applicationName);\n await this.page.getByRole('button', { name: 'Save and close' }).click();\n const toastMessage = this.page.locator('.redux-toastr .rrt-text:visible');\n await expect(toastMessage).toHaveText('Your change was saved.', { timeout: 2000 });\n }\n\n /* Creates a new deployment package */\n async createNewDeploymentPackage(applicationName: string, packageName: string): Promise<void> {\n const appDataId = `Applications/${applicationName}`;\n\n // Expand Applications\n const root = this.page.locator('div[data-id=\"Applications\"] .infinite-tree-node > a');\n await root.click();\n\n // Hover over app node\n const appNode = this.page.locator(`span[data-id=\"${appDataId}\"]`);\n await expect(appNode).toBeVisible();\n await appNode.hover();\n\n // Open context menu + create new deployment package\n const contextMenu = this.page.locator(`i.context-menu-button[data-id=\"${appDataId}\"]`);\n await expect(contextMenu).toBeVisible();\n await contextMenu.click();\n\n await this.page.getByRole('link', { name: 'New' }).click();\n await this.page.getByRole('link', { name: 'Deployment Package' }).click();\n\n // Fill & save\n const nameInput = this.page.locator('input[name=\"name\"]');\n await nameInput.fill(packageName);\n\n await this.page.getByRole('button', { name: 'Save and close' }).click();\n\n const toastMessage = this.page.locator('.redux-toastr .rrt-text:visible');\n await expect(toastMessage).toHaveText('Your change was saved.', { timeout: 2000 });\n }\n\n /* Creates a new command application */\n async createNewCmdApplication(values: string[]): Promise<void> {\n const appDataId = `Applications/${values[0]}`;\n const packageDataId = `Applications/${values[0]}/${values[1]}`;\n\n // Expand app node and click package\n await this.page.locator(`div[data-id=\"${appDataId}\"] .infinite-tree-node > a`).click();\n const packageNode = this.page.locator(`span[data-id=\"${packageDataId}\"]`).first();\n await expect(packageNode).toBeVisible();\n await packageNode.click();\n\n // Open context menu\n const packageMenu = this.page.locator(`i.context-menu-button[data-id=\"${packageDataId}\"]`);\n await expect(packageMenu).toBeVisible();\n await packageMenu.click();\n\n // Create Command application\n await this.page.getByRole('link', { name: 'New' }).click();\n await this.page.getByRole('link', { name: 'cmd' }).click();\n await this.page.getByRole('link', { name: 'Command' }).click();\n\n await this.page.locator('input[name=\"name\"]').fill(values[2]);\n\n await this.page.locator('textarea[name=\"commandLine\"]').fill(values[3]);\n\n const saveBtn = this.page.locator('button', { hasText: /^Save$/ }).first();\n await expect(saveBtn).toBeEnabled();\n await saveBtn.click();\n await this.page.waitForTimeout(3000);\n\n const toastMessage = this.page.locator('.redux-toastr .rrt-text:visible');\n await expect(toastMessage).toHaveText('Your change was saved.', { timeout: 2000 });\n\n // Close dialog\n await this.page.locator('i.xl-icon.close-icon').first().click();\n }\n\n /*Deploy the application*/\n async deployApp(values: string[]): Promise<void> {\n const versionNode = `Applications/${values[0]}/${values[1]}`;\n await this.page.locator(`i.context-menu-button[data-id=\"${versionNode}\"]`).click();\n await this.page.getByRole('link', { name: 'Deploy', exact: true }).click();\n await this.page.locator(`input[name=\"selections\"][value=\"Environments/${values[2]}\"]`).click();\n await this.page.getByRole('button', { name: 'Continue' }).click();\n\n await this.page.locator('.errors-wrapper').waitFor({ state: 'attached', timeout: 2000 });\n\n const errorIcon = this.page.locator('a.validation-icons-wrapper.error');\n\n if (await errorIcon.isVisible()) {\n await this.page.getByRole('button', { name: 'Deployment Properties' }).click();\n await this.page.locator('input[name=\"username\"]').fill(values[3]);\n await this.page.getByRole('button', { name: 'Save' }).click();\n }\n\n await this.page.locator('button.deploy.xl-primary').click();\n\n //Get the task id\n this.taskId = (await this.page.locator('div.task-id').textContent()) || '';\n\n //Verify no failure and all are done\n const labels = this.page.locator('span.label');\n await expect(labels).toHaveCount(3);\n await expect(labels).toHaveText(['EXECUTED', 'DONE', 'DONE']);\n\n //Get the text executed\n await this.page.locator('div[data-id=\"0_1_1\"] .infinite-tree-node > a').click();\n await this.page.getByTitle('Execute Test Command').click();\n this.executedText = await this.page.locator('div.step-log-body pre').nth(1).innerText();\n\n //Verify in monitoring tab searching with the task id\n await this.page.locator('div[data-id=\"TASK_MONITOR\"] .infinite-tree-node > a').click();\n await this.page.locator('span[data-id=\"DEPLOYMENT_TASKS\"]').dblclick();\n await this.page.waitForTimeout(5000);\n\n await this.page.locator('div.deployment-task-filter-task-id input[placeholder=\"Search\"]').first().fill(this.taskId);\n const stateText = await this.page.locator('td.tasks-table-state').first().innerText();\n expect(stateText.trim()).toBe('Executed');\n\n //Click the row to go to deployment screen\n await this.page.locator('table.table.table-striped tbody tr').first().dblclick();\n\n await this.page.locator('button.finish.xl-primary').click();\n }\n}\n","import { expect } from '@playwright/test';\nimport { WithPage } from './withPage';\n\nexport class ReportsPage extends WithPage {\n /* Clicks on the Deployment Tasks section */\n async clickDeploymentTasks(): Promise<void> {\n await this.page.locator('p.MuiTypography-root', { hasText: 'Deployments' }).click();\n }\n\n async verifyTheDeploymentValues(values: string[]): Promise<void> {\n await this.page\n .locator('div.deployment-task-filter-task-id input[placeholder=\"Search\"]:visible')\n .first()\n .fill(values[0]);\n await this.page.waitForSelector('td.report-table-package .deployment-report-package', { timeout: 5000 });\n await expect(this.page.locator('td.report-table-package .deployment-report-package')).toContainText(\n new RegExp(`${values[2]}\\\\/${values[3]}`, 'i'),\n );\n await expect(this.page.locator('td.report-table-originalType .deployment-report-task-type')).toHaveText(/Initial/i); // Regex ignores case\n await expect(this.page.locator('td.report-table-user .deployment-report-user')).toHaveText('admin');\n\n //Click the row\n await this.page.locator('td.report-table-package .deployment-report-package').dblclick();\n await this.page.locator('div[data-id=\"0_1_1\"] .infinite-tree-node > a').click();\n await this.page.getByTitle('Execute Test Command').click();\n\n //Get the log text\n const text = await this.page.locator('div.step-log-body pre').nth(1).innerText();\n\n //Verify both the log text are same\n expect(text).toContain(values[1]);\n }\n}\n","import { Page } from '@playwright/test';\nimport { HomePage } from './homePage';\nimport { UserPage } from './usersPage';\nimport { OverthereLocalHostPage } from './infrastructure/overthereLocalHostPage';\nimport { EnvironmentsPage } from './environmentsPage';\nimport { ApplicationsPage } from './applications/applicationsPage';\nimport { ReportsPage } from './reportsPage';\n\nexport class Navigation {\n private readonly page: Page;\n homePage: HomePage;\n userPage: UserPage;\n overthereLocalHostPage: OverthereLocalHostPage;\n environmentsPage: EnvironmentsPage;\n applicationsPage: ApplicationsPage;\n reportsPage: ReportsPage;\n\n constructor(page: Page) {\n this.page = page;\n this.homePage = new HomePage(page);\n this.userPage = new UserPage(page);\n this.overthereLocalHostPage = new OverthereLocalHostPage(page);\n this.environmentsPage = new EnvironmentsPage(page);\n this.applicationsPage = new ApplicationsPage(page, this);\n this.reportsPage = new ReportsPage(page);\n }\n\n async navigateToHomePage(): Promise<void> {\n await this.page.goto('/home');\n }\n\n async navigateToUserPage(): Promise<void> {\n await this.page.locator('p.MuiTypography-root', { hasText: 'User management' }).click();\n }\n\n async clickCollapseSideView(): Promise<void> {\n const collapseButton = this.page.getByTestId('back-button');\n await collapseButton.click();\n }\n\n /* Helps to navigate to the Applications page */\n async navigateToApplicationsPage(): Promise<void> {\n const configNode = this.page.locator('span[data-id=\"Applications\"]');\n await configNode.hover();\n await this.page.locator('i.context-menu-button[data-id=\"Applications\"]').click();\n await this.page.getByRole('link', { name: 'New' }).click();\n await this.page.getByRole('link', { name: 'Application' }).click();\n }\n\n /* Helps to navigate to the Environments page */\n async navigateToEnvironmentsPage(): Promise<void> {\n const configNode = this.page.locator('span[data-id=\"Environments\"]');\n await configNode.hover();\n await this.page.locator('i.context-menu-button[data-id=\"Environments\"]').click();\n await this.page.getByRole('link', { name: 'New' }).click();\n await this.page.getByRole('link', { name: 'Environment' }).click();\n }\n\n /* Helps to navigate to the Overthere LocalHost page */\n async navigateToOverthereLocalHostPage(): Promise<void> {\n const configNode = this.page.locator('span[data-id=\"Infrastructure\"]');\n await configNode.hover();\n await this.page.locator('i.context-menu-button[data-id=\"Infrastructure\"]').click();\n // await this.page.waitForTimeout(5000);\n await this.page.getByRole('link', { name: 'New' }).click();\n await this.page.getByRole('link', { name: 'overthere' }).click();\n await this.page.getByRole('link', { name: 'LocalHost' }).click();\n }\n}\n","import { expect } from '@playwright/test';\nimport { WithPage } from './withPage';\n\nexport class LoginPage extends WithPage {\n /* Login with username and password*/\n async login(userName: string, password: string): Promise<void> {\n await this.page.goto('/#/login');\n await expect(this.page).toHaveTitle('Digital.ai Deploy');\n await this.page.getByPlaceholder('user').fill(userName, { timeout: 1000 });\n await this.page.getByPlaceholder('Password').fill(password, { timeout: 10000 });\n await this.page.getByRole('button', { name: 'Log in' }).click({ timeout: 10000 });\n }\n\n /* Verify invalid password message */\n async verifyInvalidPasswordMessage(): Promise<void> {\n const errorMessage = this.page.getByText('The username and/or password you have entered is incorrect.');\n await expect(errorMessage).toBeVisible();\n }\n\n /* Logout as authenticated user */\n async logout(): Promise<void> {\n await this.page.locator('button.dot-avatar').click();\n await this.page.getByText('Log out', { exact: true }).click();\n await expect(this.page.getByText('Log in').first()).toBeVisible();\n }\n}\n","import { test as base, Page } from '@playwright/test';\nimport { Navigation } from '../pages';\nimport { LoginPage } from '../pages/loginPage';\n\ntype DeployFixtures = {\n fixtures: Fixtures;\n loginPage: LoginPage;\n navigation: Navigation;\n};\n\nexport const test = base.extend<DeployFixtures>({\n fixtures: async ({ page }, use) => {\n const fixtures = new Fixtures(page);\n await use(fixtures);\n return fixtures;\n },\n loginPage: async ({ page }, use) => {\n const loginPage = new LoginPage(page);\n await use(loginPage);\n return loginPage;\n },\n navigation: async ({ page }, use) => {\n const navigationPage = new Navigation(page);\n await use(navigationPage);\n return navigationPage;\n },\n});\n\nclass Fixtures {\n private readonly page: Page;\n\n constructor(page: Page) {\n this.page = page;\n }\n}\n","export { test } from './fixtures';\n"],"names":[],"version":3,"file":"types.d.ts.map"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@digital-ai/devops-page-object-deploy",
3
- "version": "0.0.7",
3
+ "version": "0.0.8",
4
4
  "source": "index.ts",
5
5
  "main": "dist/main.js",
6
6
  "module": "dist/module.js",