airbrake-ruby 3.2.6-java → 4.0.0-java

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 (46) hide show
  1. checksums.yaml +4 -4
  2. data/lib/airbrake-ruby.rb +31 -138
  3. data/lib/airbrake-ruby/async_sender.rb +20 -8
  4. data/lib/airbrake-ruby/backtrace.rb +15 -13
  5. data/lib/airbrake-ruby/code_hunk.rb +2 -4
  6. data/lib/airbrake-ruby/config.rb +8 -38
  7. data/lib/airbrake-ruby/deploy_notifier.rb +4 -17
  8. data/lib/airbrake-ruby/filters/exception_attributes_filter.rb +5 -4
  9. data/lib/airbrake-ruby/filters/git_last_checkout_filter.rb +6 -4
  10. data/lib/airbrake-ruby/filters/keys_blacklist.rb +0 -1
  11. data/lib/airbrake-ruby/filters/keys_filter.rb +4 -4
  12. data/lib/airbrake-ruby/filters/keys_whitelist.rb +0 -1
  13. data/lib/airbrake-ruby/loggable.rb +31 -0
  14. data/lib/airbrake-ruby/nested_exception.rb +2 -3
  15. data/lib/airbrake-ruby/notice.rb +6 -6
  16. data/lib/airbrake-ruby/notice_notifier.rb +11 -47
  17. data/lib/airbrake-ruby/performance_notifier.rb +6 -18
  18. data/lib/airbrake-ruby/response.rb +5 -2
  19. data/lib/airbrake-ruby/sync_sender.rb +8 -6
  20. data/lib/airbrake-ruby/version.rb +1 -1
  21. data/spec/airbrake_spec.rb +1 -143
  22. data/spec/async_sender_spec.rb +83 -90
  23. data/spec/backtrace_spec.rb +36 -47
  24. data/spec/code_hunk_spec.rb +12 -15
  25. data/spec/config_spec.rb +79 -96
  26. data/spec/deploy_notifier_spec.rb +3 -7
  27. data/spec/filter_chain_spec.rb +1 -3
  28. data/spec/filters/context_filter_spec.rb +1 -3
  29. data/spec/filters/dependency_filter_spec.rb +1 -3
  30. data/spec/filters/exception_attributes_filter_spec.rb +1 -14
  31. data/spec/filters/gem_root_filter_spec.rb +1 -4
  32. data/spec/filters/git_last_checkout_filter_spec.rb +3 -5
  33. data/spec/filters/git_revision_filter_spec.rb +1 -3
  34. data/spec/filters/keys_blacklist_spec.rb +14 -25
  35. data/spec/filters/keys_whitelist_spec.rb +14 -25
  36. data/spec/filters/root_directory_filter_spec.rb +1 -4
  37. data/spec/filters/system_exit_filter_spec.rb +2 -2
  38. data/spec/filters/thread_filter_spec.rb +1 -3
  39. data/spec/nested_exception_spec.rb +3 -5
  40. data/spec/notice_notifier_spec.rb +23 -20
  41. data/spec/notice_notifier_spec/options_spec.rb +20 -25
  42. data/spec/notice_spec.rb +13 -12
  43. data/spec/performance_notifier_spec.rb +19 -31
  44. data/spec/response_spec.rb +23 -17
  45. data/spec/sync_sender_spec.rb +26 -33
  46. metadata +2 -1
@@ -11,27 +11,23 @@ RSpec.describe Airbrake::NoticeNotifier do
11
11
  "https://api.airbrake.io/api/v3/projects/#{project_id}/notices"
12
12
  end
13
13
 
14
- let(:user_params) do
15
- { project_id: project_id,
16
- project_key: project_key,
17
- logger: Logger.new(StringIO.new) }
18
- end
19
-
20
14
  let(:params) { {} }
21
15
  let(:ex) { AirbrakeTestError.new }
22
- let(:config) { Airbrake::Config.new(user_params.merge(params)) }
23
-
24
- subject { described_class.new(config) }
25
16
 
26
17
  before do
27
18
  stub_request(:post, endpoint).to_return(status: 201, body: '{}')
19
+
20
+ Airbrake::Config.instance = Airbrake::Config.new(
21
+ project_id: project_id,
22
+ project_key: project_key
23
+ )
28
24
  end
29
25
 
30
26
  describe "options" do
31
27
  describe ":host" do
