@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.
- package/dist/pages/8.10/AppsPage.js +6 -2
- package/dist/pages/8.10/ClusterDetailsPage.d.ts +2 -2
- package/dist/pages/8.10/ClusterDetailsPage.js +75 -31
- package/dist/pages/8.10/ClusterPage.js +30 -2
- package/dist/pages/8.10/ClusterSecretsPage.js +142 -10
- package/dist/pages/8.10/HomePage.d.ts +2 -0
- package/dist/pages/8.10/HomePage.js +40 -2
- package/dist/pages/8.10/LoginPage.d.ts +1 -0
- package/dist/pages/8.10/LoginPage.js +29 -0
- package/dist/pages/8.10/ModelerHomePage.d.ts +8 -0
- package/dist/pages/8.10/ModelerHomePage.js +221 -35
- package/dist/pages/8.10/UtilitiesPage.js +58 -2
- package/dist/pages/8.7/AppsPage.d.ts +1 -0
- package/dist/pages/8.7/AppsPage.js +23 -4
- package/dist/pages/8.7/ClusterDetailsPage.js +14 -2
- package/dist/pages/8.7/ClusterPage.js +8 -0
- package/dist/pages/8.7/ConnectorMarketplacePage.d.ts +1 -0
- package/dist/pages/8.7/ConnectorMarketplacePage.js +24 -2
- package/dist/pages/8.7/ConsoleOrganizationPage.js +11 -0
- package/dist/pages/8.7/FormJsPage.js +30 -4
- package/dist/pages/8.7/ModelerCreatePage.js +33 -1
- package/dist/pages/8.7/ModelerHomePage.d.ts +2 -0
- package/dist/pages/8.7/ModelerHomePage.js +18 -0
- package/dist/pages/8.7/ProcessApplicationPage.d.ts +1 -0
- package/dist/pages/8.7/ProcessApplicationPage.js +87 -0
- package/dist/pages/8.7/UtilitiesPage.js +7 -1
- package/dist/tests/8.10/test-setup.spec.js +5 -2
- package/dist/tests/8.7/web-modeler-user-flows.spec.js +3 -15
- package/dist/utils/modelerCluster.d.ts +13 -0
- package/dist/utils/modelerCluster.js +2 -1
- 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
|
-
|
|
54
|
-
|
|
55
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
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;
|