@camunda/e2e-test-suite 0.0.35 → 0.0.37

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.
@@ -89,6 +89,8 @@ declare class ModelerCreatePage {
89
89
  readonly publicAccessToggle: Locator;
90
90
  readonly publicationTab: Locator;
91
91
  readonly copyPublicLinkButton: Locator;
92
+ readonly formLinkedSuccessMessage: Locator;
93
+ readonly diagramNameBreadcrumb: (diagramName: string) => Locator;
92
94
  constructor(page: Page);
93
95
  modelJobWorkerDiagram(processName: string, embedFrom?: boolean): Promise<void>;
94
96
  assertProcessInstanceLinkWithRetry(clusterName: string): Promise<void>;
@@ -200,5 +202,7 @@ declare class ModelerCreatePage {
200
202
  clickCopyPublicLinkButton(): Promise<void>;
201
203
  getPublicationLink(): Promise<string>;
202
204
  embedForm(formName: string): Promise<void>;
205
+ assertFormEmbedded(): Promise<void>;
206
+ assertDiagramNameSet(diagramName: string): Promise<void>;
203
207
  }
204
208
  export { ModelerCreatePage };
@@ -94,6 +94,8 @@ class ModelerCreatePage {
94
94
  publicAccessToggle;
95
95
  publicationTab;
96
96
  copyPublicLinkButton;
97
+ formLinkedSuccessMessage;
98
+ diagramNameBreadcrumb;
97
99
  constructor(page) {
98
100
  this.page = page;
99
101
  this.generalPanel = page.locator('[data-group-id="group-general"]');
@@ -261,6 +263,12 @@ class ModelerCreatePage {
261
263
  this.copyPublicLinkButton = page.getByRole('button', {
262
264
  name: 'Copy to clipboard',
263
265
  });
266
+ this.formLinkedSuccessMessage = page
267
+ .locator('.cds--toast-notification__subtitle')
268
+ .getByText('Form has been successfully linked.');
269
+ this.diagramNameBreadcrumb = (diagramName) => page.locator('button[data-test="breadcrumb-diagram"]', {
270
+ hasText: diagramName,
271
+ });
264
272
  }
265
273
  async modelJobWorkerDiagram(processName, embedFrom = false) {
266
274
  await (0, test_1.expect)(this.generalPanel).toBeVisible({
@@ -1054,5 +1062,13 @@ class ModelerCreatePage {
1054
1062
  await this.clickForm(formName);
1055
1063
  await this.clickEmbedButton();
1056
1064
  }
1065
+ async assertFormEmbedded() {
1066
+ await (0, test_1.expect)(this.formLinkedSuccessMessage).toBeVisible({ timeout: 15000 });
1067
+ }
1068
+ async assertDiagramNameSet(diagramName) {
1069
+ await (0, test_1.expect)(this.diagramNameBreadcrumb(diagramName)).toBeVisible({
1070
+ timeout: 60000,
1071
+ });
1072
+ }
1057
1073
  }
1058
1074
  exports.ModelerCreatePage = ModelerCreatePage;
@@ -20,6 +20,7 @@ declare class ModelerHomePage {
20
20
  readonly messageBanner: Locator;
21
21
  readonly closeButton: Locator;
22
22
  readonly optionsButton: Locator;
23
+ readonly formNameBreadcrumb: (formName: string) => Locator;
23
24
  constructor(page: Page);
24
25
  clickCreateNewProjectButton(): Promise<void>;
25
26
  enterNewProjectName(name: string): Promise<void>;
@@ -40,5 +41,6 @@ declare class ModelerHomePage {
40
41
  clickManageButton(retries?: number): Promise<void>;
41
42
  clickUploadFilesButton(): Promise<void>;
42
43
  clickMessageBanner(): Promise<void>;
44
+ assertFormBreadcrumbVisible(formName: string): Promise<void>;
43
45
  }
44
46
  export { ModelerHomePage };
@@ -25,6 +25,7 @@ class ModelerHomePage {
25
25
  messageBanner;
26
26
  closeButton;
27
27
  optionsButton;
28
+ formNameBreadcrumb;
28
29
  constructor(page) {
29
30
  this.page = page;
30
31
  this.modelerPageBanner = page.getByRole('banner', {
@@ -59,6 +60,9 @@ class ModelerHomePage {
59
60
  this.messageBanner = page.locator('[data-test="close-top-banner"]');
60
61
  this.closeButton = page.getByRole('button', { name: 'Got it - Dismiss' });
61
62
  this.optionsButton = page.getByRole('button', { name: 'Options' });
63
+ this.formNameBreadcrumb = (formName) => page.locator('button[data-test="breadcrumb-form"]', {
64
+ hasText: formName,
65
+ });
62
66
  }
63
67
  async clickCreateNewProjectButton() {
64
68
  await this.createNewProjectButton.click({ timeout: 90000 });
@@ -163,5 +167,10 @@ class ModelerHomePage {
163
167
  console.log('No additional banner or close button found to click');
164
168
  }
165
169
  }
170
+ async assertFormBreadcrumbVisible(formName) {
171
+ await (0, test_1.expect)(this.formNameBreadcrumb(formName)).toBeVisible({
172
+ timeout: 120000,
173
+ });
174
+ }
166
175
  }
167
176
  exports.ModelerHomePage = ModelerHomePage;
@@ -133,7 +133,7 @@ async function completeTaskWithRetry(taskPanelPage, taskDetailsPage, taskName, t
133
133
  for (let attempt = 0; attempt < maxRetries; attempt++) {
134
134
  try {
135
135
  await taskPanelPage.openTask(taskName);
136
- await (0, sleep_1.sleep)(2000);
136
+ await (0, test_1.expect)(taskDetailsPage.detailsInfo.getByText(taskName, { exact: true })).toBeVisible();
137
137
  if (!(await taskDetailsPage.assignedToMeText.isVisible())) {
138
138
  await taskDetailsPage.clickAssignToMeButton();
139
139
  }
@@ -145,9 +145,10 @@ async function completeTaskWithRetry(taskPanelPage, taskDetailsPage, taskName, t
145
145
  catch (error) {
146
146
  if (attempt < maxRetries - 1) {
147
147
  console.warn(`Attempt ${attempt + 1} failed for completing task ${taskName}. Retrying...`);
148
+ await (0, sleep_1.sleep)(2000);
148
149
  }
149
150
  else {
150
- throw new Error(`Assertion failed after ${maxRetries} attempts`);
151
+ throw new Error(`Failed to complete task ${taskName} after ${maxRetries} attempts: ${error}`);
151
152
  }
152
153
  }
153
154
  }
@@ -5,7 +5,7 @@ declare class ClusterSecretsPage {
5
5
  readonly keyInput: Locator;
6
6
  readonly valueInput: Locator;
7
7
  readonly createButton: Locator;
8
- readonly operationsButton: Locator;
8
+ readonly optionsButton: Locator;
9
9
  readonly deleteConnectorSecretButton: Locator;
10
10
  readonly deleteConnectorSecretSubButton: Locator;
11
11
  readonly dialog: Locator;
@@ -14,20 +14,26 @@ declare class ClusterSecretsPage {
14
14
  readonly bulkImportTextArea: Locator;
15
15
  readonly dialogImportButton: Locator;
16
16
  readonly secretsSearchBox: Locator;
17
+ readonly clusterBanner: Locator;
18
+ readonly clusterLink: (name: string) => Locator;
19
+ readonly clusterSecretTab: Locator;
20
+ readonly confirmDeleteInput: Locator;
17
21
  constructor(page: Page);
18
22
  deleteConnectorSecretsIfExist(): Promise<void>;
19
- clickCreateNewSecretButton(): Promise<void>;
23
+ clickCreateNewSecretButton(cluster: string): Promise<void>;
24
+ clickClusterBanner(): Promise<void>;
25
+ clickCluster(name: string): Promise<void>;
20
26
  clickKeyInput(): Promise<void>;
21
27
  fillKeyInput(key: string): Promise<void>;
22
28
  clickValueInput(): Promise<void>;
23
29
  fillValueInput(value: string): Promise<void>;
24
30
  clickCreateButton(): Promise<void>;
25
- createNewSecret(key: string, value: string): Promise<void>;
26
- createSetOfSecrets(secrets: {
31
+ createNewSecret(key: string, value: string, cluster: string): Promise<void>;
32
+ createSetOfSecrets(cluster: string, secrets: {
27
33
  name: string;
28
34
  value: string;
29
35
  }[]): Promise<void>;
30
- assertSecretsOrCreate(secrets: {
36
+ assertSecretsOrCreate(cluster: string, secrets: {
31
37
  name: string;
32
38
  value: string;
33
39
  }[]): Promise<void>;
@@ -10,7 +10,7 @@ class ClusterSecretsPage {
10
10
  keyInput;
11
11
  valueInput;
12
12
  createButton;
13
- operationsButton;
13
+ optionsButton;
14
14
  deleteConnectorSecretButton;
15
15
  deleteConnectorSecretSubButton;
16
16
  dialog;
@@ -19,6 +19,10 @@ class ClusterSecretsPage {
19
19
  bulkImportTextArea;
20
20
  dialogImportButton;
21
21
  secretsSearchBox;
22
+ clusterBanner;
23
+ clusterLink;
24
+ clusterSecretTab;
25
+ confirmDeleteInput;
22
26
  constructor(page) {
23
27
  this.page = page;
24
28
  this.createNewSecretButton = page.getByRole('button', {
@@ -27,12 +31,12 @@ class ClusterSecretsPage {
27
31
  this.keyInput = page.getByLabel('Key');
28
32
  this.valueInput = page.getByLabel('Value', { exact: true });
29
33
  this.createButton = page.getByRole('button', { name: 'Create', exact: true });
30
- this.operationsButton = page.getByRole('button', {
31
- name: 'operations',
32
- exact: true,
33
- });
34
+ this.optionsButton = page
35
+ .getByRole('cell', { name: 'Options' })
36
+ .getByRole('button');
34
37
  this.deleteConnectorSecretButton = page.getByRole('menuitem', {
35
- name: 'delete',
38
+ name: 'Delete',
39
+ exact: true,
36
40
  });
37
41
  this.deleteConnectorSecretSubButton = page.getByRole('button', {
38
42
  name: 'danger Delete',
@@ -45,10 +49,20 @@ class ClusterSecretsPage {
45
49
  .getByRole('dialog')
46
50
  .getByRole('button', { name: 'Import', exact: true });
47
51
  this.secretsSearchBox = page.getByRole('searchbox', { name: 'Filter table' });
52
+ this.clusterBanner = this.page
53
+ .getByRole('banner')
54
+ .getByRole('link', { name: 'Clusters' });
55
+ this.clusterLink = (name) => page.getByRole('link', { name: name });
56
+ this.clusterSecretTab = this.page.getByRole('tab', {
57
+ name: 'Connector Secrets',
58
+ });
59
+ this.confirmDeleteInput = page.getByRole('textbox', {
60
+ name: 'Type the word DELETE to confirm',
61
+ });
48
62
  }
49
63
  async deleteConnectorSecretsIfExist() {
50
64
  try {
51
- await (0, test_1.expect)(this.operationsButton.first()).toBeVisible({
65
+ await (0, test_1.expect)(this.optionsButton.first()).toBeVisible({
52
66
  timeout: 10000,
53
67
  });
54
68
  }
@@ -56,9 +70,9 @@ class ClusterSecretsPage {
56
70
  return; //No Connector Secrets found in the list
57
71
  }
58
72
  try {
59
- let operations = await this.operationsButton.all();
60
- while (operations.length > 0) {
61
- const operationButton = operations[0];
73
+ let options = await this.optionsButton.all();
74
+ while (options.length > 0) {
75
+ const operationButton = options[0];
62
76
  if (await operationButton.isVisible()) {
63
77
  await operationButton.click({ timeout: 60000 });
64
78
  await this.deleteConnectorSecretButton.click({ timeout: 60000 });
@@ -70,9 +84,9 @@ class ClusterSecretsPage {
70
84
  }
71
85
  const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
72
86
  await sleep(3000);
73
- operations = await this.operationsButton.all();
87
+ options = await this.optionsButton.all();
74
88
  }
75
- await (0, test_1.expect)(this.operationsButton).not.toBeVisible({
89
+ await (0, test_1.expect)(this.optionsButton).not.toBeVisible({
76
90
  timeout: 30000,
77
91
  });
78
92
  }
@@ -80,26 +94,25 @@ class ClusterSecretsPage {
80
94
  console.error('Error during Connector Secrets deletion: ', error);
81
95
  }
82
96
  }
83
- async clickCreateNewSecretButton() {
97
+ async clickCreateNewSecretButton(cluster) {
84
98
  try {
85
99
  await this.createNewSecretButton.click({ timeout: 60000 });
86
100
  }
87
101
  catch (error) {
88
- await this.page
89
- .getByRole('banner')
90
- .getByRole('link', { name: 'Clusters' })
91
- .click({ timeout: 60000 });
92
- await this.page
93
- .getByRole('link', { name: 'Test Cluster' })
94
- .click({ timeout: 60000 });
95
- await this.page
96
- .getByRole('tab', {
97
- name: 'Connector Secrets',
98
- })
99
- .click({ timeout: 60000 });
100
- await this.createNewSecretButton.click({ timeout: 60000 });
102
+ await this.clickClusterBanner();
103
+ await this.clickCluster(cluster);
104
+ await this.clusterSecretTab.click({ timeout: 30000 });
105
+ await this.createNewSecretButton.click({ timeout: 30000 });
101
106
  }
102
107
  }
108
+ async clickClusterBanner() {
109
+ await (0, test_1.expect)(this.clusterBanner).toBeVisible({ timeout: 30000 });
110
+ await this.clusterBanner.click({ timeout: 60000 });
111
+ }
112
+ async clickCluster(name) {
113
+ await (0, test_1.expect)(this.clusterLink(name)).toBeVisible({ timeout: 30000 });
114
+ await this.clusterLink(name).click();
115
+ }
103
116
  async clickKeyInput() {
104
117
  await (0, test_1.expect)(this.keyInput).toBeVisible({ timeout: 60000 });
105
118
  await this.keyInput.click({ timeout: 30000 });
@@ -137,8 +150,8 @@ class ClusterSecretsPage {
137
150
  await (0, test_1.expect)(this.createButton).toBeVisible({ timeout: 60000 });
138
151
  await this.createButton.click({ timeout: 30000 });
139
152
  }
140
- async createNewSecret(key, value) {
141
- await this.clickCreateNewSecretButton();
153
+ async createNewSecret(key, value, cluster) {
154
+ await this.clickCreateNewSecretButton(cluster);
142
155
  await this.clickKeyInput();
143
156
  await this.fillKeyInput(key);
144
157
  await (0, sleep_1.sleep)(1000);
@@ -153,11 +166,11 @@ class ClusterSecretsPage {
153
166
  timeout: 60000,
154
167
  });
155
168
  }
156
- async createSetOfSecrets(secrets) {
169
+ async createSetOfSecrets(cluster, secrets) {
157
170
  await this.bulkImportSecrets(secrets);
158
- await this.assertSecretsOrCreate(secrets);
171
+ await this.assertSecretsOrCreate(cluster, secrets);
159
172
  }
160
- async assertSecretsOrCreate(secrets) {
173
+ async assertSecretsOrCreate(cluster, secrets) {
161
174
  for (const secret of secrets) {
162
175
  try {
163
176
  await (0, test_1.expect)(this.secretsSearchBox).toBeVisible();
@@ -170,7 +183,7 @@ class ClusterSecretsPage {
170
183
  }
171
184
  catch (error) {
172
185
  console.error(`Creating secret for ${secret.name}`);
173
- await this.createNewSecret(secret.name, secret.value);
186
+ await this.createNewSecret(secret.name, secret.value, cluster);
174
187
  }
175
188
  }
176
189
  }
@@ -12,7 +12,6 @@ const OperateProcessInstancePage_1 = require("../../pages/8.6/OperateProcessInst
12
12
  const OptimizeHomePage_1 = require("../../pages/8.6/OptimizeHomePage");
13
13
  const OptimizeCollectionsPage_1 = require("../../pages/8.6/OptimizeCollectionsPage");
14
14
  const OptimizeReportPage_1 = require("../../pages/8.6/OptimizeReportPage");
15
- const sleep_1 = require("../../utils/sleep");
16
15
  const UtilitiesPage_1 = require("../../pages/8.6/UtilitiesPage");
17
16
  const expectLocatorWithRetry_1 = require("../../utils/assertionHelpers/expectLocatorWithRetry");
18
17
  _8_6_1.test.describe.configure({ mode: 'parallel' });
@@ -34,12 +33,12 @@ _8_6_1.test.describe('Smoke Tests', () => {
34
33
  const reportName = await (0, _setup_1.generateRandomStringAsync)(5);
35
34
  await _8_6_1.test.step('Navigate to Web Modeler', async () => {
36
35
  await (0, test_1.expect)(homePage.camundaComponentsButton).toBeVisible({
37
- timeout: 120000,
36
+ timeout: 30000,
38
37
  });
39
38
  await appsPage.clickCamundaApps();
40
39
  await appsPage.clickModeler();
41
40
  await (0, test_1.expect)(modelerHomePage.modelerPageBanner).toBeVisible({
42
- timeout: 120000,
41
+ timeout: 60000,
43
42
  });
44
43
  });
45
44
  await _8_6_1.test.step('Create Form To Be Linked For Zeebe User Task', async () => {
@@ -47,7 +46,7 @@ _8_6_1.test.describe('Smoke Tests', () => {
47
46
  await modelerHomePage.clickDiagramTypeDropdown();
48
47
  await modelerHomePage.clickFormOption();
49
48
  await modelerHomePage.enterFormName(formName);
50
- await (0, sleep_1.sleep)(10000);
49
+ await modelerHomePage.assertFormBreadcrumbVisible(formName);
51
50
  });
52
51
  await _8_6_1.test.step('Add A BPMN Template To The Project', async () => {
53
52
  await modelerHomePage.clickProjectBreadcrumb();
@@ -56,10 +55,10 @@ _8_6_1.test.describe('Smoke Tests', () => {
56
55
  });
57
56
  await _8_6_1.test.step('Create BPMN Diagram with Two Zeebe User Tasks and Start Process Instance', async () => {
58
57
  await (0, test_1.expect)(modelerCreatePage.generalPanel).toBeVisible({
59
- timeout: 120000,
58
+ timeout: 60000,
60
59
  });
61
60
  await modelerCreatePage.enterDiagramName(processName);
62
- await (0, sleep_1.sleep)(10000);
61
+ await modelerCreatePage.assertDiagramNameSet(processName);
63
62
  await modelerCreatePage.addParallelUserTasks(2, userTaskName);
64
63
  await modelerCreatePage.clickAppendElementButton();
65
64
  await modelerCreatePage.clickAppendEndEventButton('parallelGateway');
@@ -67,16 +66,15 @@ _8_6_1.test.describe('Smoke Tests', () => {
67
66
  await modelerCreatePage.clickEmbedFormButton();
68
67
  await modelerCreatePage.clickForm(formName);
69
68
  await modelerCreatePage.clickEmbedButton();
70
- await (0, sleep_1.sleep)(10000);
69
+ await modelerCreatePage.assertFormEmbedded();
71
70
  await modelerCreatePage.runProcessInstance(clusterName);
72
71
  });
73
72
  await _8_6_1.test.step('View Process Instance in Operate, complete User Task in Tasklist & assert process complete in Operate and Assert Process has been successfully imported in Optimize', async () => {
74
73
  await (0, test_1.expect)(modelerCreatePage.viewProcessInstanceLink).toBeVisible({
75
- timeout: 120000,
74
+ timeout: 60000,
76
75
  });
77
76
  await modelerCreatePage.clickViewProcessInstanceLink();
78
- const operateTabPromise = page.waitForEvent('popup', { timeout: 60000 });
79
- const operateTab = await operateTabPromise;
77
+ const operateTab = await page.waitForEvent('popup', { timeout: 30000 });
80
78
  const operateTabHomePage = new OperateHomePage_1.OperateHomePage(operateTab);
81
79
  const operateTabProcessesPage = new OperateProcessesPage_1.OperateProcessesPage(operateTab);
82
80
  const operateTabProcessInstancePage = new OperateProcessInstancePage_1.OperateProcessInstancePage(operateTab);
@@ -92,13 +90,13 @@ _8_6_1.test.describe('Smoke Tests', () => {
92
90
  await (0, UtilitiesPage_1.completeTaskWithRetry)(operateTabTaskPanelPage, operateTabTaskDetailsPage, `${userTaskName}2`, 'Medium');
93
91
  await operateTabTaskPanelPage.filterBy('Completed');
94
92
  await operateTabTaskPanelPage.openTask(`${userTaskName}1`);
95
- await (0, test_1.expect)(operateTabTaskDetailsPage.detailsInfo.getByText(`${userTaskName}1`)).toBeVisible({ timeout: 60000 });
93
+ await (0, test_1.expect)(operateTabTaskDetailsPage.detailsInfo.getByText(`${userTaskName}1`)).toBeVisible({ timeout: 30000 });
96
94
  await operateTabTaskPanelPage.openTask(`${userTaskName}2`);
97
- await (0, test_1.expect)(operateTabTaskDetailsPage.detailsInfo.getByText(`${userTaskName}2`)).toBeVisible({ timeout: 60000 });
95
+ await (0, test_1.expect)(operateTabTaskDetailsPage.detailsInfo.getByText(`${userTaskName}2`)).toBeVisible({ timeout: 30000 });
98
96
  await operateTabAppsPage.clickCamundaApps();
99
97
  await operateTabAppsPage.clickOperate(clusterName);
100
98
  await operateTabHomePage.clickProcessesTab();
101
- await (0, sleep_1.sleep)(10000);
99
+ await (0, test_1.expect)(operateTabProcessesPage.processCompletedCheckbox).toBeVisible({ timeout: 15000 });
102
100
  await operateTab.reload();
103
101
  await operateTabProcessesPage.clickProcessCompletedCheckbox();
104
102
  await operateTabProcessesPage.clickProcessInstanceLink(processName);
@@ -108,16 +106,14 @@ _8_6_1.test.describe('Smoke Tests', () => {
108
106
  const optimizeTabOptimizeCollectionsPage = new OptimizeCollectionsPage_1.OptimizeCollectionsPage(operateTab);
109
107
  const optimizeTabOptimizeReportPage = new OptimizeReportPage_1.OptimizeReportPage(operateTab);
110
108
  const optimizeTabOptimizeHomePage = new OptimizeHomePage_1.OptimizeHomePage(operateTab);
111
- await (0, test_1.expect)(operateTab.getByRole('link', {
112
- name: processName,
113
- })).toBeVisible({ timeout: 90000 });
109
+ await (0, expectLocatorWithRetry_1.expectLocatorWithRetry)(operateTab, operateTab.getByRole('link', { name: processName }));
114
110
  await optimizeTabOptimizeHomePage.clickCollectionsLink();
115
111
  await optimizeTabOptimizeCollectionsPage.clickCreateNewButton();
116
112
  await optimizeTabOptimizeCollectionsPage.clickReportOption();
117
113
  await optimizeTabOptimizeReportPage.clickProcessSelectionButton();
118
114
  await optimizeTabOptimizeReportPage.clickUserTaskProcess(processName);
119
115
  await (0, test_1.expect)(optimizeTabOptimizeReportPage.versionSelection).toBeVisible({
120
- timeout: 30000,
116
+ timeout: 15000,
121
117
  });
122
118
  await optimizeTabOptimizeReportPage.clickVersionSelection();
123
119
  await optimizeTabOptimizeReportPage.clickAlwaysDisplayLatestSelection();
@@ -127,7 +123,7 @@ _8_6_1.test.describe('Smoke Tests', () => {
127
123
  await optimizeTabOptimizeReportPage.clickUserTaskOption();
128
124
  await optimizeTabOptimizeReportPage.clickHeatMapButton();
129
125
  await (0, test_1.expect)(optimizeTabOptimizeReportPage.tableOption).toBeVisible({
130
- timeout: 30000,
126
+ timeout: 15000,
131
127
  });
132
128
  await optimizeTabOptimizeReportPage.clickTableOption();
133
129
  await optimizeTabOptimizeReportPage.clickReportName();
@@ -136,7 +132,7 @@ _8_6_1.test.describe('Smoke Tests', () => {
136
132
  await optimizeTabOptimizeReportPage.clickSaveButton();
137
133
  await optimizeTabOptimizeHomePage.clickCollectionsLink();
138
134
  await (0, test_1.expect)(operateTab.getByText(reportName)).toBeVisible({
139
- timeout: 60000,
135
+ timeout: 30000,
140
136
  });
141
137
  await optimizeTabOptimizeCollectionsPage.clickMostRecentProcessReport(reportName);
142
138
  await optimizeTabOptimizeReportPage.waitUntilLocatorIsVisible(optimizeTabOptimizeReportPage.oneUserTaskInstance.first(), operateTab);
@@ -9,9 +9,11 @@ const UtilitiesPage_1 = require("../../pages/8.8/UtilitiesPage");
9
9
  const UtilitiesPage_2 = require("../../pages/8.8/UtilitiesPage");
10
10
  const UtilitiesPage_3 = require("../../pages/8.8/UtilitiesPage");
11
11
  const apiHelpers_1 = require("../../utils/apiHelpers");
12
+ const expectLocatorWithRetry_1 = require("../../utils/assertionHelpers/expectLocatorWithRetry");
12
13
  _8_8_1.test.describe.configure({ mode: 'parallel' });
13
14
  _8_8_1.test.describe('Connectors User Flow Tests @tasklistV2', () => {
14
- const clusterName = 'Test Cluster';
15
+ const defaultClusterName = 'Test Cluster';
16
+ const awsCluster = 'AWS Cluster';
15
17
  _8_8_1.test.beforeEach(async ({ page, loginPage }, testInfo) => {
16
18
  await (0, UtilitiesPage_1.loginWithRetry)(page, loginPage, (testInfo.workerIndex + 1) * 1000);
17
19
  });
@@ -39,7 +41,7 @@ _8_8_1.test.describe('Connectors User Flow Tests @tasklistV2', () => {
39
41
  });
40
42
  await _8_8_1.test.step('Create BPMN Diagram with REST Connector and Start Process Instance', async () => {
41
43
  await (0, UtilitiesPage_2.modelRestConnector)(modelerCreatePage, connectorSettingsPage, processName, 'https://camunda.proxy.beeceptor.com/pre-prod/no-auth-test', 'noAuth', 'body');
42
- await modelerCreatePage.runProcessInstance(clusterName);
44
+ await modelerCreatePage.runProcessInstance(defaultClusterName);
43
45
  });
44
46
  await _8_8_1.test.step('View Process Instance in Operate, assert it completes and assert result expression', async () => {
45
47
  await (0, test_1.expect)(modelerCreatePage.viewProcessInstanceLink).toBeVisible({
@@ -77,7 +79,7 @@ _8_8_1.test.describe('Connectors User Flow Tests @tasklistV2', () => {
77
79
  });
78
80
  await _8_8_1.test.step('Create BPMN Diagram with REST Connector with Bearer Token Auth and Start Process Instance', async () => {
79
81
  await (0, UtilitiesPage_2.modelRestConnector)(modelerCreatePage, connectorSettingsPage, processName, 'https://camunda.proxy.beeceptor.com/pre-prod/bearer-auth-test', 'bearer', '{message:response.body}');
80
- await modelerCreatePage.runProcessInstance(clusterName);
82
+ await modelerCreatePage.runProcessInstance(defaultClusterName);
81
83
  await (0, _setup_1.performBearerTokenAuthPostRequest)('https://camunda.proxy.beeceptor.com/pre-prod/bearer-auth-test', 'thisisabearertoken');
82
84
  });
83
85
  await _8_8_1.test.step('View Process Instance in Operate, assert it completes and assert result expression', async () => {
@@ -129,7 +131,7 @@ _8_8_1.test.describe('Connectors User Flow Tests @tasklistV2', () => {
129
131
  await modelerCreatePage.clickAppendEndEventButton();
130
132
  await (0, sleep_1.sleep)(20000);
131
133
  await page.reload();
132
- await modelerCreatePage.deployDiagram(clusterName);
134
+ await modelerCreatePage.deployDiagram(defaultClusterName);
133
135
  });
134
136
  await _8_8_1.test.step('Assert Webhook Is Active In Cluster And Make Authorization Request', async () => {
135
137
  await modelerCreatePage.clickStartEventElement();
@@ -145,7 +147,7 @@ _8_8_1.test.describe('Connectors User Flow Tests @tasklistV2', () => {
145
147
  });
146
148
  await _8_8_1.test.step('Assert Diagram Has Successfully Completed in Operate', async () => {
147
149
  await appsPage.clickCamundaApps();
148
- await appsPage.clickOperate(clusterName);
150
+ await appsPage.clickOperate(defaultClusterName);
149
151
  await (0, test_1.expect)(operateHomePage.processesTab).toBeVisible({
150
152
  timeout: 120000,
151
153
  });
@@ -155,7 +157,7 @@ _8_8_1.test.describe('Connectors User Flow Tests @tasklistV2', () => {
155
157
  await (0, UtilitiesPage_1.assertLocatorVisibleWithRetry)(operateProcessInstancePage, operateProcessInstancePage.completedIcon, 'Completed icon', 60000);
156
158
  });
157
159
  });
158
- (0, _8_8_1.test)('Connector Secrets User Flow', async ({ page, homePage, modelerHomePage, appsPage, modelerCreatePage, connectorSettingsPage, }) => {
160
+ (0, _8_8_1.test)('Connector Secrets User Flow - GCP', async ({ page, homePage, modelerHomePage, appsPage, modelerCreatePage, connectorSettingsPage, operateHomePage, operateProcessesPage, operateProcessInstancePage, }) => {
159
161
  _8_8_1.test.slow();
160
162
  const processName = 'REST_Connector_Process' + (await (0, _setup_1.generateRandomStringAsync)(3));
161
163
  await _8_8_1.test.step('Navigate to Web Modeler', async () => {
@@ -163,10 +165,9 @@ _8_8_1.test.describe('Connectors User Flow Tests @tasklistV2', () => {
163
165
  timeout: 20000,
164
166
  });
165
167
  await appsPage.clickCamundaApps();
166
- await (0, test_1.expect)(appsPage.modelerLink).toBeVisible({ timeout: 20000 });
167
168
  await appsPage.clickModeler();
168
169
  await (0, test_1.expect)(modelerHomePage.modelerPageBanner).toBeVisible({
169
- timeout: 120000,
170
+ timeout: 30000,
170
171
  });
171
172
  });
172
173
  await _8_8_1.test.step('Open Cross Component Test Project and Create a BPMN Diagram Template', async () => {
@@ -176,21 +177,77 @@ _8_8_1.test.describe('Connectors User Flow Tests @tasklistV2', () => {
176
177
  });
177
178
  await _8_8_1.test.step('Create BPMN Diagram with REST Connector using secrets and Start Process Instance', async () => {
178
179
  await (0, UtilitiesPage_2.modelRestConnector)(modelerCreatePage, connectorSettingsPage, processName, 'secrets.endpoint_url', 'basic', '{message:response.body.message}', 'result', { username: 'secrets.username', password: 'secrets.password' });
179
- await modelerCreatePage.runProcessInstance(clusterName);
180
- await (0, _setup_1.performBasicAuthPostRequest)('https://camunda.proxy.beeceptor.com/pre-prod/basic-auth-test', 'username', 'password');
180
+ await modelerCreatePage.runProcessInstance(defaultClusterName);
181
+ await (0, test_1.expect)(modelerCreatePage.viewProcessInstanceLink).toBeVisible();
181
182
  });
182
183
  await _8_8_1.test.step('View Process Instance in Operate, assert it completes and assert result expression', async () => {
183
- await (0, test_1.expect)(modelerCreatePage.viewProcessInstanceLink).toBeVisible({
184
- timeout: 90000,
184
+ await appsPage.clickCamundaApps();
185
+ await appsPage.clickOperate(defaultClusterName);
186
+ await (0, test_1.expect)(operateHomePage.operateBanner).toBeVisible();
187
+ await operateHomePage.clickProcessesTab();
188
+ await operateProcessesPage.clickProcessCompletedCheckbox();
189
+ await operateProcessesPage.clickProcessInstanceLink(processName);
190
+ await (0, expectLocatorWithRetry_1.expectLocatorWithRetry)(page, operateProcessInstancePage.completedIcon, {
191
+ postAction: async () => {
192
+ await page.reload();
193
+ },
194
+ });
195
+ await (0, expectLocatorWithRetry_1.expectLocatorWithRetry)(page, operateProcessInstancePage.variablesList, {
196
+ postAction: async () => {
197
+ await page.reload();
198
+ },
199
+ });
200
+ await (0, expectLocatorWithRetry_1.expectLocatorWithRetry)(page, operateProcessInstancePage.messageVariable.getByText('"Message from Mock!"'), {
201
+ postAction: async () => {
202
+ await page.reload();
203
+ },
204
+ });
205
+ });
206
+ });
207
+ (0, _8_8_1.test)('Connector Secrets User Flow - AWS', async ({ page, modelerHomePage, appsPage, modelerCreatePage, connectorSettingsPage, operateHomePage, operateProcessesPage, operateProcessInstancePage, }) => {
208
+ _8_8_1.test.slow();
209
+ const processName = 'REST_Connector_Process' + (await (0, _setup_1.generateRandomStringAsync)(3));
210
+ await _8_8_1.test.step('Navigate to Web Modeler', async () => {
211
+ await appsPage.clickCamundaApps();
212
+ await appsPage.clickModeler();
213
+ await (0, test_1.expect)(modelerHomePage.modelerPageBanner).toBeVisible({
214
+ timeout: 30000,
215
+ });
216
+ });
217
+ await _8_8_1.test.step('Open Cross Component Test Project and Create a BPMN Diagram Template', async () => {
218
+ await modelerHomePage.clickCrossComponentProjectFolder();
219
+ await modelerHomePage.clickDiagramTypeDropdown();
220
+ await modelerHomePage.clickBpmnTemplateOption();
221
+ });
222
+ await _8_8_1.test.step('Create BPMN Diagram with REST Connector using secrets and Start Process Instance', async () => {
223
+ await (0, UtilitiesPage_2.modelRestConnector)(modelerCreatePage, connectorSettingsPage, processName, 'secrets.endpoint_url', 'basic', '{message:response.body.message}', 'result', { username: 'secrets.username', password: 'secrets.password' });
224
+ await modelerCreatePage.runProcessInstance(awsCluster);
225
+ await (0, test_1.expect)(modelerCreatePage.viewProcessInstanceLink).toBeVisible();
226
+ });
227
+ await _8_8_1.test.step('View Process Instance in Operate, assert it completes and assert result expression', async () => {
228
+ await appsPage.clickCamundaApps();
229
+ await appsPage.clickOperate(awsCluster);
230
+ await (0, test_1.expect)(operateHomePage.operateBanner).toBeVisible({
231
+ timeout: 30000,
232
+ });
233
+ await operateHomePage.clickProcessesTab();
234
+ await operateProcessesPage.clickProcessCompletedCheckbox();
235
+ await operateProcessesPage.clickProcessInstanceLink(processName);
236
+ await (0, expectLocatorWithRetry_1.expectLocatorWithRetry)(page, operateProcessInstancePage.completedIcon, {
237
+ postAction: async () => {
238
+ await page.reload();
239
+ },
240
+ });
241
+ await (0, expectLocatorWithRetry_1.expectLocatorWithRetry)(page, operateProcessInstancePage.variablesList, {
242
+ postAction: async () => {
243
+ await page.reload();
244
+ },
245
+ });
246
+ await (0, expectLocatorWithRetry_1.expectLocatorWithRetry)(page, operateProcessInstancePage.messageVariable.getByText('"Message from Mock!"'), {
247
+ postAction: async () => {
248
+ await page.reload();
249
+ },
185
250
  });
186
- await modelerCreatePage.clickViewProcessInstanceLink();
187
- const operateTab = await page.waitForEvent('popup', { timeout: 60000 });
188
- const operateTabProcessInstancePage = new OperateProcessInstancePage_1.OperateProcessInstancePage(operateTab);
189
- await (0, UtilitiesPage_1.assertLocatorVisibleWithRetry)(operateTab, operateTabProcessInstancePage.completedIcon, 'Completed icon');
190
- await (0, UtilitiesPage_1.assertLocatorVisibleWithRetry)(operateTab, operateTab.getByTestId('variables-list'), 'Variable list', 60000);
191
- await (0, UtilitiesPage_1.assertLocatorVisibleWithRetry)(operateTab, operateTab
192
- .getByTestId('variable-message')
193
- .getByText('"Message from Mock!"'), 'Connector response message', 60000);
194
251
  });
195
252
  });
196
253
  (0, _8_8_1.test)('Marketplace Connector User Flow', async ({ page, homePage, appsPage, modelerHomePage, modelerCreatePage, connectorMarketplacePage, connectorSettingsPage, }) => {
@@ -241,7 +298,7 @@ _8_8_1.test.describe('Connectors User Flow Tests @tasklistV2', () => {
241
298
  await modelerCreatePage.clickAppendEndEventButton();
242
299
  await modelerCreatePage.clickCanvas();
243
300
  await modelerCreatePage.assertThreeElementsVisible();
244
- await modelerCreatePage.runProcessInstance(clusterName);
301
+ await modelerCreatePage.runProcessInstance(defaultClusterName);
245
302
  });
246
303
  await _8_8_1.test.step('View Process Instance in Operate, assert it completes and assert result expression', async () => {
247
304
  await (0, test_1.expect)(modelerCreatePage.viewProcessInstanceLink).toBeVisible({
@@ -295,7 +352,7 @@ _8_8_1.test.describe('Connectors User Flow Tests @tasklistV2', () => {
295
352
  await modelerCreatePage.clickAppendEndEventButton();
296
353
  await (0, sleep_1.sleep)(10000);
297
354
  await page.reload();
298
- await modelerCreatePage.runProcessInstance(clusterName);
355
+ await modelerCreatePage.runProcessInstance(defaultClusterName);
299
356
  });
300
357
  await _8_8_1.test.step('Assert Webhook Is Active In Cluster And Make Authorization Request', async () => {
301
358
  await modelerCreatePage.clickSecondElement();
@@ -315,7 +372,7 @@ _8_8_1.test.describe('Connectors User Flow Tests @tasklistV2', () => {
315
372
  await _8_8_1.test.step('Assert Diagram Has Successfully Completed in Operate', async () => {
316
373
  await (0, sleep_1.sleep)(90000);
317
374
  await appsPage.clickCamundaApps();
318
- await appsPage.clickOperate(clusterName);
375
+ await appsPage.clickOperate(defaultClusterName);
319
376
  await (0, test_1.expect)(operateHomePage.processesTab).toBeVisible({ timeout: 120000 });
320
377
  await operateHomePage.clickProcessesTab();
321
378
  await operateProcessesPage.clickProcessCompletedCheckbox();
@@ -331,7 +388,7 @@ _8_8_1.test.describe('Connectors User Flow Tests @tasklistV2', () => {
331
388
  let credentials = {};
332
389
  await _8_8_1.test.step('Create Zeebe API Client', async () => {
333
390
  await homePage.clickClusters();
334
- await clusterPage.clickClusterLink(clusterName);
391
+ await clusterPage.clickClusterLink(defaultClusterName);
335
392
  await clusterDetailsPage.clickAPITab();
336
393
  credentials = await clusterDetailsPage.createAPIClientAndReturnVariables(apiClientName, false);
337
394
  await clusterDetailsPage.clickCloseModalButton();
@@ -344,7 +401,7 @@ _8_8_1.test.describe('Connectors User Flow Tests @tasklistV2', () => {
344
401
  });
345
402
  });
346
403
  await _8_8_1.test.step('Open Cross Component Test Project and Create a REST Connector Document Handling Flow', async () => {
347
- await (0, UtilitiesPage_3.modelAndRunConnectorsDocHandlingDiagram)(modelerCreatePage, modelerHomePage, processName, page, connectorMarketplacePage, clusterName, `"${credentials.zeebeUrl}"`, `"${credentials.zeebeClientId}"`, `"${credentials.zeebeClientSecret}"`);
404
+ await (0, UtilitiesPage_3.modelAndRunConnectorsDocHandlingDiagram)(modelerCreatePage, modelerHomePage, processName, page, connectorMarketplacePage, defaultClusterName, `"${credentials.zeebeUrl}"`, `"${credentials.zeebeClientId}"`, `"${credentials.zeebeClientSecret}"`);
348
405
  });
349
406
  await _8_8_1.test.step('View Process Instance in Operate, assert it completes and assert variable values are correct', async () => {
350
407
  await (0, test_1.expect)(modelerCreatePage.viewProcessInstanceLink).toBeVisible({
@@ -383,7 +440,7 @@ _8_8_1.test.describe('Connectors User Flow Tests @tasklistV2', () => {
383
440
  });
384
441
  });
385
442
  await _8_8_1.test.step('Open Cross Component Test Project and Create a REST Connector Document Handling Flow', async () => {
386
- await (0, UtilitiesPage_1.modelAndRunConnectorsTimerEventDiagram)(modelerCreatePage, modelerHomePage, processName, page, connectorMarketplacePage, clusterName, connectorTemplatePage);
443
+ await (0, UtilitiesPage_1.modelAndRunConnectorsTimerEventDiagram)(modelerCreatePage, modelerHomePage, processName, page, connectorMarketplacePage, defaultClusterName, connectorTemplatePage);
387
444
  });
388
445
  await _8_8_1.test.step('View Process Instance in Operate, assert it completes and assert variable values are correct', async () => {
389
446
  await (0, test_1.expect)(modelerCreatePage.viewProcessInstanceLink).toBeVisible({
@@ -68,7 +68,7 @@ _8_8_1.test.describe('IDP User Flow Tests', () => {
68
68
  await homePage.clickClusters();
69
69
  await clusterPage.clickClusterLink(clusterName);
70
70
  await clusterPage.clickConnectorSecretsTab(clusterName);
71
- await clusterSecretsPage.assertSecretsOrCreate(connectorSecrets_1.allConnectorSecrets[params.provider]);
71
+ await clusterSecretsPage.assertSecretsOrCreate(clusterName, connectorSecrets_1.allConnectorSecrets[params.provider]);
72
72
  });
73
73
  await _8_8_1.test.step('Navigate to Web Modeler', async () => {
74
74
  await (0, test_1.expect)(homePage.camundaComponentsButton).toBeVisible({
@@ -140,7 +140,7 @@ _8_8_1.test.describe('IDP User Flow Tests', () => {
140
140
  await homePage.clickClusters();
141
141
  await clusterPage.clickClusterLink(clusterName);
142
142
  await clusterPage.clickConnectorSecretsTab(clusterName);
143
- await clusterSecretsPage.assertSecretsOrCreate(connectorSecrets_1.allConnectorSecrets[params.provider]);
143
+ await clusterSecretsPage.assertSecretsOrCreate(clusterName, connectorSecrets_1.allConnectorSecrets[params.provider]);
144
144
  });
145
145
  await _8_8_1.test.step('Navigate to Web Modeler', async () => {
146
146
  await (0, test_1.expect)(homePage.camundaComponentsButton).toBeVisible({
@@ -43,13 +43,13 @@ _8_8_1.test.describe('Cluster Setup Tests', () => {
43
43
  await clusterDetailsPage.createAPIClientAndReturnVariables(apiClientName);
44
44
  await clusterDetailsPage.clickCloseModalButton();
45
45
  await clusterPage.clickConnectorSecretsTab(clusterName);
46
- await clusterSecretsPage.createSetOfSecrets(connectorSecrets_1.awsSecretsValues);
47
- await clusterSecretsPage.createSetOfSecrets(connectorSecrets_1.openAiSecretsValues);
48
- await clusterSecretsPage.createSetOfSecrets(connectorSecrets_1.gcpSecretsValues);
49
- await clusterSecretsPage.createSetOfSecrets(connectorSecrets_1.azureSecretsValues);
50
- await clusterSecretsPage.createSetOfSecrets(connectorSecrets_1.connectorSecretsValues);
46
+ await clusterSecretsPage.createSetOfSecrets(clusterName, connectorSecrets_1.awsSecretsValues);
47
+ await clusterSecretsPage.createSetOfSecrets(clusterName, connectorSecrets_1.openAiSecretsValues);
48
+ await clusterSecretsPage.createSetOfSecrets(clusterName, connectorSecrets_1.gcpSecretsValues);
49
+ await clusterSecretsPage.createSetOfSecrets(clusterName, connectorSecrets_1.azureSecretsValues);
50
+ await clusterSecretsPage.createSetOfSecrets(clusterName, connectorSecrets_1.connectorSecretsValues);
51
51
  });
52
- (0, _8_8_1.test)('Create AWS Cluster', async ({ homePage, clusterPage, clusterDetailsPage, }) => {
52
+ (0, _8_8_1.test)('Create AWS Cluster', async ({ homePage, clusterPage, clusterDetailsPage, clusterSecretsPage, }) => {
53
53
  _8_8_1.test.slow();
54
54
  const clusterName = 'AWS Cluster';
55
55
  await homePage.clickClusters();
@@ -57,6 +57,8 @@ _8_8_1.test.describe('Cluster Setup Tests', () => {
57
57
  await clusterPage.assertClusterHealthyStatusWithRetry(clusterName);
58
58
  await clusterPage.clickClusterLink(clusterName);
59
59
  await clusterDetailsPage.assertComponentsHealth();
60
+ await clusterPage.clickConnectorSecretsTab(clusterName);
61
+ await clusterSecretsPage.createSetOfSecrets(clusterName, connectorSecrets_1.connectorSecretsValues);
60
62
  });
61
63
  (0, _8_8_1.test)('Create Project Folder', async ({ homePage, appsPage, modelerHomePage, }) => {
62
64
  await _8_8_1.test.step('Navigate to Web Modeler', async () => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camunda/e2e-test-suite",
3
- "version": "0.0.35",
3
+ "version": "0.0.37",
4
4
  "description": "End-to-end test helpers for Camunda 8",
5
5
  "repository": {
6
6
  "type": "git",