@camunda/e2e-test-suite 0.0.202 → 0.0.203

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.
Files changed (120) hide show
  1. package/README.md +1 -0
  2. package/dist/fixtures/8.10.d.ts +75 -0
  3. package/dist/fixtures/8.10.js +187 -0
  4. package/dist/pages/8.10/AppsPage.d.ts +38 -0
  5. package/dist/pages/8.10/AppsPage.js +398 -0
  6. package/dist/pages/8.10/Authorization.d.ts +31 -0
  7. package/dist/pages/8.10/Authorization.js +143 -0
  8. package/dist/pages/8.10/ClientCredentialsDetailsPage.d.ts +12 -0
  9. package/dist/pages/8.10/ClientCredentialsDetailsPage.js +36 -0
  10. package/dist/pages/8.10/ClusterDetailsPage.d.ts +81 -0
  11. package/dist/pages/8.10/ClusterDetailsPage.js +475 -0
  12. package/dist/pages/8.10/ClusterPage.d.ts +63 -0
  13. package/dist/pages/8.10/ClusterPage.js +349 -0
  14. package/dist/pages/8.10/ClusterSecretsPage.d.ts +46 -0
  15. package/dist/pages/8.10/ClusterSecretsPage.js +219 -0
  16. package/dist/pages/8.10/ConnectorMarketplacePage.d.ts +19 -0
  17. package/dist/pages/8.10/ConnectorMarketplacePage.js +56 -0
  18. package/dist/pages/8.10/ConnectorSettingsPage.d.ts +38 -0
  19. package/dist/pages/8.10/ConnectorSettingsPage.js +142 -0
  20. package/dist/pages/8.10/ConnectorTemplatePage.d.ts +11 -0
  21. package/dist/pages/8.10/ConnectorTemplatePage.js +34 -0
  22. package/dist/pages/8.10/ConsoleOrganizationPage.d.ts +76 -0
  23. package/dist/pages/8.10/ConsoleOrganizationPage.js +402 -0
  24. package/dist/pages/8.10/FormJsPage.d.ts +28 -0
  25. package/dist/pages/8.10/FormJsPage.js +85 -0
  26. package/dist/pages/8.10/HomePage.d.ts +27 -0
  27. package/dist/pages/8.10/HomePage.js +88 -0
  28. package/dist/pages/8.10/IdpCreatePage.d.ts +81 -0
  29. package/dist/pages/8.10/IdpCreatePage.js +355 -0
  30. package/dist/pages/8.10/LoginPage.d.ts +42 -0
  31. package/dist/pages/8.10/LoginPage.js +93 -0
  32. package/dist/pages/8.10/ModelerCreatePage.d.ts +224 -0
  33. package/dist/pages/8.10/ModelerCreatePage.js +1166 -0
  34. package/dist/pages/8.10/ModelerHomePage.d.ts +54 -0
  35. package/dist/pages/8.10/ModelerHomePage.js +235 -0
  36. package/dist/pages/8.10/ModelerUserInvitePage.d.ts +29 -0
  37. package/dist/pages/8.10/ModelerUserInvitePage.js +136 -0
  38. package/dist/pages/8.10/OCIdentityAuthorizationsPage.d.ts +11 -0
  39. package/dist/pages/8.10/OCIdentityAuthorizationsPage.js +32 -0
  40. package/dist/pages/8.10/OCIdentityGroupsPage.d.ts +38 -0
  41. package/dist/pages/8.10/OCIdentityGroupsPage.js +166 -0
  42. package/dist/pages/8.10/OCIdentityHomePage.d.ts +18 -0
  43. package/dist/pages/8.10/OCIdentityHomePage.js +57 -0
  44. package/dist/pages/8.10/OCIdentityMappingRulesPage.d.ts +23 -0
  45. package/dist/pages/8.10/OCIdentityMappingRulesPage.js +124 -0
  46. package/dist/pages/8.10/OCIdentityRolesPage.d.ts +40 -0
  47. package/dist/pages/8.10/OCIdentityRolesPage.js +182 -0
  48. package/dist/pages/8.10/OperateHomePage.d.ts +23 -0
  49. package/dist/pages/8.10/OperateHomePage.js +73 -0
  50. package/dist/pages/8.10/OperateProcessInstancePage.d.ts +23 -0
  51. package/dist/pages/8.10/OperateProcessInstancePage.js +94 -0
  52. package/dist/pages/8.10/OperateProcessesPage.d.ts +25 -0
  53. package/dist/pages/8.10/OperateProcessesPage.js +103 -0
  54. package/dist/pages/8.10/OptimizeCollectionsPage.d.ts +17 -0
  55. package/dist/pages/8.10/OptimizeCollectionsPage.js +68 -0
  56. package/dist/pages/8.10/OptimizeDashboardPage.d.ts +11 -0
  57. package/dist/pages/8.10/OptimizeDashboardPage.js +65 -0
  58. package/dist/pages/8.10/OptimizeHomePage.d.ts +13 -0
  59. package/dist/pages/8.10/OptimizeHomePage.js +55 -0
  60. package/dist/pages/8.10/OptimizeReportPage.d.ts +48 -0
  61. package/dist/pages/8.10/OptimizeReportPage.js +159 -0
  62. package/dist/pages/8.10/PlayPage.d.ts +14 -0
  63. package/dist/pages/8.10/PlayPage.js +68 -0
  64. package/dist/pages/8.10/SettingsPage.d.ts +10 -0
  65. package/dist/pages/8.10/SettingsPage.js +43 -0
  66. package/dist/pages/8.10/SignUpPage.d.ts +42 -0
  67. package/dist/pages/8.10/SignUpPage.js +134 -0
  68. package/dist/pages/8.10/TaskDetailsPage.d.ts +75 -0
  69. package/dist/pages/8.10/TaskDetailsPage.js +269 -0
  70. package/dist/pages/8.10/TaskPanelPage.d.ts +21 -0
  71. package/dist/pages/8.10/TaskPanelPage.js +93 -0
  72. package/dist/pages/8.10/TaskProcessesPage.d.ts +13 -0
  73. package/dist/pages/8.10/TaskProcessesPage.js +68 -0
  74. package/dist/pages/8.10/UtilitiesPage.d.ts +47 -0
  75. package/dist/pages/8.10/UtilitiesPage.js +489 -0
  76. package/dist/tests/8.10/access-user-role-management.spec.d.ts +1 -0
  77. package/dist/tests/8.10/access-user-role-management.spec.js +323 -0
  78. package/dist/tests/8.10/agentic-ai-user-flows.spec.d.ts +1 -0
  79. package/dist/tests/8.10/agentic-ai-user-flows.spec.js +185 -0
  80. package/dist/tests/8.10/api-tests-v2.spec.d.ts +1 -0
  81. package/dist/tests/8.10/api-tests-v2.spec.js +20 -0
  82. package/dist/tests/8.10/aws-cluster-user-flows.spec.d.ts +1 -0
  83. package/dist/tests/8.10/aws-cluster-user-flows.spec.js +178 -0
  84. package/dist/tests/8.10/cluster-variables.spec.d.ts +1 -0
  85. package/dist/tests/8.10/cluster-variables.spec.js +70 -0
  86. package/dist/tests/8.10/connectors-user-flows.spec.d.ts +1 -0
  87. package/dist/tests/8.10/connectors-user-flows.spec.js +479 -0
  88. package/dist/tests/8.10/console-user-flows.spec.d.ts +1 -0
  89. package/dist/tests/8.10/console-user-flows.spec.js +187 -0
  90. package/dist/tests/8.10/hto-user-flows.spec.d.ts +1 -0
  91. package/dist/tests/8.10/hto-user-flows.spec.js +471 -0
  92. package/dist/tests/8.10/idp-user-flows.spec.d.ts +1 -0
  93. package/dist/tests/8.10/idp-user-flows.spec.js +214 -0
  94. package/dist/tests/8.10/login-negative-tests.spec.d.ts +1 -0
  95. package/dist/tests/8.10/login-negative-tests.spec.js +29 -0
  96. package/dist/tests/8.10/login.spec.d.ts +1 -0
  97. package/dist/tests/8.10/login.spec.js +26 -0
  98. package/dist/tests/8.10/navigation.spec.d.ts +1 -0
  99. package/dist/tests/8.10/navigation.spec.js +65 -0
  100. package/dist/tests/8.10/operate-access-flow.spec.d.ts +1 -0
  101. package/dist/tests/8.10/operate-access-flow.spec.js +51 -0
  102. package/dist/tests/8.10/optimize-api-tests.spec.d.ts +1 -0
  103. package/dist/tests/8.10/optimize-api-tests.spec.js +268 -0
  104. package/dist/tests/8.10/optimize-user-flows.spec.d.ts +1 -0
  105. package/dist/tests/8.10/optimize-user-flows.spec.js +255 -0
  106. package/dist/tests/8.10/play.spec.d.ts +1 -0
  107. package/dist/tests/8.10/play.spec.js +85 -0
  108. package/dist/tests/8.10/rba-enabled-v1-user-flows.spec.d.ts +1 -0
  109. package/dist/tests/8.10/rba-enabled-v1-user-flows.spec.js +443 -0
  110. package/dist/tests/8.10/rba-enabled-v2-user-flows.spec.d.ts +1 -0
  111. package/dist/tests/8.10/rba-enabled-v2-user-flows.spec.js +446 -0
  112. package/dist/tests/8.10/smoke-tests.spec.d.ts +1 -0
  113. package/dist/tests/8.10/smoke-tests.spec.js +181 -0
  114. package/dist/tests/8.10/test-setup.spec.d.ts +1 -0
  115. package/dist/tests/8.10/test-setup.spec.js +94 -0
  116. package/dist/tests/8.10/utr-enabled-user-flows.spec.d.ts +1 -0
  117. package/dist/tests/8.10/utr-enabled-user-flows.spec.js +182 -0
  118. package/dist/tests/8.10/web-modeler-user-flows.spec.d.ts +1 -0
  119. package/dist/tests/8.10/web-modeler-user-flows.spec.js +544 -0
  120. package/package.json +1 -1
