exception_notification 3.0.1 → 4.0.0.rc1

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 (55) hide show
  1. data/.gitignore +2 -0
  2. data/.travis.yml +9 -0
  3. data/Appraisals +11 -0
  4. data/CHANGELOG.rdoc +21 -0
  5. data/Gemfile +1 -1
  6. data/Gemfile.lock +49 -7
  7. data/README.md +417 -184
  8. data/Rakefile +4 -2
  9. data/examples/sinatra/Gemfile +8 -0
  10. data/examples/sinatra/Gemfile.lock +95 -0
  11. data/examples/sinatra/Procfile +2 -0
  12. data/examples/sinatra/README.md +11 -0
  13. data/examples/sinatra/config.ru +3 -0
  14. data/examples/sinatra/sinatra_app.rb +28 -0
  15. data/exception_notification.gemspec +10 -4
  16. data/gemfiles/rails3_1.gemfile +7 -0
  17. data/gemfiles/rails3_2.gemfile +7 -0
  18. data/gemfiles/rails4_0.gemfile +7 -0
  19. data/lib/exception_notification.rb +10 -0
  20. data/lib/exception_notification/rack.rb +45 -0
  21. data/lib/exception_notification/rails.rb +8 -0
  22. data/lib/exception_notification/resque.rb +24 -0
  23. data/lib/exception_notification/sidekiq.rb +22 -0
  24. data/lib/exception_notifier.rb +89 -61
  25. data/lib/exception_notifier/campfire_notifier.rb +2 -7
  26. data/lib/exception_notifier/email_notifier.rb +181 -0
  27. data/lib/exception_notifier/notifier.rb +9 -178
  28. data/lib/exception_notifier/views/exception_notifier/_backtrace.html.erb +3 -1
  29. data/lib/exception_notifier/views/exception_notifier/_data.html.erb +6 -1
  30. data/lib/exception_notifier/views/exception_notifier/_environment.html.erb +16 -6
  31. data/lib/exception_notifier/views/exception_notifier/_environment.text.erb +1 -1
  32. data/lib/exception_notifier/views/exception_notifier/_request.html.erb +24 -5
  33. data/lib/exception_notifier/views/exception_notifier/_request.text.erb +2 -0
  34. data/lib/exception_notifier/views/exception_notifier/_session.html.erb +10 -2
  35. data/lib/exception_notifier/views/exception_notifier/_session.text.erb +1 -1
  36. data/lib/exception_notifier/views/exception_notifier/_title.html.erb +3 -3
  37. data/lib/exception_notifier/views/exception_notifier/background_exception_notification.html.erb +38 -11
  38. data/lib/exception_notifier/views/exception_notifier/background_exception_notification.text.erb +0 -1
  39. data/lib/exception_notifier/views/exception_notifier/exception_notification.html.erb +39 -21
  40. data/lib/exception_notifier/views/exception_notifier/exception_notification.text.erb +0 -1
  41. data/lib/exception_notifier/webhook_notifier.rb +21 -0
  42. data/lib/generators/exception_notification/install_generator.rb +15 -0
  43. data/lib/generators/exception_notification/templates/exception_notification.rb +47 -0
  44. data/test/dummy/Gemfile +2 -1
  45. data/test/dummy/Gemfile.lock +79 -78
  46. data/test/dummy/config/environment.rb +9 -7
  47. data/test/dummy/test/functional/posts_controller_test.rb +22 -37
  48. data/test/{campfire_test.rb → exception_notifier/campfire_notifier_test.rb} +4 -4
  49. data/test/exception_notifier/email_notifier_test.rb +144 -0
  50. data/test/exception_notifier/webhook_notifier_test.rb +41 -0
  51. data/test/exception_notifier_test.rb +101 -0
  52. data/test/test_helper.rb +4 -1
  53. metadata +136 -18
  54. data/test/background_exception_notification_test.rb +0 -82
  55. data/test/exception_notification_test.rb +0 -73
