rollbar 2.12.0 → 2.13.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (55) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +33 -6
  3. data/README.md +58 -8
  4. data/docs/configuration.md +12 -0
  5. data/gemfiles/rails30.gemfile +1 -0
  6. data/gemfiles/rails31.gemfile +1 -0
  7. data/gemfiles/rails32.gemfile +1 -0
  8. data/gemfiles/rails40.gemfile +3 -0
  9. data/gemfiles/rails41.gemfile +1 -0
  10. data/gemfiles/rails42.gemfile +7 -1
  11. data/gemfiles/rails50.gemfile +2 -1
  12. data/gemfiles/ruby_1_8_and_1_9_2.gemfile +3 -1
  13. data/lib/rollbar.rb +70 -654
  14. data/lib/rollbar/configuration.rb +32 -0
  15. data/lib/rollbar/item.rb +16 -6
  16. data/lib/rollbar/item/backtrace.rb +26 -17
  17. data/lib/rollbar/item/frame.rb +112 -0
  18. data/lib/rollbar/middleware/js.rb +39 -35
  19. data/lib/rollbar/middleware/rails/rollbar.rb +3 -3
  20. data/lib/rollbar/notifier.rb +645 -0
  21. data/lib/rollbar/plugins/delayed_job/job_data.rb +40 -21
  22. data/lib/rollbar/plugins/rails.rb +2 -2
  23. data/lib/rollbar/plugins/rake.rb +32 -6
  24. data/lib/rollbar/plugins/resque.rb +11 -0
  25. data/lib/rollbar/plugins/resque/failure.rb +39 -0
  26. data/lib/rollbar/plugins/validations.rb +10 -0
  27. data/lib/rollbar/request_data_extractor.rb +36 -18
  28. data/lib/rollbar/scrubbers/params.rb +2 -1
  29. data/lib/rollbar/truncation.rb +1 -1
  30. data/lib/rollbar/truncation/frames_strategy.rb +2 -1
  31. data/lib/rollbar/truncation/min_body_strategy.rb +2 -1
  32. data/lib/rollbar/truncation/strings_strategy.rb +1 -1
  33. data/lib/rollbar/version.rb +1 -1
  34. data/spec/controllers/home_controller_spec.rb +13 -24
  35. data/spec/delayed/backend/test.rb +1 -0
  36. data/spec/requests/home_spec.rb +1 -1
  37. data/spec/rollbar/configuration_spec.rb +22 -0
  38. data/spec/rollbar/item/backtrace_spec.rb +26 -0
  39. data/spec/rollbar/item/frame_spec.rb +267 -0
  40. data/spec/rollbar/item_spec.rb +27 -2
  41. data/spec/rollbar/middleware/js_spec.rb +23 -0
  42. data/spec/rollbar/middleware/sinatra_spec.rb +7 -7
  43. data/spec/rollbar/notifier_spec.rb +43 -0
  44. data/spec/rollbar/plugins/delayed_job/{job_data.rb → job_data_spec.rb} +15 -2
  45. data/spec/rollbar/plugins/rack_spec.rb +7 -7
  46. data/spec/rollbar/plugins/rake_spec.rb +1 -2
  47. data/spec/rollbar/plugins/resque/failure_spec.rb +36 -0
  48. data/spec/rollbar/request_data_extractor_spec.rb +103 -1
  49. data/spec/rollbar/truncation/min_body_strategy_spec.rb +1 -1
  50. data/spec/rollbar/truncation/strings_strategy_spec.rb +2 -2
  51. data/spec/rollbar_bc_spec.rb +4 -4
  52. data/spec/rollbar_spec.rb +99 -37
  53. data/spec/spec_helper.rb +2 -2
  54. data/spec/support/notifier_helpers.rb +2 -0
  55. metadata +16 -4
