dojo
Version:
Dojo core is a powerful, lightweight library that makes common tasks quicker and easier. Animate elements, manipulate the DOM, and query with easy CSS syntax, all without sacrificing performance.
253 lines (203 loc) • 7.96 kB
JavaScript
define([
'intern!object',
'intern/chai!assert',
'../../../Deferred'
], function (registerSuite, assert, Deferred) {
// NOTE: At the time of this writing, Dojo promises can call resolve and reject handlers
// on the same turn `then` is called, but these tests are written as if the handlers
// are always called on the next turn so that they will not break if Dojo promises are made Promises/A+ compliant.
// Any tests added to this suite should be written in this way.
registerSuite({
name: 'dojo/promise/Promise',
'.always will be invoked for resolution and rejection': function () {
var deferredToResolve = new Deferred();
var expectedResolvedResult = {};
var resolvedResult;
var resolvedAlwaysResult;
var deferredToReject = new Deferred();
var expectedRejectedResult = {};
var rejectedResult;
var dfd = this.async();
deferredToResolve.promise.then(function (result) {
resolvedResult = result;
});
deferredToResolve.promise.always(function (result) {
resolvedAlwaysResult = result;
// Nest the rejected tests here to avoid chaining the promises under test
deferredToReject.promise.then(null, function (result) {
rejectedResult = result;
});
// Use this.async so we don't rely on the promise implementation under test
deferredToReject.promise.always(dfd.callback(function (rejectedAlwaysResult) {
assert.strictEqual(resolvedResult, expectedResolvedResult);
assert.strictEqual(resolvedAlwaysResult, resolvedResult);
assert.strictEqual(rejectedResult, expectedRejectedResult);
assert.strictEqual(rejectedAlwaysResult, rejectedResult);
}));
deferredToReject.reject(expectedRejectedResult);
});
deferredToResolve.resolve(expectedResolvedResult);
},
'.otherwise() is equivalent to .then(null, ...)': function () {
var deferred = new Deferred();
var expectedResult = {};
var rejectedResult;
deferred.promise.then(null, function (result) {
rejectedResult = result;
});
// Use this.async so we don't rely on the promise implementation under test
deferred.promise.otherwise(this.async().callback(function (otherwiseResult) {
assert.strictEqual(rejectedResult, expectedResult);
assert.strictEqual(otherwiseResult, rejectedResult);
}));
deferred.reject(expectedResult);
},
'.trace() returns the same promise': function () {
var deferred = new Deferred();
var expectedPromise = deferred.promise;
assert.strictEqual(expectedPromise.trace(), expectedPromise);
},
'.traceRejected() returns the same promise': function () {
var deferred = new Deferred();
var expectedPromise = deferred.promise;
assert.strictEqual(expectedPromise.traceRejected(), expectedPromise);
},
'finally() called when deferred already resolved': function () {
var deferred = new Deferred();
var thenExpected = {};
var finallyExpected = undefined;
deferred.resolve(thenExpected);
return deferred.promise["finally"](function (finallyResult) {
assert.equal(finallyResult, finallyExpected);
return "blah";
}).then(function (thenResult) {
assert.equal(thenResult, thenExpected);
})["catch"](function () {
assert.fail("Promise should not have rejected.");
});
},
'finally() called when deferred is resolved later': function () {
var deferred = new Deferred();
var thenExpected = {};
var finallyExpected = undefined;
setTimeout(function () {
deferred.resolve(thenExpected);
},0);
return deferred.promise["finally"](function (finallyResult) {
assert.equal(finallyResult, finallyExpected);
return "blahblah";
}).then(function (thenResult) {
assert.equal(thenResult, thenExpected);
})["catch"](function () {
assert.fail("Promise should not have rejected.");
});
},
'finally() called when deferred already rejected': function () {
var deferred = new Deferred();
var expected = new Error();
var finallyExpected = undefined;
deferred.reject(expected);
return deferred.promise["finally"](function (finallyResult) {
assert.equal(finallyResult, finallyExpected);
}).then(function () {
assert.fail("Promise should not have resolved.");
})["catch"](function (result) {
assert.equal(result, expected);
});
},
'finally() called when deferred is rejected later': function () {
var deferred = new Deferred();
var otherwiseExpected = new Error();
var finallyExpected = undefined;
setTimeout(function () {
deferred.reject(otherwiseExpected);
},0);
return deferred.promise["finally"](function (finallyResult) {
assert.equal(finallyResult, finallyExpected);
}).then(function () {
assert.fail("Promise should not have resolved.");
})["catch"](function (otherwiseResult) {
assert.equal(otherwiseResult, otherwiseExpected);
});
},
'finally() holds up call chain when chaining from a resolved promise and returning a promise that will resolve': function () {
var deferred = new Deferred();
var testValue = 0;
var expectedTestValue = 1;
var thenExpected = {};
deferred.resolve(thenExpected);
var resultPromise = deferred.promise["finally"](function () {
var dfd2 = new Deferred();
setTimeout(function () {
testValue = expectedTestValue;
dfd2.resolve({});
},0);
return dfd2.promise;
});
//shouldn't be resolved until after the setTimeout fires.
assert.equal(resultPromise.isResolved(), false);
assert.equal(resultPromise.isFulfilled(), false);
return resultPromise.then(function (thenResult) {
assert.equal(testValue, expectedTestValue);
assert.equal(thenResult, thenExpected);
},function () {
assert.fail("Promise should not have rejected");
});
},
'finally() holds up call chain correctly when chaining from a rejected promise and returning a promise that will reject': function () {
var deferred = new Deferred();
var expectedError = new Error();
deferred.reject();
var resultPromise = deferred.promise["finally"](function () {
var dfd2 = new Deferred();
setTimeout(function () {
dfd2.reject(expectedError);
},0);
return dfd2.promise;
});
assert.equal(resultPromise.isRejected(), false);
assert.equal(resultPromise.isFulfilled(), false);
return resultPromise.then(function () {
assert.fail("Promise should not have resolved.");
},function (resultError) {
assert.equal(resultError, expectedError);
});
},
'finally() returns rejected promise if callback throws exception': function () {
var deferred = new Deferred();
var expectedError = new Error();
deferred.resolve();
return deferred.promise["finally"](function () {
throw expectedError;
}).then(function () {
assert.fail("Promise should not have resolved.");
})["catch"](function (resultError) {
assert.equal(resultError, expectedError);
});
},
'finally() returns rejected promise if chained off resolved promise and callback returns rejected promise': function () {
var deferred = new Deferred();
var expectedError = new Error();
deferred.resolve();
return deferred.promise["finally"](function () {
return new Deferred().reject(expectedError);
}).then(function () {
assert.fail("Promise should not have resolved");
})["catch"](function (resultError) {
assert.equal(resultError, expectedError);
});
},
'finally() returns rejected promise if chained off rejected promise and callback returns rejected promise': function () {
var deferred = new Deferred();
var expectedError = new Error();
deferred.reject(new Error() /* not the expected error */);
return deferred.promise["finally"](function () {
return new Deferred().reject(expectedError);
}).then(function () {
assert.fail("Promise should not have resolved");
})["catch"](function (resultError) {
assert.equal(resultError, expectedError);
});
}
});
});