@camunda/e2e-test-suite 0.0.232 → 0.0.234

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.
@@ -26,6 +26,7 @@ import { ModelerUserInvitePage } from '../pages/8.6/ModelerUserInvitePage';
26
26
  import { SignUpPage } from '../pages/8.6/SignUpPage';
27
27
  import { PlayPage } from '../pages/8.6/PlayPage';
28
28
  import { ConnectorTemplatePage } from '../pages/8.6/ConnectorTemplatePage';
29
+ import { ClientCredentialsDetailsPage } from '../pages/8.6/ClientCredentialsDetailsPage';
29
30
  type PlaywrightFixtures = {
30
31
  makeAxeBuilder: () => AxeBuilder;
31
32
  loginPage: LoginPage;
@@ -55,6 +56,7 @@ type PlaywrightFixtures = {
55
56
  signUpPage: SignUpPage;
56
57
  playPage: PlayPage;
57
58
  connectorTemplatePage: ConnectorTemplatePage;
59
+ clientCredentialsDetailsPage: ClientCredentialsDetailsPage;
58
60
  overrideTrackingScripts: void;
59
61
  };
60
62
  declare const test: import("@playwright/test").TestType<import("@playwright/test").PlaywrightTestArgs & import("@playwright/test").PlaywrightTestOptions & PlaywrightFixtures, import("@playwright/test").PlaywrightWorkerArgs & import("@playwright/test").PlaywrightWorkerOptions>;
@@ -33,6 +33,7 @@ const ModelerUserInvitePage_1 = require("../pages/8.6/ModelerUserInvitePage");
33
33
  const SignUpPage_1 = require("../pages/8.6/SignUpPage");
34
34
  const PlayPage_1 = require("../pages/8.6/PlayPage");
35
35
  const ConnectorTemplatePage_1 = require("../pages/8.6/ConnectorTemplatePage");
36
+ const ClientCredentialsDetailsPage_1 = require("../pages/8.6/ClientCredentialsDetailsPage");
36
37
  const test = test_1.test.extend({
37
38
  makeAxeBuilder: async ({ page }, use) => {
38
39
  const makeAxeBuilder = () => new playwright_1.default({ page }).withTags([
@@ -125,6 +126,9 @@ const test = test_1.test.extend({
125
126
  connectorTemplatePage: async ({ page }, use) => {
126
127
  await use(new ConnectorTemplatePage_1.ConnectorTemplatePage(page));
127
128
  },
129
+ clientCredentialsDetailsPage: async ({ page }, use) => {
130
+ await use(new ClientCredentialsDetailsPage_1.ClientCredentialsDetailsPage(page));
131
+ },
128
132
  overrideTrackingScripts: [
129
133
  async ({ context }, use) => {
130
134
  await context.route('https://cmp.osano.com/16CVvwSNKHi9t1grQ/9403708a-488b-4f3b-aea6-613825dec79f/osano.js', (route) => route.fulfill({
@@ -32,6 +32,7 @@ import { OCIdentityHomePage } from '../pages/8.8/OCIdentityHomePage';
32
32
  import { OCIdentityMappingRulesPage } from '../pages/8.8/OCIdentityMappingRulesPage';
33
33
  import { OCIdentityRolesPage } from '../pages/8.8/OCIdentityRolesPage';
34
34
  import { OCIdentityAuthorizationsPage } from '../pages/8.8/OCIdentityAuthorizationsPage';
35
+ import { ClientCredentialsDetailsPage } from '../pages/8.8/ClientCredentialsDetailsPage';
35
36
  type PlaywrightFixtures = {
36
37
  makeAxeBuilder: () => AxeBuilder;
37
38
  loginPage: LoginPage;
@@ -67,6 +68,7 @@ type PlaywrightFixtures = {
67
68
  ocIdentityMappingRulesPage: OCIdentityMappingRulesPage;
68
69
  ocIdentityRolesPage: OCIdentityRolesPage;
69
70
  ocIdentityAuthorizationsPage: OCIdentityAuthorizationsPage;
71
+ clientCredentialsDetailsPage: ClientCredentialsDetailsPage;
70
72
  overrideTrackingScripts: void;
71
73
  };
72
74
  declare const test: import("@playwright/test").TestType<import("@playwright/test").PlaywrightTestArgs & import("@playwright/test").PlaywrightTestOptions & PlaywrightFixtures, import("@playwright/test").PlaywrightWorkerArgs & import("@playwright/test").PlaywrightWorkerOptions>;
@@ -39,6 +39,7 @@ const OCIdentityHomePage_1 = require("../pages/8.8/OCIdentityHomePage");
39
39
  const OCIdentityMappingRulesPage_1 = require("../pages/8.8/OCIdentityMappingRulesPage");
40
40
  const OCIdentityRolesPage_1 = require("../pages/8.8/OCIdentityRolesPage");
41
41
  const OCIdentityAuthorizationsPage_1 = require("../pages/8.8/OCIdentityAuthorizationsPage");
42
+ const ClientCredentialsDetailsPage_1 = require("../pages/8.8/ClientCredentialsDetailsPage");
42
43
  const test = test_1.test.extend({
43
44
  makeAxeBuilder: async ({ page }, use) => {
44
45
  const makeAxeBuilder = () => new playwright_1.default({ page }).withTags([
@@ -150,6 +151,9 @@ const test = test_1.test.extend({
150
151
  ocIdentityGroupsPage: async ({ page }, use) => {
151
152
  await use(new OCIdentityGroupsPage_1.OCIdentityGroupsPage(page));
152
153
  },
154
+ clientCredentialsDetailsPage: async ({ page }, use) => {
155
+ await use(new ClientCredentialsDetailsPage_1.ClientCredentialsDetailsPage(page));
156
+ },
153
157
  overrideTrackingScripts: [
154
158
  async ({ context }, use) => {
155
159
  await context.route('https://cmp.osano.com/16CVvwSNKHi9t1grQ/9403708a-488b-4f3b-aea6-613825dec79f/osano.js', (route) => route.fulfill({
@@ -0,0 +1,12 @@
1
+ import { Page, Locator } from '@playwright/test';
2
+ declare class ClientCredentialsDetailsPage {
3
+ private page;
4
+ readonly operateUrlRow: Locator;
5
+ readonly operateUrlValue: Locator;
6
+ readonly clientNameHeading: (clientName: string) => Locator;
7
+ constructor(page: Page);
8
+ isOpen(clientName: string): Promise<void>;
9
+ getOperateUrl(): Promise<string>;
10
+ goBack(): Promise<void>;
11
+ }
12
+ export { ClientCredentialsDetailsPage };
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ClientCredentialsDetailsPage = void 0;
4
+ const test_1 = require("@playwright/test");
5
+ class ClientCredentialsDetailsPage {
6
+ page;
7
+ operateUrlRow;
8
+ operateUrlValue;
9
+ clientNameHeading;
10
+ constructor(page) {
11
+ this.page = page;
12
+ this.operateUrlRow = page.getByRole('cell', { name: 'Operate URL' });
13
+ this.operateUrlValue = this.operateUrlRow.getByRole('textbox');
14
+ this.clientNameHeading = (clientName) => page.getByRole('heading', { name: clientName });
15
+ }
16
+ async isOpen(clientName) {
17
+ await (0, test_1.expect)(this.clientNameHeading(clientName)).toBeVisible({
18
+ timeout: 30000,
19
+ });
20
+ }
21
+ async getOperateUrl() {
22
+ if (await this.operateUrlValue.isVisible({ timeout: 10000 }).catch(() => false)) {
23
+ return await this.operateUrlValue.inputValue();
24
+ }
25
+ const text = await this.page.innerText('body');
26
+ const match = text.match(/Operate URL\s*([\w:/.-]+\/?)/i);
27
+ if (!match || !match[1]) {
28
+ throw new Error('Operate URL not found in client credentials page');
29
+ }
30
+ return match[1];
31
+ }
32
+ async goBack() {
33
+ await this.page.goBack();
34
+ }
35
+ }
36
+ exports.ClientCredentialsDetailsPage = ClientCredentialsDetailsPage;
@@ -1,4 +1,5 @@
1
1
  import { Page, Locator } from '@playwright/test';
2
+ import { ClientCredentialsDetailsPage } from '../8.6/ClientCredentialsDetailsPage';
2
3
  declare class ClusterDetailsPage {
3
4
  private page;
4
5
  readonly apiTab: Locator;
@@ -32,9 +33,12 @@ declare class ClusterDetailsPage {
32
33
  readonly createAlertButton: Locator;
33
34
  readonly rbaHeading: Locator;
34
35
  readonly rbaEnabledMessage: Locator;
36
+ readonly clientCredentialsLink: (clientCredentials: string) => Locator;
37
+ readonly clientRow: (name: string) => Locator;
38
+ readonly clientRowDeleteButton: (name: string) => Locator;
35
39
  constructor(page: Page);
36
40
  clickAPITab(): Promise<void>;
37
- deleteAPIClientsIfExist(): Promise<void>;
41
+ deleteAPIClientsIfExist(name?: string): Promise<void>;
38
42
  clickAlertsTab(): Promise<void>;
39
43
  clickCreateFirstAlertButton(): Promise<void>;
40
44
  clickCreateNewAlertButton(): Promise<void>;
@@ -43,6 +47,7 @@ declare class ClusterDetailsPage {
43
47
  clickCreateAlertButton(): Promise<void>;
44
48
  deleteAlerts(): Promise<void>;
45
49
  private doDelete;
50
+ clickCreateClientButton(): Promise<void>;
46
51
  clickCreateFirstClientButton(): Promise<void>;
47
52
  reload(): Promise<void>;
48
53
  clickClientNameTextbox(): Promise<void>;
@@ -54,6 +59,8 @@ declare class ClusterDetailsPage {
54
59
  clickCreateButton(): Promise<void>;
55
60
  clickCloseModalButton(): Promise<void>;
56
61
  clickSettingsTab(): Promise<void>;
62
+ createAPIClient(name: string): Promise<void>;
63
+ searchAndClickClientCredentialsLink(name: string): Promise<ClientCredentialsDetailsPage>;
57
64
  enableRBA(): Promise<void>;
58
65
  disableRBA(): Promise<void>;
59
66
  assertComponentsHealth(components?: string[]): Promise<void>;
@@ -3,6 +3,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.ClusterDetailsPage = void 0;
4
4
  const test_1 = require("@playwright/test");
5
5
  const sleep_1 = require("../../utils/sleep");
6
+ const ClientCredentialsDetailsPage_1 = require("../8.6/ClientCredentialsDetailsPage");
7
+ const clickLocatorWithRetry_1 = require("../../utils/assertionHelpers/clickLocatorWithRetry");
6
8
  class ClusterDetailsPage {
7
9
  page;
8
10
  apiTab;
@@ -36,6 +38,9 @@ class ClusterDetailsPage {
36
38
  createAlertButton;
37
39
  rbaHeading;
38
40
  rbaEnabledMessage;
41
+ clientCredentialsLink;
42
+ clientRow;
43
+ clientRowDeleteButton;
39
44
  constructor(page) {
40
45
  this.page = page;
41
46
  this.apiTab = page.getByRole('tab', { name: 'API' });
@@ -107,12 +112,33 @@ class ClusterDetailsPage {
107
112
  name: 'Resource-based authorizations',
108
113
  });
109
114
  this.clientsList = page.getByRole('row').filter({ hasNotText: 'Scopes' });
115
+ this.clientCredentialsLink = (clientCredentials) => page.getByRole('cell', { name: clientCredentials });
116
+ this.clientRow = (name) => this.clientsList.filter({ hasText: name });
117
+ this.clientRowDeleteButton = (name) => this.clientRow(name).getByRole('button', { name: 'Delete' });
110
118
  }
111
119
  async clickAPITab() {
112
120
  await (0, test_1.expect)(this.apiTab).toBeVisible({ timeout: 15000 });
113
121
  await this.apiTab.click({ timeout: 15000 });
114
122
  }
115
- async deleteAPIClientsIfExist() {
123
+ async deleteAPIClientsIfExist(name) {
124
+ if (name) {
125
+ const row = this.clientRow(name);
126
+ const deleteButton = this.clientRowDeleteButton(name);
127
+ try {
128
+ await (0, test_1.expect)(deleteButton).toBeVisible({ timeout: 10000 });
129
+ await deleteButton.click();
130
+ await (0, test_1.expect)(this.dialog).toBeVisible();
131
+ await this.deleteSubButton.click();
132
+ await (0, test_1.expect)(this.page.getByText('Deleting...')).not.toBeVisible({
133
+ timeout: 10000,
134
+ });
135
+ await (0, test_1.expect)(row).not.toBeVisible();
136
+ }
137
+ catch (error) {
138
+ console.warn(`No client row found for ${name} or deletion failed: ${error}`);
139
+ }
140
+ return;
141
+ }
116
142
  await this.doDelete(this.dialog, 'API clients');
117
143
  }
118
144
  async clickAlertsTab() {
@@ -189,6 +215,9 @@ class ClusterDetailsPage {
189
215
  console.error(`Error during ${text} deletion: `, error);
190
216
  }
191
217
  }
218
+ async clickCreateClientButton() {
219
+ await (0, clickLocatorWithRetry_1.clickLocatorWithRetry)(this.page, this.createFirstClientButton.or(this.createClientButton));
220
+ }
192
221
  async clickCreateFirstClientButton() {
193
222
  const maxRetries = 3;
194
223
  for (let retries = 0; retries < maxRetries; retries++) {
@@ -252,6 +281,36 @@ class ClusterDetailsPage {
252
281
  await this.settingsTab.click({ timeout: 120000 });
253
282
  }
254
283
  }
284
+ async createAPIClient(name) {
285
+ await this.clickCreateClientButton();
286
+ await (0, test_1.expect)(this.createClientCredentialsDialog).toBeVisible({
287
+ timeout: 60000,
288
+ });
289
+ await this.clickClientNameTextbox();
290
+ await this.fillClientNameTextbox(name);
291
+ await this.clickTasklistCheckbox();
292
+ await this.clickOperateCheckbox();
293
+ await this.clickOptimizeCheckbox();
294
+ await this.clickSecretsCheckbox();
295
+ await this.clickCreateButton();
296
+ await (0, test_1.expect)(this.clientCredentialsDialog).toBeVisible({
297
+ timeout: 20000,
298
+ });
299
+ await (0, test_1.expect)(this.clientCredentialsDialog
300
+ .getByText('The Client Secret will not be shown again.')
301
+ .first()).toBeVisible({
302
+ timeout: 60000,
303
+ });
304
+ }
305
+ async searchAndClickClientCredentialsLink(name) {
306
+ await (0, test_1.expect)(this.clientsList.first()).toBeVisible({ timeout: 60000 });
307
+ const clientLink = this.clientCredentialsLink(name);
308
+ await (0, test_1.expect)(clientLink).toBeVisible({ timeout: 30000 });
309
+ await clientLink.click();
310
+ const clientCredentialsDetailsPage = new ClientCredentialsDetailsPage_1.ClientCredentialsDetailsPage(this.page);
311
+ await clientCredentialsDetailsPage.isOpen(name);
312
+ return clientCredentialsDetailsPage;
313
+ }
255
314
  async enableRBA() {
256
315
  await (0, test_1.expect)(this.rbaHeading).toBeVisible({ timeout: 60000 });
257
316
  // Locate all elements with class .cds--toggle__text
@@ -0,0 +1,12 @@
1
+ import { Page, Locator } from '@playwright/test';
2
+ declare class ClientCredentialsDetailsPage {
3
+ private page;
4
+ readonly operateUrlRow: Locator;
5
+ readonly operateUrlValue: Locator;
6
+ readonly clientNameHeading: (clientName: string) => Locator;
7
+ constructor(page: Page);
8
+ isOpen(clientName: string): Promise<void>;
9
+ getOperateUrl(): Promise<string>;
10
+ goBack(): Promise<void>;
11
+ }
12
+ export { ClientCredentialsDetailsPage };
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ClientCredentialsDetailsPage = void 0;
4
+ const test_1 = require("@playwright/test");
5
+ class ClientCredentialsDetailsPage {
6
+ page;
7
+ operateUrlRow;
8
+ operateUrlValue;
9
+ clientNameHeading;
10
+ constructor(page) {
11
+ this.page = page;
12
+ this.operateUrlRow = page.getByRole('cell', { name: 'Operate URL' });
13
+ this.operateUrlValue = this.operateUrlRow.getByRole('textbox');
14
+ this.clientNameHeading = (clientName) => page.getByRole('heading', { name: clientName });
15
+ }
16
+ async isOpen(clientName) {
17
+ await (0, test_1.expect)(this.clientNameHeading(clientName)).toBeVisible({
18
+ timeout: 30000,
19
+ });
20
+ }
21
+ async getOperateUrl() {
22
+ if (await this.operateUrlValue.isVisible({ timeout: 10000 }).catch(() => false)) {
23
+ return await this.operateUrlValue.inputValue();
24
+ }
25
+ const text = await this.page.innerText('body');
26
+ const match = text.match(/Operate URL\s*([\w:/.-]+\/?)/i);
27
+ if (!match || !match[1]) {
28
+ throw new Error('Operate URL not found in client credentials page');
29
+ }
30
+ return match[1];
31
+ }
32
+ async goBack() {
33
+ await this.page.goBack();
34
+ }
35
+ }
36
+ exports.ClientCredentialsDetailsPage = ClientCredentialsDetailsPage;
@@ -1,4 +1,5 @@
1
1
  import { Page, Locator } from '@playwright/test';
2
+ import { ClientCredentialsDetailsPage } from '../8.8/ClientCredentialsDetailsPage';
2
3
  declare class ClusterDetailsPage {
3
4
  private page;
4
5
  readonly apiTab: Locator;
@@ -36,6 +37,9 @@ declare class ClusterDetailsPage {
36
37
  readonly rbaEnabledMessage: Locator;
37
38
  readonly authorizationsHeading: Locator;
38
39
  readonly orchestrationClusterCheckbox: Locator;
40
+ readonly clientCredentialsLink: (clientCredentials: string) => Locator;
41
+ readonly clientRow: (name: string) => Locator;
42
+ readonly clientRowDeleteButton: (name: string) => Locator;
39
43
  constructor(page: Page);
40
44
  clickAPITab(): Promise<void>;
41
45
  clickCreateClientButton(): Promise<void>;
@@ -50,7 +54,8 @@ declare class ClusterDetailsPage {
50
54
  clickSettingsTab(): Promise<void>;
51
55
  enableAuthorizations(): Promise<void>;
52
56
  disableAuthorizations(): Promise<void>;
53
- deleteAPIClientsIfExist(): Promise<void>;
57
+ searchAndClickClientCredentialsLink(name: string): Promise<ClientCredentialsDetailsPage>;
58
+ deleteAPIClientsIfExist(name?: string): Promise<void>;
54
59
  clickAlertsTab(): Promise<void>;
55
60
  clickExpandButton(): Promise<void>;
56
61
  clickCreateFirstAlertButton(): Promise<void>;
@@ -5,6 +5,7 @@ const test_1 = require("@playwright/test");
5
5
  const sleep_1 = require("../../utils/sleep");
6
6
  const clickLocatorWithRetry_1 = require("../../utils/assertionHelpers/clickLocatorWithRetry");
7
7
  const expectLocatorWithRetry_1 = require("../../utils/assertionHelpers/expectLocatorWithRetry");
8
+ const ClientCredentialsDetailsPage_1 = require("../8.8/ClientCredentialsDetailsPage");
8
9
  class ClusterDetailsPage {
9
10
  page;
10
11
  apiTab;
@@ -42,6 +43,9 @@ class ClusterDetailsPage {
42
43
  rbaEnabledMessage;
43
44
  authorizationsHeading;
44
45
  orchestrationClusterCheckbox;
46
+ clientCredentialsLink;
47
+ clientRow;
48
+ clientRowDeleteButton;
45
49
  constructor(page) {
46
50
  this.page = page;
47
51
  this.apiTab = page.getByRole('tab', { name: 'API' });
@@ -121,6 +125,9 @@ class ClusterDetailsPage {
121
125
  this.orchestrationClusterCheckbox = page
122
126
  .locator('label')
123
127
  .filter({ hasText: /^Orchestration Cluster API$/ });
128
+ this.clientCredentialsLink = (clientCredentials) => page.getByRole('cell', { name: clientCredentials });
129
+ this.clientRow = (name) => this.clientsList.filter({ hasText: name });
130
+ this.clientRowDeleteButton = (name) => this.clientRow(name).getByRole('button', { name: 'Delete' });
124
131
  }
125
132
  async clickAPITab() {
126
133
  await (0, test_1.expect)(this.apiTab).toBeVisible({ timeout: 60000 });
@@ -225,7 +232,34 @@ class ClusterDetailsPage {
225
232
  console.log('Toggle text elements not found or less than 2.');
226
233
  }
227
234
  }
228
- async deleteAPIClientsIfExist() {
235
+ async searchAndClickClientCredentialsLink(name) {
236
+ await (0, test_1.expect)(this.clientsList.first()).toBeVisible({ timeout: 60000 });
237
+ const clientLink = this.clientCredentialsLink(name);
238
+ await (0, test_1.expect)(clientLink).toBeVisible({ timeout: 30000 });
239
+ await clientLink.click();
240
+ const clientCredentialsDetailsPage = new ClientCredentialsDetailsPage_1.ClientCredentialsDetailsPage(this.page);
241
+ await clientCredentialsDetailsPage.isOpen(name);
242
+ return clientCredentialsDetailsPage;
243
+ }
244
+ async deleteAPIClientsIfExist(name) {
245
+ if (name) {
246
+ const row = this.clientRow(name);
247
+ const deleteButton = this.clientRowDeleteButton(name);
248
+ try {
249
+ await (0, test_1.expect)(deleteButton).toBeVisible({ timeout: 10000 });
250
+ await deleteButton.click();
251
+ await (0, test_1.expect)(this.dialog).toBeVisible();
252
+ await this.deleteSubButton.click();
253
+ await (0, test_1.expect)(this.page.getByText('Deleting...')).not.toBeVisible({
254
+ timeout: 10000,
255
+ });
256
+ await (0, test_1.expect)(row).not.toBeVisible();
257
+ }
258
+ catch (error) {
259
+ console.warn(`No client row found for ${name} or deletion failed: ${error}`);
260
+ }
261
+ return;
262
+ }
229
263
  await this.doDelete(this.dialog, 'API clients');
230
264
  }
231
265
  async clickAlertsTab() {
@@ -30,21 +30,7 @@ _8_6_1.test.describe('Console User Flow Tests', () => {
30
30
  await clusterPage.clickClusterLink(defaultClusterName);
31
31
  await clusterDetailsPage.clickAPITab();
32
32
  await clusterDetailsPage.deleteAPIClientsIfExist();
33
- await clusterDetailsPage.clickCreateFirstClientButton();
34
- await (0, test_1.expect)(clusterDetailsPage.createClientCredentialsDialog).toBeVisible({ timeout: 60000 });
35
- await clusterDetailsPage.clickClientNameTextbox();
36
- await clusterDetailsPage.fillClientNameTextbox(clientName);
37
- await clusterDetailsPage.clickTasklistCheckbox();
38
- await clusterDetailsPage.clickOperateCheckbox();
39
- await clusterDetailsPage.clickOptimizeCheckbox();
40
- await clusterDetailsPage.clickSecretsCheckbox();
41
- await clusterDetailsPage.clickCreateButton();
42
- await (0, test_1.expect)(clusterDetailsPage.clientCredentialsDialog).toBeVisible({
43
- timeout: 20000,
44
- });
45
- await (0, test_1.expect)(clusterDetailsPage.clientCredentialsDialog
46
- .getByText('The Client Secret will not be shown again.')
47
- .first()).toBeVisible({ timeout: 60000 });
33
+ await clusterDetailsPage.createAPIClient(clientName);
48
34
  await clusterDetailsPage.clickCloseModalButton();
49
35
  await (0, test_1.expect)(clusterDetailsPage.clientsList.filter({ hasText: clientName })).toContainText('Zeebe, Tasklist, Operate, Optimize, and Secrets');
50
36
  });
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const test_1 = require("@playwright/test");
4
+ const _8_6_1 = require("../../fixtures/8.6");
5
+ const UtilitiesPage_1 = require("../../pages/8.6/UtilitiesPage");
6
+ const _setup_1 = require("../../test-setup.js");
7
+ const users_1 = require("../../utils/users");
8
+ const urlHelpers_1 = require("../../utils/urlHelpers");
9
+ const testUser = (0, users_1.getTestUser)('twentySecondUser');
10
+ // 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
+ _8_6_1.test.describe.configure({ mode: 'parallel' });
12
+ _8_6_1.test.describe('Operate access requires authentication', () => {
13
+ let clientName;
14
+ const clusterName = 'Test Cluster';
15
+ _8_6_1.test.beforeEach(async ({ page, loginPage }, testInfo) => {
16
+ await (0, UtilitiesPage_1.loginWithRetry)(page, loginPage, testUser, (testInfo.workerIndex + 1) * 1000);
17
+ });
18
+ _8_6_1.test.afterEach(async ({ page, homePage, clusterPage, clusterDetailsPage }, testInfo) => {
19
+ await (0, _setup_1.captureScreenshot)(page, testInfo);
20
+ await (0, _setup_1.captureFailureVideo)(page, testInfo);
21
+ if (clientName) {
22
+ await homePage.clickClusters();
23
+ await clusterPage.clickClusterLink(clusterName);
24
+ await clusterDetailsPage.clickAPITab();
25
+ await clusterDetailsPage.deleteAPIClientsIfExist(clientName);
26
+ }
27
+ });
28
+ (0, _8_6_1.test)('check that POST /v1/process-definitions/search without credentials returns 403 Forbidden with JSON body', async ({ homePage, clusterPage, clusterDetailsPage, clientCredentialsDetailsPage, request, }) => {
29
+ clientName = `operate-deny-${await (0, _setup_1.generateRandomStringAsync)(5)}`;
30
+ await _8_6_1.test.step('Add API Client to Cluster', async () => {
31
+ await homePage.clickClusters();
32
+ await clusterPage.clickClusterLink(clusterName);
33
+ await clusterDetailsPage.clickAPITab();
34
+ await clusterDetailsPage.createAPIClient(clientName);
35
+ await clusterDetailsPage.clickCloseModalButton();
36
+ await (0, test_1.expect)(clusterDetailsPage.clientsList.filter({ hasText: clientName })).toBeVisible({ timeout: 6000 });
37
+ });
38
+ let operateUrl = '';
39
+ await _8_6_1.test.step('Capture Operate URL from client credentials page and close it', async () => {
40
+ await clusterDetailsPage.searchAndClickClientCredentialsLink(clientName);
41
+ operateUrl = await clientCredentialsDetailsPage.getOperateUrl();
42
+ (0, test_1.expect)(operateUrl).toMatch(/^https?:\/\//);
43
+ await clientCredentialsDetailsPage.goBack();
44
+ await clusterDetailsPage.clickAPITab();
45
+ });
46
+ await _8_6_1.test.step('POST search endpoint without auth should be rejected', async () => {
47
+ const sanitizedOperateUrl = (0, urlHelpers_1.sanitizeUrl)(operateUrl);
48
+ const response = await request.post(`${sanitizedOperateUrl}/v1/process-definitions/search`, {
49
+ data: { filter: {}, size: 10 },
50
+ });
51
+ (0, test_1.expect)(response.status()).toBe(403);
52
+ const body = await response.json();
53
+ (0, test_1.expect)(body.status).toBe(403);
54
+ (0, test_1.expect)(body.error).toBe('Forbidden');
55
+ });
56
+ });
57
+ });
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const test_1 = require("@playwright/test");
4
+ const _8_8_1 = require("../../fixtures/8.8");
5
+ const UtilitiesPage_1 = require("../../pages/8.8/UtilitiesPage");
6
+ const _setup_1 = require("../../test-setup.js");
7
+ const users_1 = require("../../utils/users");
8
+ const urlHelpers_1 = require("../../utils/urlHelpers");
9
+ const testUser = (0, users_1.getTestUser)('twentySecondUser');
10
+ // 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
+ _8_8_1.test.describe.configure({ mode: 'parallel' });
12
+ _8_8_1.test.describe('Operate access requires authentication @tasklistV2', () => {
13
+ let clientName;
14
+ const clusterName = 'Test Cluster';
15
+ _8_8_1.test.beforeEach(async ({ page, loginPage }, testInfo) => {
16
+ await (0, UtilitiesPage_1.loginWithRetry)(page, loginPage, testUser, (testInfo.workerIndex + 1) * 1000);
17
+ });
18
+ _8_8_1.test.afterEach(async ({ page, homePage, clusterPage, clusterDetailsPage }, testInfo) => {
19
+ await (0, _setup_1.captureScreenshot)(page, testInfo);
20
+ await (0, _setup_1.captureFailureVideo)(page, testInfo);
21
+ if (clientName) {
22
+ await homePage.clickClusters();
23
+ await clusterPage.clickClusterLink(clusterName);
24
+ await clusterDetailsPage.clickAPITab();
25
+ await clusterDetailsPage.deleteAPIClientsIfExist(clientName);
26
+ }
27
+ });
28
+ (0, _8_8_1.test)('check that request POST /v2/process-definitions/search returns 401 without credentials', async ({ homePage, clusterPage, clusterDetailsPage, clientCredentialsDetailsPage, request, }) => {
29
+ clientName = `operate-deny-${await (0, _setup_1.generateRandomStringAsync)(5)}`;
30
+ await _8_8_1.test.step('Add API Client to Cluster', async () => {
31
+ await homePage.clickClusters();
32
+ await clusterPage.clickClusterLink(clusterName);
33
+ await clusterDetailsPage.clickAPITab();
34
+ await clusterDetailsPage.createAPIClient(clientName);
35
+ await clusterDetailsPage.clickCloseModalButton();
36
+ await (0, test_1.expect)(clusterDetailsPage.clientsList.filter({ hasText: clientName })).toBeVisible({ timeout: 6000 });
37
+ });
38
+ let operateUrl = '';
39
+ await _8_8_1.test.step('Capture Operate URL from client credentials page and close it', async () => {
40
+ await clusterDetailsPage.searchAndClickClientCredentialsLink(clientName);
41
+ operateUrl = await clientCredentialsDetailsPage.getOperateUrl();
42
+ (0, test_1.expect)(operateUrl).toMatch(/^https?:\/\//);
43
+ await clientCredentialsDetailsPage.goBack();
44
+ await clusterDetailsPage.clickAPITab();
45
+ });
46
+ await _8_8_1.test.step('POST search endpoint without auth should be rejected', async () => {
47
+ const sanitizedOperateUrl = (0, urlHelpers_1.sanitizeUrl)(operateUrl);
48
+ const response = await request.post(`${sanitizedOperateUrl}/v2/process-definitions/search`, {
49
+ data: { filter: {}, size: 10 },
50
+ });
51
+ (0, test_1.expect)(response.status()).toBe(401);
52
+ const body = await response.text();
53
+ (0, test_1.expect)(body).toBe('');
54
+ });
55
+ });
56
+ });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camunda/e2e-test-suite",
3
- "version": "0.0.232",
3
+ "version": "0.0.234",
4
4
  "description": "End-to-end test helpers for Camunda 8",
5
5
  "repository": {
6
6
  "type": "git",