@camunda/e2e-test-suite 0.0.739 → 0.0.741
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.10/Authorization.js +2 -4
- package/dist/pages/SM-8.10/ConnectorSettingsPage.js +1 -1
- package/dist/pages/SM-8.10/ModelerCreatePage.d.ts +1 -0
- package/dist/pages/SM-8.10/ModelerCreatePage.js +18 -0
- package/dist/pages/SM-8.10/OCIdentityRolesPage.js +2 -2
- package/dist/pages/SM-8.10/OperateProcessesPage.js +1 -1
- package/dist/pages/SM-8.10/UtilitiesPage.js +28 -0
- package/dist/tests/SM-8.10/connectors-user-flows.spec.js +6 -6
- package/dist/utils/assertionHelpers/submitModalWithRetry.d.ts +5 -0
- package/dist/utils/assertionHelpers/submitModalWithRetry.js +29 -0
- package/package.json +1 -1
|
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.Authorization = void 0;
|
|
4
4
|
const test_1 = require("@playwright/test");
|
|
5
5
|
const UtilitiesPage_1 = require("../SM-8.10/UtilitiesPage");
|
|
6
|
+
const submitModalWithRetry_1 = require("../../utils/assertionHelpers/submitModalWithRetry");
|
|
6
7
|
const sleep_1 = require("../../utils/sleep");
|
|
7
8
|
class Authorization {
|
|
8
9
|
page;
|
|
@@ -127,10 +128,7 @@ class Authorization {
|
|
|
127
128
|
await (0, test_1.expect)(permissionInput).toBeChecked({ timeout: 3000 });
|
|
128
129
|
}
|
|
129
130
|
}
|
|
130
|
-
await this.createAuthorizationSubmitButton.
|
|
131
|
-
await (0, test_1.expect)(this.createAuthorizationModal).not.toBeVisible({
|
|
132
|
-
timeout: 10000,
|
|
133
|
-
});
|
|
131
|
+
await (0, submitModalWithRetry_1.submitModalWithRetry)(this.createAuthorizationSubmitButton, this.createAuthorizationModal);
|
|
134
132
|
await this.selectResourceTypeTab(authorization.resourceType).click();
|
|
135
133
|
const item = this.page.getByRole('row').filter({
|
|
136
134
|
hasText: `${authorization.ownerId}${authorization.resourceId}`,
|
|
@@ -24,7 +24,7 @@ class ConnectorSettingsPage {
|
|
|
24
24
|
this.resultExpressionInput = page.getByLabel('Result expression');
|
|
25
25
|
this.authenticationTypeDropdown = page.getByLabel('Type');
|
|
26
26
|
this.usernameInput = page.getByLabel('Username');
|
|
27
|
-
this.passwordInput = page.getByLabel('Password');
|
|
27
|
+
this.passwordInput = page.getByLabel('Password', { exact: true });
|
|
28
28
|
this.methodTypeDropdown = page.getByLabel('Method');
|
|
29
29
|
this.resultVariableInput = page.getByLabel('Result variable');
|
|
30
30
|
this.bearerTokenInput = page.getByLabel('Bearer token');
|
|
@@ -107,6 +107,7 @@ declare class ModelerCreatePage {
|
|
|
107
107
|
clickAppendTaskButton(): Promise<void>;
|
|
108
108
|
hoverOnLocator(locator: Locator, selector?: string): Promise<void>;
|
|
109
109
|
clickAppendGatewayButton(): Promise<void>;
|
|
110
|
+
setEngineVersion(version: string): Promise<void>;
|
|
110
111
|
clickChangeTypeButton(): Promise<void>;
|
|
111
112
|
clickUserTaskOption(): Promise<void>;
|
|
112
113
|
clickServiceTaskOption(): Promise<void>;
|
|
@@ -450,6 +450,24 @@ class ModelerCreatePage {
|
|
|
450
450
|
async clickAppendGatewayButton() {
|
|
451
451
|
await this.appendGatewayButton.click({ timeout: 90000 });
|
|
452
452
|
}
|
|
453
|
+
async setEngineVersion(version) {
|
|
454
|
+
await this.page
|
|
455
|
+
.locator('[data-test="version-selector"]')
|
|
456
|
+
.click({ timeout: 10000 });
|
|
457
|
+
// The dropdown renders each version as an outer <label> (Styled.Label)
|
|
458
|
+
// wrapping a radio input and a separate text span ("Camunda X.Y").
|
|
459
|
+
// The radio's accessible name is empty (no label prop passed), so
|
|
460
|
+
// getByRole('radio') won't resolve to the right item by text.
|
|
461
|
+
// Clicking the outer <label> containing the version string triggers
|
|
462
|
+
// the enclosed radio input's onChange via event propagation.
|
|
463
|
+
const escapedVersion = version.replace(/\./g, '\\.');
|
|
464
|
+
await this.page
|
|
465
|
+
.getByRole('radiogroup', { name: 'Camunda versions' })
|
|
466
|
+
.locator('label')
|
|
467
|
+
.filter({ hasText: new RegExp(`Camunda\\s+${escapedVersion}`) })
|
|
468
|
+
.first()
|
|
469
|
+
.click({ timeout: 5000 });
|
|
470
|
+
}
|
|
453
471
|
async clickChangeTypeButton() {
|
|
454
472
|
try {
|
|
455
473
|
await this.changeTypeButton.click({ timeout: 180000, force: true });
|
|
@@ -4,6 +4,7 @@ exports.OCIdentityRolesPage = void 0;
|
|
|
4
4
|
const test_1 = require("@playwright/test");
|
|
5
5
|
const UtilitiesPage_1 = require("../SM-8.10/UtilitiesPage");
|
|
6
6
|
const expectLocatorWithPagination_1 = require("../../utils/assertionHelpers/expectLocatorWithPagination");
|
|
7
|
+
const submitModalWithRetry_1 = require("../../utils/assertionHelpers/submitModalWithRetry");
|
|
7
8
|
const sleep_1 = require("../../utils/sleep");
|
|
8
9
|
class OCIdentityRolesPage {
|
|
9
10
|
page;
|
|
@@ -151,8 +152,7 @@ class OCIdentityRolesPage {
|
|
|
151
152
|
await (0, test_1.expect)(this.createRoleModal).toBeVisible();
|
|
152
153
|
await this.createIdField.fill(role.id);
|
|
153
154
|
await this.createNameField.fill(role.name);
|
|
154
|
-
await this.createRoleModalCreateButton.
|
|
155
|
-
await (0, test_1.expect)(this.createRoleModal).not.toBeVisible({ timeout: 60000 });
|
|
155
|
+
await (0, submitModalWithRetry_1.submitModalWithRetry)(this.createRoleModalCreateButton, this.createRoleModal);
|
|
156
156
|
await (0, expectLocatorWithPagination_1.expectLocatorWithPagination)(this.page, this.rolesList
|
|
157
157
|
.getByRole('cell', {
|
|
158
158
|
name: role.name,
|
|
@@ -247,7 +247,7 @@ class OperateProcessesPage {
|
|
|
247
247
|
const MAX_ATTEMPTS = 30;
|
|
248
248
|
const TOTAL_TIMEOUT_MS = env_1.isOpenSearch
|
|
249
249
|
? constants_1._1_MINUTE_IN_MS * 10
|
|
250
|
-
: constants_1._1_MINUTE_IN_MS *
|
|
250
|
+
: constants_1._1_MINUTE_IN_MS * 8;
|
|
251
251
|
let attempt = 0;
|
|
252
252
|
let lastError;
|
|
253
253
|
const startTime = Date.now();
|
|
@@ -162,6 +162,11 @@ async function modelRestConnector(modelerCreatePage, connectorSettingsPage, conn
|
|
|
162
162
|
}
|
|
163
163
|
await modelerCreatePage.clickAppendElementButton();
|
|
164
164
|
await modelerCreatePage.clickAppendTaskButton();
|
|
165
|
+
// The REST connector template requires engines.camunda ^8.10 (since connector v15).
|
|
166
|
+
// New diagrams default to "Check problems against: Camunda 8.9", which moves the
|
|
167
|
+
// connector into the "Requires newer Camunda version" section where clicking it
|
|
168
|
+
// has no effect. Set the diagram version to 8.10 before opening the picker.
|
|
169
|
+
await modelerCreatePage.setEngineVersion('8.10');
|
|
165
170
|
await modelerCreatePage.clickChangeTypeButton();
|
|
166
171
|
try {
|
|
167
172
|
await (0, test_1.expect)(modelerCreatePage.restConnectorOption).toBeVisible({
|
|
@@ -183,6 +188,22 @@ async function modelRestConnector(modelerCreatePage, connectorSettingsPage, conn
|
|
|
183
188
|
await modelerCreatePage.clickChangeTypeButton();
|
|
184
189
|
}
|
|
185
190
|
await modelerCreatePage.clickRestConnectorOption(recoverSession);
|
|
191
|
+
// Guard: wait for the connector settings panel to render before proceeding.
|
|
192
|
+
// On slow clusters the properties panel can take several seconds to update
|
|
193
|
+
// after the change-type click; if it doesn't appear, re-select the element
|
|
194
|
+
// and try once more before letting the tab click time out.
|
|
195
|
+
try {
|
|
196
|
+
await (0, test_1.expect)(connectorSettingsPage.authenticationTab).toBeVisible({
|
|
197
|
+
timeout: 30000,
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
catch {
|
|
201
|
+
await modelerCreatePage.secondElement
|
|
202
|
+
.click({ timeout: 30000 })
|
|
203
|
+
.catch(() => { });
|
|
204
|
+
await modelerCreatePage.clickChangeTypeButton();
|
|
205
|
+
await modelerCreatePage.clickRestConnectorOption(recoverSession);
|
|
206
|
+
}
|
|
186
207
|
await connectorSettingsPage.clickAuthenticationTab();
|
|
187
208
|
await connectorSettingsPage.clickHTTPEndpointTab();
|
|
188
209
|
if (auth == 'bearer') {
|
|
@@ -206,12 +227,19 @@ async function modelRestConnector(modelerCreatePage, connectorSettingsPage, conn
|
|
|
206
227
|
(0, test_1.expect)(basicAuthCredentials['username'].length).toBeGreaterThan(0);
|
|
207
228
|
(0, test_1.expect)(basicAuthCredentials['password'].length).toBeGreaterThan(0);
|
|
208
229
|
await connectorSettingsPage.fillUsernameInput(basicAuthCredentials['username']);
|
|
230
|
+
await (0, test_1.expect)(connectorSettingsPage.passwordInput).toBeVisible({
|
|
231
|
+
timeout: 30000,
|
|
232
|
+
});
|
|
209
233
|
await connectorSettingsPage.clickPasswordInput();
|
|
210
234
|
await connectorSettingsPage.fillPasswordInput(basicAuthCredentials['password']);
|
|
235
|
+
await (0, test_1.expect)(connectorSettingsPage.methodTypeDropdown).toBeVisible({
|
|
236
|
+
timeout: 30000,
|
|
237
|
+
});
|
|
211
238
|
await connectorSettingsPage.selectMethodType('POST');
|
|
212
239
|
}
|
|
213
240
|
await connectorSettingsPage.clickUrlInput();
|
|
214
241
|
await connectorSettingsPage.fillUrlInput(url);
|
|
242
|
+
await (0, sleep_1.sleep)(3000);
|
|
215
243
|
await connectorSettingsPage.clickOutputMappingTab();
|
|
216
244
|
if (resultVariable.length > 0) {
|
|
217
245
|
await (0, test_1.expect)(connectorSettingsPage.resultVariableInput).toBeVisible({
|
|
@@ -134,7 +134,7 @@ SM_8_10_1.test.describe('Connectors User Flow Tests @tasklistV2', () => {
|
|
|
134
134
|
(0, test_1.expect)(result).toBe('completed');
|
|
135
135
|
});
|
|
136
136
|
});
|
|
137
|
-
(0, SM_8_10_1.test)('Connector Secrets User Flow', async ({
|
|
137
|
+
(0, SM_8_10_1.test)('Connector Secrets User Flow', async ({ operateHomePage, modelerHomePage, navigationPage, modelerCreatePage, connectorSettingsPage, operateProcessInstancePage, operateProcessesPage, connectorMarketplacePage, }) => {
|
|
138
138
|
SM_8_10_1.test.slow();
|
|
139
139
|
const processName = 'REST_Connector_Process' + (await (0, _setup_1.generateRandomStringAsync)(3));
|
|
140
140
|
await SM_8_10_1.test.step('Open Cross Component Test Project and Create a BPMN Diagram Template', async () => {
|
|
@@ -143,7 +143,9 @@ SM_8_10_1.test.describe('Connectors User Flow Tests @tasklistV2', () => {
|
|
|
143
143
|
await modelerHomePage.clickBpmnTemplateOption();
|
|
144
144
|
});
|
|
145
145
|
await SM_8_10_1.test.step('Create BPMN Diagram with REST Connector using secrets and Start Process Instance', async () => {
|
|
146
|
-
await (0, UtilitiesPage_1.modelRestConnector)(modelerCreatePage, connectorSettingsPage, connectorMarketplacePage, processName, 'https://camunda.proxy.beeceptor.com/pre-prod/basic-auth-test', 'basic',
|
|
146
|
+
await (0, UtilitiesPage_1.modelRestConnector)(modelerCreatePage, connectorSettingsPage, connectorMarketplacePage, processName, 'https://camunda.proxy.beeceptor.com/pre-prod/basic-auth-test', 'basic',
|
|
147
|
+
// beeceptor basic-auth-test rule currently unconfigured — assert HTTP status instead of body
|
|
148
|
+
'{message:string(response.status)}', {
|
|
147
149
|
resultVariable: 'result',
|
|
148
150
|
basicAuthCredentials: {
|
|
149
151
|
username: '{{secrets.username}}',
|
|
@@ -159,10 +161,8 @@ SM_8_10_1.test.describe('Connectors User Flow Tests @tasklistV2', () => {
|
|
|
159
161
|
await operateProcessesPage.clickProcessInstanceLink(processName, 'completed');
|
|
160
162
|
const result = await operateProcessInstancePage.assertEitherIncidentOrCompletedIconVisible();
|
|
161
163
|
(0, test_1.expect)(result).toBe('completed');
|
|
162
|
-
await
|
|
163
|
-
|
|
164
|
-
});
|
|
165
|
-
await (0, test_1.expect)(page.getByTestId('variable-message').getByText('"Message from Mock!"')).toBeVisible({ timeout: 180000 });
|
|
164
|
+
await operateProcessInstancePage.assertResultVariableVisibleWithRetry('message');
|
|
165
|
+
await operateProcessInstancePage.assertProcessVariableContainsText('message', '"200"');
|
|
166
166
|
});
|
|
167
167
|
});
|
|
168
168
|
(0, SM_8_10_1.test)('Intermediate Event Webhook Connector No Auth User Flow', async ({ modelerHomePage, modelerCreatePage, request, operateHomePage, operateProcessInstancePage, operateProcessesPage, navigationPage, connectorMarketplacePage, connectorSettingsPage, }) => {
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.submitModalWithRetry = void 0;
|
|
4
|
+
const test_1 = require("@playwright/test");
|
|
5
|
+
// The orchestration-cluster backend intermittently returns a 500
|
|
6
|
+
// ("Failed to convert from type [java.lang.Object] to type [byte[]] for value
|
|
7
|
+
// [io.camunda.security.api.model.CamundaAuthentication]") on role and
|
|
8
|
+
// authorization creation. The modal stays open with an inline error banner and
|
|
9
|
+
// the form fields remain valid, so re-submitting recovers from the transient
|
|
10
|
+
// blip. A persistent failure exhausts the retries and is surfaced to the caller.
|
|
11
|
+
const submitModalWithRetry = async (submitButton, modal, options) => {
|
|
12
|
+
const { maxRetries = 3, closeTimeout = 20000 } = options || {};
|
|
13
|
+
let lastError;
|
|
14
|
+
for (let attempt = 1; attempt <= maxRetries; attempt++) {
|
|
15
|
+
await submitButton.click();
|
|
16
|
+
try {
|
|
17
|
+
await (0, test_1.expect)(modal).not.toBeVisible({ timeout: closeTimeout });
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
catch (error) {
|
|
21
|
+
lastError = error;
|
|
22
|
+
if (attempt < maxRetries) {
|
|
23
|
+
console.warn(`submitModalWithRetry: modal still open after attempt ${attempt}, retrying submit...`);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
throw lastError;
|
|
28
|
+
};
|
|
29
|
+
exports.submitModalWithRetry = submitModalWithRetry;
|