Skip to content

Commit

Permalink
Merge branch 'tobepending' of https://github.com/DCtheTall/jasmine
Browse files Browse the repository at this point in the history
* Merges #1808 from @DCtheTall
* Fixes #1803
  • Loading branch information
sgravrock committed Apr 11, 2020
2 parents 79d5521 + 08779f2 commit 4129371
Show file tree
Hide file tree
Showing 4 changed files with 104 additions and 0 deletions.
27 changes: 27 additions & 0 deletions lib/jasmine-core/jasmine.js
Expand Up @@ -4054,6 +4054,32 @@ getJasmineRequireObj().GlobalErrors = function(j$) {
return GlobalErrors;
};

getJasmineRequireObj().toBePending = function(j$) {
/**
* Expect a promise to be pending, ie. the promise is neither resolved nor rejected.
* @function
* @async
* @name async-matchers#toBePending
* @since 3.5.1 (should this be the next version or the version when it was added?)
* @example
* await expectAsync(aPromise).toBePending();
*/
return function toBePending() {
return {
compare: function(actual) {
if (!j$.isPromiseLike(actual)) {
throw new Error('Expected toBePending to be called on a promise.');
}
var want = {};
return Promise.race([actual, Promise.resolve(want)]).then(
function(got) { return {pass: want === got}; },
function() { return {pass: false}; }
);
}
};
};
};

getJasmineRequireObj().toBeRejected = function(j$) {
/**
* Expect a promise to be rejected.
Expand Down Expand Up @@ -5087,6 +5113,7 @@ getJasmineRequireObj().ObjectPath = function(j$) {

getJasmineRequireObj().requireAsyncMatchers = function(jRequire, j$) {
var availableMatchers = [
'toBePending',
'toBeResolved',
'toBeRejected',
'toBeResolvedTo',
Expand Down
51 changes: 51 additions & 0 deletions spec/core/matchers/async/toBePendingSpec.js
@@ -0,0 +1,51 @@
describe('toBePending', function() {
it('passes if the actual promise is pending', function() {
jasmine.getEnv().requirePromises();

var matchersUtil = new jasmineUnderTest.MatchersUtil(),
matcher = jasmineUnderTest.asyncMatchers.toBePending(matchersUtil),
actual = new Promise(function() {});

return matcher.compare(actual).then(function(result) {
expect(result).toEqual(jasmine.objectContaining({pass: true}));
});
});

it('fails if the actual promise is resolved', function() {
jasmine.getEnv().requirePromises();

var matchersUtil = new jasmineUnderTest.MatchersUtil(),
matcher = jasmineUnderTest.asyncMatchers.toBePending(matchersUtil),
actual = Promise.resolve();

return matcher.compare(actual).then(function(result) {
expect(result).toEqual(jasmine.objectContaining({pass: false}));
});
});

it('fails if the actual promise is rejected', function() {
jasmine.getEnv().requirePromises();

var matchersUtil = new jasmineUnderTest.MatchersUtil(),
matcher = jasmineUnderTest.asyncMatchers.toBePending(matchersUtil),
actual = Promise.reject(new Error('promise was rejected'));

return matcher.compare(actual).then(function(result) {
expect(result).toEqual(jasmine.objectContaining({pass: false}));
});
});

it('fails if actual is not a promise', function() {
var matchersUtil = new jasmineUnderTest.MatchersUtil(),
matcher = jasmineUnderTest.asyncMatchers.toBePending(matchersUtil),
actual = 'not a promise';

function f() {
return matcher.compare(actual);
}

expect(f).toThrowError(
'Expected toBePending to be called on a promise.'
);
});
});
25 changes: 25 additions & 0 deletions src/core/matchers/async/toBePending.js
@@ -0,0 +1,25 @@
getJasmineRequireObj().toBePending = function(j$) {
/**
* Expect a promise to be pending, ie. the promise is neither resolved nor rejected.
* @function
* @async
* @name async-matchers#toBePending
* @since 3.5.1 (should this be the next version or the version when it was added?)
* @example
* await expectAsync(aPromise).toBePending();
*/
return function toBePending() {
return {
compare: function(actual) {
if (!j$.isPromiseLike(actual)) {
throw new Error('Expected toBePending to be called on a promise.');
}
var want = {};
return Promise.race([actual, Promise.resolve(want)]).then(
function(got) { return {pass: want === got}; },
function() { return {pass: false}; }
);
}
};
};
};
1 change: 1 addition & 0 deletions src/core/matchers/requireAsyncMatchers.js
@@ -1,5 +1,6 @@
getJasmineRequireObj().requireAsyncMatchers = function(jRequire, j$) {
var availableMatchers = [
'toBePending',
'toBeResolved',
'toBeRejected',
'toBeResolvedTo',
Expand Down

0 comments on commit 4129371

Please sign in to comment.