@spscommerce/e2e-core 2.4.1 → 2.4.3
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/.env +1 -0
- package/Dockerfile +1 -1
- package/Example.test.ts +12 -5
- package/README.md +34 -23
- package/lib/globalSetup.js +10 -13
- package/lib/globalSetup.js.map +1 -1
- package/lib/globalTeardown.js +1 -3
- package/lib/globalTeardown.js.map +1 -1
- package/lib/loggerSetup.js +1 -1
- package/lib/loggerSetup.js.map +1 -1
- package/package.json +4 -3
- package/playwright.config.js +2 -17
- package/src/globalSetup.ts +10 -13
- package/src/globalTeardown.ts +1 -3
- package/src/loggerSetup.ts +1 -1
package/.env
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
BASEURL=https://test.commerce.spscommerce.com/fulfillment/
|
package/Dockerfile
CHANGED
package/Example.test.ts
CHANGED
|
@@ -4,9 +4,11 @@ import { enableLogger, disableLogger } from './src/loggerSetup';
|
|
|
4
4
|
|
|
5
5
|
test.describe('SPS_Example', () => {
|
|
6
6
|
|
|
7
|
+
test.describe.configure({ retries: 1 });
|
|
8
|
+
|
|
7
9
|
test.beforeEach(async ({ page }, testInfo) => {
|
|
8
10
|
process.env.CI && await enableLogger(testInfo.titlePath, page);
|
|
9
|
-
await page.goto(
|
|
11
|
+
await page.goto(`${process.env.BASEURL}`);
|
|
10
12
|
});
|
|
11
13
|
|
|
12
14
|
test.afterEach(async () => {
|
|
@@ -14,16 +16,21 @@ test.describe('SPS_Example', () => {
|
|
|
14
16
|
});
|
|
15
17
|
|
|
16
18
|
test('First_test', async ({ page }) => {
|
|
17
|
-
await page.waitForTimeout(
|
|
19
|
+
await page.waitForTimeout(15000);
|
|
20
|
+
// Use PW async expect: https://playwright.dev/docs/test-assertions
|
|
21
|
+
await expect(
|
|
22
|
+
page,
|
|
23
|
+
`Custom error message.`
|
|
24
|
+
).toHaveURL(`${process.env.BASEURL}`);
|
|
25
|
+
// Use basic Jest expect: https://jestjs.io/docs/using-matchers
|
|
18
26
|
expect(
|
|
19
27
|
true,
|
|
20
28
|
`Custom error message.`
|
|
21
29
|
).toBeTruthy();
|
|
30
|
+
// Use extended Jest expect: https://jest-extended.jestcommunity.dev/docs/matchers
|
|
22
31
|
expectExt(
|
|
23
32
|
[1, 2, 3, 4],
|
|
24
|
-
// false,
|
|
25
33
|
`Custom error message.`
|
|
26
|
-
).toIncludeAllMembers([1,
|
|
34
|
+
).toIncludeAllMembers([1, 5, 3]); // false
|
|
27
35
|
});
|
|
28
|
-
|
|
29
36
|
});
|
package/README.md
CHANGED
|
@@ -24,13 +24,13 @@ EXPECT_TIMEOUT=10000
|
|
|
24
24
|
ACTION_TIMEOUT=45000
|
|
25
25
|
WORKERS=6
|
|
26
26
|
REPO_NAME=fulfillment-ui-v2
|
|
27
|
+
BASEURL=https://test.commerce.spscommerce.com/fulfillment
|
|
27
28
|
VIEWPORT={"width": 1920, "height": 1080}
|
|
28
29
|
```
|
|
29
30
|
| Variable | description | default | possible values |
|
|
30
31
|
| ------------------: | -------------------------------------------------- | ------------------------------ | ------------------------------------ |
|
|
31
32
|
| HEADLESS | launch browser in headless/headful mode | true | true, false |
|
|
32
33
|
| BROWSER | use + as a separator, e.g edge+firefox | chromium | chromium, firefox, webkit, edge |
|
|
33
|
-
| ENV | auth state is invoked for the defined env | test | test, prod |
|
|
34
34
|
| TEST_TIMEOUT | global timeout for each test | 30000 | [number_in_ms] |
|
|
35
35
|
| EXPECT_TIMEOUT | global timeout for each expect | 5000 | [number_in_ms] |
|
|
36
36
|
| ACTION_TIMEOUT | global timeout for each PW action, like click() | 30000 | [number_in_ms] |
|
|
@@ -40,37 +40,48 @@ VIEWPORT={"width": 1920, "height": 1080}
|
|
|
40
40
|
| VIEWPORT | emulates consistent viewport for each page | {"width": 1536, "height": 960} | [string] |
|
|
41
41
|
| CI | used in CI: forbidOnly and maxFailures are applied | false | true, false |
|
|
42
42
|
| SUITE | used in CI: report file name is created per suite | TEST-results.xml | [string] |
|
|
43
|
-
|
|
|
43
|
+
| ENV | invoked auth state environment flag* | test | test, prod |
|
|
44
|
+
| BASEURL | auth state is invoked for the provided url* | - (required) | [string] |
|
|
45
|
+
| TEST_DIR | used in package.json: tests directory path | - (required) | [string] |
|
|
44
46
|
| CONFIG_PATH | used in package.json: .env file path | - | [string] |
|
|
45
|
-
| SETUP_PATH | used in package.json:
|
|
47
|
+
| SETUP_PATH | used in package.json: set sm-th before test start | - | [string] |
|
|
46
48
|
| REPO_NAME | creates GH repo link on test in log files | - | [string] |
|
|
47
49
|
|
|
50
|
+
\* If you have several urls to run your tests for, consider the following possible set up in the SETUP_PATH file instead of providing BASEURL in the .env file:
|
|
51
|
+
```
|
|
52
|
+
const domain = 'commerce.spscommerce.com';
|
|
53
|
+
|
|
54
|
+
process.env.BASEURL = `https://test.${domain}/fulfillment`;
|
|
55
|
+
|
|
56
|
+
if (process.env.ENV) {
|
|
57
|
+
switch (process.env.ENV.toLowerCase()) {
|
|
58
|
+
case 'prod':
|
|
59
|
+
process.env.BASEURL = `https://${domain}/fulfillment`;
|
|
60
|
+
break;
|
|
61
|
+
case 'prodrc':
|
|
62
|
+
process.env.BASEURL = `https://${domain}/fulfillment-rc`;
|
|
63
|
+
break;
|
|
64
|
+
case 'test':
|
|
65
|
+
process.env.BASEURL = `https://test.${domain}/fulfillment`;
|
|
66
|
+
break;
|
|
67
|
+
case 'testrc':
|
|
68
|
+
process.env.BASEURL = `https://test.${domain}/fulfillment-rc`;
|
|
69
|
+
break;
|
|
70
|
+
default:
|
|
71
|
+
process.env.BASEURL = `https://test.${domain}/fulfillment-${process.env.ENV.toLowerCase()}`;
|
|
72
|
+
break;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
```
|
|
76
|
+
It allows to set url for testing via CLI instead of setting it up in .env file. Plus, auth state is invoked only once for test/prod url groups due to ENV logic in the globalSetup.ts file.
|
|
77
|
+
|
|
48
78
|
6. Setup the following "scripts" commands in the `package.json` according to your paths:
|
|
49
79
|
```
|
|
50
80
|
"test": ". .credentials.sh && CONFIG_PATH=$(pwd)/.env SETUP_PATH=$(pwd)/src/helpers/urlSetup.js TEST_DIR=$(pwd) HEADLESS=false playwright test --config=node_modules/@spscommerce/e2e-core/playwright.config.js",
|
|
51
81
|
"test:ci": "CONFIG_PATH=$(pwd)/.env SETUP_PATH=$(pwd)/src/helpers/urlSetup.js TEST_DIR=$(pwd) CI=true playwright test --config=node_modules/@spscommerce/e2e-core/playwright.config.js"
|
|
52
82
|
```
|
|
53
|
-
7. Add your first test file
|
|
54
|
-
```
|
|
55
|
-
import { test } from '@playwright/test';
|
|
56
|
-
import { enableLogger, disableLogger, expect } from '@spscommerce/e2e-core';
|
|
83
|
+
7. Add your first test file (see Example.test.ts file).
|
|
57
84
|
|
|
58
|
-
test.describe('SPS_MyFirstTestSuite', () => {
|
|
59
|
-
|
|
60
|
-
test.beforeEach(async ({}, testInfo) => {
|
|
61
|
-
await enableLogger(testInfo.titlePath, page);
|
|
62
|
-
});
|
|
63
|
-
|
|
64
|
-
test.afterEach(async () => {
|
|
65
|
-
await disableLogger();
|
|
66
|
-
});
|
|
67
|
-
|
|
68
|
-
test('Transactions_is_opened_with_content', async ({ page }) => {
|
|
69
|
-
await page.goto(https://test.commerce.spscommerce.com/);
|
|
70
|
-
await page.waitForTimeout(10000);
|
|
71
|
-
});
|
|
72
|
-
});
|
|
73
|
-
```
|
|
74
85
|
> Attention:
|
|
75
86
|
> Start all the decribe block names with SPS_ prefix. If not, created screenshots and log files won't be attached to an appropriate test.
|
|
76
87
|
|
package/lib/globalSetup.js
CHANGED
|
@@ -39,14 +39,20 @@ async function globalSetup() {
|
|
|
39
39
|
}
|
|
40
40
|
}
|
|
41
41
|
}
|
|
42
|
+
// Set something up once before running auth flow
|
|
43
|
+
if (process.env.SETUP_PATH) {
|
|
44
|
+
if (fs_1.default.existsSync(process.env.SETUP_PATH)) {
|
|
45
|
+
await Promise.resolve().then(() => __importStar(require(process.env.SETUP_PATH)));
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
throw new Error(`Provided SETUP_PATH was not found.`);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
42
51
|
// Invoke auth state if needed
|
|
43
52
|
if (process.env.SKIP_AUTH !== 'true') {
|
|
44
|
-
const domain = 'commerce.spscommerce.com';
|
|
45
|
-
let baseUrl = 'https://test.' + domain;
|
|
46
53
|
let storageFile = path_1.default.join(process.cwd(), `results-e2e/auth/storageStateTest.json`);
|
|
47
54
|
let traceFile = path_1.default.join(process.cwd(), 'results-e2e/auth/globalSetupTest.zip');
|
|
48
55
|
if (process.env.ENV && process.env.ENV.includes('prod')) {
|
|
49
|
-
baseUrl = 'https://' + domain;
|
|
50
56
|
storageFile = path_1.default.join(process.cwd(), `results-e2e/auth/storageStateProd.json`);
|
|
51
57
|
traceFile = path_1.default.join(process.cwd(), 'results-e2e/auth/globalSetupProd.zip');
|
|
52
58
|
}
|
|
@@ -60,7 +66,7 @@ async function globalSetup() {
|
|
|
60
66
|
await context.tracing.start({ screenshots: true, snapshots: true });
|
|
61
67
|
const page = await context.newPage();
|
|
62
68
|
try {
|
|
63
|
-
await page.goto(
|
|
69
|
+
await page.goto(process.env.BASEURL);
|
|
64
70
|
await page.waitForURL(/https:\/\/auth.*/);
|
|
65
71
|
await page.fill('input[type="email"]', process.env.USER_EMAIL);
|
|
66
72
|
await page.click('button#btn-next');
|
|
@@ -83,15 +89,6 @@ async function globalSetup() {
|
|
|
83
89
|
}
|
|
84
90
|
}
|
|
85
91
|
}
|
|
86
|
-
// Set something up once before running all tests
|
|
87
|
-
if (process.env.SETUP_PATH) {
|
|
88
|
-
if (fs_1.default.existsSync(process.env.SETUP_PATH)) {
|
|
89
|
-
await Promise.resolve().then(() => __importStar(require(process.env.SETUP_PATH)));
|
|
90
|
-
}
|
|
91
|
-
else {
|
|
92
|
-
throw new Error(`${process.env.SETUP_PATH} not found.`);
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
92
|
return;
|
|
96
93
|
}
|
|
97
94
|
exports.default = globalSetup;
|
package/lib/globalSetup.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"globalSetup.js","sourceRoot":"","sources":["../src/globalSetup.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,4CAAoB;AACpB,gDAAwB;AACxB,2CAA4C;AAE7B,KAAK,UAAU,WAAW;IACrC,kEAAkE;IAClE,MAAM,aAAa,GAAG,cAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,cAAc,CAAC,CAAC;IAC/D,IAAI,YAAE,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE;QAC9B,KAAK,MAAM,SAAS,IAAI,YAAE,CAAC,WAAW,CAAC,aAAa,CAAC,EAAE;YACnD,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE;gBAAE,YAAE,CAAC,MAAM,CAAC,aAAa,GAAG,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;aAAE;SAC/G;KACJ;IACD,
|
|
1
|
+
{"version":3,"file":"globalSetup.js","sourceRoot":"","sources":["../src/globalSetup.ts"],"names":[],"mappings":"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"}
|
package/lib/globalTeardown.js
CHANGED
|
@@ -22,9 +22,7 @@ async function globalTeardown() {
|
|
|
22
22
|
.join('_')
|
|
23
23
|
.replace('_', ' ');
|
|
24
24
|
const newFilePath = `${newFolder}/${newFile}.${oldFile.split('.').pop()}`;
|
|
25
|
-
|
|
26
|
-
fs_1.default.copyFileSync(oldFilePath, newFilePath);
|
|
27
|
-
}
|
|
25
|
+
fs_1.default.copyFileSync(oldFilePath, newFilePath);
|
|
28
26
|
}
|
|
29
27
|
}
|
|
30
28
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"globalTeardown.js","sourceRoot":"","sources":["../src/globalTeardown.ts"],"names":[],"mappings":";;;;;AAAA,4CAAoB;AACpB,gDAAwB;AACxB,mFAA6C;AAE9B,KAAK,UAAU,cAAc;IACxC,MAAM,mBAAmB,GAAG,8BAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAA0B,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9F,MAAM,SAAS,GAAG,cAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,kBAAkB,CAAC,CAAC;IAC/D,MAAM,SAAS,GAAG,cAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,0BAA0B,CAAC,CAAC;IACvE,YAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7C,IAAI,YAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE;QAC1B,KAAK,MAAM,YAAY,IAAI,YAAE,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE;YAClD,KAAK,MAAM,OAAO,IAAI,YAAE,CAAC,WAAW,CAAC,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC,EAAE;gBACtE,MAAM,WAAW,GAAG,GAAG,SAAS,IAAI,YAAY,IAAI,OAAO,EAAE,CAAC;gBAC9D,MAAM,OAAO,GAAG,MAAM,GAAG,YAAY;qBAChC,SAAS,CAAC,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;qBAC1C,KAAK,CAAC,GAAG,CAAC;qBACV,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;qBACrE,IAAI,CAAC,GAAG,CAAC;qBACT,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;gBACvB,MAAM,WAAW,GAAG,GAAG,SAAS,IAAI,OAAO,IAAI,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC;gBAC1E,
|
|
1
|
+
{"version":3,"file":"globalTeardown.js","sourceRoot":"","sources":["../src/globalTeardown.ts"],"names":[],"mappings":";;;;;AAAA,4CAAoB;AACpB,gDAAwB;AACxB,mFAA6C;AAE9B,KAAK,UAAU,cAAc;IACxC,MAAM,mBAAmB,GAAG,8BAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAA0B,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9F,MAAM,SAAS,GAAG,cAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,kBAAkB,CAAC,CAAC;IAC/D,MAAM,SAAS,GAAG,cAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,0BAA0B,CAAC,CAAC;IACvE,YAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7C,IAAI,YAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE;QAC1B,KAAK,MAAM,YAAY,IAAI,YAAE,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE;YAClD,KAAK,MAAM,OAAO,IAAI,YAAE,CAAC,WAAW,CAAC,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC,EAAE;gBACtE,MAAM,WAAW,GAAG,GAAG,SAAS,IAAI,YAAY,IAAI,OAAO,EAAE,CAAC;gBAC9D,MAAM,OAAO,GAAG,MAAM,GAAG,YAAY;qBAChC,SAAS,CAAC,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;qBAC1C,KAAK,CAAC,GAAG,CAAC;qBACV,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;qBACrE,IAAI,CAAC,GAAG,CAAC;qBACT,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;gBACvB,MAAM,WAAW,GAAG,GAAG,SAAS,IAAI,OAAO,IAAI,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC;gBAC1E,YAAE,CAAC,YAAY,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;aAC7C;SACJ;KACJ;IACD,OAAO;AACX,CAAC;AArBD,iCAqBC"}
|
package/lib/loggerSetup.js
CHANGED
|
@@ -40,7 +40,7 @@ async function enableLogger(file, page) {
|
|
|
40
40
|
})
|
|
41
41
|
.on('requestfailed', request => console.log(`--Failed-request--${request.failure().errorText}: ${request.url()}`))
|
|
42
42
|
.on("pageerror", (err) => {
|
|
43
|
-
console.log(`--Page-error--${err.message}`);
|
|
43
|
+
console.log(`--Page-error--${JSON.stringify(err.message)}`);
|
|
44
44
|
})
|
|
45
45
|
.on('response', (response) => {
|
|
46
46
|
if (response.status() >= 400) {
|
package/lib/loggerSetup.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loggerSetup.js","sourceRoot":"","sources":["../src/loggerSetup.ts"],"names":[],"mappings":";;;;;;AAAA,4CAAoB;AACpB,gDAAwB;AAGxB,IAAI,MAAsB,CAAC;AAEpB,KAAK,UAAU,YAAY,CAAC,IAAc,EAAE,IAAU;IACzD,QAAQ;IACR,IAAI;IACJ,8CAA8C;IAC9C,0CAA0C;IAC1C,yBAAyB;IACzB,4DAA4D;IAC5D,IAAI;IACJ,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACtB,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;IAC/B,MAAM,QAAQ,GAAG,GAAG,KAAK,IAAI,IAAI,EAAE,CAAC;IACpC,MAAM,eAAe,GAAG,cAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,kBAAkB,CAAC,CAAC;IAErE,2CAA2C;IAC3C,YAAE,CAAC,SAAS,CAAC,eAAe,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAEnD,kDAAkD;IAClD,MAAM,GAAG,YAAE,CAAC,iBAAiB,CAAC,GAAG,eAAe,IAAI,QAAQ,MAAM,CAAC,CAAA;IACnE,OAAO,CAAC,MAAM,CAAC,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAExE,wFAAwF;IACxF,OAAO,CAAC,GAAG,CAAC;qCACqB,OAAO,CAAC,GAAG,CAAC,SAAS,aAAa,IAAI,EAAE,CAAC,CAAC;IAE3E,oBAAoB;IACpB,IAAI;SACC,EAAE,CAAC,SAAS,EAAE,KAAK,EAAC,OAAO,EAAC,EAAE;QAC3B,IAAI,OAAO,CAAC,IAAI,EAAE,KAAK,OAAO,EAAE;YAC5B,IAAI,OAAO,CAAC,IAAI,EAAE,KAAK,gBAAgB,EAAE;gBACrC,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,IAAI,EAAE;oBAC5B,OAAO,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC;aAC1C;YACD,OAAO,CAAC,GAAG,CAAC,kBAAkB,OAAO,CAAC,IAAI,EAAE,KAAK,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;SACtE;IACL,CAAC,CAAC;SACD,EAAE,CAAC,eAAe,EAAE,OAAO,CAAC,EAAE,CAC3B,OAAO,CAAC,GAAG,CAAC,qBAAqB,OAAO,CAAC,OAAO,EAAE,CAAC,SAAS,KAAK,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;SACrF,EAAE,CAAC,WAAW,EAAE,CAAC,GAAG,EAAE,EAAE;QACrB,OAAO,CAAC,GAAG,CAAC,iBAAiB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAA;IAC/
|
|
1
|
+
{"version":3,"file":"loggerSetup.js","sourceRoot":"","sources":["../src/loggerSetup.ts"],"names":[],"mappings":";;;;;;AAAA,4CAAoB;AACpB,gDAAwB;AAGxB,IAAI,MAAsB,CAAC;AAEpB,KAAK,UAAU,YAAY,CAAC,IAAc,EAAE,IAAU;IACzD,QAAQ;IACR,IAAI;IACJ,8CAA8C;IAC9C,0CAA0C;IAC1C,yBAAyB;IACzB,4DAA4D;IAC5D,IAAI;IACJ,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACtB,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;IAC/B,MAAM,QAAQ,GAAG,GAAG,KAAK,IAAI,IAAI,EAAE,CAAC;IACpC,MAAM,eAAe,GAAG,cAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,kBAAkB,CAAC,CAAC;IAErE,2CAA2C;IAC3C,YAAE,CAAC,SAAS,CAAC,eAAe,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAEnD,kDAAkD;IAClD,MAAM,GAAG,YAAE,CAAC,iBAAiB,CAAC,GAAG,eAAe,IAAI,QAAQ,MAAM,CAAC,CAAA;IACnE,OAAO,CAAC,MAAM,CAAC,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAExE,wFAAwF;IACxF,OAAO,CAAC,GAAG,CAAC;qCACqB,OAAO,CAAC,GAAG,CAAC,SAAS,aAAa,IAAI,EAAE,CAAC,CAAC;IAE3E,oBAAoB;IACpB,IAAI;SACC,EAAE,CAAC,SAAS,EAAE,KAAK,EAAC,OAAO,EAAC,EAAE;QAC3B,IAAI,OAAO,CAAC,IAAI,EAAE,KAAK,OAAO,EAAE;YAC5B,IAAI,OAAO,CAAC,IAAI,EAAE,KAAK,gBAAgB,EAAE;gBACrC,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,IAAI,EAAE;oBAC5B,OAAO,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC;aAC1C;YACD,OAAO,CAAC,GAAG,CAAC,kBAAkB,OAAO,CAAC,IAAI,EAAE,KAAK,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;SACtE;IACL,CAAC,CAAC;SACD,EAAE,CAAC,eAAe,EAAE,OAAO,CAAC,EAAE,CAC3B,OAAO,CAAC,GAAG,CAAC,qBAAqB,OAAO,CAAC,OAAO,EAAE,CAAC,SAAS,KAAK,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;SACrF,EAAE,CAAC,WAAW,EAAE,CAAC,GAAG,EAAE,EAAE;QACrB,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;IAC/D,CAAC,CAAC;SACD,EAAE,CAAC,UAAU,EAAE,CAAC,QAAQ,EAAE,EAAE;QACzB,IAAI,QAAQ,CAAC,MAAM,EAAE,IAAI,GAAG,EAAE;YAC1B,OAAO,CAAC,GAAG,CAAC,uBAAuB,QAAQ,CAAC,MAAM,EAAE,KAAK,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;SAC9E;IACL,CAAC,CAAC,CAAA;IACN,OAAO;AACX,CAAC;AA9CD,oCA8CC;AAEM,KAAK,UAAU,aAAa;IAC/B,uBAAuB;IACvB,MAAM,IAAI,MAAM,CAAC,GAAG,EAAE,CAAC;IACvB,OAAO;AACX,CAAC;AAJD,sCAIC;AAEY,QAAA,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@spscommerce/e2e-core",
|
|
3
|
-
"version": "2.4.
|
|
3
|
+
"version": "2.4.3",
|
|
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
7
|
"scripts": {
|
|
8
8
|
"lint": "eslint .",
|
|
9
|
-
"build": "tsc --incremental -p tsconfig.json"
|
|
9
|
+
"build": "tsc --incremental -p tsconfig.json",
|
|
10
|
+
"test": "CONFIG_PATH=$(pwd)/.env npx playwright test"
|
|
10
11
|
},
|
|
11
12
|
"repository": {
|
|
12
13
|
"type": "git",
|
|
@@ -24,7 +25,7 @@
|
|
|
24
25
|
"author": "SPS Commerce",
|
|
25
26
|
"license": "UNLICENSED",
|
|
26
27
|
"dependencies": {
|
|
27
|
-
"@playwright/test": "1.
|
|
28
|
+
"@playwright/test": "1.29.0",
|
|
28
29
|
"@typescript-eslint/eslint-plugin": "5.30.0",
|
|
29
30
|
"@typescript-eslint/parser": "5.30.0",
|
|
30
31
|
"dotenv": "16.0.3",
|
package/playwright.config.js
CHANGED
|
@@ -14,7 +14,6 @@ switch (process.env.BROWSER) {
|
|
|
14
14
|
case 'firefox':
|
|
15
15
|
browserProject = [{
|
|
16
16
|
name: 'firefox',
|
|
17
|
-
testIgnore: /.*Inventory.*/,
|
|
18
17
|
testMatch: /.*(test|spec)\.(js|ts|mjs)/,
|
|
19
18
|
use: {
|
|
20
19
|
...devices['Desktop Firefox'],
|
|
@@ -26,7 +25,6 @@ switch (process.env.BROWSER) {
|
|
|
26
25
|
case 'webkit':
|
|
27
26
|
browserProject = [{
|
|
28
27
|
name: 'webkit',
|
|
29
|
-
testIgnore: /.*Inventory.*/,
|
|
30
28
|
testMatch: /.*(test|spec)\.(js|ts|mjs)/,
|
|
31
29
|
use: {
|
|
32
30
|
...devices['Desktop Safari'],
|
|
@@ -38,7 +36,6 @@ switch (process.env.BROWSER) {
|
|
|
38
36
|
case 'edge':
|
|
39
37
|
browserProject = [{
|
|
40
38
|
name: 'msedge',
|
|
41
|
-
testIgnore: /.*Inventory.*/,
|
|
42
39
|
testMatch: /.*(test|spec)\.(js|ts|mjs)/,
|
|
43
40
|
use: {
|
|
44
41
|
channel: 'msedge',
|
|
@@ -51,7 +48,6 @@ switch (process.env.BROWSER) {
|
|
|
51
48
|
default:
|
|
52
49
|
browserProject = [{
|
|
53
50
|
name: 'chromium',
|
|
54
|
-
testIgnore: /.*Inventory.*/,
|
|
55
51
|
testMatch: /.*(test|spec)\.(js|ts|mjs)/,
|
|
56
52
|
use: {
|
|
57
53
|
channel: 'chrome',
|
|
@@ -62,19 +58,6 @@ switch (process.env.BROWSER) {
|
|
|
62
58
|
}];
|
|
63
59
|
break;
|
|
64
60
|
}
|
|
65
|
-
// Added a specific no-retry suite workaround till the following request is done
|
|
66
|
-
// https://github.com/microsoft/playwright/issues/10825
|
|
67
|
-
browserProject.push(
|
|
68
|
-
{
|
|
69
|
-
name: 'Inventory',
|
|
70
|
-
testMatch: /.*Inventory.*(test|spec)\.(js|ts|mjs)/,
|
|
71
|
-
retries: 0,
|
|
72
|
-
use: {
|
|
73
|
-
...devices['Desktop Firefox'],
|
|
74
|
-
userAgent: devices['Desktop Firefox'].userAgent + ' SPS auto test run',
|
|
75
|
-
viewport: customViewport,
|
|
76
|
-
},
|
|
77
|
-
})
|
|
78
61
|
|
|
79
62
|
const storageStatePath = process.env.ENV && process.env.ENV.includes('prod')
|
|
80
63
|
? path.join(process.cwd(), 'results-e2e/auth/storageStateProd.json')
|
|
@@ -119,6 +102,8 @@ const config = {
|
|
|
119
102
|
actionTimeout: +process.env.ACTION_TIMEOUT || 30000,
|
|
120
103
|
/* Collect screenshot after each test failure. See https://playwright.dev/docs/test-configuration#automatic-screenshots */
|
|
121
104
|
screenshot: 'only-on-failure',
|
|
105
|
+
/* Record video only when retrying a test for the first time. See https://playwright.dev/docs/test-configuration#automatic-screenshots */
|
|
106
|
+
video: 'on-first-retry',
|
|
122
107
|
/* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */
|
|
123
108
|
trace: process.env.TRACER && (process.env.TRACER.toString().toLowerCase() === 'true') ? 'retain-on-failure' : 'off',
|
|
124
109
|
/* Run in headless mode by default (if process.env.HEADLESS is not specified) */
|
package/src/globalSetup.ts
CHANGED
|
@@ -10,15 +10,20 @@ export default async function globalSetup(): Promise<void> {
|
|
|
10
10
|
if (!subFolder.includes('auth')) { fs.rmSync(resultsFolder + subFolder, { recursive: true, force: true }); }
|
|
11
11
|
}
|
|
12
12
|
}
|
|
13
|
+
// Set something up once before running auth flow
|
|
14
|
+
if (process.env.SETUP_PATH) {
|
|
15
|
+
if (fs.existsSync(process.env.SETUP_PATH)) {
|
|
16
|
+
await import(process.env.SETUP_PATH);
|
|
17
|
+
} else {
|
|
18
|
+
throw new Error(`Provided SETUP_PATH was not found.`);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
13
21
|
// Invoke auth state if needed
|
|
14
22
|
if (process.env.SKIP_AUTH !== 'true') {
|
|
15
|
-
const domain = 'commerce.spscommerce.com';
|
|
16
|
-
let baseUrl = 'https://test.' + domain;
|
|
17
23
|
let storageFile = path.join(process.cwd(), `results-e2e/auth/storageStateTest.json`);
|
|
18
24
|
let traceFile = path.join(process.cwd(), 'results-e2e/auth/globalSetupTest.zip');
|
|
19
|
-
|
|
25
|
+
|
|
20
26
|
if (process.env.ENV && process.env.ENV.includes('prod')) {
|
|
21
|
-
baseUrl = 'https://' + domain;
|
|
22
27
|
storageFile = path.join(process.cwd(), `results-e2e/auth/storageStateProd.json`);
|
|
23
28
|
traceFile = path.join(process.cwd(), 'results-e2e/auth/globalSetupProd.zip');
|
|
24
29
|
}
|
|
@@ -33,7 +38,7 @@ export default async function globalSetup(): Promise<void> {
|
|
|
33
38
|
await context.tracing.start({ screenshots: true, snapshots: true });
|
|
34
39
|
const page = await context.newPage();
|
|
35
40
|
try {
|
|
36
|
-
await page.goto(
|
|
41
|
+
await page.goto(process.env.BASEURL);
|
|
37
42
|
await page.waitForURL(/https:\/\/auth.*/);
|
|
38
43
|
await page.fill('input[type="email"]', process.env.USER_EMAIL);
|
|
39
44
|
await page.click('button#btn-next');
|
|
@@ -54,13 +59,5 @@ export default async function globalSetup(): Promise<void> {
|
|
|
54
59
|
}
|
|
55
60
|
}
|
|
56
61
|
}
|
|
57
|
-
// Set something up once before running all tests
|
|
58
|
-
if (process.env.SETUP_PATH) {
|
|
59
|
-
if (fs.existsSync(process.env.SETUP_PATH)) {
|
|
60
|
-
await import(process.env.SETUP_PATH);
|
|
61
|
-
} else {
|
|
62
|
-
throw new Error(`${process.env.SETUP_PATH} not found.`);
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
62
|
return;
|
|
66
63
|
}
|
package/src/globalTeardown.ts
CHANGED
|
@@ -18,9 +18,7 @@ export default async function globalTeardown(): Promise<void> {
|
|
|
18
18
|
.join('_')
|
|
19
19
|
.replace('_', ' ');
|
|
20
20
|
const newFilePath = `${newFolder}/${newFile}.${oldFile.split('.').pop()}`;
|
|
21
|
-
|
|
22
|
-
fs.copyFileSync(oldFilePath, newFilePath);
|
|
23
|
-
}
|
|
21
|
+
fs.copyFileSync(oldFilePath, newFilePath);
|
|
24
22
|
}
|
|
25
23
|
}
|
|
26
24
|
}
|
package/src/loggerSetup.ts
CHANGED
|
@@ -42,7 +42,7 @@ export async function enableLogger(file: string[], page: Page): Promise<void> {
|
|
|
42
42
|
.on('requestfailed', request =>
|
|
43
43
|
console.log(`--Failed-request--${request.failure().errorText}: ${request.url()}`))
|
|
44
44
|
.on("pageerror", (err) => {
|
|
45
|
-
console.log(`--Page-error--${err.message}`)
|
|
45
|
+
console.log(`--Page-error--${JSON.stringify(err.message)}`)
|
|
46
46
|
})
|
|
47
47
|
.on('response', (response) => {
|
|
48
48
|
if (response.status() >= 400) {
|