@camunda/e2e-test-suite 0.0.313 → 0.0.314

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.
@@ -81,7 +81,6 @@ declare class ClusterDetailsPage {
81
81
  assertAlertText(text: string, timeout?: number, maxRetries?: number): Promise<void>;
82
82
  checkOrchestrationClusterCheckbox(): Promise<void>;
83
83
  clickReviewUpdateButton(): Promise<void>;
84
- clickUpdateButton(): Promise<void>;
85
84
  performClusterUpdate(): Promise<void>;
86
85
  }
87
86
  export { ClusterDetailsPage };
@@ -495,14 +495,10 @@ class ClusterDetailsPage {
495
495
  async clickReviewUpdateButton() {
496
496
  await this.reviewUpdateButton.click({ timeout: 60000 });
497
497
  }
498
- async clickUpdateButton() {
499
- await this.updateButton.click({ timeout: 60000 });
500
- }
501
498
  async performClusterUpdate() {
502
499
  await this.clickReviewUpdateButton();
503
- await this.page.waitForTimeout(1000);
504
- await (0, test_1.expect)(this.updateAvailableDialog).toBeVisible({ timeout: 60000 });
505
- await this.clickUpdateButton();
500
+ await (0, test_1.expect)(this.updateAvailableDialog).toBeVisible({ timeout: 30000 });
501
+ await this.updateButton.click({ timeout: 60000 });
506
502
  }
507
503
  }
508
504
  exports.ClusterDetailsPage = ClusterDetailsPage;