@@ -0,0 +1,43 @@
1
+ require 'rollbar'
2
+ require 'rollbar/notifier'
3
+
4
+ describe Rollbar::Notifier do
5
+ describe '#scope' do
6
+ let(:new_scope) do
7
+ { 'foo' => 'bar' }
8
+ end
9
+ let(:new_config) do
10
+ { 'environment' => 'foo' }
11
+ end
12
+
13
+ it 'creates a new notifier with merged scope and configuration' do
14
+ new_notifier = subject.scope(new_scope, new_config)
15
+
16
+ expect(new_notifier).not_to be(subject)
17
+ expect(subject.configuration.environment).to be_eql(nil)
18
+ expect(new_notifier.configuration.environment).to be_eql('foo')
19
+ expect(new_notifier.scope_object['foo']).to be_eql('bar')
20
+ expect(new_notifier.configuration).not_to be(subject.configuration)
21
+ expect(new_notifier.scope_object).not_to be(subject.scope_object)
22
+ end
23
+ end
24
+
25
+ describe '#scope!' do
26
+ let(:new_scope) do
27
+ { 'foo' => 'bar' }
28
+ end
29
+ let(:new_config) do
30
+ { 'environment' => 'foo' }
31
+ end
32
+
33
+ it 'mutates the notifier with a merged scope and configuration' do
34
+ result = subject.scope!(new_scope, new_config)
35
+
36
+ expect(result).to be(subject)
37
+ expect(subject.configuration.environment).to be_eql('foo')
38
+ expect(subject.scope_object['foo']).to be_eql('bar')
39
+ expect(subject.configuration).to be(subject.configuration)
40
+ expect(subject.scope_object).to be(subject.scope_object)
41
+ end
42
+ end
43
+ end
@@ -1,8 +1,21 @@
1
1
  require 'spec_helper'
2
-
3
- require 'rollbar/delayed_job'
2
+ require 'rollbar/plugins/delayed_job/job_data'
4
3
  require 'delayed/backend/test'
5
4
 
5
+ # In delayed_job/lib/delayed/syck_ext.rb YAML.load_dj
6
+ # is broken cause it's defined as an instance method
7
+ # instead of module/class method. This is breaking
8
+ # the tests for ruby 1.8.7
9
+ if YAML.parser.class.name =~ /syck|yecht/i
10
+ module YAML
11
+ def self.load_dj(yaml)
12
+ # See https://github.com/dtao/safe_yaml
13
+ # When the method is there, we need to load our YAML like this...
14
+ respond_to?(:unsafe_load) ? load(yaml, :safe => false) : load(yaml)
15
+ end
16
+ end
17
+ end
18
+
6
19
  describe Rollbar::Delayed::JobData do
7
20
  describe '#to_hash' do
8
21
  let(:handler) { { 'foo' => 'bar' } }
@@ -41,11 +41,11 @@ describe Rollbar::Middleware::Rack::Builder, :reconfigure_notifier => true do
41
41
  request.get('/will_crash', :params => params)
42
42
  end.to raise_error(exception)
43
43
 
44
- expect(Rollbar.last_report[:request][:params]).to be_eql(params)
44
+ expect(Rollbar.last_report[:request][:GET]).to be_eql(params)
45
45
  end
46
46
  end
47
47
 
48
- context 'with POST parameters' do
48
+ context 'with JSON body parameters' do
49
49
  let(:params) do
50
50
  { 'key' => 'value' }
51
51
  end
@@ -55,7 +55,7 @@ describe Rollbar::Middleware::Rack::Builder, :reconfigure_notifier => true do
55
55
  request.post('/will_crash', :input => params.to_json, 'CONTENT_TYPE' => 'application/json')
56
56
  end.to raise_error(exception)
57
57
 
58
- expect(Rollbar.last_report[:request][:params]).to be_eql(params)
58
+ expect(Rollbar.last_report[:request][:body]).to be_eql(params.to_json)
59
59
  end
60
60
  end
61
61
 
@@ -69,8 +69,8 @@ describe Rollbar::Middleware::Rack::Builder, :reconfigure_notifier => true do
69
69
  request.post('/will_crash', :input => params.to_json, 'CONTENT_TYPE' => 'application/json')
70
70
  end.to raise_error(exception)
71
71
 
72
- reported_params = Rollbar.last_report[:request][:params]
73
- expect(reported_params['body.multi']).to be_eql([{'key' => 'value'}, 'string', 10])
72
+ reported_body = Rollbar.last_report[:request][:body]
73
+ expect(reported_body).to be_eql({ 'body.multi' => [{'key' => 'value'}, 'string', 10] }.to_json)
74
74
  end
