From f2a068d1d34426fe0a176b063de63e567d72a1f9 Mon Sep 17 00:00:00 2001 From: Hyeonsu Lee Date: Tue, 23 Jan 2018 02:57:46 +0900 Subject: [PATCH 1/8] Make `makeRejectMatcher` synchronizable (#5361) --- .../expect/src/__tests__/matchers.test.js | 12 ++++++++ packages/expect/src/index.js | 30 ++++++++++--------- 2 files changed, 28 insertions(+), 14 deletions(-) diff --git a/packages/expect/src/__tests__/matchers.test.js b/packages/expect/src/__tests__/matchers.test.js index bbce3f79d143..f61a46893e62 100644 --- a/packages/expect/src/__tests__/matchers.test.js +++ b/packages/expect/src/__tests__/matchers.test.js @@ -37,6 +37,18 @@ describe('.rejects', () => { await jestExpect(fn()).rejects.toThrow('some error'); }); + [4, [1], {a: 1}, 'a', true, null, undefined, () => {}].forEach(value => { + it(`fails non-promise value ${stringify(value)} synchronously`, () => { + let error; + try { + jestExpect(value).rejects.toBe(111); + } catch (e) { + error = e; + } + expect(error).toBeDefined(); + }); + }); + [4, [1], {a: 1}, 'a', true, null, undefined, () => {}].forEach(value => { it(`fails non-promise value ${stringify(value)}`, async () => { let error; diff --git a/packages/expect/src/index.js b/packages/expect/src/index.js index a74ffffa13c8..0c80ce43f78f 100644 --- a/packages/expect/src/index.js +++ b/packages/expect/src/index.js @@ -161,7 +161,7 @@ const makeRejectMatcher = ( matcher: RawMatcherFn, isNot: boolean, actual: Promise, -): PromiseMatcherFn => async (...args) => { +): PromiseMatcherFn => (...args) => { const matcherStatement = `.rejects.${isNot ? 'not.' : ''}${matcherName}`; if (!isPromise(actual)) { throw new JestAssertionError( @@ -172,20 +172,22 @@ const makeRejectMatcher = ( ); } - let result; - try { - result = await actual; - } catch (e) { - return makeThrowingMatcher(matcher, isNot, e).apply(null, args); - } + return (async () => { + let result; + try { + result = await actual; + } catch (e) { + return makeThrowingMatcher(matcher, isNot, e).apply(null, args); + } - throw new JestAssertionError( - utils.matcherHint(matcherStatement, 'received', '') + - '\n\n' + - `Expected ${utils.RECEIVED_COLOR('received')} Promise to reject, ` + - 'instead it resolved to value\n' + - ` ${utils.printReceived(result)}`, - ); + throw new JestAssertionError( + utils.matcherHint(matcherStatement, 'received', '') + + '\n\n' + + `Expected ${utils.RECEIVED_COLOR('received')} Promise to reject, ` + + 'instead it resolved to value\n' + + ` ${utils.printReceived(result)}`, + ); + })(); }; const makeThrowingMatcher = ( From a5cdc1050251c7f0d1417d45ae86eb1eecaf85c9 Mon Sep 17 00:00:00 2001 From: Hyeonsu Lee Date: Tue, 23 Jan 2018 11:27:33 +0900 Subject: [PATCH 2/8] Reorganize code using promise instaed of async/await --- packages/expect/src/index.js | 28 ++++++++++++---------------- 1 file changed, 12 insertions(+), 16 deletions(-) diff --git a/packages/expect/src/index.js b/packages/expect/src/index.js index 0c80ce43f78f..a3017b288d6f 100644 --- a/packages/expect/src/index.js +++ b/packages/expect/src/index.js @@ -172,22 +172,18 @@ const makeRejectMatcher = ( ); } - return (async () => { - let result; - try { - result = await actual; - } catch (e) { - return makeThrowingMatcher(matcher, isNot, e).apply(null, args); - } - - throw new JestAssertionError( - utils.matcherHint(matcherStatement, 'received', '') + - '\n\n' + - `Expected ${utils.RECEIVED_COLOR('received')} Promise to reject, ` + - 'instead it resolved to value\n' + - ` ${utils.printReceived(result)}`, - ); - })(); + return actual + .then(v => { + const err = new JestAssertionError( + utils.matcherHint(matcherStatement, 'received', '') + + '\n\n' + + `Expected ${utils.RECEIVED_COLOR('received')} Promise to reject, ` + + 'instead it resolved to value\n' + + ` ${utils.printReceived(v)}`, + ); + return Promise.reject(err); + }) + .catch(e => makeThrowingMatcher(matcher, isNot, e).apply(null, args)); }; const makeThrowingMatcher = ( From 16196d55456a5e8385f4e2381eb80fbc91b6d3f4 Mon Sep 17 00:00:00 2001 From: Hyeonsu Lee Date: Tue, 23 Jan 2018 11:29:43 +0900 Subject: [PATCH 3/8] Update changelog --- CHANGELOG.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1ea43efcfcf5..1c70a719aa48 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,13 +2,15 @@ ### features -* `[jest-mock]` Add util methods to create async functions. - ([#5318](https://github.com/facebook/jest/pull/5318)) +* `[jest-mock]` Add util methods to create async functions. + ([#5318](https://github.com/facebook/jest/pull/5318)) ### Fixes * `[jest]` Add `import-local` to `jest` package. ([#5353](https://github.com/facebook/jest/pull/5353)) +* `[expect]` Make `makeRejectMatcher` synchronizable. + ([#5364](https://github.com/facebook/jest/pull/5364)) ## jest 22.1.4 From 46033280b9376da2087f736d4fd3aee6e9d6e55c Mon Sep 17 00:00:00 2001 From: Hyeonsu Lee Date: Wed, 24 Jan 2018 03:38:18 +0900 Subject: [PATCH 4/8] Move rejectedHandler onto then --- packages/expect/src/index.js | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/packages/expect/src/index.js b/packages/expect/src/index.js index a3017b288d6f..ecb5389c6081 100644 --- a/packages/expect/src/index.js +++ b/packages/expect/src/index.js @@ -172,18 +172,19 @@ const makeRejectMatcher = ( ); } - return actual - .then(v => { + return actual.then( + result => { const err = new JestAssertionError( utils.matcherHint(matcherStatement, 'received', '') + '\n\n' + `Expected ${utils.RECEIVED_COLOR('received')} Promise to reject, ` + 'instead it resolved to value\n' + - ` ${utils.printReceived(v)}`, + ` ${utils.printReceived(result)}`, ); return Promise.reject(err); - }) - .catch(e => makeThrowingMatcher(matcher, isNot, e).apply(null, args)); + }, + reason => makeThrowingMatcher(matcher, isNot, reason).apply(null, args), + ); }; const makeThrowingMatcher = ( From b4e1884e931ed57750a51613beabd85b37b8ea5b Mon Sep 17 00:00:00 2001 From: Hyeonsu Lee Date: Wed, 24 Jan 2018 03:44:05 +0900 Subject: [PATCH 5/8] Make `makeResolveMatcher` synchronizable --- .../__snapshots__/matchers.test.js.snap | 62 +++++++++++++++++++ .../expect/src/__tests__/matchers.test.js | 13 ++++ packages/expect/src/index.js | 28 ++++----- 3 files changed, 89 insertions(+), 14 deletions(-) diff --git a/packages/expect/src/__tests__/__snapshots__/matchers.test.js.snap b/packages/expect/src/__tests__/__snapshots__/matchers.test.js.snap index f9492e48f432..b16853a9eadb 100644 --- a/packages/expect/src/__tests__/__snapshots__/matchers.test.js.snap +++ b/packages/expect/src/__tests__/__snapshots__/matchers.test.js.snap @@ -84,6 +84,14 @@ Received: string: \\"a\\"" `; +exports[`.resolves fails non-promise value "a" synchronously 1`] = ` +"expect(received).resolves.toBeDefined() + +received value must be a Promise. +Received: + string: \\"a\\"" +`; + exports[`.resolves fails non-promise value [1] 1`] = ` "expect(received).resolves.toBeDefined() @@ -92,6 +100,14 @@ Received: array: [1]" `; +exports[`.resolves fails non-promise value [1] synchronously 1`] = ` +"expect(received).resolves.toBeDefined() + +received value must be a Promise. +Received: + array: [1]" +`; + exports[`.resolves fails non-promise value [Function anonymous] 1`] = ` "expect(received).resolves.toBeDefined() @@ -100,6 +116,14 @@ Received: function: [Function anonymous]" `; +exports[`.resolves fails non-promise value [Function anonymous] synchronously 1`] = ` +"expect(received).resolves.toBeDefined() + +received value must be a Promise. +Received: + function: [Function anonymous]" +`; + exports[`.resolves fails non-promise value {"a": 1} 1`] = ` "expect(received).resolves.toBeDefined() @@ -108,6 +132,14 @@ Received: object: {\\"a\\": 1}" `; +exports[`.resolves fails non-promise value {"a": 1} synchronously 1`] = ` +"expect(received).resolves.toBeDefined() + +received value must be a Promise. +Received: + object: {\\"a\\": 1}" +`; + exports[`.resolves fails non-promise value 4 1`] = ` "expect(received).resolves.toBeDefined() @@ -116,6 +148,14 @@ Received: number: 4" `; +exports[`.resolves fails non-promise value 4 synchronously 1`] = ` +"expect(received).resolves.toBeDefined() + +received value must be a Promise. +Received: + number: 4" +`; + exports[`.resolves fails non-promise value null 1`] = ` "expect(received).resolves.toBeDefined() @@ -123,6 +163,13 @@ exports[`.resolves fails non-promise value null 1`] = ` Received: null" `; +exports[`.resolves fails non-promise value null synchronously 1`] = ` +"expect(received).resolves.toBeDefined() + +received value must be a Promise. +Received: null" +`; + exports[`.resolves fails non-promise value true 1`] = ` "expect(received).resolves.toBeDefined() @@ -131,6 +178,14 @@ Received: boolean: true" `; +exports[`.resolves fails non-promise value true synchronously 1`] = ` +"expect(received).resolves.toBeDefined() + +received value must be a Promise. +Received: + boolean: true" +`; + exports[`.resolves fails non-promise value undefined 1`] = ` "expect(received).resolves.toBeDefined() @@ -138,6 +193,13 @@ exports[`.resolves fails non-promise value undefined 1`] = ` Received: undefined" `; +exports[`.resolves fails non-promise value undefined synchronously 1`] = ` +"expect(received).resolves.toBeDefined() + +received value must be a Promise. +Received: undefined" +`; + exports[`.toBe() does not crash on circular references 1`] = ` "expect(received).toBe(expected) diff --git a/packages/expect/src/__tests__/matchers.test.js b/packages/expect/src/__tests__/matchers.test.js index f61a46893e62..867120870c4a 100644 --- a/packages/expect/src/__tests__/matchers.test.js +++ b/packages/expect/src/__tests__/matchers.test.js @@ -93,6 +93,19 @@ describe('.resolves', () => { ).resolves.toThrow(); }); + [4, [1], {a: 1}, 'a', true, null, undefined, () => {}].forEach(value => { + it(`fails non-promise value ${stringify(value)} synchronously`, () => { + let error; + try { + jestExpect(value).resolves.toBeDefined(); + } catch (e) { + error = e; + } + expect(error).toBeDefined(); + expect(error.message).toMatchSnapshot(); + }); + }); + [4, [1], {a: 1}, 'a', true, null, undefined, () => {}].forEach(value => { it(`fails non-promise value ${stringify(value)}`, async () => { let error; diff --git a/packages/expect/src/index.js b/packages/expect/src/index.js index ecb5389c6081..50a495f50332 100644 --- a/packages/expect/src/index.js +++ b/packages/expect/src/index.js @@ -130,7 +130,7 @@ const makeResolveMatcher = ( matcher: RawMatcherFn, isNot: boolean, actual: Promise, -): PromiseMatcherFn => async (...args) => { +): PromiseMatcherFn => (...args) => { const matcherStatement = `.resolves.${isNot ? 'not.' : ''}${matcherName}`; if (!isPromise(actual)) { throw new JestAssertionError( @@ -141,19 +141,19 @@ const makeResolveMatcher = ( ); } - let result; - try { - result = await actual; - } catch (e) { - throw new JestAssertionError( - utils.matcherHint(matcherStatement, 'received', '') + - '\n\n' + - `Expected ${utils.RECEIVED_COLOR('received')} Promise to resolve, ` + - 'instead it rejected to value\n' + - ` ${utils.printReceived(e)}`, - ); - } - return makeThrowingMatcher(matcher, isNot, result).apply(null, args); + return actual.then( + result => makeThrowingMatcher(matcher, isNot, result).apply(null, args), + reason => { + const err = new JestAssertionError( + utils.matcherHint(matcherStatement, 'received', '') + + '\n\n' + + `Expected ${utils.RECEIVED_COLOR('received')} Promise to resolve, ` + + 'instead it rejected to value\n' + + ` ${utils.printReceived(reason)}`, + ); + return Promise.reject(err); + }, + ); }; const makeRejectMatcher = ( From 54f5ac36adeb2e735971adb613e6f6c5beac9d16 Mon Sep 17 00:00:00 2001 From: Hyeonsu Lee Date: Wed, 24 Jan 2018 23:38:35 +0900 Subject: [PATCH 6/8] Update a snapshot --- integration-tests/__tests__/__snapshots__/failures.test.js.snap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integration-tests/__tests__/__snapshots__/failures.test.js.snap b/integration-tests/__tests__/__snapshots__/failures.test.js.snap index b2c5d619caa8..80542fc0622e 100644 --- a/integration-tests/__tests__/__snapshots__/failures.test.js.snap +++ b/integration-tests/__tests__/__snapshots__/failures.test.js.snap @@ -118,7 +118,7 @@ exports[`works with async failures 1`] = ` + \\"foo\\": \\"bar\\", } - at ../../packages/expect/build/index.js:156:54 + at ../../packages/expect/build/index.js:145:57 " `; From ec4bbf586c36c82b940d7a500230f2eb0fb85e9a Mon Sep 17 00:00:00 2001 From: Simen Bekkhus Date: Wed, 24 Jan 2018 16:29:38 +0100 Subject: [PATCH 7/8] Update CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2cb8a760b1a6..6a9a6f91a16d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,7 +13,7 @@ ([#5367](https://github.com/facebook/jest/pull/5367)) * `[jest-cli]` Fix npm update command for snapshot summary. ([#5376](https://github.com/facebook/jest/pull/5376)) -* `[expect]` Make `rejects` and `resolves` synchronizable. +* `[expect]` Make `rejects` and `resolves` synchronous. ([#5364](https://github.com/facebook/jest/pull/5364)) ## jest 22.1.4 From 8d3de491eae9d3a8d495fa37bd11a1a0cd1bc849 Mon Sep 17 00:00:00 2001 From: Simen Bekkhus Date: Wed, 24 Jan 2018 16:32:01 +0100 Subject: [PATCH 8/8] Update CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6a9a6f91a16d..fd8b3afdee6f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,7 +13,7 @@ ([#5367](https://github.com/facebook/jest/pull/5367)) * `[jest-cli]` Fix npm update command for snapshot summary. ([#5376](https://github.com/facebook/jest/pull/5376)) -* `[expect]` Make `rejects` and `resolves` synchronous. +* `[expect]` Make `rejects` and `resolves` synchronously validate its argument. ([#5364](https://github.com/facebook/jest/pull/5364)) ## jest 22.1.4