@camunda/e2e-test-suite 0.0.422 → 0.0.423

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.
@@ -6,9 +6,11 @@ declare class OperateProcessInstancePage {
6
6
  readonly diagramSpinner: Locator;
7
7
  readonly activeIcon: Locator;
8
8
  readonly incidentIcon: Locator;
9
+ readonly variablesList: Locator;
9
10
  constructor(page: Page);
10
- connectorResultVariableName(name: string): Promise<Locator>;
11
- connectorResultVariableValue(variableName: string): Promise<Locator>;
11
+ assertVariablesListVisible(timeout?: number): Promise<void>;
12
+ connectorResultVariableName(name: string, timeout?: number): Promise<Locator>;
13
+ connectorResultVariableValue(variableName: string, timeout?: number): Promise<Locator>;
12
14
  completedIconAssertion(): Promise<void>;
13
15
  activeIconAssertion(): Promise<void>;
14
16
  activeUserTaskIconVisibleAssertion(taskName: string): Promise<void>;
@@ -10,6 +10,7 @@ class OperateProcessInstancePage {
10
10
  diagramSpinner;
11
11
  activeIcon;
12
12
  incidentIcon;
13
+ variablesList;
13
14
  constructor(page) {
14
15
  this.page = page;
15
16
  this.diagram = page.getByTestId('diagram');
@@ -23,15 +24,60 @@ class OperateProcessInstancePage {
23
24
  this.incidentIcon = page
24
25
  .getByTestId('instance-header')
25
26
  .getByTestId('INCIDENT-icon');
27
+ this.variablesList = page.getByTestId('variables-list');
26
28
  }
27
- async connectorResultVariableName(name) {
28
- return this.page.getByTestId('variable-' + name);
29
+ async assertVariablesListVisible(timeout = 30000) {
30
+ const startTime = Date.now();
31
+ while (Date.now() - startTime < timeout) {
32
+ try {
33
+ await (0, test_1.expect)(this.variablesList).toBeVisible({ timeout: 10000 });
34
+ return;
35
+ }
36
+ catch {
37
+ console.log(`Variables list not visible, reloading... (${Math.round((Date.now() - startTime) / 1000)}s elapsed)`);
38
+ await this.page
39
+ .reload({ timeout: 10000 })
40
+ .catch(() => console.log('Page reload timed out, continuing...'));
41
+ await (0, sleep_1.sleep)(2000);
42
+ }
43
+ }
44
+ throw new Error(`Variables list not visible after ${Math.round(timeout / 1000)}s`);
45
+ }
46
+ async connectorResultVariableName(name, timeout = 30000) {
47
+ const locator = this.page.getByTestId('variable-' + name);
48
+ const startTime = Date.now();
49
+ while (Date.now() - startTime < timeout) {
50
+ try {
51
+ await (0, test_1.expect)(locator).toBeVisible({ timeout: 10000 });
52
+ return locator;
53
+ }
54
+ catch {
55
+ console.log(`Variable "${name}" not visible, reloading... (${Math.round((Date.now() - startTime) / 1000)}s elapsed)`);
56
+ await this.page
57
+ .reload({ timeout: 10000 })
58
+ .catch(() => console.log('Page reload timed out, continuing...'));
59
+ await (0, sleep_1.sleep)(2000);
60
+ }
61
+ }
62
+ throw new Error(`Variable "${name}" not visible after ${Math.round(timeout / 1000)}s`);
29
63
  }
30
- async connectorResultVariableValue(variableName) {
31
- return this.page
32
- .getByTestId('variable-' + variableName)
33
- .locator('td')
34
- .last();
64
+ async connectorResultVariableValue(variableName, timeout = 30000) {
65
+ const locator = this.page.getByTestId('variable-' + variableName);
66
+ const startTime = Date.now();
67
+ while (Date.now() - startTime < timeout) {
68
+ try {
69
+ await (0, test_1.expect)(locator).toBeVisible({ timeout: 10000 });
70
+ return locator;
71
+ }
72
+ catch {
73
+ console.log(`Variable value "${variableName}" not visible, reloading... (${Math.round((Date.now() - startTime) / 1000)}s elapsed)`);
74
+ await this.page
75
+ .reload({ timeout: 10000 })
76
+ .catch(() => console.log('Page reload timed out, continuing...'));
77
+ await (0, sleep_1.sleep)(2000);
78
+ }
79
+ }
80
+ throw new Error(`Variable value "${variableName}" not visible after ${Math.round(timeout / 1000)}s`);
35
81
  }
36
82
  async completedIconAssertion() {
37
83
  let retryCount = 0;
@@ -137,6 +137,10 @@ class OperateProcessesPage {
137
137
  });
138
138
  if (!(await this.processActiveCheckbox.isChecked({ timeout: 60000 }))) {
139
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
+ });
140
144
  }
141
145
  }
142
146
  async clickProcessCompletedCheckbox() {
@@ -146,6 +150,10 @@ class OperateProcessesPage {
146
150
  });
147
151
  if (!(await this.processCompletedCheckbox.isChecked({ timeout: 60000 }))) {
148
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
+ });
149
157
  }
