@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.
Files changed (120) hide show
  1. package/README.md +1 -0
  2. package/dist/fixtures/8.10.d.ts +75 -0
  3. package/dist/fixtures/8.10.js +187 -0
  4. package/dist/pages/8.10/AppsPage.d.ts +38 -0
  5. package/dist/pages/8.10/AppsPage.js +398 -0
  6. package/dist/pages/8.10/Authorization.d.ts +31 -0
  7. package/dist/pages/8.10/Authorization.js +143 -0
  8. package/dist/pages/8.10/ClientCredentialsDetailsPage.d.ts +12 -0
  9. package/dist/pages/8.10/ClientCredentialsDetailsPage.js +36 -0
  10. package/dist/pages/8.10/ClusterDetailsPage.d.ts +81 -0
  11. package/dist/pages/8.10/ClusterDetailsPage.js +475 -0
  12. package/dist/pages/8.10/ClusterPage.d.ts +63 -0
  13. package/dist/pages/8.10/ClusterPage.js +349 -0
  14. package/dist/pages/8.10/ClusterSecretsPage.d.ts +46 -0
  15. package/dist/pages/8.10/ClusterSecretsPage.js +219 -0
  16. package/dist/pages/8.10/ConnectorMarketplacePage.d.ts +19 -0
  17. package/dist/pages/8.10/ConnectorMarketplacePage.js +56 -0
  18. package/dist/pages/8.10/ConnectorSettingsPage.d.ts +38 -0
  19. package/dist/pages/8.10/ConnectorSettingsPage.js +142 -0
  20. package/dist/pages/8.10/ConnectorTemplatePage.d.ts +11 -0
  21. package/dist/pages/8.10/ConnectorTemplatePage.js +34 -0
  22. package/dist/pages/8.10/ConsoleOrganizationPage.d.ts +76 -0
  23. package/dist/pages/8.10/ConsoleOrganizationPage.js +402 -0
  24. package/dist/pages/8.10/FormJsPage.d.ts +28 -0
  25. package/dist/pages/8.10/FormJsPage.js +85 -0
  26. package/dist/pages/8.10/HomePage.d.ts +27 -0
  27. package/dist/pages/8.10/HomePage.js +88 -0
  28. package/dist/pages/8.10/IdpCreatePage.d.ts +81 -0
  29. package/dist/pages/8.10/IdpCreatePage.js +355 -0
  30. package/dist/pages/8.10/LoginPage.d.ts +42 -0
  31. package/dist/pages/8.10/LoginPage.js +93 -0
  32. package/dist/pages/8.10/ModelerCreatePage.d.ts +224 -0
  33. package/dist/pages/8.10/ModelerCreatePage.js +1166 -0
  34. package/dist/pages/8.10/ModelerHomePage.d.ts +54 -0
  35. package/dist/pages/8.10/ModelerHomePage.js +235 -0
  36. package/dist/pages/8.10/ModelerUserInvitePage.d.ts +29 -0
  37. package/dist/pages/8.10/ModelerUserInvitePage.js +136 -0
  38. package/dist/pages/8.10/OCIdentityAuthorizationsPage.d.ts +11 -0
  39. package/dist/pages/8.10/OCIdentityAuthorizationsPage.js +32 -0
  40. package/dist/pages/8.10/OCIdentityGroupsPage.d.ts +38 -0
  41. package/dist/pages/8.10/OCIdentityGroupsPage.js +166 -0
  42. package/dist/pages/8.10/OCIdentityHomePage.d.ts +18 -0
  43. package/dist/pages/8.10/OCIdentityHomePage.js +57 -0
  44. package/dist/pages/8.10/OCIdentityMappingRulesPage.d.ts +23 -0
  45. package/dist/pages/8.10/OCIdentityMappingRulesPage.js +124 -0
  46. package/dist/pages/8.10/OCIdentityRolesPage.d.ts +40 -0
  47. package/dist/pages/8.10/OCIdentityRolesPage.js +182 -0
  48. package/dist/pages/8.10/OperateHomePage.d.ts +23 -0
  49. package/dist/pages/8.10/OperateHomePage.js +73 -0
  50. package/dist/pages/8.10/OperateProcessInstancePage.d.ts +23 -0
  51. package/dist/pages/8.10/OperateProcessInstancePage.js +94 -0
  52. package/dist/pages/8.10/OperateProcessesPage.d.ts +25 -0
  53. package/dist/pages/8.10/OperateProcessesPage.js +103 -0
  54. package/dist/pages/8.10/OptimizeCollectionsPage.d.ts +17 -0
  55. package/dist/pages/8.10/OptimizeCollectionsPage.js +68 -0
  56. package/dist/pages/8.10/OptimizeDashboardPage.d.ts +11 -0
  57. package/dist/pages/8.10/OptimizeDashboardPage.js +65 -0
  58. package/dist/pages/8.10/OptimizeHomePage.d.ts +13 -0
  59. package/dist/pages/8.10/OptimizeHomePage.js +55 -0
  60. package/dist/pages/8.10/OptimizeReportPage.d.ts +48 -0
  61. package/dist/pages/8.10/OptimizeReportPage.js +159 -0
  62. package/dist/pages/8.10/PlayPage.d.ts +14 -0
  63. package/dist/pages/8.10/PlayPage.js +68 -0
  64. package/dist/pages/8.10/SettingsPage.d.ts +10 -0
  65. package/dist/pages/8.10/SettingsPage.js +43 -0
  66. package/dist/pages/8.10/SignUpPage.d.ts +42 -0
  67. package/dist/pages/8.10/SignUpPage.js +134 -0
  68. package/dist/pages/8.10/TaskDetailsPage.d.ts +75 -0
  69. package/dist/pages/8.10/TaskDetailsPage.js +269 -0
  70. package/dist/pages/8.10/TaskPanelPage.d.ts +21 -0
  71. package/dist/pages/8.10/TaskPanelPage.js +93 -0
  72. package/dist/pages/8.10/TaskProcessesPage.d.ts +13 -0
  73. package/dist/pages/8.10/TaskProcessesPage.js +68 -0
  74. package/dist/pages/8.10/UtilitiesPage.d.ts +47 -0
  75. package/dist/pages/8.10/UtilitiesPage.js +489 -0
  76. package/dist/tests/8.10/access-user-role-management.spec.d.ts +1 -0
  77. package/dist/tests/8.10/access-user-role-management.spec.js +323 -0
  78. package/dist/tests/8.10/agentic-ai-user-flows.spec.d.ts +1 -0
  79. package/dist/tests/8.10/agentic-ai-user-flows.spec.js +185 -0
  80. package/dist/tests/8.10/api-tests-v2.spec.d.ts +1 -0
  81. package/dist/tests/8.10/api-tests-v2.spec.js +20 -0
  82. package/dist/tests/8.10/aws-cluster-user-flows.spec.d.ts +1 -0
  83. package/dist/tests/8.10/aws-cluster-user-flows.spec.js +178 -0
  84. package/dist/tests/8.10/cluster-variables.spec.d.ts +1 -0
  85. package/dist/tests/8.10/cluster-variables.spec.js +70 -0
  86. package/dist/tests/8.10/connectors-user-flows.spec.d.ts +1 -0
  87. package/dist/tests/8.10/connectors-user-flows.spec.js +479 -0
  88. package/dist/tests/8.10/console-user-flows.spec.d.ts +1 -0
  89. package/dist/tests/8.10/console-user-flows.spec.js +187 -0
  90. package/dist/tests/8.10/hto-user-flows.spec.d.ts +1 -0
  91. package/dist/tests/8.10/hto-user-flows.spec.js +471 -0
  92. package/dist/tests/8.10/idp-user-flows.spec.d.ts +1 -0
  93. package/dist/tests/8.10/idp-user-flows.spec.js +214 -0
  94. package/dist/tests/8.10/login-negative-tests.spec.d.ts +1 -0
  95. package/dist/tests/8.10/login-negative-tests.spec.js +29 -0
  96. package/dist/tests/8.10/login.spec.d.ts +1 -0
  97. package/dist/tests/8.10/login.spec.js +26 -0
  98. package/dist/tests/8.10/navigation.spec.d.ts +1 -0
  99. package/dist/tests/8.10/navigation.spec.js +65 -0
  100. package/dist/tests/8.10/operate-access-flow.spec.d.ts +1 -0
  101. package/dist/tests/8.10/operate-access-flow.spec.js +51 -0
  102. package/dist/tests/8.10/optimize-api-tests.spec.d.ts +1 -0
  103. package/dist/tests/8.10/optimize-api-tests.spec.js +268 -0
  104. package/dist/tests/8.10/optimize-user-flows.spec.d.ts +1 -0
  105. package/dist/tests/8.10/optimize-user-flows.spec.js +255 -0
  106. package/dist/tests/8.10/play.spec.d.ts +1 -0
  107. package/dist/tests/8.10/play.spec.js +85 -0
  108. package/dist/tests/8.10/rba-enabled-v1-user-flows.spec.d.ts +1 -0
  109. package/dist/tests/8.10/rba-enabled-v1-user-flows.spec.js +443 -0
  110. package/dist/tests/8.10/rba-enabled-v2-user-flows.spec.d.ts +1 -0
  111. package/dist/tests/8.10/rba-enabled-v2-user-flows.spec.js +446 -0
  112. package/dist/tests/8.10/smoke-tests.spec.d.ts +1 -0
  113. package/dist/tests/8.10/smoke-tests.spec.js +181 -0
  114. package/dist/tests/8.10/test-setup.spec.d.ts +1 -0
  115. package/dist/tests/8.10/test-setup.spec.js +94 -0
  116. package/dist/tests/8.10/utr-enabled-user-flows.spec.d.ts +1 -0
  117. package/dist/tests/8.10/utr-enabled-user-flows.spec.js +182 -0
  118. package/dist/tests/8.10/web-modeler-user-flows.spec.d.ts +1 -0
  119. package/dist/tests/8.10/web-modeler-user-flows.spec.js +544 -0
  120. package/package.json +1 -1