@@ -1,13 +1,15 @@
1
1
  # Load the rails application
2
2
  require File.expand_path('../application', __FILE__)
3
3
 
4
- Dummy::Application.config.middleware.use ExceptionNotifier,
5
- :email_prefix => "[Dummy ERROR] ",
6
- :sender_address => %{"Dummy Notifier" <dummynotifier@example.com>},
7
- :exception_recipients => %w{dummyexceptions@example.com},
8
- :email_headers => { "X-Custom-Header" => "foobar" },
9
- :sections => ['new_section', 'request', 'session', 'environment', 'backtrace'],
10
- :background_sections => %w(new_bkg_section) + ExceptionNotifier::Notifier.default_background_sections
4
+ Dummy::Application.config.middleware.use ExceptionNotification::Rack,
5
+ :email => {
6
+ :email_prefix => "[Dummy ERROR] ",
7
+ :sender_address => %{"Dummy Notifier" <dummynotifier@example.com>},
8
+ :exception_recipients => %w{dummyexceptions@example.com},
9
+ :email_headers => { "X-Custom-Header" => "foobar" },
10
+ :sections => ['new_section', 'request', 'session', 'environment', 'backtrace'],
11
+ :background_sections => %w(new_bkg_section backtrace data)
12
+ }
11
13
 
12
14
  # Initialize the rails application
13
15
  Dummy::Application.initialize!
@@ -2,12 +2,14 @@ require 'test_helper'
2
2
 
3
3
  class PostsControllerTest < ActionController::TestCase
4
4
  setup do
5
+ Time.stubs(:current).returns('Sat, 20 Apr 2013 20:58:55 UTC +00:00')
6
+ @email_notifier = ExceptionNotifier.registered_exception_notifier(:email)
5
7
  begin
6
8
  @post = posts(:one)
7
9
  post :create, :post => @post.attributes
8
10
  rescue => e
9
11
  @exception = e
10
- @mail = ExceptionNotifier::Notifier.exception_notification(request.env, @exception, {:data => {:message => 'My Custom Message'}})
12
+ @mail = @email_notifier.create_email(@exception, {:env => request.env, :data => {:message => 'My Custom Message'}})
11
13
  end
12
14
  end
13
15
 
@@ -72,8 +74,8 @@ class PostsControllerTest < ActionController::TestCase
72
74
  get :show, :id => @post.to_param + "10"
73
75
  rescue => e
74
76
  @ignored_exception = e
75
- unless ExceptionNotifier.default_ignore_exceptions.include?(@ignored_exception.class.name)
76
- @ignored_mail = ExceptionNotifier::Notifier.exception_notification(request.env, @ignored_exception)
77
+ unless ExceptionNotifier.ignored_exceptions.include?(@ignored_exception.class.name)
78
+ @ignored_mail = @email_notifier.create_email(@ignored_exception, {:env => request.env})
77
79
  end
78
80
  end
79
81
 
@@ -87,14 +89,14 @@ class PostsControllerTest < ActionController::TestCase
87
89
  @post = posts(:one)
88
90
  post :create, :post => @post.attributes
89
91
  rescue => e
90
- @secured_mail = ExceptionNotifier::Notifier.exception_notification(request.env, e)
92
+ @secured_mail = @email_notifier.create_email(e, {:env => request.env})
91
93
  end
92
94
 
93
95
  assert request.ssl?
94
96
  assert @secured_mail.encoded.include? "* session id: [FILTERED]\r\n *"
95
97
  end
96
98
 
97
- test "should ignore exception if from unwanted cralwer" do
99
+ test "should ignore exception if from unwanted crawler" do
98
100
  request.env['HTTP_USER_AGENT'] = "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
99
101
  begin
100
102
  @post = posts(:one)
@@ -105,27 +107,8 @@ class PostsControllerTest < ActionController::TestCase
105
107
  custom_env['exception_notifier.options'] ||= {}