150
158
  }
151
159
  async clickProcessIncidentsCheckbox() {
@@ -153,28 +161,43 @@ class OperateProcessesPage {
153
161
  state: 'visible',
154
162
  timeout: constants_1._1_SECOND_IN_MS * 10,
155
163
  });
164
+ const wasChecked = await this.processIncidentsCheckbox.isChecked();
156
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
+ });
157
170
  }
158
171
  async clickRunningProcessInstancesCheckbox() {
159
172
  await this.processRunningInstancesCheckbox.waitFor({
160
173
  state: 'visible',
161
174
  timeout: constants_1._1_SECOND_IN_MS * 10,
162
175
  });
176
+ const wasChecked = await this.processRunningInstancesCheckbox.isChecked();
163
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
+ });
164
182
  }
165
183
  async clickFinishedProcessInstancesCheckbox() {
166
184
  await this.processFinishedInstancesCheckbox.waitFor({
167
185
  state: 'visible',
168
186
  timeout: constants_1._1_SECOND_IN_MS * 10,
169
187
  });
188
+ const wasChecked = await this.processFinishedInstancesCheckbox.isChecked();
170
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
+ });
171
194
  }
172
195
  async clickProcessInstanceLink(processName, type = 'active') {
173
196
  if (await this.checkTableForProcess(processName)) {
174
197
  return;
175
198
  }
176
199
  const MAX_ATTEMPTS = 100;
177
- const TOTAL_TIMEOUT_MS = constants_1._1_MINUTE_IN_MS * 4;
200
+ const TOTAL_TIMEOUT_MS = constants_1._1_MINUTE_IN_MS * 6;
178
201
  let attempt = 0;
179
202
  let lastError;
180
203
  const startTime = Date.now();
@@ -191,19 +214,28 @@ class OperateProcessesPage {
191
214
  if (await this.checkTableForProcess(processName)) {
192
215
  return;
193
216
  }
194
- throw new Error(`Failed to open instance "${processName}" after ${MAX_ATTEMPTS} attempts.`);
217
+ throw new Error(`Process "${processName}" not found in table on attempt ${attempt}.`);
195
218
  }
196
219
  catch (err) {
197
220
  lastError = err instanceof Error ? err.message : err;
198
- await this.page.reload();
199
- await this.page.waitForLoadState('networkidle');
221
+ console.log(`clickProcessInstanceLink attempt ${attempt}: ${String(lastError)}`);
222
+ await this.page
223
+ .reload({ timeout: 30000 })
224
+ .catch(() => console.log('Page reload timed out, continuing...'));
225
+ await this.page
226
+ .waitForLoadState('networkidle', { timeout: 30000 })
227
+ .catch(() => console.log('waitForLoadState networkidle timed out, continuing...'));
200
228
  await (0, sleep_1.sleep)(2000);
201
229
  // After reload, check if page redirected away from Operate
202
230
  if (!this.page.url().includes('/operate')) {
203
231
  const operatePath = (process.env.ORCHESTRATION_CONTEXT_PATH ?? '/orchestration') +
204
232
  '/operate';
205
- await this.page.goto(operatePath, { timeout: 30000 });
206
- await this.page.waitForLoadState('networkidle');
233
+ await this.page
234
+ .goto(operatePath, { timeout: 30000 })
235
+ .catch(() => console.log('Navigation to Operate timed out, continuing...'));
236
+ await this.page
237
+ .waitForLoadState('networkidle', { timeout: 30000 })
238
+ .catch(() => console.log('waitForLoadState after Operate navigation timed out, continuing...'));
207
239
  await (0, sleep_1.sleep)(2000);
208
240
  }
209
241
  try {
@@ -220,7 +252,7 @@ class OperateProcessesPage {
220
252
  }
221
253
  }
222
254
  }
223
- throw new Error(`Failed to open instance "${processName}" after ${MAX_ATTEMPTS} attempts. Last error: ${String(lastError)}`);
255
+ throw new Error(`Failed to open instance "${processName}" after ${attempt} attempts (${Math.round((Date.now() - startTime) / 1000)}s elapsed). Last error: ${String(lastError)}`);
224
256
  }
