From 02c330165c6c2df4d1a37634ade78b54d8862758 Mon Sep 17 00:00:00 2001 From: Marsel Zaripov Date: Sat, 26 Jul 2014 19:42:46 +0400 Subject: [PATCH 1/4] Move logging to console when debug is enabled into separate function --- src/raven.js | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/raven.js b/src/raven.js index e5f8780c3a4e..e0ab8098e370 100644 --- a/src/raven.js +++ b/src/raven.js @@ -681,9 +681,7 @@ function makeRequest(data) { function isSetup() { if (!hasJSON) return false; // needs JSON support if (!globalServer) { - if (window.console && console.error && Raven.debug) { - console.error("Error: Raven has not been configured."); - } + logDebug('error', 'Error: Raven has not been configured.'); return false; } return true; @@ -720,6 +718,12 @@ function uuid4() { }); } +function logDebug(level, message) { + if (window.console && console[level] && Raven.debug) { + console[level](message); + } +} + function afterLoad() { // Attempt to initialize Raven on load var RavenConfig = window.RavenConfig; From 95a265abf3387f517dcca4edb67daea2aaba26c1 Mon Sep 17 00:00:00 2001 From: Marsel Zaripov Date: Sat, 26 Jul 2014 19:44:45 +0400 Subject: [PATCH 2/4] Add tests for logDebug --- test/raven.test.js | 37 +++++++++++++++++++------------------ 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/test/raven.test.js b/test/raven.test.js index 74b43777dbf7..3196d6da4837 100644 --- a/test/raven.test.js +++ b/test/raven.test.js @@ -218,31 +218,32 @@ describe('globals', function() { it('should return false when Raven is not configured', function() { hasJSON = true; // be explicit globalServer = undefined; - this.sinon.stub(console, 'error'); + this.sinon.stub(window, 'logDebug'); assert.isFalse(isSetup()); }); - it('should not write to console.error when Raven is not configured and Raven.debug is false', function() { - hasJSON = true; // be explicit - globalServer = undefined; - Raven.debug = false; - this.sinon.stub(console, 'error'); - isSetup(); - assert.isFalse(console.error.calledOnce); + it('should return true when everything is all gravy', function() { + hasJSON = true; + assert.isTrue(isSetup()); }); + }); - it('should write to console.error when Raven is not configured and Raven.debug is true', function() { - hasJSON = true; // be explicit - globalServer = undefined; - Raven.debug = true; - this.sinon.stub(console, 'error'); - isSetup(); - assert.isTrue(console.error.calledOnce); + describe('logDebug', function() { + var level = 'error', + message = 'foobar'; + + it('should not write to console when Raven.debug is false', function() { + Raven.debug = false; + this.sinon.stub(console, level); + logDebug(level, message); + assert.isFalse(console[level].called); }); - it('should return true when everything is all gravy', function() { - hasJSON = true; - assert.isTrue(isSetup()); + it('should write to console when Raven.debug is true', function() { + Raven.debug = true; + this.sinon.stub(console, level); + logDebug(level, message); + assert.isTrue(console[level].calledOnce); }); }); From 5df7c145639d3f0b5bac6b1178ae38752bf18bb1 Mon Sep 17 00:00:00 2001 From: Marsel Zaripov Date: Sat, 26 Jul 2014 19:50:07 +0400 Subject: [PATCH 3/4] Do not allow to call Raven.config() more than once --- src/raven.js | 4 ++++ test/raven.test.js | 9 +++++++++ 2 files changed, 13 insertions(+) diff --git a/src/raven.js b/src/raven.js index e0ab8098e370..63ee61f66a05 100644 --- a/src/raven.js +++ b/src/raven.js @@ -52,6 +52,10 @@ var Raven = { * @return {Raven} */ config: function(dsn, options) { + if (globalServer) { + logDebug('error', 'Error: Raven has already been configured'); + return Raven; + } if (!dsn) return Raven; var uri = parseDSN(dsn), diff --git a/test/raven.test.js b/test/raven.test.js index 3196d6da4837..e80e9927465f 100644 --- a/test/raven.test.js +++ b/test/raven.test.js @@ -1169,6 +1169,15 @@ describe('Raven (public API)', function() { assert.equal(Raven.config(''), Raven); }); + it('should not set global options more than once', function() { + this.sinon.spy(window, 'parseDSN'); + this.sinon.stub(window, 'logDebug'); + setupRaven(); + setupRaven(); + assert.isTrue(parseDSN.calledOnce); + assert.isTrue(logDebug.called); + }); + describe('whitelistUrls', function() { it('should be false if none are passed', function() { Raven.config('//abc@example.com/2'); From dc5d36c8715a47bc578694541a99933813c88e91 Mon Sep 17 00:00:00 2001 From: Marsel Zaripov Date: Sat, 26 Jul 2014 19:54:26 +0400 Subject: [PATCH 4/4] Do not allow to register itself with TraceKit twice --- src/raven.js | 7 +++++-- test/raven.test.js | 15 +++++++++++++++ 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/src/raven.js b/src/raven.js index 63ee61f66a05..01cd5fe85281 100644 --- a/src/raven.js +++ b/src/raven.js @@ -21,7 +21,8 @@ var _Raven = window.Raven, tags: {}, extra: {} }, - authQueryString; + authQueryString, + isRavenInstalled = false; /* * The core Raven singleton @@ -121,8 +122,9 @@ var Raven = { * @return {Raven} */ install: function() { - if (isSetup()) { + if (isSetup() && !isRavenInstalled) { TraceKit.report.subscribe(handleStackInfo); + isRavenInstalled = true; } return Raven; @@ -216,6 +218,7 @@ var Raven = { */ uninstall: function() { TraceKit.report.uninstall(); + isRavenInstalled = false; return Raven; }, diff --git a/test/raven.test.js b/test/raven.test.js index e80e9927465f..ca352e4d4bda 100644 --- a/test/raven.test.js +++ b/test/raven.test.js @@ -1247,6 +1247,14 @@ describe('Raven (public API)', function() { assert.isTrue(TraceKit.report.subscribe.calledOnce); assert.equal(TraceKit.report.subscribe.lastCall.args[0], handleStackInfo); }); + + it('should not register itself more than once', function() { + this.sinon.stub(window, 'isSetup').returns(true); + this.sinon.stub(TraceKit.report, 'subscribe'); + Raven.install(); + Raven.install(); + assert.isTrue(TraceKit.report.subscribe.calledOnce); + }); }); describe('.wrap', function() { @@ -1392,6 +1400,13 @@ describe('Raven (public API)', function() { Raven.uninstall(); assert.isTrue(TraceKit.report.uninstall.calledOnce); }); + + it('should set isRavenInstalled flag to false', function() { + isRavenInstalled = true; + this.sinon.stub(TraceKit.report, 'uninstall'); + Raven.uninstall(); + assert.isFalse(isRavenInstalled); + }); }); describe('.setUserContext', function() {