@camunda/e2e-test-suite 0.0.507 → 0.0.508

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.
@@ -24,8 +24,21 @@ class ConsoleHomePage {
24
24
  });
25
25
  }
26
26
  async clickClusters() {
27
- await (0, test_1.expect)(this.clusterTab).toBeVisible({ timeout: 30000 });
28
- await this.clusterTab.click({ timeout: 90000 });
27
+ // Console banner re-renders during initial load, which can detach the
28
+ // Clusters link mid-click. Retry on transient detach errors.
29
+ const maxAttempts = 3;
30
+ for (let attempt = 1; attempt <= maxAttempts; attempt++) {
31
+ try {
32
+ await (0, test_1.expect)(this.clusterTab).toBeVisible({ timeout: 60000 });
33
+ await this.clusterTab.click({ timeout: 30000 });
34
+ return;
35
+ }
36
+ catch (err) {
37
+ if (attempt === maxAttempts)
38
+ throw err;
39
+ await this.page.waitForTimeout(2000);
40
+ }
41
+ }
29
42
  }
30
43
  }
31
44
  exports.ConsoleHomePage = ConsoleHomePage;
@@ -56,7 +56,9 @@ class KeycloakAdminPage {
56
56
  await this.page.click('[id="nav-item-users"]');
57
57
  }
58
58
  async clickAddUser() {
59
- await this.page.getByTestId('add-user').click();
59
+ const addUserButton = this.page.getByTestId('add-user');
60
+ await (0, test_1.expect)(addUserButton).toBeVisible({ timeout: 30000 });
61
+ await addUserButton.click({ timeout: 30000 });
60
62
  }
