airbrake-ruby 5.0.1-java → 5.2.1-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 (73) hide show
  1. checksums.yaml +4 -4
  2. data/lib/airbrake-ruby.rb +4 -2
  3. data/lib/airbrake-ruby/async_sender.rb +3 -1
  4. data/lib/airbrake-ruby/config.rb +15 -6
  5. data/lib/airbrake-ruby/config/processor.rb +7 -20
  6. data/lib/airbrake-ruby/context.rb +51 -0
  7. data/lib/airbrake-ruby/file_cache.rb +1 -1
  8. data/lib/airbrake-ruby/filter_chain.rb +2 -0
  9. data/lib/airbrake-ruby/filters/context_filter.rb +4 -5
  10. data/lib/airbrake-ruby/filters/exception_attributes_filter.rb +1 -1
  11. data/lib/airbrake-ruby/filters/git_last_checkout_filter.rb +1 -1
  12. data/lib/airbrake-ruby/filters/git_revision_filter.rb +1 -1
  13. data/lib/airbrake-ruby/filters/keys_filter.rb +2 -2
  14. data/lib/airbrake-ruby/filters/sql_filter.rb +2 -2
  15. data/lib/airbrake-ruby/filters/thread_filter.rb +2 -3
  16. data/lib/airbrake-ruby/grouppable.rb +1 -1
  17. data/lib/airbrake-ruby/ignorable.rb +0 -2
  18. data/lib/airbrake-ruby/mergeable.rb +1 -1
  19. data/lib/airbrake-ruby/notice_notifier.rb +3 -4
  20. data/lib/airbrake-ruby/performance_notifier.rb +1 -2
  21. data/lib/airbrake-ruby/remote_settings.rb +10 -50
  22. data/lib/airbrake-ruby/remote_settings/callback.rb +44 -0
  23. data/lib/airbrake-ruby/remote_settings/settings_data.rb +3 -8
  24. data/lib/airbrake-ruby/tdigest.rb +7 -6
  25. data/lib/airbrake-ruby/thread_pool.rb +5 -3
  26. data/lib/airbrake-ruby/timed_trace.rb +1 -3
  27. data/lib/airbrake-ruby/version.rb +2 -2
  28. data/spec/airbrake_spec.rb +139 -76
  29. data/spec/async_sender_spec.rb +10 -8
  30. data/spec/backtrace_spec.rb +13 -10
  31. data/spec/benchmark_spec.rb +5 -3
  32. data/spec/code_hunk_spec.rb +24 -15
  33. data/spec/config/processor_spec.rb +29 -87
  34. data/spec/config/validator_spec.rb +5 -2
  35. data/spec/config_spec.rb +26 -17
  36. data/spec/context_spec.rb +54 -0
  37. data/spec/deploy_notifier_spec.rb +6 -4
  38. data/spec/file_cache_spec.rb +1 -0
  39. data/spec/filter_chain_spec.rb +29 -24
  40. data/spec/filters/context_filter_spec.rb +14 -5
  41. data/spec/filters/dependency_filter_spec.rb +3 -1
  42. data/spec/filters/exception_attributes_filter_spec.rb +5 -3
  43. data/spec/filters/gem_root_filter_spec.rb +5 -2
  44. data/spec/filters/git_last_checkout_filter_spec.rb +10 -12
  45. data/spec/filters/git_repository_filter.rb +9 -9
  46. data/spec/filters/git_revision_filter_spec.rb +19 -19
  47. data/spec/filters/keys_allowlist_spec.rb +25 -16
  48. data/spec/filters/keys_blocklist_spec.rb +25 -18
  49. data/spec/filters/root_directory_filter_spec.rb +3 -3
  50. data/spec/filters/sql_filter_spec.rb +26 -26
  51. data/spec/filters/system_exit_filter_spec.rb +4 -2
  52. data/spec/filters/thread_filter_spec.rb +16 -14
  53. data/spec/loggable_spec.rb +2 -2
  54. data/spec/monotonic_time_spec.rb +8 -6
  55. data/spec/nested_exception_spec.rb +46 -46
  56. data/spec/notice_notifier/options_spec.rb +23 -13
  57. data/spec/notice_notifier_spec.rb +52 -47
  58. data/spec/notice_spec.rb +6 -2
  59. data/spec/performance_notifier_spec.rb +67 -60
  60. data/spec/promise_spec.rb +38 -32
  61. data/spec/remote_settings/callback_spec.rb +162 -0
  62. data/spec/remote_settings/settings_data_spec.rb +23 -53
  63. data/spec/remote_settings_spec.rb +42 -75
  64. data/spec/response_spec.rb +34 -12
  65. data/spec/stashable_spec.rb +5 -5
  66. data/spec/stat_spec.rb +7 -5
  67. data/spec/sync_sender_spec.rb +49 -16
  68. data/spec/tdigest_spec.rb +61 -56
  69. data/spec/thread_pool_spec.rb +65 -55
  70. data/spec/time_truncate_spec.rb +4 -2
  71. data/spec/timed_trace_spec.rb +32 -30
  72. data/spec/truncator_spec.rb +72 -43
  73. metadata +53 -47