@@ -0,0 +1,73 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.OperateHomePage = void 0;
4
+ const test_1 = require("@playwright/test");
5
+ const clickLocatorWithRetry_1 = require("../../utils/assertionHelpers/clickLocatorWithRetry");
6
+ const expectLocatorWithRetry_1 = require("../../utils/assertionHelpers/expectLocatorWithRetry");
7
+ class OperateHomePage {
8
+ page;
9
+ operateHeader;
10
+ processesTab;
11
+ informationDialog;
12
+ editVariableButton;
13
+ variableValueInput;
14
+ saveVariableButton;
15
+ editVariableSpinner;
16
+ operateBanner;
17
+ noPermissionsMessage;
18
+ processPageHeading;
19
+ constructor(page) {
20
+ this.page = page;
21
+ this.operateHeader = page.getByRole('link', { name: 'Camunda Operate' });
22
+ this.processesTab = page.getByRole('link', {
23
+ name: 'Processes',
24
+ exact: true,
25
+ });
26
+ this.informationDialog = page.getByRole('button', {
27
+ name: 'Close this dialog',
28
+ });
29
+ this.editVariableButton = page.getByTestId('edit-variable-button');
30
+ this.variableValueInput = page.getByTestId('edit-variable-value');
31
+ this.saveVariableButton = page.getByLabel('Save variable');
32
+ this.editVariableSpinner = page
33
+ .getByTestId('variable-operation-spinner')
34
+ .locator('circle')
35
+ .nth(1);
36
+ this.operateBanner = page.getByRole('link', { name: 'Camunda logo Operate' });
37
+ this.noPermissionsMessage = page
38
+ .getByText('You don’t have access to this component')
39
+ .first();
40
+ this.processPageHeading = page
41
+ .getByTestId('expanded-panel')
42
+ .getByText('Process', { exact: true });
43
+ }
44
+ async clickProcessesTab() {
45
+ await (0, clickLocatorWithRetry_1.clickLocatorWithRetry)(this.page, this.processesTab);
46
+ await (0, expectLocatorWithRetry_1.expectLocatorWithRetry)(this.page, this.processPageHeading, {
47
+ preAction: async () => {
48
+ await (0, test_1.expect)(this.processesTab).toBeVisible({ timeout: 10000 });
49
+ await this.processesTab.click({ timeout: 10000 });
50
+ },
51
+ });
52
+ }
53
+ async closeInformationDialog() {
54
+ await this.informationDialog.click();
55
+ }
56
+ async clickEditVariableButton(variableName) {
57
+ const editVariableButton = 'Edit variable ' + variableName;
58
+ await this.page.getByLabel(editVariableButton).click();
59
+ }
60
+ async clickVariableValueInput() {
61
+ await this.variableValueInput.click();
62
+ }
63
+ async clearVariableValueInput() {
64
+ await this.variableValueInput.clear();
65
+ }
66
+ async fillVariableValueInput(value) {
67
+ await this.variableValueInput.fill(value);
68
+ }
69
+ async clickSaveVariableButton() {
70
+ await this.saveVariableButton.click();
71
+ }
72
+ }
73
+ exports.OperateHomePage = OperateHomePage;
@@ -0,0 +1,23 @@
1
+ import { Page, Locator } from '@playwright/test';
2
+ declare class OperateProcessInstancePage {
3
+ private page;
4
+ readonly diagram: Locator;
5
+ readonly completedIcon: Locator;
6
+ readonly diagramSpinner: Locator;
7
+ readonly activeIcon: Locator;
8
+ readonly incidentIcon: Locator;
9
+ readonly userTaskOpenTasklistLink: Locator;
10
+ readonly taskDetailsPopOver: Locator;
11
+ readonly connectorResultVariableName: (name: string) => Locator;
12
+ readonly variablesList: Locator;
13
+ readonly messageVariable: Locator;
14
+ constructor(page: Page);
15
+ connectorResultVariableValue(variableName: string): Promise<Locator>;
16
+ reload(): Promise<void>;
17
+ assertProcessCompleteStatusWithRetry(timeout?: number, maxRetries?: number): Promise<void>;
18
+ assertProcessVariableContainsText(variableName: string, text: string): Promise<void>;
19
+ clickDiagramTask(taskName: string): Promise<void>;
20
+ assertActiveTokenIsPresent(): Promise<void>;
21
+ assertDetailsPopoverIsVisible(): Promise<void>;
22
+ }
23
+ export { OperateProcessInstancePage };
@@ -0,0 +1,94 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.OperateProcessInstancePage = void 0;
4
+ const test_1 = require("@playwright/test");
5
+ const sleep_1 = require("../../utils/sleep");
6
+ class OperateProcessInstancePage {
7
+ page;
8
+ diagram;
9
+ completedIcon;
10
+ diagramSpinner;
11
+ activeIcon;
12
+ incidentIcon;
13
+ userTaskOpenTasklistLink;
14
+ taskDetailsPopOver;
15
+ connectorResultVariableName;
16
+ variablesList;
17
+ messageVariable;
18
+ constructor(page) {
19
+ this.page = page;
20
+ this.diagram = page.getByTestId('diagram');
21
+ this.completedIcon = page
22
+ .getByTestId('instance-header')
23
+ .getByTestId('COMPLETED-icon');
24
+ this.diagramSpinner = page.getByTestId('diagram-spinner');
25
+ this.activeIcon = page
26
+ .getByTestId('instance-header')
27
+ .getByTestId('ACTIVE-icon');
28
+ this.incidentIcon = page
29
+ .getByTestId('instance-header')
30
+ .getByTestId('INCIDENT-icon');
31
+ this.userTaskOpenTasklistLink = page.getByRole('link', {
32
+ name: 'Open Tasklist',
33
+ });
34
+ this.taskDetailsPopOver = page.getByTestId('popover');
35
+ this.connectorResultVariableName = (name) => page.getByTestId('variable-' + name);
36
+ this.variablesList = page.getByTestId('variables-list');
37
+ this.messageVariable = page.getByTestId('variable-message');
38
+ }
39
+ async connectorResultVariableValue(variableName) {
40
+ return await this.page.getByTestId(variableName).locator('td').last();
41
+ }
42
+ async reload() {
43
+ await this.page.reload();
44
+ }
45
+ async assertProcessCompleteStatusWithRetry(timeout = 60000, maxRetries = 10) {
46
+ for (let attempt = 0; attempt < maxRetries; attempt++) {
47
+ try {
48
+ await (0, test_1.expect)(this.completedIcon).toBeVisible({
49
+ timeout: timeout,
50
+ });
51
+ return;
52
+ }
53
+ catch (error) {
54
+ if (attempt < maxRetries - 1) {
55
+ console.warn(`Process complete status attempt ${attempt + 1} failed. Retrying...`);
56
+ await this.page.reload();
57
+ await (0, sleep_1.sleep)(5000);
58
+ }
59
+ else {
60
+ throw new Error(`Assertion failed after ${maxRetries} attempts`);
61
+ }
62
+ }
63
+ }
64
+ }
65
+ async assertProcessVariableContainsText(variableName, text) {
66
+ const maxRetries = 3;
67
+ for (let retries = 0; retries < maxRetries; retries++) {
68
+ try {
69
+ await (0, test_1.expect)(this.page.getByTestId(`variable-${variableName}`)).toContainText(text, { timeout: 30000 });
70
+ return;
71
+ }
72
+ catch (error) {
73
+ console.log(`Failed to assert variable ${variableName}` + error);
74
+ await this.page.reload();
75
+ await (0, sleep_1.sleep)(10000);
76
+ }
77
+ }
78
+ throw new Error(`Failed to assert variable ${variableName} after ${maxRetries} attempts.`);
79
+ }
80
+ async clickDiagramTask(taskName) {
81
+ const diagramTask = this.diagram.getByText(taskName);
82
+ await (0, test_1.expect)(diagramTask).toBeVisible();
83
+ await diagramTask.click();
84
+ }
85
+ async assertActiveTokenIsPresent() {
86
+ await (0, test_1.expect)(this.activeIcon).toBeVisible({ timeout: 60000 });
87
+ }
88
+ async assertDetailsPopoverIsVisible() {
89
+ await (0, test_1.expect)(this.taskDetailsPopOver).toBeVisible({
90
+ timeout: 60000,
91
+ });
92
+ }
93
+ }
94
+ exports.OperateProcessInstancePage = OperateProcessInstancePage;
@@ -0,0 +1,25 @@
1
+ import { Page, Locator } from '@playwright/test';
2
+ declare class OperateProcessesPage {
3
+ private page;
4
+ readonly processResultCount: Locator;
5
+ readonly processActiveCheckbox: Locator;
6
+ readonly processCompletedCheckbox: Locator;
7
+ readonly processRunningInstancesCheckbox: Locator;
8
+ readonly processIncidentsCheckbox: Locator;
9
+ readonly processPageHeading: Locator;
10
+ readonly noMatchingInstancesMessage: Locator;
11
+ readonly processFinishedInstancesCheckbox: Locator;
12
+ readonly processInstanceLink: (name: string) => Locator;
13
+ readonly moreFiltersButton: Locator;
14
+ readonly processInstanceKeyTextBox: Locator;
15
+ constructor(page: Page);
16
+ private getMoreFilterValueLocator;
17
+ clickProcessActiveCheckbox(): Promise<void>;
18
+ clickProcessCompletedCheckbox(): Promise<void>;
19
+ clickProcessIncidentsCheckbox(): Promise<void>;
20
+ clickRunningProcessInstancesCheckbox(): Promise<void>;
21
+ clickFinishedProcessInstancesCheckbox(): Promise<void>;
22
+ clickProcessInstanceLink(processName: string): Promise<void>;
23
+ applyMoreFilters(filter: string, value: string): Promise<void>;
24
+ }
25
+ export { OperateProcessesPage };
@@ -0,0 +1,103 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.OperateProcessesPage = void 0;
4
+ const test_1 = require("@playwright/test");
5
+ const sleep_1 = require("../../utils/sleep");
6
+ class OperateProcessesPage {
7
+ page;
8
+ processResultCount;
9
+ processActiveCheckbox;
10
+ processCompletedCheckbox;
11
+ processRunningInstancesCheckbox;
12
+ processIncidentsCheckbox;
13
+ processPageHeading;
14
+ noMatchingInstancesMessage;
15
+ processFinishedInstancesCheckbox;
16
+ processInstanceLink;
17
+ moreFiltersButton;
18
+ processInstanceKeyTextBox;
19
+ constructor(page) {
20
+ this.page = page;
21
+ this.processResultCount = page.getByTestId('result-count');
22
+ this.processInstanceLink = (name) => this.page
23
+ .getByRole('row')
24
+ .filter({ hasText: name })
25
+ .first()
26
+ .getByRole('link', { name: /^View instance \d+/ });
27
+ this.processActiveCheckbox = page
28
+ .locator('label')
29
+ .filter({ hasText: 'Active' });
30
+ this.processCompletedCheckbox = page
31
+ .locator('label')
32
+ .filter({ hasText: 'Completed' });
33
+ this.processRunningInstancesCheckbox = page
34
+ .locator('label')
35
+ .filter({ hasText: 'Running Instances' });
36
+ this.processIncidentsCheckbox = page
37
+ .locator('label')
38
+ .filter({ hasText: 'Incidents' });
39
+ this.processPageHeading = page
40
+ .getByTestId('expanded-panel')
41
+ .getByText('Process', { exact: true });
42
+ this.noMatchingInstancesMessage = page.getByText('There are no Instances matching this filter set');
43
+ this.processFinishedInstancesCheckbox = page
44
+ .getByTestId('filter-finished-instances')
45
+ .getByRole('checkbox');
46
+ this.moreFiltersButton = page.getByRole('button', { name: 'More filters' });
47
+ this.processInstanceKeyTextBox = page.locator('#ids');
48
+ }
49
+ getMoreFilterValueLocator(filter) {
50
+ switch (filter.trim()) {
51
+ case 'Process Instance Key(s)':
52
+ return this.processInstanceKeyTextBox;
53
+ default:
54
+ throw new Error(`Unsupported filter: "${filter}". Add a mapping in getMoreFilterValueLocator().`);
55
+ }
56
+ }
57
+ async clickProcessActiveCheckbox() {
58
+ await this.processActiveCheckbox.click();
59
+ }
60
+ async clickProcessCompletedCheckbox() {
61
+ await this.processCompletedCheckbox.click({ timeout: 60000 });
62
+ await (0, sleep_1.sleep)(1000);
63
+ }
64
+ async clickProcessIncidentsCheckbox() {
65
+ await this.processIncidentsCheckbox.click();
66
+ }
67
+ async clickRunningProcessInstancesCheckbox() {
68
+ await this.processRunningInstancesCheckbox.click();
69
+ }
70
+ async clickFinishedProcessInstancesCheckbox() {
71
+ await this.processFinishedInstancesCheckbox.click();
72
+ }
73
+ async clickProcessInstanceLink(processName) {
74
+ const maxRetries = 3;
75
+ for (let retries = 0; retries < maxRetries; retries++) {
76
+ try {
77
+ await (0, test_1.expect)(this.processInstanceLink(processName)).toBeVisible({
78
+ timeout: 60000,
79
+ });
80
+ await this.processInstanceLink(processName).click({ timeout: 60000 });
81
+ await (0, test_1.expect)(this.page.getByText('Instance History').first()).toBeVisible({
82
+ timeout: 10000,
83
+ });
84
+ return;
85
+ }
86
+ catch (error) {
87
+ console.error(`Click attempt ${retries + 1} failed: ${error}`);
88
+ await this.page.reload();
89
+ await (0, sleep_1.sleep)(10000);
90
+ }
91
+ }
92
+ throw new Error(`Failed to click the link after ${maxRetries} attempts.`);
93
+ }
94
+ async applyMoreFilters(filter, value) {
95
+ await this.moreFiltersButton.click();
96
+ await this.page.getByRole('menuitem', { name: filter }).click();
97
+ const valueInput = this.getMoreFilterValueLocator(filter);
98
+ await (0, test_1.expect)(valueInput).toBeVisible({ timeout: 10000 });
99
+ await valueInput.fill(value);
100
+ await (0, sleep_1.sleep)(2000);
101
+ }
102
+ }
103
+ exports.OperateProcessesPage = OperateProcessesPage;
@@ -0,0 +1,17 @@
1
+ import { Page, Locator } from '@playwright/test';
2
+ declare class OptimizeCollectionsPage {
3
+ private page;
4
+ readonly collectionsPageHeader: Locator;
5
+ readonly createNewButton: Locator;
6
+ readonly reportOption: Locator;
7
+ readonly modalCloseButton: Locator;
8
+ readonly processReport: Locator;
9
+ readonly collectionsLink: Locator;
10
+ constructor(page: Page);
11
+ clickCollectionsLink(): Promise<void>;
12
+ clickCreateNewButton(): Promise<void>;
13
+ clickCreateNewButtonWithRetry(): Promise<void>;
14
+ clickReportOption(): Promise<void>;
15
+ clickMostRecentProcessReport(reportName: string): Promise<void>;
16
+ }
17
+ export { OptimizeCollectionsPage };
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.OptimizeCollectionsPage = void 0;
4
+ const test_1 = require("@playwright/test");
5
+ const sleep_1 = require("../../utils/sleep");
6
+ class OptimizeCollectionsPage {
7
+ page;
8
+ collectionsPageHeader;
9
+ createNewButton;
10
+ reportOption;
11
+ modalCloseButton;
12
+ processReport;
13
+ collectionsLink;
14
+ constructor(page) {
15
+ this.page = page;
16
+ this.collectionsPageHeader = page.getByRole('heading', {
17
+ name: 'Collections, Dashboards, and Reports',
18
+ });
19
+ this.createNewButton = page.getByRole('button', {
20
+ name: 'Create new',
21
+ exact: true,
22
+ });
23
+ this.reportOption = page.getByText('Report', { exact: true });
24
+ this.modalCloseButton = page.locator('button').filter({ hasText: /^Close$/ });
25
+ this.processReport = page.getByText('Process Report').first();
26
+ this.collectionsLink = page
27
+ .getByRole('banner')
28
+ .getByRole('link', { name: 'Collections' });
29
+ }
30
+ async clickCollectionsLink() {
31
+ await (0, test_1.expect)(this.collectionsLink).toBeVisible({ timeout: 60000 });
32
+ await this.collectionsLink.click({ timeout: 60000 });
33
+ }
34
+ async clickCreateNewButton() {
35
+ await (0, test_1.expect)(this.createNewButton).toBeVisible({ timeout: 60000 });
36
+ await this.createNewButton.click({ timeout: 60000 });
37
+ }
38
+ async clickCreateNewButtonWithRetry() {
39
+ const maxRetries = 5;
40
+ for (let attempt = 0; attempt < maxRetries; attempt++) {
41
+ try {
42
+ if (await this.modalCloseButton.isVisible({ timeout: 15000 })) {
43
+ await this.modalCloseButton.click({ timeout: 60000 });
44
+ }
45
+ await this.clickCollectionsLink();
46
+ await this.clickCreateNewButton();
47
+ return;
48
+ }
49
+ catch (error) {
50
+ if (attempt < maxRetries - 1) {
51
+ console.warn(`Attempt ${attempt + 1} failed. Retrying...`);
52
+ await this.page.reload();
53
+ await (0, sleep_1.sleep)(60000);
54
+ }
55
+ else {
56
+ throw new Error(`Assertion failed after ${maxRetries} attempts: ` + error);
57
+ }
58
+ }
59
+ }
60
+ }
61
+ async clickReportOption() {
62
+ await this.reportOption.click();
63
+ }
64
+ async clickMostRecentProcessReport(reportName) {
65
+ await this.page.getByText(reportName).click({ timeout: 60000 });
66
+ }
67
+ }
68
+ exports.OptimizeCollectionsPage = OptimizeCollectionsPage;
@@ -0,0 +1,11 @@
1
+ import { Page, Locator } from '@playwright/test';
2
+ declare class OptimizeDashboardPage {
3
+ private page;
4
+ readonly filterTable: Locator;
5
+ constructor(page: Page);
6
+ clickFilterTable(): Promise<void>;
7
+ fillFilterTable(processName: string): Promise<void>;
8
+ processLinkAssertion(processName: string, maxRetries: number, retryDelay?: number): Promise<void>;
9
+ processOwnerNameAssertion(processName: string, userEmail: string): Promise<void>;
10
+ }
11
+ export { OptimizeDashboardPage };
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.OptimizeDashboardPage = void 0;
4
+ const test_1 = require("@playwright/test");
5
+ class OptimizeDashboardPage {
6
+ page;
7
+ filterTable;
8
+ constructor(page) {
9
+ this.page = page;
10
+ this.filterTable = page.getByPlaceholder('Filter table');
11
+ }
12
+ async clickFilterTable() {
13
+ await this.filterTable.click({ timeout: 120000 });
14
+ }
15
+ async fillFilterTable(processName) {
16
+ await this.filterTable.fill(processName, { timeout: 60000 });
17
+ await this.filterTable.press('Enter');
18
+ }
19
+ async processLinkAssertion(processName, maxRetries, retryDelay = 60000) {
20
+ for (let attempt = 0; attempt < maxRetries; attempt++) {
21
+ try {
22
+ await this.page.reload();
23
+ await this.clickFilterTable();
24
+ await this.fillFilterTable(processName);
25
+ await (0, test_1.expect)(this.page.getByRole('link', { name: processName })).toBeVisible({ timeout: 70000 });
26
+ return;
27
+ }
28
+ catch (error) {
29
+ if (attempt < maxRetries - 1) {
30
+ console.warn(`Attempt ${attempt + 1} failed for asserting process link in Optimize. Retrying...`);
31
+ await new Promise((resolve) => setTimeout(resolve, retryDelay));
32
+ }
33
+ else {
34
+ throw new Error(`Process link in Optimize assertion failed after ${maxRetries} attempts`);
35
+ }
36
+ }
37
+ }
38
+ }
39
+ async processOwnerNameAssertion(processName, userEmail) {
40
+ const maxRetries = 15;
41
+ const retryDelay = 60000;
42
+ const localPart = userEmail.split('@')[0];
43
+ const uuid = localPart.replace('qa-user-', '');
44
+ const result = !uuid ? 'QA Camunda' : `QA User ${uuid}`;
45
+ for (let attempt = 0; attempt < maxRetries; attempt++) {
46
+ try {
47
+ await (0, test_1.expect)(this.page.getByRole('row', {
48
+ name: `${processName}\nProcess\n\t${result}`,
49
+ })).toBeVisible({ timeout: 90000 });
50
+ return;
51
+ }
52
+ catch (error) {
53
+ if (attempt < maxRetries - 1) {
54
+ console.warn(`Attempt ${attempt + 1} failed for asserting owner name ${result} assertion for ${processName} in Optimize.. Retrying...`);
55
+ await this.page.reload();
56
+ await new Promise((resolve) => setTimeout(resolve, retryDelay));
57
+ }
58
+ else {
59
+ throw new Error(`Owner name ${result} assertion for ${processName} failed after ${maxRetries} attempts`);
60
+ }
61
+ }
62
+ }
63
+ }
64
+ }
65
+ exports.OptimizeDashboardPage = OptimizeDashboardPage;
@@ -0,0 +1,13 @@
1
+ import { Page, Locator } from '@playwright/test';
2
+ declare class OptimizeHomePage {
3
+ private page;
4
+ readonly collectionsLink: Locator;
5
+ readonly dashboardLink: Locator;
6
+ readonly modalCloseButton: Locator;
7
+ readonly optimizeBanner: Locator;
8
+ readonly noPermissionsMessage: Locator;
9
+ constructor(page: Page);
10
+ clickCollectionsLink(): Promise<void>;
11
+ clickDashboardLink(): Promise<void>;
12
+ }
13
+ export { OptimizeHomePage };
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.OptimizeHomePage = void 0;
4
+ const test_1 = require("@playwright/test");
5
+ const sleep_1 = require("../../utils/sleep");
6
+ class OptimizeHomePage {
7
+ page;
8
+ collectionsLink;
9
+ dashboardLink;
10
+ modalCloseButton;
11
+ optimizeBanner;
12
+ noPermissionsMessage;
13
+ constructor(page) {
14
+ this.page = page;
15
+ this.collectionsLink = page
16
+ .getByRole('banner')
17
+ .getByRole('link', { name: 'Collections' });
18
+ this.dashboardLink = page.getByRole('link', { name: 'Dashboards' });
19
+ this.modalCloseButton = page.locator('button').filter({ hasText: /^Close$/ });
20
+ this.optimizeBanner = page.getByRole('link', {
21
+ name: 'Camunda logo Optimize',
22
+ });
23
+ this.noPermissionsMessage = page.getByText('default backend - 404');
24
+ }
25
+ async clickCollectionsLink() {
26
+ if (await this.modalCloseButton.isVisible({ timeout: 60000 })) {
27
+ await this.modalCloseButton.click();
28
+ }
29
+ await this.collectionsLink.click({ timeout: 60000 });
30
+ }
31
+ async clickDashboardLink() {
32
+ const maxRetries = 5;
33
+ for (let attempt = 0; attempt < maxRetries; attempt++) {
34
+ try {
35
+ if (await this.modalCloseButton.isVisible({ timeout: 15000 })) {
36
+ await this.modalCloseButton.click({ timeout: 60000 });
37
+ }
38
+ await (0, test_1.expect)(this.dashboardLink).toBeVisible({ timeout: 60000 });
39
+ await this.dashboardLink.click({ timeout: 60000 });
40
+ return;
41
+ }
42
+ catch (error) {
43
+ if (attempt < maxRetries - 1) {
44
+ console.warn(`Attempt ${attempt + 1} failed. Retrying...`);
45
+ await this.page.reload();
46
+ await (0, sleep_1.sleep)(60000);
47
+ }
48
+ else {
49
+ throw new Error(`Assertion failed after ${maxRetries} attempts: ` + error);
50
+ }
51
+ }
52
+ }
53
+ }
54
+ }
55
+ exports.OptimizeHomePage = OptimizeHomePage;
@@ -0,0 +1,48 @@
1
+ import { Page, Locator } from '@playwright/test';
2
+ declare class OptimizeReportPage {
3
+ private page;
4
+ readonly processSelectionButton: Locator;
5
+ readonly userTaskProcess: Locator;
6
+ readonly versionSelection: Locator;
7
+ readonly alwaysDisplayLatestSelection: Locator;
8
+ readonly createReportLink: Locator;
9
+ readonly durationButton: Locator;
10
+ readonly countOption: Locator;
11
+ readonly processInstanceButton: Locator;
12
+ readonly userTaskOption: Locator;
13
+ readonly heatMapButton: Locator;
14
+ readonly numberButton: Locator;
15
+ readonly tableOption: Locator;
16
+ readonly reportName: Locator;
17
+ readonly saveButton: Locator;
18
+ readonly oneUserTaskInstance: Locator;
19
+ readonly twoUserTaskInstance: Locator;
20
+ readonly cancelButton: Locator;
21
+ readonly createNewButton: Locator;
22
+ readonly reportOption: Locator;
23
+ readonly processInstanceCount: Locator;
24
+ readonly blankReportButton: Locator;
25
+ readonly selectDropdown: Locator;
26
+ constructor(page: Page);
27
+ clickProcessSelectionButton(): Promise<void>;
28
+ clickUserTaskProcess(processName: string): Promise<void>;
29
+ clickVersionSelection(): Promise<void>;
30
+ clickAlwaysDisplayLatestSelection(): Promise<void>;
31
+ clickCreateReportLink(): Promise<void>;
32
+ clickDurationButton(): Promise<void>;
33
+ clickCountOption(): Promise<void>;
34
+ clickProcessInstanceButton(): Promise<void>;
35
+ clickUserTaskOption(): Promise<void>;
36
+ clickHeatMapButton(): Promise<void>;
37
+ clickNumberButton(): Promise<void>;
38
+ clickTableOption(): Promise<void>;
39
+ clickReportName(): Promise<void>;
40
+ clearReportName(): Promise<void>;
41
+ fillReportName(name: string): Promise<void>;
42
+ clickSaveButton(): Promise<void>;
43
+ waitUntilLocatorIsVisible(locator: Locator, tab: Page): Promise<void>;
44
+ waitUntilProcessIsVisible(locator: Locator, tab: Page): Promise<void>;
45
+ clickBlankReportButton(): Promise<void>;
46
+ clickSelectDropdown(): Promise<void>;
47
+ }
48
+ export { OptimizeReportPage };