From 1aa7a21841fa947d2f281ee1475a135be2bdfa41 Mon Sep 17 00:00:00 2001 From: Ben Vinegar Date: Thu, 30 Jun 2016 16:33:11 -0700 Subject: [PATCH] `dataCallback`, `shouldSendCallback` are passed prior callback as 2nd arg --- src/raven.js | 10 ++++++++-- test/raven.test.js | 48 ++++++++++++++++++++++++++++++++++++++++++---- 2 files changed, 52 insertions(+), 6 deletions(-) diff --git a/src/raven.js b/src/raven.js index 700e402b008e..ffd7518a7019 100644 --- a/src/raven.js +++ b/src/raven.js @@ -451,7 +451,10 @@ Raven.prototype = { * @return {Raven} */ setDataCallback: function(callback) { - this._globalOptions.dataCallback = callback; + var original = this._globalOptions.dataCallback; + this._globalOptions.dataCallback = isFunction(callback) + ? function (data) { return callback(data, original); } + : callback; return this; }, @@ -464,7 +467,10 @@ Raven.prototype = { * @return {Raven} */ setShouldSendCallback: function(callback) { - this._globalOptions.shouldSendCallback = callback; + var original = this._globalOptions.shouldSendCallback; + this._globalOptions.shouldSendCallback = isFunction(callback) + ? function (data) { return callback(data, original); } + : callback; return this; }, diff --git a/test/raven.test.js b/test/raven.test.js index 45771c3c9ab4..34e5a7850322 100644 --- a/test/raven.test.js +++ b/test/raven.test.js @@ -1787,9 +1787,14 @@ describe('Raven (public API)', function() { describe('.setDataCallback', function() { it('should set the globalOptions.dataCallback attribute', function() { - var foo = function(){}; + var foo = sinon.stub(); Raven.setDataCallback(foo); - assert.equal(Raven._globalOptions.dataCallback, foo); + + // note that setDataCallback creates a callback/closure around + // foo, so can't test for equality - just verify that calling the wrapper + // also calls foo + Raven._globalOptions.dataCallback(); + assert.isTrue(foo.calledOnce); }); it('should clear globalOptions.dataCallback with no arguments', function() { @@ -1798,13 +1803,33 @@ describe('Raven (public API)', function() { Raven.setDataCallback(); assert.isUndefined(Raven._globalOptions.dataCallback); }); + + it('should generate a wrapper that passes the prior callback as the 2nd argument', function () { + var foo = sinon.stub(); + var bar = sinon.spy(function(data, orig) { + assert.equal(orig, foo); + foo(); + }); + Raven._globalOptions.dataCallback = foo; + Raven.setDataCallback(bar); + Raven._globalOptions.dataCallback({ + 'a': 1 // "data" + }); + assert.isTrue(bar.calledOnce); + assert.isTrue(foo.calledOnce); + }); }); describe('.setShouldSendCallback', function() { it('should set the globalOptions.shouldSendCallback attribute', function() { - var foo = function(){}; + var foo = sinon.stub(); Raven.setShouldSendCallback(foo); - assert.equal(Raven._globalOptions.shouldSendCallback, foo); + + // note that setShouldSendCallback creates a callback/closure around + // foo, so can't test for equality - just verify that calling the wrapper + // also calls foo + Raven._globalOptions.shouldSendCallback(); + assert.isTrue(foo.calledOnce); }); it('should clear globalOptions.shouldSendCallback with no arguments', function() { @@ -1813,6 +1838,21 @@ describe('Raven (public API)', function() { Raven.setShouldSendCallback(); assert.isUndefined(Raven._globalOptions.shouldSendCallback); }); + + it('should generate a wrapper that passes the prior callback as the 2nd argument', function () { + var foo = sinon.stub(); + var bar = sinon.spy(function(data, orig) { + assert.equal(orig, foo); + foo(); + }); + Raven._globalOptions.shouldSendCallback = foo; + Raven.setShouldSendCallback(bar); + Raven._globalOptions.shouldSendCallback({ + 'a': 1 // "data" + }); + assert.isTrue(bar.calledOnce); + assert.isTrue(foo.calledOnce); + }); }); describe('.captureMessage', function() {