@camunda/e2e-test-suite 0.0.1270 → 0.0.1272
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/dist/pages/8.10/ClusterSecretsPage.js +17 -1
- package/dist/pages/8.9/ClusterPage.js +11 -2
- package/dist/pages/8.9/ClusterSecretsPage.js +19 -4
- package/dist/pages/BrowseAllConnectorMarketplacePage.d.ts +1 -0
- package/dist/pages/BrowseAllConnectorMarketplacePage.js +26 -14
- package/dist/pages/SM-8.9/ClusterPage.js +5 -1
- package/dist/resources/Basic_Auth_REST_Connector.bpmn +2 -2
- package/dist/resources/ConnectorsBasicTest.bpmn +6 -6
- package/dist/resources/REST_Connector_Bearer_Auth_Process.bpmn +2 -2
- package/dist/resources/REST_Connector_No_Auth_Process.bpmn +1 -1
- package/dist/test-setup.d.ts +0 -1
- package/dist/test-setup.js +7 -29
- package/dist/tests/8.10/connectors-user-flows.spec.js +4 -7
- package/dist/tests/8.10/saas-migration-path-user-flows.spec.js +1 -2
- package/dist/tests/8.10/smoke-tests.spec.js +2 -3
- package/dist/tests/8.7/connectors-user-flows.spec.js +10 -14
- package/dist/tests/8.7/saas-migration-path-user-flows.spec.js +1 -2
- package/dist/tests/8.7/smoke-tests.spec.js +3 -3
- package/dist/tests/8.8/connectors-user-flows.spec.js +5 -7
- package/dist/tests/8.8/saas-migration-path-user-flows.spec.js +1 -2
- package/dist/tests/8.8/smoke-tests.spec.js +3 -3
- package/dist/tests/8.9/connectors-user-flows.spec.js +5 -7
- package/dist/tests/8.9/saas-migration-path-user-flows.spec.js +1 -2
- package/dist/tests/8.9/smoke-tests.spec.js +3 -3
- package/dist/tests/SM-8.10/connectors-user-flows.spec.js +6 -9
- package/dist/tests/SM-8.10/mt-enabled-user-flows.spec.js +6 -6
- package/dist/tests/SM-8.10/smoke-tests.spec.js +2 -1
- package/dist/tests/SM-8.7/connectors-user-flows.spec.js +4 -4
- package/dist/tests/SM-8.7/mt-enabled-user-flows.spec.js +5 -4
- package/dist/tests/SM-8.7/smoke-tests.spec.js +3 -2
- package/dist/tests/SM-8.8/connectors-user-flows.spec.js +4 -4
- package/dist/tests/SM-8.8/mt-enabled-user-flows.spec.js +5 -4
- package/dist/tests/SM-8.8/smoke-tests.spec.js +2 -1
- package/dist/tests/SM-8.9/connectors-user-flows.spec.js +6 -6
- package/dist/tests/SM-8.9/mt-enabled-user-flows.spec.js +5 -4
- package/dist/tests/SM-8.9/smoke-tests.spec.js +2 -1
- package/dist/tests/c8Run-8.10/connectors-user-flows.spec.js +2 -2
- package/dist/tests/c8Run-8.7/connectors-user-flows.spec.js +5 -8
- package/dist/tests/c8Run-8.8/connectors-user-flows.spec.js +5 -8
- package/dist/tests/c8Run-8.9/connectors-user-flows.spec.js +5 -8
- package/dist/utils/connectorSecrets.js +2 -1
- package/dist/utils/constants.d.ts +2 -0
- package/dist/utils/constants.js +20 -1
- package/package.json +1 -1
- package/playwright.config.ts +80 -0
- package/resources/Basic_Auth_REST_Connector.bpmn +2 -2
- package/resources/ConnectorsBasicTest.bpmn +6 -6
- package/resources/REST_Connector_Bearer_Auth_Process.bpmn +2 -2
- package/resources/REST_Connector_No_Auth_Process.bpmn +1 -1
|
@@ -32,24 +32,22 @@ c8Run_8_7_1.test.describe('Connectors User Flow Tests', () => {
|
|
|
32
32
|
await (0, _setup_1.captureScreenshot)(page, testInfo);
|
|
33
33
|
await (0, _setup_1.captureFailureVideo)(page, testInfo);
|
|
34
34
|
});
|
|
35
|
-
|
|
36
|
-
c8Run_8_7_1.test.skip('REST Connector No Auth User Flow', async ({ operateHomePage, operateProcessInstancePage, operateProcessesPage, }) => {
|
|
35
|
+
(0, c8Run_8_7_1.test)('REST Connector No Auth User Flow', async ({ operateHomePage, operateProcessInstancePage, operateProcessesPage, }) => {
|
|
37
36
|
await c8Run_8_7_1.test.step('View Process Instance in Operate, assert it completes and assert result expression', async () => {
|
|
38
37
|
await (0, test_1.expect)(operateHomePage.processesTab).toBeVisible({ timeout: 180000 });
|
|
39
38
|
await operateHomePage.clickProcessesTab();
|
|
40
39
|
await operateProcessesPage.clickProcessCompletedCheckbox();
|
|
41
40
|
await operateProcessesPage.clickProcessInstanceLink('REST_Connector_No_Auth_Process');
|
|
42
41
|
await operateProcessInstancePage.completedIconAssertion();
|
|
43
|
-
await (0, test_1.expect)(operateProcessInstancePage.
|
|
42
|
+
await (0, test_1.expect)(operateProcessInstancePage.messageVariable).toBeVisible({
|
|
44
43
|
timeout: 60000,
|
|
45
44
|
});
|
|
46
|
-
await (0, test_1.expect)(operateProcessInstancePage.
|
|
45
|
+
await (0, test_1.expect)(operateProcessInstancePage.messageVariable.getByText('"Awesome!"')).toBeVisible({
|
|
47
46
|
timeout: 60000,
|
|
48
47
|
});
|
|
49
48
|
});
|
|
50
49
|
});
|
|
51
|
-
|
|
52
|
-
c8Run_8_7_1.test.skip('REST Connector Basic Auth User Flow', async ({ operateHomePage, operateProcessesPage, operateProcessInstancePage, }) => {
|
|
50
|
+
(0, c8Run_8_7_1.test)('REST Connector Basic Auth User Flow', async ({ operateHomePage, operateProcessesPage, operateProcessInstancePage, }) => {
|
|
53
51
|
await c8Run_8_7_1.test.step('View Process Instance in Operate, assert it completes and assert result expression', async () => {
|
|
54
52
|
await (0, test_1.expect)(operateHomePage.processesTab).toBeVisible({ timeout: 180000 });
|
|
55
53
|
await operateHomePage.clickProcessesTab();
|
|
@@ -64,8 +62,7 @@ c8Run_8_7_1.test.describe('Connectors User Flow Tests', () => {
|
|
|
64
62
|
});
|
|
65
63
|
});
|
|
66
64
|
});
|
|
67
|
-
|
|
68
|
-
c8Run_8_7_1.test.skip('REST Connector Bearer Token Auth User Flow', async ({ operateHomePage, operateProcessInstancePage, operateProcessesPage, }) => {
|
|
65
|
+
(0, c8Run_8_7_1.test)('REST Connector Bearer Token Auth User Flow', async ({ operateHomePage, operateProcessInstancePage, operateProcessesPage, }) => {
|
|
69
66
|
await c8Run_8_7_1.test.step('View Process Instance in Operate, assert it completes and assert result expression', async () => {
|
|
70
67
|
await (0, test_1.expect)(operateHomePage.processesTab).toBeVisible({ timeout: 180000 });
|
|
71
68
|
await operateHomePage.clickProcessesTab();
|
|
@@ -33,20 +33,18 @@ c8Run_8_8_1.test.describe('Connectors User Flow Tests @tasklistV2', () => {
|
|
|
33
33
|
await (0, _setup_1.captureScreenshot)(page, testInfo);
|
|
34
34
|
await (0, _setup_1.captureFailureVideo)(page, testInfo);
|
|
35
35
|
});
|
|
36
|
-
|
|
37
|
-
c8Run_8_8_1.test.skip('REST Connector No Auth User Flow', async ({ page, operateHomePage, operateProcessInstancePage, operateProcessesPage, }) => {
|
|
36
|
+
(0, c8Run_8_8_1.test)('REST Connector No Auth User Flow', async ({ page, operateHomePage, operateProcessInstancePage, operateProcessesPage, }) => {
|
|
38
37
|
await c8Run_8_8_1.test.step('View Process Instance in Operate, assert it completes and assert result expression', async () => {
|
|
39
38
|
await (0, test_1.expect)(operateHomePage.processesTab).toBeVisible({ timeout: 180000 });
|
|
40
39
|
await operateHomePage.clickProcessesTab();
|
|
41
40
|
await operateProcessesPage.clickProcessCompletedCheckbox();
|
|
42
41
|
await operateProcessesPage.clickProcessInstanceLink('REST_Connector_No_Auth_Process');
|
|
43
42
|
await operateProcessInstancePage.completedIconAssertion();
|
|
44
|
-
await (0, UtilitiesPage_1.assertLocatorVisibleWithRetry)(page, operateProcessInstancePage.
|
|
45
|
-
await (0, UtilitiesPage_1.assertLocatorVisibleWithRetry)(page, operateProcessInstancePage.
|
|
43
|
+
await (0, UtilitiesPage_1.assertLocatorVisibleWithRetry)(page, operateProcessInstancePage.messageVariable, 'Message variable');
|
|
44
|
+
await (0, UtilitiesPage_1.assertLocatorVisibleWithRetry)(page, operateProcessInstancePage.messageVariable.getByText('"Awesome!"'), 'Message variable text');
|
|
46
45
|
});
|
|
47
46
|
});
|
|
48
|
-
|
|
49
|
-
c8Run_8_8_1.test.skip('REST Connector Basic Auth User Flow', async ({ page, operateHomePage, operateProcessesPage, operateProcessInstancePage, }) => {
|
|
47
|
+
(0, c8Run_8_8_1.test)('REST Connector Basic Auth User Flow', async ({ page, operateHomePage, operateProcessesPage, operateProcessInstancePage, }) => {
|
|
50
48
|
await c8Run_8_8_1.test.step('View Process Instance in Operate, assert it completes and assert result expression', async () => {
|
|
51
49
|
await (0, test_1.expect)(operateHomePage.processesTab).toBeVisible({ timeout: 180000 });
|
|
52
50
|
await operateHomePage.clickProcessesTab();
|
|
@@ -57,8 +55,7 @@ c8Run_8_8_1.test.describe('Connectors User Flow Tests @tasklistV2', () => {
|
|
|
57
55
|
await (0, UtilitiesPage_1.assertLocatorVisibleWithRetry)(page, operateProcessInstancePage.messageVariable.getByText('"Awesome!"'), 'Status variable text');
|
|
58
56
|
});
|
|
59
57
|
});
|
|
60
|
-
|
|
61
|
-
c8Run_8_8_1.test.skip('REST Connector Bearer Token Auth User Flow', async ({ operateHomePage, operateProcessInstancePage, operateProcessesPage, }) => {
|
|
58
|
+
(0, c8Run_8_8_1.test)('REST Connector Bearer Token Auth User Flow', async ({ operateHomePage, operateProcessInstancePage, operateProcessesPage, }) => {
|
|
62
59
|
await c8Run_8_8_1.test.step('View Process Instance in Operate, assert it completes and assert result expression', async () => {
|
|
63
60
|
await (0, test_1.expect)(operateHomePage.processesTab).toBeVisible({ timeout: 180000 });
|
|
64
61
|
await operateHomePage.clickProcessesTab();
|
|
@@ -43,20 +43,18 @@ c8Run_8_9_1.test.describe('Connectors User Flow Tests @tasklistV2', () => {
|
|
|
43
43
|
await (0, _setup_1.captureScreenshot)(page, testInfo);
|
|
44
44
|
await (0, _setup_1.captureFailureVideo)(page, testInfo);
|
|
45
45
|
});
|
|
46
|
-
|
|
47
|
-
c8Run_8_9_1.test.skip('REST Connector No Auth User Flow', async ({ page, operateHomePage, operateProcessInstancePage, operateProcessesPage, }) => {
|
|
46
|
+
(0, c8Run_8_9_1.test)('REST Connector No Auth User Flow', async ({ page, operateHomePage, operateProcessInstancePage, operateProcessesPage, }) => {
|
|
48
47
|
await c8Run_8_9_1.test.step('View Process Instance in Operate, assert it completes and assert result expression', async () => {
|
|
49
48
|
await (0, test_1.expect)(operateHomePage.processesTab).toBeVisible({ timeout: 180000 });
|
|
50
49
|
await operateHomePage.clickProcessesTab();
|
|
51
50
|
await operateProcessesPage.clickProcessCompletedCheckbox();
|
|
52
51
|
await operateProcessesPage.clickProcessInstanceLink('REST_Connector_No_Auth_Process');
|
|
53
52
|
await operateProcessInstancePage.completedIconAssertion();
|
|
54
|
-
await (0, UtilitiesPage_1.assertLocatorVisibleWithRetry)(page, operateProcessInstancePage.
|
|
55
|
-
await (0, UtilitiesPage_1.assertLocatorVisibleWithRetry)(page, operateProcessInstancePage.
|
|
53
|
+
await (0, UtilitiesPage_1.assertLocatorVisibleWithRetry)(page, operateProcessInstancePage.messageVariable, 'Message variable');
|
|
54
|
+
await (0, UtilitiesPage_1.assertLocatorVisibleWithRetry)(page, operateProcessInstancePage.messageVariable.getByText('"Awesome!"'), 'Message variable text');
|
|
56
55
|
});
|
|
57
56
|
});
|
|
58
|
-
|
|
59
|
-
c8Run_8_9_1.test.skip('REST Connector Basic Auth User Flow', async ({ page, operateHomePage, operateProcessesPage, operateProcessInstancePage, }) => {
|
|
57
|
+
(0, c8Run_8_9_1.test)('REST Connector Basic Auth User Flow', async ({ page, operateHomePage, operateProcessesPage, operateProcessInstancePage, }) => {
|
|
60
58
|
await c8Run_8_9_1.test.step('View Process Instance in Operate, assert it completes and assert result expression', async () => {
|
|
61
59
|
await (0, test_1.expect)(operateHomePage.processesTab).toBeVisible({ timeout: 180000 });
|
|
62
60
|
await operateHomePage.clickProcessesTab();
|
|
@@ -67,8 +65,7 @@ c8Run_8_9_1.test.describe('Connectors User Flow Tests @tasklistV2', () => {
|
|
|
67
65
|
await (0, UtilitiesPage_1.assertLocatorVisibleWithRetry)(page, operateProcessInstancePage.messageVariable.getByText('"Awesome!"'), 'Status variable text');
|
|
68
66
|
});
|
|
69
67
|
});
|
|
70
|
-
|
|
71
|
-
c8Run_8_9_1.test.skip('REST Connector Bearer Token Auth User Flow', async ({ operateHomePage, operateProcessInstancePage, operateProcessesPage, }) => {
|
|
68
|
+
(0, c8Run_8_9_1.test)('REST Connector Bearer Token Auth User Flow', async ({ operateHomePage, operateProcessInstancePage, operateProcessesPage, }) => {
|
|
72
69
|
await c8Run_8_9_1.test.step('View Process Instance in Operate, assert it completes and assert result expression', async () => {
|
|
73
70
|
await (0, test_1.expect)(operateHomePage.processesTab).toBeVisible({ timeout: 180000 });
|
|
74
71
|
await operateHomePage.clickProcessesTab();
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.allConnectorSecrets = exports.connectorSecretsValues = exports.anthropicBedrockMantleSecretsValues = exports.bedrockCodeInterpreterSecretsValues = exports.agentcoreLtmSecretsValues = exports.agentcoreSecretsValues = exports.bedrockKbSecretsValues = exports.azureSecretsValues = exports.gcpSecretsValues = exports.openAiSecretsValues = exports.awsSecretsValues = void 0;
|
|
4
|
+
const constants_1 = require("./constants");
|
|
4
5
|
exports.awsSecretsValues = [
|
|
5
6
|
{ name: 'IDP_AWS_REGION', value: process.env.IDP_AWS_REGION },
|
|
6
7
|
{ name: 'IDP_AWS_BUCKET_NAME', value: process.env.IDP_AWS_BUCKET_NAME },
|
|
@@ -214,7 +215,7 @@ exports.anthropicBedrockMantleSecretsValues = [
|
|
|
214
215
|
exports.connectorSecretsValues = [
|
|
215
216
|
{
|
|
216
217
|
name: 'endpoint_url',
|
|
217
|
-
value:
|
|
218
|
+
value: constants_1.REST_MOCK_BASIC_AUTH_URL,
|
|
218
219
|
},
|
|
219
220
|
{ name: 'username', value: 'username' },
|
|
220
221
|
{ name: 'password', value: 'password' },
|
|
@@ -23,3 +23,5 @@ export declare const TIMEOUT: {
|
|
|
23
23
|
processImport: number;
|
|
24
24
|
optimizeImport: number;
|
|
25
25
|
};
|
|
26
|
+
export declare const REST_MOCK_URL = "https://dummyjson.com/http/200/Awesome!";
|
|
27
|
+
export declare const REST_MOCK_BASIC_AUTH_URL = "https://dummyjson.com/http/200/Message%20from%20Mock!";
|
package/dist/utils/constants.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.TIMEOUT = exports.auditLogAssertionOptions = exports.deletionAssertionOptions = exports.defaultAssertionOptions = exports._3_MINUTES_IN_MS = exports._1_MINUTE_IN_MS = exports._1_SECOND_IN_MS = exports._100_MS = void 0;
|
|
3
|
+
exports.REST_MOCK_BASIC_AUTH_URL = exports.REST_MOCK_URL = exports.TIMEOUT = exports.auditLogAssertionOptions = exports.deletionAssertionOptions = exports.defaultAssertionOptions = exports._3_MINUTES_IN_MS = exports._1_MINUTE_IN_MS = exports._1_SECOND_IN_MS = exports._100_MS = void 0;
|
|
4
4
|
exports._100_MS = 100;
|
|
5
5
|
exports._1_SECOND_IN_MS = 1000;
|
|
6
6
|
exports._1_MINUTE_IN_MS = 60 * 1000;
|
|
@@ -37,3 +37,22 @@ exports.TIMEOUT = {
|
|
|
37
37
|
processImport: 480000,
|
|
38
38
|
optimizeImport: 120000,
|
|
39
39
|
};
|
|
40
|
+
// Public HTTP mock the REST connector flows call. DummyJSON's /http route
|
|
41
|
+
// answers any method with `{"status": <code>, "message": <message>}`, both
|
|
42
|
+
// taken from the URL, so the response body is fixed by the URL alone. It needs
|
|
43
|
+
// no account, no key and has no per-account request quota, which is what made
|
|
44
|
+
// the previous mock (camunda.proxy.beeceptor.com) fail every flow once the
|
|
45
|
+
// Camunda account ran out of quota -- see issue #3673.
|
|
46
|
+
//
|
|
47
|
+
// Neither URL checks credentials, exactly like the Beeceptor rules they
|
|
48
|
+
// replace: the auth flows assert that the connector sends its configured
|
|
49
|
+
// authentication without erroring, not that a server validates it.
|
|
50
|
+
//
|
|
51
|
+
// The two differ only in the message they echo back. Flows that assert
|
|
52
|
+
// "Awesome!" use REST_MOCK_URL; the basic-auth flows assert
|
|
53
|
+
// "Message from Mock!" and use REST_MOCK_BASIC_AUTH_URL.
|
|
54
|
+
//
|
|
55
|
+
// The BPMN files under resources/ carry the same URLs inline, because a
|
|
56
|
+
// diagram cannot import a constant -- keep them in step.
|
|
57
|
+
exports.REST_MOCK_URL = 'https://dummyjson.com/http/200/Awesome!';
|
|
58
|
+
exports.REST_MOCK_BASIC_AUTH_URL = 'https://dummyjson.com/http/200/Message%20from%20Mock!';
|
package/package.json
CHANGED
package/playwright.config.ts
CHANGED
|
@@ -224,6 +224,83 @@ const changedFolders =
|
|
|
224
224
|
? args[changedFoldersArgIndex + 1].split(',')
|
|
225
225
|
: [];
|
|
226
226
|
|
|
227
|
+
// Run-budget guards. See the "A hung test is not an infrastructure failure"
|
|
228
|
+
// note in docs/ci-failure-categories.md, and issue #3115.
|
|
229
|
+
const isSmoke = process.env.IS_SMOKE === 'true';
|
|
230
|
+
|
|
231
|
+
// Reads a numeric env override. An unset, empty, negative or unparseable value
|
|
232
|
+
// returns undefined so the guard falls back to its default rather than being
|
|
233
|
+
// silently switched off by a typo. An explicit 0 is honoured -- Playwright
|
|
234
|
+
// reads 0 as "no limit" for both globalTimeout and maxFailures.
|
|
235
|
+
const numericEnv = (name: string): number | undefined => {
|
|
236
|
+
const raw = process.env[name];
|
|
237
|
+
if (raw === undefined || raw.trim() === '') return undefined;
|
|
238
|
+
const value = Number(raw);
|
|
239
|
+
return Number.isFinite(value) && value >= 0 ? value : undefined;
|
|
240
|
+
};
|
|
241
|
+
|
|
242
|
+
// Without globalTimeout Playwright never stops itself, so one hung test costs
|
|
243
|
+
// `timeout x (retries + 1)` -- 24 minutes at the 12-minute default -- and
|
|
244
|
+
// GitHub SIGKILLs the job at its `timeout-minutes` before any report is
|
|
245
|
+
// written. A run with no report has total_tests == 0, which
|
|
246
|
+
// docs/ci-failure-categories.md classifies as
|
|
247
|
+
// `infrastructure` -- a hung test gets filed as a platform problem and never
|
|
248
|
+
// reaches anyone who can fix it. When Playwright owns the deadline instead it
|
|
249
|
+
// runs its reporters first (runner/tasks.js finishTaskRun calls onEnd on every
|
|
250
|
+
// status), so the run fails with a report naming the stuck test.
|
|
251
|
+
//
|
|
252
|
+
// The budget belongs to the caller: globalTimeout is only correct below the
|
|
253
|
+
// job's `timeout-minutes`, and that differs per workflow. The smoke leg is the
|
|
254
|
+
// one context this file can infer -- the blocking gate with the tightest
|
|
255
|
+
// budget (25 minutes, camunda/camunda-platform-helm
|
|
256
|
+
// .github/workflows/test-integration-runner.yaml), which a single hang already
|
|
257
|
+
// exhausts. Every other caller opts in with C8E2E_GLOBAL_TIMEOUT_MIN. Jobs that
|
|
258
|
+
// declare no `timeout-minutes` (this repo's nightlies, the repeat-each
|
|
259
|
+
// validation loops that run for hours) have no budget to protect, so they keep
|
|
260
|
+
// the unbounded behaviour.
|
|
261
|
+
const SMOKE_GLOBAL_TIMEOUT_MINUTES = 20;
|
|
262
|
+
|
|
263
|
+
const globalTimeout = () => {
|
|
264
|
+
const override = numericEnv('C8E2E_GLOBAL_TIMEOUT_MIN');
|
|
265
|
+
if (override !== undefined) return override * 60 * 1000;
|
|
266
|
+
return isSmoke ? SMOKE_GLOBAL_TIMEOUT_MINUTES * 60 * 1000 : undefined;
|
|
267
|
+
};
|
|
268
|
+
|
|
269
|
+
// The missing fail-fast lever: once the platform is down there is no value in
|
|
270
|
+
// paying the per-test timeout for every remaining test. Smoke is a blocking
|
|
271
|
+
// gate over a single spec, so the first failure is already the answer.
|
|
272
|
+
//
|
|
273
|
+
// Everywhere else the default stays 0 (no limit) on purpose. The nightly triage
|
|
274
|
+
// dispatchers (.github/workflows/triage-nightly-failures*.yml) fan out one fix
|
|
275
|
+
// agent per failing test and docs/ci-failure-categories.md derives
|
|
276
|
+
// failure_category from the full counts, so truncating the failure list would
|
|
277
|
+
// hide work rather than save time. Callers with a real budget set
|
|
278
|
+
// C8E2E_MAX_FAILURES.
|
|
279
|
+
const maxFailures = () => {
|
|
280
|
+
const override = numericEnv('C8E2E_MAX_FAILURES');
|
|
281
|
+
if (override !== undefined) return override;
|
|
282
|
+
return isSmoke ? 1 : 0;
|
|
283
|
+
};
|
|
284
|
+
|
|
285
|
+
// @playwright/test sets the context navigation timeout to 0 -- no limit --
|
|
286
|
+
// whenever `navigationTimeout` is absent (playwright/lib/index.js
|
|
287
|
+
// `_setupContextOptions`: `navigationTimeout || 0`), and TimeoutSettings
|
|
288
|
+
// resolves that 0 before it ever falls through to `actionTimeout`. So today
|
|
289
|
+
// every `goto`, `waitForURL` and `waitForLoadState` call that does not pass its
|
|
290
|
+
// own `timeout` is bounded only by the 12-minute test timeout.
|
|
291
|
+
//
|
|
292
|
+
// That is the hang primitive: `waitForLoadState('networkidle')` waits for 500ms
|
|
293
|
+
// of network silence that never arrives while a backend restarts and clients
|
|
294
|
+
// retry, and the suite has 86 of those calls. Bounding navigation converts a
|
|
295
|
+
// 12-minute stall into a 2-minute failure with a stack trace, without touching
|
|
296
|
+
// the per-test budget that genuinely slow flows rely on.
|
|
297
|
+
//
|
|
298
|
+
// A call that passes its own `timeout` always wins, so nothing bounded today
|
|
299
|
+
// becomes stricter; 120s matches the most generous explicit navigation timeout
|
|
300
|
+
// the suite already uses.
|
|
301
|
+
const NAVIGATION_TIMEOUT_MS =
|
|
302
|
+
numericEnv('C8E2E_NAVIGATION_TIMEOUT_MS') ?? 120 * 1000;
|
|
303
|
+
|
|
227
304
|
const timeout = () => {
|
|
228
305
|
if (process.env.MINOR_VERSION?.includes('SM-8.7')) {
|
|
229
306
|
// OpenSearch indexes more slowly than Elasticsearch — give SM-8.7 the
|
|
@@ -268,6 +345,8 @@ export default defineConfig({
|
|
|
268
345
|
// API specs into a browser project that has none of their environment.
|
|
269
346
|
testIgnore: /[\\/]tests[\\/]api[\\/]/,
|
|
270
347
|
timeout: timeout(),
|
|
348
|
+
globalTimeout: globalTimeout(),
|
|
349
|
+
maxFailures: maxFailures(),
|
|
271
350
|
workers: workerCount(),
|
|
272
351
|
retries: 1,
|
|
273
352
|
fullyParallel: false,
|
|
@@ -275,6 +354,7 @@ export default defineConfig({
|
|
|
275
354
|
use: {
|
|
276
355
|
baseURL: getBaseURL(),
|
|
277
356
|
actionTimeout: 10000,
|
|
357
|
+
navigationTimeout: NAVIGATION_TIMEOUT_MS,
|
|
278
358
|
// Stage 5: trace on-first-retry. With retries=1, a passing-on-retry
|
|
279
359
|
// test (i.e., a flake) leaves a trace from the first attempt — exactly
|
|
280
360
|
// the cases worth debugging. Green runs pay no trace cost.
|
|
@@ -15,13 +15,13 @@
|
|
|
15
15
|
<zeebe:input source="username" target="authentication.username" />
|
|
16
16
|
<zeebe:input source="password" target="authentication.password" />
|
|
17
17
|
<zeebe:input source="GET" target="method" />
|
|
18
|
-
<zeebe:input source="https://
|
|
18
|
+
<zeebe:input source="https://dummyjson.com/http/200/Awesome!" target="url" />
|
|
19
19
|
<zeebe:input source="20" target="connectionTimeoutInSeconds" />
|
|
20
20
|
<zeebe:input source="20" target="readTimeoutInSeconds" />
|
|
21
21
|
</zeebe:ioMapping>
|
|
22
22
|
<zeebe:taskHeaders>
|
|
23
23
|
<zeebe:header key="resultVariable" value="result" />
|
|
24
|
-
<zeebe:header key="resultExpression" value="={message:response.body.
|
|
24
|
+
<zeebe:header key="resultExpression" value="={message:response.body.message}" />
|
|
25
25
|
<zeebe:header key="errorExpression" />
|
|
26
26
|
<zeebe:header key="retryBackoff" value="PT0S" />
|
|
27
27
|
</zeebe:taskHeaders>
|
|
@@ -1041,13 +1041,13 @@
|
|
|
1041
1041
|
<zeebe:properties>
|
|
1042
1042
|
<zeebe:property name="inbound.type" value="io.camunda:http-polling:1" />
|
|
1043
1043
|
<zeebe:property name="authentication.type" value="oauth-client-credentials-flow" />
|
|
1044
|
-
<zeebe:property name="authentication.oauthTokenEndpoint" value="
|
|
1045
|
-
<zeebe:property name="authentication.clientId" value="
|
|
1046
|
-
<zeebe:property name="authentication.clientSecret" value="
|
|
1047
|
-
<zeebe:property name="authentication.clientAuthentication" value="
|
|
1048
|
-
<zeebe:property name="authentication.scopes"
|
|
1044
|
+
<zeebe:property name="authentication.oauthTokenEndpoint" value="=tokenEndpoint" />
|
|
1045
|
+
<zeebe:property name="authentication.clientId" value="=zeebeClientId" />
|
|
1046
|
+
<zeebe:property name="authentication.clientSecret" value="=zeebeSecret" />
|
|
1047
|
+
<zeebe:property name="authentication.clientAuthentication" value="credentialsBody" />
|
|
1048
|
+
<zeebe:property name="authentication.scopes" />
|
|
1049
1049
|
<zeebe:property name="method" value="GET" />
|
|
1050
|
-
<zeebe:property name="url" value="https://
|
|
1050
|
+
<zeebe:property name="url" value="https://dummyjson.com/http/200/Awesome!" />
|
|
1051
1051
|
<zeebe:property name="httpRequestInterval" value="PT15S" />
|
|
1052
1052
|
<zeebe:property name="processPollingInterval" value="PT5S" />
|
|
1053
1053
|
<zeebe:property name="connectionTimeoutInSeconds" value="20" />
|
|
@@ -12,12 +12,12 @@
|
|
|
12
12
|
<zeebe:input source="bearer" target="authentication.type" />
|
|
13
13
|
<zeebe:input source="thisisabearertoken" target="authentication.token" />
|
|
14
14
|
<zeebe:input source="POST" target="method" />
|
|
15
|
-
<zeebe:input source="https://
|
|
15
|
+
<zeebe:input source="https://dummyjson.com/http/200/Awesome!" target="url" />
|
|
16
16
|
<zeebe:input source="20" target="connectionTimeoutInSeconds" />
|
|
17
17
|
<zeebe:input source="20" target="readTimeoutInSeconds" />
|
|
18
18
|
</zeebe:ioMapping>
|
|
19
19
|
<zeebe:taskHeaders>
|
|
20
|
-
<zeebe:header key="resultExpression" value="={message:response.body.
|
|
20
|
+
<zeebe:header key="resultExpression" value="={message:response.body.message}" />
|
|
21
21
|
<zeebe:header key="retryBackoff" value="PT0S" />
|
|
22
22
|
</zeebe:taskHeaders>
|
|
23
23
|
</bpmn:extensionElements>
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
<zeebe:ioMapping>
|
|
12
12
|
<zeebe:input source="noAuth" target="authentication.type" />
|
|
13
13
|
<zeebe:input source="GET" target="method" />
|
|
14
|
-
<zeebe:input source="https://
|
|
14
|
+
<zeebe:input source="https://dummyjson.com/http/200/Awesome!" target="url" />
|
|
15
15
|
<zeebe:input source="20" target="connectionTimeoutInSeconds" />
|
|
16
16
|
<zeebe:input source="20" target="readTimeoutInSeconds" />
|
|
17
17
|
</zeebe:ioMapping>
|