@@ -34,6 +34,7 @@ declare class ClusterPage {
34
34
  readonly clusterHealthiness: (clusterName: string) => Locator;
35
35
  readonly clusterLink: (clusterName: string) => Locator;
36
36
  readonly dialog: Locator;
37
+ readonly clusterVersion: (clusterName: string, versionText: string) => Locator;
37
38
  constructor(page: Page, testInfo?: TestInfo);
38
39
  clickClusterBanner(): Promise<void>;
39
40
  deleteCluster(name: string): Promise<void>;
@@ -40,6 +40,7 @@ class ClusterPage {
40
40
  clusterHealthiness;
41
41
  clusterLink;
42
42
  dialog;
43
+ clusterVersion;
43
44
  constructor(page, testInfo) {
44
45
  this.page = page;
45
46
  this.testInfo = testInfo;
@@ -106,6 +107,7 @@ class ClusterPage {
106
107
  name: clusterName,
107
108
  });
108
109
  this.dialog = page.getByRole('dialog');
110
+ this.clusterVersion = (clusterName, versionText) => this.cluster(clusterName).getByText(versionText, { exact: true });
109
111
  }
110
112
  async clickClusterBanner() {
111
113
  await this.page
@@ -85,7 +85,6 @@ declare class ClusterDetailsPage {
85
85
  fillAPIClientName(name: string): Promise<void>;
86
86
  clickExpandButton(): Promise<void>;
87
87
  clickReviewUpdateButton(): Promise<void>;
88
- clickUpdateButton(): Promise<void>;
89
88
  performClusterUpdate(): Promise<void>;
90
89
  }
91
90
  export { ClusterDetailsPage };
@@ -472,14 +472,10 @@ class ClusterDetailsPage {
472
472
  async clickReviewUpdateButton() {
473
473
  await this.reviewUpdateButton.click({ timeout: 60000 });
474
474
  }
475
- async clickUpdateButton() {
476
- await this.updateButton.click({ timeout: 60000 });
477
- }
478
475
  async performClusterUpdate() {
479
476
  await this.clickReviewUpdateButton();
480
- await this.page.waitForTimeout(1000);
481
- await (0, test_1.expect)(this.updateAvailableDialog).toBeVisible({ timeout: 60000 });
482
- await this.clickUpdateButton();
477
+ await (0, test_1.expect)(this.updateAvailableDialog).toBeVisible({ timeout: 30000 });
478
+ await this.updateButton.click({ timeout: 60000 });
483
479
  }
484
480
  }
485
481
  exports.ClusterDetailsPage = ClusterDetailsPage;
@@ -43,6 +43,9 @@ declare class ClusterDetailsPage {
43
43
  readonly reviewUpdateButton: Locator;
44
44
  readonly updateAvailableDialog: Locator;
45
45
  readonly updateButton: Locator;
46
+ readonly nextButton: Locator;
47
+ readonly tasklistV1RadioButton: Locator;
48
+ readonly tasklistV2RadioButton: Locator;
46
49
  constructor(page: Page);
47
50
  clickAPITab(): Promise<void>;
48
51
  clickCreateClientButton(): Promise<void>;
@@ -49,6 +49,9 @@ class ClusterDetailsPage {
49
49
  reviewUpdateButton;
50
50
  updateAvailableDialog;
51
51
  updateButton;
52
+ nextButton;
53
+ tasklistV1RadioButton;
54
+ tasklistV2RadioButton;
52
55
  constructor(page) {
53
56
  this.page = page;
54
57
  this.apiTab = page.getByRole('tab', { name: 'API' });
@@ -137,12 +140,15 @@ class ClusterDetailsPage {
137
140
  this.clientRow = (name) => this.clientsList.filter({ hasText: name });
138
141
  this.clientRowDeleteButton = (name) => this.clientRow(name).getByRole('button', { name: 'Delete' });
139
142
  this.reviewUpdateButton = page.getByRole('button', { name: 'Review Update' });
140
- this.updateAvailableDialog = page.getByRole('dialog', {
141
- name: 'Update available',
142
- });
143
+ this.updateAvailableDialog = page
144
+ .locator('.cds--modal-container')
145
+ .filter({ hasText: 'Update available' });
143
146
  this.updateButton = this.updateAvailableDialog.getByRole('button', {
144
147
  name: 'Update',
145
148
  });
149
+ this.nextButton = page.getByRole('button', { name: 'Next' });
150
+ this.tasklistV1RadioButton = page.locator('label[for="upgrade-tasklist-mode-v1"]');
151
+ this.tasklistV2RadioButton = page.locator('label[for="upgrade-tasklist-mode-v2"]');
146
152
  }
147
153
  async clickAPITab() {
148
154
  await (0, test_1.expect)(this.apiTab).toBeVisible({ timeout: 60000 });
@@ -508,7 +514,37 @@ class ClusterDetailsPage {
508
514
  }
509
515
  async performClusterUpdate() {
510
516
  await this.clickReviewUpdateButton();
511
- await (0, test_1.expect)(this.updateAvailableDialog).toBeVisible({ timeout: 30000 });
517
+ // Wait a moment for the dialog to start appearing
518
+ await this.page.waitForTimeout(1000);
519
+ await (0, test_1.expect)(this.updateAvailableDialog).toBeVisible({ timeout: 60000 });
520
+ // Click through steps 1-5 (each requires clicking "Next")
521
+ for (let step = 1; step <= 5; step++) {
522
+ console.log(`Clicking Next on step ${step}`);
523
+ await (0, test_1.expect)(this.nextButton).toBeVisible({ timeout: 30000 });
524
+ await this.nextButton.click({ timeout: 30000 });
525
+ await this.page.waitForTimeout(500); // Brief wait between steps
526
+ }
527
+ // Step 6: Select Tasklist version based on environment variable
528
+ const tasklistVersion = process.env.TASKLIST_VERSION || 'v2';
529
+ console.log(`Selecting Tasklist version: ${tasklistVersion}`);
530
+ if (tasklistVersion === 'v1') {
531
+ await (0, test_1.expect)(this.tasklistV1RadioButton).toBeVisible({ timeout: 30000 });
532
+ await this.tasklistV1RadioButton.click();
533
+ }
534
+ else {
535
+ // Default to v2 (which is usually pre-selected)
536
+ await (0, test_1.expect)(this.tasklistV2RadioButton).toBeVisible({ timeout: 30000 });
537
+ const v2Input = this.page.locator('#upgrade-tasklist-mode-v2');
538
+ if (!(await v2Input.isChecked())) {
539
+ await this.tasklistV2RadioButton.click();
540
+ }
541
+ }
542
+ // Click Next to proceed to final step
543
+ await (0, test_1.expect)(this.nextButton).toBeVisible({ timeout: 30000 });
544
+ await this.nextButton.click({ timeout: 30000 });
545
+ await this.page.waitForTimeout(500);
546
+ // Final step: Click Update button
547
+ await (0, test_1.expect)(this.updateButton).toBeVisible({ timeout: 60000 });
512
548
  await this.updateButton.click({ timeout: 60000 });
513
549
  }
514
550
  }
@@ -34,6 +34,7 @@ declare class ClusterPage {
34
34
  readonly clusterHealthiness: (clusterName: string) => Locator;
35
35
  readonly clusterLink: (clusterName: string) => Locator;
36
36
  readonly dialog: Locator;
37
+ readonly clusterVersion: (clusterName: string, versionText: string) => Locator;
37
38
  constructor(page: Page, testInfo?: TestInfo);
38
39
  clickClusterBanner(): Promise<void>;
39
40
  deleteCluster(name: string): Promise<void>;
@@ -53,7 +54,7 @@ declare class ClusterPage {
53
54
  clickConnectorSecretsTab(clusterName: string): Promise<void>;
54
55
  clickClusterOption(version: string): Promise<void>;
55
56
  createClusterIfNotExists(clusterName: string, region?: string): Promise<void>;
56
- assertClusterHealthyStatusWithRetry(name: string, visibilityTimeout?: number, totalTimeout?: number): Promise<void>;
57
+ assertClusterHealthyStatusWithRetry(name: string, visibilityTimeout?: number, totalTimeout?: number, isUpgradeScenario?: boolean): Promise<void>;
57
58
  clickAlphaTab(): Promise<void>;
58
59
  clickDevTab(): Promise<void>;
59
60
  clickStableTab(): Promise<void>;
@@ -41,6 +41,7 @@ class ClusterPage {
41
41
  clusterHealthiness;
42
42
  clusterLink;
43
43
  dialog;
44
+ clusterVersion;
44
45
  constructor(page, testInfo) {
45
46
  this.page = page;
46
47
  this.testInfo = testInfo;
@@ -107,6 +108,7 @@ class ClusterPage {
107
108
  this.clusterLink = (clusterName) => this.cluster(clusterName).getByRole('link', {
108
109
  name: clusterName,
109
110
  });
111
+ this.clusterVersion = (clusterName, versionText) => this.cluster(clusterName).getByText(versionText);
110
112
  }
111
113
  async clickClusterBanner() {
112
114
  await this.page
@@ -330,14 +332,22 @@ class ClusterPage {
330
332
  await this.assertClusterHealthyStatusWithRetry(clusterName, 120000, 600000);
331
333
  }
332
334
  }
333
- async assertClusterHealthyStatusWithRetry(name, visibilityTimeout = 100000, totalTimeout = 420000) {
335
+ async assertClusterHealthyStatusWithRetry(name, visibilityTimeout = 100000, totalTimeout = 420000, isUpgradeScenario = false) {
336
+ // For upgrade scenarios, use much longer timeouts and more retries instead of fixed waits
337
+ const actualTotalTimeout = isUpgradeScenario ? 720000 : totalTimeout; // 12 minutes for upgrades
338
+ const actualVisibilityTimeout = isUpgradeScenario
339
+ ? 15000
340
+ : visibilityTimeout; // Shorter individual checks
341
+ const maxRetries = isUpgradeScenario ? 20 : 5; // Many more retries for upgrades
342
+ console.log(isUpgradeScenario
343
+ ? `Checking cluster health post-upgrade with extended timeouts (${actualTotalTimeout / 60000} min total, ${maxRetries} retries)`
344
+ : `Checking cluster health: ${name}`);
334
345
  await (0, expectLocatorWithRetry_1.expectLocatorWithRetry)(this.page, this.clusterHealthiness(name), {
335
- visibilityTimeout: visibilityTimeout,
336
- totalTimeout: totalTimeout,
337
- maxRetries: 5,
346
+ visibilityTimeout: actualVisibilityTimeout,
347
+ totalTimeout: actualTotalTimeout,
348
+ maxRetries: maxRetries,
338
349
  preAction: async () => {
339
350
  await this.page.reload();
340
- await (0, test_1.expect)(this.cluster(name)).toBeVisible({ timeout: 10000 });
341
351
  },
342
352
  });
343
353
  console.log('Cluster is healthy:', name);
@@ -60,7 +60,19 @@ class TaskPanelPage {
60
60
  .click({ timeout: 60000 });
61
61
  }
62
62
  catch {
63
- await this.expandButton.click({ timeout: 60000 });
63
+ // Dismiss any active tooltips by clicking elsewhere and wait
64
+ await this.page.click('body');
65
+ await this.page.waitForTimeout(500);
66
+ try {
67
+ // Try force click to bypass tooltip overlay
68
+ await this.expandButton.click({ force: true, timeout: 60000 });
69
+ }
70
+ catch {
71
+ // Fallback: use keyboard navigation to avoid pointer events
72
+ await this.expandButton.focus();
73
+ await this.page.keyboard.press('Enter');
74
+ await this.page.waitForTimeout(1000);
75
+ }
64
76
  await this.page
65
77
  .getByRole('link', { name: option })
66
78
  .getByText(option)
@@ -58,7 +58,6 @@ declare class ClusterDetailsPage {
58
58
  clickOptimizeCheckbox(): Promise<void>;
59
59
  clickCreateButton(): Promise<void>;
60
60
  clickReviewUpdateButton(): Promise<void>;
61
- clickUpdateButton(): Promise<void>;
62
61
  performClusterUpdate(): Promise<void>;
63
62
  clickCloseModalButton(): Promise<void>;
64
63
  clickSettingsTab(): Promise<void>;
@@ -190,14 +190,10 @@ class ClusterDetailsPage {
190
190
  async clickReviewUpdateButton() {
191
191
  await this.reviewUpdateButton.click({ timeout: 60000 });
192
192
  }
193
- async clickUpdateButton() {
194
- await this.updateButton.click({ timeout: 60000 });
195
- }
196
193
  async performClusterUpdate() {
197
194
  await this.clickReviewUpdateButton();
198
- await this.page.waitForTimeout(1000);
199
- await (0, test_1.expect)(this.updateAvailableDialog).toBeVisible({ timeout: 60000 });
200
- await this.clickUpdateButton();
195
+ await (0, test_1.expect)(this.updateAvailableDialog).toBeVisible({ timeout: 30000 });
196
+ await this.updateButton.click({ timeout: 60000 });
201
197
  }
202
198
  async clickCloseModalButton() {
203
199
  await this.closeModalButton.click({ timeout: 60000 });
@@ -33,6 +33,7 @@ declare class ClusterPage {
33
33
  readonly cluster: (clusterName: string) => Locator;
34
34
  readonly clusterHealthiness: (clusterName: string) => Locator;
35
35
  readonly clusterLink: (clusterName: string) => Locator;
36
+ readonly clusterVersion: (clusterName: string, versionText: string) => Locator;
36
37
  readonly dialog: Locator;
37
38
  constructor(page: Page, testInfo?: TestInfo);
38
39
  clickClusterBanner(): Promise<void>;
@@ -52,7 +53,7 @@ declare class ClusterPage {
52
53
  clickConnectorSecretsTab(clusterName: string): Promise<void>;
53
54
  clickClusterOption(): Promise<void>;
54
55
  createClusterIfNotExists(clusterName: string, region?: string): Promise<void>;
55
- assertClusterHealthyStatusWithRetry(name: string, visibilityTimeout?: number, totalTimeout?: number): Promise<void>;
56
+ assertClusterHealthyStatusWithRetry(name: string, visibilityTimeout?: number, totalTimeout?: number, maxRetries?: number): Promise<void>;
56
57
  clickAlphaTab(): Promise<void>;
57
58
  clickDevTab(): Promise<void>;
58
59
  clickStableTab(): Promise<void>;
@@ -39,6 +39,7 @@ class ClusterPage {
39
39
  cluster;
40
40
  clusterHealthiness;
41
41
  clusterLink;
42
+ clusterVersion;
42
43
  dialog;
43
44
  constructor(page, testInfo) {
44
45
  this.page = page;
@@ -106,6 +107,7 @@ class ClusterPage {
106
107
  this.clusterLink = (clusterName) => this.cluster(clusterName).getByRole('link', {
107
108
  name: clusterName,
108
109
  });
110
+ this.clusterVersion = (clusterName, versionText) => this.cluster(clusterName).getByText(versionText);
109
111
  }
110
112
  async clickClusterBanner() {
111
113
  await this.page
@@ -296,11 +298,11 @@ class ClusterPage {
296
298
  await this.assertClusterHealthyStatusWithRetry(clusterName, 120000, 600000);
297
299
  }
298
300
  }
299
- async assertClusterHealthyStatusWithRetry(name, visibilityTimeout = 100000, totalTimeout = 500000) {
301
+ async assertClusterHealthyStatusWithRetry(name, visibilityTimeout = 100000, totalTimeout = 500000, maxRetries) {
300
302
  await (0, expectLocatorWithRetry_1.expectLocatorWithRetry)(this.page, this.clusterHealthiness(name), {
301
303
  visibilityTimeout: visibilityTimeout,
302
304
  totalTimeout: totalTimeout,
303
- maxRetries: 5,
305
+ maxRetries: maxRetries ?? 5,
304
306
  preAction: async () => {
305
307
  await this.page.reload();
306
308
  await (0, test_1.expect)(this.cluster(name)).toBeVisible({ timeout: 10000 });
@@ -26,7 +26,6 @@ const testUser = process.env.IS_MIGRATION === 'true'
26
26
  password: process.env.C8_PASSWORD,
27
27
  }
28
28
  : (0, users_1.getTestUser)('twentyFirstUser');
29
- _8_10_1.test.describe.configure({ mode: 'serial' });
30
29
  _8_10_1.test.describe('SaaS Migration Path Tests', () => {
31
30
  _8_10_1.test.beforeEach(async ({ page, loginPage }, testInfo) => {
32
31
  // Skip if not in migration mode
@@ -39,7 +38,7 @@ _8_10_1.test.describe('SaaS Migration Path Tests', () => {
39
38
  await (0, _setup_1.captureScreenshot)(page, testInfo);
40
39
  await (0, _setup_1.captureFailureVideo)(page, testInfo);
41
40
  });
42
- (0, _8_10_1.test)('SaaS UI Upgrade Flow Automation @saasUpgrade', async ({ page, homePage, clusterPage, clusterDetailsPage, }) => {
41
+ (0, _8_10_1.test)('SaaS UI Upgrade Flow Automation @saasUpgrade', async ({ homePage, clusterPage, clusterDetailsPage, }) => {
43
42
  _8_10_1.test.slow();
44
43
  await _8_10_1.test.step('Navigate to SaaS Upgrade Section', async () => {
45
44
  await homePage.clickClusters();
@@ -47,7 +46,7 @@ _8_10_1.test.describe('SaaS Migration Path Tests', () => {
47
46
  await clusterDetailsPage.performClusterUpdate();
48
47
  await homePage.clickClusters();
49
48
  await clusterPage.assertClusterHealthyStatusWithRetry('Test Cluster');
50
- await (0, test_1.expect)(page.getByText(process.env.MINOR_VERSION)).toBeVisible();
49
+ await (0, test_1.expect)(clusterPage.clusterVersion('Test Cluster', '8.10')).toBeVisible();
51
50
  });
52
51
  });
53
52
  (0, _8_10_1.test)('Basic Navigation After SaaS Upgrade', async ({ homePage, appsPage, modelerHomePage, operateHomePage, optimizeHomePage, taskPanelPage, ocIdentityHomePage, }) => {
@@ -96,62 +95,19 @@ _8_10_1.test.describe('SaaS Migration Path Tests', () => {
96
95
  });
97
96
  });
98
97
  });
99
- (0, _8_10_1.test)('Assert Process Instances Persist After SaaS Upgrade', async ({ page, appsPage, operateHomePage, operateProcessesPage, operateProcessInstancePage, optimizeHomePage, optimizeReportPage, taskPanelPage, }) => {
100
- _8_10_1.test.slow();
101
- // Use the same fixed names that were created in the pre-upgrade smoke tests
102
- const processName = 'Zeebe_User_Task_ProcessUpgradeTest';
103
- const reportName = 'UpgradeTestReport';
104
- const clusterName = 'Test Cluster';
105
- await _8_10_1.test.step('View Process Instance in Operate', async () => {
106
- await appsPage.clickCamundaApps();
107
- await appsPage.clickOperate(clusterName);
108
- await (0, test_1.expect)(operateHomePage.processesTab).toBeVisible({
109
- timeout: 120000,
110
- });
111
- await operateHomePage.clickProcessesTab();
112
- await operateProcessesPage.clickProcessCompletedCheckbox();
113
- await operateProcessesPage.clickProcessInstanceLink(processName);
114
- await operateProcessInstancePage.assertProcessCompleteStatusWithRetry();
115
- });
116
- await _8_10_1.test.step('View Process Instance in Tasklist', async () => {
117
- await appsPage.clickCamundaApps();
118
- await appsPage.clickTasklist(clusterName);
119
- await taskPanelPage.filterBy('Completed');
120
- await (0, test_1.expect)(page.getByRole('heading', { name: 'completed' })).toBeVisible({
121
- timeout: 45000,
122
- });
123
- await (0, test_1.expect)(page.getByText(processName)).toBeVisible({ timeout: 60000 });
124
- });
125
- await _8_10_1.test.step('View Report in Optimize', async () => {
126
- await appsPage.clickCamundaApps();
127
- await appsPage.clickOptimize(clusterName);
128
- await optimizeHomePage.clickCollectionsLink();
129
- // Look for the specific report created during pre-upgrade smoke tests
130
- await (0, test_1.expect)(page.getByText(reportName)).toBeVisible({
131
- timeout: 60000,
132
- });
133
- await page.getByText(reportName).click();
134
- await optimizeReportPage.waitUntilLocatorIsVisible(optimizeReportPage.oneUserTaskInstance, page);
135
- await (0, test_1.expect)(optimizeReportPage.oneUserTaskInstance).toBeVisible({
136
- timeout: 90000,
137
- });
138
- });
139
- });
140
- (0, _8_10_1.test)('Assert SaaS Organization Data Persists After Upgrade', async ({ page, appsPage, }) => {
98
+ (0, _8_10_1.test)('Assert SaaS Organization Data Persists After Upgrade', async ({ page, appsPage, homePage, consoleOrganizationsPage, }) => {
141
99
  await _8_10_1.test.step('Verify Organization Settings Persist', async () => {
142
100
  await appsPage.clickCamundaApps();
143
101
  await appsPage.clickConsoleLink();
144
- await page.getByRole('button', { name: 'Organization Settings' }).click();
145
- // Verify organization name and settings
146
- await (0, test_1.expect)(page.getByTestId('organization-name')).toBeVisible();
147
- await (0, test_1.expect)(page.getByTestId('organization-members')).toBeVisible();
102
+ await homePage.organizationTab.click();
148
103
  });
149
104
  await _8_10_1.test.step('Verify User Roles and Permissions Persist', async () => {
150
- await page.getByRole('tab', { name: 'Members' }).click();
105
+ await consoleOrganizationsPage.clickUsersTab();
151
106
  // Verify existing users still have correct roles
152
- await (0, test_1.expect)(page.getByText('Owner')).toBeVisible();
153
- await (0, test_1.expect)(page.getByText('Developer')).toBeVisible();
154
- await (0, test_1.expect)(page.getByText('Modeler')).toBeVisible();
107
+ await (0, test_1.expect)(page.getByRole('cell', { name: 'Owner' })).toBeVisible();
108
+ await (0, test_1.expect)(page.getByRole('cell', { name: 'Developer' })).toBeVisible();
109
+ await (0, test_1.expect)(page.getByRole('cell', { name: 'Modeler' })).toBeVisible();
110
+ await (0, test_1.expect)(page.getByRole('cell', { name: 'Admin' })).toBeVisible();
155
111
  });
156
112
  });
157
113
  (0, _8_10_1.test)('Assert Connectors Still Function After SaaS Upgrade @tasklistV2', async ({ operateHomePage, appsPage, operateProcessesPage, operateProcessInstancePage, }) => {
@@ -26,7 +26,6 @@ const testUser = process.env.IS_MIGRATION === 'true'
26
26
  password: process.env.C8_PASSWORD,
27
27
  }
28
28
  : (0, users_1.getTestUser)('twentyFirstUser');
29
- _8_7_1.test.describe.configure({ mode: 'serial' });
30
29
  _8_7_1.test.describe('SaaS Migration Path Tests', () => {
31
30
  _8_7_1.test.beforeEach(async ({ page, loginPage }, testInfo) => {
32
31
  if (process.env.IS_MIGRATION !== 'true') {
@@ -93,6 +92,8 @@ _8_7_1.test.describe('SaaS Migration Path Tests', () => {
93
92
  // Use the same fixed names that were created in the pre-upgrade smoke tests
94
93
  const processName = 'Zeebe_User_Task_ProcessUpgradeTest';
95
94
  const reportName = 'UpgradeTestReport';
95
+ const task1Name = 'zeebeUserTaskWithFormUpgradeTest1';
96
+ const task2Name = 'zeebeUserTaskWithFormUpgradeTest2';
96
97
  const clusterName = 'Test Cluster';
97
98
  await _8_7_1.test.step('View Process Instance in Operate', async () => {
98
99
  await appsPage.clickCamundaApps();
@@ -112,7 +113,12 @@ _8_7_1.test.describe('SaaS Migration Path Tests', () => {
112
113
  await (0, test_1.expect)(page.getByRole('heading', { name: 'completed' })).toBeVisible({
113
114
  timeout: 45000,
114
115
  });
115
- await (0, test_1.expect)(page.getByText(processName)).toBeVisible({ timeout: 60000 });
116
+ (0, test_1.expect)(page.getByText(task1Name)).toBeVisible({
117
+ timeout: 60000,
118
+ });
119
+ await (0, test_1.expect)(page.getByText(task2Name)).toBeVisible({
120
+ timeout: 60000,
121
+ });
116
122
  });
117
123
  await _8_7_1.test.step('View Report in Optimize', async () => {
118
124
  await appsPage.clickCamundaApps();
@@ -122,8 +128,8 @@ _8_7_1.test.describe('SaaS Migration Path Tests', () => {
122
128
  timeout: 60000,
123
129
  });
124
130
  await page.getByText(reportName).click();
125
- await optimizeReportPage.waitUntilLocatorIsVisible(optimizeReportPage.oneUserTaskInstance, page);
126
- await (0, test_1.expect)(optimizeReportPage.oneUserTaskInstance).toBeVisible({
131
+ await optimizeReportPage.waitUntilLocatorIsVisible(optimizeReportPage.oneUserTaskInstance.first(), page);
132
+ await (0, test_1.expect)(optimizeReportPage.oneUserTaskInstance.first()).toBeVisible({
127
133
  timeout: 90000,
128
134
  });
129
135
  });
@@ -38,6 +38,7 @@ _8_7_1.test.describe('Cluster Setup Tests', () => {
38
38
  await clusterDetailsPage.assertComponentsHealth();
39
39
  });
40
40
  (0, _8_7_1.test)('Create AWS Cluster', async ({ page, loginPage, homePage, clusterPage, clusterDetailsPage, }, testInfo) => {
41
+ _8_7_1.test.skip(process.env.IS_MIGRATION === 'true', 'Skipping AWS Cluster creation during upgrade testing');
41
42
  _8_7_1.test.slow();
42
43
  const clusterName = 'AWS Cluster';
43
44
  await (0, UtilitiesPage_1.loginWithRetry)(page, loginPage, users_1.testUsers.mainUser, (testInfo.workerIndex + 1) * 1000);
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  /**
4
- * SaaS Migration Path User Flows (8.8 → 8.9)
4
+ * SaaS Migration Path User Flows (8.7 → 8.8)
5
5
  *
6
6
  * This test suite focuses on UI upgrade automation and basic validation.
7
7
  * Comprehensive functionality validation is handled by smoke test comparison
@@ -24,7 +24,6 @@ const testUser = process.env.IS_MIGRATION === 'true'
24
24
  password: process.env.C8_PASSWORD,
25
25
  }
26
26
  : (0, users_1.getTestUser)('twentyFirstUser');
27
- _8_8_1.test.describe.configure({ mode: 'serial' });
28
27
  _8_8_1.test.describe('SaaS Migration Path Tests', () => {
29
28
  _8_8_1.test.beforeEach(async ({ page, loginPage }, testInfo) => {
30
29
  if (process.env.IS_MIGRATION !== 'true') {
@@ -36,15 +35,15 @@ _8_8_1.test.describe('SaaS Migration Path Tests', () => {
36
35
  await (0, _setup_1.captureScreenshot)(page, testInfo);
37
36
  await (0, _setup_1.captureFailureVideo)(page, testInfo);
38
37
  });
39
- (0, _8_8_1.test)('SaaS UI Upgrade Flow Automation @saasUpgrade', async ({ page, homePage, clusterPage, clusterDetailsPage, }) => {
38
+ (0, _8_8_1.test)('SaaS UI Upgrade Flow Automation @saasUpgrade', async ({ homePage, clusterPage, clusterDetailsPage, }) => {
40
39
  _8_8_1.test.slow();
41
40
  await _8_8_1.test.step('Navigate to SaaS Upgrade Section', async () => {
42
41
  await homePage.clickClusters();
43
42
  await clusterPage.clickClusterLink('Test Cluster');
44
43
  await clusterDetailsPage.performClusterUpdate();
45
44
  await homePage.clickClusters();
46
- await clusterPage.assertClusterHealthyStatusWithRetry('Test Cluster');
47
- await (0, test_1.expect)(page.getByText(process.env.MINOR_VERSION)).toBeVisible();
45
+ await clusterPage.assertClusterHealthyStatusWithRetry('Test Cluster', undefined, undefined, true);
46
+ await (0, test_1.expect)(clusterPage.clusterVersion('Test Cluster', '8.8')).toBeVisible();
48
47
  });
49
48
  });
50
49
  (0, _8_8_1.test)('Basic Navigation After SaaS Upgrade', async ({ homePage, appsPage, modelerHomePage, operateHomePage, optimizeHomePage, taskPanelPage, ocIdentityHomePage, }) => {
@@ -98,6 +97,8 @@ _8_8_1.test.describe('SaaS Migration Path Tests', () => {
98
97
  // Use the same fixed names that were created in the pre-upgrade smoke tests
99
98
  const processName = 'Zeebe_User_Task_ProcessUpgradeTest';
100
99
  const reportName = 'UpgradeTestReport';
100
+ const task1Name = 'zeebeUserTaskWithFormUpgradeTest1';
101
+ const task2Name = 'zeebeUserTaskWithFormUpgradeTest2';
101
102
  const clusterName = 'Test Cluster';
102
103
  await _8_8_1.test.step('View Process Instance in Operate', async () => {
103
104
  await appsPage.clickCamundaApps();
@@ -117,7 +118,12 @@ _8_8_1.test.describe('SaaS Migration Path Tests', () => {
117
118
  await (0, test_1.expect)(page.getByRole('heading', { name: 'completed' })).toBeVisible({
118
119
  timeout: 45000,
119
120
  });
120
- await (0, test_1.expect)(page.getByText(processName)).toBeVisible({ timeout: 60000 });
121
+ await (0, test_1.expect)(page.getByText(task1Name)).toBeVisible({
122
+ timeout: 60000,
123
+ });
124
+ await (0, test_1.expect)(page.getByText(task2Name)).toBeVisible({
125
+ timeout: 60000,
126
+ });
121
127
  });
122
128
  await _8_8_1.test.step('View Report in Optimize', async () => {
123
129
  await appsPage.clickCamundaApps();
@@ -128,27 +134,25 @@ _8_8_1.test.describe('SaaS Migration Path Tests', () => {
128
134
  timeout: 60000,
129
135
  });
130
136
  await page.getByText(reportName).click();
131
- await optimizeReportPage.waitUntilLocatorIsVisible(optimizeReportPage.oneUserTaskInstance, page);
132
- await (0, test_1.expect)(optimizeReportPage.oneUserTaskInstance).toBeVisible({
137
+ await optimizeReportPage.waitUntilLocatorIsVisible(optimizeReportPage.oneUserTaskInstance.first(), page);
138
+ await (0, test_1.expect)(optimizeReportPage.oneUserTaskInstance.first()).toBeVisible({
133
139
  timeout: 90000,
134
140
  });
135
141
  });
136
142
  });
137
- (0, _8_8_1.test)('Assert SaaS Organization Data Persists After Upgrade', async ({ page, appsPage, }) => {
143
+ (0, _8_8_1.test)('Assert SaaS Organization Data Persists After Upgrade', async ({ page, appsPage, homePage, consoleOrganizationsPage, }) => {
138
144
  await _8_8_1.test.step('Verify Organization Settings Persist', async () => {
139
145
  await appsPage.clickCamundaApps();
140
146
  await appsPage.clickConsoleLink();
141
- await page.getByRole('button', { name: 'Organization Settings' }).click();
142
- // Verify organization name and settings
143
- await (0, test_1.expect)(page.getByTestId('organization-name')).toBeVisible();
144
- await (0, test_1.expect)(page.getByTestId('organization-members')).toBeVisible();
147
+ await homePage.organizationTab.click();
145
148
  });
146
149
  await _8_8_1.test.step('Verify User Roles and Permissions Persist', async () => {
147
- await page.getByRole('tab', { name: 'Members' }).click();
150
+ await consoleOrganizationsPage.clickUsersTab();
148
151
  // Verify existing users still have correct roles
149
- await (0, test_1.expect)(page.getByText('Owner')).toBeVisible();
150
- await (0, test_1.expect)(page.getByText('Developer')).toBeVisible();
151
- await (0, test_1.expect)(page.getByText('Modeler')).toBeVisible();
152
+ await (0, test_1.expect)(page.getByRole('cell', { name: 'Owner' })).toBeVisible();
153
+ await (0, test_1.expect)(page.getByRole('cell', { name: 'Developer' })).toBeVisible();
154
+ await (0, test_1.expect)(page.getByRole('cell', { name: 'Modeler' })).toBeVisible();
155
+ await (0, test_1.expect)(page.getByRole('cell', { name: 'Admin' })).toBeVisible();
152
156
  });
153
157
  });
154
158
  (0, _8_8_1.test)('Assert Connectors Still Function After SaaS Upgrade @tasklistV2', async ({ operateHomePage, appsPage, operateProcessesPage, operateProcessInstancePage, }) => {
@@ -26,7 +26,6 @@ const testUser = process.env.IS_MIGRATION === 'true'
26
26
  password: process.env.C8_PASSWORD,
27
27
  }
28
28
  : (0, users_1.getTestUser)('twentyFirstUser');
29
- _8_9_1.test.describe.configure({ mode: 'serial' });
30
29
  _8_9_1.test.describe('SaaS Migration Path Tests', () => {
31
30
  _8_9_1.test.beforeEach(async ({ page, loginPage }, testInfo) => {
32
31
  // Skip if not in migration mode
@@ -39,16 +38,13 @@ _8_9_1.test.describe('SaaS Migration Path Tests', () => {
39
38
  await (0, _setup_1.captureScreenshot)(page, testInfo);
40
39
  await (0, _setup_1.captureFailureVideo)(page, testInfo);
41
40
  });
42
- (0, _8_9_1.test)('SaaS UI Upgrade Flow Automation @saasUpgrade', async ({ page, homePage, clusterPage, clusterDetailsPage, }) => {
43
- _8_9_1.test.slow();
44
- await _8_9_1.test.step('Navigate to SaaS Upgrade Section', async () => {
45
- await homePage.clickClusters();
46
- await clusterPage.clickClusterLink('Test Cluster');
47
- await clusterDetailsPage.performClusterUpdate();
48
- await homePage.clickClusters();
49
- await clusterPage.assertClusterHealthyStatusWithRetry('Test Cluster');
50
- await (0, test_1.expect)(page.getByText(process.env.MINOR_VERSION)).toBeVisible();
51
- });
41
+ (0, _8_9_1.test)('SaaS UI Upgrade Flow Automation @saasUpgrade', async ({ homePage, clusterPage, clusterDetailsPage, }) => {
42
+ await homePage.clickClusters();
43
+ await clusterPage.clickClusterLink('Test Cluster');
44
+ await clusterDetailsPage.performClusterUpdate();
45
+ await homePage.clickClusters();
46
+ await clusterPage.assertClusterHealthyStatusWithRetry('Test Cluster');
47
+ await (0, test_1.expect)(clusterPage.clusterVersion('Test Cluster', '8.9')).toBeVisible();
52
48
  });
53
49
  (0, _8_9_1.test)('Basic Navigation After SaaS Upgrade', async ({ homePage, appsPage, modelerHomePage, operateHomePage, optimizeHomePage, taskPanelPage, ocIdentityHomePage, }) => {
54
50
  const clusterName = 'Test Cluster';
@@ -100,6 +96,8 @@ _8_9_1.test.describe('SaaS Migration Path Tests', () => {
100
96
  _8_9_1.test.slow();
101
97
  // Use the same fixed names that were created in the pre-upgrade smoke tests
102
98
  const processName = 'Zeebe_User_Task_ProcessUpgradeTest';
99
+ const task1Name = 'zeebeUserTaskWithFormUpgradeTest1';
100
+ const task2Name = 'zeebeUserTaskWithFormUpgradeTest2';
103
101
  const reportName = 'UpgradeTestReport';
104
102
  const clusterName = 'Test Cluster';
105
103
  await _8_9_1.test.step('View Process Instance in Operate', async () => {
@@ -120,7 +118,12 @@ _8_9_1.test.describe('SaaS Migration Path Tests', () => {
120
118
  await (0, test_1.expect)(page.getByRole('heading', { name: 'completed' })).toBeVisible({
121
119
  timeout: 45000,
122
120
  });
123
- await (0, test_1.expect)(page.getByText(processName)).toBeVisible({ timeout: 60000 });
121
+ await (0, test_1.expect)(page.getByText(task1Name)).toBeVisible({
122
+ timeout: 60000,
123
+ });
124
+ await (0, test_1.expect)(page.getByText(task2Name)).toBeVisible({
125
+ timeout: 60000,
126
+ });
124
127
  });
125
128
  await _8_9_1.test.step('View Report in Optimize', async () => {
126
129
  await appsPage.clickCamundaApps();
@@ -131,27 +134,25 @@ _8_9_1.test.describe('SaaS Migration Path Tests', () => {
131
134
  timeout: 60000,
132
135
  });
133
136
  await page.getByText(reportName).click();
134
- await optimizeReportPage.waitUntilLocatorIsVisible(optimizeReportPage.oneUserTaskInstance, page);
135
- await (0, test_1.expect)(optimizeReportPage.oneUserTaskInstance).toBeVisible({
137
+ await optimizeReportPage.waitUntilLocatorIsVisible(optimizeReportPage.oneUserTaskInstance.first(), page);
138
+ await (0, test_1.expect)(optimizeReportPage.oneUserTaskInstance.first()).toBeVisible({
136
139
  timeout: 90000,
137
140
  });
138
141
  });
139
142
  });
140
- (0, _8_9_1.test)('Assert SaaS Organization Data Persists After Upgrade', async ({ page, appsPage, }) => {
143
+ (0, _8_9_1.test)('Assert SaaS Organization Data Persists After Upgrade', async ({ page, appsPage, homePage, consoleOrganizationsPage, }) => {
141
144
  await _8_9_1.test.step('Verify Organization Settings Persist', async () => {
142
145
  await appsPage.clickCamundaApps();
143
146
  await appsPage.clickConsoleLink();
144
- await page.getByRole('button', { name: 'Organization Settings' }).click();
145
- // Verify organization name and settings
146
- await (0, test_1.expect)(page.getByTestId('organization-name')).toBeVisible();
147
- await (0, test_1.expect)(page.getByTestId('organization-members')).toBeVisible();
147
+ await homePage.organizationTab.click();
148
148
  });
149
149
  await _8_9_1.test.step('Verify User Roles and Permissions Persist', async () => {
150
- await page.getByRole('tab', { name: 'Members' }).click();
150
+ await consoleOrganizationsPage.clickUsersTab();
151
151
  // Verify existing users still have correct roles
152
- await (0, test_1.expect)(page.getByText('Owner')).toBeVisible();
153
- await (0, test_1.expect)(page.getByText('Developer')).toBeVisible();
154
- await (0, test_1.expect)(page.getByText('Modeler')).toBeVisible();
152
+ await (0, test_1.expect)(page.getByRole('cell', { name: 'Owner' })).toBeVisible();
153
+ await (0, test_1.expect)(page.getByRole('cell', { name: 'Developer' })).toBeVisible();
154
+ await (0, test_1.expect)(page.getByRole('cell', { name: 'Modeler' })).toBeVisible();
155
+ await (0, test_1.expect)(page.getByRole('cell', { name: 'Admin' })).toBeVisible();
155
156
  });
156
157
  });
157
158
  (0, _8_9_1.test)('Assert Connectors Still Function After SaaS Upgrade @tasklistV2', async ({ operateHomePage, appsPage, operateProcessesPage, operateProcessInstancePage, }) => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camunda/e2e-test-suite",
3
- "version": "0.0.313",
3
+ "version": "0.0.314",
4
4
  "description": "End-to-end test helpers for Camunda 8",
5
5
  "repository": {
6
6
  "type": "git",