@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.
Files changed (49) hide show
  1. package/dist/pages/BrowseAllConnectorMarketplacePage.d.ts +17 -0
  2. package/dist/pages/BrowseAllConnectorMarketplacePage.js +145 -0
  3. package/dist/pages/SM-8.10/ClusterDetailsPage.d.ts +1 -1
  4. package/dist/pages/SM-8.10/ClusterDetailsPage.js +13 -6
  5. package/dist/pages/SM-8.10/ClusterPage.js +3 -1
  6. package/dist/pages/SM-8.10/ConnectorMarketplacePage.d.ts +2 -0
  7. package/dist/pages/SM-8.10/ConnectorMarketplacePage.js +16 -1
  8. package/dist/pages/SM-8.10/ModelerCreatePage.d.ts +4 -1
  9. package/dist/pages/SM-8.10/ModelerCreatePage.js +78 -51
  10. package/dist/pages/SM-8.10/ModelerHomePage.d.ts +2 -1
  11. package/dist/pages/SM-8.10/ModelerHomePage.js +24 -0
  12. package/dist/pages/SM-8.10/OperateHomePage.js +8 -1
  13. package/dist/pages/SM-8.10/OptimizeHomePage.js +13 -4
  14. package/dist/pages/SM-8.10/ProcessApplicationPage.d.ts +10 -5
  15. package/dist/pages/SM-8.10/ProcessApplicationPage.js +163 -68
  16. package/dist/pages/SM-8.10/UtilitiesPage.js +6 -6
  17. package/dist/pages/SM-8.7/NavigationPage.js +2 -1
  18. package/dist/tests/8.10/connectors-user-flows.spec.js +4 -2
  19. package/dist/tests/8.10/saas-migration-path-user-flows.spec.js +2 -1
  20. package/dist/tests/8.10/smoke-tests.spec.js +2 -1
  21. package/dist/tests/8.7/connectors-user-flows.spec.js +8 -4
  22. package/dist/tests/8.7/saas-migration-path-user-flows.spec.js +2 -1
  23. package/dist/tests/8.7/smoke-tests.spec.js +2 -1
  24. package/dist/tests/8.8/connectors-user-flows.spec.js +4 -2
  25. package/dist/tests/8.8/saas-migration-path-user-flows.spec.js +2 -1
  26. package/dist/tests/8.8/smoke-tests.spec.js +2 -1
  27. package/dist/tests/8.9/connectors-user-flows.spec.js +4 -2
  28. package/dist/tests/8.9/saas-migration-path-user-flows.spec.js +2 -1
  29. package/dist/tests/8.9/smoke-tests.spec.js +2 -1
  30. package/dist/tests/SM-8.10/cluster-management-user-flows.spec.js +13 -6
  31. package/dist/tests/SM-8.10/connectors-user-flows.spec.js +2 -1
  32. package/dist/tests/SM-8.10/hub-web-modeler-smoke.spec.d.ts +1 -0
  33. package/dist/tests/SM-8.10/hub-web-modeler-smoke.spec.js +24 -0
  34. package/dist/tests/SM-8.10/mt-enabled-user-flows.spec.js +3 -1
  35. package/dist/tests/SM-8.10/topology-orchestration-smoke.spec.d.ts +1 -0
  36. package/dist/tests/SM-8.10/topology-orchestration-smoke.spec.js +58 -0
  37. package/dist/tests/SM-8.7/topology-orchestration-smoke.spec.d.ts +1 -0
  38. package/dist/tests/SM-8.7/topology-orchestration-smoke.spec.js +62 -0
  39. package/dist/tests/SM-8.8/topology-orchestration-smoke.spec.d.ts +1 -0
  40. package/dist/tests/SM-8.8/topology-orchestration-smoke.spec.js +58 -0
  41. package/dist/tests/SM-8.9/topology-orchestration-smoke.spec.d.ts +1 -0
  42. package/dist/tests/SM-8.9/topology-orchestration-smoke.spec.js +58 -0
  43. package/dist/tests/c8Run-8.7/connectors-user-flows.spec.js +6 -3
  44. package/dist/tests/c8Run-8.8/connectors-user-flows.spec.js +6 -3
  45. package/dist/tests/c8Run-8.9/connectors-user-flows.spec.js +6 -3
  46. package/dist/utils/modelerCluster.d.ts +4 -6
  47. package/dist/utils/modelerCluster.js +55 -32
  48. package/package.json +1 -1
  49. 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 defineStagesDialog: Locator;