61
63
  async fillUser(username) {
62
64
  await this.page.getByTestId('username').fill(username);
@@ -621,13 +621,15 @@ class ModelerCreatePage {
621
621
  async completePlayConfiguration() {
622
622
  const timeout = 30000;
623
623
  let attempts = 0;
624
- const maxRetries = 2;
624
+ const maxRetries = 3;
625
625
  while (attempts < maxRetries) {
626
626
  try {
627
627
  if (attempts > 0)
628
628
  await this.switchToPlay(); // Call switchToPlay on subsequent attempts
629
629
  await this.continueToPlayButton.click({ timeout });
630
- await (0, test_1.expect)(this.page.getByText('Play environment is ready')).toBeVisible({ timeout: 90000 });
630
+ // Play environment provisioning involves Zeebe deploy + cluster
631
+ // bootstrap; on slower clusters this can take several minutes.
632
+ await (0, test_1.expect)(this.page.getByText('Play environment is ready')).toBeVisible({ timeout: 180000 });
631
633
  await (0, test_1.expect)(this.dialog).not.toBeVisible();
632
634
  return; // Exit if successful
633
635
  }
@@ -5,7 +5,11 @@ const test_1 = require("@playwright/test");
5
5
  const sleep_1 = require("../../utils/sleep");
6
6
  const expectLocatorWithRetry_1 = require("../../utils/assertionHelpers/expectLocatorWithRetry");
7
7
  const clickLocatorWithRetry_1 = require("../../utils/assertionHelpers/clickLocatorWithRetry");
8
+ const env_1 = require("../../utils/env");
8
9
  const maxWaitTimeSeconds = 180000;
10
+ // OpenSearch indexes process instances more slowly than Elasticsearch, so
11
+ // "Loading instance details..." can stay visible longer than the default 60s.
12
+ const loadingDetailsHideTimeout = env_1.isOpenSearch ? 180000 : 60000;
9
13
  class PlayPage {
10
14
  page;
11
15
  completeJobButton;
@@ -85,7 +89,7 @@ class PlayPage {
85
89
  await this.startInstanceButton.click({ timeout: 30000 });
86
90
  await (0, test_1.expect)(this.loadingInstanceDetailsText).toBeVisible();
87
91
  await (0, test_1.expect)(this.loadingInstanceDetailsText).not.toBeVisible({
88
- timeout: 60000,
92
+ timeout: loadingDetailsHideTimeout,
89
93
  });
90
94
  await (0, test_1.expect)(this.dialog).not.toBeVisible({ timeout: 15000 });
91
95
  return;
@@ -203,10 +207,18 @@ class PlayPage {
203
207
  await this.enterScenarioNameInput.fill(newScenarioName);
204
208
  }
205
209
  async clickViewAllScenariosButton() {
210
+ // The "(View all)" button is rendered after a save-scenario toast settles.
211
+ // Reload + retry to recover when the toast or notification panel covers it.
206
212
  await (0, clickLocatorWithRetry_1.clickLocatorWithRetry)(this.page, this.viewAllScenariosButton, {
207
- totalTimeout: 60000,
208
- visibilityTimeout: 15000,
209
- maxRetries: 5,
213
+ totalTimeout: 180000,
214
+ visibilityTimeout: 30000,
215
+ maxRetries: 8,
216
+ preAction: async () => {
217
+ await this.notifications
218
+ .first()
219
+ .waitFor({ state: 'hidden', timeout: 10000 })
220
+ .catch(() => { });
221
+ },
210
222
  });
211
223
  }
212
224
  async confirmSaveScenario() {
@@ -6,6 +6,7 @@ const _setup_1 = require("../../test-setup.js");
6
6
  const UtlitiesPage_1 = require("../../pages/SM-8.7/UtlitiesPage");
7
7
  const KeycloakUtils_1 = require("../../pages/SM-8.7/KeycloakUtils");
8
8
  const sleep_1 = require("../../utils/sleep");
9
+ const env_1 = require("../../utils/env");
9
10
  const loggingUtils_1 = require("../../utils/loggingUtils");
10
11
  SM_8_7_1.test.describe.parallel('Connectors User Flow Tests', () => {
11
12
  SM_8_7_1.test.beforeEach(async ({ navigationPage, identityPage, identityTenantPage, keycloakLoginPage, keycloakAdminPage, }, testInfo) => {
@@ -101,7 +102,8 @@ SM_8_7_1.test.describe.parallel('Connectors User Flow Tests', () => {
101
102
  await SM_8_7_1.test.step('Make Authorization Request', async () => {
102
103
  const baseURL = process.env.PLAYWRIGHT_BASE_URL ||
103
104
  `http://gke-${process.env.BASE_URL}.ci.distro.ultrawombat.com`;
104
- const timeout = 60000;
105
+ // OpenSearch registers inbound webhooks more slowly than ES.
106
+ const timeout = env_1.isOpenSearch ? 180000 : 60000;
105
107
  const interval = 5000;
106
108
  const startTime = Date.now();
107
109
  let response;
@@ -173,8 +175,9 @@ SM_8_7_1.test.describe.parallel('Connectors User Flow Tests', () => {
173
175
  const baseURL = process.env.PLAYWRIGHT_BASE_URL ||
174
176
  `http://gke-${process.env.BASE_URL}.ci.distro.ultrawombat.com`;
175
177
  // It takes about 6 seconds for the process to appear in the connectors endpoint
176
- // So we need to wait for it to appear before making the request
177
- const timeout = 60000;
178
+ // So we need to wait for it to appear before making the request.
179
+ // OpenSearch is significantly slower at registering inbound webhooks.
180
+ const timeout = env_1.isOpenSearch ? 180000 : 60000;
178
181
  const interval = 5000;
179
182
  const startTime = Date.now();
180
183
  let response;
@@ -6,6 +6,11 @@ const _setup_1 = require("../../test-setup.js");
6
6
  const UtlitiesPage_1 = require("../../pages/SM-8.7/UtlitiesPage");
7
7
  const KeycloakUtils_1 = require("../../pages/SM-8.7/KeycloakUtils");
8
8
  const loggingUtils_1 = require("../../utils/loggingUtils");
9
+ const env_1 = require("../../utils/env");
10
+ // OpenSearch indexes Zeebe events more slowly than Elasticsearch, so
11
+ // process/task names take longer to appear in Tasklist and Operate.
12
+ const taskVisibilityTimeout = env_1.isOpenSearch ? 240000 : 120000;
13
+ const processNameTimeout = env_1.isOpenSearch ? 180000 : 60000;
9
14
  SM_8_7_1.test.describe.parallel('HTO User Flow Tests', () => {
10
15
  SM_8_7_1.test.beforeEach(async ({ navigationPage, identityPage, keycloakLoginPage, keycloakAdminPage, context, identityTenantPage, }, testInfo) => {
11
16
  // Set up test context for logging
@@ -88,7 +93,7 @@ SM_8_7_1.test.describe.parallel('HTO User Flow Tests', () => {
88
93
  await SM_8_7_1.test.step('Complete User Task in Tasklist & assert process complete in Operate', async () => {
89
94
  await navigationPage.goToTasklist();
90
95
  await (0, test_1.expect)(page.getByText(processName).first()).toBeVisible({
91
- timeout: 60000,
96
+ timeout: processNameTimeout,
92
97
  });
93
98
  await (0, UtlitiesPage_1.completeTaskWithRetry)(page, taskPanelPage, taskDetailsPage, `${taskName}4`, 'critical');
94
99
  await (0, UtlitiesPage_1.completeTaskWithRetry)(page, taskPanelPage, taskDetailsPage, `${taskName}3`, 'high');
@@ -102,7 +107,7 @@ SM_8_7_1.test.describe.parallel('HTO User Flow Tests', () => {
102
107
  await page.reload();
103
108
  await taskPanelPage.openTask(`${taskName}4`, false);
104
109
  await (0, test_1.expect)(page.getByText(processName).first()).toBeVisible({
105
- timeout: 60000,
110
+ timeout: processNameTimeout,
106
111
  });
107
112
  await taskDetailsPage.taskAssertion(processName);
108
113
  await taskDetailsPage.priorityAssertion('critical');
@@ -205,13 +210,13 @@ SM_8_7_1.test.describe.parallel('HTO User Flow Tests', () => {
205
210
  await SM_8_7_1.test.step('View User Tasks in Tasklist', async () => {
206
211
  await navigationPage.goToTasklist();
207
212
  await (0, test_1.expect)(page.getByText(`${userTaskName}1`)).toBeVisible({
208
- timeout: 120000,
213
+ timeout: taskVisibilityTimeout,
209
214
  });
210
215
  await (0, test_1.expect)(page.getByText(`${userTaskName}2`)).toBeVisible({
211
- timeout: 120000,
216
+ timeout: taskVisibilityTimeout,
212
217
  });
213
218
  await (0, test_1.expect)(page.getByText(`${userTaskName}3`)).not.toBeVisible({
214
- timeout: 120000,
219
+ timeout: taskVisibilityTimeout,
215
220
  });
216
221
  });
217
222
  await SM_8_7_1.test.step('Logout and Login with "lisa" User and Check Tasks in Tasklist', async () => {
@@ -225,13 +230,13 @@ SM_8_7_1.test.describe.parallel('HTO User Flow Tests', () => {
225
230
  });
226
231
  await SM_8_7_1.test.step('Navigate to Tasklist and Assert User Tasks ', async () => {
227
232
  await (0, test_1.expect)(page.getByText(`${userTaskName}1`)).toBeVisible({
228
- timeout: 120000,
233
+ timeout: taskVisibilityTimeout,
229
234
  });
230
235
  await (0, test_1.expect)(page.getByText(`${userTaskName}2`)).not.toBeVisible({
231
- timeout: 120000,
236
+ timeout: taskVisibilityTimeout,
232
237
  });
233
238
  await (0, test_1.expect)(page.getByText(`${userTaskName}3`)).toBeVisible({
234
- timeout: 120000,
239
+ timeout: taskVisibilityTimeout,
235
240
  });
236
241
  });
237
242
  await SM_8_7_1.test.step('Complete a User Task', async () => {
@@ -321,10 +326,10 @@ SM_8_7_1.test.describe.parallel('HTO User Flow Tests', () => {
321
326
  await SM_8_7_1.test.step('View User Tasks in Tasklist', async () => {
322
327
  await navigationPage.goToTasklist();
323
328
  await (0, test_1.expect)(page.getByText(`${userTaskName}1`)).toBeVisible({
324
- timeout: 120000,
329
+ timeout: taskVisibilityTimeout,
325
330
  });
326
331
  await (0, test_1.expect)(page.getByText(`${userTaskName}2`)).not.toBeVisible({
327
- timeout: 120000,
332
+ timeout: taskVisibilityTimeout,
328
333
  });
329
334
  });
330
335
  await SM_8_7_1.test.step('Logout and Login with "lisa" User and Check Tasks in Tasklist', async () => {
@@ -338,10 +343,10 @@ SM_8_7_1.test.describe.parallel('HTO User Flow Tests', () => {
338
343
  });
339
344
  await SM_8_7_1.test.step('Navigate to Tasklist and Assert User Tasks ', async () => {
340
345
  await (0, test_1.expect)(page.getByText(`${userTaskName}1`)).toBeVisible({
341
- timeout: 120000,
346
+ timeout: taskVisibilityTimeout,
342
347
  });
343
348
  await (0, test_1.expect)(page.getByText(`${userTaskName}2`)).toBeVisible({
344
- timeout: 120000,
349
+ timeout: taskVisibilityTimeout,
345
350
  });
346
351
  });
347
352
  await SM_8_7_1.test.step('Logout and Login with "bart" User and Check Tasks in Tasklist', async () => {
@@ -355,10 +360,10 @@ SM_8_7_1.test.describe.parallel('HTO User Flow Tests', () => {
355
360
  });
356
361
  await SM_8_7_1.test.step('Navigate to Tasklist and Assert User Tasks ', async () => {
357
362
  await (0, test_1.expect)(page.getByText(`${userTaskName}1`)).not.toBeVisible({
358
- timeout: 120000,
363
+ timeout: taskVisibilityTimeout,
359
364
  });
360
365
  await (0, test_1.expect)(page.getByText(`${userTaskName}2`)).toBeVisible({
361
- timeout: 120000,
366
+ timeout: taskVisibilityTimeout,
362
367
  });
363
368
  });
364
369
  await SM_8_7_1.test.step('Complete a User Task', async () => {
@@ -404,10 +409,10 @@ SM_8_7_1.test.describe.parallel('HTO User Flow Tests', () => {
404
409
  await taskPanelPage.clickProcessesTab();
405
410
  await taskProcessesPage.clickpopupContinueButton();
406
411
  await (0, test_1.expect)(page.getByText(`${processName}1`).last()).toBeVisible({
407
- timeout: 120000,
412
+ timeout: taskVisibilityTimeout,
408
413
  });
409
414
  await (0, test_1.expect)(page.getByText(`${processName}2`).last()).toBeVisible({
410
- timeout: 120000,
415
+ timeout: taskVisibilityTimeout,
411
416
  });
412
417
  });
413
418
  });
@@ -7,6 +7,7 @@ const sleep_1 = require("../../utils/sleep");
7
7
  const KeycloakUtils_1 = require("../../pages/SM-8.7/KeycloakUtils");
8
8
  const loggingUtils_1 = require("../../utils/loggingUtils");
9
9
  const UtlitiesPage_1 = require("../../pages/SM-8.7/UtlitiesPage");
10
+ const env_1 = require("../../utils/env");
10
11
  SM_8_7_1.test.describe.configure({ mode: 'parallel' });
11
12
  SM_8_7_1.test.describe('Deploy and run a process in Play', () => {
12
13
  SM_8_7_1.test.beforeEach(async ({ navigationPage, identityPage, identityTenantPage, keycloakLoginPage, keycloakAdminPage, }, testInfo) => {
@@ -76,8 +77,9 @@ SM_8_7_1.test.describe('Deploy and run a process in Play', () => {
76
77
  await (0, test_1.expect)(modelerCreatePage.generalPanel).toBeVisible({
77
78
  timeout: 30000,
78
79
  });
79
- // Wait for modeler background auto-save to complete
80
- await (0, sleep_1.sleep)(2000);
80
+ // Wait for modeler background auto-save to complete (OpenSearch
81
+ // takes noticeably longer to make the saved diagram available to Play).
82
+ await (0, sleep_1.sleep)(env_1.isOpenSearch ? 15000 : 2000);
81
83
  });
82
84
  await SM_8_7_1.test.step('Open Play', async () => {
83
85
  await modelerCreatePage.switchToPlay();
@@ -109,8 +111,9 @@ SM_8_7_1.test.describe('Deploy and run a process in Play', () => {
109
111
  await (0, test_1.expect)(modelerCreatePage.generalPanel).toBeVisible({
110
112
  timeout: 30000,
111
113
  });
112
- // Wait for modeler background auto-save to complete
113
- await (0, sleep_1.sleep)(2000);
114
+ // Wait for modeler background auto-save to complete (OpenSearch
115
+ // takes noticeably longer to make the saved diagram available to Play).
116
+ await (0, sleep_1.sleep)(env_1.isOpenSearch ? 15000 : 2000);
114
117
  await modelerCreatePage.switchToPlay();
115
118
  await modelerCreatePage.completePlayConfiguration();
116
119
  await playPage.clickStartInstanceButton();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camunda/e2e-test-suite",
3
- "version": "0.0.507",
3
+ "version": "0.0.508",
4
4
  "description": "End-to-end test helpers for Camunda 8",
5
5
  "repository": {
6
6
  "type": "git",
@@ -220,6 +220,11 @@ const changedFolders =
220
220
 
221
221
  const timeout = () => {
222
222
  if (process.env.MINOR_VERSION?.includes('SM-8.7')) {
223
+ // OpenSearch indexes more slowly than Elasticsearch — give SM-8.7 the
224
+ // full 12 minute budget so non-`test.slow()` flows don't hit 3-min cap.
225
+ if (String(process.env.IS_OPENSEARCH).toLowerCase() === 'true') {
226
+ return 12 * 60 * 1000;
227
+ }
223
228
  return 3 * 60 * 1000;
224
229
  }
225
230
  return 12 * 60 * 1000;