@@ -13,18 +13,20 @@ RSpec.describe Airbrake::AsyncSender do
13
13
  end
14
14
 
15
15
  describe "#send" do
16
+ subject(:async_sender) { described_class.new }
17
+
16
18
  context "when sender has the capacity to send" do
17
19
  it "sends notices to Airbrake" do
18
- 2.times { subject.send(notice, Airbrake::Promise.new) }
19
- subject.close
20
+ 2.times { async_sender.send(notice, Airbrake::Promise.new) }
21
+ async_sender.close
20
22
 
21
23
  expect(a_request(:post, endpoint)).to have_been_made.twice
22
24
  end
23
25
 
24
26
  it "returns a resolved promise" do
25
27
  promise = Airbrake::Promise.new
26
- subject.send(notice, promise)
27
- subject.close
28
+ async_sender.send(notice, promise)
29
+ async_sender.close
28
30
 
29
31
  expect(promise).to be_resolved
30
32
  end
@@ -40,8 +42,8 @@ RSpec.describe Airbrake::AsyncSender do
40
42
  end
41
43
 
42
44
  it "doesn't send the exceeded notices to Airbrake" do
43
- 15.times { subject.send(notice, Airbrake::Promise.new) }
44
- subject.close
45
+ 15.times { async_sender.send(notice, Airbrake::Promise.new) }
46
+ async_sender.close
45
47
 
46
48
  expect(a_request(:post, endpoint)).not_to have_been_made
47
49
  end
@@ -49,9 +51,9 @@ RSpec.describe Airbrake::AsyncSender do
49
51
  it "returns a rejected promise" do
50
52
  promise = nil
51
53
  15.times do
52
- promise = subject.send(notice, Airbrake::Promise.new)
54
+ promise = async_sender.send(notice, Airbrake::Promise.new)
53
55
  end
54
- subject.close
56
+ async_sender.close
55
57
 
56
58
  expect(promise).to be_rejected
