@camunda/e2e-test-suite 0.0.1102 → 0.0.1104
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.
|
@@ -1409,23 +1409,47 @@ class ModelerCreatePage {
|
|
|
1409
1409
|
// 1. Connect cluster → "Configure environment" modal → select cluster → Save
|
|
1410
1410
|
// 2. Deploy process → wait for success banner
|
|
1411
1411
|
// 3. Configure test case
|
|
1412
|
-
|
|
1413
|
-
|
|
1414
|
-
|
|
1415
|
-
|
|
1416
|
-
//
|
|
1417
|
-
//
|
|
1418
|
-
//
|
|
1419
|
-
//
|
|
1420
|
-
//
|
|
1421
|
-
//
|
|
1422
|
-
|
|
1412
|
+
// camunda-hub 8b42269 ("unify Setup environment / Configure test case
|
|
1413
|
+
// panel, polish", #28226, 2026-09-04) replaced ConfigurationOverlay with
|
|
1414
|
+
// TestConfigurationPanel, a Carbon Accordion. "Deploy process" is now only
|
|
1415
|
+
// the accordion HEADER label and the Deploy button lives in the item's
|
|
1416
|
+
// separate content wrapper, so scoping by getByText('Deploy process') ->
|
|
1417
|
+
// '..' resolves to the header's own span and matches no button at all --
|
|
1418
|
+
// isEnabled() then throws, the probe reads false forever and the settle
|
|
1419
|
+
// wait below times out even though Deploy is on screen and enabled. The
|
|
1420
|
+
// data-testid is unchanged between the old overlay and the new panel, so
|
|
1421
|
+
// anchor on it instead.
|
|
1422
|
+
const setupDeployButton = this.page.getByTestId('test-configuration-deploy-button');
|
|
1423
|
+
// The same commit dropped the "Process has been successfully deployed."
|
|
1424
|
+
// sentence in favour of a "Successfully deployed" badge. Match the badge's
|
|
1425
|
+
// test id first, keep the old sentence for pre-8b42269 modeler builds.
|
|
1426
|
+
//
|
|
1427
|
+
// Probed by ATTACHMENT, never visibility: the badge renders only once the
|
|
1428
|
+
// product reports the deploy succeeded, but the panel reacts to that same
|
|
1429
|
+
// state by hiding the setup overlay, which collapses the "Deploy process"
|
|
1430
|
+
// accordion item the badge lives in. So it is present-but-hidden within a
|
|
1431
|
+
// frame of appearing, and a toBeVisible() wait on it can never pass.
|
|
1432
|
+
const deploySuccessBadge = this.page
|
|
1433
|
+
.getByTestId('deploy-success-badge')
|
|
1434
|
+
.or(this.page.getByText('Process has been successfully deployed'))
|
|
1435
|
+
.first();
|
|
1436
|
+
const isDeployReported = async () => (await deploySuccessBadge.count()) > 0;
|
|
1437
|
+
// Legacy-only button. camunda-hub renamed it twice (a90fd06 label
|
|
1438
|
+
// "Configure scenario" -> "Configure test case"; b3958a1649 (#27259,
|
|
1439
|
+
// 2026-08-07) test id `play-configuration-configure-scenario-button` ->
|
|
1440
|
+
// `configure-test-case-button`) and then 8b42269 removed it outright: the
|
|
1441
|
+
// accordion panel hides the setup overlay and opens step 3 by itself once
|
|
1442
|
+
// the deploy step completes, so there is nothing left to click. Keep the
|
|
1443
|
+
// locator for older modeler builds and drive it only when it is really
|
|
1444
|
+
// there. Match test ids ONLY: the accessible name of the new accordion's
|
|
1445
|
+
// step-3 heading button is also exactly "Configure test case" (its "3"
|
|
1446
|
+
// marker is aria-hidden), so a `getByRole('button', {name: ...})` fallback
|
|
1447
|
+
// silently binds to that heading instead. That made the deploy step look
|
|
1448
|
+
// already-done (the heading is visible while disabled) and then spent the
|
|
1449
|
+
// whole retry budget clicking a permanently disabled heading.
|
|
1423
1450
|
const configureScenarioButton = this.page
|
|
1424
1451
|
.getByTestId('configure-test-case-button')
|
|
1425
1452
|
.or(this.page.getByTestId('play-configuration-configure-scenario-button'))
|
|
1426
|
-
.or(this.page.getByRole('button', {
|
|
1427
|
-
name: /^Configure (test case|scenario)$/,
|
|
1428
|
-
}))
|
|
1429
1453
|
.first();
|
|
1430
1454
|
// Play settles into exactly ONE of three states, and which one is not
|
|
1431
1455
|
// knowable up front, so race them instead of timing out on each in turn:
|
|
@@ -1480,10 +1504,14 @@ class ModelerCreatePage {
|
|
|
1480
1504
|
// Deploy button and then waits forever for a "Connect cluster" button that
|
|
1481
1505
|
// never renders (it has become "Change").
|
|
1482
1506
|
//
|
|
1483
|
-
// Wait until the panel settles into one of
|
|
1507
|
+
// Wait until the panel settles into one of three stable states before
|
|
1484
1508
|
// deciding, then branch:
|
|
1485
1509
|
// - "Connect cluster" button visible → no cluster connected, connect one
|
|
1486
1510
|
// - Deploy button enabled → a cluster is already connected
|
|
1511
|
+
// - deploy success badge visible → re-entering an already deployed
|
|
1512
|
+
// process application, where the Deploy button is replaced by the
|
|
1513
|
+
// badge and "Connect cluster" by "Change", so neither of the first
|
|
1514
|
+
// two states is ever reached
|
|
1487
1515
|
const connectClusterButton = this.page.getByRole('button', {
|
|
1488
1516
|
name: 'Connect cluster',
|
|
1489
1517
|
});
|
|
@@ -1494,7 +1522,8 @@ class ModelerCreatePage {
|
|
|
1494
1522
|
const deployEnabled = await setupDeployButton
|
|
1495
1523
|
.isEnabled()
|
|
1496
1524
|
.catch(() => false);
|
|
1497
|
-
|
|
1525
|
+
const deployDone = await isDeployReported();
|
|
1526
|
+
(0, test_1.expect)(connectVisible || deployEnabled || deployDone).toBe(true);
|
|
1498
1527
|
}).toPass({ timeout: 30000 });
|
|
1499
1528
|
const needsClusterConnect = await connectClusterButton
|
|
1500
1529
|
.isVisible()
|
|
@@ -1536,24 +1565,34 @@ class ModelerCreatePage {
|
|
|
1536
1565
|
// processApplicationId is defined, which it now is, so re-entering
|
|
1537
1566
|
// Play on an already-deployed process application legitimately
|
|
1538
1567
|
// has nothing to deploy and renders no Deploy button at all.
|
|
1539
|
-
const alreadyDeployed = await
|
|
1540
|
-
|
|
1541
|
-
|
|
1568
|
+
const alreadyDeployed = (await isDeployReported()) ||
|
|
1569
|
+
(await configureScenarioButton
|
|
1570
|
+
.isVisible({ timeout: 3000 })
|
|
1571
|
+
.catch(() => false)) ||
|
|
1572
|
+
(await configureTestPanel.isVisible().catch(() => false));
|
|
1542
1573
|
if (!alreadyDeployed) {
|
|
1543
1574
|
// Step 2: deploy — wait for enabled; button stays disabled until the cluster
|
|
1544
1575
|
// connection is confirmed by the backend after the Save in step 1.
|
|
1545
1576
|
await (0, test_1.expect)(setupDeployButton).toBeEnabled({ timeout: 30000 });
|
|
1546
1577
|
await setupDeployButton.click({ timeout });
|
|
1547
|
-
await (0, test_1.expect)(
|
|
1578
|
+
await (0, test_1.expect)(deploySuccessBadge).toBeAttached({ timeout: 90000 });
|
|
1548
1579
|
}
|
|
1549
|
-
// Step 3:
|
|
1550
|
-
//
|
|
1551
|
-
//
|
|
1552
|
-
//
|
|
1553
|
-
//
|
|
1554
|
-
// overlay
|
|
1580
|
+
// Step 3: reach the configure-test panel and confirm it really rendered.
|
|
1581
|
+
// The accordion panel opens step 3 on its own once the deploy step
|
|
1582
|
+
// completes (TestConfigurationPanel hides the setup overlay in an
|
|
1583
|
+
// effect); only the legacy overlay needed the "Configure test case"
|
|
1584
|
+
// click, and that click only called hideConfigurationOverlay(), so the
|
|
1585
|
+
// overlay's cluster-change effect could fire resetDeployment and bring
|
|
1586
|
+
// it straight back. Re-drive the button when it exists, but key the
|
|
1587
|
+
// retry on the panel rather than on the overlay: the new panel keeps its
|
|
1588
|
+
// "Setup environment" heading on screen alongside step 3, so an
|
|
1589
|
+
// overlay-visible check is now permanently true and would loop on a
|
|
1590
|
+
// button that no longer exists.
|
|
1555
1591
|
await (0, test_1.expect)(async () => {
|
|
1556
|
-
|
|
1592
|
+
const hasConfigureButton = await configureScenarioButton
|
|
1593
|
+
.isVisible()
|
|
1594
|
+
.catch(() => false);
|
|
1595
|
+
if (hasConfigureButton) {
|
|
1557
1596
|
await configureScenarioButton.click({ timeout });
|
|
1558
1597
|
}
|
|
1559
1598
|
await (0, test_1.expect)(configureTestPanel).toBeVisible({ timeout: 15000 });
|
|
@@ -1226,20 +1226,39 @@ class ModelerCreatePage {
|
|
|
1226
1226
|
.locator('..')
|
|
1227
1227
|
.getByRole('button', { name: 'Deploy' }))
|
|
1228
1228
|
.first();
|
|
1229
|
-
//
|
|
1230
|
-
//
|
|
1231
|
-
//
|
|
1232
|
-
//
|
|
1233
|
-
|
|
1234
|
-
|
|
1235
|
-
|
|
1236
|
-
|
|
1229
|
+
// Deploy completion signal. camunda-hub 8b4226983e (#28226, 2026-09-04)
|
|
1230
|
+
// replaced the overlay's "Process has been successfully deployed." status
|
|
1231
|
+
// text with a badge carrying `deploy-success-badge`; keep the old sentence
|
|
1232
|
+
// as a fallback for modeler builds from before that commit.
|
|
1233
|
+
const deploySuccessBadge = this.page
|
|
1234
|
+
.getByTestId('deploy-success-badge')
|
|
1235
|
+
.or(this.page.getByText('Process has been successfully deployed'))
|
|
1236
|
+
.first();
|
|
1237
|
+
// The same commit unified the setup overlay and the configure panel into
|
|
1238
|
+
// one accordion ("Setup environment" card, TestConfigurationPanel), which
|
|
1239
|
+
// deleted the `configure-test-case-button` primary button entirely: step 3
|
|
1240
|
+
// is now an accordion heading that is `disabled` until the deploy step
|
|
1241
|
+
// completes, and it opens on its own via a `hideConfigurationOverlay()`
|
|
1242
|
+
// effect once it does. So this locator is only a *fallback* nudge for when
|
|
1243
|
+
// the panel did not auto-open -- never the thing that advances the flow.
|
|
1244
|
+
// It must therefore never be used as an "is the deploy done" probe: the
|
|
1245
|
+
// heading is visible-but-disabled from the moment Play mounts, which is
|
|
1246
|
+
// exactly what made the old `alreadyDeployed` probe skip the deploy step
|
|
1247
|
+
// and then burn its whole budget clicking a permanently disabled button.
|
|
1248
|
+
const configureStepHeading = this.page
|
|
1237
1249
|
.getByTestId('configure-test-case-button')
|
|
1238
1250
|
.or(this.page.getByTestId('play-configuration-configure-scenario-button'))
|
|
1239
1251
|
.or(this.page.getByRole('button', {
|
|
1240
1252
|
name: /^Configure (test case|scenario)$/,
|
|
1241
1253
|
}))
|
|
1242
1254
|
.first();
|
|
1255
|
+
// Step 2 is an accordion item too, and its content (the Deploy button)
|
|
1256
|
+
// only renders visibly while that item is expanded. It expands by itself
|
|
1257
|
+
// once the cluster step completes, but a manual heading click is the
|
|
1258
|
+
// recovery path if it did not.
|
|
1259
|
+
const deployStepHeading = this.page.getByRole('button', {
|
|
1260
|
+
name: 'Deploy process',
|
|
1261
|
+
});
|
|
1243
1262
|
// Play settles into exactly ONE of three states, and which one is not
|
|
1244
1263
|
// knowable up front, so race them instead of timing out on each in turn:
|
|
1245
1264
|
// the setup overlay, the legacy Continue button, or the configure-test
|
|
@@ -1261,8 +1280,11 @@ class ModelerCreatePage {
|
|
|
1261
1280
|
// `test-studio-configuration-overlay` (confirmed in a failing run's trace
|
|
1262
1281
|
// DOM, and already fixed the same way in pages/SM-8.10). Anchor on the
|
|
1263
1282
|
// new data-test, keep the legacy attribute for older modeler builds, and
|
|
1264
|
-
// fall back to the "Setup environment" panel title.
|
|
1265
|
-
//
|
|
1283
|
+
// fall back to the "Setup environment" panel title. Since 8b4226983e the
|
|
1284
|
+
// data-test containers are gone and only the title matches, and the title
|
|
1285
|
+
// stays on screen once the configure step opens -- so this locator now
|
|
1286
|
+
// means "the setup panel exists", i.e. we are on the new flow. It is not a
|
|
1287
|
+
// signal that setup is still pending; `configureTestPanel` is.
|
|
1266
1288
|
const configurationOverlay = this.page
|
|
1267
1289
|
.locator('[data-test="test-studio-configuration-overlay"]')
|
|
1268
1290
|
.or(this.page.locator('[data-test="play-configuration-overlay"]'))
|
|
@@ -1320,30 +1342,81 @@ class ModelerCreatePage {
|
|
|
1320
1342
|
.getByRole('button', { name: 'Save' })
|
|
1321
1343
|
.click({ timeout });
|
|
1322
1344
|
}
|
|
1323
|
-
// Step 2: deploy, unless the
|
|
1324
|
-
//
|
|
1325
|
-
// processApplicationId is defined, which it now is, so re-entering
|
|
1326
|
-
//
|
|
1327
|
-
//
|
|
1328
|
-
|
|
1329
|
-
|
|
1330
|
-
|
|
1331
|
-
|
|
1332
|
-
|
|
1345
|
+
// Step 2: deploy, unless the setup panel already opened with the deploy
|
|
1346
|
+
// step complete. checkExistingDeployment only runs when
|
|
1347
|
+
// processApplicationId is defined, which it now is, so re-entering Play
|
|
1348
|
+
// on an already-deployed process application legitimately has nothing to
|
|
1349
|
+
// deploy and renders the success badge instead of a Deploy button.
|
|
1350
|
+
//
|
|
1351
|
+
// `deploy-success-badge` on its own is NOT a usable "is the deploy done"
|
|
1352
|
+
// probe. DeployStepContent renders it inside the "Deploy process"
|
|
1353
|
+
// accordion item, and TestConfigurationPanel collapses that item the
|
|
1354
|
+
// instant the deploy finishes (`isDeployStepComplete` ->
|
|
1355
|
+
// `hideConfigurationOverlay()` -> `isDeployOpen` false). Carbon keeps a
|
|
1356
|
+
// collapsed accordion's content mounted, so the badge stays in the DOM
|
|
1357
|
+
// but never becomes visible again -- which is exactly the nightly
|
|
1358
|
+
// failure: the locator resolved to the badge on every poll and read
|
|
1359
|
+
// "hidden" all 89 times. DeployStepIcon carries the same state in the
|
|
1360
|
+
// accordion *heading*, which stays on screen while the item is
|
|
1361
|
+
// collapsed, and the configure panel only opens once the deploy step
|
|
1362
|
+
// completes, so treat any of the three as proof.
|
|
1363
|
+
const deployCompleteIcon = this.page.locator('[aria-label="Deployment complete"]');
|
|
1364
|
+
const isDeployComplete = async () => (await deployCompleteIcon.isVisible().catch(() => false)) ||
|
|
1365
|
+
(await deploySuccessBadge.isVisible().catch(() => false)) ||
|
|
1366
|
+
(await configureTestPanel.isVisible().catch(() => false));
|
|
1367
|
+
if (!(await isDeployComplete())) {
|
|
1368
|
+
// The Deploy button lives inside the "Deploy process" accordion item,
|
|
1369
|
+
// which expands itself once the cluster step completes. Nudge the
|
|
1370
|
+
// heading if it is still collapsed, otherwise the button is present
|
|
1371
|
+
// but hidden and the click below would time out.
|
|
1372
|
+
const deployButtonShown = await setupDeployButton
|
|
1373
|
+
.isVisible({ timeout: 30000 })
|
|
1374
|
+
.catch(() => false);
|
|
1375
|
+
if (!deployButtonShown) {
|
|
1376
|
+
const canExpandDeployStep = await deployStepHeading
|
|
1377
|
+
.isEnabled({ timeout: 5000 })
|
|
1378
|
+
.catch(() => false);
|
|
1379
|
+
if (canExpandDeployStep) {
|
|
1380
|
+
await deployStepHeading.click({ timeout });
|
|
1381
|
+
}
|
|
1382
|
+
}
|
|
1383
|
+
// Wait for enabled; the button stays disabled until the cluster
|
|
1333
1384
|
// connection is confirmed by the backend after the Save in step 1.
|
|
1334
1385
|
await (0, test_1.expect)(setupDeployButton).toBeEnabled({ timeout: 60000 });
|
|
1335
|
-
|
|
1336
|
-
|
|
1386
|
+
// The click is retried against the completion probe rather than fired
|
|
1387
|
+
// once, because the same collapse re-renders the accordion around the
|
|
1388
|
+
// button: it detaches mid-click, which is the second nightly symptom
|
|
1389
|
+
// ("element is not visible", 58 retries, in the click call log). A
|
|
1390
|
+
// re-click can only happen while the deploy is provably still
|
|
1391
|
+
// incomplete AND the button is enabled -- a deploy in flight disables
|
|
1392
|
+
// it and a finished deploy replaces it with the badge, so this cannot
|
|
1393
|
+
// double-deploy. If the deploy never completes the loop still fails.
|
|
1394
|
+
await (0, test_1.expect)(async () => {
|
|
1395
|
+
if (await isDeployComplete()) {
|
|
1396
|
+
return;
|
|
1397
|
+
}
|
|
1398
|
+
const canClick = (await setupDeployButton.isVisible().catch(() => false)) &&
|
|
1399
|
+
(await setupDeployButton.isEnabled().catch(() => false));
|
|
1400
|
+
if (canClick) {
|
|
1401
|
+
await setupDeployButton.click({ timeout });
|
|
1402
|
+
}
|
|
1403
|
+
(0, test_1.expect)(await isDeployComplete()).toBe(true);
|
|
1404
|
+
}).toPass({ timeout: 120000, intervals: [1000, 2000, 5000] });
|
|
1337
1405
|
}
|
|
1338
|
-
// Step 3:
|
|
1339
|
-
//
|
|
1340
|
-
//
|
|
1341
|
-
//
|
|
1342
|
-
//
|
|
1343
|
-
//
|
|
1406
|
+
// Step 3: the configure-test-case step opens on its own once the deploy
|
|
1407
|
+
// step completes (TestConfigurationPanel hides the setup overlay in an
|
|
1408
|
+
// effect keyed on isDeployStepComplete). Wait for the panel that step
|
|
1409
|
+
// renders; only if it stays closed -- e.g. the panel's own
|
|
1410
|
+
// cluster-change effect fired resetDeployment and reopened setup -- fall
|
|
1411
|
+
// back to clicking the step heading, which by then is enabled.
|
|
1344
1412
|
await (0, test_1.expect)(async () => {
|
|
1345
|
-
if (await
|
|
1346
|
-
|
|
1413
|
+
if (!(await configureTestPanel.isVisible())) {
|
|
1414
|
+
const canOpenConfigureStep = await configureStepHeading
|
|
1415
|
+
.isEnabled({ timeout: 5000 })
|
|
1416
|
+
.catch(() => false);
|
|
1417
|
+
if (canOpenConfigureStep) {
|
|
1418
|
+
await configureStepHeading.click({ timeout: 15000 });
|
|
1419
|
+
}
|
|
1347
1420
|
}
|
|
1348
1421
|
await (0, test_1.expect)(configureTestPanel).toBeVisible({ timeout: 15000 });
|
|
1349
1422
|
}).toPass({ timeout: 90000 });
|