106
108
  custom_env['exception_notifier.options'].merge!(:ignore_crawlers => %w(Googlebot))
107
109
  ignore_array = custom_env['exception_notifier.options'][:ignore_crawlers]
108
- unless ExceptionNotifier.new(Dummy::Application, custom_env['exception_notifier.options']).send(:from_crawler, ignore_array, custom_env['HTTP_USER_AGENT'])
109
- @ignored_mail = ExceptionNotifier::Notifier.exception_notification(custom_env, @exception)
110
- end
111
- end
112
-
113
- assert_nil @ignored_mail
114
- end
115
-
116
- test "should ignore exception if satisfies conditional ignore" do
117
- request.env['IGNOREME'] = "IGNOREME"
118
- begin
119
- @post = posts(:one)
120
- post :create, :post => @post.attributes
121
- rescue => e
122
- @exception = e
123
- custom_env = request.env
124
- custom_env['exception_notifier.options'] ||= {}
125
- ignore_cond = {:ignore_if => lambda {|env, e| (env['IGNOREME'] == 'IGNOREME') && (e.message =~ /undefined method/)}}
126
- custom_env['exception_notifier.options'].merge!(ignore_cond)
127
- unless ExceptionNotifier.new(Dummy::Application, custom_env['exception_notifier.options']).send(:conditionally_ignored, ignore_cond[:ignore_if], custom_env, @exception)
128
- @ignored_mail = ExceptionNotifier::Notifier.exception_notification(custom_env, @exception)
110
+ unless ExceptionNotification::Rack.new(Dummy::Application, custom_env['exception_notifier.options']).send(:from_crawler, custom_env, ignore_array)
111
+ @ignored_mail = @email_notifier.create_email(@exception, {:env => custom_env})
129
112
  end
130
113
  end
131
114
 
@@ -141,7 +124,7 @@ class PostsControllerTest < ActionController::TestCase
141
124
  custom_env = request.env
142
125
  custom_env['exception_notifier.options'] ||= {}
143
126
  custom_env['exception_notifier.options'].merge!({:email_format => :html})
144
- @mail = ExceptionNotifier::Notifier.exception_notification(custom_env, @exception)
127
+ @mail = @email_notifier.create_email(@exception, {:env => custom_env})
145
128
  end
146
129
 
147
130
  assert @mail.content_type.include? "multipart/alternative"
@@ -151,13 +134,13 @@ end
151
134
  class PostsControllerTestWithoutVerboseSubject < ActionController::TestCase
152
135
  tests PostsController
153
136
  setup do
154
- ExceptionNotifier::Notifier.default_verbose_subject = false
137
+ @email_notifier = ExceptionNotifier::EmailNotifier.new(:verbose_subject => false)
155
138
  begin
156
139
  @post = posts(:one)
157
140
  post :create, :post => @post.attributes
158
141
  rescue => e
159
142
  @exception = e
160
- @mail = ExceptionNotifier::Notifier.exception_notification(request.env, @exception)
143
+ @mail = @email_notifier.create_email(@exception, {:env => request.env})
161
144
  end
162
145
  end
163
146
 
@@ -169,17 +152,17 @@ end
169
152
  class PostsControllerTestWithSmtpSettings < ActionController::TestCase
170
153
  tests PostsController
171
154
  setup do
172
- ExceptionNotifier::Notifier.default_smtp_settings = {
155
+ @email_notifier = ExceptionNotifier::EmailNotifier.new(:smtp_settings => {
173
156
  :user_name => "Dummy user_name",
174
157
  :password => "Dummy password"
175
- }
176
-
158
+ })
159
+
177
160
  begin
178
161
  @post = posts(:one)
179
162
  post :create, :post => @post.attributes
180
163
  rescue => e
181
164
  @exception = e
182
- @mail = ExceptionNotifier::Notifier.exception_notification(request.env, @exception)
165
+ @mail = @email_notifier.create_email(@exception, {:env => request.env})
183
166
  end
