diff --git a/jest/integration/runner/index.js b/jest/integration/runner/index.js index 3f26e5e8ac348a..04964180c50603 100644 --- a/jest/integration/runner/index.js +++ b/jest/integration/runner/index.js @@ -174,7 +174,8 @@ module.exports = async function runTest( .length, numFailingTests: testResults.filter(test => test.status === 'failed') .length, - numPendingTests: 0, + numPendingTests: testResults.filter(test => test.status === 'pending') + .length, numTodoTests: 0, skipped: false, testResults, diff --git a/jest/integration/runtime/setup.js b/jest/integration/runtime/setup.js index 4f1d01b3751ea1..43fc00fd661779 100644 --- a/jest/integration/runtime/setup.js +++ b/jest/integration/runtime/setup.js @@ -9,36 +9,97 @@ * @oncall react_native */ +type TestResult = { + ancestorTitles: Array, + title: string, + fullName: string, + status: 'passed' | 'failed' | 'pending', + duration: number, + failureMessages: Array, + numPassingAsserts: number, + // location: string, +}; + const tests: Array<{ title: string, ancestorTitles: Array, implementation: () => mixed, - result?: { - ancestorTitles: Array, - title: string, - fullName: string, - status: 'passed' | 'failed' | 'skipped', - duration: number, - failureMessages: Array, - numPassingAsserts: number, - // location: string, - }, + isFocused: boolean, + isSkipped: boolean, + result?: TestResult, }> = []; const ancestorTitles: Array = []; -global.describe = (title: string, implementation: () => mixed) => { +const globalModifiers: Array<'focused' | 'skipped'> = []; + +const globalDescribe = (global.describe = ( + title: string, + implementation: () => mixed, +) => { ancestorTitles.push(title); implementation(); ancestorTitles.pop(); +}); + +const globalIt = + (global.it = + global.test = + (title: string, implementation: () => mixed) => + tests.push({ + title, + implementation, + ancestorTitles: ancestorTitles.slice(), + isFocused: + globalModifiers.length > 0 && + globalModifiers[globalModifiers.length - 1] === 'focused', + isSkipped: + globalModifiers.length > 0 && + globalModifiers[globalModifiers.length - 1] === 'skipped', + })); + +// $FlowExpectedError[prop-missing] +global.fdescribe = global.describe.only = ( + title: string, + implementation: () => mixed, +) => { + globalModifiers.push('focused'); + globalDescribe(title, implementation); + globalModifiers.pop(); }; -global.it = (title: string, implementation: () => mixed) => - tests.push({ - title, - implementation, - ancestorTitles: ancestorTitles.slice(), - }); +// $FlowExpectedError[prop-missing] +global.it.only = + global.fit = + // $FlowExpectedError[prop-missing] + global.test.only = + (title: string, implementation: () => mixed) => { + globalModifiers.push('focused'); + globalIt(title, implementation); + globalModifiers.pop(); + }; + +// $FlowExpectedError[prop-missing] +global.xdescribe = global.describe.skip = ( + title: string, + implementation: () => mixed, +) => { + globalModifiers.push('skipped'); + globalDescribe(title, implementation); + globalModifiers.pop(); +}; + +// $FlowExpectedError[prop-missing] +global.it.skip = + global.xit = + // $FlowExpectedError[prop-missing] + global.test.skip = + global.xtest = + (title: string, implementation: () => mixed) => { + globalModifiers.push('skipped'); + globalIt(title, implementation); + globalModifiers.pop(); + }; // flowlint unsafe-getters-setters:off @@ -123,29 +184,40 @@ function runWithGuard(fn: () => void) { } function executeTests() { - for (const test of tests) { - let status; - let error; - - const start = Date.now(); - - try { - test.implementation(); - status = 'passed'; - } catch (e) { - error = e; - status = 'failed'; - } + const hasFocusedTests = tests.some(test => test.isFocused); - test.result = { + for (const test of tests) { + const result: TestResult = { title: test.title, fullName: [...test.ancestorTitles, test.title].join(' '), ancestorTitles: test.ancestorTitles, - status, - duration: Date.now() - start, - failureMessages: status === 'failed' && error ? [error.message] : [], + status: 'pending', + duration: 0, + failureMessages: [], numPassingAsserts: 0, }; + + test.result = result; + + if (!test.isSkipped && (!hasFocusedTests || test.isFocused)) { + let status; + let error; + + const start = Date.now(); + + try { + test.implementation(); + status = 'passed'; + } catch (e) { + error = e; + status = 'failed'; + } + + result.status = status; + result.duration = Date.now() - start; + result.failureMessages = + status === 'failed' && error ? [error.message] : []; + } } console.log(