@camunda/e2e-test-suite 0.0.577 → 0.0.579

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.
Files changed (79) hide show
  1. package/dist/resources/Basic_Auth_REST_Connector.bpmn +62 -0
  2. package/dist/resources/Camunda_Simple_User_Task_1.bpmn +41 -0
  3. package/dist/resources/Camunda_Simple_User_Task_2.bpmn +41 -0
  4. package/dist/resources/Camunda_Simple_User_Task_3.bpmn +41 -0
  5. package/dist/resources/Camunda_Simple_User_Task_4.bpmn +41 -0
  6. package/dist/resources/Camunda_Simple_User_Task_5.bpmn +41 -0
  7. package/dist/resources/Candidate_User_Process_Three_Tasks.bpmn +116 -0
  8. package/dist/resources/Candidate_User_Process_Two_Tasks.bpmn +91 -0
  9. package/dist/resources/Conditional_Events_All.bpmn +111 -0
  10. package/dist/resources/Connectors Document Handling.bpmn +298 -0
  11. package/dist/resources/ConnectorsBasicTest.bpmn +2292 -0
  12. package/dist/resources/Intermediate_Event_Webhook_Connector_No_Auth_Process.bpmn +60 -0
  13. package/dist/resources/Job_Worker_Process.bpmn +38 -0
  14. package/dist/resources/New Form.form +24 -0
  15. package/dist/resources/Play_Test_User_Service_Task.bpmn +56 -0
  16. package/dist/resources/REST_Connector_Bearer_Auth_Process.bpmn +53 -0
  17. package/dist/resources/REST_Connector_No_Auth_Process.bpmn +52 -0
  18. package/dist/resources/Rest Connector Timer Event.bpmn +227 -0
  19. package/dist/resources/SM_Document_Handling_Connectors_User_Flow.bpmn +297 -0
  20. package/dist/resources/Start_Event_Webhook_Connector_No_Auth_Process.bpmn +43 -0
  21. package/dist/resources/Start_Form_Process.bpmn +29 -0
  22. package/dist/resources/User_Task_Editing_Variables.bpmn +41 -0
  23. package/dist/resources/User_Task_Process_With_Form.bpmn +41 -0
  24. package/dist/resources/User_Task_Process_With_Form_2.bpmn +41 -0
  25. package/dist/resources/User_Task_Process_With_Form_3.bpmn +42 -0
  26. package/dist/resources/User_Task_Process_With_Form_API.bpmn +41 -0
  27. package/dist/resources/Variable_Process.bpmn +38 -0
  28. package/dist/resources/Zeebe_User_Task.bpmn +41 -0
  29. package/dist/resources/Zeebe_User_Task_Process_With_Priority.bpmn +145 -0
  30. package/dist/resources/agentic_ai/ai-agent-chat-user-feedback.form +87 -0
  31. package/dist/resources/agentic_ai/ai-agent-chat-with-tools_aws.bpmn +443 -0
  32. package/dist/resources/agentic_ai/ai-agent-chat-with-tools_azure.bpmn +441 -0
  33. package/dist/resources/agentic_ai/ai-agent-chat-with-tools_open_ai.bpmn +438 -0
  34. package/dist/resources/agentic_ai/ai-agent-subprocess-with-tools_aws_key.bpmn +115 -0
  35. package/dist/resources/camunda.png +0 -0
  36. package/dist/resources/cluster_variables/cluster_variable_global_scope.bpmn +59 -0
  37. package/dist/resources/cluster_variables/cluster_variable_json_form.form +49 -0
  38. package/dist/resources/cluster_variables/cluster_variable_json_mutable.bpmn +33 -0
  39. package/dist/resources/cluster_variables/cluster_variable_json_readonly.bpmn +59 -0
  40. package/dist/resources/cluster_variables/cluster_variable_string_form.form +31 -0
  41. package/dist/resources/cluster_variables/cluster_variable_string_mutable.bpmn +31 -0
  42. package/dist/resources/cluster_variables/cluster_variable_string_readonly.bpmn +57 -0
  43. package/dist/resources/cluster_variables/preview_cluster_variables.form +49 -0
  44. package/dist/resources/connectors/aws/agentcore-runtime.bpmn +70 -0
  45. package/dist/resources/connectors/aws/bedrock-agentcore-ltm.bpmn +73 -0
  46. package/dist/resources/connectors/aws/bedrock-knowledge-base.bpmn +72 -0
  47. package/dist/resources/connectors/db_vector_connector/db-vector-plain-text_azure_open_ai.bpmn +183 -0
  48. package/dist/resources/connectors/db_vector_connector/db-vector-plain-text_open_ai.bpmn +178 -0
  49. package/dist/resources/connectors/db_vector_connector/db-vector-plain-text_openai_amazon_opensearch.bpmn +189 -0
  50. package/dist/resources/connectors/db_vector_connector/db-vector-retrieve-data.form +34 -0
  51. package/dist/resources/idp/idp_sample_bank_statement.pdf +0 -0
  52. package/dist/resources/idp/structured_invoice_1.pdf +74 -0
  53. package/dist/resources/idp/structured_invoice_2.pdf +74 -0
  54. package/dist/resources/idp/structured_invoice_3.pdf +74 -0
  55. package/dist/resources/idp/structured_invoice_test.pdf +74 -0
  56. package/dist/resources/mcp_server/keycloak/camunda-platform-realm.json +45 -0
  57. package/dist/resources/mcp_server/mcp_remote_client_basic_auth.bpmn +69 -0
  58. package/dist/resources/mcp_server/mcp_remote_client_bearer_auth.bpmn +68 -0
  59. package/dist/resources/mcp_server/mcp_remote_client_oauth_auth.bpmn +76 -0
  60. package/dist/resources/mcp_server/mcp_remote_client_operations.bpmn +373 -0
  61. package/dist/resources/mcp_server/mcp_server_list_tools.bpmn +69 -0
  62. package/dist/resources/mcp_server_saas/mcp_cluster_tools.bpmn +168 -0
  63. package/dist/resources/mcp_server_saas/mcp_incident_test_file.bpmn +54 -0
  64. package/dist/resources/mcp_server_saas/mcp_incident_tools.bpmn +240 -0
  65. package/dist/resources/mcp_server_saas/mcp_process_definition_test_file.bpmn +51 -0
  66. package/dist/resources/mcp_server_saas/mcp_process_definition_tools.bpmn +234 -0
  67. package/dist/resources/mcp_server_saas/mcp_process_instance_test_file.bpmn +51 -0
  68. package/dist/resources/mcp_server_saas/mcp_process_instance_tools.bpmn +232 -0
  69. package/dist/resources/mcp_server_saas/mcp_user_task_test_file.bpmn +55 -0
  70. package/dist/resources/mcp_server_saas/mcp_user_task_tools.bpmn +309 -0
  71. package/dist/resources/mcp_server_saas/mcp_variable_test_file.bpmn +35 -0
  72. package/dist/resources/mcp_server_saas/mcp_variable_tools.bpmn +170 -0
  73. package/dist/resources/simple_pdf.pdf +0 -0
  74. package/dist/resources/simple_text.txt +1 -0
  75. package/dist/resources/test-api-v2-complete.sh +12202 -0
  76. package/dist/resources/workspace-templates/camunda-nightlies/camunda-nightlies.guidance.md +72 -0
  77. package/dist/resources/workspace-templates/camunda-nightlies/camunda-nightlies.guidance.yaml +28 -0
  78. package/dist/tests/8.10/operate-access-flow.spec.js +52 -65
  79. package/package.json +2 -2
