execute_with_rescue_with_airbrake 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/.rubocop.yml +861 -0
- data/.travis.yml +34 -8
- data/Appraisals +44 -6
- data/CHANGELOG.md +43 -5
- data/Gemfile +2 -2
- data/README.md +7 -10
- data/Rakefile +9 -7
- data/execute_with_rescue_with_airbrake.gemspec +8 -5
- data/gemfiles/rails_3_2_and_airbrake_3.gemfile +8 -0
- data/gemfiles/rails_3_2_and_airbrake_4.gemfile +8 -0
- data/gemfiles/rails_4_0_and_airbrake_3.gemfile +8 -0
- data/gemfiles/rails_4_0_and_airbrake_4.gemfile +8 -0
- data/gemfiles/{rails_3_2.gemfile → rails_4_1_and_airbrake_3.gemfile} +2 -1
- data/gemfiles/{rails_4_0.gemfile → rails_4_1_and_airbrake_4.gemfile} +2 -1
- data/gemfiles/{rails_4_1.gemfile → rails_4_2_and_airbrake_3.gemfile} +2 -1
- data/gemfiles/rails_4_2_and_airbrake_4.gemfile +8 -0
- data/gemfiles/rails_5_0_and_airbrake_3.gemfile +8 -0
- data/gemfiles/rails_5_0_and_airbrake_4.gemfile +8 -0
- data/lib/execute_with_rescue/mixins/with_airbrake.rb +22 -17
- data/lib/execute_with_rescue_with_airbrake.rb +3 -4
- data/lib/execute_with_rescue_with_airbrake/adapters/airbrake_adapter.rb +20 -29
- data/lib/execute_with_rescue_with_airbrake/version.rb +1 -1
- data/spec/execute_with_rescue/mixins/with_airbrake_spec.rb +55 -53
- data/spec/execute_with_rescue_with_airbrake/adapters/airbrake_adapter_spec.rb +62 -64
- data/spec/fixtures/test_service_classes.rb +5 -5
- data/spec/spec_helper.rb +8 -8
- metadata +57 -35
@@ -1,54 +1,53 @@
|
|
1
|
-
require
|
2
|
-
|
1
|
+
require "spec_helper"
|
3
2
|
|
4
3
|
describe ExecuteWithRescue::Mixins::WithAirbrake do
|
5
4
|
let(:test_class) { TestServiceWithAirbrake }
|
6
5
|
let(:test_class_instance) { test_class.new }
|
7
6
|
let(:call_service) { test_class_instance.call }
|
8
7
|
|
9
|
-
shared_context
|
8
|
+
shared_context "when airbrake adapter assumed exists" do
|
10
9
|
let(:adapter_class) do
|
11
10
|
ExecuteWithRescueWithAirbrake::Adapters::AirbrakeAdapter
|
12
11
|
end
|
13
12
|
let!(:adapter_instance) { adapter_class.new }
|
14
13
|
before do
|
15
14
|
# Avoid Error
|
16
|
-
allow(test_class_instance)
|
17
|
-
|
18
|
-
|
15
|
+
allow(test_class_instance).
|
16
|
+
to receive(:_execute_with_rescue_current_airbrake_adapter).
|
17
|
+
and_return(adapter_instance)
|
19
18
|
end
|
20
19
|
end
|
21
20
|
|
22
|
-
describe
|
21
|
+
describe "included modules" do
|
23
22
|
subject { test_class.ancestors }
|
24
23
|
|
25
|
-
it {should include ExecuteWithRescue::Mixins::Core}
|
26
|
-
it {should include ExecuteWithRescue::Mixins::WithAirbrake}
|
24
|
+
it { should include ExecuteWithRescue::Mixins::Core }
|
25
|
+
it { should include ExecuteWithRescue::Mixins::WithAirbrake }
|
27
26
|
end
|
28
27
|
|
29
|
-
describe
|
30
|
-
context
|
28
|
+
describe "call delegated methods" do
|
29
|
+
context "without calling #execute_with_rescue" do
|
31
30
|
let(:test_class) { TestServiceWithAirbrakeWithoutExecuteWithRescueCall }
|
32
31
|
let(:expected_error_class) { ExecuteWithRescue::Errors::NoAirbrakeAdapter }
|
33
32
|
|
34
33
|
specify do
|
35
|
-
expect{ call_service }
|
36
|
-
|
34
|
+
expect { call_service }.
|
35
|
+
to raise_error(expected_error_class)
|
37
36
|
end
|
38
37
|
end
|
39
|
-
context
|
38
|
+
context "without calling #execute_with_rescue" do
|
40
39
|
let(:test_class) { TestServiceWithAirbrakeWithExecuteWithRescueCall }
|
41
40
|
|
42
41
|
specify do
|
43
|
-
expect{ call_service }
|
44
|
-
|
42
|
+
expect { call_service }.
|
43
|
+
to_not raise_error
|
45
44
|
end
|
46
45
|
end
|
47
|
-
context
|
46
|
+
context "with calling #execute_with_rescue"
|
48
47
|
end
|
49
48
|
|
50
|
-
describe
|
51
|
-
include_context
|
49
|
+
describe "delegation" do
|
50
|
+
include_context "when airbrake adapter assumed exists"
|
52
51
|
|
53
52
|
before do
|
54
53
|
allow(adapter_instance).to receive(method_name)
|
@@ -56,7 +55,7 @@ describe ExecuteWithRescue::Mixins::WithAirbrake do
|
|
56
55
|
|
57
56
|
let(:send_message) { test_class_instance.send(method_name) }
|
58
57
|
|
59
|
-
shared_examples_for
|
58
|
+
shared_examples_for "delegation" do
|
60
59
|
specify do
|
61
60
|
expect(adapter_instance).to receive(method_name)
|
62
61
|
|
@@ -64,77 +63,80 @@ describe ExecuteWithRescue::Mixins::WithAirbrake do
|
|
64
63
|
end
|
65
64
|
end
|
66
65
|
|
67
|
-
describe
|
66
|
+
describe "for #set_default_airbrake_notice_error_class" do
|
68
67
|
let(:method_name) { :set_default_airbrake_notice_error_class }
|
69
68
|
|
70
|
-
it_behaves_like
|
69
|
+
it_behaves_like "delegation"
|
71
70
|
end
|
72
|
-
describe
|
71
|
+
describe "for #set_default_airbrake_notice_error_message" do
|
73
72
|
let(:method_name) { :set_default_airbrake_notice_error_message }
|
74
73
|
|
75
|
-
it_behaves_like
|
74
|
+
it_behaves_like "delegation"
|
76
75
|
end
|
77
|
-
describe
|
76
|
+
describe "for #add_default_airbrake_notice_parameters" do
|
78
77
|
let(:method_name) { :add_default_airbrake_notice_parameters }
|
79
78
|
|
80
|
-
it_behaves_like
|
79
|
+
it_behaves_like "delegation"
|
81
80
|
end
|
82
81
|
end
|
83
82
|
|
84
|
-
describe
|
85
|
-
include_context
|
83
|
+
describe "execution" do
|
84
|
+
include_context "when airbrake adapter assumed exists"
|
86
85
|
|
87
86
|
before { allow(Airbrake.configuration).to receive(:public?) { true } }
|
88
87
|
|
89
|
-
describe
|
88
|
+
describe "when there is no error raised" do
|
90
89
|
specify do
|
91
|
-
expect(Airbrake)
|
92
|
-
|
90
|
+
expect(Airbrake).
|
91
|
+
to_not receive(:notify_or_ignore)
|
93
92
|
|
94
93
|
call_service
|
95
94
|
end
|
96
95
|
end
|
97
|
-
describe
|
98
|
-
context
|
96
|
+
describe "when there is error raised" do
|
97
|
+
context "and it is a standard error" do
|
99
98
|
let(:test_class) { TestServiceWithAirbrakeWithError }
|
100
99
|
|
101
100
|
specify do
|
102
|
-
expect(Airbrake)
|
103
|
-
|
104
|
-
|
101
|
+
expect(Airbrake).
|
102
|
+
to receive(:notify_or_ignore).
|
103
|
+
with(kind_of(StandardError), {})
|
105
104
|
|
106
105
|
call_service
|
107
106
|
end
|
108
107
|
end
|
109
108
|
|
110
|
-
describe
|
109
|
+
describe "setting custom airbrake options" do
|
111
110
|
let(:test_class) { TestServiceWithAirbrakeWithErrorAndAirbrakeOption }
|
112
111
|
|
113
112
|
specify do
|
114
|
-
expect(Airbrake)
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
113
|
+
expect(Airbrake).
|
114
|
+
to receive(:notify_or_ignore).
|
115
|
+
with(
|
116
|
+
kind_of(StandardError),
|
117
|
+
error_class: test_class::CustomError,
|
118
|
+
error_message: "hi",
|
119
|
+
parameters: {
|
120
|
+
foo: :bar
|
121
|
+
},
|
122
|
+
)
|
123
123
|
|
124
124
|
call_service
|
125
125
|
end
|
126
126
|
end
|
127
127
|
|
128
|
-
describe
|
128
|
+
describe "setting custom airbrake options with an error "\
|
129
|
+
"that requires argument on initialize" do
|
129
130
|
let(:test_class) { TestServiceWithAirbrakeWithCustomErrorAndMessage }
|
130
131
|
|
131
132
|
specify do
|
132
|
-
expect(Airbrake)
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
133
|
+
expect(Airbrake).
|
134
|
+
to receive(:notify_or_ignore).
|
135
|
+
with(
|
136
|
+
kind_of(StandardError),
|
137
|
+
error_class: test_class::CustomErrorWithMessage,
|
138
|
+
error_message: "#{:foo.class} has error",
|
139
|
+
)
|
138
140
|
|
139
141
|
call_service
|
140
142
|
end
|
@@ -1,5 +1,4 @@
|
|
1
|
-
require
|
2
|
-
|
1
|
+
require "spec_helper"
|
3
2
|
|
4
3
|
describe ExecuteWithRescueWithAirbrake::Adapters::AirbrakeAdapter do
|
5
4
|
let!(:instance) { described_class.new }
|
@@ -7,41 +6,39 @@ describe ExecuteWithRescueWithAirbrake::Adapters::AirbrakeAdapter do
|
|
7
6
|
let!(:notice_options) do
|
8
7
|
{parameters: {}}
|
9
8
|
end
|
10
|
-
let!(:exception_rescued) { StandardError.new(
|
9
|
+
let!(:exception_rescued) { StandardError.new("hi I am test error") }
|
11
10
|
|
12
11
|
let(:notify_or_raise) { instance.notify_or_raise(exception_rescued) }
|
13
12
|
|
14
|
-
|
15
|
-
|
16
|
-
context 'when exception should not be notified according to Airbrake' do
|
13
|
+
context "when exception should not be notified according to Airbrake" do
|
17
14
|
before { allow(Airbrake.configuration).to receive(:public?) { false } }
|
18
15
|
|
19
|
-
it
|
20
|
-
expect { notify_or_raise }.
|
21
|
-
|
16
|
+
it "re-raise the rescue error" do
|
17
|
+
expect { notify_or_raise }.
|
18
|
+
to raise_error(
|
19
|
+
exception_rescued.class,
|
20
|
+
exception_rescued.message,
|
21
|
+
)
|
22
22
|
end
|
23
23
|
end
|
24
|
-
context
|
24
|
+
context "when exception should be notified according to Airbrake" do
|
25
25
|
before { allow(Airbrake.configuration).to receive(:public?) { true } }
|
26
26
|
|
27
|
-
it
|
27
|
+
it "does not re-raise the rescued error" do
|
28
28
|
expect { notify_or_raise }.to_not raise_error
|
29
29
|
end
|
30
30
|
end
|
31
31
|
|
32
|
-
context
|
32
|
+
context "assuming Airbrake says it error should be notified" do
|
33
33
|
before { allow(Airbrake.configuration).to receive(:public?) { true } }
|
34
34
|
|
35
|
-
it
|
35
|
+
it "calls Airbrake.notify_or_ignore" do
|
36
36
|
expect(Airbrake).to receive(:notify_or_ignore)
|
37
37
|
|
38
38
|
notify_or_raise
|
39
|
-
|
40
|
-
# expect(Airbrake).to have_received(:notify_or_ignore)
|
41
39
|
end
|
42
40
|
|
43
|
-
|
44
|
-
describe '#set_default_airbrake_notice_error_class' do
|
41
|
+
describe "#set_default_airbrake_notice_error_class" do
|
45
42
|
let(:set_error_class) do
|
46
43
|
instance.set_default_airbrake_notice_error_class(
|
47
44
|
default_error_class)
|
@@ -51,62 +48,62 @@ describe ExecuteWithRescueWithAirbrake::Adapters::AirbrakeAdapter do
|
|
51
48
|
|
52
49
|
before do
|
53
50
|
# Return the options only
|
54
|
-
allow(Airbrake).to receive(:notify_or_ignore) {|*args| args.last }
|
51
|
+
allow(Airbrake).to receive(:notify_or_ignore) { |*args| args.last }
|
55
52
|
end
|
56
53
|
let(:options_hash) { notify_or_raise }
|
57
54
|
subject { options_hash }
|
58
55
|
|
59
|
-
context
|
56
|
+
context "when its not called" do
|
60
57
|
its(:keys) { should_not include(option_key) }
|
61
58
|
end
|
62
|
-
context
|
59
|
+
context "when its called with nil" do
|
63
60
|
let(:default_error_class) { nil }
|
64
61
|
before { set_error_class }
|
65
62
|
|
66
63
|
its(:keys) { should_not include(option_key) }
|
67
64
|
end
|
68
|
-
context
|
65
|
+
context "when its called with custom error" do
|
69
66
|
let(:default_error_class) { ArgumentError }
|
70
67
|
before { set_error_class }
|
71
68
|
|
72
|
-
it { should include(
|
69
|
+
it { should include(option_key => default_error_class) }
|
73
70
|
end
|
74
71
|
end
|
75
72
|
|
76
|
-
describe
|
73
|
+
describe "#set_default_airbrake_notice_error_message" do
|
77
74
|
let(:set_error_message) do
|
78
|
-
instance.
|
79
|
-
default_error_message)
|
75
|
+
instance.
|
76
|
+
set_default_airbrake_notice_error_message(default_error_message)
|
80
77
|
end
|
81
78
|
let(:default_error_message) { nil }
|
82
79
|
let(:option_key) { :error_message }
|
83
80
|
|
84
81
|
before do
|
85
82
|
# Return the options only
|
86
|
-
allow(Airbrake).to receive(:notify_or_ignore) {|*args| args.last }
|
83
|
+
allow(Airbrake).to receive(:notify_or_ignore) { |*args| args.last }
|
87
84
|
end
|
88
85
|
let(:options_hash) { notify_or_raise }
|
89
86
|
subject { options_hash }
|
90
87
|
|
91
|
-
context
|
88
|
+
context "when its not called" do
|
92
89
|
its(:keys) { should_not include(option_key) }
|
93
90
|
end
|
94
|
-
context
|
91
|
+
context "when its called with nil" do
|
95
92
|
let(:default_error_message) { nil }
|
96
93
|
before { set_error_message }
|
97
94
|
|
98
95
|
its(:keys) { should_not include(option_key) }
|
99
96
|
end
|
100
|
-
context
|
101
|
-
let(:default_error_message) {
|
97
|
+
context "when its called with custom error" do
|
98
|
+
let(:default_error_message) { "hello" }
|
102
99
|
before { set_error_message }
|
103
100
|
|
104
|
-
it { should include(
|
101
|
+
it { should include(option_key => default_error_message) }
|
105
102
|
end
|
106
103
|
end
|
107
104
|
|
108
|
-
describe
|
109
|
-
# Must defined as method or it won
|
105
|
+
describe "#add_default_airbrake_notice_parameters" do
|
106
|
+
# Must defined as method or it won"t run twice
|
110
107
|
def add_parameters(params = new_parameters)
|
111
108
|
instance.add_default_airbrake_notice_parameters(
|
112
109
|
params)
|
@@ -116,94 +113,95 @@ describe ExecuteWithRescueWithAirbrake::Adapters::AirbrakeAdapter do
|
|
116
113
|
|
117
114
|
before do
|
118
115
|
# Return the options only
|
119
|
-
allow(Airbrake).
|
116
|
+
allow(Airbrake).
|
117
|
+
to receive(:notify_or_ignore) { |*args| args.last }
|
120
118
|
end
|
121
119
|
let(:options_hash) { notify_or_raise }
|
122
120
|
let(:parameters_hash) { options_hash[option_key] }
|
123
121
|
|
124
122
|
subject { options_hash }
|
125
123
|
|
126
|
-
context
|
124
|
+
context "when its not called" do
|
127
125
|
its(:keys) { should_not include(option_key) }
|
128
126
|
end
|
129
|
-
context
|
130
|
-
let(:new_parameters) {
|
127
|
+
context "when its called with non hash" do
|
128
|
+
let(:new_parameters) { [] }
|
131
129
|
let(:expected_error_class) do
|
132
130
|
described_class::Errors::InvalidParameters
|
133
131
|
end
|
134
132
|
|
135
133
|
specify do
|
136
|
-
expect { add_parameters }
|
137
|
-
|
134
|
+
expect { add_parameters }.
|
135
|
+
to raise_error(expected_error_class)
|
138
136
|
end
|
139
137
|
end
|
140
|
-
context
|
138
|
+
context "when its called with empty hash" do
|
141
139
|
let(:new_parameters) { Hash.new }
|
142
140
|
before { add_parameters }
|
143
141
|
|
144
142
|
its(:keys) { should_not include(option_key) }
|
145
143
|
end
|
146
144
|
|
147
|
-
context
|
145
|
+
context "when its called with non-empty hash" do
|
148
146
|
subject { parameters_hash }
|
149
147
|
|
150
148
|
let(:new_parameters) { {foo: :bar} }
|
151
149
|
|
152
|
-
context
|
150
|
+
context "and there is no conflicting key" do
|
153
151
|
before { add_parameters }
|
154
152
|
|
155
153
|
it { should include(new_parameters) }
|
156
154
|
end
|
157
155
|
|
158
|
-
context
|
156
|
+
context "and there is a conflicting key" do
|
159
157
|
before { add_parameters }
|
160
158
|
let(:expected_error_class) do
|
161
159
|
described_class::Errors::ParameterKeyConflict
|
162
160
|
end
|
163
161
|
|
164
|
-
context
|
162
|
+
context "in symbol" do
|
165
163
|
specify do
|
166
|
-
expect { add_parameters }
|
167
|
-
|
164
|
+
expect { add_parameters }.
|
165
|
+
to raise_error(expected_error_class)
|
168
166
|
end
|
169
167
|
end
|
170
|
-
context
|
168
|
+
context "in string" do
|
171
169
|
specify do
|
172
|
-
expect { add_parameters(new_parameters.stringify_keys) }
|
173
|
-
|
170
|
+
expect { add_parameters(new_parameters.stringify_keys) }.
|
171
|
+
to raise_error(expected_error_class)
|
174
172
|
end
|
175
173
|
end
|
176
174
|
end
|
177
175
|
end
|
178
176
|
end
|
179
177
|
|
180
|
-
|
181
|
-
|
182
|
-
context 'when nothing is set' do
|
178
|
+
describe "options passed" do
|
179
|
+
context "when nothing is set" do
|
183
180
|
specify do
|
184
|
-
expect(Airbrake)
|
185
|
-
|
186
|
-
|
181
|
+
expect(Airbrake).
|
182
|
+
to receive(:notify_or_ignore).
|
183
|
+
with(kind_of(StandardError), {})
|
187
184
|
|
188
185
|
notify_or_raise
|
189
186
|
end
|
190
187
|
end
|
191
|
-
context
|
188
|
+
context "when all things are set" do
|
192
189
|
let!(:custom_error_class) { Class.new(StandardError) }
|
193
|
-
let!(:custom_error_message) {
|
190
|
+
let!(:custom_error_message) { "hi" }
|
194
191
|
let!(:custom_parameters) { {foo: :bar}.stringify_keys }
|
195
192
|
before { instance.set_default_airbrake_notice_error_class(custom_error_class) }
|
196
193
|
before { instance.set_default_airbrake_notice_error_message(custom_error_message) }
|
197
194
|
before { instance.add_default_airbrake_notice_parameters(custom_parameters) }
|
198
195
|
|
199
196
|
specify do
|
200
|
-
expect(Airbrake)
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
197
|
+
expect(Airbrake).
|
198
|
+
to receive(:notify_or_ignore).
|
199
|
+
with(
|
200
|
+
kind_of(StandardError),
|
201
|
+
error_class: custom_error_class,
|
202
|
+
error_message: custom_error_message,
|
203
|
+
parameters: custom_parameters.symbolize_keys,
|
204
|
+
)
|
207
205
|
|
208
206
|
notify_or_raise
|
209
207
|
end
|