@camunda/e2e-test-suite 0.0.1443 → 0.0.1445

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 (122) hide show
  1. package/.github/c8_versions.json +1 -0
  2. package/README.md +2 -0
  3. package/dist/fixtures/SM-8.11.d.ts +77 -0
  4. package/dist/fixtures/SM-8.11.js +176 -0
  5. package/dist/pages/SM-8.11/Authorization.d.ts +39 -0
  6. package/dist/pages/SM-8.11/Authorization.js +349 -0
  7. package/dist/pages/SM-8.11/ClusterDetailsPage.d.ts +8 -0
  8. package/dist/pages/SM-8.11/ClusterDetailsPage.js +65 -0
  9. package/dist/pages/SM-8.11/ClusterPage.d.ts +11 -0
  10. package/dist/pages/SM-8.11/ClusterPage.js +37 -0
  11. package/dist/pages/SM-8.11/ConnectorMarketplacePage.d.ts +27 -0
  12. package/dist/pages/SM-8.11/ConnectorMarketplacePage.js +187 -0
  13. package/dist/pages/SM-8.11/ConnectorSettingsPage.d.ts +41 -0
  14. package/dist/pages/SM-8.11/ConnectorSettingsPage.js +153 -0
  15. package/dist/pages/SM-8.11/ConnectorTemplatePage.d.ts +11 -0
  16. package/dist/pages/SM-8.11/ConnectorTemplatePage.js +34 -0
  17. package/dist/pages/SM-8.11/FormJsPage.d.ts +33 -0
  18. package/dist/pages/SM-8.11/FormJsPage.js +109 -0
  19. package/dist/pages/SM-8.11/HomePage.d.ts +20 -0
  20. package/dist/pages/SM-8.11/HomePage.js +49 -0
  21. package/dist/pages/SM-8.11/IdentityTenantPage.d.ts +53 -0
  22. package/dist/pages/SM-8.11/IdentityTenantPage.js +264 -0
  23. package/dist/pages/SM-8.11/IdentityUsersPage.d.ts +92 -0
  24. package/dist/pages/SM-8.11/IdentityUsersPage.js +485 -0
  25. package/dist/pages/SM-8.11/KeycloakAdminPage.d.ts +17 -0
  26. package/dist/pages/SM-8.11/KeycloakAdminPage.js +78 -0
  27. package/dist/pages/SM-8.11/KeycloakLoginPage.d.ts +12 -0
  28. package/dist/pages/SM-8.11/KeycloakLoginPage.js +32 -0
  29. package/dist/pages/SM-8.11/KeycloakUtils.d.ts +17 -0
  30. package/dist/pages/SM-8.11/KeycloakUtils.js +94 -0
  31. package/dist/pages/SM-8.11/LoginPage.d.ts +21 -0
  32. package/dist/pages/SM-8.11/LoginPage.js +112 -0
  33. package/dist/pages/SM-8.11/ManagementIdentityPage.d.ts +44 -0
  34. package/dist/pages/SM-8.11/ManagementIdentityPage.js +176 -0
  35. package/dist/pages/SM-8.11/ModelerCreatePage.d.ts +238 -0
  36. package/dist/pages/SM-8.11/ModelerCreatePage.js +1950 -0
  37. package/dist/pages/SM-8.11/ModelerHomePage.d.ts +97 -0
  38. package/dist/pages/SM-8.11/ModelerHomePage.js +956 -0
  39. package/dist/pages/SM-8.11/NavigationPage.d.ts +58 -0
  40. package/dist/pages/SM-8.11/NavigationPage.js +389 -0
  41. package/dist/pages/SM-8.11/OCIdentityAuthorizationsPage.d.ts +10 -0
  42. package/dist/pages/SM-8.11/OCIdentityAuthorizationsPage.js +22 -0
  43. package/dist/pages/SM-8.11/OCIdentityClusterVariablesPage.d.ts +22 -0
  44. package/dist/pages/SM-8.11/OCIdentityClusterVariablesPage.js +120 -0
  45. package/dist/pages/SM-8.11/OCIdentityGroupsPage.d.ts +39 -0
  46. package/dist/pages/SM-8.11/OCIdentityGroupsPage.js +154 -0
  47. package/dist/pages/SM-8.11/OCIdentityHomePage.d.ts +23 -0
  48. package/dist/pages/SM-8.11/OCIdentityHomePage.js +115 -0
  49. package/dist/pages/SM-8.11/OCIdentityMappingRulesPage.d.ts +23 -0
  50. package/dist/pages/SM-8.11/OCIdentityMappingRulesPage.js +116 -0
  51. package/dist/pages/SM-8.11/OCIdentityRolesPage.d.ts +61 -0
  52. package/dist/pages/SM-8.11/OCIdentityRolesPage.js +433 -0
  53. package/dist/pages/SM-8.11/OCTenantPage.d.ts +73 -0
  54. package/dist/pages/SM-8.11/OCTenantPage.js +399 -0
  55. package/dist/pages/SM-8.11/OperateHomePage.d.ts +26 -0
  56. package/dist/pages/SM-8.11/OperateHomePage.js +139 -0
  57. package/dist/pages/SM-8.11/OperateProcessInstancePage.d.ts +30 -0
  58. package/dist/pages/SM-8.11/OperateProcessInstancePage.js +276 -0
  59. package/dist/pages/SM-8.11/OperateProcessesPage.d.ts +38 -0
  60. package/dist/pages/SM-8.11/OperateProcessesPage.js +383 -0
  61. package/dist/pages/SM-8.11/OptimizeCollectionsPage.d.ts +17 -0
  62. package/dist/pages/SM-8.11/OptimizeCollectionsPage.js +62 -0
  63. package/dist/pages/SM-8.11/OptimizeDashboardPage.d.ts +14 -0
  64. package/dist/pages/SM-8.11/OptimizeDashboardPage.js +63 -0
  65. package/dist/pages/SM-8.11/OptimizeHomePage.d.ts +19 -0
  66. package/dist/pages/SM-8.11/OptimizeHomePage.js +76 -0
  67. package/dist/pages/SM-8.11/OptimizeReportPage.d.ts +50 -0
  68. package/dist/pages/SM-8.11/OptimizeReportPage.js +209 -0
  69. package/dist/pages/SM-8.11/PlayPage.d.ts +47 -0
  70. package/dist/pages/SM-8.11/PlayPage.js +389 -0
  71. package/dist/pages/SM-8.11/ProcessApplicationPage.d.ts +35 -0
  72. package/dist/pages/SM-8.11/ProcessApplicationPage.js +340 -0
  73. package/dist/pages/SM-8.11/SettingsPage.d.ts +12 -0
  74. package/dist/pages/SM-8.11/SettingsPage.js +34 -0
  75. package/dist/pages/SM-8.11/TaskDetailsPage.d.ts +70 -0
  76. package/dist/pages/SM-8.11/TaskDetailsPage.js +273 -0
  77. package/dist/pages/SM-8.11/TaskPanelPage.d.ts +29 -0
  78. package/dist/pages/SM-8.11/TaskPanelPage.js +320 -0
  79. package/dist/pages/SM-8.11/TaskProcessesPage.d.ts +15 -0
  80. package/dist/pages/SM-8.11/TaskProcessesPage.js +77 -0
  81. package/dist/pages/SM-8.11/UtilitiesPage.d.ts +38 -0
  82. package/dist/pages/SM-8.11/UtilitiesPage.js +573 -0
  83. package/dist/pages/SM-8.11/optimizeReportUtils.d.ts +6 -0
  84. package/dist/pages/SM-8.11/optimizeReportUtils.js +77 -0
  85. package/dist/tests/SM-8.11/cluster-management-user-flows.spec.d.ts +1 -0
  86. package/dist/tests/SM-8.11/cluster-management-user-flows.spec.js +48 -0
  87. package/dist/tests/SM-8.11/cluster-variables.spec.d.ts +1 -0
  88. package/dist/tests/SM-8.11/cluster-variables.spec.js +226 -0
  89. package/dist/tests/SM-8.11/connectors-user-flows.spec.d.ts +1 -0
  90. package/dist/tests/SM-8.11/connectors-user-flows.spec.js +307 -0
  91. package/dist/tests/SM-8.11/document-handling-user-flows.spec.d.ts +1 -0
  92. package/dist/tests/SM-8.11/document-handling-user-flows.spec.js +174 -0
  93. package/dist/tests/SM-8.11/hto-user-flows.spec.d.ts +1 -0
  94. package/dist/tests/SM-8.11/hto-user-flows.spec.js +410 -0
  95. package/dist/tests/SM-8.11/hub-web-modeler-smoke.spec.d.ts +1 -0
  96. package/dist/tests/SM-8.11/hub-web-modeler-smoke.spec.js +24 -0
  97. package/dist/tests/SM-8.11/identity-user-flows.spec.d.ts +1 -0
  98. package/dist/tests/SM-8.11/identity-user-flows.spec.js +220 -0
  99. package/dist/tests/SM-8.11/license-key-user-flows.spec.d.ts +1 -0
  100. package/dist/tests/SM-8.11/license-key-user-flows.spec.js +461 -0
  101. package/dist/tests/SM-8.11/login.spec.d.ts +1 -0
  102. package/dist/tests/SM-8.11/login.spec.js +24 -0
  103. package/dist/tests/SM-8.11/migration-path-user-flows.spec.d.ts +1 -0
  104. package/dist/tests/SM-8.11/migration-path-user-flows.spec.js +263 -0
  105. package/dist/tests/SM-8.11/mt-enabled-user-flows.spec.d.ts +1 -0
  106. package/dist/tests/SM-8.11/mt-enabled-user-flows.spec.js +607 -0
  107. package/dist/tests/SM-8.11/optimize-user-flows.spec.d.ts +1 -0
  108. package/dist/tests/SM-8.11/optimize-user-flows.spec.js +505 -0
  109. package/dist/tests/SM-8.11/play.spec.d.ts +1 -0
  110. package/dist/tests/SM-8.11/play.spec.js +144 -0
  111. package/dist/tests/SM-8.11/rba-enabled-user-flows.spec.d.ts +1 -0
  112. package/dist/tests/SM-8.11/rba-enabled-user-flows.spec.js +712 -0
  113. package/dist/tests/SM-8.11/smoke-tests.spec.d.ts +1 -0
  114. package/dist/tests/SM-8.11/smoke-tests.spec.js +167 -0
  115. package/dist/tests/SM-8.11/test-setup.spec.d.ts +1 -0
  116. package/dist/tests/SM-8.11/test-setup.spec.js +24 -0
  117. package/dist/tests/SM-8.11/topology-orchestration-smoke.spec.d.ts +1 -0
  118. package/dist/tests/SM-8.11/topology-orchestration-smoke.spec.js +58 -0
  119. package/dist/tests/SM-8.11/web-modeler-user-flows.spec.d.ts +1 -0
  120. package/dist/tests/SM-8.11/web-modeler-user-flows.spec.js +223 -0
  121. package/package.json +1 -1
  122. package/playwright.config.ts +21 -0
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const SM_8_11_1 = require("../../fixtures/SM-8.11");
4
+ const _setup_1 = require("../../test-setup.js");
5
+ const test_1 = require("@playwright/test");
6
+ SM_8_11_1.test.describe.configure({ mode: 'parallel' });
7
+ SM_8_11_1.test.describe('Cluster Management User Flow Tests', () => {
8
+ // The cluster is configured with tags dev/custom/stage/prod/test, but the
9
+ // Environments/Clusters UI renders recognized lifecycle tags capitalized
10
+ // (Dev/Stage/Prod/Test) while an unrecognized tag like "custom" renders
11
+ // verbatim — assert what's actually displayed.
12
+ const expectedTagLabels = ['Dev', 'custom', 'Stage', 'Prod', 'Test'];
13
+ const customPropertyDescription = 'This is the main integration environment for the Camunda Platform.';
14
+ SM_8_11_1.test.beforeEach(async ({ navigationPage }, testInfo) => {
15
+ await navigationPage.goToClusters((testInfo.workerIndex + 1) * 1000);
16
+ });
17
+ SM_8_11_1.test.afterEach(async ({ page }, testInfo) => {
18
+ await (0, _setup_1.captureScreenshot)(page, testInfo);
19
+ await (0, _setup_1.captureFailureVideo)(page, testInfo);
20
+ });
21
+ (0, SM_8_11_1.test)('Custom Tags', async ({ clusterPage }) => {
22
+ await SM_8_11_1.test.step('Ensure Custom Tags Appear in Cluster List', async () => {
23
+ await clusterPage.assertCustomTagsAreVisible(expectedTagLabels);
24
+ });
25
+ await SM_8_11_1.test.step('Ensure Custom Tags Appear in Cluster Details', async () => {
26
+ await clusterPage.clickClusterLink();
27
+ await clusterPage.assertCustomTagsAreVisible(expectedTagLabels);
28
+ });
29
+ });
30
+ (0, SM_8_11_1.test)('Custom Properties', async ({ clusterPage, clusterDetailsPage, page }) => {
31
+ await SM_8_11_1.test.step('Navigate to Cluster Details', async () => {
32
+ await clusterPage.clickClusterLink();
33
+ });
34
+ await SM_8_11_1.test.step('Ensure Custom Properties Appear in Modeler and Navigates Links', async () => {
35
+ await (0, test_1.expect)(clusterDetailsPage.clusterDetailsHeading).toBeVisible({
36
+ timeout: 60000,
37
+ });
38
+ await (0, test_1.expect)(page.getByText(customPropertyDescription)).toBeVisible({
39
+ timeout: 60000,
40
+ });
41
+ // Both links belong to the same custom property (one description, two
42
+ // links), so both are looked up by that shared description rather than
43
+ // by a per-link row title.
44
+ await clusterDetailsPage.assertCustomPropertyIsNavigated(customPropertyDescription, 'Camunda', /^https:\/\/(www\.)?camunda\.com\/?$/);
45
+ await clusterDetailsPage.assertCustomPropertyIsNavigated(customPropertyDescription, 'Camunda Docs', 'https://docs.camunda.io');
46
+ });
47
+ });
48
+ });
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,226 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const SM_8_11_1 = require("../../fixtures/SM-8.11");
4
+ const _setup_1 = require("../../test-setup.js");
5
+ const apiHelpers_1 = require("../../utils/apiHelpers");
6
+ const sleep_1 = require("../../utils/sleep");
7
+ const randomName_1 = require("../../utils/randomName");
8
+ const CLUSTER_VAR_NAMES = {
9
+ ORIGINAL_JSON: 'ORIGINAL_API_INFO',
10
+ UPDATABLE_JSON: 'UPDATABLE_API_INFO',
11
+ ORIGINAL_STRING: 'ORIGINAL_APP_VERSION',
12
+ UPDATABLE_STRING: 'UPDATABLE_APP_VERSION',
13
+ };
14
+ // Resolve cluster variable values from available env vars with fallbacks
15
+ const clusterVariableJsonValue = process.env.CLUSTER_VARIABLE_JSON_VALUE || process.env.CLUSTER_VARIABLE_JSON;
16
+ const clusterVariableStringValue = process.env.CLUSTER_VARIABLE_STRING_VALUE || 'v1.0.0';
17
+ function getConfigByType(type) {
18
+ const configs = {
19
+ JSON: {
20
+ processName: 'Cluster Variable Original JSON',
21
+ processNameUpdatable: 'Cluster Variable Updatable JSON',
22
+ taskName: 'Preview JSON cluster variables',
23
+ taskElementId: 'Activity_1whhatc',
24
+ originalVariableName: CLUSTER_VAR_NAMES.ORIGINAL_JSON,
25
+ updatableVariableName: CLUSTER_VAR_NAMES.UPDATABLE_JSON,
26
+ originalValue: originalJsonClusterVariableValue,
27
+ operateVariableName: 'URL',
28
+ randomValuePrefix: 'https://updated.api.com',
29
+ },
30
+ String: {
31
+ processName: 'Cluster Variable Original String',
32
+ processNameUpdatable: 'Cluster Variable Updatable String',
33
+ taskName: 'Preview String cluster variable',
34
+ taskElementId: 'Activity_1whhatc',
35
+ originalVariableName: CLUSTER_VAR_NAMES.ORIGINAL_STRING,
36
+ updatableVariableName: CLUSTER_VAR_NAMES.UPDATABLE_STRING,
37
+ originalValue: originalStringClusterVariableValue,
38
+ operateVariableName: 'APP_VERSION_VALUE',
39
+ randomValuePrefix: 'v3.0.0-updated',
40
+ },
41
+ };
42
+ return configs[type];
43
+ }
44
+ let authToken;
45
+ let originalJsonClusterVariableValue;
46
+ let originalStringClusterVariableValue;
47
+ let jsonProcessKeyDisplay;
48
+ let jsonProcessKeyUpdate;
49
+ let stringProcessKeyDisplay;
50
+ let stringProcessKeyUpdate;
51
+ SM_8_11_1.test.describe.configure({ mode: 'parallel' });
52
+ SM_8_11_1.test.describe('Cluster Variables User Flows', () => {
53
+ SM_8_11_1.test.beforeAll(async () => {
54
+ authToken = await (0, apiHelpers_1.authSmAPI)();
55
+ if (!clusterVariableJsonValue) {
56
+ throw new Error('Neither CLUSTER_VARIABLE_JSON_VALUE nor CLUSTER_VARIABLE_JSON env var is set');
57
+ }
58
+ await Promise.all([
59
+ (0, apiHelpers_1.createJsonClusterVariable)(authToken, 'sm', CLUSTER_VAR_NAMES.ORIGINAL_JSON, clusterVariableJsonValue),
60
+ (0, apiHelpers_1.createJsonClusterVariable)(authToken, 'sm', CLUSTER_VAR_NAMES.UPDATABLE_JSON, clusterVariableJsonValue),
61
+ (0, apiHelpers_1.createStringClusterVariable)(authToken, 'sm', CLUSTER_VAR_NAMES.ORIGINAL_STRING, clusterVariableStringValue),
62
+ (0, apiHelpers_1.createStringClusterVariable)(authToken, 'sm', CLUSTER_VAR_NAMES.UPDATABLE_STRING, clusterVariableStringValue),
63
+ ]);
64
+ originalJsonClusterVariableValue = JSON.parse(clusterVariableJsonValue);
65
+ originalStringClusterVariableValue = clusterVariableStringValue;
66
+ const deployments = [
67
+ {
68
+ path: './resources/cluster_variables/cluster_variable_json_readonly.bpmn',
69
+ assignTo: 'jsonProcessKeyDisplay',
70
+ },
71
+ {
72
+ path: './resources/cluster_variables/cluster_variable_json_mutable.bpmn',
73
+ assignTo: 'jsonProcessKeyUpdate',
74
+ },
75
+ {
76
+ path: './resources/cluster_variables/cluster_variable_json_form.form',
77
+ assignTo: null,
78
+ },
79
+ {
80
+ path: './resources/cluster_variables/cluster_variable_string_readonly.bpmn',
81
+ assignTo: 'stringProcessKeyDisplay',
82
+ },
83
+ {
84
+ path: './resources/cluster_variables/cluster_variable_string_mutable.bpmn',
85
+ assignTo: 'stringProcessKeyUpdate',
86
+ },
87
+ {
88
+ path: './resources/cluster_variables/cluster_variable_string_form.form',
89
+ assignTo: null,
90
+ },
91
+ ];
92
+ const deploymentResults = await Promise.all(deployments.map((d) => (0, apiHelpers_1.deployProcess)(d.path, authToken)));
93
+ jsonProcessKeyDisplay = deploymentResults[0];
94
+ jsonProcessKeyUpdate = deploymentResults[1];
95
+ stringProcessKeyDisplay = deploymentResults[3];
96
+ stringProcessKeyUpdate = deploymentResults[4];
97
+ });
98
+ SM_8_11_1.test.beforeEach(async ({ navigationPage }, testInfo) => {
99
+ await navigationPage.goToOperate((testInfo.workerIndex + 1) * 1000);
100
+ });
101
+ SM_8_11_1.test.afterEach(async ({ page }, testInfo) => {
102
+ await (0, _setup_1.captureScreenshot)(page, testInfo);
103
+ await (0, _setup_1.captureFailureVideo)(page, testInfo);
104
+ });
105
+ SM_8_11_1.test.describe('Global cluster variable', () => {
106
+ const testConfigs = [
107
+ {
108
+ type: 'JSON',
109
+ processKeyDisplay: () => jsonProcessKeyDisplay,
110
+ processKeyUpdate: () => jsonProcessKeyUpdate,
111
+ },
112
+ {
113
+ type: 'String',
114
+ processKeyDisplay: () => stringProcessKeyDisplay,
115
+ processKeyUpdate: () => stringProcessKeyUpdate,
116
+ },
117
+ ];
118
+ for (const config of testConfigs) {
119
+ (0, SM_8_11_1.test)(`User views ${config.type} cluster variable in Tasklist from readonly process and completes task`, async ({ page, navigationPage, operateHomePage, operateProcessesPage, operateProcessInstancePage, taskPanelPage, taskDetailsPage, }) => {
120
+ SM_8_11_1.test.slow();
121
+ const derived = getConfigByType(config.type);
122
+ const instanceKey = await (0, apiHelpers_1.createProcessInstance)(String(config.processKeyDisplay()), authToken);
123
+ await SM_8_11_1.test.step('User can access the process on operate', async () => {
124
+ await operateHomePage.clickProcessesTab();
125
+ await operateProcessesPage.applyMoreFilters('Process Instance Key(s)', String(instanceKey));
126
+ await operateProcessesPage.clickProcessInstanceLink(String(instanceKey));
127
+ await operateProcessInstancePage.assertActiveTokenIsPresent();
128
+ });
129
+ await SM_8_11_1.test.step(`User can view the process with ${config.type} cluster variable on tasklist`, async () => {
130
+ await navigationPage.goToTasklist();
131
+ await (0, sleep_1.sleep)(5000);
132
+ // Tasklist may display the BPMN element ID instead of the task name
133
+ // due to inconsistent metadata. Determine which label is visible.
134
+ const taskNameLocator = taskPanelPage.availableTasks.getByText(derived.taskName, { exact: true });
135
+ const taskElementIdLocator = taskPanelPage.availableTasks.getByText(derived.taskElementId, { exact: true });
136
+ let taskLabel = derived.taskName;
137
+ for (let attempt = 1; attempt <= 30; attempt++) {
138
+ const [nameVisible, elementIdVisible] = await Promise.all([
139
+ taskNameLocator
140
+ .first()
141
+ .isVisible()
142
+ .catch(() => false),
143
+ taskElementIdLocator
144
+ .first()
145
+ .isVisible()
146
+ .catch(() => false),
147
+ ]);
148
+ if (nameVisible) {
149
+ taskLabel = derived.taskName;
150
+ break;
151
+ }
152
+ if (elementIdVisible) {
153
+ taskLabel = derived.taskElementId;
154
+ break;
155
+ }
156
+ if (attempt < 30) {
157
+ await page.reload();
158
+ await (0, sleep_1.sleep)(2000);
159
+ }
160
+ }
161
+ await taskPanelPage.openTask(taskLabel);
162
+ await taskDetailsPage.clickAssignToMeButton();
163
+ });
164
+ await SM_8_11_1.test.step(`User can view the value of ${config.type} cluster variable and complete the task`, async () => {
165
+ if (config.type === 'JSON') {
166
+ for (const value of Object.values(derived.originalValue)) {
167
+ await taskDetailsPage.assertTextIsPresent(String(value));
168
+ }
169
+ }
170
+ else {
171
+ await taskDetailsPage.assertTextIsPresent(String(derived.originalValue));
172
+ }
173
+ await taskDetailsPage.clickCompleteTaskButton();
174
+ });
175
+ await SM_8_11_1.test.step('User can assert the process is completed on Operate', async () => {
176
+ await navigationPage.goToOperate();
177
+ await operateHomePage.clickProcessesTab();
178
+ await operateProcessesPage.clickProcessCompletedCheckbox();
179
+ await operateProcessesPage.applyMoreFilters('Process Instance Key(s)', String(instanceKey));
180
+ await operateProcessesPage.clickProcessInstanceLink(String(instanceKey), 'completed');
181
+ await operateProcessInstancePage.assertProcessCompleteStatusWithRetry();
182
+ });
183
+ });
184
+ }
185
+ for (const config of testConfigs) {
186
+ (0, SM_8_11_1.test)(`User updates ${config.type} cluster variable in Admin UI and verifies changes in Operate`, async ({ navigationPage, ocIdentityHomePage, ocIdentityClusterVariablesPage, operateHomePage, operateProcessesPage, operateProcessInstancePage, }) => {
187
+ SM_8_11_1.test.slow();
188
+ const derived = getConfigByType(config.type);
189
+ const randomRawValue = await (0, randomName_1.randomNameAgregator)(derived.randomValuePrefix);
190
+ const newValue = config.type === 'JSON'
191
+ ? JSON.stringify({
192
+ endpoint: randomRawValue,
193
+ timeout_ms: '5000',
194
+ array: ['updated_item1', 'updated_item2'],
195
+ })
196
+ : JSON.stringify(randomRawValue);
197
+ await SM_8_11_1.test.step('User navigates to Admin UI', async () => {
198
+ await navigationPage.goToOCAdmin();
199
+ });
200
+ await SM_8_11_1.test.step('User navigates to Cluster Variables tab', async () => {
201
+ await ocIdentityHomePage.clickClusterVariablesTab();
202
+ });
203
+ await SM_8_11_1.test.step(`User verifies ${config.type} cluster variable exists`, async () => {
204
+ await ocIdentityClusterVariablesPage.assertVariableExists(derived.updatableVariableName);
205
+ });
206
+ await SM_8_11_1.test.step(`User updates the ${config.type} cluster variable value`, async () => {
207
+ await ocIdentityClusterVariablesPage.editVariable(derived.updatableVariableName, newValue);
208
+ });
209
+ await SM_8_11_1.test.step(`User creates a process instance with the updated ${config.type} cluster variable`, async () => {
210
+ const instanceKey = await (0, apiHelpers_1.createProcessInstance)(String(config.processKeyUpdate()), authToken);
211
+ await SM_8_11_1.test.step('User navigates to the process instance on Operate', async () => {
212
+ await navigationPage.goToOperate();
213
+ await operateHomePage.clickProcessesTab();
214
+ await operateProcessesPage.clickProcessCompletedCheckbox();
215
+ await operateProcessesPage.applyMoreFilters('Process Instance Key(s)', String(instanceKey));
216
+ await operateProcessesPage.clickProcessInstanceLink(String(instanceKey), 'completed');
217
+ await operateProcessInstancePage.assertProcessCompleteStatusWithRetry();
218
+ });
219
+ await SM_8_11_1.test.step(`User verifies the updated ${config.type} cluster variable value is present in process variables`, async () => {
220
+ await operateProcessInstancePage.assertProcessVariableContainsText(derived.operateVariableName, randomRawValue);
221
+ });
222
+ });
223
+ });
224
+ }
225
+ });
226
+ });
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,307 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const test_1 = require("@playwright/test");
4
+ const SM_8_11_1 = require("../../fixtures/SM-8.11");
5
+ const _setup_1 = require("../../test-setup.js");
6
+ const UtilitiesPage_1 = require("../../pages/SM-8.11/UtilitiesPage");
7
+ const sleep_1 = require("../../utils/sleep");
8
+ const constants_1 = require("../../utils/constants");
9
+ // Serial: the two active webhook tests both fall back to importing the
10
+ // "Webhook Connector" marketplace package (which bundles the Boundary,
11
+ // Intermediate and Message-Start template variants) when the template is not
12
+ // already revealed in the change-element popup. Connector element-template IDs
13
+ // are unique per Workspace, and both tests create their own project inside the
14
+ // same shared "Cross Component Test Project" Workspace, so importing the same
15
+ // package concurrently makes the second import fail with HTTP 400
16
+ // "Template ID already in use" (surfaced as the marketplace "Try again" state).
17
+ // Running them serially lets the first import register the templates
18
+ // Workspace-wide; the second test then reveals them directly and skips the
19
+ // import, so there is no collision.
20
+ SM_8_11_1.test.describe.configure({ mode: 'serial' });
21
+ SM_8_11_1.test.describe('Connectors User Flow Tests @tasklistV2', () => {
22
+ const mtTenant = process.env.IS_MT === 'true' ? '<default>' : '';
23
+ SM_8_11_1.test.beforeEach(async ({ navigationPage }, testInfo) => {
24
+ await navigationPage.goToModeler((testInfo.workerIndex + 1) * 1000);
25
+ });
26
+ SM_8_11_1.test.afterEach(async ({ page }, testInfo) => {
27
+ await (0, _setup_1.captureScreenshot)(page, testInfo);
28
+ await (0, _setup_1.captureFailureVideo)(page, testInfo);
29
+ });
30
+ // Skipped due to bug #7716: https://github.com/camunda/connectors/issues/7716
31
+ SM_8_11_1.test.skip('REST Connector No Auth User Flow', async ({ page, operateHomePage, modelerHomePage, operateProcessInstancePage, modelerCreatePage, connectorSettingsPage, operateProcessesPage, connectorMarketplacePage, navigationPage, }) => {
32
+ SM_8_11_1.test.slow();
33
+ const processName = 'REST_Connector_No_Auth_Process' + (await (0, _setup_1.generateRandomStringAsync)(3));
34
+ await SM_8_11_1.test.step('Open Cross Component Test Project and Create a BPMN Diagram Template', async () => {
35
+ await modelerHomePage.clickCrossComponentProjectFolder();
36
+ await modelerHomePage.clickDiagramTypeDropdown();
37
+ await modelerHomePage.clickBpmnTemplateOption();
38
+ });
39
+ await SM_8_11_1.test.step('Create BPMN Diagram with REST Connector and Start Process Instance', async () => {
40
+ await (0, UtilitiesPage_1.modelRestConnector)(modelerCreatePage, connectorSettingsPage, connectorMarketplacePage, processName, constants_1.REST_MOCK_URL, 'noAuth', 'body');
41
+ await modelerCreatePage.runProcessInstance('', mtTenant);
42
+ await (0, sleep_1.sleep)(20000);
43
+ });
44
+ await SM_8_11_1.test.step('View Process Instance in Operate, assert it completes and assert result expression', async () => {
45
+ await navigationPage.goToOperate();
46
+ await operateHomePage.clickProcessesTab();
47
+ await operateProcessesPage.clickProcessInstanceLink(processName, 'completed');
48
+ const result = await operateProcessInstancePage.assertEitherIncidentOrCompletedIconVisible();
49
+ (0, test_1.expect)(result).toBe('completed');
50
+ await (0, test_1.expect)(page.getByTestId('variables-list')).toBeVisible({
51
+ timeout: 30000,
52
+ });
53
+ (0, test_1.expect)((await operateProcessInstancePage.connectorResultVariableName('status')).isVisible()).toBeTruthy();
54
+ await (0, test_1.expect)(page.getByText('"Awesome!"')).toBeVisible({
55
+ timeout: 60000,
56
+ });
57
+ });
58
+ });
59
+ (0, SM_8_11_1.test)('REST Connector Bearer Token Auth User Flow', async ({ page, operateHomePage, modelerHomePage, modelerCreatePage, connectorSettingsPage, navigationPage, operateProcessInstancePage, operateProcessesPage, connectorMarketplacePage, }) => {
60
+ SM_8_11_1.test.slow();
61
+ const processName = 'REST_Connector_Bearer_Auth_Process' +
62
+ (await (0, _setup_1.generateRandomStringAsync)(3));
63
+ await SM_8_11_1.test.step('Open Cross Component Test Project and Create a BPMN Diagram Template', async () => {
64
+ await modelerHomePage.clickCrossComponentProjectFolder();
65
+ await modelerHomePage.clickDiagramTypeDropdown();
66
+ await modelerHomePage.clickBpmnTemplateOption();
67
+ });
68
+ await SM_8_11_1.test.step('Create BPMN Diagram with REST Connector with Basic Auth and Start Process Instance', async () => {
69
+ await (0, UtilitiesPage_1.modelRestConnector)(modelerCreatePage, connectorSettingsPage, connectorMarketplacePage, processName, constants_1.REST_MOCK_URL, 'bearer', '{message:response.body.message}');
70
+ await modelerCreatePage.runProcessInstance('', mtTenant);
71
+ await (0, sleep_1.sleep)(20000);
72
+ });
73
+ await SM_8_11_1.test.step('View Process Instance in Operate, assert it completes and assert result expression', async () => {
74
+ await navigationPage.goToOperate();
75
+ await operateHomePage.clickProcessesTab();
76
+ await operateProcessesPage.clickProcessInstanceLink(processName, 'completed');
77
+ const result = await operateProcessInstancePage.assertEitherIncidentOrCompletedIconVisible();
78
+ (0, test_1.expect)(result).toBe('completed');
79
+ await (0, test_1.expect)(page.getByTestId('variables-list')).toBeVisible({
80
+ timeout: 90000,
81
+ });
82
+ (0, test_1.expect)((await operateProcessInstancePage.connectorResultVariableName('message')).isVisible()).toBeTruthy();
83
+ await (0, test_1.expect)(page.getByText('"Awesome!"')).toBeVisible({
84
+ timeout: 60000,
85
+ });
86
+ });
87
+ });
88
+ (0, SM_8_11_1.test)('Message Start Event Webhook Connector No Auth User Flow', async ({ modelerHomePage, navigationPage, modelerCreatePage, request, operateHomePage, operateProcessInstancePage, operateProcessesPage, connectorMarketplacePage, connectorSettingsPage, }) => {
89
+ SM_8_11_1.test.slow();
90
+ const randomString = await (0, _setup_1.generateRandomStringAsync)(3);
91
+ const processName = 'Start_Event_Webhook_Connector_No_Auth_Process' + randomString;
92
+ await SM_8_11_1.test.step('Open Cross Component Test Project and Create a BPMN Diagram Template', async () => {
93
+ await modelerHomePage.clickCrossComponentProjectFolder();
94
+ await modelerHomePage.clickDiagramTypeDropdown();
95
+ await modelerHomePage.clickBpmnTemplateOption();
96
+ });
97
+ await SM_8_11_1.test.step('Create BPMN Diagram with REST Connector and Deploy Diagram', async () => {
98
+ await (0, test_1.expect)(modelerCreatePage.generalPanel).toBeVisible({
99
+ timeout: 60000,
100
+ });
101
+ await modelerCreatePage.enterDiagramName(processName);
102
+ await (0, sleep_1.sleep)(1000);
103
+ await modelerCreatePage.clickCanvas();
104
+ await modelerCreatePage.clickGeneralPropertiesPanel();
105
+ await modelerCreatePage.clickIdInput();
106
+ await modelerCreatePage.fillIdInput(processName);
107
+ await modelerCreatePage.assertNameInput(processName);
108
+ await (0, sleep_1.sleep)(1000);
109
+ await modelerCreatePage.clickStartEventElement();
110
+ await modelerCreatePage.clickChangeTypeButton();
111
+ try {
112
+ await modelerCreatePage.revealChangeElementTemplate(modelerCreatePage.webhookMessageStartEventConnectorOption, 'Webhook');
113
+ await (0, test_1.expect)(modelerCreatePage.webhookMessageStartEventConnectorOption).toBeVisible({
114
+ timeout: 15000,
115
+ });
116
+ }
117
+ catch (error) {
118
+ await modelerCreatePage.clickMarketPlaceButton();
119
+ await connectorMarketplacePage.clickSearchForConnectorTextbox();
120
+ await connectorMarketplacePage.fillSearchForConnectorTextbox('Webhook Connector');
121
+ await connectorMarketplacePage.waitForConnectorSearchResults();
122
+ await connectorMarketplacePage.downloadConnectorToProject();
123
+ }
124
+ await modelerCreatePage.clickWebhookMessageStartEventConnectorOption();
125
+ await connectorSettingsPage.clickWebhookConfigurationTab();
126
+ await modelerCreatePage.clickWebhookIdInput();
127
+ await modelerCreatePage.clearWebhookIdInput();
128
+ await modelerCreatePage.fillWebhookIdInput('test-webhook-id' + randomString);
129
+ await (0, sleep_1.sleep)(10000);
130
+ await modelerCreatePage.clickAppendElementButton();
131
+ await modelerCreatePage.clickAppendEndEventButton();
132
+ await (0, sleep_1.sleep)(10000);
133
+ await modelerCreatePage.deployProcessInstance(mtTenant);
134
+ await (0, sleep_1.sleep)(20000);
135
+ });
136
+ await SM_8_11_1.test.step('Make Authorization Request', async () => {
137
+ const baseURL = process.env.PLAYWRIGHT_BASE_URL ||
138
+ `http://gke-${process.env.BASE_URL}.ci.distro.ultrawombat.com`;
139
+ const url = `${baseURL}/connectors/inbound/test-webhook-id${randomString}`;
140
+ // Poll for inbound endpoint readiness — connector deployment is async
141
+ // after the diagram is deployed.
142
+ const deadline = Date.now() + 180000;
143
+ let response;
144
+ let attempt = 0;
145
+ while (Date.now() < deadline) {
146
+ attempt++;
147
+ response = await request.post(url);
148
+ if (response.status() === 200)
149
+ break;
150
+ console.error(`Webhook readiness attempt ${attempt}: ${url} -> ${response.status()}`);
151
+ await (0, sleep_1.sleep)(10000);
152
+ }
153
+ if (!response || response.status() !== 200) {
154
+ throw new Error(`Webhook request failed with status ${response?.status()} after ${attempt} attempts`);
155
+ }
156
+ });
157
+ await SM_8_11_1.test.step('Assert Diagram Has Successfully Completed in Operate', async () => {
158
+ await navigationPage.goToOperate();
159
+ await operateHomePage.clickProcessesTab();
160
+ await operateProcessesPage.clickProcessInstanceLink(processName, 'completed');
161
+ const result = await operateProcessInstancePage.assertEitherIncidentOrCompletedIconVisible();
162
+ (0, test_1.expect)(result).toBe('completed');
163
+ });
164
+ });
165
+ // Skipped due to bug #7716: https://github.com/camunda/connectors/issues/7716
166
+ SM_8_11_1.test.skip('Connector Secrets User Flow', async ({ operateHomePage, modelerHomePage, navigationPage, modelerCreatePage, connectorSettingsPage, operateProcessInstancePage, operateProcessesPage, connectorMarketplacePage, }) => {
167
+ SM_8_11_1.test.slow();
168
+ const processName = 'REST_Connector_Process' + (await (0, _setup_1.generateRandomStringAsync)(3));
169
+ await SM_8_11_1.test.step('Open Cross Component Test Project and Create a BPMN Diagram Template', async () => {
170
+ await modelerHomePage.clickCrossComponentProjectFolder();
171
+ await modelerHomePage.clickDiagramTypeDropdown();
172
+ await modelerHomePage.clickBpmnTemplateOption();
173
+ });
174
+ await SM_8_11_1.test.step('Create BPMN Diagram with REST Connector using secrets and Start Process Instance', async () => {
175
+ await (0, UtilitiesPage_1.modelRestConnector)(modelerCreatePage, connectorSettingsPage, connectorMarketplacePage, processName, constants_1.REST_MOCK_BASIC_AUTH_URL, 'basic', '{message:response.body.message}', {
176
+ resultVariable: 'result',
177
+ basicAuthCredentials: {
178
+ username: '{{secrets.username}}',
179
+ password: '{{secrets.password}}',
180
+ },
181
+ });
182
+ await modelerCreatePage.runProcessInstance('', mtTenant);
183
+ await (0, sleep_1.sleep)(20000);
184
+ });
185
+ await SM_8_11_1.test.step('View Process Instance in Operate, assert it completes and assert result expression', async () => {
186
+ await navigationPage.goToOperate();
187
+ await operateHomePage.clickProcessesTab();
188
+ await operateProcessesPage.clickProcessInstanceLink(processName, 'completed');
189
+ const result = await operateProcessInstancePage.assertEitherIncidentOrCompletedIconVisible();
190
+ (0, test_1.expect)(result).toBe('completed');
191
+ await operateProcessInstancePage.assertResultVariableVisibleWithRetry('message');
192
+ await operateProcessInstancePage.assertProcessVariableContainsText('message', '"Message from Mock!"');
193
+ });
194
+ });
195
+ (0, SM_8_11_1.test)('Intermediate Event Webhook Connector No Auth User Flow', async ({ modelerHomePage, modelerCreatePage, request, operateHomePage, operateProcessInstancePage, operateProcessesPage, navigationPage, connectorMarketplacePage, connectorSettingsPage, }) => {
196
+ SM_8_11_1.test.slow();
197
+ const randomString = await (0, _setup_1.generateRandomStringAsync)(3);
198
+ const processName = 'Intermediate_Event_Webhook_Connector_No_Auth_Process' + randomString;
199
+ await SM_8_11_1.test.step('Open Cross Component Test Project and Create a BPMN Diagram Template', async () => {
200
+ await modelerHomePage.clickCrossComponentProjectFolder();
201
+ await modelerHomePage.clickDiagramTypeDropdown();
202
+ await modelerHomePage.clickBpmnTemplateOption();
203
+ });
204
+ await SM_8_11_1.test.step('Create BPMN Diagram with Intermediate Event Webhook Connector and Run Diagram', async () => {
205
+ await (0, test_1.expect)(modelerCreatePage.generalPanel).toBeVisible({
206
+ timeout: 120000,
207
+ });
208
+ await modelerCreatePage.enterDiagramName(processName);
209
+ await (0, sleep_1.sleep)(1000);
210
+ await modelerCreatePage.clickCanvas();
211
+ await modelerCreatePage.clickGeneralPropertiesPanel();
212
+ await modelerCreatePage.clickIdInput();
213
+ await modelerCreatePage.fillIdInput(processName);
214
+ await modelerCreatePage.assertNameInput(processName);
215
+ await (0, sleep_1.sleep)(1000);
216
+ await modelerCreatePage.clickStartEventElement();
217
+ await modelerCreatePage.clickAppendElementButton();
218
+ await modelerCreatePage.clickIntermediateBoundaryEvent();
219
+ await modelerCreatePage.clickChangeTypeButton();
220
+ try {
221
+ // Probe for the template this flow needs: an intermediate event's
222
+ // change-element list never offers the message start event connector,
223
+ // so probing for that one always fell through to the marketplace.
224
+ // 'Webhook' is the filter both webhook flows share; the entry is then
225
+ // picked by its template id, so a broader term cannot mis-select.
226
+ await modelerCreatePage.revealChangeElementTemplate(modelerCreatePage.intermediateWebhookConnectorOption, 'Webhook');
227
+ await (0, test_1.expect)(modelerCreatePage.intermediateWebhookConnectorOption).toBeVisible({
228
+ timeout: 15000,
229
+ });
230
+ }
231
+ catch (error) {
232
+ await modelerCreatePage.clickMarketPlaceButton();
233
+ await connectorMarketplacePage.clickSearchForConnectorTextbox();
234
+ await connectorMarketplacePage.fillSearchForConnectorTextbox('Webhook Connector');
235
+ await connectorMarketplacePage.waitForConnectorSearchResults();
236
+ await connectorMarketplacePage.downloadConnectorToProject();
237
+ }
238
+ await modelerCreatePage.clickIntermediateWebhookConnectorOption();
239
+ await connectorSettingsPage.clickCorrelationTab();
240
+ await connectorSettingsPage.clickWebhookConfigurationTab();
241
+ await modelerCreatePage.clickWebhookIdInput();
242
+ await modelerCreatePage.clearWebhookIdInput();
243
+ await modelerCreatePage.fillWebhookIdInput('test-webhook-intermediate' + randomString);
244
+ await modelerCreatePage.clickCorrelationKeyProcessInput();
245
+ await modelerCreatePage.fillCorrelationKeyProcessInput('"test"');
246
+ await modelerCreatePage.clickCorrelationKeyPayloadInput();
247
+ await modelerCreatePage.fillCorrelationKeyPayloadInput('"test"');
248
+ await modelerCreatePage.clickAppendElementButton();
249
+ await modelerCreatePage.clickAppendEndEventButton();
250
+ await (0, sleep_1.sleep)(10000);
251
+ await modelerCreatePage.runProcessInstance('', mtTenant);
252
+ await (0, sleep_1.sleep)(20000);
253
+ });
254
+ await SM_8_11_1.test.step('Make Authorization Request', async () => {
255
+ const baseURL = process.env.PLAYWRIGHT_BASE_URL ||
256
+ `http://gke-${process.env.BASE_URL}.ci.distro.ultrawombat.com`;
257
+ const url = `${baseURL}/connectors/inbound/test-webhook-intermediate${randomString}`;
258
+ // Poll for inbound endpoint readiness — connector deployment is async after PI start
259
+ const deadline = Date.now() + 180000;
260
+ let response;
261
+ let attempt = 0;
262
+ while (Date.now() < deadline) {
263
+ attempt++;
264
+ response = await request.post(url, { data: { test: 'test' } });
265
+ if (response.status() === 200)
266
+ break;
267
+ console.error(`Webhook readiness attempt ${attempt}: ${url} -> ${response.status()}`);
268
+ await (0, sleep_1.sleep)(10000);
269
+ }
270
+ if (!response || response.status() !== 200) {
271
+ throw new Error(`Webhook request failed with status ${response?.status()} after ${attempt} attempts`);
272
+ }
273
+ await (0, sleep_1.sleep)(60000);
274
+ });
275
+ await SM_8_11_1.test.step('Assert Diagram Has Successfully Completed in Operate', async () => {
276
+ await navigationPage.goToOperate();
277
+ await operateHomePage.clickProcessesTab();
278
+ await operateProcessesPage.clickProcessInstanceLink(processName, 'completed');
279
+ const result = await operateProcessInstancePage.assertEitherIncidentOrCompletedIconVisible();
280
+ (0, test_1.expect)(result).toBe('completed');
281
+ });
282
+ });
283
+ //Skipped due to bug 1252: https://github.com/camunda/c8-cross-component-e2e-tests/issues/1252
284
+ SM_8_11_1.test.skip('Connectors Timer Event User Flow', async ({ page, modelerHomePage, modelerCreatePage, connectorMarketplacePage, connectorTemplatePage, navigationPage, operateProcessInstancePage, operateHomePage, operateProcessesPage, }) => {
285
+ SM_8_11_1.test.slow();
286
+ const processName = 'Connectors_Timer_Event_Process' + (await (0, _setup_1.generateRandomStringAsync)(3));
287
+ await SM_8_11_1.test.step('Open Cross Component Test Project and Create a REST Connector Document Handling Flow', async () => {
288
+ await (0, UtilitiesPage_1.modelAndRunConnectorsTimerEventDiagram)(modelerCreatePage, modelerHomePage, processName, page, connectorMarketplacePage, connectorTemplatePage, mtTenant);
289
+ });
290
+ await SM_8_11_1.test.step('View Process Instance in Operate, assert it completes and assert variable values are correct', async () => {
291
+ await navigationPage.goToOperate();
292
+ await operateHomePage.clickProcessesTab();
293
+ await operateProcessesPage.clickProcessInstanceLink(processName);
294
+ await operateProcessInstancePage.activeIconAssertion();
295
+ await operateProcessInstancePage.completedIconAssertion();
296
+ await (0, test_1.expect)(page.getByText('["20A","20B"]')).toBeVisible({
297
+ timeout: 60000,
298
+ });
299
+ await (0, test_1.expect)(page.getByText('seatNumbers')).toBeVisible({
300
+ timeout: 60000,
301
+ });
302
+ await (0, test_1.expect)(page.getByText('paymentRequestId')).toBeVisible({
303
+ timeout: 60000,
304
+ });
305
+ });
306
+ });
307
+ });