@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.
- package/dist/pages/SM-8.7/ConsoleHomePage.js +15 -2
- package/dist/pages/SM-8.7/KeycloakAdminPage.js +3 -1
- package/dist/pages/SM-8.7/ModelerCreatePage.js +4 -2
- package/dist/pages/SM-8.7/PlayPage.js +16 -4
- package/dist/tests/SM-8.7/connectors-user-flows.spec.js +6 -3
- package/dist/tests/SM-8.7/hto-user-flows.spec.js +21 -16
- package/dist/tests/SM-8.7/play.spec.js +7 -4
- package/package.json +1 -1
- package/playwright.config.ts +5 -0
|
@@ -24,8 +24,21 @@ class ConsoleHomePage {
|
|
|
24
24
|
});
|
|
25
25
|
}
|
|
26
26
|
async clickClusters() {
|
|
27
|
-
|
|
28
|
-
|
|
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
|
-
|
|
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 =
|
|
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
|
-
|
|
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:
|
|
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:
|
|
208
|
-
visibilityTimeout:
|
|
209
|
-
maxRetries:
|
|
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
|
-
|
|
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
|
-
|
|
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:
|
|
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:
|
|
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:
|
|
213
|
+
timeout: taskVisibilityTimeout,
|
|
209
214
|
});
|
|
210
215
|
await (0, test_1.expect)(page.getByText(`${userTaskName}2`)).toBeVisible({
|
|
211
|
-
timeout:
|
|
216
|
+
timeout: taskVisibilityTimeout,
|
|
212
217
|
});
|
|
213
218
|
await (0, test_1.expect)(page.getByText(`${userTaskName}3`)).not.toBeVisible({
|
|
214
|
-
timeout:
|
|
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:
|
|
233
|
+
timeout: taskVisibilityTimeout,
|
|
229
234
|
});
|
|
230
235
|
await (0, test_1.expect)(page.getByText(`${userTaskName}2`)).not.toBeVisible({
|
|
231
|
-
timeout:
|
|
236
|
+
timeout: taskVisibilityTimeout,
|
|
232
237
|
});
|
|
233
238
|
await (0, test_1.expect)(page.getByText(`${userTaskName}3`)).toBeVisible({
|
|
234
|
-
timeout:
|
|
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:
|
|
329
|
+
timeout: taskVisibilityTimeout,
|
|
325
330
|
});
|
|
326
331
|
await (0, test_1.expect)(page.getByText(`${userTaskName}2`)).not.toBeVisible({
|
|
327
|
-
timeout:
|
|
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:
|
|
346
|
+
timeout: taskVisibilityTimeout,
|
|
342
347
|
});
|
|
343
348
|
await (0, test_1.expect)(page.getByText(`${userTaskName}2`)).toBeVisible({
|
|
344
|
-
timeout:
|
|
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:
|
|
363
|
+
timeout: taskVisibilityTimeout,
|
|
359
364
|
});
|
|
360
365
|
await (0, test_1.expect)(page.getByText(`${userTaskName}2`)).toBeVisible({
|
|
361
|
-
timeout:
|
|
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:
|
|
412
|
+
timeout: taskVisibilityTimeout,
|
|
408
413
|
});
|
|
409
414
|
await (0, test_1.expect)(page.getByText(`${processName}2`).last()).toBeVisible({
|
|
410
|
-
timeout:
|
|
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
|
-
|
|
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
|
-
|
|
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
package/playwright.config.ts
CHANGED
|
@@ -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;
|