105 lines
3.2 KiB
Markdown
105 lines
3.2 KiB
Markdown
|
# WooCommerce End-to-End Test Packages
|
||
|
|
||
|
There are two limitations which significantly impact the architecture of E2E test packages:
|
||
|
|
||
|
- Referencing the `jest` functions `describe`, `it`, `beforeAll`, etc. throws a fatal error outside the `jest` environment.
|
||
|
- `jest` will not scan for tests in any path containing `node_mdules`.
|
||
|
|
||
|
## Creating a tests package
|
||
|
|
||
|
The way to create a tests package with the above limitations is
|
||
|
|
||
|
- **In the tests package**, wrap each test in a function
|
||
|
|
||
|
```js
|
||
|
/**
|
||
|
* Require the necessary jest functions to prevent the package build from referencing them
|
||
|
* `import` references imported functions during package build
|
||
|
*/
|
||
|
|
||
|
const { describe, it, beforeAll } = require( '@jest/globals' );
|
||
|
|
||
|
const testMyCriticalFlow = () => {
|
||
|
describe( 'My Critical Flow', () => {
|
||
|
beforeAll( async () => {
|
||
|
// Test setup
|
||
|
} );
|
||
|
it( 'can complete first step', async () => {
|
||
|
// Do stuff
|
||
|
expect( someValue ).toBeTruthy();
|
||
|
} );
|
||
|
} );
|
||
|
};
|
||
|
|
||
|
modules.exports = testMyFlow;
|
||
|
```
|
||
|
|
||
|
- **In the `tests/e2e/specs` folder**, create a test spec that calls the test function
|
||
|
|
||
|
```js
|
||
|
import { testMyCriticalFlow } from 'MyTestsPackage';
|
||
|
|
||
|
testMyCriticalFlow();
|
||
|
```
|
||
|
|
||
|
## Adding the scaffolds for the test installer
|
||
|
|
||
|
To work with the limitations outlined above, the test installer needs to access the test scaffolding information without accessing the package index. As a result, the `installFiles` is a required path in the steps below
|
||
|
|
||
|
- Create an `installFiles` folder in the root of the package
|
||
|
- Add an `index.js` to the folder which exports an object with some or all of three properties
|
||
|
```js
|
||
|
module.exports = {
|
||
|
defaultJson: 'installFiles/default-test-config.json',
|
||
|
initializeSh: 'installFiles/initialize.sh.default',
|
||
|
testSpecs: 'installFiles/scaffold-tests.json',
|
||
|
};
|
||
|
```
|
||
|
- The value of each of the properties should be a relative path from the package `index.js`. The test installer will remove `dist`, `build`, and `build-modules` from the end of the package index path.
|
||
|
- `defaultJson`: Path to a JSON file containing all `default.json` entries needed for the tests in the package.
|
||
|
- `initializeSh`: Path to a bash script containing the WP CLI commands needed to initialize the `e2e-environment` test container.
|
||
|
- `testSpecs`: Path to a JSON file containing a nested object
|
||
|
```json
|
||
|
{
|
||
|
"active": [
|
||
|
{
|
||
|
"name": "first-folder-name",
|
||
|
"description": "First tests",
|
||
|
"testFiles": [
|
||
|
{
|
||
|
"name": "test-name-a",
|
||
|
"functions": [
|
||
|
"testMyCriticalFlow"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"name": "test-name-b",
|
||
|
"functions": [
|
||
|
"testSecondCriticalFlow",
|
||
|
"testThirdCriticalFlow"
|
||
|
]
|
||
|
}
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"name": "second-folder-name",
|
||
|
"description": "Second tests",
|
||
|
"testFiles": [
|
||
|
....
|
||
|
]
|
||
|
}
|
||
|
]
|
||
|
}
|
||
|
```
|
||
|
|
||
|
The test installer uses the `testSpecs` nested object to create test specs. Using the example above, create `tests/e2e/specs/first-folder-name/test-name-b.test.js`:
|
||
|
|
||
|
```js
|
||
|
/* This file was auto-generated by the command `npx wc-e2e install your-package-name`. */
|
||
|
import { testSecondCriticalFlow, testThirdCriticalFlow } from 'your-package-name';
|
||
|
|
||
|
testSecondCriticalFlow();
|
||
|
testThirdCriticalFlow();
|
||
|
```
|
||
|
|