75
75
  end
76
76
 
@@ -82,8 +82,8 @@ describe Rollbar::Middleware::Rack::Builder, :reconfigure_notifier => true do
82
82
  request.post('/will_crash', :input => params.to_json, 'CONTENT_TYPE' => 'application/json')
83
83
  end.to raise_error(exception)
84
84
 
85
- reported_params = Rollbar.last_report[:request][:params]
86
- expect(reported_params['body.value']).to be_eql(1000)
85
+ reported_body = Rollbar.last_report[:request][:body]
86
+ expect(reported_body).to be_eql({ 'body.value' => params }.to_json)
87
87
  end
88
88
  end
89
89
 
@@ -3,7 +3,7 @@ require 'spec_helper'
3
3
  Rollbar.plugins.load!
4
4
 
5
5
  describe Rollbar::Rake do
6
- let(:application) { Rake::Application.new }
6
+ let(:application) { Rake.application }
7
7
  let(:exception) { Exception.new }
8
8
 
9
9
  context 'with supported rake version' do
@@ -12,7 +12,6 @@ describe Rollbar::Rake do
12
12
  end
13
13
 
14
14
  it 'reports error to Rollbar' do
15
- expect(Rollbar::Rake).not_to receive(:skip_patch)
16
15
  expect(Rollbar).to receive(:error).with(exception, :use_exception_level_filters => true)
17
16
  expect(application).to receive(:orig_display_error_message).with(exception)
18
17
 
@@ -0,0 +1,36 @@
1
+ require 'spec_helper'
2
+ require 'rollbar/plugins/resque/failure'
3
+
4
+ describe Resque::Failure::Rollbar do
5
+ let(:exception) { StandardError.new('BOOM') }
6
+ let(:worker) { Resque::Worker.new(:test) }
7
+ let(:queue) { 'test' }
8
+ let(:payload) { { 'class' => Object, 'args' => 89 } }
9
+ let(:backend) do
10
+ Resque::Failure::Rollbar.new(exception, worker, queue, payload)
11
+ end
12
+
13
+ context 'with Rollbar version <= 1.3' do
14
+ before do
15
+ allow(backend).to receive(:rollbar_version).and_return('1.3.0')
16
+ end
17
+
18
+ it 'should be notified of an error' do
19
+ expect_any_instance_of(Rollbar::Notifier).to receive(:log).with('error', exception, payload)
20
+ backend.save
21
+ end
22
+ end
23
+
24
+ context 'with Rollbar version > 1.3' do
25
+ let(:payload_with_options) { payload.merge(:use_exception_level_filters => true) }
26
+
27
+ before do
28
+ allow(backend).to receive(:rollbar_version).and_return('1.4.0')
29
+ end
30
+
31
+ it 'sends the :use_exception_level_filters option' do
32
+ expect_any_instance_of(Rollbar::Notifier).to receive(:error).with(exception, payload_with_options)
33
+ backend.save
34
+ end
35
+ end
36
+ end
@@ -71,7 +71,7 @@ describe Rollbar::RequestDataExtractor do
71
71
  describe '#extract_request_data_from_rack' do
72
72
  it 'returns a Hash object' do
73
73
  expect(Rollbar::Scrubbers::URL).to receive(:call).with(kind_of(Hash)).and_call_original
74
- expect(Rollbar::Scrubbers::Params).to receive(:call).with(kind_of(Hash)).and_call_original.exactly(7)
74
+ expect(Rollbar::Scrubbers::Params).to receive(:call).with(kind_of(Hash)).and_call_original.exactly(6)
75
75
 
76
76
  result = subject.extract_request_data_from_rack(env)
77
77
 
@@ -97,6 +97,108 @@ describe Rollbar::RequestDataExtractor do
97
97
 
98
98
  expect(result).to be_kind_of(Hash)
99
99
  end
