201 lines
7.1 KiB
JavaScript
201 lines
7.1 KiB
JavaScript
"use strict";
|
||
var assert = require("assert");
|
||
var testUtils = require("./helpers/util.js");
|
||
var awaitGlobalException = testUtils.awaitGlobalException;
|
||
var sinon = require("sinon");
|
||
var isNodeJS = testUtils.isNodeJS;
|
||
/*
|
||
Copyright 2009–2012 Kristopher Michael Kowal. All rights reserved.
|
||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||
of this software and associated documentation files (the "Software"), to
|
||
deal in the Software without restriction, including without limitation the
|
||
rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||
sell copies of the Software, and to permit persons to whom the Software is
|
||
furnished to do so, subject to the following conditions:
|
||
|
||
The above copyright notice and this permission notice shall be included in
|
||
all copies or substantial portions of the Software.
|
||
|
||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||
IN THE SOFTWARE.
|
||
*/
|
||
|
||
describe("nodeify", function () {
|
||
|
||
it("calls back with a resolution", function () {
|
||
var spy = sinon.spy();
|
||
Promise.resolve(10).nodeify(spy);
|
||
setTimeout(function(){
|
||
sinon.assert.calledOnce(spy);
|
||
sinon.assert.calledWith(spy, null, 10);
|
||
}, 1);
|
||
});
|
||
|
||
it("calls back with an undefined resolution", function() {
|
||
var spy = sinon.spy();
|
||
Promise.resolve().nodeify(spy);
|
||
setTimeout(function(){
|
||
sinon.assert.calledOnce(spy);
|
||
sinon.assert.calledWithExactly(spy, null);
|
||
}, 1);
|
||
});
|
||
|
||
it("calls back with an error", function () {
|
||
var spy = sinon.spy();
|
||
Promise.reject(10).nodeify(spy);
|
||
setTimeout(function(){
|
||
sinon.assert.calledOnce(spy);
|
||
sinon.assert.calledWith(spy, 10);
|
||
}, 1);
|
||
});
|
||
|
||
it("forwards a promise", function () {
|
||
return Promise.resolve(10).nodeify().then(function (ten) {
|
||
assert(10 === ten);
|
||
});
|
||
});
|
||
|
||
it("returns undefined when a callback is passed", function () {
|
||
return 'undefined' === typeof Promise.resolve(10).nodeify(function () {});
|
||
});
|
||
|
||
});
|
||
var getSpy = testUtils.getSpy;
|
||
if (isNodeJS) {
|
||
describe("nodeify", function () {
|
||
var h = [];
|
||
var e = new Error();
|
||
function thrower() {
|
||
throw e;
|
||
}
|
||
|
||
it("throws normally in the node process if the function throws", function() {
|
||
var promise = Promise.resolve(10);
|
||
var turns = 0;
|
||
process.nextTick(function(){
|
||
turns++;
|
||
});
|
||
promise.nodeify(thrower);
|
||
return awaitGlobalException(function(err) {
|
||
assert(err === e);
|
||
assert(turns === 1);
|
||
});
|
||
});
|
||
|
||
it("always returns promise for now", function() {
|
||
return Promise.resolve(3).nodeify().then(function() {
|
||
var a = 0;
|
||
Promise.resolve(3).nodeify(function(){
|
||
a++;
|
||
}).then(function() {
|
||
assert(1 == 1);
|
||
});
|
||
});
|
||
});
|
||
|
||
it("should spread arguments with spread option", function() {
|
||
var spy = getSpy();
|
||
Promise.resolve([1,2,3]).nodeify(spy(function(err, a, b, c) {
|
||
assert(err === null);
|
||
assert(a === 1);
|
||
assert(b === 2);
|
||
assert(c === 3);
|
||
}), {spread: true});
|
||
return spy.promise;
|
||
});
|
||
|
||
describe("promise rejected with falsy values", function() {
|
||
specify("no reason", function() {
|
||
var spy = getSpy();
|
||
Promise.reject().nodeify(spy(function(err) {
|
||
assert.strictEqual(arguments.length, 1);
|
||
assert.strictEqual(err.cause, undefined);
|
||
}));
|
||
return spy.promise;
|
||
});
|
||
specify("null reason", function() {
|
||
var spy = getSpy();
|
||
Promise.reject(null).nodeify(spy(function(err) {
|
||
assert.strictEqual(arguments.length, 1);
|
||
assert.strictEqual(err.cause, null);
|
||
}));
|
||
return spy.promise;
|
||
});
|
||
specify("nodefying a follewer promise", function() {
|
||
var spy = getSpy();
|
||
new Promise(function(resolve, reject) {
|
||
resolve(new Promise(function(_, reject) {
|
||
setTimeout(function() {
|
||
reject();
|
||
}, 1);
|
||
}))
|
||
}).nodeify(spy(function(err) {
|
||
assert.strictEqual(arguments.length, 1);
|
||
assert.strictEqual(err.cause, undefined);
|
||
}));
|
||
return spy.promise;
|
||
});
|
||
specify("nodefier promise becomes follower", function() {
|
||
var spy = getSpy();
|
||
Promise.resolve(1).then(function() {
|
||
return new Promise(function(_, reject) {
|
||
setTimeout(function() {
|
||
reject();
|
||
}, 1);
|
||
});
|
||
}).nodeify(spy(function(err) {
|
||
assert.strictEqual(arguments.length, 1);
|
||
assert.strictEqual(err.cause, undefined);
|
||
}));
|
||
return spy.promise;
|
||
});
|
||
});
|
||
it("should wrap arguments with spread option", function() {
|
||
var spy = getSpy();
|
||
Promise.resolve([1,2,3]).nodeify(spy(function(err, a, b, c) {
|
||
assert(err === null);
|
||
assert(a === 1);
|
||
assert(b === 2);
|
||
assert(c === 3);
|
||
}), {spread: true});
|
||
return spy.promise;
|
||
});
|
||
|
||
it("should work then result is not an array", function() {
|
||
var spy = getSpy();
|
||
Promise.resolve(3).nodeify(spy(function(err, a) {
|
||
assert(err === null);
|
||
assert(a === 3);
|
||
}), {spread: true});
|
||
return spy.promise;
|
||
});
|
||
|
||
it("should work if the callback throws when spread", function() {
|
||
var err = new Error();
|
||
Promise.resolve([1,2,3]).nodeify(function(_, a) {
|
||
throw err;
|
||
}, {spread: true});
|
||
|
||
return awaitGlobalException(function(e) {
|
||
assert.strictEqual(err, e);
|
||
});
|
||
});
|
||
|
||
it("should work if the callback throws when rejected", function() {
|
||
var err = new Error();
|
||
Promise.reject(new Error()).nodeify(function(_, a) {
|
||
throw err;
|
||
});
|
||
|
||
return awaitGlobalException(function(e) {
|
||
assert.strictEqual(err, e);
|
||
});
|
||
});
|
||
});
|
||
}
|