32
28
  context "when custom" do
33
29
  shared_examples 'endpoint' do |host, endpoint, title|
34
- let(:params) { { host: host } }
30
+ before { Airbrake::Config.instance.merge(host: host) }
35
31
 
36
32
  example(title) do
37
33
  stub_request(:post, endpoint).to_return(status: 201, body: '{}')
@@ -70,11 +66,12 @@ RSpec.describe Airbrake::NoticeNotifier do
70
66
  end
71
67
 
72
68
  describe ":root_directory" do
73
- let(:params) { { root_directory: '/home/kyrylo/code' } }
69
+ before do
70
+ Airbrake::Config.instance.merge(root_directory: '/home/kyrylo/code')
71
+ end
74
72
 
75
73
  it "filters out frames" do
76
- airbrake = described_class.new(config)
77
- airbrake.notify_sync(ex)
74
+ subject.notify_sync(ex)
78
75
 
79
76
  expect(
80
77
  a_request(:post, endpoint).
@@ -84,7 +81,7 @@ RSpec.describe Airbrake::NoticeNotifier do
84
81
 
85
82
  context "when present and is a" do
86
83
  shared_examples 'root directory' do |dir|
87
- let(:params) { { root_directory: dir } }
84
+ before { Airbrake::Config.instance.merge(root_directory: dir) }
88
85
 
89
86
  it "being included into the notice's payload" do
90
87
  subject.notify_sync(ex)
@@ -123,14 +120,12 @@ RSpec.describe Airbrake::NoticeNotifier do
123
120
  password: 'password' }
124
121
  end
125
122
 
126
- let(:params) do
127
- {
123
+ before do
124
+ Airbrake::Config.instance.merge(
128
125
  proxy: proxy_params,
129
126
  host: "http://localhost:#{proxy.config[:Port]}"
130
- }
131
- end
127
+ )
132
128
 
133
- before do
134
129
  proxy.mount_proc '/' do |req, res|
135
130
  requests << req
136
131
  res.status = 201
@@ -165,7 +160,7 @@ RSpec.describe Airbrake::NoticeNotifier do
165
160
 
166
161
  describe ":environment" do
167
162
  context "when present" do
168
- let(:params) { { environment: :production } }
163
+ before { Airbrake::Config.instance.merge(environment: :production) }
169
164
 
170
165
  it "being included into the notice's payload" do
171
166
  subject.notify_sync(ex)
@@ -179,7 +174,7 @@ RSpec.describe Airbrake::NoticeNotifier do
179
174
 
180
175
  describe ":ignore_environments" do
181
176
  shared_examples 'sent notice' do |params|
182
- let(:params) { params }
177
+ before { Airbrake::Config.instance.merge(params) }
183
178
 
184
179
  it "sends a notice" do
185
180
  subject.notify_sync(ex)
@@ -188,7 +183,7 @@ RSpec.describe Airbrake::NoticeNotifier do
188
183
  end
189
184
 
190
185
  shared_examples 'ignored notice' do |params|
191
- let(:params) { params }
186
+ before { Airbrake::Config.instance.merge(params) }
192
187
 
193
188
  it "ignores exceptions occurring in envs that were not configured" do
194
189
  subject.notify_sync(ex)
@@ -245,11 +240,11 @@ RSpec.describe Airbrake::NoticeNotifier do
245
240
  # Fixes https://github.com/airbrake/airbrake-ruby/issues/276
246
241
  context "when specified along with :whitelist_keys" do
247
242
  context "and when context payload is present" do
248
- let(:params) do
249
- {
243
+ before do
244
+ Airbrake::Config.instance.merge(
250
245
  blacklist_keys: %i[password password_confirmation],
251
246
  whitelist_keys: [:email, /user/i, 'account_id']
252
- }
247
+ )
253
248
  end
254
249
 
255
250
  it "sends a notice" do
data/spec/notice_spec.rb CHANGED
@@ -1,22 +1,25 @@
1
1
  RSpec.describe Airbrake::Notice do
2
- let(:notice) do
3
- described_class.new(Airbrake::Config.new, AirbrakeTestError.new, bingo: '1')
4
- end
2
+ let(:notice) { described_class.new(AirbrakeTestError.new, bingo: '1') }
5
3
 
6
4
  describe "#to_json" do
7
5
  context "app_version" do
8
6
  context "when missing" do
