@camunda/e2e-test-suite 0.0.1045 → 0.0.1047

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.
@@ -24,6 +24,7 @@ declare class ModelerHomePage {
24
24
  readonly uploadFilesButton: Locator;
25
25
  readonly messageBanner: Locator;
26
26
  readonly idpTemplateOption: Locator;
27
+ readonly idpEmptyStateButton: Locator;
27
28
  readonly idpApplicationNameInput: Locator;
28
29
  readonly createIdpApplicationButton: Locator;
29
30
  readonly dialog: Locator;
@@ -70,6 +71,7 @@ declare class ModelerHomePage {
70
71
  clickMessageBanner(): Promise<void>;
71
72
  selectCluster(clusterName: string): Promise<void>;
72
73
  clickIdpApplicationTemplateOption(): Promise<void>;
74
+ startIdpApplicationCreation(): Promise<void>;
73
75
  assertFormBreadcrumbVisible(formName: string): Promise<void>;
74
76
  }
75
77
  export { ModelerHomePage };
@@ -42,6 +42,7 @@ class ModelerHomePage {
42
42
  uploadFilesButton;
43
43
  messageBanner;
44
44
  idpTemplateOption;
45
+ idpEmptyStateButton;
45
46
  idpApplicationNameInput;
46
47
  createIdpApplicationButton;
47
48
  dialog;
@@ -74,6 +75,9 @@ class ModelerHomePage {
74
75
  this.idpTemplateOption = page
75
76
  .locator('[data-test="create-idp-application"]')
76
77
  .getByText('IDP Application');
78
+ this.idpEmptyStateButton = page.getByRole('button', {
79
+ name: 'Create IDP application',
80
+ });
77
81
  this.diagramTypeDropdown = page.locator('[data-test="diagram-dropdown"]');
78
82
  // Matched on the test id alone: hub's design-system variant of the create
79
83
  // menu renders "BPMN diagram" (lowercase d), so a text filter breaks the
@@ -612,6 +616,26 @@ class ModelerHomePage {
612
616
  async clickIdpApplicationTemplateOption() {
613
617
  await this.idpTemplateOption.click({ timeout: 120000 });
614
618
  }
619
+ // Which control starts an IDP application depends on whether the workspace
620
+ // root already holds a resource: hub's EntityTable renders the toolbar's
621
+ // create menu OR the empty state, never both (the same split
622
+ // clickCreateProcessApplication has to straddle). A workspace whose very
623
+ // first resource is the IDP application only ever offers the empty state's
624
+ // "Create IDP application" button, so waiting for the create menu there
625
+ // times out on `[data-test="diagram-dropdown"]`. Race both entry points,
626
+ // then use whichever one rendered.
627
+ async startIdpApplicationCreation() {
628
+ const rootLoaded = await this.becameVisible(this.idpEmptyStateButton.or(this.diagramTypeDropdown).first(), 60000);
629
+ if (!rootLoaded) {
630
+ await this.page.reload();
631
+ }
632
+ if (await this.becameVisible(this.idpEmptyStateButton, 5000)) {
633
+ await this.idpEmptyStateButton.click({ timeout: 60000 });
634
+ return;
635
+ }
636
+ await this.clickWorkspaceDiagramTypeDropdown();
637
+ await this.clickIdpApplicationTemplateOption();
638
+ }
615
639
  async assertFormBreadcrumbVisible(formName) {
616
640
  await (0, test_1.expect)(this.formNameBreadcrumb(formName)).toBeVisible({
617
641
  timeout: 120000,
@@ -870,11 +870,23 @@ class ModelerCreatePage {
870
870
  // the kebab once they render, so a mouse click lands on the tag instead.
871
871
  // Open the menu from the keyboard -- same control, reached the way a
872
872
  // keyboard user reaches it, and unaffected by what paints over it.
873
+ //
874
+ // The header also keeps settling after the editor paints -- license tags
875
+ // mount into that same ml-auto sibling and the breadcrumb label swaps to
876
+ // the persisted diagram name -- and either re-render unmounts an already
877
+ // open Radix menu, so re-open it on each attempt instead of clicking into
878
+ // a menu that may already be gone.
873
879
  const diagramActions = this.moreActionsButton.last();
874
- await diagramActions.focus();
875
- await diagramActions.press('Enter');
876
- await this.renameMenuItem.click();
877
- await (0, test_1.expect)(this.renameInput).toBeVisible({ timeout: 10000 });
880
+ await (0, test_1.expect)(async () => {
881
+ if (await this.renameMenuItem.isVisible()) {
882
+ await this.page.keyboard.press('Escape');
883
+ await (0, test_1.expect)(this.renameMenuItem).toBeHidden({ timeout: 5000 });
884
+ }
885
+ await diagramActions.focus();
886
+ await diagramActions.press('Enter');
887
+ await this.renameMenuItem.click({ timeout: 15000 });
888
+ await (0, test_1.expect)(this.renameInput).toBeVisible({ timeout: 10000 });
889
+ }).toPass({ timeout: 120000, intervals: [1000, 2000, 5000] });
878
890
  await this.renameInput.fill(name);
879
891
  await this.renameSubmitButton.click();
880
892
  await (0, test_1.expect)(this.renameInput).toBeHidden({ timeout: 10000 });
@@ -386,6 +386,23 @@ class ModelerHomePage {
386
386
  // open would otherwise have the next Enter close it again.
387
387
  async renameViaMoreActions(name) {
388
388
  const entityActions = this.moreActionsButton.last();
389
+ // The header keeps settling after the editor paints: the license tags
390
+ // mount into the ml-auto sibling and the breadcrumb label swaps from its
391
+ // placeholder to the persisted entity name. Either re-render shifts and
392
+ // then unmounts the open Radix menu ("element is not stable", then
393
+ // "element was detached from the DOM"), and the menu item never comes
394
+ // back because the menu itself closed. Re-open the menu on each attempt
395
+ // rather than clicking into one that may already be gone.
396
+ await (0, test_1.expect)(async () => {
397
+ if (await this.renameMenuItem.isVisible()) {
398
+ await this.page.keyboard.press('Escape');
399
+ await (0, test_1.expect)(this.renameMenuItem).toBeHidden({ timeout: 5000 });
400
+ }
401
+ await entityActions.focus();
402
+ await entityActions.press('Enter');
403
+ await this.renameMenuItem.click({ timeout: 15000 });
404
+ await (0, test_1.expect)(this.renameInput).toBeVisible({ timeout: 10000 });
405
+ }).toPass({ timeout: 120000, intervals: [1000, 2000, 5000] });
389
406
  await (0, test_1.expect)(async () => {
390
407
  await this.page.keyboard.press('Escape');
391
408
  await entityActions.focus();
@@ -109,7 +109,8 @@ _8_10_1.test.describe('Agentic Orchestation User Flows', () => {
109
109
  });
110
110
  _8_10_1.test.describe('AI Agent sub process - provider user tests flow', () => {
111
111
  for (const params of aiAgentSubProcessTestCases) {
112
- (0, _8_10_1.test)(`AI agent sub process with tools provides feedback to user - ${params.provider}`, async ({ appsPage, operateHomePage, operateProcessInstancePage, operateProcessesPage, taskPanelPage, taskDetailsPage, }) => {
112
+ // Skipped due to bug #8490: https://github.com/camunda/connectors/issues/8490
113
+ _8_10_1.test.skip(`AI agent sub process with tools provides feedback to user - ${params.provider}`, async ({ appsPage, operateHomePage, operateProcessInstancePage, operateProcessesPage, taskPanelPage, taskDetailsPage, }) => {
113
114
  _8_10_1.test.slow();
114
115
  const processKey = await (0, apiHelpers_1.deployProcess)(params.bpmnPath, authToken);
115
116
  if (processKey == null) {
@@ -168,7 +168,8 @@ _8_10_1.test.describe('Connectors User Flow Tests @tasklistV2', () => {
168
168
  await (0, UtilitiesPage_1.assertLocatorVisibleWithRetry)(operateProcessInstancePage, operateProcessInstancePage.completedIcon, 'Completed icon', 60000);
169
169
  });
170
170
  });
171
- (0, _8_10_1.test)('Connector Secrets User Flow - GCP', async ({ page, homePage, modelerHomePage, appsPage, modelerCreatePage, connectorSettingsPage, operateHomePage, operateProcessesPage, operateProcessInstancePage, clusterPage, clusterSecretsPage, }) => {
171
+ // Skipped due to bug #8500: https://github.com/camunda/connectors/issues/8500
172
+ _8_10_1.test.skip('Connector Secrets User Flow - GCP', async ({ page, homePage, modelerHomePage, appsPage, modelerCreatePage, connectorSettingsPage, operateHomePage, operateProcessesPage, operateProcessInstancePage, clusterPage, clusterSecretsPage, }) => {
172
173
  _8_10_1.test.slow();
173
174
  const processName = 'REST_Connector_Process' + (await (0, _setup_1.generateRandomStringAsync)(3));
174
175
  await _8_10_1.test.step('Navigate to Connectors Secrets', async () => {
@@ -221,7 +222,8 @@ _8_10_1.test.describe('Connectors User Flow Tests @tasklistV2', () => {
221
222
  });
222
223
  });
223
224
  });
224
- (0, _8_10_1.test)('Connector Secrets User Flow - AWS', async ({ page, modelerHomePage, appsPage, modelerCreatePage, connectorSettingsPage, operateHomePage, operateProcessesPage, operateProcessInstancePage, }) => {
225
+ // Skipped due to bug #8500: https://github.com/camunda/connectors/issues/8500
226
+ _8_10_1.test.skip('Connector Secrets User Flow - AWS', async ({ page, modelerHomePage, appsPage, modelerCreatePage, connectorSettingsPage, operateHomePage, operateProcessesPage, operateProcessInstancePage, }) => {
225
227
  _8_10_1.test.slow();
226
228
  const processName = 'REST_Connector_Process' + (await (0, _setup_1.generateRandomStringAsync)(3));
227
229
  await _8_10_1.test.step('Navigate to Web Modeler', async () => {
@@ -69,7 +69,8 @@ _8_10_1.test.describe('IDP User Flow Tests', () => {
69
69
  });
70
70
  _8_10_1.test.describe('Unstructured Extraction', () => {
71
71
  for (const params of unstructuredTestCases) {
72
- (0, _8_10_1.test)(`${params.provider} unstructured (${params.model}) - User creates an idp application with a document extraction template`, async ({ page, idpCreatePage, modelerHomePage, homePage, appsPage, clusterPage, clusterSecretsPage, }) => {
72
+ // Skipped due to bug #8500: https://github.com/camunda/connectors/issues/8500
73
+ _8_10_1.test.skip(`${params.provider} unstructured (${params.model}) - User creates an idp application with a document extraction template`, async ({ page, idpCreatePage, modelerHomePage, homePage, appsPage, clusterPage, clusterSecretsPage, }) => {
73
74
  _8_10_1.test.slow();
74
75
  idpApplicationName = await (0, randomName_1.randomNameAgregator)(`${params.provider} unstructured` + ' - IDP_Application_Name');
75
76
  idpDocumentExtractionTemplateName = await (0, randomName_1.randomNameAgregator)(`${params.provider} unstructured` + ' - IDP_Extraction_Template_Name');
@@ -94,10 +95,11 @@ _8_10_1.test.describe('IDP User Flow Tests', () => {
94
95
  await modelerHomePage.clickCrossComponentProjectFolder();
95
96
  });
96
97
  await _8_10_1.test.step('Add an IDP application to the project', async () => {
97
- // Workspace-level menu: an IDP application can only be created at
98
- // workspace root, never inside a process application.
99
- await modelerHomePage.clickWorkspaceDiagramTypeDropdown();
100
- await modelerHomePage.clickIdpApplicationTemplateOption();
98
+ // Workspace root only: an IDP application can never be created
99
+ // inside a process application. The entry point there is the create
100
+ // menu or the empty state, depending on whether the workspace
101
+ // already holds a resource.
102
+ await modelerHomePage.startIdpApplicationCreation();
101
103
  });
102
104
  await _8_10_1.test.step('Creates a document extraction template', async () => {
103
105
  await modelerHomePage.enterIdpApplicationName(idpApplicationName);
@@ -143,7 +145,8 @@ _8_10_1.test.describe('IDP User Flow Tests', () => {
143
145
  });
144
146
  _8_10_1.test.describe('Structured Extraction', () => {
145
147
  for (const params of structuredTestCases) {
146
- (0, _8_10_1.test)(`${params.provider} structured - User creates an idp application with a document extraction template`, async ({ page, idpCreatePage, modelerHomePage, homePage, appsPage, clusterPage, clusterSecretsPage, }) => {
148
+ // Skipped due to bug #8500: https://github.com/camunda/connectors/issues/8500
149
+ _8_10_1.test.skip(`${params.provider} structured - User creates an idp application with a document extraction template`, async ({ page, idpCreatePage, modelerHomePage, homePage, appsPage, clusterPage, clusterSecretsPage, }) => {
147
150
  _8_10_1.test.slow();
148
151
  idpApplicationName = await (0, randomName_1.randomNameAgregator)(`${params.provider} structured` + ' - IDP_Application_Name');
149
152
  idpDocumentExtractionTemplateName = await (0, randomName_1.randomNameAgregator)(`${params.provider} structured` + ' - IDP_Extraction_Template_Name');
@@ -168,10 +171,11 @@ _8_10_1.test.describe('IDP User Flow Tests', () => {
168
171
  await modelerHomePage.clickCrossComponentProjectFolder();
169
172
  });
170
173
  await _8_10_1.test.step('Add an IDP application to the project', async () => {
171
- // Workspace-level menu: an IDP application can only be created at
172
- // workspace root, never inside a process application.
173
- await modelerHomePage.clickWorkspaceDiagramTypeDropdown();
174
- await modelerHomePage.clickIdpApplicationTemplateOption();
174
+ // Workspace root only: an IDP application can never be created
175
+ // inside a process application. The entry point there is the create
176
+ // menu or the empty state, depending on whether the workspace
177
+ // already holds a resource.
178
+ await modelerHomePage.startIdpApplicationCreation();
175
179
  });
176
180
  await _8_10_1.test.step('Creates a document extraction template', async () => {
177
181
  await modelerHomePage.enterIdpApplicationName(idpApplicationName);
@@ -224,7 +228,8 @@ _8_10_1.test.describe('IDP User Flow Tests', () => {
224
228
  });
225
229
  _8_10_1.test.describe('Classification Template', () => {
226
230
  for (const params of classificationTestCases) {
227
- (0, _8_10_1.test)(`${params.provider} classification - User creates an idp application with a classification template`, async ({ page, idpCreatePage, modelerHomePage, homePage, appsPage, clusterPage, clusterSecretsPage, }) => {
231
+ // Skipped due to bug #8500: https://github.com/camunda/connectors/issues/8500
232
+ _8_10_1.test.skip(`${params.provider} classification - User creates an idp application with a classification template`, async ({ page, idpCreatePage, modelerHomePage, homePage, appsPage, clusterPage, clusterSecretsPage, }) => {
228
233
  _8_10_1.test.slow();
229
234
  const idpApplicationName = await (0, randomName_1.randomNameAgregator)(`${params.provider} classification` + ' - IDP_Application_Name');
230
235
  const idpClassificationTemplateName = await (0, randomName_1.randomNameAgregator)(`${params.provider} classification` +
@@ -250,10 +255,11 @@ _8_10_1.test.describe('IDP User Flow Tests', () => {
250
255
  await modelerHomePage.clickCrossComponentProjectFolder();
251
256
  });
252
257
  await _8_10_1.test.step('Add an IDP application to the project', async () => {
253
- // Workspace-level menu: an IDP application can only be created at
254
- // workspace root, never inside a process application.
255
- await modelerHomePage.clickWorkspaceDiagramTypeDropdown();
256
- await modelerHomePage.clickIdpApplicationTemplateOption();
258
+ // Workspace root only: an IDP application can never be created
259
+ // inside a process application. The entry point there is the create
260
+ // menu or the empty state, depending on whether the workspace
261
+ // already holds a resource.
262
+ await modelerHomePage.startIdpApplicationCreation();
257
263
  });
258
264
  await _8_10_1.test.step('Creates a classification template', async () => {
259
265
  await modelerHomePage.enterIdpApplicationName(idpApplicationName);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camunda/e2e-test-suite",
3
- "version": "0.0.1045",
3
+ "version": "0.0.1047",
4
4
  "description": "End-to-end test helpers for Camunda 8",
5
5
  "repository": {
6
6
  "type": "git",