@@ -0,0 +1,54 @@
1
+ import { Page, Locator } from '@playwright/test';
2
+ declare class ModelerHomePage {
3
+ private defaultFolderName;
4
+ private page;
5
+ readonly modelerPageBanner: Locator;
6
+ readonly createNewProjectButton: Locator;
7
+ readonly projectNameInput: Locator;
8
+ readonly formNameInput: Locator;
9
+ readonly chooseBpmnTemplateButton: Locator;
10
+ readonly diagramTypeDropdown: Locator;
11
+ readonly bpmnTemplateOption: Locator;
12
+ readonly formTemplateOption: Locator;
13
+ readonly projectBreadcrumb: Locator;
14
+ readonly openOrganizationsButton: Locator;
15
+ readonly manageButton: Locator;
16
+ readonly crossComponentProjectFolder: Locator;
17
+ readonly homeBreadcrumb: Locator;
18
+ readonly rows: Locator;
19
+ readonly uploadFilesButton: Locator;
20
+ readonly messageBanner: Locator;
21
+ readonly idpTemplateOption: Locator;
22
+ readonly idpApplicationNameInput: Locator;
23
+ readonly createIdpApplicationButton: Locator;
24
+ readonly dialog: Locator;
25
+ readonly closeButton: Locator;
26
+ readonly optionsButton: Locator;
27
+ readonly formNameBreadcrumb: (formName: string) => Locator;
28
+ constructor(page: Page);
29
+ clickCreateNewProjectButton(): Promise<void>;
30
+ enterNewProjectName(name: string): Promise<void>;
31
+ enterIdpApplicationName(name: string): Promise<void>;
32
+ clickChooseBpmnTemplateButton(): Promise<void>;
33
+ reload(): Promise<void>;
34
+ getProjectNames(name: string): Promise<string[]>;
35
+ clickProcessDiagram(name: string): Promise<void>;
36
+ clickDiagramTypeDropdown(): Promise<void>;
37
+ clickBpmnTemplateOption(): Promise<void>;
38
+ clickFormOption(): Promise<void>;
39
+ enterFormName(name: string): Promise<void>;
40
+ clickProjectBreadcrumb(): Promise<void>;
41
+ clickHomeBreadcrumb(): Promise<void>;
42
+ clickOpenOrganizationsButton(): Promise<void>;
43
+ createForm(formName: string): Promise<void>;
44
+ clickCreateIdpApplicationButton(): Promise<void>;
45
+ clickCrossComponentProjectFolder(): Promise<void>;
46
+ createCrossComponentProjectFolder(): Promise<void>;
47
+ clickManageButton(retries?: number): Promise<void>;
48
+ clickUploadFilesButton(): Promise<void>;
49
+ clickMessageBanner(): Promise<void>;
50
+ selectCluster(clusterName: string): Promise<void>;
51
+ clickIdpApplicationTemplateOption(): Promise<void>;
52
+ assertFormBreadcrumbVisible(formName: string): Promise<void>;
53
+ }
54
+ export { ModelerHomePage };
@@ -0,0 +1,235 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ModelerHomePage = 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
+ class ModelerHomePage {
8
+ defaultFolderName = 'Cross Component Test Project';
9
+ page;
10
+ modelerPageBanner;
11
+ createNewProjectButton;
12
+ projectNameInput;
13
+ formNameInput;
14
+ chooseBpmnTemplateButton;
15
+ diagramTypeDropdown;
16
+ bpmnTemplateOption;
17
+ formTemplateOption;
18
+ projectBreadcrumb;
19
+ openOrganizationsButton;
20
+ manageButton;
21
+ crossComponentProjectFolder;
22
+ homeBreadcrumb;
23
+ rows;
24
+ uploadFilesButton;
25
+ messageBanner;
26
+ idpTemplateOption;
27
+ idpApplicationNameInput;
28
+ createIdpApplicationButton;
29
+ dialog;
30
+ closeButton;
31
+ optionsButton;
32
+ formNameBreadcrumb;
33
+ constructor(page) {
34
+ this.page = page;
35
+ this.modelerPageBanner = page.getByRole('banner', {
36
+ name: 'Camunda Modeler',
37
+ });
38
+ this.createNewProjectButton = page.getByRole('button', {
39
+ name: 'New project',
40
+ });
41
+ this.projectNameInput = page.locator('[data-test="editable-input"]');
42
+ this.formNameInput = page.locator('[data-test="editable-input"]');
43
+ this.idpApplicationNameInput = page.getByPlaceholder('New IDP Application');
44
+ this.createIdpApplicationButton = page.getByRole('button', {
45
+ name: 'Create',
46
+ exact: true,
47
+ });
48
+ this.chooseBpmnTemplateButton = page.getByRole('button', {
49
+ name: 'Choose BPMN template',
50
+ });
51
+ this.idpTemplateOption = page
52
+ .locator('[data-test="create-idp-application"]')
53
+ .getByText('IDP Application');
54
+ this.diagramTypeDropdown = page.locator('[data-test="diagram-dropdown"]');
55
+ this.bpmnTemplateOption = page
56
+ .locator('[data-test="create-bpmn-diagram"]')
57
+ .getByText('BPMN Diagram');
58
+ this.formTemplateOption = page
59
+ .locator('[data-test="create-form"]')
60
+ .getByText('Form');
61
+ this.projectBreadcrumb = page.locator('[data-test="breadcrumb-project"]');
62
+ this.homeBreadcrumb = page.locator('[data-test="breadcrumb-home"]');
63
+ this.openOrganizationsButton = page.getByLabel('Open Organizations');
64
+ this.manageButton = page.getByRole('menuitem', { name: 'Manage' });
65
+ this.crossComponentProjectFolder = page.getByTitle(this.defaultFolderName, {
66
+ exact: true,
67
+ });
68
+ this.rows = page.getByRole('row');
69
+ this.uploadFilesButton = page.getByRole('menuitem', { name: 'Upload files' });
70
+ this.messageBanner = page.locator('[data-test="close-top-banner"]');
71
+ this.dialog = page.getByRole('dialog');
72
+ this.closeButton = page.getByRole('button', { name: 'Got it - Dismiss' });
73
+ this.optionsButton = page.getByRole('button', { name: 'Options' });
74
+ this.formNameBreadcrumb = (formName) => page.locator('button[data-test="breadcrumb-form"]', {
75
+ hasText: formName,
76
+ });
77
+ }
78
+ async clickCreateNewProjectButton() {
79
+ await (0, test_1.expect)(this.createNewProjectButton).toBeVisible({ timeout: 60000 });
80
+ await (0, test_1.expect)(this.createNewProjectButton).toBeEnabled({ timeout: 60000 });
81
+ await this.createNewProjectButton.click({ timeout: 90000 });
82
+ }
83
+ async enterNewProjectName(name) {
84
+ await this.projectNameInput.click({ timeout: 60000 });
85
+ await this.projectNameInput.fill(name);
86
+ await this.projectNameInput.press('Enter');
87
+ }
88
+ async enterIdpApplicationName(name) {
89
+ await this.idpApplicationNameInput.click({ timeout: 60000 });
90
+ await this.idpApplicationNameInput.fill(name);
91
+ }
92
+ async clickChooseBpmnTemplateButton() {
93
+ await this.chooseBpmnTemplateButton.click();
94
+ }
95
+ async reload() {
96
+ await this.page.reload();
97
+ }
98
+ async getProjectNames(name) {
99
+ return this.rows
100
+ .filter({ hasText: name })
101
+ .getByTitle(name)
102
+ .evaluateAll((elements) => elements
103
+ .map((el) => el.textContent || '')
104
+ .filter((text) => text !== ''));
105
+ }
106
+ async clickProcessDiagram(name) {
107
+ const process = this.rows.filter({ hasText: name }).getByTitle(name).first();
108
+ await (0, test_1.expect)(process).toBeVisible({ timeout: 90000 });
109
+ await process.click();
110
+ }
111
+ async clickDiagramTypeDropdown() {
112
+ await (0, test_1.expect)(this.diagramTypeDropdown).toBeVisible({
113
+ timeout: 15000,
114
+ });
115
+ await this.diagramTypeDropdown.click();
116
+ }
117
+ async clickBpmnTemplateOption() {
118
+ await (0, test_1.expect)(this.bpmnTemplateOption).toBeVisible({
119
+ timeout: 15000,
120
+ });
121
+ await this.bpmnTemplateOption.click();
122
+ }
123
+ async clickFormOption() {
124
+ await this.formTemplateOption.click();
125
+ }
126
+ async enterFormName(name) {
127
+ await this.formNameInput.click({ timeout: 60000 });
128
+ await this.formNameInput.fill(name);
129
+ await this.formNameInput.press('Enter');
130
+ }
131
+ async clickProjectBreadcrumb() {
132
+ await this.projectBreadcrumb.click({ timeout: 60000 });
133
+ }
134
+ async clickHomeBreadcrumb() {
135
+ try {
136
+ await this.homeBreadcrumb.click();
137
+ }
138
+ catch (error) {
139
+ await this.page.getByText('Home', { exact: true }).first().click();
140
+ }
141
+ }
142
+ async clickOpenOrganizationsButton() {
143
+ await (0, sleep_1.sleep)(5000);
144
+ await (0, test_1.expect)(this.openOrganizationsButton).toBeVisible({
145
+ timeout: 10000,
146
+ });
147
+ await this.openOrganizationsButton.click({ timeout: 30000 });
148
+ }
149
+ async createForm(formName) {
150
+ await this.clickDiagramTypeDropdown();
151
+ await this.clickFormOption();
152
+ await this.enterFormName(formName);
153
+ await (0, sleep_1.sleep)(10000);
154
+ }
155
+ async clickCreateIdpApplicationButton() {
156
+ await this.createIdpApplicationButton.click();
157
+ }
158
+ async clickCrossComponentProjectFolder() {
159
+ await (0, clickLocatorWithRetry_1.clickLocatorWithRetry)(this.page, this.crossComponentProjectFolder, {
160
+ preAction: async () => {
161
+ await this.clickMessageBanner();
162
+ },
163
+ });
164
+ }
165
+ async createCrossComponentProjectFolder() {
166
+ await (0, sleep_1.sleep)(15000);
167
+ await this.clickMessageBanner();
168
+ if (await this.crossComponentProjectFolder.isVisible()) {
169
+ console.log('Cross Component Project folder already exists. Clicking into it');
170
+ await this.clickCrossComponentProjectFolder();
171
+ return;
172
+ }
173
+ await this.clickCreateNewProjectButton();
174
+ await this.enterNewProjectName(this.defaultFolderName);
175
+ }
176
+ async clickManageButton(retries = 3) {
177
+ await this.optionsButton.click({ timeout: 30000 });
178
+ for (let i = 0; i < retries; i++) {
179
+ try {
180
+ await (0, sleep_1.sleep)(5000);
181
+ if (await this.manageButton.isVisible({ timeout: 30000 })) {
182
+ await this.manageButton.click({ timeout: 10000 });
183
+ }
184
+ else {
185
+ await this.clickOpenOrganizationsButton();
186
+ await this.optionsButton.click({ timeout: 30000 });
187
+ await (0, test_1.expect)(this.manageButton).toBeVisible({ timeout: 30000 });
188
+ await this.manageButton.click({ timeout: 30000 });
189
+ }
190
+ return;
191
+ }
192
+ catch (error) {
193
+ await (0, sleep_1.sleep)(10000);
194
+ }
195
+ }
196
+ throw new Error(`Failed to click manage button after ${retries} retries`);
197
+ }
198
+ async clickUploadFilesButton() {
199
+ await this.uploadFilesButton.click({ timeout: 60000 });
200
+ }
201
+ async clickMessageBanner() {
202
+ try {
203
+ const button = this.messageBanner.or(this.closeButton).first();
204
+ await (0, test_1.expect)(button).toBeVisible({ timeout: 15000 });
205
+ await button.click();
206
+ }
207
+ catch {
208
+ console.log('No banner or close button found to click');
209
+ }
210
+ }
211
+ async selectCluster(clusterName) {
212
+ //Select the correct cluster if multiple exist
213
+ const baseClusterName = clusterName.split('(')[0].trim();
214
+ const cluster = this.dialog.getByText(baseClusterName, { exact: false });
215
+ await (0, test_1.expect)(cluster).toBeVisible({
216
+ timeout: 30000,
217
+ });
218
+ await cluster.click();
219
+ await (0, test_1.expect)(this.dialog
220
+ .locator('label')
221
+ .filter({
222
+ hasText: clusterName,
223
+ })
224
+ .getByRole('switch')).toBeChecked({ timeout: 30000 });
225
+ }
226
+ async clickIdpApplicationTemplateOption() {
227
+ await this.idpTemplateOption.click({ timeout: 120000 });
228
+ }
229
+ async assertFormBreadcrumbVisible(formName) {
230
+ await (0, test_1.expect)(this.formNameBreadcrumb(formName)).toBeVisible({
231
+ timeout: 120000,
232
+ });
233
+ }
234
+ }
235
+ exports.ModelerHomePage = ModelerHomePage;
@@ -0,0 +1,29 @@
1
+ import { Page, Locator } from '@playwright/test';
2
+ declare class ModelerUserInvitePage {
3
+ private page;
4
+ readonly buttonAddUser: Locator;
5
+ readonly inputFieldUserEmailAddress: Locator;
6
+ readonly buttonSendInvitation: Locator;
7
+ readonly pendingInviteText: Locator;
8
+ readonly settings: Locator;
9
+ readonly logout: Locator;
10
+ readonly buttonSkipCustomization: Locator;
11
+ readonly buttonCloseHelpCentre: Locator;
12
+ readonly collaboratorName: Locator;
13
+ readonly inviteModal: Locator;
14
+ readonly collaboratorEmail: (email: string) => Locator;
15
+ constructor(page: Page);
16
+ clickAddUser(): Promise<void>;
17
+ clickUserEmailInput(): Promise<void>;
18
+ fillUserEmailInput(emailAddress: string): Promise<void>;
19
+ clickSendInviteButton(): Promise<void>;
20
+ checkPendingInviteText(email: string): Promise<void>;
21
+ inviteNewUser(email: string): Promise<void>;
22
+ fillNewUserWithRetry(email: string): Promise<void>;
23
+ clickSettings(): Promise<void>;
24
+ clickLogout(): Promise<void>;
25
+ clickSkipCustomization(): Promise<void>;
26
+ clickCloseHelpCenter(): Promise<void>;
27
+ verifyCollaboratorName(): Promise<void>;
28
+ }
29
+ export { ModelerUserInvitePage };
@@ -0,0 +1,136 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ModelerUserInvitePage = void 0;
4
+ const test_1 = require("@playwright/test");
5
+ const sleep_1 = require("../../utils/sleep");
6
+ class ModelerUserInvitePage {
7
+ page;
8
+ buttonAddUser;
9
+ inputFieldUserEmailAddress;
10
+ buttonSendInvitation;
11
+ pendingInviteText;
12
+ settings;
13
+ logout;
14
+ buttonSkipCustomization;
15
+ buttonCloseHelpCentre;
16
+ collaboratorName;
17
+ inviteModal;
18
+ collaboratorEmail;
19
+ constructor(page) {
20
+ this.page = page;
21
+ this.buttonAddUser = page.locator('[data-test="add-collaborator"]');
22
+ this.inputFieldUserEmailAddress = page.locator('[data-test="multi-select-input"]');
23
+ this.buttonSendInvitation = page.locator('[data-test="invite-email-button"]');
24
+ this.pendingInviteText = page.getByText('pending').first();
25
+ this.settings = page.getByLabel('Open Settings');
26
+ this.logout = page.getByRole('button', { name: 'Log out' });
27
+ this.buttonSkipCustomization = page.getByRole('button', {
28
+ name: 'Skip customization',
29
+ });
30
+ this.buttonCloseHelpCentre = page.getByRole('button', { name: 'Close' });
31
+ this.collaboratorName = page.getByText('QA Camunda');
32
+ this.collaboratorEmail = (email) => this.page.locator('[data-test="chip"]').filter({ hasText: `${email}` });
33
+ this.inviteModal = this.page.locator('text="Invite collaborators to"');
34
+ }
35
+ async clickAddUser() {
36
+ if (await this.inviteModal.isVisible({ timeout: 2000 })) {
37
+ console.log('Invite modal already open, skipping Add user click');
38
+ return;
39
+ }
40
+ await (0, test_1.expect)(this.buttonAddUser).toBeVisible({ timeout: 60000 });
41
+ try {
42
+ await this.buttonAddUser.click({ timeout: 10000 });
43
+ }
44
+ catch (error) {
45
+ console.log('Regular click failed, trying force click');
46
+ await this.buttonAddUser.click({ force: true });
47
+ }
48
+ }
49
+ async clickUserEmailInput() {
50
+ await (0, test_1.expect)(this.inputFieldUserEmailAddress).toBeVisible({
51
+ timeout: 60000,
52
+ });
53
+ await this.inputFieldUserEmailAddress.click();
54
+ }
55
+ async fillUserEmailInput(emailAddress) {
56
+ await this.inputFieldUserEmailAddress.fill(emailAddress);
57
+ await (0, test_1.expect)(this.inputFieldUserEmailAddress).toHaveValue(emailAddress);
58
+ await this.inputFieldUserEmailAddress.press('Enter');
59
+ }
60
+ async clickSendInviteButton() {
61
+ await (0, test_1.expect)(this.buttonSendInvitation).toBeVisible({ timeout: 60000 });
62
+ await this.buttonSendInvitation.click();
63
+ }
64
+ async checkPendingInviteText(email) {
65
+ const maxRetries = 4;
66
+ for (let attempt = 0; attempt < maxRetries; attempt++) {
67
+ try {
68
+ await (0, test_1.expect)(this.page.getByRole('row').filter({ hasText: `${email}` })).toContainText('pending', {
69
+ timeout: 30000,
70
+ });
71
+ return;
72
+ }
73
+ catch (error) {
74
+ if (attempt === 0) {
75
+ await this.page.reload();
76
+ await (0, sleep_1.sleep)(20000);
77
+ }
78
+ else if (attempt === 1 || attempt === 2) {
79
+ await this.inviteNewUser(email);
80
+ }
81
+ else {
82
+ console.error(error);
83
+ throw new Error(`Inviting a user failed after ${maxRetries} attempts`);
84
+ }
85
+ }
86
+ }
87
+ }
88
+ async inviteNewUser(email) {
89
+ await this.clickAddUser();
90
+ await this.clickUserEmailInput();
91
+ await this.fillUserEmailInput(email);
92
+ await (0, sleep_1.sleep)(8000);
93
+ await this.clickSendInviteButton();
94
+ }
95
+ async fillNewUserWithRetry(email) {
96
+ const maxRetries = 3;
97
+ for (let attempt = 1; attempt <= maxRetries; attempt++) {
98
+ try {
99
+ await this.clickUserEmailInput();
100
+ await this.fillUserEmailInput(email);
101
+ await (0, test_1.expect)(this.collaboratorEmail(email).first()).toBeVisible({
102
+ timeout: 20000,
103
+ });
104
+ return;
105
+ }
106
+ catch (error) {
107
+ console.log(`Attempt ${attempt}: Error filling email input:${email}`, error);
108
+ }
109
+ if (attempt < maxRetries) {
110
+ await this.inputFieldUserEmailAddress.clear();
111
+ await (0, sleep_1.sleep)(1000);
112
+ }
113
+ }
114
+ throw new Error(`Failed to filling email input:${email} after ${maxRetries} attempts`);
115
+ }
116
+ async clickSettings() {
117
+ await (0, test_1.expect)(this.settings).toBeVisible({ timeout: 60000 });
118
+ await this.settings.click({ timeout: 90000 });
119
+ }
120
+ async clickLogout() {
121
+ await (0, test_1.expect)(this.logout).toBeVisible({ timeout: 60000 });
122
+ await this.logout.click({ timeout: 50000 });
123
+ }
124
+ async clickSkipCustomization() {
125
+ await (0, test_1.expect)(this.buttonSkipCustomization).toBeVisible({ timeout: 60000 });
126
+ await this.buttonSkipCustomization.click();
127
+ }
128
+ async clickCloseHelpCenter() {
129
+ await (0, test_1.expect)(this.buttonCloseHelpCentre).toBeVisible({ timeout: 60000 });
130
+ await this.buttonCloseHelpCentre.click();
131
+ }
132
+ async verifyCollaboratorName() {
133
+ await (0, test_1.expect)(this.collaboratorName).toBeVisible({ timeout: 60000 });
134
+ }
135
+ }
136
+ exports.ModelerUserInvitePage = ModelerUserInvitePage;
@@ -0,0 +1,11 @@
1
+ import { Authorization } from '../8.10/Authorization';
2
+ import { Page } from '@playwright/test';
3
+ declare class OCIdentityAuthorizationsPage extends Authorization {
4
+ constructor(page: Page);
5
+ clickProcessDefinitionTab(): Promise<void>;
6
+ clickAuthorizationTab(): Promise<void>;
7
+ clickRoleTab(): Promise<void>;
8
+ clickComponentTab(): Promise<void>;
9
+ clickResourceTab(): Promise<void>;
10
+ }
11
+ export { OCIdentityAuthorizationsPage };
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.OCIdentityAuthorizationsPage = void 0;
4
+ const Authorization_1 = require("../8.10/Authorization");
5
+ const test_1 = require("@playwright/test");
6
+ const expectLocatorWithRetry_1 = require("../../utils/assertionHelpers/expectLocatorWithRetry");
7
+ class OCIdentityAuthorizationsPage extends Authorization_1.Authorization {
8
+ constructor(page) {
9
+ super(page);
10
+ }
11
+ async clickProcessDefinitionTab() {
12
+ await (0, expectLocatorWithRetry_1.expectLocatorWithRetry)(this.page, this.selectResourceTypeTab('PROCESS_DEFINITION'));
13
+ await this.selectResourceTypeTab('PROCESS_DEFINITION').click();
14
+ }
15
+ async clickAuthorizationTab() {
16
+ await (0, expectLocatorWithRetry_1.expectLocatorWithRetry)(this.page, this.selectResourceTypeTab('AUTHORIZATION'));
17
+ await this.selectResourceTypeTab('AUTHORIZATION').click();
18
+ }
19
+ async clickRoleTab() {
20
+ await (0, test_1.expect)(this.selectResourceTypeTab('Role')).toBeVisible();
21
+ await this.selectResourceTypeTab('Role').click();
22
+ }
23
+ async clickComponentTab() {
24
+ await (0, test_1.expect)(this.selectResourceTypeTab('COMPONENT')).toBeVisible();
25
+ await this.selectResourceTypeTab('COMPONENT').click();
26
+ }
27
+ async clickResourceTab() {
28
+ await (0, test_1.expect)(this.selectResourceTypeTab('RESOURCE')).toBeVisible();
29
+ await this.selectResourceTypeTab('RESOURCE').click();
30
+ }
31
+ }
32
+ exports.OCIdentityAuthorizationsPage = OCIdentityAuthorizationsPage;
@@ -0,0 +1,38 @@
1
+ import { Page, Locator } from '@playwright/test';
2
+ export declare class OCIdentityGroupsPage {
3
+ private page;
4
+ readonly groupsList: Locator;
5
+ readonly createGroupButton: Locator;
6
+ readonly editGroupButton: (rowName?: string) => Locator;
7
+ readonly deleteGroupButton: (rowName?: string) => Locator;
8
+ readonly createGroupModal: Locator;
9
+ readonly closeCreateGroupModal: Locator;
10
+ readonly createGroupIdField: Locator;
11
+ readonly createNameField: Locator;
12
+ readonly createDescriptionField: Locator;
13
+ readonly createGroupModalCancelButton: Locator;
14
+ readonly createGroupModalCreateButton: Locator;
15
+ readonly editGroupModal: Locator;
16
+ readonly closeEditGroupModal: Locator;
17
+ readonly editNameField: Locator;
18
+ readonly editDescriptionField: Locator;
19
+ readonly editGroupModalCancelButton: Locator;
20
+ readonly editGroupModalUpdateButton: Locator;
21
+ readonly deleteGroupModal: Locator;
22
+ readonly closeDeleteGroupModal: Locator;
23
+ readonly deleteGroupModalCancelButton: Locator;
24
+ readonly deleteGroupModalDeleteButton: Locator;
25
+ readonly emptyState: Locator;
26
+ readonly assignUserButton: Locator;
27
+ readonly searchBox: Locator;
28
+ readonly assignUserButtonModal: Locator;
29
+ readonly selectGroupRow: (name: string) => Locator;
30
+ readonly groupCell: (name: string) => Locator;
31
+ constructor(page: Page);
32
+ createGroup(groupId: string, groupName: string, description?: string): Promise<void>;
33
+ editGroup(currentName: string, newName: string, newDescription?: string): Promise<void>;
34
+ deleteGroup(groupName: string): Promise<void>;
35
+ assertGroupExists(groupName: string): Promise<void>;
36
+ clickGroupId(groupName: string): Promise<void>;
37
+ assignUserToGroup(userName: string): Promise<void>;
38
+ }