diff --git a/src/react-native/predicates.js b/src/react-native/predicates.js deleted file mode 100644 index f99f6741d..000000000 --- a/src/react-native/predicates.js +++ /dev/null @@ -1,40 +0,0 @@ -var _ = require('../utility'); -var logger = require('./logger'); - -function checkLevel(item, settings) { - var level = item.level || 'error'; - var reportLevel = settings.reportLevel; - - var levelVal = _.LEVELS[level] || 0; - var reportLevelVal = _.LEVELS[reportLevel] || 0; - - if (levelVal < reportLevelVal) { - var msg = 'Level ' + level; - msg += ' is less than configured reporting level of '; - msg += reportLevel; - return {err: new Error(msg)}; - } - return true; -} - -function userCheckIgnore(item, settings) { - var isUncaught = !!item._isUncaught; - delete item._isUncaught; - var args = item._originalArgs; - delete item._originalArgs; - try { - if (_.isFunction(settings.checkIgnore) && settings.checkIgnore(isUncaught, args, item)) { - return {err: new Error('Ignored by checkIgnore function')}; - } - } catch (e) { - settings.checkIgnore = null; - logger.error('Error while calling custom checkIgnore(), removing', e); - } - return true; -} - -module.exports = { - checkLevel: checkLevel, - userCheckIgnore: userCheckIgnore -}; - diff --git a/src/react-native/rollbar.js b/src/react-native/rollbar.js index eb0862953..faf8531f7 100644 --- a/src/react-native/rollbar.js +++ b/src/react-native/rollbar.js @@ -9,7 +9,7 @@ var urllib = require('../browser/url'); var transforms = require('./transforms'); var sharedTransforms = require('../transforms'); -var predicates = require('./predicates'); +var sharedPredicates = require('../predicates'); function Rollbar(options, client) { if (_.isType(options, 'string')) { @@ -279,6 +279,7 @@ function addTransformsToNotifier(notifier) { .addTransform(sharedTransforms.addTelemetryData) .addTransform(sharedTransforms.addConfigToPayload) .addTransform(transforms.scrubPayload) + .addTransform(sharedTransforms.userTransform(logger)) .addTransform(sharedTransforms.addConfiguredOptions) .addTransform(sharedTransforms.addDiagnosticKeys) .addTransform(sharedTransforms.itemToPayload); @@ -286,8 +287,8 @@ function addTransformsToNotifier(notifier) { function addPredicatesToQueue(queue) { queue - .addPredicate(predicates.checkLevel) - .addPredicate(predicates.userCheckIgnore); + .addPredicate(sharedPredicates.checkLevel) + .addPredicate(sharedPredicates.userCheckIgnore(logger)); } Rollbar.prototype._createItem = function(args) { diff --git a/test/browser.rollbar.test.js b/test/browser.rollbar.test.js index af702b0fa..8c0ecd2f6 100644 --- a/test/browser.rollbar.test.js +++ b/test/browser.rollbar.test.js @@ -713,6 +713,98 @@ describe('onerror', function() { }) }); +describe('callback options', function() { + beforeEach(function (done) { + window.server = sinon.createFakeServer(); + done(); + }); + + afterEach(function () { + window.rollbar.configure({ autoInstrument: false }); + window.server.restore(); + }); + + function stubResponse(server) { + server.respondWith('POST', 'api/1/item', + [ + 200, + { 'Content-Type': 'application/json' }, + '{"err": 0, "result":{ "uuid": "d4c7acef55bf4c9ea95e4fe9428a8287"}}' + ] + ); + } + + it('should use checkIgnore when set', function(done) { + var server = window.server; + stubResponse(server); + server.requests.length = 0; + + var options = { + accessToken: 'POST_CLIENT_ITEM_TOKEN', + checkIgnore: function(_isUncaught, _args, _payload) { + return true; + } + }; + var rollbar = window.rollbar = new Rollbar(options); + + rollbar.log('test'); // generate a payload to ignore + + server.respond(); + + expect(server.requests.length).to.eql(0); + + done(); + }); + + it('should use onSendCallback when set', function(done) { + var server = window.server; + stubResponse(server); + server.requests.length = 0; + + var options = { + accessToken: 'POST_CLIENT_ITEM_TOKEN', + onSendCallback: function(_isUncaught, _args, payload) { + payload.foo = 'bar'; + } + }; + var rollbar = window.rollbar = new Rollbar(options); + + rollbar.log('test'); // generate a payload to inspect + + server.respond(); + + expect(server.requests.length).to.eql(1); + var body = JSON.parse(server.requests[0].requestBody); + expect(body.data.foo).to.eql('bar'); + + done(); + }); + + it('should use transform when set', function(done) { + var server = window.server; + stubResponse(server); + server.requests.length = 0; + + var options = { + accessToken: 'POST_CLIENT_ITEM_TOKEN', + transform: function(data, _item) { + data.foo = 'baz'; + } + }; + var rollbar = window.rollbar = new Rollbar(options); + + rollbar.log('test'); // generate a payload to inspect + + server.respond(); + + expect(server.requests.length).to.eql(1); + var body = JSON.parse(server.requests[0].requestBody); + expect(body.data.foo).to.eql('baz'); + + done(); + }); +}); + describe('options.autoInstrument', function() { beforeEach(function (done) { window.server = sinon.createFakeServer(); diff --git a/test/examples/webpack.test.js b/test/examples/webpack.test.js index 71acb1375..2628823f4 100644 --- a/test/examples/webpack.test.js +++ b/test/examples/webpack.test.js @@ -68,8 +68,9 @@ describe('webpack app', function() { // This has become necessary because Travis switched their Chrome stable // version _down_ from 76 to 62, which handles this test case differently. + // 2020-05-06: Travis Chrome 62 is now returning the original message. var version = parseInt(window.navigator.userAgent.match(new RegExp('^.*HeadlessChrome/([0-9]*).*$'))[1]); - var message = version > 62 ? 'webpack test error' : 'Script error.'; + var message = version >= 62 ? 'webpack test error' : 'Script error.'; expect(body.data.body.trace.exception.message).to.eql(message); diff --git a/test/react-native.rollbar.test.js b/test/react-native.rollbar.test.js index 492410713..6da191fea 100644 --- a/test/react-native.rollbar.test.js +++ b/test/react-native.rollbar.test.js @@ -299,6 +299,85 @@ describe('captureEvent', function() { }); }); +describe('callback options', function() { + beforeEach(function (done) { + // In react-native environment, stub fetch() instead of XMLHttpRequest + window.fetchStub = sinon.stub(window, 'fetch'); + done(); + }); + + afterEach(function () { + window.fetch.restore(); + }); + + function stubResponse(code, err, message) { + var uuid = 'd4c7acef55bf4c9ea95e4fe9428a8287'; + + window.fetch.returns(Promise.resolve(new Response( + JSON.stringify({ err: err, message: message, result: { uuid: uuid }}), + { status: code, statusText: message, headers: { 'Content-Type': 'application/json' }} + ))); + } + + it('should use checkIgnore when set', function(done) { + stubResponse(200, 0, 'OK'); + + var options = { + accessToken: 'POST_CLIENT_ITEM_TOKEN', + checkIgnore: function(_isUncaught, _args, _payload) { + return true; + } + }; + var rollbar = new Rollbar(options); + + rollbar.log('test'); // generate a payload to ignore + + expect(window.fetchStub.called).to.not.be.ok(); + + done(); + }); + + it('should use onSendCallback when set', function(done) { + stubResponse(200, 0, 'OK'); + + var options = { + accessToken: 'POST_CLIENT_ITEM_TOKEN', + onSendCallback: function(_isUncaught, _args, payload) { + payload.foo = 'bar'; + } + }; + var rollbar = new Rollbar(options); + + rollbar.log('test'); // generate a payload to inspect + + expect(window.fetchStub.called).to.be.ok(); + var body = JSON.parse(window.fetchStub.getCall(0).args[1].body); + expect(body.data.foo).to.eql('bar'); + + done(); + }); + + it('should use transform when set', function(done) { + stubResponse(200, 0, 'OK'); + + var options = { + accessToken: 'POST_CLIENT_ITEM_TOKEN', + transform: function(data, _item) { + data.foo = 'baz'; + } + }; + var rollbar = new Rollbar(options); + + rollbar.log('test'); // generate a payload to inspect + + expect(window.fetchStub.called).to.be.ok(); + var body = JSON.parse(window.fetchStub.getCall(0).args[1].body); + expect(body.data.foo).to.eql('baz'); + + done(); + }); +}); + describe('createItem', function() { it('should handle multiple strings', function(done) { var client = new (TestClientGen())();