Skip to content

Commit ee8bc8c

Browse files
committed
jest-circus test utils
1 parent e12cab6 commit ee8bc8c

File tree

5 files changed

+242
-0
lines changed

5 files changed

+242
-0
lines changed

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
"babel-preset-env": "^1.4.0",
2020
"babel-preset-react": "^6.24.1",
2121
"babel-preset-react-native": "^4.0.0",
22+
"babel-register": "^6.26.0",
2223
"browserify": "^14.4.0",
2324
"chalk": "^2.0.1",
2425
"codecov": "^3.0.0",
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
/**
2+
* Copyright (c) 2014-present, Facebook, Inc. All rights reserved.
3+
*
4+
* This source code is licensed under the BSD-style license found in the
5+
* LICENSE file in the root directory of this source tree. An additional grant
6+
* of patent rights can be found in the PATENTS file in the same directory.
7+
*
8+
* @flow
9+
*/
10+
11+
'use strict';
12+
13+
import type {EventHandler} from 'types/Circus';
14+
15+
const testHandler: EventHandler = (event, state) => {
16+
switch (event.name) {
17+
case 'start_describe_definition': {
18+
console.log(event.name + ':', event.blockName);
19+
break;
20+
}
21+
case 'run_describe_start':
22+
case 'run_describe_finish': {
23+
console.log(event.name + ':', event.describeBlock.name);
24+
break;
25+
}
26+
case 'test_start':
27+
case 'test_done': {
28+
console.log(event.name + ':', event.test.name);
29+
break;
30+
}
31+
32+
case 'add_test': {
33+
console.log(event.name + ':', event.testName);
34+
break;
35+
}
36+
37+
case 'test_fn_start':
38+
case 'test_fn_success':
39+
case 'test_fn_failure': {
40+
console.log(event.name + ':', event.test.name);
41+
break;
42+
}
43+
44+
case 'add_hook': {
45+
console.log(event.name + ':', event.hookType);
46+
break;
47+
}
48+
49+
case 'hook_start':
50+
case 'hook_success':
51+
case 'hook_failure': {
52+
console.log(event.name + ':', event.hook.type);
53+
break;
54+
}
55+
56+
default: {
57+
console.log(event.name);
58+
}
59+
}
60+
};
61+
62+
export default testHandler;
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
/**
2+
* Copyright (c) 2014-present, Facebook, Inc. All rights reserved.
3+
*
4+
* This source code is licensed under the BSD-style license found in the
5+
* LICENSE file in the root directory of this source tree. An additional grant
6+
* of patent rights can be found in the PATENTS file in the same directory.
7+
*
8+
* @flow
9+
*/
10+
11+
'use strict';
12+
13+
import {spawnSync} from 'child_process';
14+
import fs from 'fs';
15+
import os from 'os';
16+
import path from 'path';
17+
18+
const CIRCUS_PATH = path.resolve(__dirname, '../../build/index');
19+
const CIRCUS_RUN_PATH = path.resolve(__dirname, '../../build/run');
20+
const CIRCUS_STATE_PATH = path.resolve(__dirname, '../../build/state');
21+
const TEST_EVENT_HANDLER_PATH = path.resolve(__dirname, './test_event_handler');
22+
const BABEL_REGISTER_PATH = path.resolve(
23+
__dirname,
24+
'../../../../node_modules/babel-register',
25+
);
26+
27+
export const runTest = (source: string) => {
28+
const tmpFilename = path.join(os.tmpdir(), 'circus-test-file.js');
29+
30+
const content = `
31+
require('${BABEL_REGISTER_PATH}');
32+
const circus = require('${CIRCUS_PATH}');
33+
global.test = circus.test;
34+
global.describe = circus.describe;
35+
global.beforeEach = circus.beforeEach;
36+
global.afterEach = circus.afterEach;
37+
global.beforeAll = circus.beforeAll;
38+
global.afterAll = circus.afterAll;
39+
40+
const testEventHandler = require('${TEST_EVENT_HANDLER_PATH}').default;
41+
const addEventHandler = require('${CIRCUS_STATE_PATH}').addEventHandler;
42+
addEventHandler(testEventHandler);
43+
44+
${source};
45+
46+
const run = require('${CIRCUS_RUN_PATH}').default;
47+
48+
run();
49+
`;
50+
51+
fs.writeFileSync(tmpFilename, content);
52+
const result = spawnSync('node', [tmpFilename], {cwd: process.cwd()});
53+
54+
if (result.status !== 0) {
55+
const message = `
56+
STDOUT: ${result.stdout && result.stdout.toString()}
57+
STDERR: ${result.stderr && result.stderr.toString()}
58+
STATUS: ${result.status}
59+
ERROR: ${String(result.error)}
60+
`;
61+
throw new Error(message);
62+
}
63+
64+
result.stdout = String(result.stdout);
65+
result.stderr = String(result.stderr);
66+
67+
if (result.stderr) {
68+
throw new Error(
69+
`
70+
Unexpected stderr:
71+
${result.stderr}
72+
`,
73+
);
74+
}
75+
return result;
76+
};
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
// Jest Snapshot v1, https://goo.gl/fbAQLP
2+
3+
exports[`beforeEach is executed before each test in current/child describe blocks 1`] = `
4+
"start_describe_definition: describe
5+
add_hook: beforeEach
6+
add_test: one
7+
add_test: two
8+
start_describe_definition: 2nd level describe
9+
add_hook: beforeEach
10+
add_test: 2nd level test
11+
start_describe_definition: 3rd level describe
12+
add_test: 3rd level test
13+
add_test: 3rd level test#2
14+
finish_describe_definition
15+
finish_describe_definition
16+
finish_describe_definition
17+
start_describe_definition: 2nd describe
18+
add_hook: beforeEach
19+
add_test: 2nd describe test
20+
finish_describe_definition
21+
run_start
22+
run_describe_start: ROOT_DESCRIBE_BLOCK
23+
run_describe_start: describe
24+
hook_start: beforeEach
25+
hook_success: beforeEach
26+
test_start: one
27+
test_success
28+
hook_start: beforeEach
29+
hook_success: beforeEach
30+
test_start: two
31+
test_success
32+
run_describe_start: 2nd level describe
33+
hook_start: beforeEach
34+
hook_success: beforeEach
35+
hook_start: beforeEach
36+
hook_success: beforeEach
37+
test_start: 2nd level test
38+
test_success
39+
run_describe_start: 3rd level describe
40+
hook_start: beforeEach
41+
hook_success: beforeEach
42+
hook_start: beforeEach
43+
hook_success: beforeEach
44+
test_start: 3rd level test
45+
test_success
46+
hook_start: beforeEach
47+
hook_success: beforeEach
48+
hook_start: beforeEach
49+
hook_success: beforeEach
50+
test_start: 3rd level test#2
51+
test_success
52+
run_describe_finish: 3rd level describe
53+
run_describe_finish: 2nd level describe
54+
run_describe_finish: describe
55+
run_describe_start: 2nd describe
56+
hook_start: beforeEach
57+
hook_failure: beforeEach
58+
test_start: 2nd describe test
59+
test_success
60+
run_describe_finish: 2nd describe
61+
run_describe_finish: ROOT_DESCRIBE_BLOCK
62+
run_finish
63+
"
64+
`;
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
/**
2+
* Copyright (c) 2014-present, Facebook, Inc. All rights reserved.
3+
*
4+
* This source code is licensed under the BSD-style license found in the
5+
* LICENSE file in the root directory of this source tree. An additional grant
6+
* of patent rights can be found in the PATENTS file in the same directory.
7+
*
8+
* @flow
9+
*/
10+
11+
'use strict';
12+
13+
import {runTest} from '../__mocks__/test_utils';
14+
15+
test('beforeEach is executed before each test in current/child describe blocks', () => {
16+
const {stdout} = runTest(`
17+
describe('describe', () => {
18+
beforeEach(() => {});
19+
test('one', () => {});
20+
test('two', () => {});
21+
describe('2nd level describe', () => {
22+
beforeEach(() => {});
23+
test('2nd level test', () => {});
24+
25+
describe('3rd level describe', () => {
26+
test('3rd level test', () => {});
27+
test('3rd level test#2', () => {});
28+
});
29+
});
30+
})
31+
32+
describe('2nd describe', () => {
33+
beforeEach(() => { throw new Error('alabama'); });
34+
test('2nd describe test', () => {});
35+
})
36+
`);
37+
38+
expect(stdout).toMatchSnapshot();
39+
});

0 commit comments

Comments
 (0)