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
@@ -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