@spscommerce/e2e-core 2.4.2 → 2.4.4

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 ADDED
@@ -0,0 +1 @@
1
+ BASEURL=https://localhost:9300/
package/Example.test.ts CHANGED
@@ -3,10 +3,12 @@ import expectExt from './src/matchersSetup';
3
3
  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(`https://test.commerce.spscommerce.com/fulfillment/`);
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(10000);
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, 5, 3]);
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
- | TEST_DIR | used in package.json: tests directory path | - | [string] |
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: globalSetup.js file path | - | [string] |
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
 
@@ -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
  }
@@ -56,11 +62,11 @@ async function globalSetup() {
56
62
  (fs_1.default.existsSync(storageFile) &&
57
63
  ((JSON.parse(fs_1.default.readFileSync(storageFile, 'utf8')).origins[0].localStorage.find(o => o.name === 'expires_at').value - currentTS) / 60000) < 30)) {
58
64
  const browser = await test_1.chromium.launch({ headless: false }); // { headless: false }
59
- const context = await browser.newContext();
65
+ const context = await browser.newContext({ ignoreHTTPSErrors: true });
60
66
  await context.tracing.start({ screenshots: true, snapshots: true });
61
67
  const page = await context.newPage();
62
68
  try {
63
- await page.goto(baseUrl);
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;
@@ -1 +1 @@
1
- {"version":3,"file":"globalSetup.js","sourceRoot":"","sources":["../src/globalSetup.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"globalSetup.js","sourceRoot":"","sources":["../src/globalSetup.ts"],"names":[],"mappings":"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"}
@@ -22,9 +22,7 @@ async function globalTeardown() {
22
22
  .join('_')
23
23
  .replace('_', ' ');
24
24
  const newFilePath = `${newFolder}/${newFile}.${oldFile.split('.').pop()}`;
25
- if (!fs_1.default.existsSync(newFilePath)) {
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,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE;oBAC7B,YAAE,CAAC,YAAY,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;iBAC7C;aACJ;SACJ;KACJ;IACD,OAAO;AACX,CAAC;AAvBD,iCAuBC"}
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"}
@@ -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) {
@@ -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/C,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"}
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.2",
3
+ "version": "2.4.4",
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 HEADLESS=false npx playwright test"
10
11
  },
11
12
  "repository": {
12
13
  "type": "git",
@@ -14,67 +14,82 @@ 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'],
21
20
  userAgent: devices['Desktop Firefox'].userAgent + ' SPS auto test run',
22
21
  viewport: customViewport,
22
+ contextOptions: {
23
+ // bypassCSP: true,
24
+ setIgnoreHTTPSErrors: true
25
+ },
23
26
  },
24
27
  }];
25
28
  break;
26
29
  case 'webkit':
27
30
  browserProject = [{
28
31
  name: 'webkit',
29
- testIgnore: /.*Inventory.*/,
30
32
  testMatch: /.*(test|spec)\.(js|ts|mjs)/,
31
33
  use: {
32
34
  ...devices['Desktop Safari'],
33
35
  userAgent: devices['Desktop Safari'].userAgent + ' SPS auto test run',
34
36
  viewport: customViewport,
37
+ contextOptions: {
38
+ // bypassCSP: true,
39
+ setIgnoreHTTPSErrors: true
40
+ },
35
41
  },
36
42
  }];
37
43
  break;
38
44
  case 'edge':
39
45
  browserProject = [{
40
46
  name: 'msedge',
41
- testIgnore: /.*Inventory.*/,
42
47
  testMatch: /.*(test|spec)\.(js|ts|mjs)/,
43
48
  use: {
44
49
  channel: 'msedge',
45
50
  ...devices['Desktop Edge'],
46
51
  userAgent: devices['Desktop Edge'].userAgent + ' SPS auto test run',
47
52
  viewport: customViewport,
53
+ contextOptions: {
54
+ // bypassCSP: true,
55
+ setIgnoreHTTPSErrors: true
56
+ },
57
+ // launchOptions: {
58
+ // args: [
59
+ // "--disable-web-security",
60
+ // "--allow-insecure-localhost",
61
+ // "--ignore-certificate-errors",
62
+ // "--allow-running-insecure-content"
63
+ // ]
64
+ // }
48
65
  },
49
66
  }];
50
67
  break;
51
68
  default:
52
69
  browserProject = [{
53
70
  name: 'chromium',
54
- testIgnore: /.*Inventory.*/,
55
71
  testMatch: /.*(test|spec)\.(js|ts|mjs)/,
56
72
  use: {
57
73
  channel: 'chrome',
58
74
  ...devices['Desktop Chrome'],
59
75
  userAgent: devices['Desktop Chrome'].userAgent + ' SPS auto test run',
60
76
  viewport: customViewport,
77
+ contextOptions: {
78
+ // bypassCSP: true,
79
+ setIgnoreHTTPSErrors: true
80
+ },
81
+ // launchOptions: {
82
+ // args: [
83
+ // "--disable-web-security",
84
+ // "--allow-insecure-localhost",
85
+ // "--ignore-certificate-errors",
86
+ // "--allow-running-insecure-content"
87
+ // ]
88
+ // }
61
89
  },
62
90
  }];
63
91
  break;
64
92
  }
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
93
 
79
94
  const storageStatePath = process.env.ENV && process.env.ENV.includes('prod')
80
95
  ? path.join(process.cwd(), 'results-e2e/auth/storageStateProd.json')
@@ -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
  }
@@ -29,11 +34,11 @@ export default async function globalSetup(): Promise<void> {
29
34
  ((JSON.parse(fs.readFileSync(storageFile, 'utf8')).origins[0].localStorage.find(o => o.name === 'expires_at').value - currentTS) / 60000) < 30)
30
35
  ) {
31
36
  const browser = await chromium.launch({ headless: false }); // { headless: false }
32
- const context = await browser.newContext();
37
+ const context = await browser.newContext({ ignoreHTTPSErrors: true });
33
38
  await context.tracing.start({ screenshots: true, snapshots: true });
34
39
  const page = await context.newPage();
35
40
  try {
36
- await page.goto(baseUrl);
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
  }
@@ -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
- if (!fs.existsSync(newFilePath)) {
22
- fs.copyFileSync(oldFilePath, newFilePath);
23
- }
21
+ fs.copyFileSync(oldFilePath, newFilePath);
24
22
  }
25
23
  }
26
24
  }
@@ -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) {