@camunda/e2e-test-suite 0.0.1040 → 0.0.1041

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.
@@ -100,8 +100,19 @@ async function waitForLoginForm(page, loginPage, totalTimeout = 90000, roundTime
100
100
  }
101
101
  throw new Error(`Auth0 login form did not render within ${totalTimeout}ms: ${lastState}`);
102
102
  }
103
+ // Tracks which worker-derived `timeout` values have already paid the
104
+ // stagger sleep below, so a worker only pays it once per process lifetime
105
+ // rather than on every call -- see the comment at the call site.
106
+ const staggeredWorkerTimeouts = new Set();
103
107
  async function loginWithRetry(page, loginPage, testUser, timeout, maxRetries = 5) {
104
108
  let lastError;
109
+ // `timeout` is a stable per-worker identifier (derived from workerIndex),
110
+ // and a worker is a long-lived process across every test/repeat it runs, so
111
+ // the stagger below only needs to happen for that worker's first call in
112
+ // the whole job. A --repeat-each validation pass otherwise pays it on
113
+ // every repeat instead of just the first (team-test-automation#78).
114
+ const isWorkersFirstCall = !staggeredWorkerTimeouts.has(timeout);
115
+ staggeredWorkerTimeouts.add(timeout);
105
116
  for (let attempt = 0; attempt < maxRetries; attempt++) {
106
117
  try {
107
118
  await page.context().clearCookies();
@@ -150,7 +161,9 @@ async function loginWithRetry(page, loginPage, testUser, timeout, maxRetries = 5
150
161
  await page
151
162
  .waitForLoadState('networkidle', { timeout: 30000 })
152
163
  .catch(() => { });
153
- await (0, sleep_1.sleep)(timeout);
164
+ if (isWorkersFirstCall) {
165
+ await (0, sleep_1.sleep)(timeout);
166
+ }
154
167
  await waitForLoginForm(page, loginPage);
155
168
  await loginPage.loginWithTestUser(testUser);
156
169
  return;
@@ -7,11 +7,28 @@ const HomePage_1 = require("./HomePage");
7
7
  const sleep_1 = require("../../utils/sleep");
8
8
  const fileUpload_1 = require("../../utils/fileUpload");
9
9
  const mailSlurpClient_1 = require("../../utils/mailSlurpClient");
10
+ // Tracks which worker-derived `timeout` values have already paid the
11
+ // pre-flight stagger below, so a worker only pays it once per process
12
+ // lifetime rather than on every call -- see the comment at the call sites.
13
+ const staggeredWorkerTimeouts = new Set();
10
14
  async function loginWithRetry(page, loginPage, testUser, timeout, maxRetries = 5, skipOrgAssertion = false) {
15
+ // Callers derive `timeout` as (workerIndex + 1) * 1000, so it's a stable
16
+ // per-worker identifier: a Playwright worker is a long-lived process that
17
+ // calls loginWithRetry once per test/repeat it runs, and this stagger only
18
+ // needs to happen for that worker's FIRST call in the whole job -- by the
19
+ // time it calls again, it's no longer starting simultaneously with anyone
20
+ // else's first call, which is the only scenario the stagger protects
21
+ // against. Without this, a --repeat-each validation pass pays the full
22
+ // stagger on every single repeat instead of once, which is pure dead time
23
+ // on the critical path (team-test-automation#78).
24
+ const isWorkersFirstCall = !staggeredWorkerTimeouts.has(timeout);
25
+ staggeredWorkerTimeouts.add(timeout);
11
26
  // Pre-flight worker stagger: spread the initial Auth0 hits across parallel
12
27
  // workers BEFORE the first goto, otherwise all workers slam the tenant at
13
28
  // the same instant and several get throttled into the retry loop.
14
- await (0, sleep_1.sleep)(timeout);
29
+ if (isWorkersFirstCall) {
30
+ await (0, sleep_1.sleep)(timeout);
31
+ }
15
32
  for (let attempt = 0; attempt < maxRetries; attempt++) {
16
33
  try {
17
34
  await page.context().clearCookies();
@@ -36,7 +53,9 @@ async function loginWithRetry(page, loginPage, testUser, timeout, maxRetries = 5
36
53
  await page
37
54
  .waitForLoadState('networkidle', { timeout: 30000 })
38
55
  .catch(() => { });
39
- await (0, sleep_1.sleep)(timeout);
56
+ if (isWorkersFirstCall) {
57
+ await (0, sleep_1.sleep)(timeout);
58
+ }
40
59
  // Always detect SSO re-auth: after a logout + clearCookies, Auth0 may
41
60
  // silently log the previous user back in without showing the login form.
42
61
  // Force logout until the Auth0 email input appears.
@@ -32,14 +32,26 @@ async function forceLogoutIfNeeded(page) {
32
32
  }
33
33
  }
34
34
  exports.forceLogoutIfNeeded = forceLogoutIfNeeded;
35
+ // Tracks which worker-derived `timeout` values have already paid the
36
+ // pre-flight stagger below, so a worker only pays it once per process
37
+ // lifetime rather than on every call -- see the comment at the call site.
38
+ const staggeredWorkerTimeouts = new Set();
35
39
  async function loginWithRetry(page, loginPage, testUser, timeout, maxRetries = 5) {
36
40
  let lastError;
37
41
  // Stagger the first navigation across parallel workers. Without this, every
38
42
  // worker's initial page.goto('/') fires within the same second -- with 18+
39
43
  // workers logging in at once, that burst is enough to make the navigation
40
44
  // itself time out well before any login form ever renders. Retries already
41
- // back off via randomSleep below, so this only needs to run once.
42
- await (0, sleep_1.sleep)(timeout);
45
+ // back off via randomSleep below, so this only needs to run once -- and,
46
+ // since `timeout` is a stable per-worker identifier (derived from
47
+ // workerIndex) and a worker is a long-lived process across every
48
+ // test/repeat it runs, "once" means once per worker for the whole job, not
49
+ // once per call. A --repeat-each validation pass otherwise pays this on
50
+ // every repeat instead of just the first (team-test-automation#78).
51
+ if (!staggeredWorkerTimeouts.has(timeout)) {
52
+ staggeredWorkerTimeouts.add(timeout);
53
+ await (0, sleep_1.sleep)(timeout);
54
+ }
43
55
  for (let attempt = 0; attempt < maxRetries; attempt++) {
44
56
  try {
45
57
  await page.context().clearCookies();
@@ -8,8 +8,19 @@ const sleep_1 = require("../../utils/sleep");
8
8
  const randomSleep_1 = require("../../utils/randomSleep");
9
9
  const fileUpload_1 = require("../../utils/fileUpload");
10
10
  const mailSlurpClient_1 = require("../../utils/mailSlurpClient");
11
+ // Tracks which worker-derived `timeout` values have already paid the
12
+ // stagger sleep below, so a worker only pays it once per process lifetime
13
+ // rather than on every call -- see the comment at the call site.
14
+ const staggeredWorkerTimeouts = new Set();
11
15
  async function loginWithRetry(page, loginPage, testUser, timeout, maxRetries = 5) {
12
16
  let lastError;
17
+ // `timeout` is a stable per-worker identifier (derived from workerIndex),
18
+ // and a worker is a long-lived process across every test/repeat it runs, so
19
+ // the stagger below only needs to happen for that worker's first call in
20
+ // the whole job. A --repeat-each validation pass otherwise pays it on
21
+ // every repeat instead of just the first (team-test-automation#78).
22
+ const isWorkersFirstCall = !staggeredWorkerTimeouts.has(timeout);
23
+ staggeredWorkerTimeouts.add(timeout);
13
24
  for (let attempt = 0; attempt < maxRetries; attempt++) {
14
25
  try {
15
26
  await page.context().clearCookies();
@@ -34,7 +45,9 @@ async function loginWithRetry(page, loginPage, testUser, timeout, maxRetries = 5
34
45
  await page
35
46
  .waitForLoadState('networkidle', { timeout: 30000 })
36
47
  .catch(() => { });
37
- await (0, sleep_1.sleep)(timeout);
48
+ if (isWorkersFirstCall) {
49
+ await (0, sleep_1.sleep)(timeout);
50
+ }
38
51
  // The identity provider occasionally returns a generic error / rate
39
52
  // limit page that has none of the usual auth controls. Bail out early
40
53
  // when that page is visible so the outer retry can back off.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camunda/e2e-test-suite",
3
- "version": "0.0.1040",
3
+ "version": "0.0.1041",
4
4
  "description": "End-to-end test helpers for Camunda 8",
5
5
  "repository": {
6
6
  "type": "git",