Skip to content

Commit 99388b1

Browse files
fix: flaky auth
1 parent 71729d3 commit 99388b1

4 files changed

Lines changed: 41 additions & 8 deletions

File tree

.github/workflows/test.yml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,4 +38,3 @@ jobs:
3838
fail-fast: false
3939
with:
4040
os: ${{ matrix.os }}
41-
nodeVersion: '20'

package.json

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -104,8 +104,9 @@
104104
"prepack": "sf-prepack",
105105
"prepare": "sf-install",
106106
"test": "wireit",
107-
"test:nuts": "TS_NODE_PROJECT=test/tsconfig.json node -r dotenv/config ./node_modules/.bin/nyc mocha \"**/*.nut.ts\" --slow 4500 --timeout 600000",
108-
"test:nuts:one": "TS_NODE_PROJECT=test/tsconfig.json node -r dotenv/config ./node_modules/.bin/nyc mocha --slow 4500 --timeout 600000",
107+
"test:nuts": "mocha \"**/*.nut.ts\" --slow 4500 --timeout 600000",
108+
"test:nuts:local": "node -r dotenv/config ./node_modules/.bin/nyc mocha \"**/*.nut.ts\" --slow 4500 --timeout 600000",
109+
"test:nut:local": "node -r dotenv/config ./node_modules/.bin/nyc mocha --slow 4500 --timeout 600000",
109110
"test:only": "wireit",
110111
"unlink-lwr": "yarn unlink @lwrjs/api @lwrjs/app-service @lwrjs/asset-registry @lwrjs/asset-transformer @lwrjs/auth-middleware @lwrjs/base-view-provider @lwrjs/base-view-transformer @lwrjs/client-modules @lwrjs/config @lwrjs/core @lwrjs/dev-proxy-server @lwrjs/diagnostics @lwrjs/esbuild @lwrjs/everywhere @lwrjs/fs-asset-provider @lwrjs/fs-watch @lwrjs/html-view-provider @lwrjs/instrumentation @lwrjs/label-module-provider @lwrjs/lambda @lwrjs/legacy-npm-module-provider @lwrjs/loader @lwrjs/lwc-module-provider @lwrjs/lwc-ssr @lwrjs/markdown-view-provider @lwrjs/module-bundler @lwrjs/module-registry @lwrjs/npm-module-provider @lwrjs/nunjucks-view-provider @lwrjs/o11y @lwrjs/resource-registry @lwrjs/router @lwrjs/security @lwrjs/server @lwrjs/shared-utils @lwrjs/static @lwrjs/tools @lwrjs/types @lwrjs/view-registry lwr",
111112
"update-snapshots": "node --loader ts-node/esm --no-warnings=ExperimentalWarning \"./bin/dev.js\" snapshot:generate",

test/commands/lightning/dev/component-preview/hmr.nut.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ describe('lightning preview hot module reload', () => {
118118
let greetingColor;
119119
while (greetingColor !== RED && attempt < maxAttempts) {
120120
// eslint-disable-next-line no-await-in-loop
121-
await page.waitForTimeout(100);
121+
await page.waitForTimeout(500);
122122
// eslint-disable-next-line no-await-in-loop
123123
greetingColor = await greeting.evaluate((e) => window.getComputedStyle(e).color);
124124
attempt++;

test/commands/lightning/dev/helpers/sessionUtils.ts

Lines changed: 37 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,44 @@ import path from 'node:path';
1717
import { TestSession } from '@salesforce/cli-plugins-testkit';
1818
import { PROJECT_PATH } from './utils.js';
1919

20+
const SESSION_RETRIES = 3;
21+
const SESSION_RETRY_DELAY_MS = 5000;
22+
23+
function isJwtAuthError(error: unknown): boolean {
24+
const message = error instanceof Error ? error.message : String(error);
25+
const name = error instanceof Error ? (error.constructor?.name ?? '') : '';
26+
return (
27+
name.includes('Jwt') ||
28+
message.includes('JWT') ||
29+
message.includes('client identifier invalid') ||
30+
message.includes('audience is invalid')
31+
);
32+
}
33+
34+
/**
35+
* Get the session. JWT auth is flaky hence the retries
36+
*
37+
* @returns
38+
*/
2039
export async function getSession(): Promise<TestSession> {
21-
return TestSession.create({
22-
devhubAuthStrategy: 'AUTO',
23-
project: { sourceDir: PROJECT_PATH },
24-
});
40+
let lastError: unknown;
41+
for (let attempt = 1; attempt <= SESSION_RETRIES; attempt++) {
42+
try {
43+
// eslint-disable-next-line no-await-in-loop
44+
return await TestSession.create({
45+
devhubAuthStrategy: 'AUTO',
46+
project: { sourceDir: PROJECT_PATH },
47+
});
48+
} catch (error) {
49+
lastError = error;
50+
if (!isJwtAuthError(error) || attempt === SESSION_RETRIES) {
51+
throw error;
52+
}
53+
// eslint-disable-next-line no-await-in-loop
54+
await new Promise((resolve) => setTimeout(resolve, SESSION_RETRY_DELAY_MS));
55+
}
56+
}
57+
throw lastError;
2558
}
2659

2760
export function getComponentPath(session: TestSession, componentName: string) {

0 commit comments

Comments
 (0)