@spscommerce/e2e-core 2.8.0 → 2.9.0
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/.dockerignore +1 -0
- package/Dockerfile +2 -2
- package/lib/globalSetup.js +16 -4
- package/lib/globalSetup.js.map +1 -1
- package/package.json +14 -9
- package/pnpm-workspace.yaml +1 -0
- package/src/globalSetup.ts +18 -5
package/.dockerignore
CHANGED
package/Dockerfile
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
FROM mcr.microsoft.com/playwright:v1.
|
|
1
|
+
FROM mcr.microsoft.com/playwright:v1.58.2-noble
|
|
2
2
|
|
|
3
3
|
ARG BROWSER
|
|
4
4
|
|
|
5
5
|
RUN mkdir e2e
|
|
6
6
|
WORKDIR /e2e
|
|
7
7
|
COPY . .
|
|
8
|
-
RUN corepack enable && corepack prepare pnpm@10.
|
|
8
|
+
RUN corepack enable && corepack prepare pnpm@10.32.1 --activate
|
|
9
9
|
RUN pnpm i
|
|
10
10
|
RUN if [ "$BROWSER" = "edge" ]; then npx playwright install msedge --only-shell ; fi
|
|
11
11
|
RUN if [ "$BROWSER" = "chrome" ]; then npx playwright install chrome --only-shell ; fi
|
package/lib/globalSetup.js
CHANGED
|
@@ -68,10 +68,22 @@ async function globalSetup() {
|
|
|
68
68
|
traceFile = path_1.default.join(process.cwd(), 'results-e2e/auth/globalSetupProd.zip');
|
|
69
69
|
}
|
|
70
70
|
// Launch browser and log in if storageState.json does not exist OR auth expires soon
|
|
71
|
-
|
|
72
|
-
if (!fs_1.default.existsSync(storageFile)
|
|
73
|
-
|
|
74
|
-
|
|
71
|
+
let requireAuth = false;
|
|
72
|
+
if (!fs_1.default.existsSync(storageFile)) {
|
|
73
|
+
requireAuth = true;
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
const storage = JSON.parse(fs_1.default.readFileSync(storageFile, 'utf8'));
|
|
77
|
+
const openIdProfile = storage.origins[0].localStorage.find(item => item.name.includes('openid profile email offline_access'));
|
|
78
|
+
const openIdData = JSON.parse(openIdProfile.value);
|
|
79
|
+
const expiresAt = (parseFloat(openIdData.expiresAt) || 0) * 1000; // identity refresh token lives 1 hour
|
|
80
|
+
const currentTS = new Date().getTime();
|
|
81
|
+
if (((expiresAt - currentTS) / 60000) < 10) {
|
|
82
|
+
// less than 10 minutes
|
|
83
|
+
requireAuth = true;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
if (requireAuth) {
|
|
75
87
|
const browser = await test_1.chromium.launch({ headless: false }); // { headless: false }
|
|
76
88
|
const context = await browser.newContext({ ignoreHTTPSErrors: true });
|
|
77
89
|
await context.grantPermissions(['local-network-access']);
|
package/lib/globalSetup.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"globalSetup.js","sourceRoot":"","sources":["../src/globalSetup.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAIA,
|
|
1
|
+
{"version":3,"file":"globalSetup.js","sourceRoot":"","sources":["../src/globalSetup.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,10 +1,15 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@spscommerce/e2e-core",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.9.0",
|
|
4
4
|
"description": "An automation test framework which is based on Playwright.",
|
|
5
5
|
"main": "./lib/index.js",
|
|
6
6
|
"types": "./lib/index.d.ts",
|
|
7
|
+
"engines": {
|
|
8
|
+
"node": ">=24"
|
|
9
|
+
},
|
|
7
10
|
"scripts": {
|
|
11
|
+
"clean": "find . -name 'node_modules' -type d -prune -exec rm -rf '{}' + && wait && rm -rf ./build",
|
|
12
|
+
"reset": "pnpm clean && pnpm store prune",
|
|
8
13
|
"lint": "eslint .",
|
|
9
14
|
"build": "tsc --incremental -p tsconfig.json",
|
|
10
15
|
"test": "CONFIG_PATH=$(pwd)/.env HEADLESS=false playwright test",
|
|
@@ -26,23 +31,23 @@
|
|
|
26
31
|
"author": "SPS Commerce",
|
|
27
32
|
"license": "UNLICENSED",
|
|
28
33
|
"dependencies": {
|
|
29
|
-
"@playwright/test": "1.
|
|
34
|
+
"@playwright/test": "1.58.2",
|
|
30
35
|
"@types/node": "25.0.6",
|
|
31
36
|
"@typescript-eslint/eslint-plugin": "8.49.0",
|
|
32
37
|
"@typescript-eslint/parser": "8.49.0",
|
|
33
|
-
"dotenv": "17.
|
|
34
|
-
"eslint": "9.39.
|
|
38
|
+
"dotenv": "17.3.1",
|
|
39
|
+
"eslint": "9.39.4",
|
|
35
40
|
"jest-expect-message": "1.1.3",
|
|
36
41
|
"jest-extended": "1.2.1",
|
|
37
42
|
"playwright-testrail-reporter": "1.3.3",
|
|
38
43
|
"typescript": "5.9.3"
|
|
39
44
|
},
|
|
40
|
-
"packageManager": "pnpm@10.
|
|
45
|
+
"packageManager": "pnpm@10.32.1+sha512.a706938f0e89ac1456b6563eab4edf1d1faf3368d1191fc5c59790e96dc918e4456ab2e67d613de1043d2e8c81f87303e6b40d4ffeca9df15ef1ad567348f2be",
|
|
41
46
|
"devDependencies": {
|
|
42
|
-
"@commitlint/cli": "
|
|
43
|
-
"@commitlint/config-conventional": "
|
|
44
|
-
"husky": "
|
|
45
|
-
"lint-staged": "
|
|
47
|
+
"@commitlint/cli": "20.5.0",
|
|
48
|
+
"@commitlint/config-conventional": "20.5.0",
|
|
49
|
+
"husky": "9.1.7",
|
|
50
|
+
"lint-staged": "16.4.0"
|
|
46
51
|
},
|
|
47
52
|
"lint-staged": {
|
|
48
53
|
"*.ts": [
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
nodeLinker: hoisted
|
package/src/globalSetup.ts
CHANGED
|
@@ -28,11 +28,24 @@ export default async function globalSetup(): Promise<void> {
|
|
|
28
28
|
traceFile = path.join(process.cwd(), 'results-e2e/auth/globalSetupProd.zip');
|
|
29
29
|
}
|
|
30
30
|
// Launch browser and log in if storageState.json does not exist OR auth expires soon
|
|
31
|
-
|
|
32
|
-
if (!fs.existsSync(storageFile)
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
31
|
+
let requireAuth = false;
|
|
32
|
+
if (!fs.existsSync(storageFile)) {
|
|
33
|
+
requireAuth = true;
|
|
34
|
+
} else {
|
|
35
|
+
const storage = JSON.parse(fs.readFileSync(storageFile, 'utf8'));
|
|
36
|
+
const openIdProfile = storage.origins[0].localStorage.find(item =>
|
|
37
|
+
item.name.includes('openid profile email offline_access'),
|
|
38
|
+
);
|
|
39
|
+
const openIdData = JSON.parse(openIdProfile.value);
|
|
40
|
+
const expiresAt = (parseFloat(openIdData.expiresAt) || 0) * 1000; // identity refresh token lives 1 hour
|
|
41
|
+
const currentTS = new Date().getTime();
|
|
42
|
+
if (((expiresAt - currentTS) / 60000) < 10) {
|
|
43
|
+
// less than 10 minutes
|
|
44
|
+
requireAuth = true;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
if (requireAuth) {
|
|
36
49
|
const browser = await chromium.launch({ headless: false }); // { headless: false }
|
|
37
50
|
const context = await browser.newContext({ ignoreHTTPSErrors: true });
|
|
38
51
|
await context.grantPermissions(['local-network-access']);
|