100
+
101
+ context 'with CONTENT_TYPE and CONTENT_LENGTH headers' do
102
+ let(:env) do
103
+ Rack::MockRequest.env_for('/',
104
+ 'HTTP_HOST' => 'localhost:81',
105
+ 'HTTP_X_FORWARDED_HOST' => 'example.org:9292',
106
+ 'CONTENT_TYPE' => 'application/json',
107
+ 'CONTENT_LENGTH' => 20)
108
+
109
+
110
+ end
111
+
112
+ it 'adds the content type header to the headers key' do
113
+ result = subject.extract_request_data_from_rack(env)
114
+
115
+ expect(result[:headers]['Content-Type']).to be_eql('application/json')
116
+ expect(result[:headers]['Content-Length']).to be_eql(20)
117
+ end
118
+ end
119
+ end
120
+
121
+ context 'with multiple addresses in X-Forwarded-For' do
122
+ let(:env) do
123
+ Rack::MockRequest.env_for('/',
124
+ 'HTTP_HOST' => 'localhost:81',
125
+ 'HTTP_X_FORWARDED_FOR' => header_value,
126
+ 'REMOTE_ADDR' => '3.3.3.3',
127
+ 'CONTENT_TYPE' => 'application/json',
128
+ 'CONTENT_LENGTH' => 20)
129
+
130
+
131
+ end
132
+
133
+ context 'with public client IP' do
134
+ let(:header_value) { '2.2.2.2, 3.3.3.3' }
135
+
136
+ it 'extracts the correct user IP' do
137
+ result = subject.extract_request_data_from_rack(env)
138
+
139
+ expect(result[:user_ip]).to be_eql('2.2.2.2')
140
+ end
141
+ end
142
+
143
+ context 'with private first client IP' do
144
+ let(:header_value) { '192.168.1.1, 2.2.2.2, 3.3.3.3' }
145
+
146
+ it 'extracts the correct user IP' do
147
+ result = subject.extract_request_data_from_rack(env)
148
+
149
+ expect(result[:user_ip]).to be_eql('2.2.2.2')
150
+ end
151
+ end
152
+ end
153
+
154
+ context 'with JSON POST body' do
155
+ let(:params) { { 'key' => 'value' } }
156
+ let(:body) { params.to_json }
157
+ let(:env) do
158
+ Rack::MockRequest.env_for('/?foo=bar',
159
+ 'CONTENT_TYPE' => 'application/json',
160
+ :input => body,
161
+ :method => 'POST')
162
+
163
+
164
+ end
165
+
166
+ it 'extracts the correct user IP' do
167
+ result = subject.extract_request_data_from_rack(env)
168
+ expect(result[:body]).to be_eql(body)
169
+ end
170
+ end
171
+
172
+ context 'with POST params' do
173
+ let(:params) { { 'key' => 'value' } }
174
+ let(:env) do
175
+ Rack::MockRequest.env_for('/?foo=bar',
176
+ :params => params,
177
+ :method => 'POST')
178
+
179
+
180
+ end
181
+
182
+ it 'extracts the correct user IP' do
183
+ result = subject.extract_request_data_from_rack(env)
184
+ expect(result[:POST]).to be_eql(params)
185
+ end
186
+ end
187
+
188
+ context 'with GET params' do
189
+ let(:params) { { 'key' => 'value' } }
190
+ let(:env) do
191
+ Rack::MockRequest.env_for('/?foo=bar',
192
+ :params => params,
193
+ :method => 'GET')
194
+
195
+
196
+ end
197
+
198
+ it 'extracts the correct user IP' do
199
+ result = subject.extract_request_data_from_rack(env)
200
+ expect(result[:GET]).to be_eql(params)
201
+ end
100
202
  end
101
203
  end
102
204
  end
@@ -45,7 +45,7 @@ describe Rollbar::Truncation::MinBodyStrategy do
45
45
  end
46
46
 
47
47
  context 'with a message payload' do
48
- let(:payload_fixture) { 'payloads/sample.trace_chain.json' }
48
+ let(:payload_fixture) { 'payloads/message.json' }
49
49
 
50
50
  it "doesn't truncate anything and returns same payload" do
51
51
  result = Rollbar::JSON.load(described_class.call(payload))
@@ -43,7 +43,7 @@ describe Rollbar::Truncation::StringsStrategy do
43
43
 
44
44
  context 'when first threshold is not enough' do
45
45
  let(:payload) do
