Skip to content

Commit

Permalink
Fix --testNamePattern matching against it.concurrent within describe
Browse files Browse the repository at this point in the history
  • Loading branch information
dmitri-gb committed Oct 24, 2019
1 parent 164e209 commit 6d8a7c1
Show file tree
Hide file tree
Showing 4 changed files with 41 additions and 12 deletions.
13 changes: 13 additions & 0 deletions e2e/__tests__/jasmineAsync.test.ts
Expand Up @@ -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);
Expand Down
12 changes: 12 additions & 0 deletions 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());
});
4 changes: 2 additions & 2 deletions packages/jest-jasmine2/src/jasmine/Env.ts
Expand Up @@ -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;
Expand All @@ -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;
Expand Down
24 changes: 14 additions & 10 deletions packages/jest-jasmine2/src/jasmineAsyncInstall.ts
Expand Up @@ -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;
Expand Down Expand Up @@ -141,34 +142,37 @@ function promisifyIt(
}

function makeConcurrent(
originalFn: Function,
originalFn: (
description: string,
fn: QueueableFn['fn'],
timeout?: number,
) => Spec,
env: Jasmine['currentEnv_'],
mutex: ReturnType<typeof throat>,
): 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<unknown> = Promise.resolve();

const spec = originalFn.call(env, specName, () => promise, timeout);
if (env != null && !env.specFilter(spec)) {
return spec;
}

let promise: Promise<unknown>;
try {
promise = mutex(() => {
const promise = fn();
if (isPromise(promise)) {
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;
};
}

Expand Down

0 comments on commit 6d8a7c1

Please sign in to comment.