airbrake-ruby 2.9.0 → 2.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. checksums.yaml +4 -4
  2. data/lib/airbrake-ruby.rb +40 -18
  3. data/lib/airbrake-ruby/async_sender.rb +0 -6
  4. data/lib/airbrake-ruby/backtrace.rb +0 -10
  5. data/lib/airbrake-ruby/code_hunk.rb +0 -4
  6. data/lib/airbrake-ruby/config.rb +23 -22
  7. data/lib/airbrake-ruby/config/validator.rb +0 -10
  8. data/lib/airbrake-ruby/file_cache.rb +0 -6
  9. data/lib/airbrake-ruby/filter_chain.rb +0 -5
  10. data/lib/airbrake-ruby/filters/context_filter.rb +1 -0
  11. data/lib/airbrake-ruby/filters/dependency_filter.rb +31 -0
  12. data/lib/airbrake-ruby/filters/exception_attributes_filter.rb +45 -0
  13. data/lib/airbrake-ruby/filters/gem_root_filter.rb +2 -3
  14. data/lib/airbrake-ruby/filters/keys_blacklist.rb +1 -2
  15. data/lib/airbrake-ruby/filters/keys_filter.rb +9 -14
  16. data/lib/airbrake-ruby/filters/keys_whitelist.rb +0 -2
  17. data/lib/airbrake-ruby/filters/root_directory_filter.rb +2 -3
  18. data/lib/airbrake-ruby/filters/system_exit_filter.rb +2 -3
  19. data/lib/airbrake-ruby/filters/thread_filter.rb +2 -4
  20. data/lib/airbrake-ruby/nested_exception.rb +0 -2
  21. data/lib/airbrake-ruby/notice.rb +6 -44
  22. data/lib/airbrake-ruby/notifier.rb +4 -40
  23. data/lib/airbrake-ruby/promise.rb +0 -6
  24. data/lib/airbrake-ruby/response.rb +0 -4
  25. data/lib/airbrake-ruby/sync_sender.rb +0 -4
  26. data/lib/airbrake-ruby/version.rb +1 -3
  27. data/spec/airbrake_spec.rb +71 -140
  28. data/spec/async_sender_spec.rb +9 -0
  29. data/spec/config_spec.rb +4 -0
  30. data/spec/filters/dependency_filter_spec.rb +16 -0
  31. data/spec/filters/exception_attributes_filter_spec.rb +65 -0
  32. data/spec/filters/keys_whitelist_spec.rb +17 -23
  33. data/spec/notice_spec.rb +111 -69
  34. data/spec/notifier_spec.rb +304 -495
  35. data/spec/response_spec.rb +82 -0
  36. data/spec/sync_sender_spec.rb +31 -14
  37. metadata +10 -2