225
257
  async clickProcessInstanceLinkWithPartialNameMatch(processName) {
226
258
  let retryCount = 0;
@@ -15,7 +15,7 @@ SM_8_9_1.test.describe('Connectors User Flow Tests @tasklistV2', () => {
15
15
  await (0, _setup_1.captureScreenshot)(page, testInfo);
16
16
  await (0, _setup_1.captureFailureVideo)(page, testInfo);
17
17
  });
18
- (0, SM_8_9_1.test)('REST Connector No Auth User Flow', async ({ page, operateHomePage, modelerHomePage, operateProcessInstancePage, modelerCreatePage, connectorSettingsPage, operateProcessesPage, connectorMarketplacePage, navigationPage, }) => {
18
+ (0, SM_8_9_1.test)('REST Connector No Auth User Flow', async ({ operateHomePage, modelerHomePage, operateProcessInstancePage, modelerCreatePage, connectorSettingsPage, operateProcessesPage, connectorMarketplacePage, navigationPage, }) => {
19
19
  SM_8_9_1.test.slow();
20
20
  const processName = 'REST_Connector_No_Auth_Process' + (await (0, _setup_1.generateRandomStringAsync)(3));
21
21
  await SM_8_9_1.test.step('Open Cross Component Test Project and Create a BPMN Diagram Template', async () => {
@@ -34,16 +34,12 @@ SM_8_9_1.test.describe('Connectors User Flow Tests @tasklistV2', () => {
34
34
  await operateProcessesPage.clickProcessInstanceLink(processName, 'completed');
35
35
  const result = await operateProcessInstancePage.assertEitherIncidentOrCompletedIconVisible();
36
36
  (0, test_1.expect)(result).toBe('completed');
37
- await (0, test_1.expect)(page.getByTestId('variables-list')).toBeVisible({
38
- timeout: 30000,
39
- });
40
- await (0, test_1.expect)(await operateProcessInstancePage.connectorResultVariableName('status')).toBeVisible({ timeout: 30000 });
41
- await (0, test_1.expect)(page.getByText('"Awesome!"')).toBeVisible({
42
- timeout: 60000,
43
- });
37
+ await operateProcessInstancePage.assertVariablesListVisible();
38
+ await operateProcessInstancePage.connectorResultVariableName('status');
39
+ await operateProcessInstancePage.assertProcessVariableContainsText('status', '"Awesome!"');
44
40
  });
45
41
  });
46
- (0, SM_8_9_1.test)('REST Connector Bearer Token Auth User Flow', async ({ page, operateHomePage, modelerHomePage, modelerCreatePage, connectorSettingsPage, navigationPage, operateProcessInstancePage, operateProcessesPage, connectorMarketplacePage, }) => {
42
+ (0, SM_8_9_1.test)('REST Connector Bearer Token Auth User Flow', async ({ operateHomePage, modelerHomePage, modelerCreatePage, connectorSettingsPage, navigationPage, operateProcessInstancePage, operateProcessesPage, connectorMarketplacePage, }) => {
47
43
  SM_8_9_1.test.slow();
48
44
  const processName = 'REST_Connector_Bearer_Auth_Process' +
49
45
  (await (0, _setup_1.generateRandomStringAsync)(3));
@@ -64,13 +60,9 @@ SM_8_9_1.test.describe('Connectors User Flow Tests @tasklistV2', () => {
64
60
  await operateProcessesPage.clickProcessInstanceLink(processName, 'completed');
65
61
  const result = await operateProcessInstancePage.assertEitherIncidentOrCompletedIconVisible();
66
62
  (0, test_1.expect)(result).toBe('completed');
67
- await (0, test_1.expect)(page.getByTestId('variables-list')).toBeVisible({
68
- timeout: 90000,
69
- });
70
- (0, test_1.expect)((await operateProcessInstancePage.connectorResultVariableName('message')).isVisible()).toBeTruthy();
71
- await (0, test_1.expect)(page.getByText('"Awesome!"')).toBeVisible({
72
- timeout: 60000,
73
- });
63
+ await operateProcessInstancePage.assertVariablesListVisible();
64
+ await operateProcessInstancePage.connectorResultVariableName('message');
65
+ await operateProcessInstancePage.assertProcessVariableContainsText('message', '"Awesome!"');
74
66
  });
75
67
  });
76
68
  (0, SM_8_9_1.test)('Message Start Event Webhook Connector No Auth User Flow', async ({ modelerHomePage, navigationPage, modelerCreatePage, request, operateHomePage, operateProcessInstancePage, operateProcessesPage, connectorMarketplacePage, connectorSettingsPage, }) => {
@@ -134,7 +126,7 @@ SM_8_9_1.test.describe('Connectors User Flow Tests @tasklistV2', () => {
134
126
  (0, test_1.expect)(result).toBe('completed');
135
127
  });
136
128
  });
137
- (0, SM_8_9_1.test)('Connector Secrets User Flow', async ({ page, operateHomePage, modelerHomePage, navigationPage, modelerCreatePage, connectorSettingsPage, operateProcessInstancePage, operateProcessesPage, connectorMarketplacePage, }) => {
129
+ (0, SM_8_9_1.test)('Connector Secrets User Flow', async ({ operateHomePage, modelerHomePage, navigationPage, modelerCreatePage, connectorSettingsPage, operateProcessInstancePage, operateProcessesPage, connectorMarketplacePage, }) => {
138
130
  SM_8_9_1.test.slow();
139
131
  const processName = 'REST_Connector_Process' + (await (0, _setup_1.generateRandomStringAsync)(3));
140
132
  await SM_8_9_1.test.step('Open Cross Component Test Project and Create a BPMN Diagram Template', async () => {
@@ -153,10 +145,8 @@ SM_8_9_1.test.describe('Connectors User Flow Tests @tasklistV2', () => {
153
145
  await operateProcessesPage.clickProcessInstanceLink(processName, 'completed');
154
146
  const result = await operateProcessInstancePage.assertEitherIncidentOrCompletedIconVisible();
155
147
  (0, test_1.expect)(result).toBe('completed');
156
- await (0, test_1.expect)(page.getByTestId('variables-list')).toBeVisible({
157
- timeout: 90000,
158
- });
159
- await (0, test_1.expect)(page.getByTestId('variable-message').getByText('"Message from Mock!"')).toBeVisible({ timeout: 180000 });
148
+ await operateProcessInstancePage.assertVariablesListVisible();
149
+ await operateProcessInstancePage.assertProcessVariableContainsText('message', '"Message from Mock!"');
160
150
  });
161
151
  });
162
152
  (0, SM_8_9_1.test)('Intermediate Event Webhook Connector No Auth User Flow', async ({ modelerHomePage, modelerCreatePage, request, operateHomePage, operateProcessInstancePage, operateProcessesPage, navigationPage, connectorMarketplacePage, connectorSettingsPage, }) => {
@@ -70,7 +70,7 @@ if (process.env.IS_MIGRATION === 'true') {
70
70
  });
71
71
  });
72
72
  });
73
- (0, SM_8_9_1.test)('Assert REST Connector Process Migration @tasklistV2', async ({ page, operateHomePage, navigationPage, operateProcessesPage, operateProcessInstancePage, }) => {
73
+ (0, SM_8_9_1.test)('Assert REST Connector Process Migration @tasklistV2', async ({ operateHomePage, navigationPage, operateProcessesPage, operateProcessInstancePage, }) => {
74
74
  SM_8_9_1.test.slow();
75
75
  const processName = 'REST_Connector_Basic_Auth_Process';
76
76
  await SM_8_9_1.test.step('View Process Instance in Operate, assert it completes and assert result expression', async () => {
@@ -79,13 +79,9 @@ if (process.env.IS_MIGRATION === 'true') {
79
79
  await operateProcessesPage.clickProcessCompletedCheckbox();
80
80
  await operateProcessesPage.clickProcessInstanceLinkWithPartialNameMatch(processName);
81
81
  await operateProcessInstancePage.completedIconAssertion();
82
- await (0, test_1.expect)(page.getByTestId('variables-list')).toBeVisible({
83
- timeout: 60000,
84
- });
85
- (0, test_1.expect)((await operateProcessInstancePage.connectorResultVariableName('message')).isVisible()).toBeTruthy();
86
- await (0, test_1.expect)(page
87
- .getByTestId('variable-message')
88
- .getByText('"Message from Mock!"')).toBeVisible({ timeout: 60000 });
82
+ await operateProcessInstancePage.assertVariablesListVisible();
83
+ await operateProcessInstancePage.connectorResultVariableName('message');
84
+ await operateProcessInstancePage.assertProcessVariableContainsText('message', '"Message from Mock!"');
89
85
  });
90
86
  });
91
87
  (0, SM_8_9_1.test)('Assert Users Persist in Management Identity With Correct Roles @tasklistV2', async ({ managementIdentityPage, identityUsersPage, }) => {
@@ -165,9 +165,7 @@ if (process.env.IS_MT === 'true') {
165
165
  await operateHomePage.clickProcessesTab();
166
166
  await operateProcessesPage.clickProcessInstanceLink(processName, 'completed');
167
167
  await operateProcessInstancePage.completedIconAssertion();
168
- await (0, test_1.expect)(page.getByTestId('variables-list')).toBeVisible({
169
- timeout: 30000,
170
- });
168
+ await operateProcessInstancePage.assertVariablesListVisible();
171
169
  await (0, test_1.expect)(page.getByText('"Awesome!"')).toBeVisible({
172
170
  timeout: 60000,
173
171
  });
@@ -309,9 +307,7 @@ if (process.env.IS_MT === 'true') {
309
307
  await operateHomePage.clickProcessesTab();
310
308
  await operateProcessesPage.clickProcessInstanceLink(processName, 'completed');
311
309
  await operateProcessInstancePage.completedIconAssertion();
312
- await (0, test_1.expect)(page.getByTestId('variables-list')).toBeVisible({
313
- timeout: 30000,
314
- });
310
+ await operateProcessInstancePage.assertVariablesListVisible();
315
311
  await (0, test_1.expect)(page.getByText('"Awesome!"')).toBeVisible({
316
312
  timeout: 60000,
317
313
  });
@@ -8,6 +8,7 @@ const optimizeReportUtils_1 = require("../../pages/SM-8.9/optimizeReportUtils");
8
8
  const loggingUtils_1 = require("../../utils/loggingUtils");
9
9
  const resetSession_1 = require("../../utils/resetSession");
10
10
  const KeycloakUtils_1 = require("../../pages/SM-8.9/KeycloakUtils");
11
+ const sleep_1 = require("../../utils/sleep");
11
12
  SM_8_9_1.test.describe.parallel('Smoke Tests', () => {
12
13
  SM_8_9_1.test.beforeEach(async ({ navigationPage, managementIdentityPage, keycloakLoginPage, keycloakAdminPage, page, browser, loginPage, ocIdentityHomePage, ocIdentityRolesPage, }, testInfo) => {
13
14
  if (process.env.IS_MIGRATION === 'true') {
@@ -130,7 +131,7 @@ SM_8_9_1.test.describe.parallel('Smoke Tests', () => {
130
131
  console.log(`[${testInfo.title}] Test end: timeout = ${testInfo.timeout}`);
131
132
  });
132
133
  // Skipped to unblock AG until failure is investigate
133
- SM_8_9_1.test.skip('Most Common REST Connector User Flow @tasklistV2', async ({ page, context, operateHomePage, modelerHomePage, modelerCreatePage, connectorSettingsPage, navigationPage, operateProcessesPage, operateProcessInstancePage, connectorMarketplacePage, }, testInfo) => {
134
+ SM_8_9_1.test.skip('Most Common REST Connector User Flow @tasklistV2', async ({ context, operateHomePage, modelerHomePage, modelerCreatePage, connectorSettingsPage, navigationPage, operateProcessesPage, operateProcessInstancePage, connectorMarketplacePage, }, testInfo) => {
134
135
  console.log(`[${testInfo.title}] Test start: timeout = ${testInfo.timeout}`);
135
136
  const processName = 'REST_Connector_Basic_Auth_Process' +
136
137
  (await (0, _setup_1.generateRandomStringAsync)(3));
@@ -144,6 +145,7 @@ SM_8_9_1.test.describe.parallel('Smoke Tests', () => {
144
145
  await SM_8_9_1.test.step('Create BPMN Diagram with REST Connector with Basic Auth and Start Process Instance', async () => {
145
146
  await (0, UtilitiesPage_1.modelRestConnector)(modelerCreatePage, connectorSettingsPage, connectorMarketplacePage, processName, 'https://camunda.proxy.beeceptor.com/pre-prod/basic-auth-test', 'basic', '{message:response.body.message}', 'result', { username: 'username', password: 'password' });
146
147
  await modelerCreatePage.runProcessInstance();
148
+ await (0, sleep_1.sleep)(3000);
147
149
  });
148
150
  await SM_8_9_1.test.step('View Process Instance in Operate, assert it completes and assert result expression', async () => {
149
151
  await navigationPage.goToOperate();
@@ -151,11 +153,9 @@ SM_8_9_1.test.describe.parallel('Smoke Tests', () => {
151
153
  await operateProcessesPage.clickProcessInstanceLink(processName, 'completed');
152
154
  const result = await operateProcessInstancePage.assertEitherIncidentOrCompletedIconVisible();
153
155
  (0, test_1.expect)(result).toBe('completed');
154
- await (0, test_1.expect)(page.getByTestId('variables-list')).toBeVisible({
155
- timeout: 60000,
156
- });
157
- (0, test_1.expect)((await operateProcessInstancePage.connectorResultVariableName('message')).isVisible()).toBeTruthy();
158
- await (0, test_1.expect)(page.getByTestId('variable-message').getByText('"Message from Mock!"')).toBeVisible({ timeout: 60000 });
156
+ await operateProcessInstancePage.assertVariablesListVisible();
157
+ await operateProcessInstancePage.connectorResultVariableName('message');
158
+ await operateProcessInstancePage.assertProcessVariableContainsText('message', '"Message from Mock!"');
159
159
  });
160
160
  console.log(`[${testInfo.title}] Test end: timeout = ${testInfo.timeout}`);
161
161
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camunda/e2e-test-suite",
3
- "version": "0.0.422",
3
+ "version": "0.0.423",
4
4
  "description": "End-to-end test helpers for Camunda 8",
5
5
  "repository": {
6
6
  "type": "git",