@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,489 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.waitForLoadingToFinish = exports.assertTestUsesCorrectOrganizationFromModeler = exports.expectCountToBeOneOf = exports.createAPIClient = exports.modelAndRunConnectorsTimerEventDiagram = exports.modelAndRunConnectorsDocHandlingDiagram = exports.deleteCluster = exports.deleteAllUserGroups = exports.assertTestUsesCorrectOrganization = exports.assertLatestAlertEmail = exports.clickInvitationLinkInEmail = exports.enableAuthorizations = exports.disableRBA = exports.runMultipleProcesses = exports.runProcess = exports.completeTaskWithRetry = exports.assertPageTextWithRetry = exports.assertLocatorVisibleWithRetry = exports.modelRestConnector = exports.modelDiagramFromFile = exports.loginWithRetry = void 0;
4
+ const test_1 = require("@playwright/test");
5
+ const ModelerHomePage_1 = require("./ModelerHomePage");
6
+ const HomePage_1 = require("./HomePage");
7
+ const sleep_1 = require("../../utils/sleep");
8
+ const randomSleep_1 = require("../../utils/randomSleep");
9
+ const fileUpload_1 = require("../../utils/fileUpload");
10
+ const mailSlurpClient_1 = require("../../utils/mailSlurpClient");
11
+ async function loginWithRetry(page, loginPage, testUser, timeout, maxRetries = 3) {
12
+ for (let attempt = 0; attempt < maxRetries; attempt++) {
13
+ try {
14
+ await page.goto('/');
15
+ await (0, sleep_1.sleep)(timeout);
16
+ await loginPage.login(testUser);
17
+ return;
18
+ }
19
+ catch (error) {
20
+ if (attempt < maxRetries - 1) {
21
+ console.warn(`Attempt ${attempt + 1} failed for logging in. Retrying...`);
22
+ await (0, randomSleep_1.randomSleep)(10000, 20000);
23
+ }
24
+ else {
25
+ console.error(error);
26
+ throw new Error(`Login failed after ${maxRetries} attempts`);
27
+ }
28
+ }
29
+ }
30
+ }
31
+ exports.loginWithRetry = loginWithRetry;
32
+ async function modelDiagramFromFile(page, modelerHomePage, modelerCreatePage, processName, fileName = '', nrOfRenamedUserTasks = 0, taskName = '') {
33
+ await modelerHomePage.clickDiagramTypeDropdown();
34
+ await modelerHomePage.clickUploadFilesButton();
35
+ await (0, fileUpload_1.uploadFile)(page, fileName + '.bpmn');
36
+ await modelerHomePage.clickProcessDiagram(fileName);
37
+ await modelerCreatePage.clickDiagramBreadcrumb();
38
+ await modelerCreatePage.clickEditDiagramNameButton();
39
+ await modelerCreatePage.enterDiagramName(processName);
40
+ await (0, sleep_1.sleep)(1000);
41
+ await modelerCreatePage.clickGeneralPropertiesPanel();
42
+ await modelerCreatePage.clickNameInput();
43
+ await modelerCreatePage.fillNamedInput(processName);
44
+ await modelerCreatePage.clickIdInput();
45
+ await modelerCreatePage.fillIdInput(processName);
46
+ if (nrOfRenamedUserTasks > 0) {
47
+ for (let i = 1; i <= nrOfRenamedUserTasks; i++) {
48
+ await modelerCreatePage.clickUserTask('process' + i);
49
+ await modelerCreatePage.clickNameInput();
50
+ await modelerCreatePage.fillNamedInput(taskName + i);
51
+ await modelerCreatePage.clickIdInput();
52
+ await modelerCreatePage.fillIdInput(taskName + i);
53
+ await modelerCreatePage.clickCanvas();
54
+ }
55
+ }
56
+ await (0, sleep_1.sleep)(10000);
57
+ }
58
+ exports.modelDiagramFromFile = modelDiagramFromFile;
59
+ async function modelRestConnector(modelerCreatePage, connectorSettingsPage, processName, url, auth, resultExpression, resultVariable = '', basicAuthCredentials = {
60
+ username: '',
61
+ password: '',
62
+ }) {
63
+ await (0, test_1.expect)(modelerCreatePage.generalPanel).toBeVisible({
64
+ timeout: 15000,
65
+ });
66
+ await modelerCreatePage.enterDiagramName(processName);
67
+ await (0, sleep_1.sleep)(10000);
68
+ await modelerCreatePage.clickAppendElementButton();
69
+ await modelerCreatePage.clickAppendTaskButton();
70
+ await modelerCreatePage.clickChangeTypeButton();
71
+ await modelerCreatePage.clickRestConnectorOption();
72
+ await connectorSettingsPage.clickAuthenticationTab();
73
+ await connectorSettingsPage.clickHTTPEndpointTab();
74
+ if (auth == 'bearer') {
75
+ await connectorSettingsPage.selectAuthenticationType('bearer');
76
+ await (0, test_1.expect)(connectorSettingsPage.bearerTokenInput).toBeVisible({
77
+ timeout: 10000,
78
+ });
79
+ await connectorSettingsPage.clickBearerTokenInput();
80
+ await connectorSettingsPage.fillBearerTokenInput('thisisabearertoken');
81
+ await (0, test_1.expect)(connectorSettingsPage.methodTypeDropdown).toBeVisible({
82
+ timeout: 10000,
83
+ });
84
+ await connectorSettingsPage.selectMethodType('POST');
85
+ }
86
+ else if (auth == 'basic') {
87
+ await connectorSettingsPage.selectAuthenticationType('basic');
88
+ await (0, test_1.expect)(connectorSettingsPage.usernameInput).toBeVisible({
89
+ timeout: 60000,
90
+ });
91
+ await connectorSettingsPage.clickUsernameInput();
92
+ (0, test_1.expect)(basicAuthCredentials['username'].length).toBeGreaterThan(0);
93
+ (0, test_1.expect)(basicAuthCredentials['password'].length).toBeGreaterThan(0);
94
+ await connectorSettingsPage.fillUsernameInput(basicAuthCredentials['username']);
95
+ await connectorSettingsPage.clickPasswordInput();
96
+ await connectorSettingsPage.fillPasswordInput(basicAuthCredentials['password']);
97
+ await connectorSettingsPage.selectMethodType('POST');
98
+ }
99
+ await connectorSettingsPage.clickUrlInput();
100
+ await connectorSettingsPage.fillUrlInput(url);
101
+ await connectorSettingsPage.clickOutputMappingTab();
102
+ if (resultVariable.length > 0) {
103
+ await connectorSettingsPage.clickResultVariableInput();
104
+ await connectorSettingsPage.fillResultVariableInput('result');
105
+ }
106
+ await connectorSettingsPage.clickResultExpressionInput();
107
+ await connectorSettingsPage.fillResultExpressionInput(resultExpression);
108
+ await modelerCreatePage.clickAppendElementButton();
109
+ await modelerCreatePage.clickAppendEndEventButton();
110
+ await (0, sleep_1.sleep)(10000);
111
+ }
112
+ exports.modelRestConnector = modelRestConnector;
113
+ async function assertLocatorVisibleWithRetry(page, locator, text, timeout = 60000, notVisible, maxRetries = 6, clickLocator) {
114
+ for (let attempt = 0; attempt < maxRetries; attempt++) {
115
+ try {
116
+ if (clickLocator) {
117
+ await (0, test_1.expect)(clickLocator).toBeVisible({
118
+ timeout: 30000,
119
+ });
120
+ await clickLocator.click();
121
+ }
122
+ if (notVisible == true) {
123
+ await (0, sleep_1.sleep)(10000);
124
+ await (0, test_1.expect)(locator.first()).not.toBeVisible({
125
+ timeout: timeout,
126
+ });
127
+ }
128
+ else {
129
+ await (0, test_1.expect)(locator).toBeVisible({
130
+ timeout: timeout,
131
+ });
132
+ }
133
+ return;
134
+ }
135
+ catch (error) {
136
+ if (attempt < maxRetries - 1) {
137
+ console.warn(`Attempt ${attempt + 1} failed for asserting ${text}. Retrying...`);
138
+ await page.reload();
139
+ await (0, sleep_1.sleep)(10000);
140
+ }
141
+ else {
142
+ throw new Error(`Assertion of ${text} failed after ${maxRetries} attempts`);
143
+ }
144
+ }
145
+ }
146
+ }
147
+ exports.assertLocatorVisibleWithRetry = assertLocatorVisibleWithRetry;
148
+ async function assertPageTextWithRetry(page, text, notVisible = false, timeout = 60000, maxRetries = 10) {
149
+ for (let attempt = 0; attempt < maxRetries; attempt++) {
150
+ try {
151
+ if (notVisible) {
152
+ await (0, sleep_1.sleep)(10000);
153
+ await (0, test_1.expect)(page.getByText(text, { exact: true }).first()).not.toBeVisible({
154
+ timeout: timeout,
155
+ });
156
+ }
157
+ else {
158
+ await (0, test_1.expect)(page.getByText(text, { exact: true }).first()).toBeVisible({
159
+ timeout: timeout,
160
+ });
161
+ }
162
+ return;
163
+ }
164
+ catch (error) {
165
+ if (attempt < maxRetries - 1) {
166
+ console.warn(`Attempt ${attempt + 1} failed for asserting ${text}. Retrying...`);
167
+ await page.reload();
168
+ await (0, sleep_1.sleep)(5000);
169
+ }
170
+ else {
171
+ throw new Error(`Assertion of ${text} failed after ${maxRetries} attempts`);
172
+ }
173
+ }
174
+ }
175
+ }
176
+ exports.assertPageTextWithRetry = assertPageTextWithRetry;
177
+ async function completeTaskWithRetry(taskPanelPage, taskDetailsPage, taskName, taskPriority, maxRetries = 3) {
178
+ for (let attempt = 0; attempt < maxRetries; attempt++) {
179
+ try {
180
+ await taskPanelPage.openTask(taskName);
181
+ await (0, test_1.expect)(taskDetailsPage.detailsInfo.getByText(taskName, { exact: true })).toBeVisible();
182
+ if (!(await taskDetailsPage.assignedToMeText.isVisible())) {
183
+ await taskDetailsPage.clickAssignToMeButton();
184
+ }
185
+ await (0, test_1.expect)(taskDetailsPage.detailsPanel.getByText(taskPriority)).toBeVisible();
186
+ await taskDetailsPage.clickCompleteTaskButton();
187
+ await (0, test_1.expect)(taskPanelPage.availableTasks.getByText(taskName, { exact: true }).first()).not.toBeVisible({ timeout: 30000 });
188
+ return;
189
+ }
190
+ catch (error) {
191
+ if (attempt < maxRetries - 1) {
192
+ console.warn(`Attempt ${attempt + 1} failed for completing task ${taskName}. Retrying...`);
193
+ await (0, sleep_1.sleep)(2000);
194
+ }
195
+ else {
196
+ throw new Error(`Failed to complete task ${taskName} after ${maxRetries} attempts: ${error}`);
197
+ }
198
+ }
199
+ }
200
+ }
201
+ exports.completeTaskWithRetry = completeTaskWithRetry;
202
+ async function runProcess(clusterName, page, modelerHomePage, modelerCreatePage, processName, processId = '', uploadFromFile = '') {
203
+ if (uploadFromFile.length > 0) {
204
+ await modelDiagramFromFile(page, modelerHomePage, modelerCreatePage, processName, uploadFromFile);
205
+ }
206
+ else {
207
+ await modelerHomePage.clickDiagramTypeDropdown();
208
+ await modelerHomePage.clickBpmnTemplateOption();
209
+ await modelerCreatePage.modelCamundaUserTaskDiagram(processName, processId);
210
+ }
211
+ await modelerCreatePage.runProcessInstance(clusterName);
212
+ await (0, test_1.expect)(modelerCreatePage.viewProcessInstanceLink).toBeVisible({
213
+ timeout: 60000,
214
+ });
215
+ await (0, test_1.expect)(modelerCreatePage.viewProcessInstanceLink).toBeHidden({
216
+ timeout: 60000,
217
+ });
218
+ }
219
+ exports.runProcess = runProcess;
220
+ async function runMultipleProcesses(clusterName, page, modelerHomePage, modelerCreatePage, options) {
221
+ const { processName = 'Camunda_User_Task', numberOfProcesses = 2, uploadFromFile = '', } = options || {};
222
+ for (let i = 1; i <= numberOfProcesses; i++) {
223
+ await runProcess(clusterName, page, modelerHomePage, modelerCreatePage, processName + i, processName + i, uploadFromFile);
224
+ await modelerHomePage.clickProjectBreadcrumb();
225
+ }
226
+ }
227
+ exports.runMultipleProcesses = runMultipleProcesses;
228
+ async function disableRBA(clusterName, homePage, clusterPage, clusterDetailsPage, appsPage) {
229
+ await appsPage.clickCamundaApps();
230
+ await appsPage.clickConsoleLink();
231
+ await (0, test_1.expect)(homePage.clusterTab).toBeVisible({ timeout: 120000 });
232
+ await homePage.clickClusters();
233
+ await clusterPage.clickClusterLink(clusterName);
234
+ await (0, test_1.expect)(clusterDetailsPage.settingsTab).toBeVisible({
235
+ timeout: 90000,
236
+ });
237
+ await clusterDetailsPage.clickSettingsTab();
238
+ await clusterDetailsPage.disableAuthorizations();
239
+ await homePage.clickClusters();
240
+ await clusterPage.assertClusterHealthyStatusWithRetry(clusterName);
241
+ await clusterPage.clickClusterLink(clusterName);
242
+ await (0, test_1.expect)(clusterDetailsPage.rbaEnabledMessage.first()).not.toBeVisible({
243
+ timeout: 30000,
244
+ });
245
+ await clusterDetailsPage.assertComponentsHealth();
246
+ }
247
+ exports.disableRBA = disableRBA;
248
+ async function enableAuthorizations(clusterName, homePage, clusterPage, clusterDetailsPage, appsPage) {
249
+ await appsPage.clickCamundaApps();
250
+ await appsPage.clickConsoleLink();
251
+ await (0, test_1.expect)(homePage.clusterTab).toBeVisible({ timeout: 120000 });
252
+ await homePage.clickClusters();
253
+ await clusterPage.clickClusterLink(clusterName);
254
+ await (0, test_1.expect)(clusterDetailsPage.settingsTab).toBeVisible({
255
+ timeout: 90000,
256
+ });
257
+ await clusterDetailsPage.clickSettingsTab();
258
+ await clusterDetailsPage.enableAuthorizations();
259
+ await homePage.clickClusters();
260
+ await clusterPage.assertClusterHealthyStatusWithRetry(clusterName);
261
+ await clusterPage.clickClusterLink(clusterName);
262
+ await (0, test_1.expect)(clusterDetailsPage.rbaEnabledMessage.first()).toBeVisible({
263
+ timeout: 30000,
264
+ });
265
+ await clusterDetailsPage.assertComponentsHealth();
266
+ }
267
+ exports.enableAuthorizations = enableAuthorizations;
268
+ async function clickInvitationLinkInEmail(page, id) {
269
+ const email = await mailSlurpClient_1.mailSlurp.waitForLatestEmail(id, 120000);
270
+ if (email && email.body) {
271
+ const confirmationLinkMatch = email.body.match(/href="([^"]*)/);
272
+ if (confirmationLinkMatch) {
273
+ await page.goto(confirmationLinkMatch[1]);
274
+ }
275
+ else {
276
+ throw new Error('Confirmation link not found in email body.');
277
+ }
278
+ }
279
+ else {
280
+ throw new Error('Email or email body is null or undefined.');
281
+ }
282
+ }
283
+ exports.clickInvitationLinkInEmail = clickInvitationLinkInEmail;
284
+ async function assertLatestAlertEmail(id, mailSlurp, processName, alertText) {
285
+ const maxRetries = 3;
286
+ for (let retries = 0; retries < maxRetries; retries++) {
287
+ try {
288
+ const email = await mailSlurp.waitForLatestEmail(id, 120000);
289
+ if (email && email.body) {
290
+ (0, test_1.expect)(email.body).toContain(processName);
291
+ (0, test_1.expect)(email.body).toContain(alertText);
292
+ return email.body;
293
+ }
294
+ else {
295
+ throw new Error('Email or email body is null or undefined.');
296
+ }
297
+ }
298
+ catch (error) {
299
+ console.warn(`Click attempt ${retries + 1} failed: ${error}`);
300
+ }
301
+ }
302
+ throw new Error(`Failed to get latest alert (${processName}) email for ${id} after ${maxRetries} attempts.`);
303
+ }
304
+ exports.assertLatestAlertEmail = assertLatestAlertEmail;
305
+ async function assertTestUsesCorrectOrganization(page) {
306
+ const homePage = new HomePage_1.HomePage(page);
307
+ if (page.url().includes('?code=') || page.url().includes('&state=')) {
308
+ console.log('OAuth callback detected, waiting for redirect...');
309
+ await page.waitForURL((url) => !url.toString().includes('?code='), {
310
+ timeout: 30000,
311
+ });
312
+ await (0, sleep_1.sleep)(5000);
313
+ }
314
+ if (page.url().includes('modeler')) {
315
+ const modelerHomePage = new ModelerHomePage_1.ModelerHomePage(page);
316
+ await modelerHomePage.clickMessageBanner();
317
+ await (0, test_1.expect)(homePage.modelerBanner).toBeVisible({ timeout: 30000 });
318
+ }
319
+ else {
320
+ await (0, test_1.expect)(homePage.consoleBanner).toBeVisible({ timeout: 60000 });
321
+ }
322
+ await (0, test_1.expect)(homePage.openOrganizationButton).toBeVisible({ timeout: 180000 });
323
+ try {
324
+ await (0, test_1.expect)(page.url()).toContain(process.env.ORG_ID);
325
+ }
326
+ catch (error) {
327
+ // If the first check fails, check by org name
328
+ try {
329
+ await homePage.clickOpenOrganizationButton();
330
+ await page
331
+ .getByRole('treeitem', { name: process.env.ORG_NAME, exact: true })
332
+ .click({ timeout: 30000 });
333
+ }
334
+ catch (reloadError) {
335
+ await page
336
+ .getByRole('button', { name: process.env.ORG_NAME })
337
+ .click({ timeout: 30000 });
338
+ }
339
+ await (0, test_1.expect)(page
340
+ .locator('[class="cds--header__global"]')
341
+ .getByTitle(process.env.ORG_NAME, { exact: true })
342
+ .first()).toBeVisible({
343
+ timeout: 30000,
344
+ });
345
+ await (0, test_1.expect)(page.url()).toContain(process.env.ORG_ID);
346
+ await (0, sleep_1.sleep)(5000);
347
+ }
348
+ }
349
+ exports.assertTestUsesCorrectOrganization = assertTestUsesCorrectOrganization;
350
+ async function deleteAllUserGroups(homePage, organizationPage, appsPage) {
351
+ await appsPage.clickCamundaApps();
352
+ await appsPage.clickConsoleLink();
353
+ await (0, test_1.expect)(homePage.organizationTab).toBeVisible({ timeout: 120000 });
354
+ await homePage.clickOrganization();
355
+ await organizationPage.clickGroupsTab();
356
+ await organizationPage.deleteAllGroups();
357
+ }
358
+ exports.deleteAllUserGroups = deleteAllUserGroups;
359
+ async function deleteCluster(clusterName, homePage, clusterPage, appsPage) {
360
+ await appsPage.clickCamundaApps();
361
+ await appsPage.clickConsoleLink();
362
+ await homePage.clickClusters();
363
+ await clusterPage.deleteCluster(clusterName);
364
+ }
365
+ exports.deleteCluster = deleteCluster;
366
+ async function modelAndRunConnectorsDocHandlingDiagram(modelerCreatePage, modelerHomePage, processName, page, connectorMarketplacePage, clusterName, zeebeUrl, zeebeClientId, zeebeClientSecret) {
367
+ await modelerHomePage.clickCrossComponentProjectFolder();
368
+ await modelerHomePage.clickDiagramTypeDropdown();
369
+ await modelerHomePage.clickUploadFilesButton();
370
+ await (0, fileUpload_1.uploadFile)(page, 'Connectors Document Handling.bpmn');
371
+ await modelerHomePage.clickProcessDiagram('Connectors Document Handling');
372
+ await modelerCreatePage.clickDiagramBreadcrumb();
373
+ await modelerCreatePage.clickEditDiagramNameButton();
374
+ await modelerCreatePage.enterDiagramName(processName);
375
+ await modelerCreatePage.clickGeneralPropertiesPanel();
376
+ await modelerCreatePage.clickNameInput();
377
+ await modelerCreatePage.fillNamedInput(processName);
378
+ await modelerCreatePage.clickIdInput();
379
+ await modelerCreatePage.fillIdInput(processName);
380
+ await (0, sleep_1.sleep)(10000);
381
+ await modelerCreatePage.clickSecondPlacedElement();
382
+ await modelerCreatePage.clickChangeTypeButton();
383
+ await (0, test_1.expect)(modelerCreatePage.marketPlaceButton).toBeVisible({
384
+ timeout: 120000,
385
+ });
386
+ await modelerCreatePage.clickMarketPlaceButton();
387
+ await connectorMarketplacePage.clickSearchForConnectorTextbox();
388
+ await connectorMarketplacePage.fillSearchForConnectorTextbox('REST Connector');
389
+ await connectorMarketplacePage.downloadConnectorToProject();
390
+ await (0, sleep_1.sleep)(5000);
391
+ await page.reload();
392
+ await (0, sleep_1.sleep)(5000);
393
+ await modelerCreatePage.fillStartEventVariablesForDocHandling(zeebeUrl, zeebeClientId, zeebeClientSecret);
394
+ await modelerCreatePage.runProcessInstance(clusterName);
395
+ }
396
+ exports.modelAndRunConnectorsDocHandlingDiagram = modelAndRunConnectorsDocHandlingDiagram;
397
+ async function modelAndRunConnectorsTimerEventDiagram(modelerCreatePage, modelerHomePage, processName, page, connectorMarketplacePage, clusterName, connectorTemplatePage) {
398
+ await modelerHomePage.clickCrossComponentProjectFolder();
399
+ await modelerHomePage.clickDiagramTypeDropdown();
400
+ await modelerHomePage.clickUploadFilesButton();
401
+ await (0, fileUpload_1.uploadFile)(page, 'Rest Connector Timer Event.bpmn');
402
+ await modelerHomePage.clickProcessDiagram('Rest Connector Timer Event');
403
+ await modelerCreatePage.clickDiagramBreadcrumb();
404
+ await modelerCreatePage.clickEditDiagramNameButton();
405
+ await modelerCreatePage.enterDiagramName(processName);
406
+ await modelerCreatePage.clickEighthPlacedElement();
407
+ await modelerCreatePage.clickChangeTypeButton();
408
+ await (0, test_1.expect)(modelerCreatePage.marketPlaceButton).toBeVisible({
409
+ timeout: 120000,
410
+ });
411
+ await modelerCreatePage.clickMarketPlaceButton();
412
+ await connectorMarketplacePage.clickSearchForConnectorTextbox();
413
+ await connectorMarketplacePage.fillSearchForConnectorTextbox('REST Connector');
414
+ await (0, sleep_1.sleep)(10000);
415
+ await (0, test_1.expect)(page.getByText('REST ConnectorBy CamundaConnect, interact, and synchronize processes')).toBeVisible({
416
+ timeout: 60000,
417
+ });
418
+ await connectorMarketplacePage.downloadConnectorToProject();
419
+ await modelerHomePage.clickProjectBreadcrumb();
420
+ await modelerHomePage.clickProcessDiagram('REST Outbound Connector');
421
+ await connectorTemplatePage.publishConnector();
422
+ await modelerHomePage.clickProjectBreadcrumb();
423
+ await modelerHomePage.clickProcessDiagram(processName);
424
+ await (0, sleep_1.sleep)(5000);
425
+ await page.reload();
426
+ await (0, sleep_1.sleep)(5000);
427
+ await modelerCreatePage.runProcessInstance(clusterName);
428
+ }
429
+ exports.modelAndRunConnectorsTimerEventDiagram = modelAndRunConnectorsTimerEventDiagram;
430
+ async function createAPIClient(apiClientName, homePage, clusterDetailsPage, clusterName, clusterPage) {
431
+ await homePage.closeInformationDialog();
432
+ await homePage.clickClusters();
433
+ await clusterPage.clickClusterLink(clusterName);
434
+ await clusterDetailsPage.clickAPITab();
435
+ await clusterDetailsPage.createAPIClientAndReturnVariables(apiClientName);
436
+ await clusterDetailsPage.clickCloseModalButton();
437
+ }
438
+ exports.createAPIClient = createAPIClient;
439
+ async function expectCountToBeOneOf(locator, count1, count2) {
440
+ try {
441
+ await Promise.race([
442
+ (0, test_1.expect)(locator).toHaveCount(count1),
443
+ (0, test_1.expect)(locator).toHaveCount(count2),
444
+ ]);
445
+ }
446
+ catch {
447
+ const actual = await locator.count();
448
+ throw new Error(`Expected count to be either ${count1} or ${count2}, but was ${actual}`);
449
+ }
450
+ }
451
+ exports.expectCountToBeOneOf = expectCountToBeOneOf;
452
+ async function assertTestUsesCorrectOrganizationFromModeler(page) {
453
+ const homePage = new HomePage_1.HomePage(page);
454
+ await (0, test_1.expect)(homePage.openOrganizationButton).toBeVisible({ timeout: 180000 });
455
+ if (page.url().includes('modeler')) {
456
+ await (0, test_1.expect)(homePage.modelerBanner).toBeVisible({ timeout: 60000 });
457
+ }
458
+ else {
459
+ await homePage.closeInformationDialog();
460
+ await (0, test_1.expect)(homePage.consoleBanner).toBeVisible({ timeout: 60000 });
461
+ }
462
+ try {
463
+ await (0, sleep_1.sleep)(20000);
464
+ await (0, test_1.expect)(page.getByTitle(process.env.ORG_NAME)).toBeVisible({
465
+ timeout: 30000,
466
+ });
467
+ }
468
+ catch (error) {
469
+ // If the first check fails, check by org name
470
+ try {
471
+ await homePage.clickOpenOrganizationButton();
472
+ await page
473
+ .getByRole('treeitem', { name: process.env.ORG_NAME, exact: true })
474
+ .click({ timeout: 30000 });
475
+ }
476
+ catch (reloadError) {
477
+ await page
478
+ .getByRole('button', { name: process.env.ORG_NAME })
479
+ .click({ timeout: 30000 });
480
+ }
481
+ }
482
+ }
483
+ exports.assertTestUsesCorrectOrganizationFromModeler = assertTestUsesCorrectOrganizationFromModeler;
484
+ async function waitForLoadingToFinish(page, timeout = 20000) {
485
+ await page.waitForLoadState('load', { timeout }).catch((error) => {
486
+ console.log(error);
487
+ });
488
+ }
489
+ exports.waitForLoadingToFinish = waitForLoadingToFinish;