airbrake-ruby 3.2.6 → 4.0.0

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -1,8 +1,4 @@
1
1
  RSpec.describe Airbrake::Backtrace do
2
- let(:config) do
3
- Airbrake::Config.new.tap { |c| c.logger = Logger.new('/dev/null') }
4
- end
5
-
6
2
  describe ".parse" do
7
3
  context "UNIX backtrace" do
8
4
  let(:parsed_backtrace) do
@@ -24,9 +20,8 @@ RSpec.describe Airbrake::Backtrace do
24
20
  end
25
21
 
26
22
  it "returns a properly formatted array of hashes" do
27
- expect(
28
- described_class.parse(config, AirbrakeTestError.new)
29
- ).to eq(parsed_backtrace)
23
+ expect(described_class.parse(AirbrakeTestError.new)).
24
+ to eq(parsed_backtrace)
30
25
  end
31
26
  end
32
27
 
@@ -46,7 +41,7 @@ RSpec.describe Airbrake::Backtrace do
46
41
  end
47
42
 
48
43
  it "returns a properly formatted array of hashes" do
49
- expect(described_class.parse(config, ex)).to eq(parsed_backtrace)
44
+ expect(described_class.parse(ex)).to eq(parsed_backtrace)
50
45
  end
51
46
  end
52
47
 
@@ -70,9 +65,8 @@ RSpec.describe Airbrake::Backtrace do
70
65
  it "returns a properly formatted array of hashes" do
71
66
  allow(described_class).to receive(:java_exception?).and_return(true)
72
67
 
73
- expect(
74
- described_class.parse(config, JavaAirbrakeTestError.new)
75
- ).to eq(backtrace_array)
68
+ expect(described_class.parse(JavaAirbrakeTestError.new)).
69
+ to eq(backtrace_array)
76
70
  end
77
71
  end
78
72
 
@@ -99,7 +93,7 @@ RSpec.describe Airbrake::Backtrace do
99
93
 
100
94
  it "returns a properly formatted array of hashes" do
101
95
  allow(described_class).to receive(:java_exception?).and_return(true)
102
- expect(described_class.parse(config, ex)).to eq(parsed_backtrace)
96
+ expect(described_class.parse(ex)).to eq(parsed_backtrace)
103
97
  end
104
98
  end
105
99
 
@@ -123,7 +117,7 @@ RSpec.describe Airbrake::Backtrace do
123
117
  let(:ex) { AirbrakeTestError.new.tap { |e| e.set_backtrace(backtrace) } }
124
118
 
125
119
  it "returns a properly formatted array of hashes" do
126
- expect(described_class.parse(config, ex)).to eq(parsed_backtrace)
120
+ expect(described_class.parse(ex)).to eq(parsed_backtrace)
127
121
  end
128
122
  end
129
123
 
@@ -148,7 +142,7 @@ RSpec.describe Airbrake::Backtrace do
148
142
  end
149
143
 
150
144
  it "returns a properly formatted array of hashes" do
151
- expect(described_class.parse(config, ex)).to eq(parsed_backtrace)
145
+ expect(described_class.parse(ex)).to eq(parsed_backtrace)
152
146
  end
153
147
  end
154
148
 
@@ -166,7 +160,7 @@ RSpec.describe Airbrake::Backtrace do
166
160
  end
167
161
 
168
162
  it "returns a properly formatted array of hashes" do
169
- expect(described_class.parse(config, ex)).to eq(parsed_backtrace)
163
+ expect(described_class.parse(ex)).to eq(parsed_backtrace)
170
164
  end
171
165
  end
172
166
  end
@@ -178,18 +172,15 @@ RSpec.describe Airbrake::Backtrace do
178
172
 
179
173
  it "returns array of hashes where each unknown frame is marked as 'function'" do
180
174
  expect(
181
- described_class.parse(config, ex)
175
+ described_class.parse(ex)
182
176
  ).to eq([file: nil, line: nil, function: 'a b c 1 23 321 .rb'])
183
177
  end
184
178
 
