Skip to content

Commit

Permalink
Support async sort in custom testSequencer. (#8642)
Browse files Browse the repository at this point in the history
* Support async sort in testSequencer.

* Add e2e test for async testSequencer.

* Update CHANGELOG.md

* Update CHANGELOG.md
  • Loading branch information
scotthovestadt committed Jul 4, 2019
1 parent bb01c94 commit 9c70ba0
Show file tree
Hide file tree
Showing 6 changed files with 65 additions and 7 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Expand Up @@ -10,6 +10,7 @@
- `[pretty-format]` Render custom displayName of memoized components
- `[jest-validate]` Allow `maxWorkers` as part of the `jest.config.js` ([#8565](https://github.com/facebook/jest/pull/8565))
- `[jest-runtime]` Allow passing configuration objects to transformers ([#7288](https://github.com/facebook/jest/pull/7288))
- `[@jest/core, @jest/test-sequencer]` Support async sort in custom `testSequencer` ([#8642](https://github.com/facebook/jest/pull/8642))

### Fixes

Expand Down
4 changes: 2 additions & 2 deletions docs/Configuration.md
Expand Up @@ -1039,11 +1039,11 @@ An example of such function can be found in our default [jasmine2 test runner pa

Default: `@jest/test-sequencer`

This option allows you to use a custom sequencer instead of Jest's default.
This option allows you to use a custom sequencer instead of Jest's default. `sort` may optionally return a Promise.

Example:

Sort test path alphabetically
Sort test path alphabetically.

```js
const Sequencer = require('@jest/test-sequencer').default;
Expand Down
39 changes: 37 additions & 2 deletions e2e/__tests__/customTestSequencers.test.ts
Expand Up @@ -10,8 +10,43 @@ import runJest from '../runJest';
import {extractSummary} from '../Utils';
const dir = path.resolve(__dirname, '../custom-test-sequencer');

test('run prioritySequence first', () => {
const result = runJest(dir, ['-i']);
test('run prioritySequence first sync', () => {
const result = runJest(
dir,
[
'-i',
'--config',
JSON.stringify({
testSequencer: '<rootDir>/testSequencer.js',
}),
],
{},
);
expect(result.status).toBe(0);
const sequence = extractSummary(result.stderr)
.rest.replace(/PASS /g, '')
.split('\n');
expect(sequence).toEqual([
'./a.test.js',
'./b.test.js',
'./c.test.js',
'./d.test.js',
'./e.test.js',
]);
});

test('run prioritySequence first async', () => {
const result = runJest(
dir,
[
'-i',
'--config',
JSON.stringify({
testSequencer: '<rootDir>/testSequencerAsync.js',
}),
],
{},
);
expect(result.status).toBe(0);
const sequence = extractSummary(result.stderr)
.rest.replace(/PASS /g, '')
Expand Down
3 changes: 1 addition & 2 deletions e2e/custom-test-sequencer/package.json
@@ -1,6 +1,5 @@
{
"jest": {
"testEnvironment": "node",
"testSequencer": "<rootDir>/testSequencer.js"
"testEnvironment": "node"
}
}
23 changes: 23 additions & 0 deletions e2e/custom-test-sequencer/testSequencerAsync.js
@@ -0,0 +1,23 @@
/**
* Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/

const Sequencer = require('@jest/test-sequencer').default;

class CustomSequencer extends Sequencer {
sort(tests) {
return new Promise(resolve => {
setTimeout(() => {
const copyTests = Array.from(tests);
resolve(
copyTests.sort((testA, testB) => (testA.path > testB.path ? 1 : -1))
);
}, 50);
});
}
}

module.exports = CustomSequencer;
2 changes: 1 addition & 1 deletion packages/jest-core/src/runJest.ts
Expand Up @@ -183,7 +183,7 @@ export default (async function runJest({
}),
);

allTests = sequencer.sort(allTests);
allTests = await sequencer.sort(allTests);

if (globalConfig.listTests) {
const testsPaths = Array.from(new Set(allTests.map(test => test.path)));
Expand Down

0 comments on commit 9c70ba0

Please sign in to comment.