@camunda/e2e-test-suite 0.0.1252 → 0.0.1254

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 (31) hide show
  1. package/dist/pages/8.10/AppsPage.js +6 -2
  2. package/dist/pages/8.10/ClusterDetailsPage.d.ts +2 -2
  3. package/dist/pages/8.10/ClusterDetailsPage.js +75 -31
  4. package/dist/pages/8.10/ClusterPage.js +30 -2
  5. package/dist/pages/8.10/ClusterSecretsPage.js +142 -10
  6. package/dist/pages/8.10/HomePage.d.ts +2 -0
  7. package/dist/pages/8.10/HomePage.js +40 -2
  8. package/dist/pages/8.10/LoginPage.d.ts +1 -0
  9. package/dist/pages/8.10/LoginPage.js +29 -0
  10. package/dist/pages/8.10/ModelerHomePage.d.ts +8 -0
  11. package/dist/pages/8.10/ModelerHomePage.js +221 -35
  12. package/dist/pages/8.10/UtilitiesPage.js +58 -2
  13. package/dist/pages/8.7/AppsPage.d.ts +1 -0
  14. package/dist/pages/8.7/AppsPage.js +23 -4
  15. package/dist/pages/8.7/ClusterDetailsPage.js +14 -2
  16. package/dist/pages/8.7/ClusterPage.js +8 -0
  17. package/dist/pages/8.7/ConnectorMarketplacePage.d.ts +1 -0
  18. package/dist/pages/8.7/ConnectorMarketplacePage.js +24 -2
  19. package/dist/pages/8.7/ConsoleOrganizationPage.js +11 -0
  20. package/dist/pages/8.7/FormJsPage.js +30 -4
  21. package/dist/pages/8.7/ModelerCreatePage.js +33 -1
  22. package/dist/pages/8.7/ModelerHomePage.d.ts +2 -0
  23. package/dist/pages/8.7/ModelerHomePage.js +18 -0
  24. package/dist/pages/8.7/ProcessApplicationPage.d.ts +1 -0
  25. package/dist/pages/8.7/ProcessApplicationPage.js +87 -0
  26. package/dist/pages/8.7/UtilitiesPage.js +7 -1
  27. package/dist/tests/8.10/test-setup.spec.js +5 -2
  28. package/dist/tests/8.7/web-modeler-user-flows.spec.js +3 -15
  29. package/dist/utils/modelerCluster.d.ts +13 -0
  30. package/dist/utils/modelerCluster.js +2 -1
  31. package/package.json +1 -1
@@ -4,6 +4,7 @@ exports.FormJsPage = void 0;
4
4
  const test_1 = require("@playwright/test");
5
5
  const sleep_1 = require("../../utils/sleep");
6
6
  const ProcessApplicationPage_1 = require("./ProcessApplicationPage");