185
- it "logs unknown frames as errors" do
186
- out = StringIO.new
187
- config.logger = Logger.new(out)
188
-
189
- expect { described_class.parse(config, ex) }.
190
- to change { out.string }.
191
- from('').
192
- to(/ERROR -- : can't parse 'a b c 1 23 321 .rb'/)
179
+ it "logs frames that cannot be parsed" do
180
+ expect(Airbrake::Loggable.instance).to receive(:error).with(
181
+ /can't parse 'a b c 1 23 321 .rb'/
182
+ )
183
+ described_class.parse(ex)
193
184
  end
194
185
  end
195
186
 
@@ -207,7 +198,7 @@ RSpec.describe Airbrake::Backtrace do
207
198
  end
208
199
 
209
200
  it "returns a properly formatted array of hashes" do
210
- expect(described_class.parse(config, ex)).to eq(parsed_backtrace)
201
+ expect(described_class.parse(ex)).to eq(parsed_backtrace)
211
202
  end
212
203
  end
213
204
 
@@ -230,7 +221,7 @@ RSpec.describe Airbrake::Backtrace do
230
221
 
231
222
  it "returns a properly formatted array of hashes" do
232
223
  stub_const('OCIError', AirbrakeTestError)
233
- expect(described_class.parse(config, ex)).to eq(parsed_backtrace)
224
+ expect(described_class.parse(ex)).to eq(parsed_backtrace)
234
225
  end
235
226
  end
236
227
 
@@ -263,20 +254,17 @@ RSpec.describe Airbrake::Backtrace do
263
254
 
264
255
  it "returns a properly formatted array of hashes" do
265
256
  stub_const('ExecJS::RuntimeError', AirbrakeTestError)
266
- expect(described_class.parse(config, ex)).to eq(parsed_backtrace)
257
+ expect(described_class.parse(ex)).to eq(parsed_backtrace)
267
258
  end
268
259
  end
269
260
 
270
261
  context "when code hunks are enabled" do
271
- let(:config) do
272
- config = Airbrake::Config.new
273
- config.logger = Logger.new('/dev/null')
274
- config.code_hunks = true
275
- config
276
- end
262
+ before { Airbrake::Config.instance.merge(code_hunks: true) }
277
263
 
278
264
  context "and when root_directory is configured" do
279
- before { config.root_directory = project_root_path('') }
265
+ before do
266
+ Airbrake::Config.instance.merge(root_directory: project_root_path(''))
267
+ end
280
268
 
281
269
  let(:parsed_backtrace) do
282
270
  [
@@ -315,12 +303,16 @@ RSpec.describe Airbrake::Backtrace do
315
303
  project_root_path('vendor/bundle/ignored_file.rb') + ":2:in `ignore_me'"
316
304
  ]
317
305
  ex.set_backtrace(backtrace)
318
- expect(described_class.parse(config, ex)).to eq(parsed_backtrace)
306
+ expect(described_class.parse(ex)).to eq(parsed_backtrace)
319
307
  end
320
308
  end
321
309
 
322
310
  context "and when root_directory is a Pathname" do
323
- before { config.root_directory = Pathname.new(project_root_path('')) }
311
+ before do
312
+ Airbrake::Config.instance.merge(
313
+ root_directory: Pathname.new(project_root_path(''))
314
+ )
315
+ end
324
316
 
325
317
  let(:parsed_backtrace) do
326
318
  [
@@ -344,13 +336,13 @@ RSpec.describe Airbrake::Backtrace do
344
336
  it "attaches code to those frames files of which match root_directory" do
345
337
  ex = RuntimeError.new
346
338
  ex.set_backtrace([project_root_path('code.rb') + ":94:in `to_json'"])
347
- expect(described_class.parse(config, ex)).to eq(parsed_backtrace)
339
+ expect(described_class.parse(ex)).to eq(parsed_backtrace)
348
340
  end
349
341
  end
350
342
 
351
343
  context "and when root_directory isn't configured" do
352
344
  before do
353
- config.root_directory = nil
345
+ Airbrake::Config.instance.merge(root_directory: nil)
354
346
  stub_const('Airbrake::Backtrace::CODE_FRAME_LIMIT', 2)
355
347
  end
356
348
 
@@ -400,21 +392,18 @@ RSpec.describe Airbrake::Backtrace do
400
392
  project_root_path('code.rb') + ":96:in `to_json'"
401
393
  ]
402
394
  ex.set_backtrace(backtrace)
403
- expect(described_class.parse(config, ex)).to eq(parsed_backtrace)
395
+ expect(described_class.parse(ex)).to eq(parsed_backtrace)
404
396
  end
405
397
  end
406
398
  end
407
399
 
408
400
  context "when code hunks are disabled" do
409
- let(:config) do
410
- config = Airbrake::Config.new
411
- config.logger = Logger.new('/dev/null')
412
- config.code_hunks = false
413
- config
414
- end
401
+ before { Airbrake::Config.instance.merge(code_hunks: false) }
415
402
 
416
403
  context "and when root_directory is configured" do
417
- before { config.root_directory = project_root_path('') }
404
+ before do
405
+ Airbrake::Config.instance.merge(root_directory: project_root_path(''))
406
+ end
418
407
 
419
408
  let(:parsed_backtrace) do
420
409
  [
@@ -430,7 +419,7 @@ RSpec.describe Airbrake::Backtrace do
430
419
  ex = RuntimeError.new
431
420
  backtrace = [project_root_path('code.rb') + ":94:in `to_json'"]
432
421
  ex.set_backtrace(backtrace)
433
- expect(described_class.parse(config, ex)).to eq(parsed_backtrace)
422
+ expect(described_class.parse(ex)).to eq(parsed_backtrace)
434
423
  end
435
424
  end
436
425
  end
@@ -1,6 +1,4 @@
1
1
  RSpec.describe Airbrake::CodeHunk do
2
- let(:config) { Airbrake::Config.new }
3
-
4
2
  after do
5
3
  %w[empty_file.rb code.rb banana.rb short_file.rb long_line.txt].each do |f|
6
4
  Airbrake::FileCache[project_root_path(f)] = nil
@@ -10,26 +8,26 @@ RSpec.describe Airbrake::CodeHunk do
10
8
  describe "#to_h" do
11
9
  context "when file is empty" do
12
10
  subject do
13
- described_class.new(config).get(project_root_path('empty_file.rb'), 1)
11
+ described_class.new.get(project_root_path('empty_file.rb'), 1)
14
12
  end
15
13
 
16
14
  it { is_expected.to eq(1 => '') }
17
15
  end
18
16
 
19
17
  context "when line is nil" do
20
- subject { described_class.new(config).get(project_root_path('code.rb'), nil) }
18
+ subject { described_class.new.get(project_root_path('code.rb'), nil) }
21
19
 
22
20
  it { is_expected.to be_nil }
23
21
  end
24
22
 
25
23
  context "when a file doesn't exist" do
26
- subject { described_class.new(config).get(project_root_path('banana.rb'), 1) }
24
+ subject { described_class.new.get(project_root_path('banana.rb'), 1) }
27
25
 
28
26
  it { is_expected.to be_nil }
29
27
  end
30
28
 
31
29
  context "when a file has less than NLINES lines before start line" do
32
- subject { described_class.new(config).get(project_root_path('code.rb'), 1) }
30
+ subject { described_class.new.get(project_root_path('code.rb'), 1) }
33
31
 
34
32
  it do
35
33
  is_expected.to(
@@ -45,7 +43,7 @@ RSpec.describe Airbrake::CodeHunk do
45
43
  end
46
44
 
47
45
  context "when a file has less than NLINES lines after end line" do
48
- subject { described_class.new(config).get(project_root_path('code.rb'), 222) }
46
+ subject { described_class.new.get(project_root_path('code.rb'), 222) }
49
47
 
50
48
  it do
51
49
  is_expected.to(
@@ -59,7 +57,7 @@ RSpec.describe Airbrake::CodeHunk do
59
57
 
60
58
  context "when a file has less than NLINES lines before and after" do
61
59
  subject do
62
- described_class.new(config).get(project_root_path('short_file.rb'), 2)
60
+ described_class.new.get(project_root_path('short_file.rb'), 2)
63
61
  end
64
62
 
65
63
  it do
@@ -74,7 +72,7 @@ RSpec.describe Airbrake::CodeHunk do
74
72
  end
75
73
 
76
74
  context "when a file has enough lines before and after" do
77
- subject { described_class.new(config).get(project_root_path('code.rb'), 100) }
75
+ subject { described_class.new.get(project_root_path('code.rb'), 100) }
78
76
 
79
77
  it do
80
78
  is_expected.to(
@@ -91,7 +89,7 @@ RSpec.describe Airbrake::CodeHunk do
91
89
 
92
90
  context "when a line exceeds the length limit" do
93
91
  subject do
94
- described_class.new(config).get(project_root_path('long_line.txt'), 1)
92
+ described_class.new.get(project_root_path('long_line.txt'), 1)
95
93
  end
96
94
 
97
95
  it "strips the line" do
@@ -105,13 +103,12 @@ RSpec.describe Airbrake::CodeHunk do
105
103
  end
106
104
 
107
105
  it "logs error and returns nil" do
108
- out = StringIO.new
109
- config = Airbrake::Config.new
110
- config.logger = Logger.new(out)
111
- expect(described_class.new(config).get(project_root_path('code.rb'), 1)).to(
106
+ expect(Airbrake::Loggable.instance).to receive(:error).with(
107
+ /can't read code hunk.+Permission denied/
108
+ )
109
+ expect(subject.get(project_root_path('code.rb'), 1)).to(
112
110
  eq(1 => '')
113
111
  )
114
- expect(out.string).to match(/can't read code hunk.+Permission denied/)
115
112
  end
116
113
  end
117
114
  end
data/spec/config_spec.rb CHANGED
@@ -1,43 +1,41 @@
1
1
  RSpec.describe Airbrake::Config do
2
- let(:config) { described_class.new }
3
-
4
2
  describe "#new" do
5
3
  describe "options" do
6
4
  it "doesn't set the default project_id" do
7
- expect(config.project_id).to be_nil
5
+ expect(subject.project_id).to be_nil
8
6
  end
9
7
 
10
8
  it "doesn't set the default project_key" do
11
- expect(config.project_key).to be_nil
9
+ expect(subject.project_key).to be_nil
12
10
  end
13
11
 
14
12
  it "doesn't set the default proxy" do
15
- expect(config.proxy).to be_empty
13
+ expect(subject.proxy).to be_empty
16
14
  end
17
15
 
18
16
  it "sets the default logger" do
19
- expect(config.logger).to be_a Logger
17
+ expect(subject.logger).to be_a Logger
20
18
  end
21
19
 
22
20
  it "doesn't set the default app_version" do
23
- expect(config.app_version).to be_nil
21
+ expect(subject.app_version).to be_nil
24
22
  end
25
23
 
26
24
  it "sets the default versions" do
27
- expect(config.versions).to be_empty
25
+ expect(subject.versions).to be_empty
28
26
  end
29
27
 
30
28
  it "sets the default host" do
31
- expect(config.host).to eq('https://api.airbrake.io')
29
+ expect(subject.host).to eq('https://api.airbrake.io')
32
30
  end
33
31
 
34
32
  it "sets the default endpoint" do
35
- expect(config.endpoint).not_to be_nil
33
+ expect(subject.endpoint).not_to be_nil
36
34
  end
37
35
 
38
36
  it "creates a new Config and merges it with the user config" do
39
- cfg = described_class.new(logger: StringIO.new)
40
- expect(cfg.logger).to be_a StringIO
37
+ config = described_class.new(logger: StringIO.new)
38
+ expect(config.logger).to be_a(StringIO)
41
39
  end
42
40
 
43
41
  it "raises error on unknown config options" do
@@ -46,57 +44,43 @@ RSpec.describe Airbrake::Config do
46
44
  end
47
45
 
48
46
  it "sets the default number of workers" do
49
- expect(config.workers).to eq(1)
47
+ expect(subject.workers).to eq(1)
50
48
  end
51
49
 
52
50
  it "sets the default number of queue size" do
53
- expect(config.queue_size).to eq(100)
51
+ expect(subject.queue_size).to eq(100)
54
52
  end
55
53
 
56
54
  it "sets the default root_directory" do
57
- expect(config.root_directory).to eq Bundler.root.realpath.to_s
55
+ expect(subject.root_directory).to eq Bundler.root.realpath.to_s
58
56
  end
59
57
 
60
58
  it "doesn't set the default environment" do
61
- expect(config.environment).to be_nil
59
+ expect(subject.environment).to be_nil
62
60
  end
63
61
 
64
62
  it "doesn't set default notify_environments" do
65
- expect(config.ignore_environments).to be_empty
63
+ expect(subject.ignore_environments).to be_empty
66
64
  end
67
65
 
68
66
  it "doesn't set default timeout" do
69
- expect(config.timeout).to be_nil
67
+ expect(subject.timeout).to be_nil
70
68
  end
71
69
 
72
70
  it "doesn't set default blacklist" do
73
- expect(config.blacklist_keys).to be_empty
71
+ expect(subject.blacklist_keys).to be_empty
74
72
  end
75
73
 
76
74
  it "doesn't set default whitelist" do
77
- expect(config.whitelist_keys).to be_empty
78
- end
79
-
80
- it "disables route stats by default (deprecated)" do
81
- out = StringIO.new
82
- config.logger = Logger.new(out)
83
- expect(config.route_stats).to be_falsey
84
- expect(out.string).to match(/'route_stats'.+is deprecated/)
75
+ expect(subject.whitelist_keys).to be_empty
85
76
  end
86
77
 
87
78
  it "disables performance stats by default" do
88
- expect(config.performance_stats).to be_falsey
89
- end
90
-
91
- it "sets the default route_stats_flush_period (deprecated)" do
92
- out = StringIO.new
93
- config.logger = Logger.new(out)
94
- expect(config.route_stats_flush_period).to eq(15)
95
- expect(out.string).to match(/'route_stats_flush_period'.+is deprecated/)
79
+ expect(subject.performance_stats).to be_falsey
96
80
  end
97
81
 
98
82
  it "sets the default performance_stats_flush_period" do
99
- expect(config.performance_stats_flush_period).to eq(15)
83
+ expect(subject.performance_stats_flush_period).to eq(15)
100
84
  end
101
85
  end
102
86
  end
@@ -104,18 +88,20 @@ RSpec.describe Airbrake::Config do
104
88
  describe "#valid?" do
105
89
  context "when project_id is nil" do
106
90
  it "returns false" do
107
- config.project_id = nil
108
- config.project_key = '123'
109
-
91
+ config = described_class.new(
92
+ project_id: nil,
93
+ project_key: '123'
94
+ )
110
95
  expect(config).not_to be_valid
111
96
  end
112
97
  end
113
98
 
114
99
  context "when project_key is nil" do
115
100
  it "returns false" do
116
- config.project_id = 123
117
- config.project_key = nil
118
-
101
+ config = described_class.new(
102
+ project_id: 123,
103
+ project_key: nil
104
+ )
119
105
  expect(config).not_to be_valid
120
106
  end
121
107
  end
@@ -123,22 +109,24 @@ RSpec.describe Airbrake::Config do
123
109
  context "when the current environment is ignored" do
124
110
  context "and when the notifier misconfigures configure project_key & project_id" do
125
111
  it "returns true" do
126
- config.project_id = Object.new
127
- config.project_key = Object.new
128
- config.environment = :bingo
129
- config.ignore_environments = [:bingo]
130
-
112
+ config = described_class.new(
113
+ project_id: Object.new,
114
+ project_key: Object.new,
115
+ environment: :bingo,
116
+ ignore_environments: [:bingo]
117
+ )
131
118
  expect(config).to be_valid
132
119
  end
133
120
  end
134
121
 
135
122
  context "and when the notifier configures project_key & project_id" do
136
123
  it "returns true" do
137
- config.project_id = 123
138
- config.project_key = '321'
139
- config.environment = :bingo
140
- config.ignore_environments = [:bingo]
141
-
124
+ config = described_class.new(
125
+ project_id: 123,
126
+ project_key: '321',
127
+ environment: :bingo,
128
+ ignore_environments: [:bingo]
129
+ )
142
130
  expect(config).to be_valid
143
131
  end
144
132
  end
@@ -146,52 +134,54 @@ RSpec.describe Airbrake::Config do
146
134
 
147
135
  context "when the project_id value is not a number" do
148
136
  it "returns false" do
149
- config.project_id = 'bingo'
150
- config.project_key = '321'
151
-
137
+ config = described_class.new(
138
+ project_id: 'bingo',
139
+ project_key: '321'
140
+ )
152
141
  expect(config).not_to be_valid
153
142
  end
154
143
  end
155
144
 
156
145
  context "when the project_id value is a String number" do
157
146
  it "returns true" do
158
- config.project_id = '123'
159
- config.project_key = '321'
160
-
147
+ config = described_class.new(
148
+ project_id: '123',
149
+ project_key: '321'
150
+ )
161
151
  expect(config).to be_valid
162
152
  end
163
153
  end
164
154
 
165
155
  context "when the project_key value is not a String" do
166
156
  it "returns false" do
167
- config.project_id = 123
168
- config.project_key = 321
169
-
157
+ config = described_class.new(
158
+ project_id: 123,
159
+ project_key: 321
160
+ )
170
161
  expect(config).not_to be_valid
171
162
  end
172
163
  end
173
164
 
174
165
  context "when the project_key value is an empty String" do
175
166
  it "returns false" do
176
- config.project_id = 123
177
- config.project_key = ''
178
-
167
+ config = described_class.new(
168
+ project_id: 123,
169
+ project_key: ''
170
+ )
179
171
  expect(config).not_to be_valid
180
172
  end
181
173
  end
182
174
 
183
175
  context "when the environment value is not a String" do
184
- let(:out) { StringIO.new }
185
- let(:config) { described_class.new(logger: Logger.new(out)) }
186
-
187
176
  before do
188
- config.project_id = 123
189
- config.project_key = '321'
190
-
191
- config.environment = ['bingo']
192
177
  end
193
178
 
194
179
  it "returns false" do
180
+ config = described_class.new(
181
+ project_id: 123,
182
+ project_key: '321',
183
+ environment: ['bingo']
184
+ )
195
185
  expect(config).not_to be_valid
196
186
  end
197
187
  end
@@ -199,32 +189,26 @@ RSpec.describe Airbrake::Config do
199
189
 
200
190
  describe "#ignored_environment?" do
201
191
  describe "warnings" do
202
- let(:out) { StringIO.new }
203
- let(:config) { described_class.new(logger: Logger.new(out)) }
204
-
205
192
  context "when 'ignore_environments' is set and 'environment' isn't" do
206
193
  it "prints a warning" do
207
- config.ignore_environments = [:bingo]
194
+ config = described_class.new(ignore_environments: [:bingo])
208
195
 
196
+ expect(config.logger).to receive(:warn).with(
197
+ /'ignore_environments' has no effect/
198
+ )
209
199
  expect(config.ignored_environment?).to be_falsey
210
- expect(out.string).to match(/ignore_environments' has no effect/)
211
200
  end
212
201
  end
213
202
 
214
203
  context "when 'ignore_environments' is set along with 'environment'" do
215
204
  it "doesn't print a warning" do
216
- config.environment = :bango
217
- config.ignore_environments = [:bingo]
218
-
219
- expect(config.ignored_environment?).to be_falsey
220
- expect(out.string).to be_empty
221
- end
222
- end
205
+ config = described_class.new(
206
+ environment: :bango,
207
+ ignore_environments: [:bingo]
208
+ )
223
209
 
224
- context "when 'ignore_environments' isn't set and 'environment' isn't set too" do
225
- it "doesn't print a warning" do
210
+ expect(config.logger).not_to receive(:warn)
226
211
  expect(config.ignored_environment?).to be_falsey
227
- expect(out.string).to be_empty
228
212
  end
229
213
  end
230
214
  end
@@ -233,9 +217,10 @@ RSpec.describe Airbrake::Config do
233
217
  context "when 'environment' is a String" do
234
218
  context "and when 'ignore_environments' contains Symbols" do
235
219
  it "returns true" do
236
- config.environment = 'bango'
237
- config.ignore_environments = [:bango]
238
-
220
+ config = described_class.new(
221
+ environment: 'bango',
222
+ ignore_environments: [:bango]
223
+ )
239
224
  expect(config.ignored_environment?).to be_truthy
240
225
  end
241
226
  end
@@ -244,9 +229,10 @@ RSpec.describe Airbrake::Config do
244
229
  context "when 'environment' is a Symbol" do
245
230
  context "and when 'ignore_environments' contains Strings" do
246
231
  it "returns true" do
247
- config.environment = :bango
248
- config.ignore_environments = %w[bango]
249
-
232
+ config = described_class.new(
233
+ environment: :bango,
234
+ ignore_environments: %w[bango]
235
+ )
250
236
  expect(config.ignored_environment?).to be_truthy
251
237
  end
252
238
  end
@@ -256,10 +242,7 @@ RSpec.describe Airbrake::Config do
256
242
 
257
243
  describe "#endpoint" do
258
244
  context "when host is configured with a URL with a slug" do
259
- before do
260
- config.project_id = 1
261
- config.project_key = '2'
262
- end
245
+ let(:config) { described_class.new(project_id: 1, project_key: '2') }
263
246
 
264
247
  context "and with a trailing slash" do
265
248
  it "sets the endpoint with the slug" do