184
167
  end
185
168
 
@@ -187,9 +170,9 @@ class PostsControllerTestWithSmtpSettings < ActionController::TestCase
187
170
  assert_equal "Dummy user_name", @mail.delivery_method.settings[:user_name]
188
171
  assert_equal "Dummy password", @mail.delivery_method.settings[:password]
189
172
  end
190
-
173
+
191
174
  test "should have overridden smtp settings with background notification" do
192
- @mail = ExceptionNotifier::Notifier.background_exception_notification(@exception)
175
+ @mail = @email_notifier.create_email(@exception)
193
176
  assert_equal "Dummy user_name", @mail.delivery_method.settings[:user_name]
194
177
  assert_equal "Dummy password", @mail.delivery_method.settings[:password]
195
178
  end
@@ -198,6 +181,7 @@ end
198
181
  class PostsControllerTestBadRequestData < ActionController::TestCase
199
182
  tests PostsController
200
183
  setup do
184
+ @email_notifier = ExceptionNotifier.registered_exception_notifier(:email)
201
185
  begin
202
186
  # This might seem synthetic, but the point is that the data used by
203
187
  # ExceptionNotification could be rendered "invalid" by e.g. a badly
@@ -213,7 +197,7 @@ class PostsControllerTestBadRequestData < ActionController::TestCase
213
197
  post :create, :post => @post.attributes
214
198
  rescue => e
215
199
  @exception = e
216
- @mail = ExceptionNotifier::Notifier.exception_notification(request.env, @exception)
200
+ @mail = @email_notifier.create_email(@exception, {:env => request.env})
217
201
  end
218
202
  end
219
203
 
@@ -225,11 +209,12 @@ end
225
209
  class PostsControllerTestBackgroundNotification < ActionController::TestCase
226
210
  tests PostsController
227
211
  setup do
212
+ @email_notifier = ExceptionNotifier.registered_exception_notifier(:email)
228
213
  begin
229
214
  @post = posts(:one)
230
215
  post :create, :post => @post.attributes
231
216
  rescue => exception
232
- @mail = ExceptionNotifier::Notifier.background_exception_notification(exception)
217
+ @mail = @email_notifier.create_email(exception)
233
218
  end
234
219
  end
235
220
 
@@ -6,8 +6,8 @@ class CampfireNotifierTest < ActiveSupport::TestCase
6
6
  test "should send campfire notification if properly configured" do
7
7
  ExceptionNotifier::CampfireNotifier.stubs(:new).returns(Object.new)
8
8
  campfire = ExceptionNotifier::CampfireNotifier.new({:subdomain => 'test', :token => 'test_token', :room_name => 'test_room'})
9
- campfire.stubs(:exception_notification).returns(fake_notification)
10
- notif = campfire.exception_notification(fake_exception)
9
+ campfire.stubs(:call).returns(fake_notification)
10
+ notif = campfire.call(fake_exception)
11
11
 
12
12
  assert !notif[:message].empty?
13
13
  assert_equal notif[:message][:type], 'PasteMessage'
@@ -22,7 +22,7 @@ class CampfireNotifierTest < ActiveSupport::TestCase
22
22
  campfire = ExceptionNotifier::CampfireNotifier.new(wrong_params)
23
23
 
24
24
  assert_nil campfire.room
25
- assert_nil campfire.exception_notification(fake_exception)
25
+ assert_nil campfire.call(fake_exception)
26
26
  end
27
27
 
28
28
  test "should not send campfire notification if config attr missing" do
@@ -31,7 +31,7 @@ class CampfireNotifierTest < ActiveSupport::TestCase
31
31
  campfire = ExceptionNotifier::CampfireNotifier.new(wrong_params)
32
32
 
33
33
  assert_nil campfire.room
34
- assert_nil campfire.exception_notification(fake_exception)
34
+ assert_nil campfire.call(fake_exception)
35
35
  end
36
36
 
37
37
  private
