@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
- const setupDeployButton = this.page
1413
- .getByText('Deploy process')
1414
- .locator('..')
1415
- .getByRole('button', { name: 'Deploy' });
1416
- // Both attributes on this button have been renamed by camunda-hub, in
1417
- // separate commits: a90fd06 changed the label from "Configure scenario" to
1418
- // "Configure test case", and b3958a1649 (#27259, 2026-08-07) then changed
1419
- // the test id from `play-configuration-configure-scenario-button` to
1420
- // `configure-test-case-button`. Match current test id, then pre-rename test
1421
- // id, then either label, so a further rename of any single attribute cannot
1422
- // break the step.
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 two stable states before
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
- (0, test_1.expect)(connectVisible || deployEnabled).toBe(true);
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 configureScenarioButton
1540
- .isVisible({ timeout: 3000 })
1541
- .catch(() => false);
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)(this.page.getByText('Process has been successfully deployed')).toBeVisible({ timeout: 90000 });
1578
+ await (0, test_1.expect)(deploySuccessBadge).toBeAttached({ timeout: 90000 });
1548
1579
  }
1549
- // Step 3: leave the overlay, and confirm we actually left it. The
1550
- // button only calls hideConfigurationOverlay(); the overlay's own
1551
- // cluster-change effect can then fire resetDeployment and bring it
1552
- // straight back, and ConfigureTestPanel stays null while it is up.
1553
- // Assert the panel really rendered, and re-drive the click if the
1554
- // overlay returned.
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
- if (await configurationOverlay.isVisible()) {
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
- // Both attributes on this button have been renamed by camunda-hub, in
1230
- // separate commits: a90fd06 changed the label from "Configure scenario" to
1231
- // "Configure test case", and b3958a1649 (#27259, 2026-08-07) then changed
1232
- // the test id from `play-configuration-configure-scenario-button` to
1233
- // `configure-test-case-button`. Match current test id, then pre-rename test
1234
- // id, then either label, so a further rename of any single attribute cannot
1235
- // break the step.
1236
- const configureScenarioButton = this.page
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. This locator means
1265
- // "the setup panel is still on screen".
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 overlay already opened with the
1324
- // deploy step complete. checkExistingDeployment only runs when
1325
- // processApplicationId is defined, which it now is, so re-entering
1326
- // Play on an already-deployed process application legitimately
1327
- // has nothing to deploy and renders no Deploy button at all.
1328
- const alreadyDeployed = await configureScenarioButton
1329
- .isVisible({ timeout: 3000 })
1330
- .catch(() => false);
1331
- if (!alreadyDeployed) {
1332
- // Step 2: deploy wait for enabled; button stays disabled until the cluster
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
- await setupDeployButton.click({ timeout });
1336
- await (0, test_1.expect)(this.page.getByText('Process has been successfully deployed')).toBeVisible({ timeout: 90000 });
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: leave the overlay, and confirm we actually left it. The
1339
- // button only calls hideConfigurationOverlay(); the overlay's own
1340
- // cluster-change effect can then fire resetDeployment and bring it
1341
- // straight back, and ConfigureTestPanel stays null while it is up.
1342
- // Assert the panel really rendered, and re-drive the click if the
1343
- // overlay returned.
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 configurationOverlay.isVisible()) {
1346
- await configureScenarioButton.click({ timeout });
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 });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camunda/e2e-test-suite",
3
- "version": "0.0.1102",
3
+ "version": "0.0.1104",
4
4
  "description": "End-to-end test helpers for Camunda 8",
5
5
  "repository": {
6
6
  "type": "git",