@camunda/e2e-test-suite 0.0.1250 → 0.0.1251
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/BrowseAllConnectorMarketplacePage.d.ts +17 -0
- package/dist/pages/BrowseAllConnectorMarketplacePage.js +145 -0
- package/dist/pages/SM-8.10/ClusterDetailsPage.d.ts +1 -1
- package/dist/pages/SM-8.10/ClusterDetailsPage.js +13 -6
- package/dist/pages/SM-8.10/ClusterPage.js +3 -1
- package/dist/pages/SM-8.10/ConnectorMarketplacePage.d.ts +2 -0
- package/dist/pages/SM-8.10/ConnectorMarketplacePage.js +16 -1
- package/dist/pages/SM-8.10/ModelerCreatePage.d.ts +4 -1
- package/dist/pages/SM-8.10/ModelerCreatePage.js +78 -51
- package/dist/pages/SM-8.10/ModelerHomePage.d.ts +2 -1
- package/dist/pages/SM-8.10/ModelerHomePage.js +24 -0
- package/dist/pages/SM-8.10/OperateHomePage.js +8 -1
- package/dist/pages/SM-8.10/OptimizeHomePage.js +13 -4
- package/dist/pages/SM-8.10/ProcessApplicationPage.d.ts +10 -5
- package/dist/pages/SM-8.10/ProcessApplicationPage.js +163 -68
- package/dist/pages/SM-8.10/UtilitiesPage.js +6 -6
- package/dist/pages/SM-8.7/NavigationPage.js +2 -1
- package/dist/tests/8.10/connectors-user-flows.spec.js +4 -2
- package/dist/tests/8.10/saas-migration-path-user-flows.spec.js +2 -1
- package/dist/tests/8.10/smoke-tests.spec.js +2 -1
- package/dist/tests/8.7/connectors-user-flows.spec.js +8 -4
- package/dist/tests/8.7/saas-migration-path-user-flows.spec.js +2 -1
- package/dist/tests/8.7/smoke-tests.spec.js +2 -1
- package/dist/tests/8.8/connectors-user-flows.spec.js +4 -2
- package/dist/tests/8.8/saas-migration-path-user-flows.spec.js +2 -1
- package/dist/tests/8.8/smoke-tests.spec.js +2 -1
- package/dist/tests/8.9/connectors-user-flows.spec.js +4 -2
- package/dist/tests/8.9/saas-migration-path-user-flows.spec.js +2 -1
- package/dist/tests/8.9/smoke-tests.spec.js +2 -1
- package/dist/tests/SM-8.10/cluster-management-user-flows.spec.js +13 -6
- package/dist/tests/SM-8.10/connectors-user-flows.spec.js +2 -1
- package/dist/tests/SM-8.10/hub-web-modeler-smoke.spec.d.ts +1 -0
- package/dist/tests/SM-8.10/hub-web-modeler-smoke.spec.js +24 -0
- package/dist/tests/SM-8.10/mt-enabled-user-flows.spec.js +3 -1
- package/dist/tests/SM-8.10/topology-orchestration-smoke.spec.d.ts +1 -0
- package/dist/tests/SM-8.10/topology-orchestration-smoke.spec.js +58 -0
- package/dist/tests/SM-8.7/topology-orchestration-smoke.spec.d.ts +1 -0
- package/dist/tests/SM-8.7/topology-orchestration-smoke.spec.js +62 -0
- package/dist/tests/SM-8.8/topology-orchestration-smoke.spec.d.ts +1 -0
- package/dist/tests/SM-8.8/topology-orchestration-smoke.spec.js +58 -0
- package/dist/tests/SM-8.9/topology-orchestration-smoke.spec.d.ts +1 -0
- package/dist/tests/SM-8.9/topology-orchestration-smoke.spec.js +58 -0
- package/dist/tests/c8Run-8.7/connectors-user-flows.spec.js +6 -3
- package/dist/tests/c8Run-8.8/connectors-user-flows.spec.js +6 -3
- package/dist/tests/c8Run-8.9/connectors-user-flows.spec.js +6 -3
- package/dist/utils/modelerCluster.d.ts +4 -6
- package/dist/utils/modelerCluster.js +55 -32
- package/package.json +1 -1
- package/playwright.config.ts +18 -5
|
@@ -12,19 +12,24 @@ declare class ProcessApplicationPage {
|
|
|
12
12
|
readonly titleBar: Locator;
|
|
13
13
|
readonly createNewDropdown: Locator;
|
|
14
14
|
readonly inlineNameInput: Locator;
|
|
15
|
-
readonly
|
|
16
|
-
readonly
|
|
17
|
-
readonly
|
|
15
|
+
readonly manageEnvironmentsHeading: Locator;
|
|
16
|
+
readonly assignedEnvironmentCards: Locator;
|
|
17
|
+
readonly editEnvironmentsButton: Locator;
|
|
18
|
+
readonly environmentEditorRegion: Locator;
|
|
19
|
+
readonly saveEnvironmentsButton: Locator;
|
|
18
20
|
constructor(page: Page);
|
|
19
21
|
private pageReady;
|
|
20
22
|
waitForProcessApplication(timeout?: number): Promise<void>;
|
|
21
23
|
clickCreateProcessApplicationButton(): Promise<void>;
|
|
22
24
|
clickCreateProcessApplicationOption(): Promise<void>;
|
|
23
25
|
nameNewProcessApplication(name: string): Promise<void>;
|
|
24
|
-
private defineDevelopmentStage;
|
|
25
26
|
rememberResourceContainer(url: string): void;
|
|
27
|
+
private workspaceEnvironmentsUrl;
|
|
26
28
|
ensureStageCluster(clusterName?: string): Promise<void>;
|
|
27
|
-
|
|
29
|
+
assignEnvironmentToWorkspace(workspaceUrl: string, clusterName?: string): Promise<void>;
|
|
30
|
+
markWorkspaceEnvironmentAssignedByAdmin(workspaceUrl: string): void;
|
|
31
|
+
private workspaceId;
|
|
32
|
+
private assignWorkspaceEnvironment;
|
|
28
33
|
openByName(name: string): Promise<void>;
|
|
29
34
|
}
|
|
30
35
|
export { ProcessApplicationPage };
|
|
@@ -6,6 +6,10 @@ const submitModalWithRetry_1 = require("../../utils/assertionHelpers/submitModal
|
|
|
6
6
|
// ModelerHomePage creates the container, while ModelerCreatePage later binds
|
|
7
7
|
// its stage. Both page objects share the same Playwright Page.
|
|
8
8
|
const resourceContainers = new WeakMap();
|
|
9
|
+
// Workspace ids whose Environment an org admin assigned from a separate session
|
|
10
|
+
// (see assignEnvironmentToWorkspace), keyed by the non-admin user's Page. That
|
|
11
|
+
// user cannot open the workspace Environments tab, so ensureStageCluster skips it.
|
|
12
|
+
const adminAssignedWorkspaces = new WeakMap();
|
|
9
13
|
// Flag-on Self-Managed 8.10 (camunda-hub#27903: workspaces-enabled=true) renamed
|
|
10
14
|
// the entity hierarchy: the legacy "project folder" is now a Workspace and the
|
|
11
15
|
// legacy "process application" is now a Project (camunda-hub#28005). A Project is
|
|
@@ -14,11 +18,19 @@ const resourceContainers = new WeakMap();
|
|
|
14
18
|
// from the workspace's projects listing via the "Create project" split button +
|
|
15
19
|
// dialog, and the app lands on `/workspace/{wsId}/projects/{projectId}`.
|
|
16
20
|
//
|
|
17
|
-
//
|
|
18
|
-
//
|
|
19
|
-
//
|
|
20
|
-
//
|
|
21
|
-
//
|
|
21
|
+
// camunda-hub#29210 ("Environments phase1") then moved cluster assignment up a
|
|
22
|
+
// level again: a Project no longer has its own "Define stages" dialog or
|
|
23
|
+
// "Connected clusters" card at all. Assignment is now an Environment (backed by
|
|
24
|
+
// a registered cluster) assigned to the whole Workspace via its Environments
|
|
25
|
+
// settings tab (`/workspaces/{wsId}/settings?tab=environments`), shared by every
|
|
26
|
+
// Project inside that Workspace.
|
|
27
|
+
//
|
|
28
|
+
// This page object owns that container's surface (creating a Project) plus the
|
|
29
|
+
// Workspace-level Environment assignment Deploy/Play need. Entering and leaving
|
|
30
|
+
// it is driven from ModelerHomePage so the ~150 existing spec call sites keep
|
|
31
|
+
// working unchanged. Method names are kept from the flag-off era
|
|
32
|
+
// ("...ProcessApplication...", "...StageCluster...") so the callers do not have
|
|
33
|
+
// to change.
|
|
22
34
|
class ProcessApplicationPage {
|
|
23
35
|
page;
|
|
24
36
|
// The workspace projects listing's "Create project" split button. exact:true
|
|
@@ -40,9 +52,15 @@ class ProcessApplicationPage {
|
|
|
40
52
|
titleBar;
|
|
41
53
|
createNewDropdown;
|
|
42
54
|
inlineNameInput;
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
55
|
+
// Workspace management -> Environments tab (camunda-hub#29210). Page-scoped,
|
|
56
|
+
// not container-scoped: this tab lives on a different page
|
|
57
|
+
// (`/workspaces/{wsId}/settings`) than the Project detail these other
|
|
58
|
+
// locators target.
|
|
59
|
+
manageEnvironmentsHeading;
|
|
60
|
+
assignedEnvironmentCards;
|
|
61
|
+
editEnvironmentsButton;
|
|
62
|
+
environmentEditorRegion;
|
|
63
|
+
saveEnvironmentsButton;
|
|
46
64
|
constructor(page) {
|
|
47
65
|
this.page = page;
|
|
48
66
|
this.createProcessApplicationButton = page
|
|
@@ -95,11 +113,20 @@ class ProcessApplicationPage {
|
|
|
95
113
|
.or(page.getByRole('button', { name: 'Create new' }))
|
|
96
114
|
.first();
|
|
97
115
|
this.inlineNameInput = page.locator('[data-test="editable-input"]');
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
this.
|
|
102
|
-
|
|
116
|
+
// "Assigned environments" heading: WorkspaceEnvironmentsTab's ready signal
|
|
117
|
+
// (it only renders once the workspace-scoped read has resolved).
|
|
118
|
+
this.manageEnvironmentsHeading = page.locator('[data-test="manage-environments-heading"]');
|
|
119
|
+
this.assignedEnvironmentCards = page.locator('[data-test="environment-card"]');
|
|
120
|
+
// Reads "Add environments" with none assigned yet, "Edit environments"
|
|
121
|
+
// otherwise -- same data-test either way.
|
|
122
|
+
this.editEnvironmentsButton = page.locator('[data-test="edit-environments-button"]');
|
|
123
|
+
this.environmentEditorRegion = page.getByRole('group', {
|
|
124
|
+
name: 'Edit assigned environments',
|
|
125
|
+
});
|
|
126
|
+
// Page-scoped, not environmentEditorRegion-scoped: Save/Cancel are
|
|
127
|
+
// rendered in the tab's header row, a SIBLING of the "Edit assigned
|
|
128
|
+
// environments" group, not a descendant of it.
|
|
129
|
+
this.saveEnvironmentsButton = page.getByRole('button', {
|
|
103
130
|
name: 'Save',
|
|
104
131
|
exact: true,
|
|
105
132
|
});
|
|
@@ -152,82 +179,150 @@ class ProcessApplicationPage {
|
|
|
152
179
|
await this.inlineNameInput.press('Enter');
|
|
153
180
|
await this.waitForProcessApplication();
|
|
154
181
|
}
|
|
155
|
-
async defineDevelopmentStage(clusterName) {
|
|
156
|
-
await (0, test_1.expect)(this.defineStagesDialog).toBeVisible({ timeout: 60000 });
|
|
157
|
-
await this.developmentClusterSelect.click({ timeout: 30000 });
|
|
158
|
-
const escapedClusterName = clusterName?.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
159
|
-
// The listbox leads with a "No cluster" entry that unassigns the stage; the
|
|
160
|
-
// placeholder "Select a development cluster" is only the trigger's text, not an
|
|
161
|
-
// option. Excluding just the placeholder leaves "No cluster" first, so an
|
|
162
|
-
// unnamed pick binds no cluster and saves defaultDevClusterId=null -- which
|
|
163
|
-
// makes the later Deploy dialog report "Clusters not configured for stages".
|
|
164
|
-
// Exclude "No cluster" too so the fallback lands on a real cluster.
|
|
165
|
-
const option = clusterName
|
|
166
|
-
? this.page
|
|
167
|
-
.getByRole('option', { name: new RegExp(`^${escapedClusterName}`) })
|
|
168
|
-
.first()
|
|
169
|
-
: this.page
|
|
170
|
-
.getByRole('option')
|
|
171
|
-
.filter({ hasNotText: 'Select a development cluster' })
|
|
172
|
-
.filter({ hasNotText: 'No cluster' })
|
|
173
|
-
.first();
|
|
174
|
-
await option.click({ timeout: 30000 });
|
|
175
|
-
await this.defineStagesSaveButton.click({ timeout: 30000 });
|
|
176
|
-
await (0, test_1.expect)(this.defineStagesDialog).toBeHidden({ timeout: 60000 });
|
|
177
|
-
}
|
|
178
182
|
rememberResourceContainer(url) {
|
|
179
183
|
resourceContainers.set(this.page, { url });
|
|
180
184
|
}
|
|
185
|
+
// Derives the shared Workspace's Environments settings URL from a Project
|
|
186
|
+
// detail URL (".../workspaces/<wsId>/projects/<projectId>[?...]"): the
|
|
187
|
+
// origin/app-root plus "/workspaces/<wsId>/settings?tab=environments" -- the
|
|
188
|
+
// same deep link camunda-hub's own useManageEnvironmentsLink builds for the
|
|
189
|
+
// deploy dialog's "Manage environments" link. Always emits the plural
|
|
190
|
+
// "workspaces" regardless of which spelling the container URL used
|
|
191
|
+
// (ModelerHomePage.openWorkspaceTile still tolerates a singular
|
|
192
|
+
// "/workspace/<id>/projects" from camunda-hub#28928 not yet being merged
|
|
193
|
+
// everywhere) -- the settings route itself (App.tsx) is plural-only, with no
|
|
194
|
+
// singular alias, so reusing a singular prefix verbatim would 404.
|
|
195
|
+
workspaceEnvironmentsUrl(containerUrl) {
|
|
196
|
+
const match = containerUrl.match(/^(.*)\/workspaces?\/([^/?#]+)\//);
|
|
197
|
+
if (!match) {
|
|
198
|
+
throw new Error(`Could not derive the workspace Environments URL from "${containerUrl}": ` +
|
|
199
|
+
'expected a "/workspaces/<id>/..." segment.');
|
|
200
|
+
}
|
|
201
|
+
const [, origin, workspaceId] = match;
|
|
202
|
+
return `${origin}/workspaces/${workspaceId}/settings?tab=environments`;
|
|
203
|
+
}
|
|
204
|
+
// Assigns an Environment to the shared Workspace via its Environments
|
|
205
|
+
// settings tab, so Deploy/Play (and Play's "Configure environment") find a
|
|
206
|
+
// usable target instead of rendering "No environments assigned" and staying
|
|
207
|
+
// disabled -- camunda-hub#29210 moved this out of the Project detail's own
|
|
208
|
+
// "Define stages" dialog and up to the Workspace, shared by every Project
|
|
209
|
+
// inside it.
|
|
210
|
+
//
|
|
211
|
+
// Checks the read-only "Assigned environments" list before entering edit
|
|
212
|
+
// mode, so a Workspace another (parallel) test already assigned is left
|
|
213
|
+
// alone regardless of this Page's own memo flag below -- required because
|
|
214
|
+
// every test's Project lives in the one shared Workspace. This is a
|
|
215
|
+
// best-effort check, not a lock: two tests racing to assign at once each
|
|
216
|
+
// still write their own snapshot of the selected set (Save persists the
|
|
217
|
+
// whole set, it does not merge), so a genuine concurrent race could still
|
|
218
|
+
// trigger two writes. It converges correctly here only because every test
|
|
219
|
+
// targets the one MODELER_CLUSTER_NAME (or, when unset, is happy with
|
|
220
|
+
// whichever single Environment ends up assigned).
|
|
181
221
|
async ensureStageCluster(clusterName) {
|
|
182
222
|
const container = resourceContainers.get(this.page);
|
|
183
223
|
if (!container ||
|
|
184
224
|
(container.stageBound && container.developmentCluster === clusterName)) {
|
|
185
225
|
return;
|
|
186
226
|
}
|
|
227
|
+
if (adminAssignedWorkspaces
|
|
228
|
+
.get(this.page)
|
|
229
|
+
?.has(this.workspaceId(container.url))) {
|
|
230
|
+
container.stageBound = true;
|
|
231
|
+
container.developmentCluster = clusterName;
|
|
232
|
+
return;
|
|
233
|
+
}
|
|
187
234
|
const returnTo = this.page.url();
|
|
188
|
-
|
|
189
|
-
// "Connected clusters" card lives in the Project detail's sidebar and its
|
|
190
|
-
// "Configure" button opens the Define stages modal (see camunda-hub
|
|
191
|
-
// ConnectedClustersDs). So navigate to the Project detail itself and let
|
|
192
|
-
// openStageDefinition() click that button.
|
|
193
|
-
const processApplicationUrl = container.url
|
|
194
|
-
.replace(/[?#].*$/, '')
|
|
195
|
-
.replace(/\/$/, '');
|
|
196
|
-
await (0, test_1.expect)(async () => {
|
|
197
|
-
await this.page.goto(processApplicationUrl, {
|
|
198
|
-
waitUntil: 'domcontentloaded',
|
|
199
|
-
});
|
|
200
|
-
await this.waitForProcessApplication();
|
|
201
|
-
await this.openStageDefinition();
|
|
202
|
-
await this.defineDevelopmentStage(clusterName);
|
|
203
|
-
}).toPass({ timeout: 240000, intervals: [1000, 2000, 5000] });
|
|
235
|
+
await this.assignEnvironmentToWorkspace(container.url, clusterName);
|
|
204
236
|
container.stageBound = true;
|
|
205
237
|
container.developmentCluster = clusterName;
|
|
206
238
|
await this.page.goto(returnTo, { waitUntil: 'domcontentloaded' });
|
|
207
239
|
}
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
240
|
+
// Assigns an Environment to the workspace that `workspaceUrl` (any
|
|
241
|
+
// "/workspaces/<id>/..." URL) belongs to, driving this Page's own session.
|
|
242
|
+
async assignEnvironmentToWorkspace(workspaceUrl, clusterName) {
|
|
243
|
+
const environmentsUrl = this.workspaceEnvironmentsUrl(workspaceUrl);
|
|
244
|
+
await (0, test_1.expect)(async () => {
|
|
245
|
+
await this.page.goto(environmentsUrl, { waitUntil: 'domcontentloaded' });
|
|
246
|
+
await this.assignWorkspaceEnvironment(clusterName);
|
|
247
|
+
}).toPass({ timeout: 240000, intervals: [1000, 2000, 5000] });
|
|
248
|
+
}
|
|
249
|
+
markWorkspaceEnvironmentAssignedByAdmin(workspaceUrl) {
|
|
250
|
+
const assigned = adminAssignedWorkspaces.get(this.page) ?? new Set();
|
|
251
|
+
assigned.add(this.workspaceId(workspaceUrl));
|
|
252
|
+
adminAssignedWorkspaces.set(this.page, assigned);
|
|
253
|
+
}
|
|
254
|
+
workspaceId(workspaceUrl) {
|
|
255
|
+
const match = workspaceUrl.match(/\/workspaces?\/([^/?#]+)\//);
|
|
256
|
+
if (!match) {
|
|
257
|
+
throw new Error(`Could not derive the workspace id from "${workspaceUrl}": ` +
|
|
258
|
+
'expected a "/workspaces/<id>/..." segment.');
|
|
259
|
+
}
|
|
260
|
+
return match[1];
|
|
261
|
+
}
|
|
262
|
+
async assignWorkspaceEnvironment(clusterName) {
|
|
263
|
+
const tabReady = await this.manageEnvironmentsHeading
|
|
264
|
+
.or(this.editEnvironmentsButton)
|
|
265
|
+
.first()
|
|
266
|
+
.waitFor({ state: 'visible', timeout: 90000 })
|
|
211
267
|
.then(() => true)
|
|
212
268
|
.catch(() => false);
|
|
213
|
-
if (
|
|
269
|
+
if (!tabReady) {
|
|
270
|
+
// WorkspaceManageBody silently normalises an unrecognised/unusable
|
|
271
|
+
// "?tab=environments" back to Members -- e.g. isEnvironmentsEnabled()
|
|
272
|
+
// off, or the current user failing canManageWorkspaceEnvironments
|
|
273
|
+
// (assigning is stricter than viewing: a plain Editor with no
|
|
274
|
+
// elevated/DevOps org role cannot assign at all). Name the likely
|
|
275
|
+
// cause rather than timing out with an opaque "not visible".
|
|
276
|
+
const onMembersTab = await this.page
|
|
277
|
+
.locator('[data-test="tab-members"][data-state="active"]')
|
|
278
|
+
.isVisible()
|
|
279
|
+
.catch(() => false);
|
|
280
|
+
throw new Error('The workspace Environments settings tab never rendered' +
|
|
281
|
+
(onMembersTab ? ' -- landed on the Members tab instead' : '') +
|
|
282
|
+
'. Either the Environments feature is off for this deployment, or the ' +
|
|
283
|
+
"current user lacks permission to manage this workspace's environments.");
|
|
284
|
+
}
|
|
285
|
+
const alreadyAssigned = clusterName
|
|
286
|
+
? this.assignedEnvironmentCards.filter({ hasText: clusterName })
|
|
287
|
+
: this.assignedEnvironmentCards;
|
|
288
|
+
if (await alreadyAssigned
|
|
289
|
+
.first()
|
|
290
|
+
.isVisible()
|
|
291
|
+
.catch(() => false)) {
|
|
214
292
|
return;
|
|
215
293
|
}
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
const
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
294
|
+
await this.editEnvironmentsButton.click({ timeout: 30000 });
|
|
295
|
+
await (0, test_1.expect)(this.environmentEditorRegion).toBeVisible({ timeout: 30000 });
|
|
296
|
+
const escapedClusterName = clusterName?.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
297
|
+
// A picker card's toggle button is "Select <name> (<clusterName or
|
|
298
|
+
// clusterId>)" (see camunda-hub EnvironmentPickerCard) -- match the
|
|
299
|
+
// cluster name in that parenthetical rather than the environment's own
|
|
300
|
+
// display name, which is a separate, admin-chosen field that need not
|
|
301
|
+
// match the cluster at all.
|
|
302
|
+
const targetOption = clusterName
|
|
303
|
+
? this.environmentEditorRegion
|
|
304
|
+
.getByRole('button', {
|
|
305
|
+
name: new RegExp(`^Select .*\\(${escapedClusterName}\\)`),
|
|
306
|
+
})
|
|
307
|
+
.first()
|
|
308
|
+
: this.environmentEditorRegion
|
|
309
|
+
.getByRole('button', { name: /^Select / })
|
|
310
|
+
.first();
|
|
311
|
+
const optionAppeared = await targetOption
|
|
312
|
+
.waitFor({ state: 'visible', timeout: 30000 })
|
|
223
313
|
.then(() => true)
|
|
224
314
|
.catch(() => false);
|
|
225
|
-
if (!
|
|
226
|
-
throw new Error(
|
|
227
|
-
|
|
228
|
-
|
|
315
|
+
if (!optionAppeared) {
|
|
316
|
+
throw new Error(clusterName
|
|
317
|
+
? `No Environment backed by cluster "${clusterName}" is available to assign to this ` +
|
|
318
|
+
'workspace. Register the cluster (or its Environment) first.'
|
|
319
|
+
: 'No Environment is available to assign to this workspace: the picker shows "No ' +
|
|
320
|
+
'environments available".');
|
|
229
321
|
}
|
|
230
|
-
await
|
|
322
|
+
await targetOption.click({ timeout: 30000 });
|
|
323
|
+
await (0, test_1.expect)(this.saveEnvironmentsButton).toBeEnabled({ timeout: 30000 });
|
|
324
|
+
await this.saveEnvironmentsButton.click({ timeout: 30000 });
|
|
325
|
+
await (0, test_1.expect)(this.environmentEditorRegion).toBeHidden({ timeout: 60000 });
|
|
231
326
|
}
|
|
232
327
|
async openByName(name) {
|
|
233
328
|
// Workspace-mode projects table: the whole row is the click target (see the
|
|
@@ -207,12 +207,12 @@ async function modelRestConnector(modelerCreatePage, connectorSettingsPage, conn
|
|
|
207
207
|
await (0, test_1.expect)(modelerCreatePage.changeElementSearchInput).toBeVisible({
|
|
208
208
|
timeout: 30000,
|
|
209
209
|
});
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
await modelerCreatePage.
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
}
|
|
210
|
+
// Connector templates are listed under the popup's "Reusable assets" tab;
|
|
211
|
+
// revealChangeElementTemplate selects it before falling back to search.
|
|
212
|
+
const revealed = await modelerCreatePage.revealChangeElementTemplate(modelerCreatePage.restConnectorOption, 'Send REST Request');
|
|
213
|
+
if (!revealed) {
|
|
214
|
+
throw new Error('Bundled REST connector template not listed');
|
|
215
|
+
}
|
|
216
216
|
}
|
|
217
217
|
catch (error) {
|
|
218
218
|
await modelerCreatePage.clickMarketPlaceButton();
|
|
@@ -6,6 +6,7 @@ const LoginPage_1 = require("./LoginPage");
|
|
|
6
6
|
const sleep_1 = require("../../utils/sleep");
|
|
7
7
|
const constants_1 = require("../../utils/constants");
|
|
8
8
|
const KeycloakUtils_1 = require("../SM-8.7/KeycloakUtils");
|
|
9
|
+
const OPTIMIZE_CONTEXT_PATH = process.env.OPTIMIZE_CONTEXT_PATH || '/optimize';
|
|
9
10
|
class NavigationPage {
|
|
10
11
|
page;
|
|
11
12
|
modelerPageBanner;
|
|
@@ -131,7 +132,7 @@ class NavigationPage {
|
|
|
131
132
|
await this.goTo('/operate', this.operatePageBanner, sleepTimeout);
|
|
132
133
|
}
|
|
133
134
|
async goToOptimize(sleepTimeout) {
|
|
134
|
-
await this.goTo(
|
|
135
|
+
await this.goTo(OPTIMIZE_CONTEXT_PATH, this.optimizePageBanner, sleepTimeout);
|
|
135
136
|
}
|
|
136
137
|
async goToKeycloak(maxRetries = 5) {
|
|
137
138
|
const keycloakUrl = process.env.KEYCLOAK_URL
|
|
@@ -25,7 +25,8 @@ _8_10_1.test.describe('Connectors User Flow Tests @tasklistV2', () => {
|
|
|
25
25
|
await (0, _setup_1.captureScreenshot)(page, testInfo);
|
|
26
26
|
await (0, _setup_1.captureFailureVideo)(page, testInfo);
|
|
27
27
|
});
|
|
28
|
-
|
|
28
|
+
// Skipped due to bug #3673: https://github.com/camunda/c8-cross-component-e2e-tests/issues/3673
|
|
29
|
+
_8_10_1.test.skip('REST Connector No Auth User Flow', async ({ page, homePage, modelerHomePage, appsPage, modelerCreatePage, connectorSettingsPage, }) => {
|
|
29
30
|
_8_10_1.test.slow();
|
|
30
31
|
const processName = 'REST_Connector_No_Auth_Process' + (await (0, _setup_1.generateRandomStringAsync)(3));
|
|
31
32
|
await _8_10_1.test.step('Navigate to Web Modeler', async () => {
|
|
@@ -78,7 +79,8 @@ _8_10_1.test.describe('Connectors User Flow Tests @tasklistV2', () => {
|
|
|
78
79
|
});
|
|
79
80
|
});
|
|
80
81
|
});
|
|
81
|
-
|
|
82
|
+
// Skipped due to bug #3673: https://github.com/camunda/c8-cross-component-e2e-tests/issues/3673
|
|
83
|
+
_8_10_1.test.skip('REST Connector Bearer Token Auth User Flow', async ({ page, homePage, modelerHomePage, appsPage, modelerCreatePage, connectorSettingsPage, }) => {
|
|
82
84
|
_8_10_1.test.slow();
|
|
83
85
|
const processName = 'REST_Connector_Bearer_Auth_Process' +
|
|
84
86
|
(await (0, _setup_1.generateRandomStringAsync)(3));
|
|
@@ -110,7 +110,8 @@ _8_10_1.test.describe('SaaS Migration Path Tests', () => {
|
|
|
110
110
|
await (0, test_1.expect)(page.getByRole('cell', { name: 'Admin' })).toBeVisible();
|
|
111
111
|
});
|
|
112
112
|
});
|
|
113
|
-
|
|
113
|
+
// Skipped due to bug #3673: https://github.com/camunda/c8-cross-component-e2e-tests/issues/3673
|
|
114
|
+
_8_10_1.test.skip('Assert Connectors Still Function After SaaS Upgrade @tasklistV2', async ({ operateHomePage, appsPage, operateProcessesPage, operateProcessInstancePage, }) => {
|
|
114
115
|
_8_10_1.test.slow();
|
|
115
116
|
// Use the same fixed name that was created in the pre-upgrade smoke tests
|
|
116
117
|
const processName = 'REST_Connector_Basic_Auth_ProcessUpgradeTest';
|
|
@@ -292,7 +292,8 @@ _8_10_1.test.describe('Smoke Tests', () => {
|
|
|
292
292
|
await optimizeReportPage.assertUserTaskInstanceCountWithRetry(2, appTab, countRetries, Math.floor(flowBudget(countRetries * constants_1.TIMEOUT.navigation) / countRetries));
|
|
293
293
|
});
|
|
294
294
|
});
|
|
295
|
-
|
|
295
|
+
// Skipped due to bug #3673: https://github.com/camunda/c8-cross-component-e2e-tests/issues/3673
|
|
296
|
+
_8_10_1.test.skip('Most Common REST Connector User Flow', async ({ page, loginPage, homePage, modelerHomePage, appsPage, modelerCreatePage, connectorSettingsPage, }, testInfo) => {
|
|
296
297
|
_8_10_1.test.slow();
|
|
297
298
|
const randomString = await (0, _setup_1.generateRandomStringAsync)(3);
|
|
298
299
|
const processName = 'REST_Connector_Basic_Auth_Process' + randomString;
|
|
@@ -22,7 +22,8 @@ _8_7_1.test.describe('Connectors User Flow Tests', () => {
|
|
|
22
22
|
await (0, _setup_1.captureScreenshot)(page, testInfo);
|
|
23
23
|
await (0, _setup_1.captureFailureVideo)(page, testInfo);
|
|
24
24
|
});
|
|
25
|
-
|
|
25
|
+
// Skipped due to bug #3673: https://github.com/camunda/c8-cross-component-e2e-tests/issues/3673
|
|
26
|
+
_8_7_1.test.skip('REST Connector No Auth User Flow', async ({ page, homePage, modelerHomePage, appsPage, modelerCreatePage, connectorSettingsPage, }) => {
|
|
26
27
|
_8_7_1.test.slow();
|
|
27
28
|
const processName = 'REST_Connector_No_Auth_Process' + (await (0, _setup_1.generateRandomStringAsync)(3));
|
|
28
29
|
await _8_7_1.test.step('Navigate to Web Modeler', async () => {
|
|
@@ -59,7 +60,8 @@ _8_7_1.test.describe('Connectors User Flow Tests', () => {
|
|
|
59
60
|
});
|
|
60
61
|
});
|
|
61
62
|
});
|
|
62
|
-
|
|
63
|
+
// Skipped due to bug #3673: https://github.com/camunda/c8-cross-component-e2e-tests/issues/3673
|
|
64
|
+
_8_7_1.test.skip('REST Connector Bearer Token Auth User Flow', async ({ page, homePage, modelerHomePage, appsPage, modelerCreatePage, connectorSettingsPage, }) => {
|
|
63
65
|
_8_7_1.test.slow();
|
|
64
66
|
const processName = 'REST_Connector_Bearer_Auth_Process' +
|
|
65
67
|
(await (0, _setup_1.generateRandomStringAsync)(3));
|
|
@@ -160,7 +162,8 @@ _8_7_1.test.describe('Connectors User Flow Tests', () => {
|
|
|
160
162
|
await (0, UtilitiesPage_1.assertLocatorVisibleWithRetry)(operateProcessInstancePage, operateProcessInstancePage.completedIcon, 'Completed icon', 60000);
|
|
161
163
|
});
|
|
162
164
|
});
|
|
163
|
-
|
|
165
|
+
// Skipped due to bug #3673: https://github.com/camunda/c8-cross-component-e2e-tests/issues/3673
|
|
166
|
+
_8_7_1.test.skip('Connector Secrets User Flow - GCP', async ({ page, homePage, modelerHomePage, appsPage, modelerCreatePage, connectorSettingsPage, clusterPage, clusterSecretsPage, }) => {
|
|
164
167
|
_8_7_1.test.slow();
|
|
165
168
|
const processName = 'REST_Connector_Process' + (await (0, _setup_1.generateRandomStringAsync)(3));
|
|
166
169
|
await _8_7_1.test.step('Navigate to Cluster Secrets', async () => {
|
|
@@ -212,7 +215,8 @@ _8_7_1.test.describe('Connectors User Flow Tests', () => {
|
|
|
212
215
|
.getByText('"Message from Mock!"'), 'Connector response message', 60000);
|
|
213
216
|
});
|
|
214
217
|
});
|
|
215
|
-
|
|
218
|
+
// Skipped due to bug #3673: https://github.com/camunda/c8-cross-component-e2e-tests/issues/3673
|
|
219
|
+
_8_7_1.test.skip('Connector Secrets User Flow - AWS', async ({ page, homePage, modelerHomePage, appsPage, modelerCreatePage, connectorSettingsPage, clusterPage, clusterSecretsPage, operateHomePage, operateProcessesPage, operateProcessInstancePage, }) => {
|
|
216
220
|
_8_7_1.test.slow();
|
|
217
221
|
const processName = 'REST_Connector_Process' + (await (0, _setup_1.generateRandomStringAsync)(3));
|
|
218
222
|
await _8_7_1.test.step('Navigate to Cluster Secrets', async () => {
|
|
@@ -134,7 +134,8 @@ _8_7_1.test.describe('SaaS Migration Path Tests', () => {
|
|
|
134
134
|
});
|
|
135
135
|
});
|
|
136
136
|
});
|
|
137
|
-
|
|
137
|
+
// Skipped due to bug #3673: https://github.com/camunda/c8-cross-component-e2e-tests/issues/3673
|
|
138
|
+
_8_7_1.test.skip('Assert Connectors Still Function After SaaS Upgrade', async ({ operateHomePage, appsPage, operateProcessesPage, operateProcessInstancePage, }) => {
|
|
138
139
|
_8_7_1.test.slow();
|
|
139
140
|
// Use the same fixed name that was created in the pre-upgrade smoke tests
|
|
140
141
|
const processName = 'REST_Connector_Basic_Auth_ProcessUpgradeTest';
|
|
@@ -188,7 +188,8 @@ _8_7_1.test.describe('Smoke Tests', () => {
|
|
|
188
188
|
});
|
|
189
189
|
});
|
|
190
190
|
});
|
|
191
|
-
|
|
191
|
+
// Skipped due to bug #3673: https://github.com/camunda/c8-cross-component-e2e-tests/issues/3673
|
|
192
|
+
_8_7_1.test.skip('Most Common REST Connector User Flow', async ({ page, loginPage, homePage, modelerHomePage, appsPage, modelerCreatePage, connectorSettingsPage, }, testInfo) => {
|
|
192
193
|
_8_7_1.test.slow();
|
|
193
194
|
const randomString = useFixedNames
|
|
194
195
|
? 'UpgradeTest'
|
|
@@ -23,7 +23,8 @@ _8_8_1.test.describe('Connectors User Flow Tests @tasklistV2', () => {
|
|
|
23
23
|
await (0, _setup_1.captureScreenshot)(page, testInfo);
|
|
24
24
|
await (0, _setup_1.captureFailureVideo)(page, testInfo);
|
|
25
25
|
});
|
|
26
|
-
|
|
26
|
+
// Skipped due to bug #3673: https://github.com/camunda/c8-cross-component-e2e-tests/issues/3673
|
|
27
|
+
_8_8_1.test.skip('REST Connector No Auth User Flow', async ({ page, homePage, modelerHomePage, appsPage, modelerCreatePage, connectorSettingsPage, }) => {
|
|
27
28
|
_8_8_1.test.slow();
|
|
28
29
|
const processName = 'REST_Connector_No_Auth_Process' + (await (0, _setup_1.generateRandomStringAsync)(3));
|
|
29
30
|
await _8_8_1.test.step('Navigate to Web Modeler', async () => {
|
|
@@ -60,7 +61,8 @@ _8_8_1.test.describe('Connectors User Flow Tests @tasklistV2', () => {
|
|
|
60
61
|
});
|
|
61
62
|
});
|
|
62
63
|
});
|
|
63
|
-
|
|
64
|
+
// Skipped due to bug #3673: https://github.com/camunda/c8-cross-component-e2e-tests/issues/3673
|
|
65
|
+
_8_8_1.test.skip('REST Connector Bearer Token Auth User Flow', async ({ page, homePage, modelerHomePage, appsPage, modelerCreatePage, connectorSettingsPage, }) => {
|
|
64
66
|
_8_8_1.test.slow();
|
|
65
67
|
const processName = 'REST_Connector_Bearer_Auth_Process' +
|
|
66
68
|
(await (0, _setup_1.generateRandomStringAsync)(3));
|
|
@@ -155,7 +155,8 @@ _8_8_1.test.describe('SaaS Migration Path Tests', () => {
|
|
|
155
155
|
await (0, test_1.expect)(page.getByRole('cell', { name: 'Admin' })).toBeVisible();
|
|
156
156
|
});
|
|
157
157
|
});
|
|
158
|
-
|
|
158
|
+
// Skipped due to bug #3673: https://github.com/camunda/c8-cross-component-e2e-tests/issues/3673
|
|
159
|
+
_8_8_1.test.skip('Assert Connectors Still Function After SaaS Upgrade', async ({ operateHomePage, appsPage, operateProcessesPage, operateProcessInstancePage, }) => {
|
|
159
160
|
_8_8_1.test.slow();
|
|
160
161
|
// Use the same fixed name that was created in the pre-upgrade smoke tests
|
|
161
162
|
const processName = 'REST_Connector_Basic_Auth_ProcessUpgradeTest';
|
|
@@ -170,7 +170,8 @@ _8_8_1.test.describe('Smoke Tests', () => {
|
|
|
170
170
|
});
|
|
171
171
|
});
|
|
172
172
|
});
|
|
173
|
-
|
|
173
|
+
// Skipped due to bug #3673: https://github.com/camunda/c8-cross-component-e2e-tests/issues/3673
|
|
174
|
+
_8_8_1.test.skip('Most Common REST Connector User Flow', async ({ page, modelerHomePage, appsPage, modelerCreatePage, connectorSettingsPage, }) => {
|
|
174
175
|
_8_8_1.test.slow();
|
|
175
176
|
const randomString = useFixedNames
|
|
176
177
|
? 'UpgradeTest'
|
|
@@ -24,7 +24,8 @@ _8_9_1.test.describe('Connectors User Flow Tests @tasklistV2', () => {
|
|
|
24
24
|
await (0, _setup_1.captureScreenshot)(page, testInfo);
|
|
25
25
|
await (0, _setup_1.captureFailureVideo)(page, testInfo);
|
|
26
26
|
});
|
|
27
|
-
|
|
27
|
+
// Skipped due to bug #3673: https://github.com/camunda/c8-cross-component-e2e-tests/issues/3673
|
|
28
|
+
_8_9_1.test.skip('REST Connector No Auth User Flow', async ({ page, homePage, modelerHomePage, appsPage, modelerCreatePage, connectorSettingsPage, }) => {
|
|
28
29
|
_8_9_1.test.slow();
|
|
29
30
|
const processName = 'REST_Connector_No_Auth_Process' + (await (0, _setup_1.generateRandomStringAsync)(3));
|
|
30
31
|
await _8_9_1.test.step('Navigate to Web Modeler', async () => {
|
|
@@ -64,7 +65,8 @@ _8_9_1.test.describe('Connectors User Flow Tests @tasklistV2', () => {
|
|
|
64
65
|
});
|
|
65
66
|
});
|
|
66
67
|
});
|
|
67
|
-
|
|
68
|
+
// Skipped due to bug #3673: https://github.com/camunda/c8-cross-component-e2e-tests/issues/3673
|
|
69
|
+
_8_9_1.test.skip('REST Connector Bearer Token Auth User Flow', async ({ page, homePage, modelerHomePage, appsPage, modelerCreatePage, connectorSettingsPage, }) => {
|
|
68
70
|
_8_9_1.test.slow();
|
|
69
71
|
const processName = 'REST_Connector_Bearer_Auth_Process' +
|
|
70
72
|
(await (0, _setup_1.generateRandomStringAsync)(3));
|
|
@@ -155,7 +155,8 @@ _8_9_1.test.describe('SaaS Migration Path Tests', () => {
|
|
|
155
155
|
await (0, test_1.expect)(page.getByRole('cell', { name: 'Admin' })).toBeVisible();
|
|
156
156
|
});
|
|
157
157
|
});
|
|
158
|
-
|
|
158
|
+
// Skipped due to bug #3673: https://github.com/camunda/c8-cross-component-e2e-tests/issues/3673
|
|
159
|
+
_8_9_1.test.skip('Assert Connectors Still Function After SaaS Upgrade @tasklistV2', async ({ operateHomePage, appsPage, operateProcessesPage, operateProcessInstancePage, }) => {
|
|
159
160
|
_8_9_1.test.slow();
|
|
160
161
|
// Use the same fixed name that was created in the pre-upgrade smoke tests
|
|
161
162
|
const processName = 'REST_Connector_Basic_Auth_ProcessUpgradeTest';
|
|
@@ -181,7 +181,8 @@ _8_9_1.test.describe('Smoke Tests', () => {
|
|
|
181
181
|
});
|
|
182
182
|
});
|
|
183
183
|
});
|
|
184
|
-
|
|
184
|
+
// Skipped due to bug #3673: https://github.com/camunda/c8-cross-component-e2e-tests/issues/3673
|
|
185
|
+
_8_9_1.test.skip('Most Common REST Connector User Flow', async ({ page, modelerHomePage, appsPage, modelerCreatePage, connectorSettingsPage, }) => {
|
|
185
186
|
_8_9_1.test.slow();
|
|
186
187
|
const randomString = useFixedNames
|
|
187
188
|
? 'UpgradeTest'
|
|
@@ -5,7 +5,11 @@ const _setup_1 = require("../../test-setup.js");
|
|
|
5
5
|
const test_1 = require("@playwright/test");
|
|
6
6
|
SM_8_10_1.test.describe.configure({ mode: 'parallel' });
|
|
7
7
|
SM_8_10_1.test.describe('Cluster Management User Flow Tests', () => {
|
|
8
|
-
|
|
8
|
+
// The cluster is configured with tags dev/custom/stage/prod/test, but the
|
|
9
|
+
// Environments/Clusters UI renders recognized lifecycle tags capitalized
|
|
10
|
+
// (Dev/Stage/Prod/Test) while an unrecognized tag like "custom" renders
|
|
11
|
+
// verbatim — assert what's actually displayed.
|
|
12
|
+
const expectedTagLabels = ['Dev', 'custom', 'Stage', 'Prod', 'Test'];
|
|
9
13
|
const customPropertyDescription = 'This is the main integration environment for the Camunda Platform.';
|
|
10
14
|
SM_8_10_1.test.beforeEach(async ({ navigationPage }, testInfo) => {
|
|
11
15
|
await navigationPage.goToClusters((testInfo.workerIndex + 1) * 1000);
|
|
@@ -16,11 +20,11 @@ SM_8_10_1.test.describe('Cluster Management User Flow Tests', () => {
|
|
|
16
20
|
});
|
|
17
21
|
(0, SM_8_10_1.test)('Custom Tags', async ({ clusterPage }) => {
|
|
18
22
|
await SM_8_10_1.test.step('Ensure Custom Tags Appear in Cluster List', async () => {
|
|
19
|
-
await clusterPage.assertCustomTagsAreVisible(
|
|
23
|
+
await clusterPage.assertCustomTagsAreVisible(expectedTagLabels);
|
|
20
24
|
});
|
|
21
25
|
await SM_8_10_1.test.step('Ensure Custom Tags Appear in Cluster Details', async () => {
|
|
22
26
|
await clusterPage.clickClusterLink();
|
|
23
|
-
await clusterPage.assertCustomTagsAreVisible(
|
|
27
|
+
await clusterPage.assertCustomTagsAreVisible(expectedTagLabels);
|
|
24
28
|
});
|
|
25
29
|
});
|
|
26
30
|
(0, SM_8_10_1.test)('Custom Properties', async ({ clusterPage, clusterDetailsPage, page }) => {
|
|
@@ -28,14 +32,17 @@ SM_8_10_1.test.describe('Cluster Management User Flow Tests', () => {
|
|
|
28
32
|
await clusterPage.clickClusterLink();
|
|
29
33
|
});
|
|
30
34
|
await SM_8_10_1.test.step('Ensure Custom Properties Appear in Modeler and Navigates Links', async () => {
|
|
31
|
-
await (0, test_1.expect)(clusterDetailsPage.
|
|
35
|
+
await (0, test_1.expect)(clusterDetailsPage.clusterDetailsHeading).toBeVisible({
|
|
32
36
|
timeout: 60000,
|
|
33
37
|
});
|
|
34
38
|
await (0, test_1.expect)(page.getByText(customPropertyDescription)).toBeVisible({
|
|
35
39
|
timeout: 60000,
|
|
36
40
|
});
|
|
37
|
-
|
|
38
|
-
|
|
41
|
+
// Both links belong to the same custom property (one description, two
|
|
42
|
+
// links), so both are looked up by that shared description rather than
|
|
43
|
+
// by a per-link row title.
|
|
44
|
+
await clusterDetailsPage.assertCustomPropertyIsNavigated(customPropertyDescription, 'Camunda', /^https:\/\/(www\.)?camunda\.com\/?$/);
|
|
45
|
+
await clusterDetailsPage.assertCustomPropertyIsNavigated(customPropertyDescription, 'Camunda Docs', 'https://docs.camunda.io');
|
|
39
46
|
});
|
|
40
47
|
});
|
|
41
48
|
});
|
|
@@ -44,7 +44,8 @@ SM_8_10_1.test.describe('Connectors User Flow Tests @tasklistV2', () => {
|
|
|
44
44
|
});
|
|
45
45
|
});
|
|
46
46
|
});
|
|
47
|
-
|
|
47
|
+
// Skipped due to bug #3673: https://github.com/camunda/c8-cross-component-e2e-tests/issues/3673
|
|
48
|
+
SM_8_10_1.test.skip('REST Connector Bearer Token Auth User Flow', async ({ page, operateHomePage, modelerHomePage, modelerCreatePage, connectorSettingsPage, navigationPage, operateProcessInstancePage, operateProcessesPage, connectorMarketplacePage, }) => {
|
|
48
49
|
SM_8_10_1.test.slow();
|
|
49
50
|
const processName = 'REST_Connector_Bearer_Auth_Process' +
|
|
50
51
|
(await (0, _setup_1.generateRandomStringAsync)(3));
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|