7
+ before { Airbrake::Config.instance.merge(app_version: nil) }
8
+
9
9
  it "doesn't include app_version" do
10
10
  expect(notice.to_json).not_to match(/"context":{"version":"1.2.3"/)
11
11
  end
12
12
  end
13
13
 
14
14
  context "when present" do
15
- let(:config) do
16
- Airbrake::Config.new(app_version: '1.2.3', root_directory: '/one/two')
17
- end
15
+ let(:notice) { described_class.new(AirbrakeTestError.new) }
18
16
 
19
- let(:notice) { described_class.new(config, AirbrakeTestError.new) }
17
+ before do
18
+ Airbrake::Config.instance.merge(
19
+ app_version: "1.2.3",
20
+ root_directory: "/one/two"
21
+ )
22
+ end
20
23
 
21
24
  it "includes app_version" do
22
25
  expect(notice.to_json).to match(/"context":{"version":"1.2.3"/)
@@ -54,7 +57,7 @@ RSpec.describe Airbrake::Notice do
54
57
  size.times { backtrace << "bin/rails:3:in `<main>'" }
55
58
  ex.set_backtrace(backtrace)
56
59
 
57
- notice = described_class.new(Airbrake::Config.new, ex)
60
+ notice = described_class.new(ex)
58
61
 
59
62
  expect(notice.to_json.bytesize).to be < 64000
60
63
  end
@@ -94,9 +97,7 @@ RSpec.describe Airbrake::Notice do
94
97
  10.times { backtrace << "bin/rails:3:in `<#{bad_string}>'" }
95
98
  ex.set_backtrace(backtrace)
96
99
 
97
- config = Airbrake::Config.new(logger: Logger.new('/dev/null'))
98
- notice = described_class.new(config, ex)
99
-
100
+ notice = described_class.new(ex)
100
101
  expect(notice.to_json).to be_nil
101
102
  end
102
103
  end
@@ -105,7 +106,7 @@ RSpec.describe Airbrake::Notice do
105
106
  let(:klass) { Class.new {} }
106
107
  let(:ex) { AirbrakeTestError.new }
107
108
  let(:params) { { bingo: [Object.new, klass.new] } }
108
- let(:notice) { described_class.new(Airbrake::Config.new, ex, params) }
109
+ let(:notice) { described_class.new(ex, params) }
109
110
 
110
111
  before do
111
112
  backtrace = []
@@ -2,8 +2,11 @@ RSpec.describe Airbrake::PerformanceNotifier do
2
2
  let(:routes) { 'https://api.airbrake.io/api/v5/projects/1/routes-stats' }
3
3
  let(:queries) { 'https://api.airbrake.io/api/v5/projects/1/queries-stats' }
4
4
 
5
- let(:config) do
6
- Airbrake::Config.new(
5
+ before do
6
+ stub_request(:put, routes).to_return(status: 200, body: '')
7
+ stub_request(:put, queries).to_return(status: 200, body: '')
8
+
9
+ Airbrake::Config.instance = Airbrake::Config.new(
7
10
  project_id: 1,
8
11
  project_key: 'banana',
9
12
  performance_stats: true,
@@ -11,13 +14,6 @@ RSpec.describe Airbrake::PerformanceNotifier do
11
14
  )
12
15
  end
13
16
 
14
- subject { described_class.new(config) }
15
-
16
- before do
17
- stub_request(:put, routes).to_return(status: 200, body: '')
18
- stub_request(:put, queries).to_return(status: 200, body: '')
19
- end
20
-
21
17
  describe "#notify" do
22
18
  it "sends full query" do
23
19
  subject.notify(
@@ -195,16 +191,14 @@ RSpec.describe Airbrake::PerformanceNotifier do
195
191
  end
196
192
 
197
193
  it "doesn't send route stats when performance stats are disabled" do
198
- notifier = described_class.new(
199
- Airbrake::Config.new(
200
- project_id: 1, project_key: '2', performance_stats: false
201
- )
202
- )
203
- promise = notifier.notify(
194
+ Airbrake::Config.instance.merge(performance_stats: false)
195
+
196
+ promise = subject.notify(
204
197
  Airbrake::Request.new(
205
198
  method: 'GET', route: '/foo', status_code: 200, start_time: Time.new
206
199
  )
207
200
  )
201
+
208
202
  expect(a_request(:put, routes)).not_to have_been_made
209
203
  expect(promise.value).to eq(
210
204
  'error' => "The Performance Stats feature is disabled"
@@ -212,28 +206,24 @@ RSpec.describe Airbrake::PerformanceNotifier do
212
206
  end
213
207
 
214
208
  it "doesn't send route stats when current environment is ignored" do
215
- notifier = described_class.new(
216
- config.merge(
217
- environment: 'test', ignore_environments: %w[test]
218
- )
209
+ Airbrake::Config.instance.merge(
210
+ performance_stats: true, environment: 'test', ignore_environments: %w[test]
219
211
  )
220
- promise = notifier.notify(
212
+
213
+ promise = subject.notify(
221
214
  Airbrake::Request.new(
222
215
  method: 'GET', route: '/foo', status_code: 200, start_time: Time.new
223
216
  )
224
217
  )
218
+
225
219
  expect(a_request(:put, routes)).not_to have_been_made
226
220
  expect(promise.value).to eq('error' => "The 'test' environment is ignored")
227
221
  end
228
222
 
229
223
  it "sends environment when it's specified" do
230
- notifier = described_class.new(
231
- config.merge(
232
- project_id: 1, project_key: '2', performance_stats: true,
233
- environment: 'test'
234
- )
235
- )
236
- notifier.notify(
224
+ Airbrake::Config.instance.merge(performance_stats: true, environment: 'test')
225
+
226
+ subject.notify(
237
227
  Airbrake::Request.new(
238
228
  method: 'POST',
239
229
  route: '/foo',
@@ -251,16 +241,14 @@ RSpec.describe Airbrake::PerformanceNotifier do
251
241
  describe "payload grouping" do
252
242
  let(:flush_period) { 0.5 }
253
243
 
254
- let(:config) do
255
- Airbrake::Config.new(
244
+ it "groups payload by performance name and sends it separately" do
245
+ Airbrake::Config.instance.merge(
256
246
  project_id: 1,
257
247
  project_key: 'banana',
258
248
  performance_stats: true,
259
249
  performance_stats_flush_period: flush_period
260
250
  )
261
- end
262
251
 
263
- it "groups payload by performance name and sends it separately" do
264
252
  subject.notify(
265
253
  Airbrake::Request.new(
266
254
  method: 'GET',
@@ -1,13 +1,12 @@
1
1
  RSpec.describe Airbrake::Response do
2
2
  describe ".parse" do
3
- let(:out) { StringIO.new }
4
- let(:logger) { Logger.new(out) }
5
-
6
3
  [200, 201, 204].each do |code|
7
4
  context "when response code is #{code}" do
8
5
  it "logs response body" do
9
- described_class.parse(OpenStruct.new(code: code, body: '{}'), logger)
10
- expect(out.string).to match(/Airbrake: Airbrake::Response \(#{code}\): {}/)
6
+ expect(Airbrake::Loggable.instance).to receive(:debug).with(
7
+ /Airbrake::Response \(#{code}\): {}/
8
+ )
9
+ described_class.parse(OpenStruct.new(code: code, body: '{}'))
11
10
  end
12
11
  end
13
12
  end
@@ -15,26 +14,31 @@ RSpec.describe Airbrake::Response do
15
14
  [400, 401, 403, 420].each do |code|
16
15
  context "when response code is #{code}" do
17
16
  it "logs response message" do
17
+ expect(Airbrake::Loggable.instance).to receive(:error).with(
18
+ /Airbrake: foo/
19
+ )
18
20
  described_class.parse(
19
- OpenStruct.new(code: code, body: '{"message":"foo"}'), logger
21
+ OpenStruct.new(code: code, body: '{"message":"foo"}')
20
22
  )
21
- expect(out.string).to match(/Airbrake: foo/)
22
23
  end
23
24
  end
24
25
  end
25
26
 
26
27
  context "when response code is 429" do
27
28
  let(:response) { OpenStruct.new(code: 429, body: '{"message":"rate limited"}') }
29
+
28
30
  it "logs response message" do
29
- described_class.parse(response, logger)
30
- expect(out.string).to match(/Airbrake: rate limited/)
31
+ expect(Airbrake::Loggable.instance).to receive(:error).with(
32
+ /Airbrake: rate limited/
33
+ )
34
+ described_class.parse(response)
31
35
  end
32
36
 
33
37
  it "returns an error response" do
34
38
  time = Time.now
35
39
  allow(Time).to receive(:now).and_return(time)
36
40
 
37
- resp = described_class.parse(response, logger)
41
+ resp = described_class.parse(response)
38
42
  expect(resp).to include(
39
43
  'error' => '**Airbrake: rate limited',
40
44
  'rate_limit_reset' => time
@@ -46,18 +50,20 @@ RSpec.describe Airbrake::Response do
46
50
  let(:response) { OpenStruct.new(code: 500, body: 'foo') }
47
51
 
48
52
  it "logs response body" do
49
- described_class.parse(response, logger)
50
- expect(out.string).to match(/Airbrake: unexpected code \(500\)\. Body: foo/)
53
+ expect(Airbrake::Loggable.instance).to receive(:error).with(
54
+ /Airbrake: unexpected code \(500\)\. Body: foo/
55
+ )
56
+ described_class.parse(response)
51
57
  end
52
58
 
53
59
  it "returns an error response" do
54
- resp = described_class.parse(response, logger)
60
+ resp = described_class.parse(response)
55
61
  expect(resp).to eq('error' => 'foo')
56
62
  end
57
63
 
58
64
  it "truncates body" do
59
65
  response.body *= 1000
60
- resp = described_class.parse(response, logger)
66
+ resp = described_class.parse(response)
61
67
  expect(resp).to eq('error' => ('foo' * 33) + 'fo...')
62
68
  end
63
69
  end
@@ -66,14 +72,14 @@ RSpec.describe Airbrake::Response do
66
72
  let(:response) { OpenStruct.new(code: 201, body: 'foo') }
67
73
 
68
74
  it "logs response body" do
69
- described_class.parse(response, logger)
70
- expect(out.string).to match(
75
+ expect(Airbrake::Loggable.instance).to receive(:error).with(
71
76
  /Airbrake: error while parsing body \(.*unexpected token.*\)\. Body: foo/
72
77
  )
78
+ described_class.parse(response)
73
79
  end
74
80
 
75
81
  it "returns an error message" do
76
- expect(described_class.parse(response, logger)['error']).to match(
82
+ expect(described_class.parse(response)['error']).to match(
77
83
  /\A#<JSON::ParserError.+>/
78
84
  )
79
85
  end
@@ -1,34 +1,20 @@
1
1
  RSpec.describe Airbrake::SyncSender do
2
- describe "#build_https" do
3
- it "overrides Net::HTTP's open_timeout and read_timeout if timeout is specified" do
4
- config = Airbrake::Config.new(timeout: 10)
5
- sender = described_class.new(config)
6
- https = sender.__send__(:build_https, config.endpoint)
7
- expect(https.open_timeout).to eq(10)
8
- expect(https.read_timeout).to eq(10)
9
- end
2
+ before do
3
+ Airbrake::Config.instance = Airbrake::Config.new(
4
+ project_id: 1, project_key: 'banana'
5
+ )
10
6
  end
11
7
 
12
8
  describe "#send" do
13
9
  let(:promise) { Airbrake::Promise.new }
14
- let(:stdout) { StringIO.new }
15
-
16
- let(:config) do
17
- Airbrake::Config.new(
18
- project_id: 1,
19
- project_key: 'banana',
20
- logger: Logger.new(stdout)
21
- )
22
- end
23
10
 
24
- let(:sender) { described_class.new(config) }
25
- let(:notice) { Airbrake::Notice.new(config, AirbrakeTestError.new) }
11
+ let(:notice) { Airbrake::Notice.new(AirbrakeTestError.new) }
26
12
  let(:endpoint) { 'https://api.airbrake.io/api/v3/projects/1/notices' }
27
13
 
28
14
  before { stub_request(:post, endpoint).to_return(body: '{}') }
29
15
 
30
16
  it "sets the Content-Type header to JSON" do
31
- sender.send({}, promise)
17
+ subject.send({}, promise)
32
18
  expect(
33
19
  a_request(:post, endpoint).with(
34
20
  headers: { 'Content-Type' => 'application/json' }
@@ -37,7 +23,7 @@ RSpec.describe Airbrake::SyncSender do
37
23
  end
38
24
 
39
25
  it "sets the User-Agent header to the notifier slug" do
40
- sender.send({}, promise)
26
+ subject.send({}, promise)
41
27
  expect(
42
28
  a_request(:post, endpoint).with(
43
29
  headers: {
@@ -48,7 +34,7 @@ RSpec.describe Airbrake::SyncSender do
48
34
  end
49
35
 
50
36
  it "sets the Authorization header to the project key" do
51
- sender.send({}, promise)
37
+ subject.send({}, promise)
52
38
  expect(
53
39
  a_request(:post, endpoint).with(
54
40
  headers: { 'Authorization' => 'Bearer banana' }
@@ -58,11 +44,13 @@ RSpec.describe Airbrake::SyncSender do
58
44
 
59
45
  it "catches exceptions raised while sending" do
60
46
  https = double("foo")
61
- allow(sender).to receive(:build_https).and_return(https)
47
+ allow(subject).to receive(:build_https).and_return(https)
62
48
  allow(https).to receive(:request).and_raise(StandardError.new('foo'))
63
- expect(sender.send({}, promise)).to be_an(Airbrake::Promise)
49
+ expect(Airbrake::Loggable.instance).to receive(:error).with(
50
+ /HTTP error: foo/
51
+ )
52
+ expect(subject.send({}, promise)).to be_an(Airbrake::Promise)
64
53
  expect(promise.value).to eq('error' => '**Airbrake: HTTP error: foo')
65
- expect(stdout.string).to match(/ERROR -- : .+ HTTP error: foo/)
66
54
  end
67
55
 
68
56
  context "when request body is nil" do
@@ -78,12 +66,17 @@ RSpec.describe Airbrake::SyncSender do
78
66
  10.times { backtrace << "bin/rails:3:in `<#{bad_string}>'" }
79
67
  ex.set_backtrace(backtrace)
80
68
 
81
- notice = Airbrake::Notice.new(config, ex)
69
+ notice = Airbrake::Notice.new(ex)
82
70
 
83
- expect(sender.send(notice, promise)).to be_an(Airbrake::Promise)
71
+ expect(Airbrake::Loggable.instance).to receive(:error).with(
72
+ /data was not sent/
73
+ )
74
+ expect(Airbrake::Loggable.instance).to receive(:error).with(
75
+ /truncation failed/
76
+ )
77
+ expect(subject.send(notice, promise)).to be_an(Airbrake::Promise)
84
78
  expect(promise.value).
85
79
  to match('error' => '**Airbrake: data was not sent because of missing body')
86
- expect(stdout.string).to match(/ERROR -- : .+ data was not sent/)
87
80
  end
88
81
  end
89
82
 
@@ -100,11 +93,11 @@ RSpec.describe Airbrake::SyncSender do
100
93
 
101
94
  it "returns error" do
102
95
  p1 = Airbrake::Promise.new
103
- sender.send({}, p1)
96
+ subject.send({}, p1)
104
97
  expect(p1.value).to match('error' => '**Airbrake: IP is rate limited')
105
98
 
106
99
  p2 = Airbrake::Promise.new
107
- sender.send({}, p2)
100
+ subject.send({}, p2)
108
101
  expect(p2.value).to match('error' => '**Airbrake: IP is rate limited')
109
102
 
110
103
  # Wait for X-RateLimit-Delay and then make a new request to make sure p2
@@ -112,7 +105,7 @@ RSpec.describe Airbrake::SyncSender do
112
105
  sleep 1
113
106
 
114
107
  p3 = Airbrake::Promise.new
115
- sender.send({}, p3)
108
+ subject.send({}, p3)
116
109
  expect(p3.value).to match('error' => '**Airbrake: IP is rate limited')
117
110
 
118
111
  expect(a_request(:post, endpoint)).to have_been_made.twice
@@ -123,7 +116,7 @@ RSpec.describe Airbrake::SyncSender do
123
116
  before { stub_request(:put, endpoint).to_return(status: 200, body: '') }
124
117
 
125
118
  it "PUTs the request" do
126
- sender = described_class.new(config, :put)
119
+ sender = described_class.new(:put)
127
120
  sender.send({}, promise)
128
121
  expect(a_request(:put, endpoint)).to have_been_made
129
122
  end
@@ -131,7 +124,7 @@ RSpec.describe Airbrake::SyncSender do
131
124
 
132
125
  context "when the provided method is :post" do
133
126
  it "POSTs the request" do
134
- sender = described_class.new(config, :post)
127
+ sender = described_class.new(:post)
135
128
  sender.send({}, promise)
136
129
  expect(a_request(:post, endpoint)).to have_been_made
137
130
  end