Skip to content

Commit abcbbf2

Browse files
author
Dan Perron
committed
Return a Promise from Sender.send() if it is called without a callback.
1 parent 3476392 commit abcbbf2

File tree

2 files changed

+155
-1
lines changed

2 files changed

+155
-1
lines changed

lib/sender.js

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,20 @@ function Sender(key, options) {
2121
}
2222

2323
Sender.prototype.send = function(message, recipient, options, callback) {
24+
var rVal;
2425
if(typeof options == "function") {
2526
callback = options;
2627
options = null;
2728
}
2829
else if(!callback) {
29-
callback = function() {};
30+
rVal = new Promise(function(resolve, reject) {
31+
callback = function(err, response) {
32+
if (err) {
33+
return reject(err);
34+
}
35+
return resolve(response);
36+
}
37+
});
3038
}
3139
options = cleanOptions(options);
3240

@@ -39,6 +47,7 @@ Sender.prototype.send = function(message, recipient, options, callback) {
3947
}
4048
sendMessageWithRetries(this.requestOptions, body, options, callback);
4149
}.bind(this));
50+
return rVal;
4251
};
4352

4453
function cleanOptions(options) {

test/unit/senderSpec.js

Lines changed: 145 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -451,6 +451,8 @@ describe('UNIT Sender', function () {
451451

452452
it('should retry if not all regTokens were successfully sent', function (done) {
453453
var callback = function () {
454+
// These expect calls don't get reported to the test runner, they just result
455+
// in a timeout.
454456
expect(requestStub.args.length).to.equal(3);
455457
var requestOptions = requestStub.args[2][0];
456458
expect(requestOptions.json.registration_ids.length).to.equal(1);
@@ -514,4 +516,147 @@ describe('UNIT Sender', function () {
514516
}, callback);
515517
});
516518
});
519+
520+
describe('send() with promise', function () {
521+
function setArgs(err, res, resBody) {
522+
args = {
523+
err: err,
524+
res: res,
525+
resBody: resBody
526+
};
527+
}
528+
529+
beforeEach(function() {
530+
requestStub.reset();
531+
setArgs(null, { statusCode: 200 }, {});
532+
});
533+
534+
it('should return the response in the promise if successful for token', function () {
535+
var response = {
536+
success: 1,
537+
failure: 0,
538+
results: [
539+
{ message_id: "something" }
540+
]
541+
},
542+
sender = new Sender('myKey');
543+
setArgs(null, { statusCode: 200 }, response);
544+
return sender.send({}, [1]).then(function(output) {
545+
expect(output).to.equal(response);
546+
expect(requestStub.args.length).to.equal(1);
547+
});
548+
});
549+
550+
it('should return the response in the promise if successful for tokens', function () {
551+
var response = {
552+
success: 1,
553+
failure: 0,
554+
results: [
555+
{ message_id: "something" }
556+
]
557+
},
558+
sender = new Sender('myKey');
559+
setArgs(null, { statusCode: 200 }, response);
560+
return sender.send({}, [1, 2, 3]).then(function(output) {
561+
expect(output).to.equal(response);
562+
expect(requestStub.args.length).to.equal(1);
563+
});
564+
});
565+
566+
it('should reject the promise with the appropriate error if failure for token', function () {
567+
var error = 'my error',
568+
sender = new Sender('myKey');
569+
setArgs(error);
570+
sender.send({}, [1], 0).then(function() {
571+
chai.assert.fail();
572+
}).catch(function(err) {
573+
expect(err).to.equal(error);
574+
expect(requestStub.args.length).to.equal(1);
575+
});
576+
});
577+
578+
it('should reject the promise with the appropriate error if failure for tokens', function () {
579+
var error = 'my error',
580+
sender = new Sender('myKey');
581+
setArgs(error);
582+
return sender.send({}, [1, 2, 3], 0).then(function() {
583+
chai.assert.fail();
584+
}).catch(function(err) {
585+
expect(err).to.equal(error);
586+
expect(requestStub.args.length).to.equal(1);
587+
});
588+
});
589+
590+
it('should retry number of times passed into call and do exponential backoff', function () {
591+
var start = new Date();
592+
var sender = new Sender('myKey');
593+
setArgs(null, { statusCode: 500 });
594+
return sender.send({ data: {}}, [1], {
595+
retries: 1,
596+
backoff: 200
597+
}).catch(function() {}).then(function() {
598+
expect(requestStub.args.length).to.equal(2);
599+
expect(new Date() - start).to.be.gte(200);
600+
});
601+
});
602+
603+
it('should retry if not all regTokens were successfully sent', function () {
604+
var sender = new Sender('myKey');
605+
setArgs(
606+
null,
607+
{ statusCode: 200},
608+
[
609+
{ results: [{}, { error: 'Unavailable' },
610+
{ error: 'Unavailable' }]},
611+
{ results: [ {}, { error: 'Unavailable' } ] },
612+
{ results: [ {} ] }
613+
]);
614+
return sender.send({data: {}}, [1,2,3], {
615+
retries: 5,
616+
backoff: 100
617+
}).catch(function() {}).then(function() {
618+
expect(requestStub.args.length).to.equal(3);
619+
var requestOptions = requestStub.args[2][0];
620+
expect(requestOptions.json.registration_ids.length).to.equal(1);
621+
expect(requestOptions.json.registration_ids[0]).to.equal(3);
622+
});
623+
});
624+
625+
it('should retry all regTokens in event of an error', function () {
626+
var sender = new Sender('myKey');
627+
setArgs('my error');
628+
return sender.send({ data: {}}, [1,2,3], 1).catch(function() {}).then(function() {
629+
expect(requestStub.args.length).to.equal(2);
630+
var requestOptions = requestStub.args[1][0];
631+
expect(requestOptions.json.registration_ids.length).to.equal(3);
632+
});
633+
});
634+
635+
it('should update the failures and successes correctly when retrying', function () {
636+
var sender = new Sender('myKey');
637+
setArgs(null, { statusCode: 200 }, [
638+
{ success: 1, failure: 2, canonical_ids: 0, results: [ {}, { error: 'Unavailable' }, { error: 'Unavailable' } ] },
639+
{ success: 1, canonical_ids: 1, failure: 0, results: [ {}, {} ] }
640+
]);
641+
return sender.send({ data: {}}, [1,2,3], 3).then(function(response) {
642+
expect(response.canonical_ids).to.equal(1);
643+
expect(response.success).to.equal(2);
644+
expect(response.failure).to.equal(0);
645+
});
646+
});
647+
648+
it('should update the failures and successes correctly when retrying and failing some', function () {
649+
var sender = new Sender('myKey');
650+
setArgs(null, { statusCode: 200 }, [
651+
{ success: 0, failure: 3, canonical_ids: 0, results: [ { error: 'Unavailable' }, { error: 'Unavailable' }, { error: 'Unavailable' } ] },
652+
{ success: 1, canonical_ids: 0, failure: 2, results: [ { error: 'Unavailable' }, { error: 'Unavailable' }, {} ] },
653+
{ success: 0, canonical_ids: 0, failure: 2, results: [ { error: 'Unavailable' }, { error: 'Unavailable' } ] }
654+
]);
655+
return sender.send({ data: {}}, [1,2,3], {retries: 2, backoff: 100}).then(function(response) {
656+
expect(response.canonical_ids).to.equal(0);
657+
expect(response.success).to.equal(1);
658+
expect(response.failure).to.equal(2);
659+
});
660+
});
661+
});
517662
});

0 commit comments

Comments
 (0)