diff --git a/jest/integration/runner/index.js b/jest/integration/runner/index.js index 3256a49725bdc8..2b8898d2b9e4db 100644 --- a/jest/integration/runner/index.js +++ b/jest/integration/runner/index.js @@ -186,7 +186,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 9d0c57bf7bb50a..7053024f6c0c4a 100644 --- a/jest/integration/runtime/setup.js +++ b/jest/integration/runtime/setup.js @@ -37,23 +37,82 @@ const tests: Array<{ title: string, ancestorTitles: Array, implementation: () => mixed, + isFocused: boolean, + isSkipped: boolean, result?: TestCaseResult, }> = []; 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 @@ -138,29 +197,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: TestCaseResult = { 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] : []; + } } reportTestSuiteResult({