@camunda/e2e-test-suite 0.0.202 → 0.0.203
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.
- package/README.md +1 -0
- package/dist/fixtures/8.10.d.ts +75 -0
- package/dist/fixtures/8.10.js +187 -0
- package/dist/pages/8.10/AppsPage.d.ts +38 -0
- package/dist/pages/8.10/AppsPage.js +398 -0
- package/dist/pages/8.10/Authorization.d.ts +31 -0
- package/dist/pages/8.10/Authorization.js +143 -0
- package/dist/pages/8.10/ClientCredentialsDetailsPage.d.ts +12 -0
- package/dist/pages/8.10/ClientCredentialsDetailsPage.js +36 -0
- package/dist/pages/8.10/ClusterDetailsPage.d.ts +81 -0
- package/dist/pages/8.10/ClusterDetailsPage.js +475 -0
- package/dist/pages/8.10/ClusterPage.d.ts +63 -0
- package/dist/pages/8.10/ClusterPage.js +349 -0
- package/dist/pages/8.10/ClusterSecretsPage.d.ts +46 -0
- package/dist/pages/8.10/ClusterSecretsPage.js +219 -0
- package/dist/pages/8.10/ConnectorMarketplacePage.d.ts +19 -0
- package/dist/pages/8.10/ConnectorMarketplacePage.js +56 -0
- package/dist/pages/8.10/ConnectorSettingsPage.d.ts +38 -0
- package/dist/pages/8.10/ConnectorSettingsPage.js +142 -0
- package/dist/pages/8.10/ConnectorTemplatePage.d.ts +11 -0
- package/dist/pages/8.10/ConnectorTemplatePage.js +34 -0
- package/dist/pages/8.10/ConsoleOrganizationPage.d.ts +76 -0
- package/dist/pages/8.10/ConsoleOrganizationPage.js +402 -0
- package/dist/pages/8.10/FormJsPage.d.ts +28 -0
- package/dist/pages/8.10/FormJsPage.js +85 -0
- package/dist/pages/8.10/HomePage.d.ts +27 -0
- package/dist/pages/8.10/HomePage.js +88 -0
- package/dist/pages/8.10/IdpCreatePage.d.ts +81 -0
- package/dist/pages/8.10/IdpCreatePage.js +355 -0
- package/dist/pages/8.10/LoginPage.d.ts +42 -0
- package/dist/pages/8.10/LoginPage.js +93 -0
- package/dist/pages/8.10/ModelerCreatePage.d.ts +224 -0
- package/dist/pages/8.10/ModelerCreatePage.js +1166 -0
- package/dist/pages/8.10/ModelerHomePage.d.ts +54 -0
- package/dist/pages/8.10/ModelerHomePage.js +235 -0
- package/dist/pages/8.10/ModelerUserInvitePage.d.ts +29 -0
- package/dist/pages/8.10/ModelerUserInvitePage.js +136 -0
- package/dist/pages/8.10/OCIdentityAuthorizationsPage.d.ts +11 -0
- package/dist/pages/8.10/OCIdentityAuthorizationsPage.js +32 -0
- package/dist/pages/8.10/OCIdentityGroupsPage.d.ts +38 -0
- package/dist/pages/8.10/OCIdentityGroupsPage.js +166 -0
- package/dist/pages/8.10/OCIdentityHomePage.d.ts +18 -0
- package/dist/pages/8.10/OCIdentityHomePage.js +57 -0
- package/dist/pages/8.10/OCIdentityMappingRulesPage.d.ts +23 -0
- package/dist/pages/8.10/OCIdentityMappingRulesPage.js +124 -0
- package/dist/pages/8.10/OCIdentityRolesPage.d.ts +40 -0
- package/dist/pages/8.10/OCIdentityRolesPage.js +182 -0
- package/dist/pages/8.10/OperateHomePage.d.ts +23 -0
- package/dist/pages/8.10/OperateHomePage.js +73 -0
- package/dist/pages/8.10/OperateProcessInstancePage.d.ts +23 -0
- package/dist/pages/8.10/OperateProcessInstancePage.js +94 -0
- package/dist/pages/8.10/OperateProcessesPage.d.ts +25 -0
- package/dist/pages/8.10/OperateProcessesPage.js +103 -0
- package/dist/pages/8.10/OptimizeCollectionsPage.d.ts +17 -0
- package/dist/pages/8.10/OptimizeCollectionsPage.js +68 -0
- package/dist/pages/8.10/OptimizeDashboardPage.d.ts +11 -0
- package/dist/pages/8.10/OptimizeDashboardPage.js +65 -0
- package/dist/pages/8.10/OptimizeHomePage.d.ts +13 -0
- package/dist/pages/8.10/OptimizeHomePage.js +55 -0
- package/dist/pages/8.10/OptimizeReportPage.d.ts +48 -0
- package/dist/pages/8.10/OptimizeReportPage.js +159 -0
- package/dist/pages/8.10/PlayPage.d.ts +14 -0
- package/dist/pages/8.10/PlayPage.js +68 -0
- package/dist/pages/8.10/SettingsPage.d.ts +10 -0
- package/dist/pages/8.10/SettingsPage.js +43 -0
- package/dist/pages/8.10/SignUpPage.d.ts +42 -0
- package/dist/pages/8.10/SignUpPage.js +134 -0
- package/dist/pages/8.10/TaskDetailsPage.d.ts +75 -0
- package/dist/pages/8.10/TaskDetailsPage.js +269 -0
- package/dist/pages/8.10/TaskPanelPage.d.ts +21 -0
- package/dist/pages/8.10/TaskPanelPage.js +93 -0
- package/dist/pages/8.10/TaskProcessesPage.d.ts +13 -0
- package/dist/pages/8.10/TaskProcessesPage.js +68 -0
- package/dist/pages/8.10/UtilitiesPage.d.ts +47 -0
- package/dist/pages/8.10/UtilitiesPage.js +489 -0
- package/dist/tests/8.10/access-user-role-management.spec.d.ts +1 -0
- package/dist/tests/8.10/access-user-role-management.spec.js +323 -0
- package/dist/tests/8.10/agentic-ai-user-flows.spec.d.ts +1 -0
- package/dist/tests/8.10/agentic-ai-user-flows.spec.js +185 -0
- package/dist/tests/8.10/api-tests-v2.spec.d.ts +1 -0
- package/dist/tests/8.10/api-tests-v2.spec.js +20 -0
- package/dist/tests/8.10/aws-cluster-user-flows.spec.d.ts +1 -0
- package/dist/tests/8.10/aws-cluster-user-flows.spec.js +178 -0
- package/dist/tests/8.10/cluster-variables.spec.d.ts +1 -0
- package/dist/tests/8.10/cluster-variables.spec.js +70 -0
- package/dist/tests/8.10/connectors-user-flows.spec.d.ts +1 -0
- package/dist/tests/8.10/connectors-user-flows.spec.js +479 -0
- package/dist/tests/8.10/console-user-flows.spec.d.ts +1 -0
- package/dist/tests/8.10/console-user-flows.spec.js +187 -0
- package/dist/tests/8.10/hto-user-flows.spec.d.ts +1 -0
- package/dist/tests/8.10/hto-user-flows.spec.js +471 -0
- package/dist/tests/8.10/idp-user-flows.spec.d.ts +1 -0
- package/dist/tests/8.10/idp-user-flows.spec.js +214 -0
- package/dist/tests/8.10/login-negative-tests.spec.d.ts +1 -0
- package/dist/tests/8.10/login-negative-tests.spec.js +29 -0
- package/dist/tests/8.10/login.spec.d.ts +1 -0
- package/dist/tests/8.10/login.spec.js +26 -0
- package/dist/tests/8.10/navigation.spec.d.ts +1 -0
- package/dist/tests/8.10/navigation.spec.js +65 -0
- package/dist/tests/8.10/operate-access-flow.spec.d.ts +1 -0
- package/dist/tests/8.10/operate-access-flow.spec.js +51 -0
- package/dist/tests/8.10/optimize-api-tests.spec.d.ts +1 -0
- package/dist/tests/8.10/optimize-api-tests.spec.js +268 -0
- package/dist/tests/8.10/optimize-user-flows.spec.d.ts +1 -0
- package/dist/tests/8.10/optimize-user-flows.spec.js +255 -0
- package/dist/tests/8.10/play.spec.d.ts +1 -0
- package/dist/tests/8.10/play.spec.js +85 -0
- package/dist/tests/8.10/rba-enabled-v1-user-flows.spec.d.ts +1 -0
- package/dist/tests/8.10/rba-enabled-v1-user-flows.spec.js +443 -0
- package/dist/tests/8.10/rba-enabled-v2-user-flows.spec.d.ts +1 -0
- package/dist/tests/8.10/rba-enabled-v2-user-flows.spec.js +446 -0
- package/dist/tests/8.10/smoke-tests.spec.d.ts +1 -0
- package/dist/tests/8.10/smoke-tests.spec.js +181 -0
- package/dist/tests/8.10/test-setup.spec.d.ts +1 -0
- package/dist/tests/8.10/test-setup.spec.js +94 -0
- package/dist/tests/8.10/utr-enabled-user-flows.spec.d.ts +1 -0
- package/dist/tests/8.10/utr-enabled-user-flows.spec.js +182 -0
- package/dist/tests/8.10/web-modeler-user-flows.spec.d.ts +1 -0
- package/dist/tests/8.10/web-modeler-user-flows.spec.js +544 -0
- package/package.json +1 -1
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { Page, Locator } from '@playwright/test';
|
|
2
|
+
import { ClientCredentialsDetailsPage } from './ClientCredentialsDetailsPage';
|
|
3
|
+
declare class ClusterDetailsPage {
|
|
4
|
+
private page;
|
|
5
|
+
readonly apiTab: Locator;
|
|
6
|
+
readonly createFirstClientButton: Locator;
|
|
7
|
+
readonly clientNameTextbox: Locator;
|
|
8
|
+
readonly tasklistCheckbox: Locator;
|
|
9
|
+
readonly secretsCheckbox: Locator;
|
|
10
|
+
readonly optimizeCheckbox: Locator;
|
|
11
|
+
readonly operateCheckbox: Locator;
|
|
12
|
+
readonly createButton: Locator;
|
|
13
|
+
readonly closeModalButton: Locator;
|
|
14
|
+
readonly createClientButton: Locator;
|
|
15
|
+
readonly settingsTab: Locator;
|
|
16
|
+
readonly rbaEnableButton: Locator;
|
|
17
|
+
readonly rbaDisableButton: Locator;
|
|
18
|
+
readonly dialog: Locator;
|
|
19
|
+
readonly deleteButton: Locator;
|
|
20
|
+
readonly deleteSubButton: Locator;
|
|
21
|
+
readonly createClientCredentialsDialog: Locator;
|
|
22
|
+
readonly clientCredentialsDialog: Locator;
|
|
23
|
+
readonly clustersLink: Locator;
|
|
24
|
+
readonly alertsTab: Locator;
|
|
25
|
+
readonly alertsList: Locator;
|
|
26
|
+
readonly createFirstAlertButton: Locator;
|
|
27
|
+
readonly createNewAlertButton: Locator;
|
|
28
|
+
readonly emailRadioButton: Locator;
|
|
29
|
+
readonly createAlertsDialog: Locator;
|
|
30
|
+
readonly createAlertButton: Locator;
|
|
31
|
+
readonly createNewClientButton: Locator;
|
|
32
|
+
readonly clientsList: Locator;
|
|
33
|
+
readonly envVarsTab: Locator;
|
|
34
|
+
readonly zeebeCheckbox: Locator;
|
|
35
|
+
readonly apiClientNameTextbox: Locator;
|
|
36
|
+
readonly expandButton: Locator;
|
|
37
|
+
readonly rbaEnabledMessage: Locator;
|
|
38
|
+
readonly authorizationsHeading: Locator;
|
|
39
|
+
readonly orchestrationClusterCheckbox: Locator;
|
|
40
|
+
readonly clientCredentialsLink: (clientCredentials: string) => Locator;
|
|
41
|
+
constructor(page: Page);
|
|
42
|
+
clickAPITab(): Promise<void>;
|
|
43
|
+
clickCreateClientButton(): Promise<void>;
|
|
44
|
+
clickClientNameTextbox(): Promise<void>;
|
|
45
|
+
fillClientNameTextbox(name: string): Promise<void>;
|
|
46
|
+
clickTasklistCheckbox(): Promise<void>;
|
|
47
|
+
checkSecretsCheckbox(): Promise<void>;
|
|
48
|
+
clickOperateCheckbox(): Promise<void>;
|
|
49
|
+
clickOptimizeCheckbox(): Promise<void>;
|
|
50
|
+
clickCreateButton(): Promise<void>;
|
|
51
|
+
clickCloseModalButton(): Promise<void>;
|
|
52
|
+
clickSettingsTab(): Promise<void>;
|
|
53
|
+
enableAuthorizations(): Promise<void>;
|
|
54
|
+
disableAuthorizations(): Promise<void>;
|
|
55
|
+
searchAndClickClientCredentialsLink(name: string): Promise<ClientCredentialsDetailsPage>;
|
|
56
|
+
deleteAPIClientsIfExist(name?: string): Promise<void>;
|
|
57
|
+
clickAlertsTab(): Promise<void>;
|
|
58
|
+
clickExpandButton(): Promise<void>;
|
|
59
|
+
clickCreateFirstAlertButton(): Promise<void>;
|
|
60
|
+
clickCreateNewAlertButton(): Promise<void>;
|
|
61
|
+
createAlert(isFirstAlert?: boolean): Promise<void>;
|
|
62
|
+
selectEmailRadioButton(): Promise<void>;
|
|
63
|
+
clickCreateAlertButton(): Promise<void>;
|
|
64
|
+
deleteAlerts(): Promise<void>;
|
|
65
|
+
private doDelete;
|
|
66
|
+
assertComponentsHealth(components?: string[]): Promise<void>;
|
|
67
|
+
createAPIClientAndReturnVariables(name: string, setEnvVariables?: boolean): Promise<{
|
|
68
|
+
[key: string]: string;
|
|
69
|
+
}>;
|
|
70
|
+
createAPIClient(name: string): Promise<void>;
|
|
71
|
+
clickEnvVarsButton(): Promise<void>;
|
|
72
|
+
clientCredentialsText(regex: RegExp): Promise<string>;
|
|
73
|
+
checkTasklistCheckbox(): Promise<void>;
|
|
74
|
+
checkOptimizeCheckbox(): Promise<void>;
|
|
75
|
+
checkOperateCheckbox(): Promise<void>;
|
|
76
|
+
checkZeebeCheckbox(): Promise<void>;
|
|
77
|
+
fillAPIClientName(name: string): Promise<void>;
|
|
78
|
+
assertAlertText(text: string, timeout?: number, maxRetries?: number): Promise<void>;
|
|
79
|
+
checkOrchestrationClusterCheckbox(): Promise<void>;
|
|
80
|
+
}
|
|
81
|
+
export { ClusterDetailsPage };
|
|
@@ -0,0 +1,475 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ClusterDetailsPage = void 0;
|
|
4
|
+
const test_1 = require("@playwright/test");
|
|
5
|
+
const sleep_1 = require("../../utils/sleep");
|
|
6
|
+
const clickLocatorWithRetry_1 = require("../../utils/assertionHelpers/clickLocatorWithRetry");
|
|
7
|
+
const expectLocatorWithRetry_1 = require("../../utils/assertionHelpers/expectLocatorWithRetry");
|
|
8
|
+
const ClientCredentialsDetailsPage_1 = require("./ClientCredentialsDetailsPage");
|
|
9
|
+
class ClusterDetailsPage {
|
|
10
|
+
page;
|
|
11
|
+
apiTab;
|
|
12
|
+
createFirstClientButton;
|
|
13
|
+
clientNameTextbox;
|
|
14
|
+
tasklistCheckbox;
|
|
15
|
+
secretsCheckbox;
|
|
16
|
+
optimizeCheckbox;
|
|
17
|
+
operateCheckbox;
|
|
18
|
+
createButton;
|
|
19
|
+
closeModalButton;
|
|
20
|
+
createClientButton;
|
|
21
|
+
settingsTab;
|
|
22
|
+
rbaEnableButton;
|
|
23
|
+
rbaDisableButton;
|
|
24
|
+
dialog;
|
|
25
|
+
deleteButton;
|
|
26
|
+
deleteSubButton;
|
|
27
|
+
createClientCredentialsDialog;
|
|
28
|
+
clientCredentialsDialog;
|
|
29
|
+
clustersLink;
|
|
30
|
+
alertsTab;
|
|
31
|
+
alertsList;
|
|
32
|
+
createFirstAlertButton;
|
|
33
|
+
createNewAlertButton;
|
|
34
|
+
emailRadioButton;
|
|
35
|
+
createAlertsDialog;
|
|
36
|
+
createAlertButton;
|
|
37
|
+
createNewClientButton;
|
|
38
|
+
clientsList;
|
|
39
|
+
envVarsTab;
|
|
40
|
+
zeebeCheckbox;
|
|
41
|
+
apiClientNameTextbox;
|
|
42
|
+
expandButton;
|
|
43
|
+
rbaEnabledMessage;
|
|
44
|
+
authorizationsHeading;
|
|
45
|
+
orchestrationClusterCheckbox;
|
|
46
|
+
clientCredentialsLink;
|
|
47
|
+
constructor(page) {
|
|
48
|
+
this.page = page;
|
|
49
|
+
this.apiTab = page.getByRole('tab', { name: 'API' });
|
|
50
|
+
this.createFirstClientButton = page.getByRole('button', {
|
|
51
|
+
name: 'Create your first Client',
|
|
52
|
+
});
|
|
53
|
+
this.clientNameTextbox = page.getByRole('textbox', { name: 'Client Name' });
|
|
54
|
+
this.tasklistCheckbox = page.locator('label').filter({ hasText: 'Tasklist' });
|
|
55
|
+
this.optimizeCheckbox = page
|
|
56
|
+
.locator('label')
|
|
57
|
+
.filter({ hasText: /^Optimize API$/ });
|
|
58
|
+
this.operateCheckbox = page.locator('label').filter({ hasText: 'Operate' });
|
|
59
|
+
this.secretsCheckbox = page
|
|
60
|
+
.locator('label')
|
|
61
|
+
.filter({ hasText: /^Administration API - Resource: Secrets$/ });
|
|
62
|
+
this.createButton = page.getByRole('button', { name: 'Create', exact: true });
|
|
63
|
+
this.closeModalButton = page
|
|
64
|
+
.getByRole('dialog', { name: 'Client credentials', exact: true })
|
|
65
|
+
.getByLabel('Close');
|
|
66
|
+
this.createClientButton = page.getByRole('button', {
|
|
67
|
+
name: 'Create new Client',
|
|
68
|
+
});
|
|
69
|
+
this.settingsTab = page.getByRole('tab', { name: 'Settings' });
|
|
70
|
+
this.rbaEnableButton = page.getByRole('button', { name: 'Enable' });
|
|
71
|
+
this.rbaDisableButton = page.getByRole('button', { name: 'Disable' });
|
|
72
|
+
this.dialog = page.getByRole('dialog');
|
|
73
|
+
this.deleteButton = page.getByRole('button', { name: 'Delete' });
|
|
74
|
+
this.deleteSubButton = page.getByRole('button', {
|
|
75
|
+
name: 'danger Delete',
|
|
76
|
+
});
|
|
77
|
+
this.createClientCredentialsDialog = page.getByRole('dialog', {
|
|
78
|
+
name: 'Create new client credentials',
|
|
79
|
+
});
|
|
80
|
+
this.clientCredentialsDialog = page.getByRole('dialog', {
|
|
81
|
+
name: 'Client credentials',
|
|
82
|
+
exact: true,
|
|
83
|
+
});
|
|
84
|
+
this.clustersLink = page
|
|
85
|
+
.getByRole('banner')
|
|
86
|
+
.getByRole('link', { name: 'Clusters' });
|
|
87
|
+
this.alertsTab = page.getByRole('tab', { name: 'Alerts' });
|
|
88
|
+
this.alertsList = page
|
|
89
|
+
.getByRole('row')
|
|
90
|
+
.filter({ hasNotText: 'Delivery method' }); //Filter out header row
|
|
91
|
+
this.createFirstAlertButton = page.getByRole('button', {
|
|
92
|
+
name: 'Create an alert',
|
|
93
|
+
});
|
|
94
|
+
this.createNewAlertButton = page.getByRole('button', {
|
|
95
|
+
name: 'Create new alert',
|
|
96
|
+
});
|
|
97
|
+
this.emailRadioButton = page.getByRole('radio', {
|
|
98
|
+
name: 'Email',
|
|
99
|
+
});
|
|
100
|
+
this.createAlertsDialog = page.getByRole('dialog', {
|
|
101
|
+
name: 'Create process incident alert',
|
|
102
|
+
});
|
|
103
|
+
this.createAlertButton = page.getByRole('button', {
|
|
104
|
+
name: 'Create alert',
|
|
105
|
+
exact: true,
|
|
106
|
+
});
|
|
107
|
+
this.createNewClientButton = page.getByRole('button', {
|
|
108
|
+
name: 'Create new client',
|
|
109
|
+
});
|
|
110
|
+
this.clientsList = page.getByRole('row').filter({ hasNotText: 'Scopes' });
|
|
111
|
+
this.envVarsTab = this.clientCredentialsDialog.getByRole('tab', {
|
|
112
|
+
name: 'Env Vars',
|
|
113
|
+
});
|
|
114
|
+
this.zeebeCheckbox = page.locator('label').filter({ hasText: /^Zeebe$/ });
|
|
115
|
+
this.apiClientNameTextbox = page.getByRole('textbox', {
|
|
116
|
+
name: 'Client Name',
|
|
117
|
+
});
|
|
118
|
+
this.expandButton = page.locator('button[class="cds--table-expand__button"]');
|
|
119
|
+
this.rbaEnabledMessage = page.getByText('Authorizations enabled');
|
|
120
|
+
this.authorizationsHeading = this.page.getByRole('heading', {
|
|
121
|
+
name: 'Authorizations',
|
|
122
|
+
});
|
|
123
|
+
this.orchestrationClusterCheckbox = page
|
|
124
|
+
.locator('label')
|
|
125
|
+
.filter({ hasText: /^Orchestration Cluster API$/ });
|
|
126
|
+
this.clientCredentialsLink = (clientCredentials) => page.getByRole('cell', { name: clientCredentials });
|
|
127
|
+
}
|
|
128
|
+
async clickAPITab() {
|
|
129
|
+
await (0, test_1.expect)(this.apiTab).toBeVisible({ timeout: 60000 });
|
|
130
|
+
await this.apiTab.click({ timeout: 60000 });
|
|
131
|
+
}
|
|
132
|
+
async clickCreateClientButton() {
|
|
133
|
+
await (0, clickLocatorWithRetry_1.clickLocatorWithRetry)(this.page, this.createFirstClientButton.or(this.createNewClientButton));
|
|
134
|
+
}
|
|
135
|
+
async clickClientNameTextbox() {
|
|
136
|
+
await this.clientNameTextbox.click({ timeout: 60000 });
|
|
137
|
+
}
|
|
138
|
+
async fillClientNameTextbox(name) {
|
|
139
|
+
await this.clientNameTextbox.fill(name, { timeout: 60000 });
|
|
140
|
+
}
|
|
141
|
+
async clickTasklistCheckbox() {
|
|
142
|
+
await this.tasklistCheckbox.click({ timeout: 60000 });
|
|
143
|
+
}
|
|
144
|
+
async checkSecretsCheckbox() {
|
|
145
|
+
if (!(await this.secretsCheckbox.isChecked())) {
|
|
146
|
+
await this.secretsCheckbox.click();
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
async clickOperateCheckbox() {
|
|
150
|
+
await this.operateCheckbox.click({ timeout: 60000 });
|
|
151
|
+
}
|
|
152
|
+
async clickOptimizeCheckbox() {
|
|
153
|
+
await this.optimizeCheckbox.click({ timeout: 60000 });
|
|
154
|
+
}
|
|
155
|
+
async clickCreateButton() {
|
|
156
|
+
await this.createButton.click({ timeout: 60000 });
|
|
157
|
+
}
|
|
158
|
+
async clickCloseModalButton() {
|
|
159
|
+
await this.closeModalButton.click({ timeout: 60000 });
|
|
160
|
+
}
|
|
161
|
+
async clickSettingsTab() {
|
|
162
|
+
await this.settingsTab.click({ timeout: 60000 });
|
|
163
|
+
}
|
|
164
|
+
async enableAuthorizations() {
|
|
165
|
+
await (0, sleep_1.sleep)(5000);
|
|
166
|
+
await (0, test_1.expect)(this.authorizationsHeading).toBeVisible({ timeout: 60000 });
|
|
167
|
+
// Locate all elements with class .cds--toggle__text
|
|
168
|
+
const toggleTextElements = await this.page.$$('.cds--toggle__text');
|
|
169
|
+
// Check if toggleTextElements has at least 2 elements
|
|
170
|
+
if (toggleTextElements.length >= 2) {
|
|
171
|
+
// Get the text content of the second toggle text element
|
|
172
|
+
const toggleText = await toggleTextElements[1].textContent();
|
|
173
|
+
// Check if the text content is 'Disabled'
|
|
174
|
+
if (toggleText === 'Disabled') {
|
|
175
|
+
// Locate all elements with class .cds--toggle__switch
|
|
176
|
+
const toggleSwitchElements = await this.page.$$('.cds--toggle__switch');
|
|
177
|
+
// Check if toggleSwitchElements has at least 2 elements
|
|
178
|
+
if (toggleSwitchElements.length >= 2) {
|
|
179
|
+
// Click the second toggle switch element
|
|
180
|
+
await toggleSwitchElements[1].click();
|
|
181
|
+
if (await this.dialog.isVisible({ timeout: 15000 })) {
|
|
182
|
+
await this.rbaEnableButton.click({ timeout: 30000 });
|
|
183
|
+
await (0, test_1.expect)(this.page.getByText('Enabling...')).not.toBeVisible({
|
|
184
|
+
timeout: 60000,
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
console.log('Second toggle switch clicked.');
|
|
188
|
+
}
|
|
189
|
+
else {
|
|
190
|
+
console.log('Second toggle switch not found or less than 2.');
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
else {
|
|
194
|
+
console.log("Second toggle text does not contain 'Disabled'.");
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
else {
|
|
198
|
+
console.log('Toggle text elements not found or less than 2.');
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
async disableAuthorizations() {
|
|
202
|
+
await (0, test_1.expect)(this.authorizationsHeading).toBeVisible({ timeout: 60000 });
|
|
203
|
+
// Locate all elements with class .cds--toggle__text
|
|
204
|
+
const toggleTextElements = await this.page.$$('.cds--toggle__text');
|
|
205
|
+
// Check if toggleTextElements has at least 2 elements
|
|
206
|
+
if (toggleTextElements.length >= 2) {
|
|
207
|
+
// Get the text content of the second toggle text element
|
|
208
|
+
const toggleText = await toggleTextElements[1].textContent();
|
|
209
|
+
// Check if the text content is 'Enabled'
|
|
210
|
+
if (toggleText === 'Enabled') {
|
|
211
|
+
// Locate all elements with class .cds--toggle__switch
|
|
212
|
+
const toggleSwitchElements = await this.page.$$('.cds--toggle__switch');
|
|
213
|
+
// Check if toggleSwitchElements has at least 2 elements
|
|
214
|
+
if (toggleSwitchElements.length >= 2) {
|
|
215
|
+
// Click the second toggle switch element
|
|
216
|
+
await toggleSwitchElements[1].click();
|
|
217
|
+
console.log('Second toggle switch clicked.');
|
|
218
|
+
}
|
|
219
|
+
else {
|
|
220
|
+
console.log('Second toggle switch not found or less than 2.');
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
else {
|
|
224
|
+
console.log("Second toggle text does not contain 'Enabled'.");
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
else {
|
|
228
|
+
console.log('Toggle text elements not found or less than 2.');
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
async searchAndClickClientCredentialsLink(name) {
|
|
232
|
+
await (0, test_1.expect)(this.clientsList.first()).toBeVisible({ timeout: 60000 });
|
|
233
|
+
const clientLink = this.clientCredentialsLink(name);
|
|
234
|
+
await (0, test_1.expect)(clientLink).toBeVisible({ timeout: 30000 });
|
|
235
|
+
await clientLink.click();
|
|
236
|
+
const clientCredentialsDetailsPage = new ClientCredentialsDetailsPage_1.ClientCredentialsDetailsPage(this.page);
|
|
237
|
+
await clientCredentialsDetailsPage.isOpen(name);
|
|
238
|
+
return clientCredentialsDetailsPage;
|
|
239
|
+
}
|
|
240
|
+
async deleteAPIClientsIfExist(name) {
|
|
241
|
+
if (name) {
|
|
242
|
+
const row = this.clientsList.filter({ hasText: name });
|
|
243
|
+
const deleteButton = row.getByRole('button', { name: 'Delete' });
|
|
244
|
+
try {
|
|
245
|
+
await (0, test_1.expect)(deleteButton).toBeVisible({ timeout: 10000 });
|
|
246
|
+
await deleteButton.click();
|
|
247
|
+
await (0, test_1.expect)(this.dialog).toBeVisible();
|
|
248
|
+
await this.deleteSubButton.click();
|
|
249
|
+
await (0, test_1.expect)(this.page.getByText('Deleting...')).not.toBeVisible({
|
|
250
|
+
timeout: 10000,
|
|
251
|
+
});
|
|
252
|
+
await (0, test_1.expect)(row).not.toBeVisible();
|
|
253
|
+
}
|
|
254
|
+
catch (error) {
|
|
255
|
+
console.warn(`No client row found for ${name} or deletion failed: ${error}`);
|
|
256
|
+
}
|
|
257
|
+
return;
|
|
258
|
+
}
|
|
259
|
+
await this.doDelete(this.dialog, 'API clients');
|
|
260
|
+
}
|
|
261
|
+
async clickAlertsTab() {
|
|
262
|
+
await (0, test_1.expect)(this.alertsTab).toBeVisible({ timeout: 40000 });
|
|
263
|
+
await this.alertsTab.click();
|
|
264
|
+
}
|
|
265
|
+
async clickExpandButton() {
|
|
266
|
+
await this.expandButton.click({ timeout: 60000 });
|
|
267
|
+
}
|
|
268
|
+
async clickCreateFirstAlertButton() {
|
|
269
|
+
await (0, test_1.expect)(this.createFirstAlertButton).toBeVisible({ timeout: 40000 });
|
|
270
|
+
await this.createFirstAlertButton.click();
|
|
271
|
+
}
|
|
272
|
+
async clickCreateNewAlertButton() {
|
|
273
|
+
await (0, test_1.expect)(this.createNewAlertButton).toBeVisible({ timeout: 60000 });
|
|
274
|
+
await this.createNewAlertButton.click();
|
|
275
|
+
await (0, test_1.expect)(this.page.getByText('Creating...')).not.toBeVisible({
|
|
276
|
+
timeout: 60000,
|
|
277
|
+
});
|
|
278
|
+
}
|
|
279
|
+
async createAlert(isFirstAlert = true) {
|
|
280
|
+
if (isFirstAlert) {
|
|
281
|
+
await this.clickCreateFirstAlertButton();
|
|
282
|
+
}
|
|
283
|
+
else {
|
|
284
|
+
await this.clickCreateNewAlertButton();
|
|
285
|
+
}
|
|
286
|
+
await (0, test_1.expect)(this.createAlertsDialog).toBeVisible();
|
|
287
|
+
await this.selectEmailRadioButton();
|
|
288
|
+
await this.clickCreateAlertButton();
|
|
289
|
+
}
|
|
290
|
+
async selectEmailRadioButton() {
|
|
291
|
+
await (0, test_1.expect)(this.emailRadioButton).toBeVisible({ timeout: 60000 });
|
|
292
|
+
await this.emailRadioButton.click({ force: true });
|
|
293
|
+
}
|
|
294
|
+
async clickCreateAlertButton() {
|
|
295
|
+
await (0, test_1.expect)(this.createAlertButton).toBeVisible({ timeout: 60000 });
|
|
296
|
+
await this.createAlertButton.click();
|
|
297
|
+
await (0, test_1.expect)(this.page.getByText('Creating...')).not.toBeVisible({
|
|
298
|
+
timeout: 60000,
|
|
299
|
+
});
|
|
300
|
+
}
|
|
301
|
+
async deleteAlerts() {
|
|
302
|
+
await this.doDelete(this.dialog, 'Alerts');
|
|
303
|
+
}
|
|
304
|
+
async doDelete(dialog, text) {
|
|
305
|
+
try {
|
|
306
|
+
await (0, test_1.expect)(this.deleteButton.first()).toBeVisible({
|
|
307
|
+
timeout: 10000,
|
|
308
|
+
});
|
|
309
|
+
}
|
|
310
|
+
catch (error) {
|
|
311
|
+
return; //No items found in the list
|
|
312
|
+
}
|
|
313
|
+
try {
|
|
314
|
+
let deletes = await this.deleteButton.all();
|
|
315
|
+
while (deletes.length > 0) {
|
|
316
|
+
const deleteButton = deletes[0];
|
|
317
|
+
if (await deleteButton.isVisible()) {
|
|
318
|
+
await deleteButton.click({ timeout: 60000 });
|
|
319
|
+
await (0, test_1.expect)(dialog).toBeVisible({ timeout: 40000 });
|
|
320
|
+
await this.deleteSubButton.click();
|
|
321
|
+
await (0, test_1.expect)(this.page.getByText('Deleting...')).not.toBeVisible({
|
|
322
|
+
timeout: 60000,
|
|
323
|
+
});
|
|
324
|
+
}
|
|
325
|
+
await (0, sleep_1.sleep)(3000);
|
|
326
|
+
deletes = await this.deleteButton.all();
|
|
327
|
+
}
|
|
328
|
+
await (0, test_1.expect)(this.deleteButton).not.toBeVisible({
|
|
329
|
+
timeout: 30000,
|
|
330
|
+
});
|
|
331
|
+
}
|
|
332
|
+
catch (error) {
|
|
333
|
+
console.error(`Error during ${text} deletion: `, error);
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
async assertComponentsHealth(components = [
|
|
337
|
+
'Zeebe',
|
|
338
|
+
'Tasklist',
|
|
339
|
+
'Operate',
|
|
340
|
+
'Optimize',
|
|
341
|
+
'Admin',
|
|
342
|
+
]) {
|
|
343
|
+
for (const component of components) {
|
|
344
|
+
await (0, expectLocatorWithRetry_1.expectLocatorWithRetry)(this.page, this.page.getByText(`${component}Healthy`, { exact: true }), {
|
|
345
|
+
visibilityTimeout: 60000,
|
|
346
|
+
totalTimeout: 300000,
|
|
347
|
+
maxRetries: 5,
|
|
348
|
+
preAction: async () => {
|
|
349
|
+
await this.page.reload();
|
|
350
|
+
},
|
|
351
|
+
});
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
async createAPIClientAndReturnVariables(name, setEnvVariables = true) {
|
|
355
|
+
await this.createAPIClient(name);
|
|
356
|
+
await this.clickEnvVarsButton();
|
|
357
|
+
const variables = {
|
|
358
|
+
zeebeAuthUrl: await this.clientCredentialsText(/export ZEEBE_AUTHORIZATION_SERVER_URL='([^']+)'/),
|
|
359
|
+
zeebeClientId: await this.clientCredentialsText(/export ZEEBE_CLIENT_ID='([^']+)'/),
|
|
360
|
+
zeebeClientSecret: await this.clientCredentialsText(/export ZEEBE_CLIENT_SECRET='([^']+)'/),
|
|
361
|
+
zeebeUrl: await this.clientCredentialsText(/export ZEEBE_REST_ADDRESS='([^']+)'/),
|
|
362
|
+
tokenAudience: await this.clientCredentialsText(/export ZEEBE_TOKEN_AUDIENCE='([^']+)'/),
|
|
363
|
+
optimizeBaseUrl: await this.clientCredentialsText(/export CAMUNDA_OPTIMIZE_BASE_URL='([^']+)'/),
|
|
364
|
+
};
|
|
365
|
+
if (setEnvVariables) {
|
|
366
|
+
process.env.ZEEBE_API_CLIENT_ID = variables.zeebeClientId;
|
|
367
|
+
process.env.ZEEBE_API_CLIENT_SECRET = variables.zeebeClientSecret;
|
|
368
|
+
process.env.ZEEBE_API_AUTH_URL = variables.zeebeAuthUrl;
|
|
369
|
+
process.env.ZEEBE_API_URL = variables.zeebeUrl;
|
|
370
|
+
process.env.ZEEBE_API_TOKEN_AUDIENCE = variables.tokenAudience;
|
|
371
|
+
process.env.CAMUNDA_OPTIMIZE_BASE_URL = variables.optimizeBaseUrl;
|
|
372
|
+
process.env.OPTIMIZE_API_TOKEN_AUDIENCE = 'optimize.ultrawombat.com';
|
|
373
|
+
}
|
|
374
|
+
return variables;
|
|
375
|
+
}
|
|
376
|
+
async createAPIClient(name) {
|
|
377
|
+
await this.clickCreateClientButton();
|
|
378
|
+
await (0, test_1.expect)(this.createClientCredentialsDialog).toBeVisible({
|
|
379
|
+
timeout: 30000,
|
|
380
|
+
});
|
|
381
|
+
await this.fillAPIClientName(name);
|
|
382
|
+
await this.checkOrchestrationClusterCheckbox();
|
|
383
|
+
await this.checkOptimizeCheckbox();
|
|
384
|
+
await this.checkSecretsCheckbox();
|
|
385
|
+
await this.clickCreateButton();
|
|
386
|
+
await (0, test_1.expect)(this.clientCredentialsDialog).toBeVisible({
|
|
387
|
+
timeout: 20000,
|
|
388
|
+
});
|
|
389
|
+
await (0, test_1.expect)(this.clientCredentialsDialog
|
|
390
|
+
.getByText('The Client Secret will not be shown again.')
|
|
391
|
+
.first()).toBeVisible();
|
|
392
|
+
await (0, test_1.expect)(this.clientsList.filter({ hasText: name })).toContainText(/(?=.*Orchestration)(?=.*Optimize)(?=.*Secrets)/);
|
|
393
|
+
}
|
|
394
|
+
async clickEnvVarsButton() {
|
|
395
|
+
await (0, test_1.expect)(this.envVarsTab).toBeVisible({ timeout: 40000 });
|
|
396
|
+
await this.envVarsTab.click();
|
|
397
|
+
}
|
|
398
|
+
async clientCredentialsText(regex) {
|
|
399
|
+
const innerText = await this.clientCredentialsDialog.innerText();
|
|
400
|
+
const match = innerText.match(regex);
|
|
401
|
+
if (match && match[1]) {
|
|
402
|
+
return match[1];
|
|
403
|
+
}
|
|
404
|
+
else {
|
|
405
|
+
throw new Error(`No client credentials found by the regex expression ${regex}`);
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
async checkTasklistCheckbox() {
|
|
409
|
+
if (!(await this.tasklistCheckbox.isChecked())) {
|
|
410
|
+
await this.tasklistCheckbox.click();
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
async checkOptimizeCheckbox() {
|
|
414
|
+
if (!(await this.optimizeCheckbox.isChecked())) {
|
|
415
|
+
await this.optimizeCheckbox.click();
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
async checkOperateCheckbox() {
|
|
419
|
+
if (!(await this.operateCheckbox.isChecked())) {
|
|
420
|
+
await this.operateCheckbox.click();
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
async checkZeebeCheckbox() {
|
|
424
|
+
if (!(await this.zeebeCheckbox.isChecked())) {
|
|
425
|
+
await this.zeebeCheckbox.click();
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
async fillAPIClientName(name) {
|
|
429
|
+
const maxRetries = 3;
|
|
430
|
+
for (let attempt = 1; attempt <= maxRetries; attempt++) {
|
|
431
|
+
try {
|
|
432
|
+
await (0, sleep_1.sleep)(1000);
|
|
433
|
+
await (0, test_1.expect)(this.apiClientNameTextbox).toBeVisible({ timeout: 60000 });
|
|
434
|
+
await this.apiClientNameTextbox.click();
|
|
435
|
+
await this.apiClientNameTextbox.fill(name);
|
|
436
|
+
const inputValue = await this.apiClientNameTextbox.inputValue();
|
|
437
|
+
if (inputValue === name) {
|
|
438
|
+
return;
|
|
439
|
+
}
|
|
440
|
+
console.log(`Attempt ${attempt}: Value input not filled correctly. Expected: "${name}", Got: "${inputValue}"`);
|
|
441
|
+
}
|
|
442
|
+
catch (error) {
|
|
443
|
+
console.log(`Attempt ${attempt}: Error filling value input:`, error);
|
|
444
|
+
}
|
|
445
|
+
if (attempt < maxRetries) {
|
|
446
|
+
await this.apiClientNameTextbox.clear();
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
throw new Error(`Failed to fill value input after ${maxRetries} attempts`);
|
|
450
|
+
}
|
|
451
|
+
async assertAlertText(text, timeout = 60000, maxRetries = 10) {
|
|
452
|
+
for (let attempt = 0; attempt < maxRetries; attempt++) {
|
|
453
|
+
try {
|
|
454
|
+
await (0, test_1.expect)(this.alertsList.nth(1)).toContainText(text, { timeout });
|
|
455
|
+
return;
|
|
456
|
+
}
|
|
457
|
+
catch (error) {
|
|
458
|
+
if (attempt < maxRetries - 1) {
|
|
459
|
+
console.warn(`Attempt ${attempt + 1} failed for asserting ${text}. Retrying...`);
|
|
460
|
+
await this.page.reload();
|
|
461
|
+
await (0, sleep_1.sleep)(20000);
|
|
462
|
+
}
|
|
463
|
+
else {
|
|
464
|
+
throw new Error(`Assertion failed after ${maxRetries} attempts`);
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
}
|
|
469
|
+
async checkOrchestrationClusterCheckbox() {
|
|
470
|
+
if (!(await this.orchestrationClusterCheckbox.isChecked())) {
|
|
471
|
+
await this.orchestrationClusterCheckbox.click();
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
exports.ClusterDetailsPage = ClusterDetailsPage;
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { Page, Locator, TestInfo } from '@playwright/test';
|
|
2
|
+
declare class ClusterPage {
|
|
3
|
+
private page;
|
|
4
|
+
private defaultClusterType;
|
|
5
|
+
readonly belgiumRegion: Locator;
|
|
6
|
+
readonly londonRegion: Locator;
|
|
7
|
+
readonly finlandRegion: Locator;
|
|
8
|
+
private testInfo?;
|
|
9
|
+
readonly createNewClusterButton: Locator;
|
|
10
|
+
readonly clusterNameInput: Locator;
|
|
11
|
+
readonly createClusterButton: Locator;
|
|
12
|
+
readonly clusterCreatingStatusText: Locator;
|
|
13
|
+
readonly clusterHealthyStatusText: Locator;
|
|
14
|
+
readonly clusterHealthyIndicatorSelector: string;
|
|
15
|
+
readonly clusterGenerationCompleteMessage: Locator;
|
|
16
|
+
readonly clustersBreadcrumb: Locator;
|
|
17
|
+
readonly deleteClusterButton: Locator;
|
|
18
|
+
readonly confirmDeleteInput: Locator;
|
|
19
|
+
readonly dangerDeleteButton: Locator;
|
|
20
|
+
readonly testClusterLink: Locator;
|
|
21
|
+
readonly connectorSecretsTab: Locator;
|
|
22
|
+
readonly createAClusterButton: Locator;
|
|
23
|
+
readonly clusterVersionOption: Locator;
|
|
24
|
+
readonly g3DevClusterType: Locator;
|
|
25
|
+
readonly alphaTab: Locator;
|
|
26
|
+
readonly devTab: Locator;
|
|
27
|
+
readonly stableTab: Locator;
|
|
28
|
+
readonly qaGenerationsTab: Locator;
|
|
29
|
+
readonly gcpRegion: Locator;
|
|
30
|
+
readonly clustersList: Locator;
|
|
31
|
+
readonly tasklistV1Api: Locator;
|
|
32
|
+
readonly tasklistV2Api: Locator;
|
|
33
|
+
readonly cluster: (clusterName: string) => Locator;
|
|
34
|
+
readonly clusterHealthiness: (clusterName: string) => Locator;
|
|
35
|
+
readonly clusterLink: (clusterName: string) => Locator;
|
|
36
|
+
constructor(page: Page, testInfo?: TestInfo);
|
|
37
|
+
clickClusterBanner(): Promise<void>;
|
|
38
|
+
deleteCluster(name: string): Promise<void>;
|
|
39
|
+
clickClusterTab(): Promise<void>;
|
|
40
|
+
clickCreateNewClusterButton(): Promise<void>;
|
|
41
|
+
clickClusterNameInput(): Promise<void>;
|
|
42
|
+
fillClusterNameInput(name: string): Promise<void>;
|
|
43
|
+
private extractClusterIdFromUrl;
|
|
44
|
+
private logClusterCreationInfo;
|
|
45
|
+
createCluster(name: string, region?: string, tasklistV1Api?: boolean): Promise<void>;
|
|
46
|
+
determineTasklistAPI(tasklistV1Api?: boolean): Promise<void>;
|
|
47
|
+
clickClusterType(): Promise<void>;
|
|
48
|
+
clickCreateClusterButton(): Promise<void>;
|
|
49
|
+
clickClustersBreadcrumb(clusterName: string): Promise<void>;
|
|
50
|
+
clickClusterLink(name: string): Promise<void>;
|
|
51
|
+
clickConnectorSecretsTab(clusterName: string): Promise<void>;
|
|
52
|
+
clickClusterOption(): Promise<void>;
|
|
53
|
+
createClusterIfNotExists(clusterName: string, region?: string): Promise<void>;
|
|
54
|
+
assertClusterHealthyStatusWithRetry(name: string, visibilityTimeout?: number, totalTimeout?: number): Promise<void>;
|
|
55
|
+
clickAlphaTab(): Promise<void>;
|
|
56
|
+
clickDevTab(): Promise<void>;
|
|
57
|
+
clickStableTab(): Promise<void>;
|
|
58
|
+
clickQAGenerationsTab(): Promise<void>;
|
|
59
|
+
selectSubRegion(region: string): Promise<void>;
|
|
60
|
+
clickGCPRegion(): Promise<void>;
|
|
61
|
+
clickTasklistV1Api(): Promise<void>;
|
|
62
|
+
}
|
|
63
|
+
export { ClusterPage };
|