46
- 129.times.to_enum.reduce({}) do |hash, i|
46
+ 512.times.to_enum.reduce({}) do |hash, i|
47
47
  hash[i.to_s] = 'a' * 1024
48
48
  hash
49
49
  end
@@ -58,7 +58,7 @@ describe Rollbar::Truncation::StringsStrategy do
58
58
 
59
59
  context 'when second threshold is still not enough' do
60
60
  let(:payload) do
61
- 257.times.to_enum.reduce({}) do |hash, i|
61
+ 1024.times.to_enum.reduce({}) do |hash, i|
62
62
  hash[i.to_s] = 'a' * 1024
63
63
  hash
64
64
  end
@@ -77,7 +77,7 @@ describe Rollbar do
77
77
  end
78
78
  end
79
79
 
80
- after(:each) do
80
+ after do
81
81
  Rollbar.unconfigure
82
82
  configure
83
83
  end
@@ -136,7 +136,7 @@ describe Rollbar do
136
136
  end
137
137
  end
138
138
 
139
- after(:each) do
139
+ after do
140
140
  Rollbar.unconfigure
141
141
  configure
142
142
  end
@@ -162,14 +162,14 @@ describe Rollbar do
162
162
  end
163
163
 
164
164
  it 'should not be enabled when not configured' do
165
- Rollbar.unconfigure
165
+ Rollbar.clear_notifier!
166
166
 
167
167
  Rollbar.configuration.enabled.should be_nil
168
168
  Rollbar.report_exception(@exception).should == 'disabled'
169
169
  end
170
170
 
171
171
  it 'should stay disabled if configure is called again' do
172
- Rollbar.unconfigure
172
+ Rollbar.clear_notifier!
173
173
 
174
174
  # configure once, setting enabled to false.
175
175
  Rollbar.configure do |config|
data/spec/rollbar_spec.rb CHANGED
@@ -10,6 +10,7 @@ require 'active_support/json/encoding'
10
10
  require 'rollbar/item'
11
11
  begin
12
12
  require 'rollbar/delay/sidekiq'
13
+ require 'rollbar/delay/sucker_punch'
13
14
  rescue LoadError
14
15
  end
15
16
 
@@ -23,15 +24,15 @@ require 'spec_helper'
23
24
 
24
25
  describe Rollbar do
25
26
  let(:notifier) { Rollbar.notifier }
27
+
26
28
  before do
27
- Rollbar.unconfigure
29
+ Rollbar.clear_notifier!
28
30
  configure
29
31
  end
30
32
 
31
33
  context 'when notifier has been used before configure it' do
32
34
  before do
33
- Rollbar.unconfigure
34
- Rollbar.reset_notifier!
35
+ Rollbar.clear_notifier!
35
36
  end
36
37
 
37
38
  it 'is finally reset' do
@@ -44,6 +45,49 @@ describe Rollbar do
44
45
  end
45
46
  end
46
47
 
48
+ shared_examples 'stores the root notifier' do
49
+
50
+ end
51
+
52
+ describe '.configure' do
53
+ before { Rollbar.clear_notifier! }
54
+
55
+ it 'stores the root notifier' do
56
+ Rollbar.configure { |c| }
57
+ expect(Rollbar.root_notifier).to be(Rollbar.notifier)
58
+ end
59
+ end
60
+
61
+ describe '.preconfigure' do
62
+ before { Rollbar.clear_notifier! }
63
+
64
+ it 'stores the root notifier' do
65
+ Rollbar.preconfigure { |c| }
66
+ expect(Rollbar.root_notifier).to be(Rollbar.notifier)
67
+ end
68
+ end
69
+
70
+ describe '.reconfigure' do
71
+ before { Rollbar.clear_notifier! }
72
+
73
+ it 'stores the root notifier' do
74
+ Rollbar.reconfigure { |c| }
75
+ expect(Rollbar.root_notifier).to be(Rollbar.notifier)
76
+ end
77
+ end
78
+
79
+ describe '.unconfigure' do
80
+ before { Rollbar.clear_notifier! }
81
+
82
+ it 'stores the root notifier' do
83
+ expect(Rollbar.root_notifier).to receive(:unconfigure)
84
+
85
+ Rollbar.unconfigure
86
+
87
+ expect(Rollbar.root_notifier).to be(Rollbar.notifier)
88
+ end
89
+ end
90
+
47
91
  context 'Notifier' do
