diff --git a/plugins/console.js b/plugins/console.js index 68eff29a07f0..afbae30d8631 100644 --- a/plugins/console.js +++ b/plugins/console.js @@ -17,13 +17,14 @@ function consolePlugin(Raven, console, pluginOptions) { console = console || window.console || {}; pluginOptions = pluginOptions || {}; - var logLevels = pluginOptions.levels || ['debug', 'info', 'warn', 'error'], - level = logLevels.pop(); + var logLevels = pluginOptions.levels || ['debug', 'info', 'warn', 'error']; + if ('assert' in console) logLevels.push('assert'); var callback = function(msg, data) { Raven.captureMessage(msg, data); }; + var level = logLevels.pop(); while (level) { wrapConsoleMethod(console, level, callback); level = logLevels.pop(); diff --git a/src/console.js b/src/console.js index 195f5dd6e0dc..c28aeb428e96 100644 --- a/src/console.js +++ b/src/console.js @@ -15,7 +15,17 @@ var wrapMethod = function(console, level, callback) { var msg = '' + args.join(' '); var data = {level: sentryLevel, logger: 'console', extra: {arguments: args}}; - callback && callback(msg, data); + + if (level === 'assert') { + if (args[0] === false) { + // Default browsers message + msg = 'Assertion failed: ' + (args.slice(1).join(' ') || 'console.assert'); + data.extra.arguments = args.slice(1); + callback && callback(msg, data); + } + } else { + callback && callback(msg, data); + } // this fails for some browsers. :( if (originalConsoleLevel) { diff --git a/test/plugins/console.test.js b/test/plugins/console.test.js index 16e9a5f89635..6fc82f73c473 100644 --- a/test/plugins/console.test.js +++ b/test/plugins/console.test.js @@ -13,7 +13,8 @@ describe('console plugin', function() { debug: function() {}, info: function() {}, warn: function() {}, - error: function() {} + error: function() {}, + assert: function() {} }; consolePlugin(Raven, console); @@ -51,4 +52,54 @@ describe('console plugin', function() { } }); }); + + describe('console.assert', function() { + var console; + + beforeEach(function() { + console = { + assert: function() {} + }; + consolePlugin(Raven, console); + this.sinon.stub(Raven, 'captureMessage'); + }); + + it("shouldn't trigger captureMessage when assertion passes", function() { + console.assert(2 + 2 === 4, 'random message'); + assert.equal(Raven.captureMessage.callCount, 0); + }); + + it('should trigger captureMessages when assertion fails', function() { + console.assert(2 + 2 === 5, 'random message', 'and even more'); + assert.equal(Raven.captureMessage.callCount, 1); + assert.equal( + Raven.captureMessage.getCall(0).args[0], + 'Assertion failed: random message and even more' + ); + assert.deepEqual(Raven.captureMessage.getCall(0).args[1], { + level: 'assert', + logger: 'console', + extra: { + arguments: ['random message', 'and even more'] + } + }); + }); + + // As this is default browsers behaviour + it("should default to 'console.assert' message for failed assertion", function() { + console.assert(2 + 2 === 5); + assert.equal(Raven.captureMessage.callCount, 1); + assert.equal( + Raven.captureMessage.getCall(0).args[0], + 'Assertion failed: console.assert' + ); + assert.deepEqual(Raven.captureMessage.getCall(0).args[1], { + level: 'assert', + logger: 'console', + extra: { + arguments: [] + } + }); + }); + }); });