57
59
  expect(promise.value).to eq(
@@ -177,10 +177,13 @@ RSpec.describe Airbrake::Backtrace do
177
177
  end
178
178
 
179
179
  it "logs frames that cannot be parsed" do
180
- expect(Airbrake::Loggable.instance).to receive(:error).with(
180
+ allow(Airbrake::Loggable.instance).to receive(:error)
181
+
182
+ described_class.parse(ex)
183
+
184
+ expect(Airbrake::Loggable.instance).to have_received(:error).with(
181
185
  /can't parse 'a b c 1 23 321 .rb'/,
182
186
  )
183
- described_class.parse(ex)
184
187
  end
185
188
  end
186
189
 
@@ -298,9 +301,9 @@ RSpec.describe Airbrake::Backtrace do
298
301
  it "attaches code to those frames files of which match root_directory" do
299
302
  ex = RuntimeError.new
300
303
  backtrace = [
301
- project_root_path('code.rb') + ":94:in `to_json'",
302
- fixture_path('notroot.txt' + ":3:in `pineapple'"),
303
- project_root_path('vendor/bundle/ignored_file.rb') + ":2:in `ignore_me'",
304
+ "#{project_root_path('code.rb')}:94:in `to_json'",
305
+ fixture_path("notroot.txt:3:in `pineapple'"),
306
+ "#{project_root_path('vendor/bundle/ignored_file.rb')}:2:in `ignore_me'",
304
307
  ]
305
308
  ex.set_backtrace(backtrace)
306
309
  expect(described_class.parse(ex)).to eq(parsed_backtrace)
@@ -335,7 +338,7 @@ RSpec.describe Airbrake::Backtrace do
335
338
 
336
339
  it "attaches code to those frames files of which match root_directory" do
337
340
  ex = RuntimeError.new
338
- ex.set_backtrace([project_root_path('code.rb') + ":94:in `to_json'"])
341
+ ex.set_backtrace(["#{project_root_path('code.rb')}:94:in `to_json'"])
339
342
  expect(described_class.parse(ex)).to eq(parsed_backtrace)
340
343
  end
341
344
  end
@@ -387,9 +390,9 @@ RSpec.describe Airbrake::Backtrace do
387
390
  it "attaches code to first N frames" do
388
391
  ex = RuntimeError.new
389
392
  backtrace = [
390
- project_root_path('code.rb') + ":94:in `to_json'",
391
- project_root_path('code.rb') + ":95:in `to_json'",
392
- project_root_path('code.rb') + ":96:in `to_json'",
393
+ "#{project_root_path('code.rb')}:94:in `to_json'",
394
+ "#{project_root_path('code.rb')}:95:in `to_json'",
395
+ "#{project_root_path('code.rb')}:96:in `to_json'",
393
396
  ]
394
397
  ex.set_backtrace(backtrace)
395
398
  expect(described_class.parse(ex)).to eq(parsed_backtrace)
@@ -417,7 +420,7 @@ RSpec.describe Airbrake::Backtrace do
417
420
 
418
421
  it "doesn't attach code to frames" do
419
422
  ex = RuntimeError.new
420
- backtrace = [project_root_path('code.rb') + ":94:in `to_json'"]
423
+ backtrace = ["#{project_root_path('code.rb')}:94:in `to_json'"]
421
424
  ex.set_backtrace(backtrace)
422
425
  expect(described_class.parse(ex)).to eq(parsed_backtrace)
423
426
  end
@@ -1,4 +1,6 @@
1
1
  RSpec.describe Airbrake::Benchmark do
2
+ subject(:benchmark) { described_class.new }
3
+
2
4
  describe ".measure" do
3
5
  it "returns measured performance time" do
4
6
  expect(described_class.measure { '10' * 10 }).to be_kind_of(Numeric)
@@ -6,14 +8,14 @@ RSpec.describe Airbrake::Benchmark do
6
8
  end
7
9
 
8
10
  describe "#stop" do
9
- before { subject }
11
+ before { benchmark }
10
12
 
11
13
  context "when called one time" do
12
14
  its(:stop) { is_expected.to eq(true) }
13
15
  end
14
16
 
15
17
  context "when called twice or more" do
16
- before { subject.stop }
18
+ before { benchmark.stop }
17
19
 
18
20
  its(:stop) { is_expected.to eq(false) }
19
21
  end
@@ -25,7 +27,7 @@ RSpec.describe Airbrake::Benchmark do
25
27
  end
26
28
 
27
29
  context "when #stop was called" do
28
- before { subject.stop }
30
+ before { benchmark.stop }
29
31
 
30
32
  its(:duration) { is_expected.to be > 0 }
31
33
  end
@@ -1,4 +1,6 @@
1
1
  RSpec.describe Airbrake::CodeHunk do
2
+ subject(:code_hunk) { described_class.new }
3
+
2
4
  after do
3
5
  %w[empty_file.rb code.rb banana.rb short_file.rb long_line.txt].each do |f|
4
6
  Airbrake::FileCache[project_root_path(f)] = nil
@@ -27,10 +29,12 @@ RSpec.describe Airbrake::CodeHunk do
27
29
  end
28
30
 
29
31
  context "when a file has less than NLINES lines before start line" do
30
- subject { described_class.new.get(project_root_path('code.rb'), 1) }
32
+ subject(:code_hunk) do
33
+ described_class.new.get(project_root_path('code.rb'), 1)
34
+ end
31
35
 
32
36
  it do
33
- is_expected.to(
37
+ expect(code_hunk).to(
34
38
  eq(
35
39
  1 => 'module Airbrake',
36
40
  2 => ' ##',
@@ -43,10 +47,12 @@ RSpec.describe Airbrake::CodeHunk do
43
47
  end
44
48
 
45
49
  context "when a file has less than NLINES lines after end line" do
46
- subject { described_class.new.get(project_root_path('code.rb'), 222) }
50
+ subject(:code_hunk) do
51
+ described_class.new.get(project_root_path('code.rb'), 222)
52
+ end
47
53
 
48
54
  it do
49
- is_expected.to(
55
+ expect(code_hunk).to(
50
56
  eq(
51
57
  220 => ' end',
52
58
  221 => 'end',
@@ -56,12 +62,12 @@ RSpec.describe Airbrake::CodeHunk do
56
62
  end
57
63
 
58
64
  context "when a file has less than NLINES lines before and after" do
59
- subject do
65
+ subject(:code_hunk) do
60
66
  described_class.new.get(project_root_path('short_file.rb'), 2)
61
67
  end
62
68
 
63
69
  it do
64
- is_expected.to(
70
+ expect(code_hunk).to(
65
71
  eq(
66
72
  1 => 'module Banana',
67
73
  2 => ' attr_reader :bingo',
@@ -72,10 +78,12 @@ RSpec.describe Airbrake::CodeHunk do
72
78
  end
73
79
 
74
80
  context "when a file has enough lines before and after" do
75
- subject { described_class.new.get(project_root_path('code.rb'), 100) }
81
+ subject(:code_hunk) do
82
+ described_class.new.get(project_root_path('code.rb'), 100)
83
+ end
76
84
 
77
85
  it do
78
- is_expected.to(
86
+ expect(code_hunk).to(
79
87
  eq(
80
88
  98 => ' return json if json && json.bytesize <= MAX_NOTICE_SIZE',
81
89
  99 => ' end',
@@ -88,27 +96,28 @@ RSpec.describe Airbrake::CodeHunk do
88
96
  end
89
97
 
90
98
  context "when a line exceeds the length limit" do
91
- subject do
99
+ subject(:code_hunk) do
92
100
  described_class.new.get(project_root_path('long_line.txt'), 1)
93
101
  end
94
102
 
95
103
  it "strips the line" do
96
- expect(subject[1]).to eq('l' + 'o' * 196 + 'ng')
104
+ expect(code_hunk[1]).to eq("l#{'o' * 196}ng")
97
105
  end
98
106
  end
99
107
 
100
108
  context "when an error occurrs while fetching code" do
101
109
  before do
102
- expect(Airbrake::FileCache).to receive(:[]).and_raise(Errno::EACCES)
110
+ allow(Airbrake::Loggable.instance).to receive(:error)
111
+ allow(Airbrake::FileCache).to receive(:[]).and_raise(Errno::EACCES)
103
112
  end
104
113
 
105
114
  it "logs error and returns nil" do
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(
115
+ expect(code_hunk.get(project_root_path('code.rb'), 1)).to(
110
116
  eq(1 => ''),
111
117
  )
118
+ expect(Airbrake::Loggable.instance).to have_received(:error).with(
119
+ /can't read code hunk.+Permission denied/,
120
+ )
112
121
  end
113
122
  end
114
123
  end
@@ -44,23 +44,49 @@ RSpec.describe Airbrake::Config::Processor do
44
44
  end
45
45
 
46
46
  describe "#process_remote_configuration" do
47
+ before do
48
+ allow(Airbrake::RemoteSettings).to receive(:poll)
49
+ end
50
+
47
51
  context "when the config doesn't define a project_id" do
48
52
  let(:config) { Airbrake::Config.new(project_id: nil) }
49
53
 
50
54
  it "doesn't set remote settings" do
51
- expect(Airbrake::RemoteSettings).not_to receive(:poll)
52
55
  described_class.new(config).process_remote_configuration
56
+
57
+ expect(Airbrake::RemoteSettings).not_to have_received(:poll)
58
+ end
59
+ end
60
+
61
+ context "when the config sets environment to 'test'" do
62
+ let(:config) { Airbrake::Config.new(project_id: 123, environment: 'test') }
63
+
64
+ it "doesn't set remote settings" do
65
+ described_class.new(config).process_remote_configuration
66
+
67
+ expect(Airbrake::RemoteSettings).not_to have_received(:poll)
53
68
  end
54
69
  end
55
70
 
56
71
  context "when the config defines a project_id" do
57
72
  let(:config) do
58
- Airbrake::Config.new(project_id: 123)
73
+ Airbrake::Config.new(project_id: 123, environment: 'not-test')
59
74
  end
60
75
 
61
76
  it "sets remote settings" do
62
- expect(Airbrake::RemoteSettings).to receive(:poll)
63
77
  described_class.new(config).process_remote_configuration
78
+
79
+ expect(Airbrake::RemoteSettings).to have_received(:poll)
80
+ end
81
+ end
82
+
83
+ context "when the config disables the remote_config option" do
84
+ let(:config) { Airbrake::Config.new(project_id: 123, remote_config: false) }
85
+
86
+ it "doesn't set remote settings" do
87
+ described_class.new(config).process_remote_configuration
88
+
89
+ expect(Airbrake::RemoteSettings).not_to have_received(:poll)
64
90
  end
65
91
  end
66
92
  end
@@ -122,88 +148,4 @@ RSpec.describe Airbrake::Config::Processor do
122
148
  end
123
149
  end
124
150
  end
125
-
126
- describe "#poll_callback" do
127
- let(:logger) { Logger.new(File::NULL) }
128
-
129
- let(:config) do
130
- Airbrake::Config.new(
131
- project_id: 123,
132
- logger: logger,
133
- )
134
- end
135
-
136
- let(:data) do
137
- instance_double(Airbrake::RemoteSettings::SettingsData)
138
- end
139
-
140
- before do
141
- allow(data).to receive(:to_h)
142
- allow(data).to receive(:error_host)
143
- allow(data).to receive(:apm_host)
144
- allow(data).to receive(:error_notifications?)
145
- allow(data).to receive(:performance_stats?)
146
- end
147
-
148
- it "logs given data" do
149
- expect(logger).to receive(:debug).with(/applying remote settings/)
150
- described_class.new(config).poll_callback(data)
151
- end
152
-
153
- it "sets the error_notifications option" do
154
- config.error_notifications = false
155
- expect(data).to receive(:error_notifications?).and_return(true)
156
-
157
- described_class.new(config).poll_callback(data)
158
- expect(config.error_notifications).to eq(true)
159
- end
160
-
161
- it "sets the performance_stats option" do
162
- config.performance_stats = false
163
- expect(data).to receive(:performance_stats?).and_return(true)
164
-
165
- described_class.new(config).poll_callback(data)
166
- expect(config.performance_stats).to eq(true)
167
- end
168
-
169
- context "when error_host returns a value" do
170
- it "sets the error_host option" do
171
- config.error_host = 'http://api.airbrake.io'
172
- allow(data).to receive(:error_host).and_return('https://api.example.com')
173
-
174
- described_class.new(config).poll_callback(data)
175
- expect(config.error_host).to eq('https://api.example.com')
176
- end
177
- end
178
-
179
- context "when error_host returns nil" do
180
- it "doesn't modify the error_host option" do
181
- config.error_host = 'http://api.airbrake.io'
182
- allow(data).to receive(:error_host).and_return(nil)
183
-
184
- described_class.new(config).poll_callback(data)
185
- expect(config.error_host).to eq('http://api.airbrake.io')
186
- end
187
- end
188
-
189
- context "when apm_host returns a value" do
190
- it "sets the apm_host option" do
191
- config.apm_host = 'http://api.airbrake.io'
192
- allow(data).to receive(:apm_host).and_return('https://api.example.com')
193
-
194
- described_class.new(config).poll_callback(data)
195
- expect(config.apm_host).to eq('https://api.example.com')
196
- end
197
- end
198
-
199
- context "when apm_host returns nil" do
200
- it "doesn't modify the apm_host option" do
201
- config.apm_host = 'http://api.airbrake.io'
202
- allow(data).to receive(:apm_host).and_return(nil)
203
-
204
- described_class.new(config).poll_callback(data)
205
- expect(config.apm_host).to eq('http://api.airbrake.io')
206
- end
207
- end
208
- end
209
151
  end
@@ -175,9 +175,12 @@ RSpec.describe Airbrake::Config::Validator do
175
175
  end
176
176
 
177
177
  it "warns about 'no effect'" do
178
- expect(config.logger).to receive(:warn)
179
- .with(/'ignore_environments' has no effect/)
178
+ allow(config.logger).to receive(:warn)
179
+
180
180
  described_class.check_notify_ability(config)
181
+
182
+ expect(config.logger).to have_received(:warn)
183
+ .with(/'ignore_environments' has no effect/)
181
184
  end
182
185
  end
183
186
 
data/spec/config_spec.rb CHANGED
@@ -1,4 +1,6 @@
1
1
  RSpec.describe Airbrake::Config do
2
+ subject(:config) { described_class.new }
3
+
2
4
  let(:resolved_promise) { Airbrake::Promise.new.resolve }
3
5
  let(:rejected_promise) { Airbrake::Promise.new.reject }
4
6
 
@@ -26,26 +28,31 @@ RSpec.describe Airbrake::Config do
26
28
  its(:query_stats) { is_expected.to eq(true) }
27
29
  its(:job_stats) { is_expected.to eq(true) }
28
30
  its(:error_notifications) { is_expected.to eq(true) }
31
+ its(:remote_config) { is_expected.to eq(true) }
29
32
 
30
33
  its(:remote_config_host) do
31
- is_expected.to eq('https://v1-production-notifier-configs.s3.amazonaws.com')
34
+ is_expected.to eq('https://notifier-configs.airbrake.io')
32
35
  end
33
36
 
34
37
  describe "#new" do
35
38
  context "when user config is passed" do
36
39
  subject { described_class.new(logger: StringIO.new) }
40
+
37
41
  its(:logger) { is_expected.to be_a(StringIO) }
38
42
  end
39
43
  end
40
44
 
41
45
  describe "#valid?" do
42
- context "when #validate returns a resolved promise" do
43
- before { expect(subject).to receive(:validate).and_return(resolved_promise) }
46
+ context "when the config is valid" do
47
+ before do
48
+ config.project_id = 123
49
+ config.project_key = 'abc'
50
+ end
51
+
44
52
  it { is_expected.to be_valid }
45
53
  end
46
54
 
47
- context "when #validate returns a rejected promise" do
48
- before { expect(subject).to receive(:validate).and_return(rejected_promise) }
55
+ context "when the config is invalid" do
49
56
  it { is_expected.not_to be_valid }
50
57
  end
51
58
  end
@@ -53,7 +60,7 @@ RSpec.describe Airbrake::Config do
53
60
  describe "#ignored_environment?" do
54
61
  context "when Validator returns a resolved promise" do
55
62
  before do
56
- expect(Airbrake::Config::Validator).to receive(:check_notify_ability)
63
+ allow(Airbrake::Config::Validator).to receive(:check_notify_ability)
57
64
  .and_return(resolved_promise)
58
65
  end
59
66
 
@@ -62,7 +69,7 @@ RSpec.describe Airbrake::Config do
62
69
 
63
70
  context "when Validator returns a rejected promise" do
64
71
  before do
65
- expect(Airbrake::Config::Validator).to receive(:check_notify_ability)
72
+ allow(Airbrake::Config::Validator).to receive(:check_notify_ability)
66
73
  .and_return(rejected_promise)
67
74
  end
68
75
 
@@ -95,19 +102,21 @@ RSpec.describe Airbrake::Config do
95
102
  end
96
103
 
97
104
  describe "#check_configuration" do
98
- let(:user_config) { {} }
99
-
100
105
  subject { described_class.new(valid_params.merge(user_config)) }
101
106
 
107
+ let(:user_config) { {} }
108
+
102
109
  its(:check_configuration) { is_expected.to be_an(Airbrake::Promise) }
103
110
 
104
111
  context "when config is invalid" do
105
112
  let(:user_config) { { project_id: nil } }
113
+
106
114
  its(:check_configuration) { is_expected.to be_rejected }
107
115
  end
108
116
 
109
117
  context "when current environment is ignored" do
110
118
  let(:user_config) { { environment: 'test', ignore_environments: ['test'] } }
119
+
111
120
  its(:check_configuration) { is_expected.to be_rejected }
112
121
  end
113
122
 
@@ -119,12 +128,12 @@ RSpec.describe Airbrake::Config do
119
128
  describe "#check_performance_options" do
120
129
  it "returns a promise" do
121
130
  resource = Airbrake::Query.new(method: '', route: '', query: '', timing: 1)
122
- expect(subject.check_performance_options(resource))
131
+ expect(config.check_performance_options(resource))
123
132
  .to be_an(Airbrake::Promise)
124
133
  end
125
134
 
126
135
  context "when performance stats are disabled" do
127
- before { subject.performance_stats = false }
136
+ before { config.performance_stats = false }
128
137
 
129
138
  let(:resource) do
130
139
  Airbrake::Request.new(
@@ -133,7 +142,7 @@ RSpec.describe Airbrake::Config do
133
142
  end
134
143
 
135
144
  it "returns a rejected promise" do
136
- promise = subject.check_performance_options(resource)
145
+ promise = config.check_performance_options(resource)
137
146
  expect(promise.value).to eq(
138
147
  'error' => "The Performance Stats feature is disabled",
139
148
  )
@@ -141,14 +150,14 @@ RSpec.describe Airbrake::Config do
141
150
  end
142
151
 
143
152
  context "when query stats are disabled" do
144
- before { subject.query_stats = false }
153
+ before { config.query_stats = false }
145
154
 
146
155
  let(:resource) do
147
156
  Airbrake::Query.new(method: 'GET', route: '/foo', query: '', timing: 1)
148
157
  end
149
158
 
150
159
  it "returns a rejected promise" do
151
- promise = subject.check_performance_options(resource)
160
+ promise = config.check_performance_options(resource)
152
161
  expect(promise.value).to eq(
153
162
  'error' => "The Query Stats feature is disabled",
154
163
  )
@@ -156,14 +165,14 @@ RSpec.describe Airbrake::Config do
156
165
  end
157
166
 
158
167
  context "when job stats are disabled" do
159
- before { subject.job_stats = false }
168
+ before { config.job_stats = false }
160
169
 
161
170
  let(:resource) do
162
171
  Airbrake::Queue.new(queue: 'foo_queue', error_count: 0, timing: 1)
163
172
  end
164
173
 
165
174
  it "returns a rejected promise" do
166
- promise = subject.check_performance_options(resource)
175
+ promise = config.check_performance_options(resource)
167
176
  expect(promise.value).to eq(
168
177
  'error' => "The Job Stats feature is disabled",
169
178
  )
@@ -173,7 +182,7 @@ RSpec.describe Airbrake::Config do
173
182
 
174
183
  describe "#logger" do
175
184
  it "sets logger level to Logger::WARN" do
176
- expect(subject.logger.level).to eq(Logger::WARN)
185
+ expect(config.logger.level).to eq(Logger::WARN)
177
186
  end
178
187
  end
179
188
  end