16
- readonly developmentClusterSelect: Locator;
17
- readonly defineStagesSaveButton: Locator;
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
- private openStageDefinition;
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
- // This page object owns that container's surface (creating a Project, and binding
18
- // its development-stage cluster). Entering and leaving it is driven from
19
- // ModelerHomePage so the ~150 existing spec call sites keep working unchanged.
20
- // Method names are kept from the flag-off era ("...ProcessApplication...") so the
21
- // callers do not have to change.
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
- defineStagesDialog;
44
- developmentClusterSelect;
45
- defineStagesSaveButton;
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
- this.defineStagesDialog = page
99
- .getByRole('dialog')
100
- .filter({ hasText: 'Define stages' });
101
- this.developmentClusterSelect = this.defineStagesDialog.locator('#dropdown-development-cluster');
102
- this.defineStagesSaveButton = this.defineStagesDialog.getByRole('button', {
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
- // Under workspaces-enabled there is no `/connected-clusters` sub-route: the
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
- async openStageDefinition() {
209
- const opened = await this.defineStagesDialog
210
- .waitFor({ state: 'visible', timeout: 3000 })
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 (opened) {
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
- // The "Connected clusters" card's action is labelled "Configure"; earlier
217
- // shells used "Define stages" / "Edit stages".
218
- const reopen = this.page
219
- .getByRole('button', { name: /^(define stages|edit stages|configure)$/i })
220
- .first();
221
- const canReopen = await reopen
222
- .waitFor({ state: 'visible', timeout: 15000 })
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 (!canReopen) {
226
- throw new Error('Could not open the "Define stages" dialog: it did not open by ' +
227
- 'itself and no "Configure" / "Define stages" / "Edit stages" ' +
228
- 'control was found on the Project detail page.');
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 reopen.click({ timeout: 30000 });
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
- await modelerCreatePage.changeElementSearchInput.click();
211
- await modelerCreatePage.changeElementSearchInput.fill('');
212
- await modelerCreatePage.changeElementSearchInput.pressSequentially('Send REST Request', { delay: 50 });
213
- await (0, test_1.expect)(modelerCreatePage.restConnectorOption).toBeVisible({
214
- timeout: 15000,
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('/optimize', this.optimizePageBanner, sleepTimeout);
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
- (0, _8_10_1.test)('REST Connector No Auth User Flow', async ({ page, homePage, modelerHomePage, appsPage, modelerCreatePage, connectorSettingsPage, }) => {
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
- (0, _8_10_1.test)('REST Connector Bearer Token Auth User Flow', async ({ page, homePage, modelerHomePage, appsPage, modelerCreatePage, connectorSettingsPage, }) => {
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
- (0, _8_10_1.test)('Assert Connectors Still Function After SaaS Upgrade @tasklistV2', async ({ operateHomePage, appsPage, operateProcessesPage, operateProcessInstancePage, }) => {
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
- (0, _8_10_1.test)('Most Common REST Connector User Flow', async ({ page, loginPage, homePage, modelerHomePage, appsPage, modelerCreatePage, connectorSettingsPage, }, testInfo) => {
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
- (0, _8_7_1.test)('REST Connector No Auth User Flow', async ({ page, homePage, modelerHomePage, appsPage, modelerCreatePage, connectorSettingsPage, }) => {
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
- (0, _8_7_1.test)('REST Connector Bearer Token Auth User Flow', async ({ page, homePage, modelerHomePage, appsPage, modelerCreatePage, connectorSettingsPage, }) => {
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
- (0, _8_7_1.test)('Connector Secrets User Flow - GCP', async ({ page, homePage, modelerHomePage, appsPage, modelerCreatePage, connectorSettingsPage, clusterPage, clusterSecretsPage, }) => {
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
- (0, _8_7_1.test)('Connector Secrets User Flow - AWS', async ({ page, homePage, modelerHomePage, appsPage, modelerCreatePage, connectorSettingsPage, clusterPage, clusterSecretsPage, operateHomePage, operateProcessesPage, operateProcessInstancePage, }) => {
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
- (0, _8_7_1.test)('Assert Connectors Still Function After SaaS Upgrade', async ({ operateHomePage, appsPage, operateProcessesPage, operateProcessInstancePage, }) => {
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
- (0, _8_7_1.test)('Most Common REST Connector User Flow', async ({ page, loginPage, homePage, modelerHomePage, appsPage, modelerCreatePage, connectorSettingsPage, }, testInfo) => {
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
- (0, _8_8_1.test)('REST Connector No Auth User Flow', async ({ page, homePage, modelerHomePage, appsPage, modelerCreatePage, connectorSettingsPage, }) => {
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
- (0, _8_8_1.test)('REST Connector Bearer Token Auth User Flow', async ({ page, homePage, modelerHomePage, appsPage, modelerCreatePage, connectorSettingsPage, }) => {
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
- (0, _8_8_1.test)('Assert Connectors Still Function After SaaS Upgrade', async ({ operateHomePage, appsPage, operateProcessesPage, operateProcessInstancePage, }) => {
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
- (0, _8_8_1.test)('Most Common REST Connector User Flow', async ({ page, modelerHomePage, appsPage, modelerCreatePage, connectorSettingsPage, }) => {
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
- (0, _8_9_1.test)('REST Connector No Auth User Flow', async ({ page, homePage, modelerHomePage, appsPage, modelerCreatePage, connectorSettingsPage, }) => {
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
- (0, _8_9_1.test)('REST Connector Bearer Token Auth User Flow', async ({ page, homePage, modelerHomePage, appsPage, modelerCreatePage, connectorSettingsPage, }) => {
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
- (0, _8_9_1.test)('Assert Connectors Still Function After SaaS Upgrade @tasklistV2', async ({ operateHomePage, appsPage, operateProcessesPage, operateProcessInstancePage, }) => {
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
- (0, _8_9_1.test)('Most Common REST Connector User Flow', async ({ page, modelerHomePage, appsPage, modelerCreatePage, connectorSettingsPage, }) => {
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
- const defaultTags = ['dev', 'custom', 'stage', 'prod', 'test'];
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(defaultTags);
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(defaultTags);
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.customPropertiesHeading).toBeVisible({
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
- await clusterDetailsPage.assertCustomPropertyIsNavigated('Link 1', 'Camunda', /^https:\/\/(www\.)?camunda\.com\/?$/);
38
- await clusterDetailsPage.assertCustomPropertyIsNavigated('Link 2', 'Camunda Docs', 'https://docs.camunda.io');
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
- (0, SM_8_10_1.test)('REST Connector Bearer Token Auth User Flow', async ({ page, operateHomePage, modelerHomePage, modelerCreatePage, connectorSettingsPage, navigationPage, operateProcessInstancePage, operateProcessesPage, connectorMarketplacePage, }) => {
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 {};