@@ -0,0 +1,72 @@
1
+ # Camunda Nightlies — Workspace Guidance
2
+
3
+ ## Role
4
+
5
+ You are a cross-repo CI/CD debugger for Camunda 8 Self-Managed nightly workflows. Your job is to triage failing nightly scenarios on GKE, isolate the failure to a Helm chart issue, an E2E test issue, or a documented behavior change, and ship a coordinated fix across the relevant repositories. You operate primarily across two engineering repos — the Helm charts (Go/Helm) and the cross-component Playwright E2E tests — with the docs repo as a reference for user-facing behavior and release notes. Default posture: reproduce locally before changing code, keep diffs small and version-scoped, and validate end-to-end via the same nightly matrix that flagged the regression.
6
+
7
+ ## Repositories and how they relate
8
+
9
+ - **`{{.WorkspacePath}}/camunda-platform-helm/`** — Camunda 8 Self-Managed Helm charts plus Go-based DX tooling (`scripts/camunda-deployer`, `scripts/deploy-camunda`, `scripts/prepare-helm-values`, `scripts/vault-secret-mapper`) and chart unit tests with golden snapshots. Owns the nightly matrix workflow (`.github/workflows/test-chart-version-nightly.yaml`) that deploys each supported chart version to GKE and triggers the E2E suite. Exposes `scripts/render-e2e-env.sh`, which the E2E repo uses to mint `.env` files from a live cluster. Convention: `AGENTS.md` + `CLAUDE.md` + `SKILLS.md` at repo root, plus `.github/AGENTS.md` for CI-specific context.
10
+ - **`{{.WorkspacePath}}/c8-cross-component-e2e-tests/`** — Playwright + TypeScript end-to-end suite covering Console, Modeler, Operate, Optimize, Tasklist, Connectors, and Identity across SaaS, Self-Managed (Helm), and C8 Run. Published as the `@camunda/e2e-test-suite` npm package and consumed by the `c8e2e` distributed runner that schedules sharded K8s Jobs on GKE. Tests are version-segregated (`tests/SM-8.x/`, `tests/c8Run-8.x/`) and select fixtures via `MINOR_VERSION`. Convention: `AGENTS.md` + `SKILLS.md` at repo root.
11
+ - **`{{.WorkspacePath}}/camunda-docs/`** — The user-facing Camunda 8 documentation site (Docusaurus). Use it to confirm intended product behavior, locate version-specific upgrade notes, and update guidance when a Helm value or component default changes. No agent-instruction file is present; treat `howtos/` and the versioned docs trees (`docs/`, `versioned_docs/`) as the source of truth and follow `howtos/documentation-guidelines.md` plus `howtos/technical-writing-styleguide.md` when editing.
12
+
13
+ ## Standard workflows
14
+
15
+ 1. **Triage a failing nightly run.**
16
+ - `gh run list --repo camunda/camunda-platform-helm --workflow test-chart-version-nightly.yaml --limit 10`
17
+ - `gh run view <run-id> --repo camunda/camunda-platform-helm --log-failed | head -300` to identify which matrix cell (chart version × scenario) failed.
18
+ - Determine whether the failure is in deploy (Helm/Go) or test (Playwright). Deploy failures stay in `camunda-platform-helm/`; test-only failures usually start in `c8-cross-component-e2e-tests/`.
19
+ - Cross-check `camunda-docs/` for a recent behavior change in the affected component or version.
20
+
21
+ 2. **Reproduce a Self-Managed deploy locally.**
22
+ - `cd {{.WorkspacePath}}/camunda-platform-helm`
23
+ - `make tools.asdf-install` (one-time, installs pinned Go/Helm/kubectl/kind/yq/jq).
24
+ - `make helm.dependency-update chartPath=charts/camunda-platform-8.10`
25
+ - `make helm.template chartPath=charts/camunda-platform-8.10` to render, or `make helm.dry-run chartPath=charts/camunda-platform-8.10` for a deploy preview.
26
+ - For golden-test regressions: `cd charts/camunda-platform-8.10/test/unit && go test ./<pkg>/... -run <TestName>`. Update goldens with `make go.update-golden-only-lite chartPath=charts/camunda-platform-8.10` while iterating, then `make go.test chartPath=charts/camunda-platform-8.10` before finalizing.
27
+
28
+ 3. **Reproduce an E2E failure against the same GKE namespace the nightly used.**
29
+ - `cd {{.WorkspacePath}}/c8-cross-component-e2e-tests && npm install && npx playwright install`
30
+ - Render credentials from the live cluster:
31
+ ```bash
32
+ HELM_REPO={{.WorkspacePath}}/camunda-platform-helm \
33
+ bash "$HELM_REPO/scripts/render-e2e-env.sh" \
34
+ --absolute-chart-path "$HELM_REPO/charts/camunda-platform-8.10" \
35
+ --namespace <nightly-namespace> \
36
+ --output .env --not-ci --verbose
37
+ ```
38
+ - `npx playwright test --project=chromium tests/SM-8.10/<failing-spec>.spec.ts --trace on` to capture a trace; open with `npx playwright show-trace test-results/.../trace.zip`.
39
+ - Or replay distributed: `c8e2e test --target SM-8.10 --endpoint <cluster-url> --credentials file://./.env --file-pattern "<spec-name>" --shards 1 --follow`.
40
+
41
+ 4. **Ship a coordinated cross-repo fix.**
42
+ - Branch each repo with the same prefix, e.g. `fix/nightly-<ticket>-<short-slug>`; use Conventional Commits for PR titles in both engineering repos.
43
+ - When a Helm value or default changes user-visible behavior, open a `camunda-docs/` PR in the same cycle and link all three PRs to each other in the description.
44
+ - Land the Helm PR first (it gates the nightly matrix), then the E2E PR; if a docs change is required, merge it after both engineering PRs land so the docs site reflects shipped behavior.
45
+ - For chart changes, never edit goldens by hand — regenerate via `make go.update-golden-only chartPath=...` and commit the snapshot diff alongside template changes.
46
+
47
+ 5. **Validate against the nightly matrix.**
48
+ - Trigger an ad-hoc run: `gh workflow run test-chart-version-nightly.yaml --repo camunda/camunda-platform-helm -f <inputs>` (inspect the workflow file for current input keys).
49
+ - Watch with `gh run watch <run-id> --repo camunda/camunda-platform-helm`.
50
+ - For E2E-only changes, prefer `c8e2e test ... --follow` against an existing cluster before re-running the full matrix to save time and quota.
51
+
52
+ 6. **Reference behavior in docs.**
53
+ - When in doubt about expected product behavior, read the matching version under `{{.WorkspacePath}}/camunda-docs/versioned_docs/version-8.x/` rather than guessing from chart values. If the docs disagree with observed behavior, that is itself a finding worth flagging in the PR description.
54
+
55
+ ## Validation
56
+
57
+ A change is considered done only when all of the following hold:
58
+
59
+ - **Local unit/lint gate passes** in any repo touched: `make helm.lint chartPath=...` and `make go.test chartPath=...` for charts; `npm run lint` and a targeted `npx playwright test` for E2E; `npm run build` (Docusaurus) for docs.
60
+ - **Targeted reproduction passes**: the previously failing test or scenario succeeds locally against a freshly-deployed namespace, with a Playwright trace captured and reviewed if the fix touched UI flows.
61
+ - **Nightly matrix re-run is green** for the affected chart version(s). For wider blast-radius changes (shared templates, `_helpers.tpl`, fixture changes), require a green run across all currently supported chart versions, not just the one where the failure surfaced.
62
+ - **Cross-repo links are wired**: Helm PR, E2E PR, and (if applicable) docs PR each reference the others; the originating nightly run URL is in the PR description so the next on-call can audit the trail.
63
+
64
+ ## Conventions
65
+
66
+ - **Branching**: feature branches off `main` in each repo. Use a shared slug across coordinated PRs (`fix/nightly-<ticket>-<slug>`, `feat/<slug>`) so reviewers can find the counterpart quickly.
67
+ - **Commits and PR titles**: Conventional Commits (`fix:`, `feat:`, `chore:`, `test:`, `docs:`) — required by the Helm repo, applied uniformly here for consistency. Keep diffs small and version-scoped; do not refactor unrelated areas in a nightly fix.
68
+ - **Version awareness**: chart layout differs across versions (e.g. 8.8+ uses unified `templates/orchestration/`, 8.7 and earlier do not). Always inspect the target version's templates before editing. E2E tests follow the same split via `MINOR_VERSION` and `tests/SM-8.x/` directories.
69
+ - **Goldens**: regenerate with `make` targets only; hand-edits are rejected on review.
70
+ - **Credentials and environment**: nightly clusters live under `*.ci.distro.ultrawombat.com`; never commit `.env` files. Generate them on demand with `scripts/render-e2e-env.sh` (requires `kubectl`, `jq`, `envsubst`, and a `gcloud auth` session with access to the GKE project). The `c8e2e` runner image lives at `registry.camunda.cloud/team-distribution/c8e2e-playwright-runner`; pulling/pushing requires Harbor credentials in the local Docker keychain.
71
+ - **Toolchain**: Helm repo pins versions in `.tool-versions` (asdf-managed): Go 1.26.1, Helm 3.20.1, kubectl 1.27.16, kind 0.31.0, yq 4.52.5, jq 1.8.1, bats 1.11.0. E2E repo uses Node per `.nvmrc` and Playwright ^1.49.0. Match these locally to avoid divergence from CI.
72
+ - **Docs hygiene**: when editing `camunda-docs/`, follow `howtos/documentation-guidelines.md` and run `npm run build` locally; respect Vale rules (`.vale.ini`).
@@ -0,0 +1,28 @@
1
+ name: camunda-nightlies
2
+ description: "Cross-repo debugging of Camunda 8 Self-Managed nightly failures"
3
+ purpose: |
4
+ You are a cross-repo CI/CD debugger for Camunda 8 Self-Managed nightly workflows.
5
+ You operate across two repositories — Helm charts (Go/Helm) and E2E tests
6
+ (Playwright/TypeScript) — to diagnose, fix, and validate failing nightly scenarios on GKE.
7
+
8
+ repos:
9
+ - url: https://github.com/camunda/camunda-platform-helm.git
10
+ path: camunda-platform-helm
11
+ default_branch: main
12
+ - url: https://github.com/camunda/c8-cross-component-e2e-tests.git
13
+ path: c8-cross-component-e2e-tests
14
+ default_branch: main
15
+ - url: https://github.com/camunda/camunda-docs.git
16
+ path: camunda-docs
17
+ default_branch: main
18
+
19
+ # Derive AGENTS.md and SKILLS.md from repo contents at create time.
20
+ # Each repo's own AGENTS.md/SKILLS.md (or CLAUDE.md / .claude/skills/*/SKILL.md as
21
+ # fallbacks) is pulled in and composed with workspace context.
22
+ derive:
23
+ agents_from: AGENTS.md
24
+ skills_from: SKILLS.md
25
+ # Workspace-level guidance, fed into the AI derive prompt and prepended to
26
+ # plain derive output. Refresh with:
27
+ # workspace templates derive-guidance camunda-nightlies --ai claude --force
28
+ ai_guidance: camunda-nightlies.guidance.md
@@ -8,9 +8,18 @@ const apiHelpers_1 = require("../../utils/apiHelpers");
8
8
  const users_1 = require("../../utils/users");
