@camunda/e2e-test-suite 0.0.1037 → 0.0.1039

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 CHANGED
@@ -415,6 +415,26 @@ See [docs/ci-failure-categories.md](docs/ci-failure-categories.md) for the full
415
415
  - **C8 SM with Helm**: Tests are run against the alpha branch of the [camunda-platform-helm repository](https://github.com/camunda/camunda-platform-helm), using SNAPSHOT images for each component. This is peformed with both Elasticsearch and OpenSearch.
416
416
  - **C8 Run**: Tests are run against the main branch of the [camunda/camunda repository](https://github.com/camunda/camunda).
417
417
 
418
+ ## PR-Level vs Nightly Coverage (AlwaysGreen)
419
+
420
+ When a PR opens in [camunda/camunda](https://github.com/camunda/camunda) or [camunda/connectors](https://github.com/camunda/connectors), AlwaysGreen dispatches a subset of this suite against that PR's build. This is separate from this repo's own [Automatic test runs on PR](#automatic-test-runs-on-pr) above, which cover changes to the test suite itself rather than to the product.
421
+
422
+ | leg | scope | blocking | runtime |
423
+ | --- | --- | --- | --- |
424
+ | SaaS smoke | `test-setup`, `navigation`, `smoke-tests` | yes | 9–12 min |
425
+ | SaaS full | remaining specs (minus exclusions below) | no, until Nov 2026 | ~40–48 min |
426
+ | SM smoke | smoke suite | yes | — |
427
+ | SM full | full suite | no | — |
428
+
429
+ **Excluded from PR level entirely — nightly only.** Third-party model-endpoint specs bill an external provider on every run they're included in, so they stay out of the PR-blocking path:
430
+
431
+ - By spec file: `agentic-ai-user-flows.spec.ts`, `idp-user-flows.spec.ts`, `aws-connectors-user-flows.spec.ts` (AWS Bedrock, AgentCore, Vertex, Azure OpenAI)
432
+ - By tag `@ai-external`: the AI-generated-form tests inside `web-modeler-user-flows.spec.ts` (`Form.js Integration with User Task and AI Generated Form`, `Form.js Integration with AI generated Start form`)
433
+
434
+ **Kept in at PR level despite touching external systems:** Connector Secrets tests (reads from our own AWS/GCP secret managers — no model endpoint, no meaningful per-run cost) and MCP tests (run against our own cluster — no cost).
435
+
436
+ See [AlwaysGreen Iteration 2 - Alpha 5: Coverage & Optimisation](https://github.com/camunda/team-test-automation/issues/78) for the full rationale and current SaaS/SM stability data behind these boundaries.
437
+
418
438
  ## Test Suite Structure
419
439
 
420
440
  The test suite is organized using the Page Object Model design pattern, where each test file contains test scenarios related to a specific component or feature of the Camunda C8 product stack. Additionally, it leverages separate page objects for each web page or component being tested.
@@ -155,6 +155,7 @@ declare class ModelerCreatePage {
155
155
  clickDiagramBreadcrumb(): Promise<void>;
156
156
  clickEditDiagramNameButton(): Promise<void>;
157
157
  enterDiagramName(name: string): Promise<void>;
158
+ private diagramNameEditorOpen;
158
159
  clickVariableInput(): Promise<void>;
159
160
  fillVariableInput(variable: string): Promise<void>;
160
161
  clickEmbedFormButton(): Promise<void>;
@@ -799,25 +799,42 @@ class ModelerCreatePage {
799
799
  async enterDiagramName(name) {
800
800
  const maxAttempts = 3;
801
801
  for (let attempt = 0; attempt < maxAttempts; attempt++) {
802
- if (attempt > 0) {
803
- await this.clickDiagramBreadcrumb();
804
- await this.clickEditDiagramNameButton();
805
- }
806
- await this.diagramNameInput.fill(name, { timeout: 90000 });
807
- await this.diagramNameInput.press('Enter', { timeout: 90000 });
808
802
  try {
803
+ // Creating the diagram does not reliably leave the name editor open --
804
+ // hub opens the editor on the breadcrumb, and a slow canvas render
805
+ // lands on a closed one. The input therefore has to be opened on the
806
+ // FIRST attempt too, not only on a retry: reaching for it blind burnt
807
+ // the whole 90s fill timeout and threw straight out of this loop, so
808
+ // the reopen below (which exists for exactly this) never ran.
809
+ // clickEditDiagramNameButton() reopens the breadcrumb menu itself when
810
+ // it is closed, so it covers both the first attempt and a retry.
811
+ if (!(await this.diagramNameEditorOpen())) {
812
+ await this.clickEditDiagramNameButton();
813
+ }
814
+ // 20s rather than 90s: the editor is proven open at this point, so the
815
+ // long budget only delayed the retry that actually recovers -- and at
816
+ // 90s x 2 x 3 attempts this loop could outlive the 12min test timeout,
817
+ // losing the artifacts that explain the failure.
818
+ await this.diagramNameInput.fill(name, { timeout: 20000 });
819
+ await this.diagramNameInput.press('Enter', { timeout: 20000 });
809
820
  await this.diagramNameBreadcrumb(name).waitFor({
810
821
  state: 'visible',
811
822
  timeout: 30000,
812
823
  });
813
824
  return;
814
825
  }
815
- catch {
816
- console.warn(`Diagram rename to "${name}" did not commit on attempt ${attempt + 1}.`);
826
+ catch (error) {
827
+ console.warn(`Diagram rename to "${name}" did not commit on attempt ${attempt + 1}: ${error instanceof Error ? error.message : error}`);
817
828
  }
818
829
  }
819
830
  throw new Error(`Diagram name was not set to "${name}".`);
820
831
  }
832
+ async diagramNameEditorOpen() {
833
+ return this.diagramNameInput
834
+ .waitFor({ state: 'visible', timeout: 5000 })
835
+ .then(() => true)
836
+ .catch(() => false);
837
+ }
821
838
  async clickVariableInput() {
822
839
  await this.variableInput.click({ timeout: 60000 });
823
840
  }
@@ -477,6 +477,16 @@ class ModelerHomePage {
477
477
  await this.clickMessageBanner();
478
478
  },
479
479
  postAction: async () => {
480
+ // The project tile only renders on the Modeler home page. A failure
481
+ // that leaves the browser inside the project makes the tile unreachable
482
+ // by construction, so reloading the same URL cannot help and every
483
+ // remaining attempt just waits out its 60s visibility timeout before
484
+ // the helper throws. Step back out to home first.
485
+ const tileVisible = await this.becameVisible(this.crossComponentProjectFolder, 2000);
486
+ if (!tileVisible &&
487
+ (await this.becameVisible(this.homeBreadcrumb, 5000))) {
488
+ await this.homeBreadcrumb.click({ timeout: 15000 });
489
+ }
480
490
  await this.page.reload();
481
491
  await this.page.waitForLoadState('domcontentloaded');
482
492
  },
@@ -86,10 +86,17 @@ class ProcessApplicationPage {
86
86
  exact: true,
87
87
  });
88
88
  }
89
- // Either the folder explorer or the breadcrumb proves we are on the process
90
- // application page; .first() because both are present once it has rendered.
89
+ // Only the breadcrumb proves we are on the process application page. The
90
+ // folder explorer does NOT: hub renders a `region[name="Folder explorer"]` on
91
+ // the enclosing PROJECT page too (trace snapshots on a
92
+ // `...--cross-component-test-project` URL carry one), so accepting it let
93
+ // this resolve on the project page whenever creation had not actually landed.
94
+ // ModelerHomePage then remembered the project URL as the container URL and
95
+ // every later navigation went back to the project page, where the
96
+ // container's `[data-test="diagram-dropdown"]` create menu does not exist --
97
+ // surfacing 60s later as `element(s) not found` on an unrelated step.
91
98
  pageReady() {
92
- return this.folderExplorer.or(this.breadcrumb).first();
99
+ return this.breadcrumb;
93
100
  }
94
101
  async waitForProcessApplication(timeout = 90000) {
95
102
  await (0, test_1.expect)(this.pageReady()).toBeVisible({ timeout });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camunda/e2e-test-suite",
3
- "version": "0.0.1037",
3
+ "version": "0.0.1039",
4
4
  "description": "End-to-end test helpers for Camunda 8",
5
5
  "repository": {
6
6
  "type": "git",