From 4059ab7ba6638b2611361ead9318ec68c288bf14 Mon Sep 17 00:00:00 2001 From: Steve Gravrock Date: Sat, 19 Feb 2022 12:22:55 -0800 Subject: [PATCH 1/6] Don't report a deprecation when a promise is resolved to something beforeEach(() => somePromiseReturningFn()) is likely a common idiom and we don't want to treat it as an error. * Fixes #1958 --- lib/jasmine-core/jasmine.js | 12 +++++- spec/core/QueueRunnerSpec.js | 78 ++++++++++++++++++++++++++++++++++++ src/core/QueueRunner.js | 12 +++++- 3 files changed, 100 insertions(+), 2 deletions(-) diff --git a/lib/jasmine-core/jasmine.js b/lib/jasmine-core/jasmine.js index 4846279a..09abf136 100644 --- a/lib/jasmine-core/jasmine.js +++ b/lib/jasmine-core/jasmine.js @@ -8656,7 +8656,7 @@ getJasmineRequireObj().QueueRunner = function(j$) { maybeThenable = queueableFn.fn.call(self.userContext); if (maybeThenable && j$.isFunction_(maybeThenable.then)) { - maybeThenable.then(next, onPromiseRejection); + maybeThenable.then(wrapInPromiseResolutionHandler(next), onPromiseRejection); completedSynchronously = false; return { completedSynchronously: false }; } @@ -8747,6 +8747,16 @@ getJasmineRequireObj().QueueRunner = function(j$) { } }; + function wrapInPromiseResolutionHandler(fn) { + return function(maybeArg) { + if (j$.isError_(maybeArg)) { + fn(maybeArg); + } else { + fn(); + } + }; + } + return QueueRunner; }; diff --git a/spec/core/QueueRunnerSpec.js b/spec/core/QueueRunnerSpec.js index 302e535e..a7dbadf5 100644 --- a/spec/core/QueueRunnerSpec.js +++ b/spec/core/QueueRunnerSpec.js @@ -254,6 +254,84 @@ describe('QueueRunner', function() { expect(queueableFn2.fn).toHaveBeenCalled(); }); }); + + describe('as a result of a promise', function() { + describe('and the argument is an Error', function() { + // Since promise support was added, Jasmine has failed specs that + // return a promise that resolves to an error. That's probably not + // the desired behavior but it's also not something we should change + // except on a major release and with a deprecation warning in + // advance. + it('explicitly fails and moves to the next function', function(done) { + jasmine.getEnv().requirePromises(); + var err = new Error('foo'), + queueableFn1 = { + fn: function() { + return Promise.resolve(err); + } + }, + queueableFn2 = { fn: jasmine.createSpy('fn2') }, + failFn = jasmine.createSpy('fail'), + queueRunner = new jasmineUnderTest.QueueRunner({ + queueableFns: [queueableFn1, queueableFn2], + fail: failFn, + onComplete: function() { + expect(failFn).toHaveBeenCalledWith(err); + expect(queueableFn2.fn).toHaveBeenCalled(); + done(); + } + }); + + queueRunner.execute(); + }); + + it('does not log a deprecation', function(done) { + jasmine.getEnv().requirePromises(); + var err = new Error('foo'), + queueableFn1 = { + fn: function() { + return Promise.resolve(err); + } + }, + deprecated = jasmine.createSpy('deprecated'), + queueRunner = new jasmineUnderTest.QueueRunner({ + queueableFns: [queueableFn1], + deprecated: deprecated, + onComplete: function() { + expect(deprecated).not.toHaveBeenCalled(); + done(); + } + }); + + queueRunner.execute(); + }); + }); + + describe('and the argument is not an Error', function() { + it('does not log a deprecation or report a failure', function(done) { + jasmine.getEnv().requirePromises(); + var queueableFn1 = { + fn: function() { + return Promise.resolve('not an error'); + } + }, + failFn = jasmine.createSpy('fail'), + deprecated = jasmine.createSpy('deprecated'), + queueRunner = new jasmineUnderTest.QueueRunner({ + queueableFns: [queueableFn1], + deprecated: deprecated, + fail: failFn, + onComplete: function() { + expect(deprecated).not.toHaveBeenCalled(); + expect(failFn).not.toHaveBeenCalled(); + done(); + } + }); + + queueRunner.execute(); + }); + }); + }); }); it('does not cause an explicit fail if execution is being stopped', function() { diff --git a/src/core/QueueRunner.js b/src/core/QueueRunner.js index 7b6ebdd2..486ddb5b 100644 --- a/src/core/QueueRunner.js +++ b/src/core/QueueRunner.js @@ -196,7 +196,7 @@ getJasmineRequireObj().QueueRunner = function(j$) { maybeThenable = queueableFn.fn.call(self.userContext); if (maybeThenable && j$.isFunction_(maybeThenable.then)) { - maybeThenable.then(next, onPromiseRejection); + maybeThenable.then(wrapInPromiseResolutionHandler(next), onPromiseRejection); completedSynchronously = false; return { completedSynchronously: false }; } @@ -287,5 +287,15 @@ getJasmineRequireObj().QueueRunner = function(j$) { } }; + function wrapInPromiseResolutionHandler(fn) { + return function(maybeArg) { + if (j$.isError_(maybeArg)) { + fn(maybeArg); + } else { + fn(); + } + }; + } + return QueueRunner; }; From 9d9e8f0c1747a92dc07c0321336310f72f96318e Mon Sep 17 00:00:00 2001 From: Steve Gravrock Date: Sat, 19 Feb 2022 12:33:19 -0800 Subject: [PATCH 2/6] Lint fixes --- lib/jasmine-core/jasmine.js | 5 ++++- spec/core/QueueRunnerSpec.js | 3 +++ src/core/QueueRunner.js | 5 ++++- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/lib/jasmine-core/jasmine.js b/lib/jasmine-core/jasmine.js index 09abf136..6b68d41d 100644 --- a/lib/jasmine-core/jasmine.js +++ b/lib/jasmine-core/jasmine.js @@ -8656,7 +8656,10 @@ getJasmineRequireObj().QueueRunner = function(j$) { maybeThenable = queueableFn.fn.call(self.userContext); if (maybeThenable && j$.isFunction_(maybeThenable.then)) { - maybeThenable.then(wrapInPromiseResolutionHandler(next), onPromiseRejection); + maybeThenable.then( + wrapInPromiseResolutionHandler(next), + onPromiseRejection + ); completedSynchronously = false; return { completedSynchronously: false }; } diff --git a/spec/core/QueueRunnerSpec.js b/spec/core/QueueRunnerSpec.js index a7dbadf5..e53a00d0 100644 --- a/spec/core/QueueRunnerSpec.js +++ b/spec/core/QueueRunnerSpec.js @@ -267,6 +267,7 @@ describe('QueueRunner', function() { var err = new Error('foo'), queueableFn1 = { fn: function() { + // eslint-disable-next-line compat/compat return Promise.resolve(err); } }, @@ -290,6 +291,7 @@ describe('QueueRunner', function() { var err = new Error('foo'), queueableFn1 = { fn: function() { + // eslint-disable-next-line compat/compat return Promise.resolve(err); } }, @@ -312,6 +314,7 @@ describe('QueueRunner', function() { jasmine.getEnv().requirePromises(); var queueableFn1 = { fn: function() { + // eslint-disable-next-line compat/compat return Promise.resolve('not an error'); } }, diff --git a/src/core/QueueRunner.js b/src/core/QueueRunner.js index 486ddb5b..1823e471 100644 --- a/src/core/QueueRunner.js +++ b/src/core/QueueRunner.js @@ -196,7 +196,10 @@ getJasmineRequireObj().QueueRunner = function(j$) { maybeThenable = queueableFn.fn.call(self.userContext); if (maybeThenable && j$.isFunction_(maybeThenable.then)) { - maybeThenable.then(wrapInPromiseResolutionHandler(next), onPromiseRejection); + maybeThenable.then( + wrapInPromiseResolutionHandler(next), + onPromiseRejection + ); completedSynchronously = false; return { completedSynchronously: false }; } From d8b2efe4d66509950e95832fea534eb594ae1c93 Mon Sep 17 00:00:00 2001 From: Steve Gravrock Date: Sat, 19 Feb 2022 14:21:35 -0800 Subject: [PATCH 3/6] Downgrade jasmine-browser-runner for compatibility with IE --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 377cf6ba..4deeca7a 100644 --- a/package.json +++ b/package.json @@ -45,7 +45,7 @@ "grunt-css-url-embed": "^1.11.1", "grunt-sass": "^3.0.2", "jasmine": "^3.10.0", - "jasmine-browser-runner": "github:jasmine/jasmine-browser#main", + "jasmine-browser-runner": "^0.10.0", "jsdom": "^15.0.0", "load-grunt-tasks": "^4.0.0", "prettier": "1.17.1", From 4a2b10998a54edf4633cc731b334cb6e22761b1c Mon Sep 17 00:00:00 2001 From: Steve Gravrock Date: Sat, 19 Feb 2022 14:22:21 -0800 Subject: [PATCH 4/6] Remove Safari 8 and 9 from CI matrix These browsers are still nominally supported by Jasmine 3.x, but they no longer work on Saucelabs. --- scripts/run-all-browsers | 2 -- 1 file changed, 2 deletions(-) diff --git a/scripts/run-all-browsers b/scripts/run-all-browsers index 45d74aaa..770758d2 100755 --- a/scripts/run-all-browsers +++ b/scripts/run-all-browsers @@ -32,8 +32,6 @@ run_browser firefox 78 run_browser firefox 68 run_browser safari 14 run_browser safari 13 -run_browser safari 9 -run_browser safari 8 run_browser MicrosoftEdge latest echo From 906f37fe52346a2d6dd42cac1e9a98f0f254da30 Mon Sep 17 00:00:00 2001 From: Steve Gravrock Date: Mon, 21 Feb 2022 16:30:15 -0800 Subject: [PATCH 5/6] Bump version to 3.99.1 --- lib/jasmine-core/jasmine.js | 2 +- lib/jasmine-core/version.rb | 2 +- package.json | 2 +- release_notes/3.99.1.md | 22 ++++++++++++++++++++++ 4 files changed, 25 insertions(+), 3 deletions(-) create mode 100644 release_notes/3.99.1.md diff --git a/lib/jasmine-core/jasmine.js b/lib/jasmine-core/jasmine.js index 6b68d41d..6bbb4f20 100644 --- a/lib/jasmine-core/jasmine.js +++ b/lib/jasmine-core/jasmine.js @@ -10762,5 +10762,5 @@ getJasmineRequireObj().UserContext = function(j$) { }; getJasmineRequireObj().version = function() { - return '3.99.0'; + return '3.99.1'; }; diff --git a/lib/jasmine-core/version.rb b/lib/jasmine-core/version.rb index 5209521b..1e6bb6d9 100644 --- a/lib/jasmine-core/version.rb +++ b/lib/jasmine-core/version.rb @@ -4,6 +4,6 @@ # module Jasmine module Core - VERSION = "3.99.0" + VERSION = "3.99.1" end end diff --git a/package.json b/package.json index 4deeca7a..009df2f1 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "jasmine-core", "license": "MIT", - "version": "3.99.0", + "version": "3.99.1", "repository": { "type": "git", "url": "https://github.com/jasmine/jasmine.git" diff --git a/release_notes/3.99.1.md b/release_notes/3.99.1.md new file mode 100644 index 00000000..263a15a9 --- /dev/null +++ b/release_notes/3.99.1.md @@ -0,0 +1,22 @@ +# Jasmine Core 3.99.1 Release Notes + +This release fixes a bug in 3.99.0, which incorrectly reported a deprecation +warning when a promise returned from a function passed to `it`, `beforeEach`, +etc was resolved to a value. + +## Supported environments + +jasmine-core 3.99.1 has been tested in the following environments. + +| Environment | Supported versions | +|-------------------|--------------------| +| Node | 10, 12, 14, 16 | +| Safari | 10-14 | +| Chrome | 98 | +| Firefox | 97, 78, 68 | +| Edge | 98 | +| Internet Explorer | 10, 11 | + +------ + +_Release Notes generated with _[Anchorman](http://github.com/infews/anchorman)_ From 0ae234dc6ecebc7690d323454f9a68a3f80e9a69 Mon Sep 17 00:00:00 2001 From: Steve Gravrock Date: Mon, 21 Feb 2022 16:58:32 -0800 Subject: [PATCH 6/6] Bump version to 4.0.1 --- RELEASE.md | 2 +- lib/jasmine-core/jasmine.js | 2 +- package.json | 2 +- release_notes/4.0.1.md | 21 +++++++++++++++++++++ 4 files changed, 24 insertions(+), 3 deletions(-) create mode 100644 release_notes/4.0.1.md diff --git a/RELEASE.md b/RELEASE.md index 6762af90..47f32104 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -36,7 +36,7 @@ When ready to release - specs are all green and the stories are done: ### Commit and push core changes 1. Run the browser tests using `scripts/run-all-browsers`. -1. Commit release notes and version changes (jasmine.js, version.rb, package.json) +1. Commit release notes and version changes (jasmine.js, package.json) 1. Push 1. Wait for Circle CI to go green diff --git a/lib/jasmine-core/jasmine.js b/lib/jasmine-core/jasmine.js index e3d873a6..25b5f5a9 100644 --- a/lib/jasmine-core/jasmine.js +++ b/lib/jasmine-core/jasmine.js @@ -10199,5 +10199,5 @@ getJasmineRequireObj().UserContext = function(j$) { }; getJasmineRequireObj().version = function() { - return '4.0.0'; + return '4.0.1'; }; diff --git a/package.json b/package.json index dd9b0cf8..e5ed1ff5 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "jasmine-core", "license": "MIT", - "version": "4.0.0", + "version": "4.0.1", "repository": { "type": "git", "url": "https://github.com/jasmine/jasmine.git" diff --git a/release_notes/4.0.1.md b/release_notes/4.0.1.md new file mode 100644 index 00000000..151beeb1 --- /dev/null +++ b/release_notes/4.0.1.md @@ -0,0 +1,21 @@ +# Jasmine Core 4.0.1 Release Notes + +This release fixes a bug in 4.0.0, which incorrectly reported a failure +when a promise returned from a function passed to `it`, `beforeEach`, +etc was resolved to a value. + +## Supported environments + +jasmine-core 4.0.1 has been tested in the following environments. + +| Environment | Supported versions | +|-------------------|--------------------| +| Node | 12.17+, 14, 16 | +| Safari | 14-15 | +| Chrome | 98 | +| Firefox | 91, 97 | +| Edge | 98 | + +------ + +_Release Notes generated with _[Anchorman](http://github.com/infews/anchorman)_