@@ -0,0 +1,144 @@
1
+ require 'test_helper'
2
+
3
+ class EmailNotifierTest < ActiveSupport::TestCase
4
+ setup do
5
+ Time.stubs(:current).returns('Sat, 20 Apr 2013 20:58:55 UTC +00:00')
6
+ @email_notifier = ExceptionNotifier.registered_exception_notifier(:email)
7
+ begin
8
+ 1/0
9
+ rescue => e
10
+ @exception = e
11
+ @mail = @email_notifier.create_email(@exception,
12
+ :data => {:job => 'DivideWorkerJob', :payload => '1/0', :message => 'My Custom Message'})
13
+ end
14
+ end
15
+
16
+ test "should have default sender address overridden" do
17
+ assert @email_notifier.sender_address == %("Dummy Notifier" <dummynotifier@example.com>)
18
+ end
19
+
20
+ test "should have default exception recipients overridden" do
21
+ assert @email_notifier.exception_recipients == %w(dummyexceptions@example.com)
22
+ end
23
+
24
+ test "should have default email prefix overridden" do
25
+ assert @email_notifier.email_prefix == "[Dummy ERROR] "
26
+ end
27
+
28
+ test "should have default email headers overridden" do
29
+ assert @email_notifier.email_headers == { "X-Custom-Header" => "foobar"}
30
+ end
31
+
32
+ test "should have default sections overridden" do
33
+ for section in %w(new_section request session environment backtrace)
34
+ assert @email_notifier.sections.include? section
35
+ end
36
+ end
37
+
38
+ test "should have default background sections" do
39
+ for section in %w(new_bkg_section backtrace data)
40
+ assert @email_notifier.background_sections.include? section
41
+ end
42
+ end
43
+
44
+ test "should have email format by default" do
45
+ assert @email_notifier.email_format == :text
46
+ end
47
+
48
+ test "should have verbose subject by default" do
49
+ assert @email_notifier.verbose_subject == true
50
+ end
51
+
52
+ test "should have normalize_subject false by default" do
53
+ assert @email_notifier.normalize_subject == false
54
+ end
55
+
56
+ test "should have delivery_method nil by default" do
57
+ assert @email_notifier.delivery_method == nil
58
+ end
59
+
60
+ test "should have mailer_settings nil by default" do
61
+ assert @email_notifier.mailer_settings == nil
62
+ end
63
+
64
+ test "should have mailer_parent by default" do
65
+ assert @email_notifier.mailer_parent == 'ActionMailer::Base'
66
+ end
67
+
68
+ test "should have template_path by default" do
69
+ assert @email_notifier.template_path == 'exception_notifier'
70
+ end
71
+
72
+ test "should normalize multiple digits into one N" do
73
+ assert_equal 'N foo N bar N baz N',
74
+ ExceptionNotifier::EmailNotifier.normalize_digits('1 foo 12 bar 123 baz 1234')
75
+ end
76
+
77
+ test "mail should be plain text and UTF-8 enconded by default" do
78
+ assert @mail.content_type == "text/plain; charset=UTF-8"
79
+ end
80
+
81
+ test "should have raised an exception" do
82
+ assert_not_nil @exception
83
+ end
84
+
85
+ test "should have generated a notification email" do
86
+ assert_not_nil @mail
87
+ end
88
+
89
+ test "mail should have a from address set" do
90
+ assert @mail.from == ["dummynotifier@example.com"]
91
+ end
92
+
93
+ test "mail should have a to address set" do
94
+ assert @mail.to == ["dummyexceptions@example.com"]
95
+ end
96
+
97
+ test "mail should have a descriptive subject" do
98
+ assert @mail.subject == "[Dummy ERROR] (ZeroDivisionError) \"divided by 0\""
99
+ end
100
+
101
+ test "mail should say exception was raised in background at show timestamp" do
102
+ assert @mail.encoded.include? "A ZeroDivisionError occurred in background at #{Time.current}"
103
+ end
104
+
105
+ test "mail should prefix exception class with 'an' instead of 'a' when it starts with a vowel" do
106
+ begin
107
+ raise ActiveRecord::RecordNotFound
108
+ rescue => e
109
+ @vowel_exception = e
110
+ @vowel_mail = @email_notifier.create_email(@vowel_exception)
111
+ end
112
+
113
+ assert @vowel_mail.encoded.include? "An ActiveRecord::RecordNotFound occurred in background at #{Time.current}"
114
+ end
115
+
116
+ test "mail should contain backtrace in body" do
117
+ assert @mail.encoded.include?("test/exception_notifier/email_notifier_test.rb:8"), "\n#{@mail.inspect}"
118
+ end
119
+
120
+ test "mail should contain data in body" do
121
+ assert @mail.encoded.include? '* data:'
122
+ assert @mail.encoded.include? ':payload=>"1/0"'
123
+ assert @mail.encoded.include? ':job=>"DivideWorkerJob"'
124
+ assert @mail.encoded.include? "My Custom Message"
125
+ end
126
+
127
+ test "mail should not contain any attachments" do
128
+ assert @mail.attachments == []
129
+ end
130
+
131
+ test "should not send notification if one of ignored exceptions" do
132
+ begin
133
+ raise ActiveRecord::RecordNotFound
134
+ rescue => e
135
+ @ignored_exception = e
136
+ unless ExceptionNotifier.ignored_exceptions.include?(@ignored_exception.class.name)
137
+ @ignored_mail = @email_notifier.create_email(@ignored_exception)
138
+ end
139
+ end
140
+
141
+ assert @ignored_exception.class.inspect == "ActiveRecord::RecordNotFound"
142
+ assert_nil @ignored_mail
143
+ end
144
+ end
@@ -0,0 +1,41 @@
1
+ require 'test_helper'
2
+ require 'httparty'
3
+
4
+ class WebhookNotifierTest < ActiveSupport::TestCase
5
+
6
+ test "should send webhook notification if properly configured" do
7
+ ExceptionNotifier::WebhookNotifier.stubs(:new).returns(Object.new)
8
+ webhook = ExceptionNotifier::WebhookNotifier.new({:url => 'http://localhost:8000'})
9
+ webhook.stubs(:call).returns(fake_response)
10
+ response = webhook.call(fake_exception)
11
+
12
+ assert_not_nil response
13
+ assert_equal response[:status], 200
14
+ assert_equal response[:body][:exception][:error_class], "ZeroDivisionError"
15
+ assert response[:body][:exception][:message].include? "divided by 0"
16
+ assert response[:body][:exception][:backtrace].include? "/exception_notification/test/webhook_notifier_test.rb:48"
17
+ end
18
+
19
+ private
20
+
21
+ def fake_response
22
+ {
23
+ :status => 200,
24
+ :body => {
25
+ :exception => {
26
+ :error_class => 'ZeroDivisionError',
27
+ :message => 'divided by 0',
28
+ :backtrace => '/exception_notification/test/webhook_notifier_test.rb:48:in `/'
29
+ }
30
+ }
31
+ }
32
+ end
33
+
34
+ def fake_exception
35
+ exception = begin
36
+ 5/0
37
+ rescue Exception => e
38
+ e
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,101 @@
1
+ require 'test_helper'
2
+
3
+ class ExceptionNotifierTest < ActiveSupport::TestCase
4
+ test "should have default ignored exceptions" do
5
+ assert ExceptionNotifier.ignored_exceptions == ['ActiveRecord::RecordNotFound', 'AbstractController::ActionNotFound', 'ActionController::RoutingError']
6
+ end
7
+
8
+ test "should have email notifier registered" do
9
+ assert ExceptionNotifier.notifiers == [:email]
10
+ end
11
+
12
+ test "should have a valid email notifier" do
13
+ @email_notifier = ExceptionNotifier.registered_exception_notifier(:email)
14
+ assert_not_nil @email_notifier
15
+ assert @email_notifier.class == ExceptionNotifier::EmailNotifier
16
+ assert @email_notifier.respond_to?(:call)
17
+ end
18
+
19
+ test "should allow register/unregister another notifier" do
20
+ called = false
21
+ proc_notifier = lambda { |exception, options| called = true }
22
+ ExceptionNotifier.register_exception_notifier(:proc, proc_notifier)
23
+
24
+ assert ExceptionNotifier.notifiers.sort == [:email, :proc]
25
+
26
+ exception = StandardError.new
27
+ ExceptionNotifier.notify_exception(exception)
28
+ assert called == true
29
+
30
+ ExceptionNotifier.unregister_exception_notifier(:proc)
31
+ assert ExceptionNotifier.notifiers == [:email]
32
+ end
33
+
34
+ test "should allow select notifiers to send error to" do
35
+ notifier1_calls = 0
36
+ notifier1 = lambda { |exception, options| notifier1_calls += 1 }
37
+ ExceptionNotifier.register_exception_notifier(:notifier1, notifier1)
38
+
39
+ notifier2_calls = 0
40
+ notifier2 = lambda { |exception, options| notifier2_calls += 1 }
41
+ ExceptionNotifier.register_exception_notifier(:notifier2, notifier2)
42
+
43
+ assert ExceptionNotifier.notifiers.sort == [:email, :notifier1, :notifier2]
44
+
45
+ exception = StandardError.new
46
+ ExceptionNotifier.notify_exception(exception)
47
+ assert notifier1_calls == 1
48
+ assert notifier2_calls == 1
49
+
50
+ ExceptionNotifier.notify_exception(exception, {:notifiers => :notifier1})
51
+ assert notifier1_calls == 2
52
+ assert notifier2_calls == 1
53
+
54
+ ExceptionNotifier.notify_exception(exception, {:notifiers => :notifier2})
55
+ assert notifier1_calls == 2
56
+ assert notifier2_calls == 2
57
+
58
+ ExceptionNotifier.unregister_exception_notifier(:notifier1)
59
+ ExceptionNotifier.unregister_exception_notifier(:notifier2)
60
+ assert ExceptionNotifier.notifiers == [:email]
61
+ end
62
+
63
+ test "should ignore exception if satisfies conditional ignore" do
64
+ env = "production"
65
+ ExceptionNotifier.ignore_if do |exception, options|
66
+ env != "production"
67
+ end
68
+
69
+ notifier_calls = 0
70
+ test_notifier = lambda { |exception, options| notifier_calls += 1 }
71
+ ExceptionNotifier.register_exception_notifier(:test, test_notifier)
72
+
73
+ exception = StandardError.new
74
+
75
+ ExceptionNotifier.notify_exception(exception, {:notifiers => :test})
76
+ assert notifier_calls == 1
77
+
78
+ env = "development"
79
+ ExceptionNotifier.notify_exception(exception, {:notifiers => :test})
80
+ assert notifier_calls == 1
81
+
82
+ ExceptionNotifier.clear_ignore_conditions!
83
+ ExceptionNotifier.unregister_exception_notifier(:test)
84
+ end
85
+
86
+ test "should not send notification if one of ignored exceptions" do
87
+ notifier_calls = 0
88
+ test_notifier = lambda { |exception, options| notifier_calls += 1 }
89
+ ExceptionNotifier.register_exception_notifier(:test, test_notifier)
90
+
91
+ exception = StandardError.new
92
+
93
+ ExceptionNotifier.notify_exception(exception, {:notifiers => :test})
94
+ assert notifier_calls == 1
95
+
96
+ ExceptionNotifier.notify_exception(exception, {:notifiers => :test, :ignore_exceptions => 'StandardError' })
97
+ assert notifier_calls == 1
98
+
99
+ ExceptionNotifier.unregister_exception_notifier(:test)
100
+ end
101
+ end