diff --git a/e2e/__tests__/jasmineAsync.test.ts b/e2e/__tests__/jasmineAsync.test.ts index fb869f65cd06..cf621b5104d2 100644 --- a/e2e/__tests__/jasmineAsync.test.ts +++ b/e2e/__tests__/jasmineAsync.test.ts @@ -115,6 +115,19 @@ describe('async jasmine', () => { expect(json.testResults[0].message).toMatch(/concurrent test fails/); }); + it('works with concurrent within a describe block when invoked with testNamePattern', () => { + const {json} = runWithJson('jasmine-async', [ + '--testNamePattern', + 'one concurrent test fails', + 'concurrentWithinDescribe.test.js', + ]); + expect(json.numTotalTests).toBe(1); + expect(json.numPassedTests).toBe(0); + expect(json.numFailedTests).toBe(1); + expect(json.numPendingTests).toBe(0); + expect(json.testResults[0].message).toMatch(/concurrent test fails/); + }); + it("doesn't execute more than 5 tests simultaneously", () => { const {json} = runWithJson('jasmine-async', ['concurrent-many.test.js']); expect(json.numTotalTests).toBe(10); diff --git a/e2e/jasmine-async/__tests__/concurrentWithinDescribe.test.js b/e2e/jasmine-async/__tests__/concurrentWithinDescribe.test.js new file mode 100644 index 000000000000..be0a6c794fb2 --- /dev/null +++ b/e2e/jasmine-async/__tests__/concurrentWithinDescribe.test.js @@ -0,0 +1,12 @@ +/** + * 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. + */ + +'use strict'; + +describe('one', () => { + it.concurrent('concurrent test fails', () => Promise.reject()); +}); diff --git a/packages/jest-jasmine2/src/jasmine/Env.ts b/packages/jest-jasmine2/src/jasmine/Env.ts index 6ff8da163bcf..00d1d0530994 100644 --- a/packages/jest-jasmine2/src/jasmine/Env.ts +++ b/packages/jest-jasmine2/src/jasmine/Env.ts @@ -55,7 +55,7 @@ export default function(j$: Jasmine) { fail: (error: Error | AssertionErrorWithStack) => void; pending: (message: string) => void; afterAll: (afterAllFunction: QueueableFn['fn'], timeout?: number) => void; - fit: (description: string, fn: QueueableFn['fn'], timeout?: number) => void; + fit: (description: string, fn: QueueableFn['fn'], timeout?: number) => Spec; throwingExpectationFailures: () => boolean; randomizeTests: (value: unknown) => void; randomTests: () => boolean; @@ -79,7 +79,7 @@ export default function(j$: Jasmine) { addReporter: (reporterToAdd: Reporter) => void; it: (description: string, fn: QueueableFn['fn'], timeout?: number) => Spec; xdescribe: (description: string, specDefinitions: Function) => Suite; - xit: (description: string, fn: QueueableFn['fn'], timeout?: number) => any; + xit: (description: string, fn: QueueableFn['fn'], timeout?: number) => Spec; beforeAll: (beforeAllFunction: QueueableFn['fn'], timeout?: number) => void; todo: () => Spec; provideFallbackReporter: (reporterToAdd: Reporter) => void; diff --git a/packages/jest-jasmine2/src/jasmineAsyncInstall.ts b/packages/jest-jasmine2/src/jasmineAsyncInstall.ts index 85e1975ba7d4..b3a7bb241233 100644 --- a/packages/jest-jasmine2/src/jasmineAsyncInstall.ts +++ b/packages/jest-jasmine2/src/jasmineAsyncInstall.ts @@ -17,6 +17,7 @@ import throat from 'throat'; import isError from './isError'; import {Jasmine} from './types'; import Spec from './jasmine/Spec'; +import {QueueableFn} from './queueRunner'; interface DoneFn { (): void; @@ -141,19 +142,22 @@ function promisifyIt( } function makeConcurrent( - originalFn: Function, + originalFn: ( + description: string, + fn: QueueableFn['fn'], + timeout?: number, + ) => Spec, env: Jasmine['currentEnv_'], mutex: ReturnType, ): Global.ItConcurrentBase { return function(specName, fn, timeout) { - if ( - env != null && - !env.specFilter({getFullName: () => specName || ''} as Spec) - ) { - return originalFn.call(env, specName, () => Promise.resolve(), timeout); + let promise: Promise = Promise.resolve(); + + const spec = originalFn.call(env, specName, () => promise, timeout); + if (env != null && !env.specFilter(spec)) { + return spec; } - let promise: Promise; try { promise = mutex(() => { const promise = fn(); @@ -161,14 +165,14 @@ function makeConcurrent( return promise; } throw new Error( - `Jest: concurrent test "${specName}" must return a Promise.`, + `Jest: concurrent test "${spec.getFullName()}" must return a Promise.`, ); }); } catch (error) { - return originalFn.call(env, specName, () => Promise.reject(error)); + promise = Promise.reject(error); } - return originalFn.call(env, specName, () => promise, timeout); + return spec; }; }