48
92
  describe '#log' do
49
93
  let(:exception) do
@@ -58,8 +102,7 @@ describe Rollbar do
58
102
 
59
103
  context 'executing a Thread before Rollbar is configured' do
60
104
  before do
61
- Rollbar.reset_notifier!
62
- Rollbar.unconfigure
105
+ Rollbar.clear_notifier!
63
106
 
64
107
  Thread.new {}
65
108
 
@@ -333,10 +376,12 @@ describe Rollbar do
333
376
  end
334
377
 
335
378
  it 'should not modify any parent notifier configuration' do
379
+ Rollbar.clear_notifier!
336
380
  configure
337
381
  Rollbar.configuration.code_version.should be_nil
338
382
  Rollbar.configuration.payload_options.should be_empty
339
383
 
384
+ notifier = Rollbar.notifier.scope
340
385
  notifier.configure do |config|
341
386
  config.code_version = '123'
342
387
  config.payload_options = {
@@ -394,8 +439,7 @@ describe Rollbar do
394
439
  end
395
440
  end
396
441
 
397
- after(:each) do
398
- Rollbar.unconfigure
442
+ after do
399
443
  configure
400
444
  end
401
445
 
@@ -439,18 +483,15 @@ describe Rollbar do
439
483
  let(:logger_mock) { double("Rails.logger").as_null_object }
440
484
  let(:user) { User.create(:email => 'email@example.com', :encrypted_password => '', :created_at => Time.now, :updated_at => Time.now) }
441
485
 
442
- before(:each) do
486
+ before do
487
+ Rollbar.unconfigure
443
488
  configure
489
+
444
490
  Rollbar.configure do |config|
445
491
  config.logger = logger_mock
446
492
  end
447
493
  end
448
494
 
449
- after(:each) do
450
- Rollbar.unconfigure
451
- configure
452
- end
453
-
454
495
  it 'should report exceptions without person or request data' do
455
496
  logger_mock.should_receive(:info).with('[Rollbar] Success')
456
497
  Rollbar.error(exception)
@@ -476,22 +517,20 @@ describe Rollbar do
476
517
  end
477
518
 
478
519
  it 'should not be enabled when not configured' do
479
- Rollbar.unconfigure
520
+ Rollbar.clear_notifier!
480
521
 
481
522
  Rollbar.configuration.enabled.should be_nil
482
523
  Rollbar.error(exception).should == 'disabled'
483
524
  end
484
525
 
485
526
  it 'should stay disabled if configure is called again' do
486
- Rollbar.unconfigure
487
-
488
527
  # configure once, setting enabled to false.
489
528
  Rollbar.configure do |config|
490
529
  config.enabled = false
491
530
  end
492
531
 
493
532
  # now configure again (perhaps to change some other values)
494
- Rollbar.configure do |config| end
533
+ Rollbar.configure { |_| }
495
534
 
496
535
  Rollbar.configuration.enabled.should == false
497
536
  Rollbar.error(exception).should == 'disabled'
@@ -833,8 +872,7 @@ describe Rollbar do
833
872
  end
834
873
  end
835
874
 
836
- after(:each) do
837
- Rollbar.unconfigure
875
+ after do
838
876
  configure
839
877
  end
840
878
 
@@ -880,15 +918,15 @@ describe Rollbar do
880
918
  end
881
919
 
882
920
  context 'asynchronous_handling' do
883
- before(:each) do
921
+ before do
922
+ Rollbar.clear_notifier!
884
923
  configure
885
924
  Rollbar.configure do |config|
886
925
  config.logger = logger_mock
887
926
  end
888
927
  end
889
928
 
890
- after(:each) do
891
- Rollbar.unconfigure
929
+ after do
892
930
  configure
893
931
  end
894
932
 
@@ -1042,13 +1080,9 @@ describe Rollbar do
1042
1080
  describe "#use_sucker_punch", :if => defined?(SuckerPunch) do
1043
1081
  it "should send the payload to sucker_punch delayer" do
1044
1082
  logger_mock.should_receive(:info).with('[Rollbar] Scheduling item')
1045
- logger_mock.should_receive(:info).with('[Rollbar] Sending item')
1046
- logger_mock.should_receive(:info).with('[Rollbar] Success')
1047
-
1048
- Rollbar.configure do |config|
1049
- config.use_sucker_punch
1050
- end
1083
+ expect(Rollbar::Delay::SuckerPunch).to receive(:call)
1051
1084
 
1085
+ Rollbar.configure(&:use_sucker_punch)
1052
1086
  Rollbar.error(exception)
1053
1087
  end
1054
1088
  end
@@ -1099,7 +1133,7 @@ describe Rollbar do
1099
1133
  Rollbar.send(:logger).should_not be_nil
1100
1134
  end
1101
1135
 
1102
- after(:each) do
1136
+ after do
1103
1137
  reset_configuration
1104
1138
  end
1105
1139
  end
@@ -1222,6 +1256,18 @@ describe Rollbar do
1222
1256
  expect(sent_payload['data'][:body][:message][:body]).to be_eql(expected_body)
1223
1257
  end
1224
1258
  end
1259
+
1260
+ context 'with uuid and host' do
1261
+ let(:host) { 'the-host' }
1262
+ let(:uuid) { 'the-uuid' }
1263
+ it 'sets the uuid and host in correct keys' do
1264
+ sent_payload = notifier.send(:send_failsafe, 'testing uuid and host',
1265
+ exception, uuid, host)
1266
+
1267
+ expect(sent_payload['data'][:custom][:orig_uuid]).to be_eql('the-uuid')
1268
+ expect(sent_payload['data'][:custom][:orig_host]).to be_eql('the-host')
1269
+ end
1270
+ end
1225
1271
  end
1226
1272
 
1227
1273
  context 'when reporting internal error with nil context' do
@@ -1267,7 +1313,7 @@ describe Rollbar do
1267
1313
  end
1268
1314
 
1269
1315
  it 'changes data in scope_object inside the block' do
1270
- Rollbar.reset_notifier!
1316
+ Rollbar.clear_notifier!
1271
1317
  configure
1272
1318
 
1273
1319
  current_notifier_id = Rollbar.notifier.object_id
@@ -1330,12 +1376,13 @@ describe Rollbar do
1330
1376
  end
1331
1377
  end
1332
1378
 
1333
- describe '.reset_notifier' do
1334
- it 'resets the notifier' do
1335
- notifier1_id = Rollbar.notifier.object_id
1379
+ describe '.clear_notifier' do
1380
+ before { Rollbar.notifier }
1336
1381
 
1337
- Rollbar.reset_notifier!
1338
- expect(Rollbar.notifier.object_id).not_to be_eql(notifier1_id)
1382
+ it 'resets the notifier' do
1383
+ Rollbar.clear_notifier!
1384
+ expect(Rollbar.instance_variable_get('@notifier')).to be_nil
1385
+ expect(Rollbar.instance_variable_get('@root_notifier')).to be_nil
1339
1386
  end
1340
1387
  end
1341
1388
 
@@ -1373,8 +1420,7 @@ describe Rollbar do
1373
1420
 
1374
1421
  describe '.preconfigure'do
1375
1422
  before do
1376
- Rollbar.unconfigure
1377
- Rollbar.reset_notifier!
1423
+ Rollbar.clear_notifier!
1378
1424
  end
1379
1425
 
1380
1426
  it 'resets the notifier' do
@@ -1417,6 +1463,22 @@ describe Rollbar do
1417
1463
  end
1418
1464
  end
1419
1465
 
1466
+ describe '.with_config' do
1467
+ let(:new_config) do
1468
+ { 'environment' => 'foo' }
1469
+ end
1470
+
1471
+ it 'uses the new config and restores the old one' do
1472
+ config1 = described_class.configuration
1473
+
1474
+ subject.with_config(:environment => 'bar') do
1475
+ expect(described_class.configuration).not_to be(config1)
1476
+ end
1477
+
1478
+ expect(described_class.configuration).to be(config1)
1479
+ end
1480
+ end
1481
+
1420
1482
  # configure with some basic params
1421
1483
  def configure
1422
1484
  reconfigure_notifier