@camunda/e2e-test-suite 0.0.434 → 0.0.436

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.
@@ -99,6 +99,7 @@ declare class ModelerCreatePage {
99
99
  readonly backupDeployButton: Locator;
100
100
  readonly globalConnectToolButton: Locator;
101
101
  readonly formLinkedSuccessMessage: Locator;
102
+ readonly webhookActiveMessage: Locator;
102
103
  readonly diagramNameBreadcrumb: (diagramName: string) => Locator;
103
104
  constructor(page: Page);
104
105
  clickSecondDeployButton(): Promise<void>;
@@ -105,6 +105,7 @@ class ModelerCreatePage {
105
105
  backupDeployButton;
106
106
  globalConnectToolButton;
107
107
  formLinkedSuccessMessage;
108
+ webhookActiveMessage;
108
109
  diagramNameBreadcrumb;
109
110
  constructor(page) {
110
111
  this.page = page;
@@ -298,6 +299,7 @@ class ModelerCreatePage {
298
299
  this.diagramNameBreadcrumb = (diagramName) => page.locator('button[data-test="breadcrumb-diagram"]', {
299
300
  hasText: diagramName,
300
301
  });
302
+ this.webhookActiveMessage = page.getByText('Webhook is active');
301
303
  }
302
304
  async clickSecondDeployButton() {
303
305
  await this.deployAndRunMainButton
@@ -266,9 +266,6 @@ async function enableAuthorizations(clusterName, homePage, clusterPage, clusterD
266
266
  await homePage.clickClusters();
267
267
  await clusterPage.assertClusterHealthyStatusWithRetry(clusterName);
268
268
  await clusterPage.clickClusterLink(clusterName);
269
- await (0, test_1.expect)(clusterDetailsPage.rbaEnabledMessage.first()).toBeVisible({
270
- timeout: 30000,
271
- });
272
269
  await clusterDetailsPage.assertComponentsHealth();
273
270
  }
274
271
  exports.enableAuthorizations = enableAuthorizations;
@@ -99,6 +99,7 @@ declare class ModelerCreatePage {
99
99
  readonly backupDeployButton: Locator;
100
100
  readonly globalConnectToolButton: Locator;
101
101
  readonly formLinkedSuccessMessage: Locator;
102
+ readonly webhookActiveMessage: Locator;
102
103
  readonly diagramNameBreadcrumb: (diagramName: string) => Locator;
103
104
  constructor(page: Page);
104
105
  clickSecondDeployButton(): Promise<void>;
@@ -105,6 +105,7 @@ class ModelerCreatePage {
105
105
  backupDeployButton;
106
106
  globalConnectToolButton;
107
107
  formLinkedSuccessMessage;
108
+ webhookActiveMessage;
108
109
  diagramNameBreadcrumb;
109
110
  constructor(page) {
110
111
  this.page = page;
@@ -298,6 +299,7 @@ class ModelerCreatePage {
298
299
  this.diagramNameBreadcrumb = (diagramName) => page.locator('button[data-test="breadcrumb-diagram"]', {
299
300
  hasText: diagramName,
300
301
  });
302
+ this.webhookActiveMessage = page.getByText('Webhook is active');
301
303
  }
302
304
  async clickSecondDeployButton() {
303
305
  await this.deployAndRunMainButton
@@ -271,9 +271,6 @@ async function enableAuthorizations(clusterName, homePage, clusterPage, clusterD
271
271
  await homePage.clickClusters();
272
272
  await clusterPage.assertClusterHealthyStatusWithRetry(clusterName);
273
273
  await clusterPage.clickClusterLink(clusterName);
274
- await (0, test_1.expect)(clusterDetailsPage.rbaEnabledMessage.first()).toBeVisible({
275
- timeout: 30000,
276
- });
277
274
  await clusterDetailsPage.assertComponentsHealth();
278
275
  }
279
276
  exports.enableAuthorizations = enableAuthorizations;
@@ -51,6 +51,7 @@ class OperateProcessesPage {
51
51
  this.gotItButton = page.getByRole('button', { name: 'Got it' });
52
52
  }
53
53
  async checkCheckbox(checkbox) {
54
+ await checkbox.waitFor({ state: 'visible', timeout: constants_1._1_SECOND_IN_MS * 10 });
54
55
  if (!(await checkbox.isChecked())) {
55
56
  await checkbox.click();
56
57
  await (0, test_1.expect)(checkbox).toBeChecked({
@@ -60,6 +61,7 @@ class OperateProcessesPage {
60
61
  }
61
62
  }
62
63
  async uncheckCheckbox(checkbox) {
64
+ await checkbox.waitFor({ state: 'visible', timeout: constants_1._1_SECOND_IN_MS * 10 });
63
65
  if (await checkbox.isChecked()) {
64
66
  await checkbox.click();
65
67
  await (0, test_1.expect)(checkbox).toBeChecked({
@@ -77,6 +79,10 @@ class OperateProcessesPage {
77
79
  async toggleActiveCheckboxOn() {
78
80
  await this.uncheckCompletedCheckbox();
79
81
  await this.clickProcessIncidentsCheckbox();
82
+ await this.processActiveCheckbox.waitFor({
83
+ state: 'visible',
84
+ timeout: constants_1._1_SECOND_IN_MS * 10,
85
+ });
80
86
  if (await this.processActiveCheckbox.isChecked({ timeout: constants_1._1_SECOND_IN_MS })) {
81
87
  await this.uncheckCheckbox(this.processActiveCheckbox);
82
88
  await (0, sleep_1.sleep)(200); // Required to skip the debounce protection on the frontend
@@ -89,6 +95,10 @@ class OperateProcessesPage {
89
95
  async toggleCompletedCheckbox() {
90
96
  await this.uncheckActiveCheckbox();
91
97
  await this.clickProcessIncidentsCheckbox();
98
+ await this.processCompletedCheckbox.waitFor({
99
+ state: 'visible',
100
+ timeout: constants_1._1_SECOND_IN_MS * 10,
101
+ });
92
102
  if (await this.processCompletedCheckbox.isChecked({ timeout: constants_1._1_SECOND_IN_MS })) {
93
103
  await this.uncheckCheckbox(this.processCompletedCheckbox);
94
104
  await (0, sleep_1.sleep)(200); // Required to skip the debounce protection on the frontend
@@ -121,23 +131,66 @@ class OperateProcessesPage {
121
131
  }
122
132
  }
123
133
  async clickProcessActiveCheckbox() {
134
+ await this.processActiveCheckbox.waitFor({
135
+ state: 'visible',
136
+ timeout: constants_1._1_SECOND_IN_MS * 10,
137
+ });
124
138
  if (!(await this.processActiveCheckbox.isChecked({ timeout: 60000 }))) {
125
139
  await this.processActiveCheckbox.click({ timeout: 120000 });
140
+ await (0, test_1.expect)(this.processActiveCheckbox).toBeChecked({
141
+ checked: true,
142
+ timeout: constants_1._1_SECOND_IN_MS * 5,
143
+ });
126
144
  }
127
145
  }
128
146
  async clickProcessCompletedCheckbox() {
147
+ await this.processCompletedCheckbox.waitFor({
148
+ state: 'visible',
149
+ timeout: constants_1._1_SECOND_IN_MS * 10,
150
+ });
129
151
  if (!(await this.processCompletedCheckbox.isChecked({ timeout: 60000 }))) {
130
152
  await this.processCompletedCheckbox.click({ timeout: 120000 });
153
+ await (0, test_1.expect)(this.processCompletedCheckbox).toBeChecked({
154
+ checked: true,
155
+ timeout: constants_1._1_SECOND_IN_MS * 5,
156
+ });
131
157
  }
132
158
  }
133
159
  async clickProcessIncidentsCheckbox() {
160
+ await this.processIncidentsCheckbox.waitFor({
161
+ state: 'visible',
162
+ timeout: constants_1._1_SECOND_IN_MS * 10,
163
+ });
164
+ const wasChecked = await this.processIncidentsCheckbox.isChecked();
134
165
  await this.processIncidentsCheckbox.click({ timeout: 90000 });
166
+ await (0, test_1.expect)(this.processIncidentsCheckbox).toBeChecked({
167
+ checked: !wasChecked,
168
+ timeout: constants_1._1_SECOND_IN_MS * 5,
169
+ });
135
170
  }
136
171
  async clickRunningProcessInstancesCheckbox() {
172
+ await this.processRunningInstancesCheckbox.waitFor({
173
+ state: 'visible',
174
+ timeout: constants_1._1_SECOND_IN_MS * 10,
175
+ });
176
+ const wasChecked = await this.processRunningInstancesCheckbox.isChecked();
137
177
  await this.processRunningInstancesCheckbox.click({ timeout: 90000 });
178
+ await (0, test_1.expect)(this.processRunningInstancesCheckbox).toBeChecked({
179
+ checked: !wasChecked,
180
+ timeout: constants_1._1_SECOND_IN_MS * 5,
181
+ });
138
182
  }
139
183
  async clickFinishedProcessInstancesCheckbox() {
184
+ await this.processFinishedInstancesCheckbox.waitFor({
185
+ state: 'visible',
186
+ timeout: constants_1._1_SECOND_IN_MS * 10,
187
+ });
188
+ const wasChecked = await this.processFinishedInstancesCheckbox.isChecked();
140
189
  await this.processFinishedInstancesCheckbox.click({ timeout: 90000 });
190
+ await (0, test_1.expect)(this.processFinishedInstancesCheckbox).toBeChecked({
191
+ checked: !wasChecked,
192
+ timeout: constants_1._1_SECOND_IN_MS * 5,
193
+ });
141
194
  }
142
195
  async clickProcessInstanceLink(processName, type = 'active') {
143
196
  if (await this.checkTableForProcess(processName)) {
@@ -164,25 +217,39 @@ class OperateProcessesPage {
164
217
  if (await this.checkTableForProcess(processName)) {
165
218
  return;
166
219
  }
167
- throw new Error(`Failed to open instance "${processName}" after ${MAX_ATTEMPTS} attempts.`);
220
+ throw new Error(`Instance "${processName}" not found in table (attempt ${attempt}).`);
168
221
  }
169
222
  catch (err) {
170
223
  lastError = err instanceof Error ? err.message : err;
171
- await this.page.reload();
172
- await this.page.waitForLoadState('networkidle');
224
+ console.log(`clickProcessInstanceLink attempt ${attempt}: ${String(lastError)}`);
225
+ await this.page
226
+ .reload({ timeout: 30000 })
227
+ .catch(() => console.log('Page reload timed out, continuing...'));
228
+ await this.page
229
+ .waitForLoadState('networkidle', { timeout: 30000 })
230
+ .catch(() => console.log('waitForLoadState networkidle timed out, continuing...'));
173
231
  // After reload, the page may redirect away from Operate (e.g. to
174
232
  // Tasklist). Navigate back to the original Operate URL if that
175
233
  // happens.
176
234
  if (!this.page.url().includes('/operate')) {
177
- await this.page.goto(operateUrl);
178
- await this.page.waitForLoadState('networkidle');
235
+ await this.page
236
+ .goto(operateUrl, { timeout: 30000 })
237
+ .catch(() => console.log('Navigation to Operate timed out, continuing...'));
238
+ await this.page
239
+ .waitForLoadState('networkidle', { timeout: 30000 })
240
+ .catch(() => console.log('waitForLoadState after Operate navigation timed out, continuing...'));
179
241
  }
180
242
  // Re-apply checkbox filter lost after reload
181
- if (type === 'active') {
182
- await this.toggleActiveCheckboxOn();
243
+ try {
244
+ if (type === 'active') {
245
+ await this.toggleActiveCheckboxOn();
246
+ }
247
+ else {
248
+ await this.toggleCompletedCheckbox();
249
+ }
183
250
  }
184
- else {
185
- await this.toggleCompletedCheckbox();
251
+ catch (toggleErr) {
252
+ console.log(`Checkbox toggle failed after reload: ${String(toggleErr)}`);
186
253
  }
187
254
  // Re-fill Process Instance Key filter if it was previously applied
188
255
  // but its value was cleared by the reload.
@@ -201,7 +268,7 @@ class OperateProcessesPage {
201
268
  await (0, sleep_1.sleep)(2000);
202
269
  }
203
270
  }
204
- throw new Error(`Failed to open instance "${processName}" after ${MAX_ATTEMPTS} attempts. Last error: ${String(lastError)}`);
271
+ throw new Error(`Failed to open instance "${processName}" after ${attempt} attempts (${Math.round((Date.now() - startTime) / 1000)}s elapsed). Last error: ${String(lastError)}`);
205
272
  }
206
273
  async clickProcessInstanceLinkWithPartialNameMatch(processName) {
207
274
  let retryCount = 0;
@@ -145,10 +145,9 @@ _8_10_1.test.describe('Connectors User Flow Tests @tasklistV2', () => {
145
145
  await _8_10_1.test.step('Assert Webhook Is Active In Cluster And Make Authorization Request', async () => {
146
146
  await modelerCreatePage.clickStartEventElement();
147
147
  await modelerCreatePage.clickWebhookTab();
148
- await (0, test_1.expect)(modelerCreatePage.webhookIsActiveButton).toBeVisible({
148
+ await (0, test_1.expect)(modelerCreatePage.webhookActiveMessage).toBeVisible({
149
149
  timeout: 60000,
150
150
  });
151
- await modelerCreatePage.clickWebhookIsActiveButton();
152
151
  const url = await modelerCreatePage.copyWebhookUrlToClipboardButton.innerText({
153
152
  timeout: 60000,
154
153
  });
@@ -373,10 +372,9 @@ _8_10_1.test.describe('Connectors User Flow Tests @tasklistV2', () => {
373
372
  await _8_10_1.test.step('Assert Webhook Is Active In Cluster And Make Authorization Request', async () => {
374
373
  await modelerCreatePage.clickSecondElement();
375
374
  await modelerCreatePage.clickWebhookTab();
376
- await (0, test_1.expect)(modelerCreatePage.webhookIsActiveButton).toBeVisible({
375
+ await (0, test_1.expect)(modelerCreatePage.webhookActiveMessage).toBeVisible({
377
376
  timeout: 120000,
378
377
  });
379
- await modelerCreatePage.clickWebhookIsActiveButton();
380
378
  const url = await modelerCreatePage.copyWebhookUrlToClipboardButton.innerText();
381
379
  const response = await request.post(url, {
382
380
  data: {
@@ -145,10 +145,9 @@ _8_9_1.test.describe('Connectors User Flow Tests @tasklistV2', () => {
145
145
  await _8_9_1.test.step('Assert Webhook Is Active In Cluster And Make Authorization Request', async () => {
146
146
  await modelerCreatePage.clickStartEventElement();
147
147
  await modelerCreatePage.clickWebhookTab();
148
- await (0, test_1.expect)(modelerCreatePage.webhookIsActiveButton).toBeVisible({
148
+ await (0, test_1.expect)(modelerCreatePage.webhookActiveMessage).toBeVisible({
149
149
  timeout: 60000,
150
150
  });
151
- await modelerCreatePage.clickWebhookIsActiveButton();
152
151
  const url = await modelerCreatePage.copyWebhookUrlToClipboardButton.innerText({
153
152
  timeout: 60000,
154
153
  });
@@ -373,10 +372,9 @@ _8_9_1.test.describe('Connectors User Flow Tests @tasklistV2', () => {
373
372
  await _8_9_1.test.step('Assert Webhook Is Active In Cluster And Make Authorization Request', async () => {
374
373
  await modelerCreatePage.clickSecondElement();
375
374
  await modelerCreatePage.clickWebhookTab();
376
- await (0, test_1.expect)(modelerCreatePage.webhookIsActiveButton).toBeVisible({
375
+ await (0, test_1.expect)(modelerCreatePage.webhookActiveMessage).toBeVisible({
377
376
  timeout: 120000,
378
377
  });
379
- await modelerCreatePage.clickWebhookIsActiveButton();
380
378
  const url = await modelerCreatePage.copyWebhookUrlToClipboardButton.innerText();
381
379
  const response = await request.post(url, {
382
380
  data: {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camunda/e2e-test-suite",
3
- "version": "0.0.434",
3
+ "version": "0.0.436",
4
4
  "description": "End-to-end test helpers for Camunda 8",
5
5
  "repository": {
6
6
  "type": "git",