@camunda/e2e-test-suite 0.0.1101 → 0.0.1103
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/README.md +5 -34
- package/dist/pages/8.10/ModelerCreatePage.js +66 -27
- package/dist/test-setup.js +3 -14
- package/package.json +1 -2
- package/playwright.config.ts +2 -2
package/README.md
CHANGED
|
@@ -406,7 +406,7 @@ MCP tests can still be run locally on macOS and Windows using the instructions a
|
|
|
406
406
|
|
|
407
407
|
## Automated Nightly Test Runs
|
|
408
408
|
|
|
409
|
-
The test suite is configured to run automatically every night. The results of these nightly test runs are published
|
|
409
|
+
The test suite is configured to run automatically every night. The results of these nightly test runs are published as a Playwright HTML report artifact. If any test fails during these automated runs, the Designated Responsible Individual (DRI) of the project is notified via email for immediate attention and resolution. On a nightly basis, the test suite is configured to run the following tests:
|
|
410
410
|
|
|
411
411
|
Failures are classified into categories (Infrastructure, Flaky, Product, Mixed) to aid triage.
|
|
412
412
|
See [docs/ci-failure-categories.md](docs/ci-failure-categories.md) for the full model and criteria.
|
|
@@ -520,8 +520,8 @@ issues or instability, an HTML report automatically opens, facilitating in-depth
|
|
|
520
520
|
|
|
521
521
|
### On the CI:
|
|
522
522
|
|
|
523
|
-
Within the CI environment, test results are accessible
|
|
524
|
-
|
|
523
|
+
Within the CI environment, test results are accessible via the Playwright HTML report artifact attached to the
|
|
524
|
+
GitHub Actions run. These reports not only include detailed test results but also feature screenshots. In case of a test failure, you
|
|
525
525
|
will find the stacktrace. Furthermore, the CI environment offers extensive tools for in-depth analysis of test results
|
|
526
526
|
and reports.
|
|
527
527
|
|
|
@@ -536,7 +536,7 @@ use: {
|
|
|
536
536
|
```
|
|
537
537
|
|
|
538
538
|
Don't keep this enabled, or you'll blow up the disk space quickly. Files are recorded in the `test-results/videos`
|
|
539
|
-
folder locally and to
|
|
539
|
+
folder locally and attached to the Playwright HTML report / uploaded as a build artifact in the CI.
|
|
540
540
|
|
|
541
541
|
## Contributing
|
|
542
542
|
|
|
@@ -613,35 +613,6 @@ Before marking a PR as ready for review:
|
|
|
613
613
|
- [ ] Change scope is appropriate — large multi-version changes are split into separate PRs
|
|
614
614
|
- [ ] A relevant test workflow has been run and **passed**
|
|
615
615
|
- [ ] The workflow run URL is pasted in the PR description
|
|
616
|
-
- [ ]
|
|
617
|
-
|
|
618
|
-
### TestRail Integration
|
|
619
|
-
|
|
620
|
-
Test case documentation in TestRail is **automatically synced** from spec files. When a PR adds or modifies test cases, the sync workflow uses AI (GitHub Copilot) to generate human-readable step descriptions directly from the Playwright test code.
|
|
621
|
-
|
|
622
|
-
#### How to trigger the sync
|
|
623
|
-
|
|
624
|
-
**Option A — Label after a passing test run (recommended)**
|
|
625
|
-
|
|
626
|
-
1. Run the relevant test workflow and confirm it passes.
|
|
627
|
-
2. Add the `testrail-test-case` label to the PR.
|
|
628
|
-
3. The [Sync TestRail Cases](https://github.com/camunda/c8-cross-component-e2e-tests/actions/workflows/sync-testrail-cases.yml) workflow fires automatically, detects the changed spec files, and enriches the matching TestRail cases with AI-generated steps.
|
|
629
|
-
|
|
630
|
-
> Re-triggering is easy: remove the label and add it again.
|
|
631
|
-
|
|
632
|
-
**Option B — Manual dispatch**
|
|
633
|
-
|
|
634
|
-
Go to [Actions → Sync TestRail Cases → Run workflow](https://github.com/camunda/c8-cross-component-e2e-tests/actions/workflows/sync-testrail-cases.yml) and provide the version and spec file path manually. Useful for one-off enrichment without opening a PR.
|
|
635
|
-
|
|
636
|
-
#### What the sync does
|
|
637
|
-
|
|
638
|
-
- Finds the matching TestRail case by automation ID (set by the JUnit reporter) or normalised title.
|
|
639
|
-
- Skips cases that already have steps on the correct template.
|
|
640
|
-
- Re-enriches cases that are on the wrong TestRail template (fixes template + steps in one pass).
|
|
641
|
-
- Calls the GitHub Copilot API to produce Action + Expected Result step rows from the raw Playwright code.
|
|
642
|
-
|
|
643
|
-
#### Access
|
|
644
|
-
|
|
645
|
-
If you do not have access to TestRail, contact the Test Automation Team to request access.
|
|
616
|
+
- [ ] Update Confluence if applicable
|
|
646
617
|
|
|
647
618
|
Thank you for using the C8 Cross-Component End-to-End Test Suite for Camunda C8 full product stack e2e testing. Happy testing! If you have any questions or need assistance, feel free to reach out to the maintainers for support.
|
|
@@ -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 });
|
package/dist/test-setup.js
CHANGED
|
@@ -9,12 +9,9 @@ const crypto_1 = require("crypto");
|
|
|
9
9
|
const axios_1 = __importDefault(require("axios"));
|
|
10
10
|
const constants_1 = require("./utils/constants");
|
|
11
11
|
async function captureScreenshot(page, testInfo) {
|
|
12
|
-
// Skip on passed/skipped:
|
|
13
|
-
//
|
|
14
|
-
//
|
|
15
|
-
// value but was a dominant driver of excess TestRail attachment storage.
|
|
16
|
-
// Skip explicitly on passed/skipped rather than gating on
|
|
17
|
-
// `=== 'failed'`, so a timed-out or interrupted test -- exactly the
|
|
12
|
+
// Skip on passed/skipped: a passing-test screenshot has negligible
|
|
13
|
+
// debugging value. Skip explicitly on passed/skipped rather than gating
|
|
14
|
+
// on `=== 'failed'`, so a timed-out or interrupted test -- exactly the
|
|
18
15
|
// cases where a screenshot is most useful -- still gets one.
|
|
19
16
|
if (testInfo.status === 'passed' || testInfo.status === 'skipped') {
|
|
20
17
|
return;
|
|
@@ -43,10 +40,6 @@ async function captureScreenshot(page, testInfo) {
|
|
|
43
40
|
path: screenshotPath,
|
|
44
41
|
contentType: 'image/png',
|
|
45
42
|
});
|
|
46
|
-
testInfo.annotations.push({
|
|
47
|
-
type: 'testrail_attachment',
|
|
48
|
-
description: screenshotPath,
|
|
49
|
-
});
|
|
50
43
|
}
|
|
51
44
|
exports.captureScreenshot = captureScreenshot;
|
|
52
45
|
async function captureFailureVideo(page, testInfo) {
|
|
@@ -65,10 +58,6 @@ async function captureFailureVideo(page, testInfo) {
|
|
|
65
58
|
path: videoPath,
|
|
66
59
|
contentType: 'video/webm',
|
|
67
60
|
});
|
|
68
|
-
testInfo.annotations.push({
|
|
69
|
-
type: 'testrail_attachment',
|
|
70
|
-
description: videoPath,
|
|
71
|
-
});
|
|
72
61
|
}
|
|
73
62
|
}
|
|
74
63
|
exports.captureFailureVideo = captureFailureVideo;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@camunda/e2e-test-suite",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.1103",
|
|
4
4
|
"description": "End-to-end test helpers for Camunda 8",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -22,7 +22,6 @@
|
|
|
22
22
|
"access": "public"
|
|
23
23
|
},
|
|
24
24
|
"scripts": {
|
|
25
|
-
"sync-testrail": "node scripts/sync-testrail-cases.js",
|
|
26
25
|
"test": "playwright test",
|
|
27
26
|
"test:local": "node --env-file=.env ./runTest.js",
|
|
28
27
|
"lint": "tsc && eslint . --ext .ts",
|
package/playwright.config.ts
CHANGED
|
@@ -10,7 +10,7 @@ if (!process.env.CAMUNDA_OPTIMIZE_BASE_URL && process.env.BASE_URL) {
|
|
|
10
10
|
|
|
11
11
|
const projectName = process.env.PROJECT! || 'Chromium'; // Default to 'default-project' if PROJECT is not set
|
|
12
12
|
|
|
13
|
-
const
|
|
13
|
+
const junitOptions = {
|
|
14
14
|
embedAnnotationsAsProperties: true,
|
|
15
15
|
outputFile: './test-results/junit-report.xml',
|
|
16
16
|
};
|
|
@@ -18,7 +18,7 @@ const testRailOptions = {
|
|
|
18
18
|
// Define reporters without SlackReporter
|
|
19
19
|
const useReportersWithoutSlack: any[] = [
|
|
20
20
|
['list'],
|
|
21
|
-
['junit',
|
|
21
|
+
['junit', junitOptions],
|
|
22
22
|
['html', {outputFolder: 'html-report'}],
|
|
23
23
|
['json', {outputFile: `json-report/results.json`}],
|
|
24
24
|
];
|