@@ -0,0 +1,82 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe Airbrake::Response do
4
+ describe ".parse" do
5
+ let(:out) { StringIO.new }
6
+ let(:logger) { Logger.new(out) }
7
+
8
+ context "when response code is 201" do
9
+ it "logs response body" do
10
+ described_class.parse(OpenStruct.new(code: 201, body: '{}'), logger)
11
+ expect(out.string).to match(/Airbrake: {}/)
12
+ end
13
+ end
14
+
15
+ [400, 401, 403, 420].each do |code|
16
+ context "when response code is #{code}" do
17
+ it "logs response message" do
18
+ described_class.parse(
19
+ OpenStruct.new(code: code, body: '{"message":"foo"}'), logger
20
+ )
21
+ expect(out.string).to match(/Airbrake: foo/)
22
+ end
23
+ end
24
+ end
25
+
26
+ context "when response code is 429" do
27
+ let(:response) { OpenStruct.new(code: 429, body: '{"message":"rate limited"}') }
28
+ it "logs response message" do
29
+ described_class.parse(response, logger)
30
+ expect(out.string).to match(/Airbrake: rate limited/)
31
+ end
32
+
33
+ it "returns an error response" do
34
+ time = Time.now
35
+ allow(Time).to receive(:now).and_return(time)
36
+
37
+ resp = described_class.parse(response, logger)
38
+ expect(resp).to include(
39
+ 'error' => '**Airbrake: rate limited',
40
+ 'rate_limit_reset' => time
41
+ )
42
+ end
43
+ end
44
+
45
+ context "when response code is unhandled" do
46
+ let(:response) { OpenStruct.new(code: 500, body: 'foo') }
47
+
48
+ it "logs response body" do
49
+ described_class.parse(response, logger)
50
+ expect(out.string).to match(/Airbrake: unexpected code \(500\)\. Body: foo/)
51
+ end
52
+
53
+ it "returns an error response" do
54
+ resp = described_class.parse(response, logger)
55
+ expect(resp).to eq('error' => 'foo')
56
+ end
57
+
58
+ it "truncates body" do
59
+ response.body *= 1000
60
+ resp = described_class.parse(response, logger)
61
+ expect(resp).to eq('error' => ('foo' * 33) + 'fo...')
62
+ end
63
+ end
64
+
65
+ context "when response body can't be parsed as JSON" do
66
+ let(:response) { OpenStruct.new(code: 201, body: 'foo') }
67
+
68
+ it "logs response body" do
69
+ described_class.parse(response, logger)
70
+ expect(out.string).to match(
71
+ /Airbrake: error while parsing body \(.*unexpected token.*\)\. Body: foo/
72
+ )
73
+ end
74
+
75
+ it "returns an error message" do
76
+ expect(described_class.parse(response, logger)['error']).to match(
77
+ /\A#<JSON::ParserError.+>/
78
+ )
79
+ end
80
+ end
81
+ end
82
+ end
@@ -25,31 +25,48 @@ RSpec.describe Airbrake::SyncSender do
25
25
 
26
26
  let(:sender) { described_class.new(config) }
27
27
  let(:notice) { Airbrake::Notice.new(config, AirbrakeTestError.new) }
28
+ let(:endpoint) { 'https://airbrake.io/api/v3/projects/1/notices' }
28
29
 
29
- it "catches exceptions raised while sending" do
30
- https = double("foo")
31
- allow(sender).to receive(:build_https).and_return(https)
32
- allow(https).to receive(:request).and_raise(StandardError.new('foo'))
33
- expect(sender.send(notice, promise)).to be_an(Airbrake::Promise)
34
- expect(promise.value).to eq('error' => '**Airbrake: HTTP error: foo')
35
- expect(stdout.string).to match(/ERROR -- : .+ HTTP error: foo/)
36
- end
30
+ before { stub_request(:post, endpoint).to_return(body: '{}') }
37
31
 
38
- it "passes project key as a token in the Authorization header" do
39
- stub_request(:post, 'https://airbrake.io/api/v3/projects/1/notices').
40
- to_return(body: '{}')
32
+ it "sets the Content-Type header to JSON" do
41
33
  sender.send(notice, promise)
34
+ expect(
35
+ a_request(:post, endpoint).with(
36
+ headers: { 'Content-Type' => 'application/json' }
37
+ )
38
+ ).to have_been_made.once
39
+ end
42
40
 