7
+ const modelerCluster_1 = require("../../utils/modelerCluster");
7
8
  class FormJsPage {
8
9
  page;
9
10
  processApplicationPage;
@@ -50,15 +51,16 @@ class FormJsPage {
50
51
  // Inside a process application hub titles this modal for the application
51
52
  // rather than for the form, so 'Deploy form' never matches and the dialog
52
53
  // reads as absent. pages/SM-8.10 filters on 'Deploy' for the same reason.
53
- this.dialog = page
54
- .locator('.cds--modal-container[role="dialog"]')
55
- .filter({ hasText: 'Deploy' });
54
+ // Role-based rather than Carbon's modal container: under the Hub shell the
55
+ // deploy dialog is a design-system dialog with no .cds--modal-container.
56
+ this.dialog = page.getByRole('dialog').filter({ hasText: 'Deploy' });
56
57
  this.deploySubButton = this.dialog.getByRole('button', {
57
58
  name: 'Deploy',
58
59
  exact: true,
59
60
  });
61
+ // Carbon toast, or the design system's (sonner) Toaster under the Hub shell.
60
62
  this.deploySuccessNotification = page
61
- .locator('.cds--toast-notification--success')
63
+ .locator('.cds--toast-notification--success, [data-sonner-toast][data-type="success"]')
62
64
  .filter({ hasText: 'Form deployed!' });
63
65
  }
64
66
  async generateAIForm(request = 'Create a form with the following fields: 1. A text field with the label "Full Name" 2. A number with the label "Count" 3. A date input with the label "Date of birth"4. A Checkbox with the label "Agree"') {
@@ -119,6 +121,21 @@ class FormJsPage {
119
121
  throw new Error(`Process application has no cluster assigned to any stage, so "${clusterName}" cannot be deployed to. ` +
120
122
  'ProcessApplicationPage.ensureStageCluster() should have bound it before the deploy dialog was opened.');
121
123
  }
124
+ // Hub's environment-based dialog also renders a <label> per row, which
125
+ // the legacy toggle detection below would mistake for its own.
126
+ const environmentRow = this.dialog
127
+ .locator('[data-test^="environment-row-"]')
128
+ .first();
129
+ if (await environmentRow.isVisible().catch(() => false)) {
130
+ try {
131
+ await (0, modelerCluster_1.selectDeployEnvironment)(this.dialog, clusterName);
132
+ }
133
+ catch (error) {
134
+ this.processApplicationPage.forgetStageCluster();
135
+ throw error;
136
+ }
137
+ return;
138
+ }
122
139
  const legacyClusterToggle = this.dialog.locator('label').filter({
123
140
  hasText: new RegExp(`^${clusterName}`),
124
141
  });
@@ -143,6 +160,15 @@ class FormJsPage {
143
160
  throw new Error(`The deploy dialog does not offer "${clusterName}": its stage ` +
144
161
  'binding did not take. It will be rebound on the next attempt.');
145
162
  }
163
+ // Hub's environment-based dialog lists every Environment assigned to
164
+ // the workspace and preselects the first, which need not be this one.
165
+ const environmentRows = this.dialog.locator('[data-test^="environment-row-"]');
166
+ if (await environmentRows
167
+ .first()
168
+ .isVisible()
169
+ .catch(() => false)) {
170
+ await (0, modelerCluster_1.selectDeployEnvironment)(this.dialog, clusterName);
171
+ }
146
172
  return;
147
173
  }
148
174
  const healthyRegex = new RegExp(`${clusterName}[\\s\\S]*?HealthydevManage`);
@@ -5,6 +5,7 @@ const test_1 = require("@playwright/test");
5
5
  const sleep_1 = require("../../utils/sleep");
6
6
  const ConnectorMarketplacePage_1 = require("./ConnectorMarketplacePage");
7
7
  const ProcessApplicationPage_1 = require("./ProcessApplicationPage");
8
+ const modelerCluster_1 = require("../../utils/modelerCluster");
8
9
  class ModelerCreatePage {
9
10
  page;
10
11
  processApplicationPage;
@@ -212,7 +213,14 @@ class ModelerCreatePage {
212
213
  this.firstPlacedElement = page.locator('g:nth-child(2) > .djs-element > .djs-hit');
213
214
  this.secondPlacedElement = page.locator('g:nth-child(2) > .djs-element > .djs-hit');
214
215
  this.payloadInput = page.locator('[class="fjs-input"]');
215
- this.marketPlaceButton = page.getByTitle('Browse Marketplace for more Connectors');
216
+ // Since camunda-hub's "Browse all" (2026-09-23) a change-element menu with
217
+ // enough entries swaps its header's marketplace icon for a "Browse all"
218
+ // entry, whose dialog carries the Marketplace search and import itself
219
+ // (see ConnectorMarketplacePage).
220
+ this.marketPlaceButton = page
221
+ .getByTitle('Browse Marketplace for more Connectors')
222
+ .or(page.getByTitle('Browse all available elements and assets'))
223
+ .first();
216
224
  this.publicHolidayConnectorOption = page
217
225
  .locator('[data-test="modeler"]')
218
226
  .getByText('Worldwide Public Holiday');
@@ -1638,6 +1646,21 @@ class ModelerCreatePage {
1638
1646
  throw new Error(`Process application has no cluster assigned to any stage, so "${clusterName}" cannot be deployed to. ` +
1639
1647
  'ProcessApplicationPage.ensureStageCluster() should have bound it before the deploy dialog was opened.');
1640
1648
  }
1649
+ // Hub's environment-based dialog also renders a <label> per row, which
1650
+ // the legacy toggle detection below would mistake for its own.
1651
+ const environmentRow = this.dialog
1652
+ .locator('[data-test^="environment-row-"]')
1653
+ .first();
1654
+ if (await environmentRow.isVisible().catch(() => false)) {
1655
+ try {
1656
+ await (0, modelerCluster_1.selectDeployEnvironment)(this.dialog, clusterName);
1657
+ }
1658
+ catch (error) {
1659
+ this.processApplicationPage.forgetStageCluster();
1660
+ throw error;
1661
+ }
1662
+ return;
1663
+ }
1641
1664
  const legacyClusterToggle = this.dialog.locator('label').filter({
1642
1665
  hasText: new RegExp(`^${clusterName}`),
1643
1666
  });
@@ -1662,6 +1685,15 @@ class ModelerCreatePage {
1662
1685
  throw new Error(`The deploy dialog does not offer "${clusterName}": its stage ` +
1663
1686
  'binding did not take. It will be rebound on the next attempt.');
1664
1687
  }
1688
+ // Hub's environment-based dialog lists every Environment assigned to
1689
+ // the workspace and preselects the first, which need not be this one.
1690
+ const environmentRows = this.dialog.locator('[data-test^="environment-row-"]');
1691
+ if (await environmentRows
1692
+ .first()
1693
+ .isVisible()
1694
+ .catch(() => false)) {
1695
+ await (0, modelerCluster_1.selectDeployEnvironment)(this.dialog, clusterName);
1696
+ }
1665
1697
  return;
1666
1698
  }
1667
1699
  const healthyRegex = new RegExp(`${clusterName}.*?HealthydevManage`);
@@ -26,6 +26,7 @@ declare class ModelerHomePage {
26
26
  readonly projectBreadcrumb: Locator;
27
27
  readonly workspaceBreadcrumb: Locator;
28
28
  readonly openOrganizationsButton: Locator;
29
+ readonly hubOrganizationLink: Locator;
29
30
  readonly optionsButton: Locator;
30
31
  readonly manageButton: Locator;
31
32
  readonly crossComponentProjectFolder: Locator;
@@ -71,6 +72,7 @@ declare class ModelerHomePage {
71
72
  private becameVisible;
72
73
  isModelerPageBannerVisible(timeout: number): Promise<boolean>;
73
74
  clickHomeBreadcrumb(): Promise<void>;
75
+ openOrganizationManagement(timeout: number): Promise<void>;
74
76
  clickOpenOrganizationsButton(): Promise<void>;
75
77
  clickCrossComponentProjectFolder(): Promise<void>;
76
78
  private createWorkspaceViaWizard;
@@ -47,6 +47,7 @@ class ModelerHomePage {
47
47
  projectBreadcrumb;
48
48
  workspaceBreadcrumb;
49
49
  openOrganizationsButton;
50
+ hubOrganizationLink;
50
51
  optionsButton;
51
52
  manageButton;
52
53
  crossComponentProjectFolder;
@@ -143,6 +144,10 @@ class ModelerHomePage {
143
144
  .first();
144
145
  this.homeBreadcrumb = page.locator('[data-test="breadcrumb-home"]');
145
146
  this.openOrganizationsButton = page.getByLabel('Open Organizations');
147
+ this.hubOrganizationLink = page
148
+ .getByRole('navigation', { name: 'Main navigation' })
149
+ .getByRole('link', { name: 'Organization' })
150
+ .first();
146
151
  this.manageButton = page.getByRole('menuitem', { name: 'Manage' });
147
152
  // On the Camunda Hub Workspaces overview the folder is a workspace tile
148
153
  // whose "Open workspace <name>" button navigates into it.
@@ -561,6 +566,19 @@ class ModelerHomePage {
561
566
  // An announcement dialog covering the Modeler header makes every click on the
562
567
  // org button bounce off the modal layer ("intercepts pointer events") until
563
568
  // the timeout, so dismiss overlays before each attempt.
569
+ // Opens organization management. The Camunda Hub shell has no "Open
570
+ // Organizations" menu -- its org breadcrumb only switches organizations --
571
+ // and reaches organization management from the sidebar's "Organization"
572
+ // link instead.
573
+ async openOrganizationManagement(timeout) {
574
+ await (0, test_1.expect)(this.openOrganizationsButton.or(this.hubOrganizationLink).first()).toBeVisible({ timeout });
575
+ if (await this.hubOrganizationLink.isVisible()) {
576
+ await this.hubOrganizationLink.click({ timeout: 30000 });
577
+ return;
578
+ }
579
+ await this.clickOpenOrganizationsButton();
580
+ await this.clickManageButton();
581
+ }
564
582
  async clickOpenOrganizationsButton() {
565
583
  await (0, clickLocatorWithRetry_1.clickLocatorWithRetry)(this.page, this.openOrganizationsButton, {
566
584
  preAction: async () => {
@@ -24,6 +24,7 @@ declare class ProcessApplicationPage {
24
24
  rememberResourceContainer(url: string): void;
25
25
  forgetStageCluster(): void;
26
26
  ensureStageCluster(clusterName: string): Promise<boolean>;
27
+ private ensureWorkspaceEnvironment;
27
28
  private openStageDefinition;
28
29
  openByName(name: string): Promise<void>;
29
30
  }
@@ -237,7 +237,19 @@ class ProcessApplicationPage {
237
237
  // suite is. Re-navigating is the recovery; waiting longer on a page that
238
238
  // has already gone wrong is not, which is why the inner timeouts stay
239
239
  // short. A genuinely unbindable cluster still fails, with the same error.
240
+ //
241
+ // Under Hub workspaces (/workspaces/<ws>/projects/<id>) there is no
242
+ // /connected-clusters route -- it renders "No match for the current
243
+ // location". With Hub's Environments feature on (camunda-hub#29210),
244
+ // WorkspaceProjectDetail hides the Connected clusters card altogether and
245
+ // the deploy dialog offers the environments assigned to the parent
246
+ // workspace instead, so the binding is made there.
247
+ const workspaceId = paUrl.match(/\/workspaces\/([^/]+)\/projects\//)?.[1];
240
248
  await (0, test_1.expect)(async () => {
249
+ if (workspaceId) {
250
+ await this.ensureWorkspaceEnvironment(paUrl, workspaceId, clusterName);
251
+ return;
252
+ }
241
253
  await this.page.goto(`${paUrl}/connected-clusters`, {
242
254
  waitUntil: 'domcontentloaded',
243
255
  });
@@ -248,6 +260,81 @@ class ProcessApplicationPage {
248
260
  await this.page.goto(returnTo, { waitUntil: 'domcontentloaded' });
249
261
  return true;
250
262
  }
263
+ // Assigns the Environment backed by clusterName to the workspace, from
264
+ // workspace management's Environments tab (camunda-hub
265
+ // WorkspaceEnvironmentsTab). Without the Environments feature the project
266
+ // page still carries the Connected clusters card, whose "Configure" button
267
+ // opens the Define stages dialog -- that path is taken instead.
268
+ //
269
+ // Save replaces the workspace's whole assignment with the picker's
270
+ // selection, and parallel workers share this workspace, so only this
271
+ // cluster's toggle is touched and the result re-read afterwards. A
272
+ // concurrent save that drops it anyway surfaces as a deploy dialog without
273
+ // the cluster, which forgets the binding and comes back here (see
274
+ // forgetStageCluster).
275
+ async ensureWorkspaceEnvironment(paUrl, workspaceId, clusterName) {
276
+ await this.page.goto(paUrl, { waitUntil: 'domcontentloaded' });
277
+ await this.waitForProcessApplication();
278
+ const configure = this.page.getByRole('button', {
279
+ name: 'Configure',
280
+ exact: true,
281
+ });
282
+ if (await configure.isVisible().catch(() => false)) {
283
+ await configure.click({ timeout: 30000 });
284
+ await this.defineDevelopmentStage(clusterName);
285
+ return;
286
+ }
287
+ const manageUrl = `${new URL(paUrl).origin}/workspaces/${workspaceId}/manage?tab=environments`;
288
+ await this.page.goto(manageUrl, { waitUntil: 'domcontentloaded' });
289
+ const heading = this.page.locator('[data-test="manage-environments-heading"]');
290
+ if (!(await heading
291
+ .waitFor({ state: 'visible', timeout: 60000 })
292
+ .then(() => true)
293
+ .catch(() => false))) {
294
+ throw new Error(`Could not bind "${clusterName}" as a deploy target: the project page ` +
295
+ 'has no Connected clusters "Configure" control, and the workspace ' +
296
+ `Environments tab did not render at ${manageUrl}.`);
297
+ }
298
+ const editButton = this.page.locator('[data-test="edit-environments-button"]');
299
+ await (0, test_1.expect)(editButton).toBeEnabled({ timeout: 60000 });
300
+ await editButton.click({ timeout: 30000 });
301
+ const editor = this.page.getByRole('group', {
302
+ name: 'Edit assigned environments',
303
+ });
304
+ await (0, test_1.expect)(editor).toBeVisible({ timeout: 30000 });
305
+ const search = editor.locator('[data-test="picker-search"]');
306
+ if (await search.isVisible().catch(() => false)) {
307
+ await search.fill(clusterName);
308
+ }
309
+ // Picker card toggles are named "Select <environment> (<cluster>)" and
310
+ // flip to "Selected ..." with aria-pressed once picked.
311
+ const escapedClusterName = clusterName.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
312
+ const toggle = editor
313
+ .locator('[data-test="picker-environment"]')
314
+ .getByRole('button', {
315
+ name: new RegExp(`^Select(ed)? .*\\(${escapedClusterName}\\)$`),
316
+ })
317
+ .first();
318
+ await (0, test_1.expect)(toggle).toBeVisible({ timeout: 60000 });
319
+ if ((await toggle.getAttribute('aria-pressed')) === 'true') {
320
+ await this.page
321
+ .getByRole('button', { name: 'Cancel', exact: true })
322
+ .click({ timeout: 30000 });
323
+ await (0, test_1.expect)(editor).toBeHidden({ timeout: 30000 });
324
+ return;
325
+ }
326
+ await toggle.click({ timeout: 30000 });
327
+ await (0, test_1.expect)(toggle).toHaveAttribute('aria-pressed', 'true');
328
+ await this.page
329
+ .getByRole('button', { name: 'Save', exact: true })
330
+ .click({ timeout: 30000 });
331
+ await (0, test_1.expect)(editor).toBeHidden({ timeout: 60000 });
332
+ await (0, test_1.expect)(this.page
333
+ .getByRole('list', { name: 'Assigned environments' })
334
+ .getByRole('listitem')
335
+ .filter({ hasText: clusterName })
336
+ .first()).toBeVisible({ timeout: 60000 });
337
+ }
251
338
  // The /connected-clusters deep link opens the Define stages dialog by itself
252
339
  // while the application has no stage bound. Once one is bound -- a test that
253
340
  // deploys to a second cluster -- it has to be reopened from the page, so try
@@ -556,7 +556,13 @@ async function modelAndRunConnectorsDocHandlingDiagram(modelerCreatePage, modele
556
556
  await modelerCreatePage.clickMarketPlaceButton();
557
557
  await connectorMarketplacePage.clickSearchForConnectorTextbox();
558
558
  await connectorMarketplacePage.fillSearchForConnectorTextbox('REST Connector');
559
- await (0, test_1.expect)(page.getByText('REST ConnectorBy CamundaConnect, interact, and synchronize processes')).toBeVisible({
559
+ // The legacy marketplace modal's card, or its Browse all dialog card.
560
+ await (0, test_1.expect)(page
561
+ .getByText('REST ConnectorBy CamundaConnect, interact, and synchronize processes')
562
+ .or(page
563
+ .getByRole('list', { name: 'Marketplace connectors' })
564
+ .getByText('REST Connector', { exact: true }))
565
+ .first()).toBeVisible({
560
566
  timeout: 60000,
561
567
  });
562
568
  await connectorMarketplacePage.downloadConnectorToProject();
@@ -18,7 +18,8 @@ _8_10_1.test.describe('Cluster Setup Tests', () => {
18
18
  await (0, _setup_1.captureScreenshot)(page, testInfo);
19
19
  await (0, _setup_1.captureFailureVideo)(page, testInfo);
20
20
  });
21
- (0, _8_10_1.test)('Enable Alpha Features', async ({ page, loginPage, consoleOrganizationsPage, homePage, }, testInfo) => {
21
+ // Skipped due to bug #29346: https://github.com/camunda/camunda-hub/issues/29346
22
+ _8_10_1.test.skip('Enable Alpha Features', async ({ page, loginPage, consoleOrganizationsPage, homePage, }, testInfo) => {
22
23
  _8_10_1.test.skip(process.env.IS_PROD === 'true', 'Skipping test because not required on PROD test org');
23
24
  _8_10_1.test.skip(process.env.IS_AG === 'true', 'Skipping test because not required when IS_AG is true');
24
25
  await (0, UtilitiesPage_1.loginWithRetry)(page, loginPage, users_1.testUsers.mainUser, (testInfo.workerIndex + 1) * 1000);
@@ -165,7 +166,9 @@ _8_10_1.test.describe('Cluster Setup Tests', () => {
165
166
  await (0, UtilitiesPage_1.loginWithRetry)(page, loginPage, user, Math.min((testInfo.workerIndex + 1) * 5000, 60000));
166
167
  });
167
168
  await _8_10_1.test.step('Navigate to Web Modeler', async () => {
168
- await (0, test_1.expect)(homePage.camundaComponentsButton).toBeVisible({
169
+ // Camunda Hub replaced Console + Web Modeler on SaaS: it lands on the
170
+ // Modeler home directly and has no app switcher to wait for.
171
+ await (0, test_1.expect)(homePage.camundaComponentsButton.or(homePage.hubHeader)).toBeVisible({
169
172
  timeout: 120000,
170
173
  });
171
174
  await appsPage.openModelerWithRetry(modelerHomePage.modelerPageBanner, 180000, 3, undefined, () => modelerHomePage.dismissBlockingDialog());
@@ -106,11 +106,7 @@ _8_7_1.test.describe('Web Modeler User Flow Tests', () => {
106
106
  await modelerHomePage.clickMessageBanner();
107
107
  });
108
108
  await _8_7_1.test.step('Change User Roles and Assert This Updates in Web Modeler', async () => {
109
- await (0, test_1.expect)(modelerHomePage.openOrganizationsButton).toBeVisible({
110
- timeout: 120000,
111
- });
112
- await modelerHomePage.clickOpenOrganizationsButton();
113
- await modelerHomePage.clickManageButton();
109
+ await modelerHomePage.openOrganizationManagement(120000);
114
110
  await consoleOrganizationsPage.clickUsersTab();
115
111
  await consoleOrganizationsPage.filterTable([
116
112
  process.env.C8_USERNAME_TEST_3,
@@ -174,11 +170,7 @@ _8_7_1.test.describe('Web Modeler User Flow Tests', () => {
174
170
  timeout: 90000,
175
171
  });
176
172
  await modelerHomePage.clickMessageBanner();
177
- await (0, test_1.expect)(modelerHomePage.openOrganizationsButton).toBeVisible({
178
- timeout: 120000,
179
- });
180
- await modelerHomePage.clickOpenOrganizationsButton();
181
- await modelerHomePage.clickManageButton();
173
+ await modelerHomePage.openOrganizationManagement(120000);
182
174
  await consoleOrganizationsPage.clickUsersTab();
183
175
  await consoleOrganizationsPage.filterTable([
184
176
  process.env.C8_USERNAME_TEST_3,
@@ -234,11 +226,7 @@ _8_7_1.test.describe('Web Modeler User Flow Tests', () => {
234
226
  timeout: 90000,
235
227
  });
236
228
  await modelerHomePage.clickMessageBanner();
237
- await (0, test_1.expect)(modelerHomePage.openOrganizationsButton).toBeVisible({
238
- timeout: 60000,
239
- });
240
- await modelerHomePage.clickOpenOrganizationsButton();
241
- await modelerHomePage.clickManageButton();
229
+ await modelerHomePage.openOrganizationManagement(60000);
242
230
  await consoleOrganizationsPage.clickUsersTab();
243
231
  await consoleOrganizationsPage.filterTable([
244
232
  process.env.C8_USERNAME_TEST_3,
@@ -15,3 +15,16 @@ import { Locator } from '@playwright/test';
15
15
  * preselected.
16
16
  */
17
17
  export declare function selectModelerCluster(dialog: Locator): Promise<void>;
18
+ /**
19
+ * Picks a row in the environment-based deploy dialog (camunda-hub#29210). Each row is
20
+ * `[data-test="environment-row-<id>"]`, one per Environment assigned to the deploy's workspace, and
21
+ * the dialog preselects the first one -- so with no cluster name to match, the preselection is left
22
+ * alone.
23
+ *
24
+ * This suite's single-cluster topology gives each cluster exactly one Environment, whose row shows
25
+ * no separate cluster subtext -- so the row's only visible identifying text is the Environment's
26
+ * own name, matched here on the assumption that it is named after its cluster (true for how this
27
+ * suite's clusters are registered). A row that does carry a distinct cluster subtext also matches,
28
+ * since `hasText` scans the whole row.
29
+ */
30
+ export declare function selectDeployEnvironment(dialog: Locator, clusterName: string): Promise<void>;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.selectModelerCluster = void 0;
3
+ exports.selectDeployEnvironment = exports.selectModelerCluster = void 0;
4
4
  const test_1 = require("@playwright/test");
5
5
  /**
6
6
  * Points a Web Modeler deploy dialog at the cluster named by MODELER_CLUSTER_NAME.
@@ -94,3 +94,4 @@ async function selectDeployEnvironment(dialog, clusterName) {
94
94
  await target.getByRole('radio').click({ timeout: 30000 });
95
95
  await (0, test_1.expect)(target).toContainText(clusterName);
96
96
  }
97
+ exports.selectDeployEnvironment = selectDeployEnvironment;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camunda/e2e-test-suite",
3
- "version": "0.0.1252",
3
+ "version": "0.0.1254",
4
4
  "description": "End-to-end test helpers for Camunda 8",
5
5
  "repository": {
6
6
  "type": "git",