9
9
  const urlHelpers_1 = require("../../utils/urlHelpers");
10
10
  const testUser = (0, users_1.getTestUser)('twentySecondUser');
11
- // This test covers the manual scenario: create a new API client via UI, copy the Operate URL, and verify the Operate endpoint denies unauthenticated access.
11
+ // This suite covers the manual scenario: create a new API client via UI,
12
+ // copy the API URL from the credentials, and verify that the cluster's V2
13
+ // API endpoints require authentication.
14
+ //
15
+ // V2 endpoints (/v2/process-definitions/search, /v2/user-tasks/search, ...)
16
+ // are served by the Zeebe REST API exposed at ZEEBE_REST_ADDRESS in the
17
+ // client credentials — NOT by the Operate URL (the Operate URL is the SPA
18
+ // frontend and returns 200 + HTML for unknown paths, so a previous version
19
+ // of this spec that POSTed V2 paths to it always saw 200/HTML and never
20
+ // the auth response under test).
12
21
  _8_10_1.test.describe.configure({ mode: 'parallel' });
13
- _8_10_1.test.describe('Operate access requires authentication @tasklistV2', () => {
22
+ _8_10_1.test.describe('Cluster V2 API requires authentication @tasklistV2', () => {
14
23
  let clientName;
15
24
  const clusterName = 'Test Cluster';
16
25
  _8_10_1.test.beforeEach(async ({ page, loginPage }, testInfo) => {
@@ -26,122 +35,100 @@ _8_10_1.test.describe('Operate access requires authentication @tasklistV2', () =
26
35
  await clusterDetailsPage.deleteAPIClientsIfExist(clientName);
27
36
  }
28
37
  });
29
- (0, _8_10_1.test)('check that request POST /v2/process-definitions/search returns 401 without credentials', async ({ homePage, clusterPage, clusterDetailsPage, clientCredentialsDetailsPage, request, }) => {
30
- clientName = `operate-deny-${await (0, _setup_1.generateRandomStringAsync)(5)}`;
31
- await _8_10_1.test.step('Add API Client to Cluster', async () => {
38
+ (0, _8_10_1.test)('check that request POST /v2/process-definitions/search returns 401 without credentials', async ({ homePage, clusterPage, clusterDetailsPage, request, }) => {
39
+ clientName = `cluster-deny-${await (0, _setup_1.generateRandomStringAsync)(5)}`;
40
+ let zeebeRestUrl = '';
41
+ await _8_10_1.test.step('Add API Client and capture Zeebe REST URL', async () => {
32
42
  await homePage.clickClusters();
33
43
  await clusterPage.clickClusterLink(clusterName);
34
44
  await clusterDetailsPage.clickAPITab();
35
- await clusterDetailsPage.createAPIClient(clientName);
45
+ const variables = await clusterDetailsPage.createAPIClientAndReturnVariables(clientName, true);
46
+ zeebeRestUrl = variables.zeebeUrl;
47
+ (0, test_1.expect)(zeebeRestUrl).toMatch(/^https?:\/\//);
36
48
  await clusterDetailsPage.clickCloseModalButton();
37
49
  await (0, test_1.expect)(clusterDetailsPage.clientsList.filter({ hasText: clientName })).toBeVisible({ timeout: 6000 });
38
50
  });
39
- let operateUrl = '';
40
- await _8_10_1.test.step('Capture Operate URL from client credentials page and close it', async () => {
41
- await clusterDetailsPage.searchAndClickClientCredentialsLink(clientName);
42
- operateUrl = await clientCredentialsDetailsPage.getOperateUrl();
43
- (0, test_1.expect)(operateUrl).toMatch(/^https?:\/\//);
44
- await clientCredentialsDetailsPage.goBack();
45
- await clusterDetailsPage.clickAPITab();
46
- });
47
51
  await _8_10_1.test.step('POST search endpoint without auth should be rejected', async () => {
48
- const sanitizedOperateUrl = (0, urlHelpers_1.sanitizeUrl)(operateUrl);
49
- const response = await request.post(`${sanitizedOperateUrl}/v2/process-definitions/search`, {
50
- data: { filter: {}, size: 10 },
52
+ const sanitizedUrl = (0, urlHelpers_1.sanitizeUrl)(zeebeRestUrl);
53
+ const response = await request.post(`${sanitizedUrl}/v2/process-definitions/search`, {
54
+ data: { filter: {}, page: { limit: 10 } },
51
55
  });
52
56
  (0, test_1.expect)(response.status()).toBe(401);
53
- const body = await response.text();
54
- (0, test_1.expect)(body).toBe('');
55
57
  });
56
58
  });
57
- (0, _8_10_1.test)('check that request POST /v2/process-definitions/search returns 200 with valid credentials', async ({ homePage, clusterPage, clusterDetailsPage, clientCredentialsDetailsPage, request, }) => {
58
- clientName = `operate-allow-${await (0, _setup_1.generateRandomStringAsync)(5)}`;
59
- let operateUrl = '';
60
- await _8_10_1.test.step('Add API Client to Cluster', async () => {
59
+ (0, _8_10_1.test)('check that request POST /v2/process-definitions/search returns 200 with valid credentials', async ({ homePage, clusterPage, clusterDetailsPage, request, }) => {
60
+ clientName = `cluster-allow-${await (0, _setup_1.generateRandomStringAsync)(5)}`;
61
+ let zeebeRestUrl = '';
62
+ await _8_10_1.test.step('Add API Client and capture Zeebe REST URL', async () => {
61
63
  await homePage.clickClusters();
62
64
  await clusterPage.clickClusterLink(clusterName);
63
65
  await clusterDetailsPage.clickAPITab();
64
- await clusterDetailsPage.createAPIClient(clientName);
66
+ const variables = await clusterDetailsPage.createAPIClientAndReturnVariables(clientName, true);
67
+ zeebeRestUrl = variables.zeebeUrl;
68
+ (0, test_1.expect)(zeebeRestUrl).toMatch(/^https?:\/\//);
65
69
  await clusterDetailsPage.clickCloseModalButton();
66
70
  await (0, test_1.expect)(clusterDetailsPage.clientsList.filter({ hasText: clientName })).toBeVisible({ timeout: 6000 });
67
71
  });
68
- await _8_10_1.test.step('Capture Operate URL', async () => {
69
- await clusterDetailsPage.searchAndClickClientCredentialsLink(clientName);
70
- operateUrl = await clientCredentialsDetailsPage.getOperateUrl();
71
- (0, test_1.expect)(operateUrl).toMatch(/^https?:\/\//);
72
- await clientCredentialsDetailsPage.goBack();
73
- await clusterDetailsPage.clickAPITab();
74
- });
75
72
  await _8_10_1.test.step('POST search endpoint with valid Zeebe bearer token returns 200 or is routed', async () => {
76
73
  const validToken = await (0, apiHelpers_1.authSaasAPI)();
77
- const sanitizedOperateUrl = (0, urlHelpers_1.sanitizeUrl)(operateUrl);
78
- const response = await request.post(`${sanitizedOperateUrl}/v2/process-definitions/search`, {
74
+ const sanitizedUrl = (0, urlHelpers_1.sanitizeUrl)(zeebeRestUrl);
75
+ const response = await request.post(`${sanitizedUrl}/v2/process-definitions/search`, {
79
76
  headers: {
80
77
  Authorization: validToken,
81
78
  'Content-Type': 'application/json',
82
79
  },
83
- data: { filter: {}, size: 10 },
80
+ data: { filter: {}, page: { limit: 10 } },
84
81
  });
85
- (0, test_1.expect)([200, 405]).toContain(response.status());
82
+ (0, test_1.expect)([200, 400, 405]).toContain(response.status());
86
83
  if (response.status() === 200) {
87
84
  const body = await response.json();
88
85
  (0, test_1.expect)(body).toHaveProperty('items');
89
86
  }
90
87
  });
91
88
  });
92
- (0, _8_10_1.test)('check that POST /v2/user-tasks/search returns 401 without credentials', async ({ homePage, clusterPage, clusterDetailsPage, clientCredentialsDetailsPage, request, }) => {
89
+ (0, _8_10_1.test)('check that POST /v2/user-tasks/search returns 401 without credentials', async ({ homePage, clusterPage, clusterDetailsPage, request, }) => {
93
90
  clientName = `tasklist-deny-${await (0, _setup_1.generateRandomStringAsync)(5)}`;
94
- let operateUrl = '';
95
- await _8_10_1.test.step('Add API Client to Cluster', async () => {
91
+ let zeebeRestUrl = '';
92
+ await _8_10_1.test.step('Add API Client and capture Zeebe REST URL', async () => {
96
93
  await homePage.clickClusters();
97
94
  await clusterPage.clickClusterLink(clusterName);
98
95
  await clusterDetailsPage.clickAPITab();
99
- await clusterDetailsPage.createAPIClient(clientName);
96
+ const variables = await clusterDetailsPage.createAPIClientAndReturnVariables(clientName, true);
97
+ zeebeRestUrl = variables.zeebeUrl;
98
+ (0, test_1.expect)(zeebeRestUrl).toMatch(/^https?:\/\//);
100
99
  await clusterDetailsPage.clickCloseModalButton();
101
100
  await (0, test_1.expect)(clusterDetailsPage.clientsList.filter({ hasText: clientName })).toBeVisible({ timeout: 6000 });
102
101
  });
103
- await _8_10_1.test.step('Capture Operate URL (base URL shared with Tasklist v2 endpoint)', async () => {
104
- await clusterDetailsPage.searchAndClickClientCredentialsLink(clientName);
105
- operateUrl = await clientCredentialsDetailsPage.getOperateUrl();
106
- (0, test_1.expect)(operateUrl).toMatch(/^https?:\/\//);
107
- await clientCredentialsDetailsPage.goBack();
108
- await clusterDetailsPage.clickAPITab();
109
- });
110
102
  await _8_10_1.test.step('POST /v2/user-tasks/search without auth returns 401', async () => {
111
- const sanitizedOperateUrl = (0, urlHelpers_1.sanitizeUrl)(operateUrl);
112
- const response = await request.post(`${sanitizedOperateUrl}/v2/user-tasks/search`, {
113
- data: { filter: {}, size: 10 },
103
+ const sanitizedUrl = (0, urlHelpers_1.sanitizeUrl)(zeebeRestUrl);
104
+ const response = await request.post(`${sanitizedUrl}/v2/user-tasks/search`, {
105
+ data: { filter: {}, page: { limit: 10 } },
114
106
  });
115
107
  (0, test_1.expect)(response.status()).toBe(401);
116
108
  });
117
109
  });
118
- (0, _8_10_1.test)('check that POST /v2/process-definitions/search with wrong-audience token returns 401', async ({ homePage, clusterPage, clusterDetailsPage, clientCredentialsDetailsPage, request, }) => {
119
- clientName = `operate-wrong-aud-${await (0, _setup_1.generateRandomStringAsync)(5)}`;
120
- let operateUrl = '';
121
- await _8_10_1.test.step('Add API Client to Cluster', async () => {
110
+ (0, _8_10_1.test)('check that POST /v2/process-definitions/search with wrong-audience token returns 401', async ({ homePage, clusterPage, clusterDetailsPage, request, }) => {
111
+ clientName = `cluster-wrong-aud-${await (0, _setup_1.generateRandomStringAsync)(5)}`;
112
+ let zeebeRestUrl = '';
113
+ await _8_10_1.test.step('Add API Client and capture Zeebe REST URL', async () => {
122
114
  await homePage.clickClusters();
123
115
  await clusterPage.clickClusterLink(clusterName);
124
116
  await clusterDetailsPage.clickAPITab();
125
- await clusterDetailsPage.createAPIClient(clientName);
117
+ const variables = await clusterDetailsPage.createAPIClientAndReturnVariables(clientName, true);
118
+ zeebeRestUrl = variables.zeebeUrl;
119
+ (0, test_1.expect)(zeebeRestUrl).toMatch(/^https?:\/\//);
126
120
  await clusterDetailsPage.clickCloseModalButton();
127
121
  await (0, test_1.expect)(clusterDetailsPage.clientsList.filter({ hasText: clientName })).toBeVisible({ timeout: 6000 });
128
122
  });
129
- await _8_10_1.test.step('Capture Operate URL', async () => {
130
- await clusterDetailsPage.searchAndClickClientCredentialsLink(clientName);
131
- operateUrl = await clientCredentialsDetailsPage.getOperateUrl();
132
- (0, test_1.expect)(operateUrl).toMatch(/^https?:\/\//);
133
- await clientCredentialsDetailsPage.goBack();
134
- await clusterDetailsPage.clickAPITab();
135
- });
136
- await _8_10_1.test.step('Token scoped for Optimize audience rejected by Operate endpoint', async () => {
123
+ await _8_10_1.test.step('Token scoped for Optimize audience rejected by Zeebe REST endpoint', async () => {
137
124
  const optimizeToken = await (0, apiHelpers_1.authSaasAPI)(process.env.OPTIMIZE_API_TOKEN_AUDIENCE);
138
- const sanitizedOperateUrl = (0, urlHelpers_1.sanitizeUrl)(operateUrl);
139
- const response = await request.post(`${sanitizedOperateUrl}/v2/process-definitions/search`, {
125
+ const sanitizedUrl = (0, urlHelpers_1.sanitizeUrl)(zeebeRestUrl);
126
+ const response = await request.post(`${sanitizedUrl}/v2/process-definitions/search`, {
140
127
  headers: {
141
128
  Authorization: optimizeToken,
142
129
  'Content-Type': 'application/json',
143
130
  },
144
- data: { filter: {}, size: 10 },
131
+ data: { filter: {}, page: { limit: 10 } },
145
132
  });
146
133
  (0, test_1.expect)([401, 403]).toContain(response.status());
147
134
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camunda/e2e-test-suite",
3
- "version": "0.0.577",
3
+ "version": "0.0.579",
4
4
  "description": "End-to-end test helpers for Camunda 8",
5
5
  "repository": {
6
6
  "type": "git",
@@ -26,7 +26,7 @@
26
26
  "test:local": "node --env-file=.env ./runTest.js",
27
27
  "lint": "tsc && eslint . --ext .ts",
28
28
  "lint:fix": "eslint . --ext .ts --fix",
29
- "build": "tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json",
29
+ "build": "tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json && cp -r resources dist/resources",
30
30
  "build:c8e2e": "npm run build --prefix tools/c8e2e",
31
31
  "build:gremlin": "npm run build --prefix tools/gremlin",
32
32
  "bundle:gremlin": "node scripts/bundle-gremlin.js",