41
+ it "sets the User-Agent header to the notifier slug" do
42
+ sender.send(notice, promise)
43
43
  expect(
44
- a_request(:post, 'https://airbrake.io/api/v3/projects/1/notices').with(
44
+ a_request(:post, endpoint).with(
45
45
  headers: {
46
- 'Authorization' => 'Bearer banana',
47
- 'Content-Type' => 'application/json'
46
+ 'User-Agent' => %r{airbrake-ruby/\d+\.\d+\.\d+ Ruby/\d+\.\d+\.\d+}
48
47
  }
49
48
  )
50
49
  ).to have_been_made.once
51
50
  end
52
51
 
52
+ it "sets the Authorization header to the project key" do
53
+ sender.send(notice, promise)
54
+ expect(
55
+ a_request(:post, endpoint).with(
56
+ headers: { 'Authorization' => 'Bearer banana' }
57
+ )
58
+ ).to have_been_made.once
59
+ end
60
+
61
+ it "catches exceptions raised while sending" do
62
+ https = double("foo")
63
+ allow(sender).to receive(:build_https).and_return(https)
64
+ allow(https).to receive(:request).and_raise(StandardError.new('foo'))
65
+ expect(sender.send(notice, promise)).to be_an(Airbrake::Promise)
66
+ expect(promise.value).to eq('error' => '**Airbrake: HTTP error: foo')
67
+ expect(stdout.string).to match(/ERROR -- : .+ HTTP error: foo/)
68
+ end
69
+
53
70
  context "when request body is nil" do
54
71
  it "doesn't send a notice" do
55
72
  expect_any_instance_of(Airbrake::Truncator).
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: airbrake-ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.9.0
4
+ version: 2.10.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Airbrake Technologies, Inc.
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-04-26 00:00:00.000000000 Z
11
+ date: 2018-05-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec
@@ -124,6 +124,8 @@ files:
124
124
  - lib/airbrake-ruby/file_cache.rb
125
125
  - lib/airbrake-ruby/filter_chain.rb
126
126
  - lib/airbrake-ruby/filters/context_filter.rb
127
+ - lib/airbrake-ruby/filters/dependency_filter.rb
128
+ - lib/airbrake-ruby/filters/exception_attributes_filter.rb
127
129
  - lib/airbrake-ruby/filters/gem_root_filter.rb
128
130
  - lib/airbrake-ruby/filters/keys_blacklist.rb
129
131
  - lib/airbrake-ruby/filters/keys_filter.rb
@@ -148,6 +150,8 @@ files:
148
150
  - spec/file_cache.rb
149
151
  - spec/filter_chain_spec.rb
150
152
  - spec/filters/context_filter_spec.rb
153
+ - spec/filters/dependency_filter_spec.rb
154
+ - spec/filters/exception_attributes_filter_spec.rb
151
155
  - spec/filters/gem_root_filter_spec.rb
152
156
  - spec/filters/keys_blacklist_spec.rb
153
157
  - spec/filters/keys_whitelist_spec.rb
@@ -166,6 +170,7 @@ files:
166
170
  - spec/notifier_spec.rb
167
171
  - spec/notifier_spec/options_spec.rb
168
172
  - spec/promise_spec.rb
173
+ - spec/response_spec.rb
169
174
  - spec/spec_helper.rb
170
175
  - spec/sync_sender_spec.rb
171
176
  - spec/truncator_spec.rb
@@ -196,10 +201,12 @@ summary: Ruby notifier for https://airbrake.io
196
201
  test_files:
197
202
  - spec/truncator_spec.rb
198
203
  - spec/helpers.rb
204
+ - spec/filters/exception_attributes_filter_spec.rb
199
205
  - spec/filters/root_directory_filter_spec.rb
200
206
  - spec/filters/keys_whitelist_spec.rb
201
207
  - spec/filters/system_exit_filter_spec.rb
202
208
  - spec/filters/thread_filter_spec.rb
209
+ - spec/filters/dependency_filter_spec.rb
203
210
  - spec/filters/context_filter_spec.rb
204
211
  - spec/filters/keys_blacklist_spec.rb
205
212
  - spec/filters/gem_root_filter_spec.rb
@@ -215,6 +222,7 @@ test_files:
215
222
  - spec/notifier_spec.rb
216
223
  - spec/nested_exception_spec.rb
217
224
  - spec/filter_chain_spec.rb
225
+ - spec/response_spec.rb
218
226
  - spec/file_cache.rb
219
227
  - spec/code_hunk_spec.rb
220
228
  - spec/fixtures/notroot.txt