Commit 8a7183a37003b246f6aaf331b5a021662f85a9e5

Authored by Cyril Mougel
1 parent cf166826
Exists in master and in 1 other branch production

Extract completly the ErrorReport class

Extract all concern about this call to his own class and move test to
this class
app/models/app.rb
... ... @@ -42,44 +42,6 @@ class App
42 42 accepts_nested_attributes_for :notification_service, :allow_destroy => true,
43 43 :reject_if => proc { |attrs| !NotificationService.subclasses.map(&:to_s).include?(attrs[:type].to_s) }
44 44  
45   - # Processes a new error report.
46   - #
47   - # Accepts either XML or a hash with the following attributes:
48   - #
49   - # * <tt>:error_class</tt> - the class of error
50   - # * <tt>:message</tt> - the error message
51   - # * <tt>:backtrace</tt> - an array of stack trace lines
52   - #
53   - # * <tt>:request</tt> - a hash of values describing the request
54   - # * <tt>:server_environment</tt> - a hash of values describing the server environment
55   - #
56   - # * <tt>:api_key</tt> - the API key with which the error was reported
57   - # * <tt>:notifier</tt> - information to identify the source of the error report
58   - #
59   - def self.report_error!(*args)
60   - report = ErrorReport.new(*args)
61   - report.generate_notice!
62   - end
63   -
64   -
65   - # Processes a new error report.
66   - #
67   - # Accepts a hash with the following attributes:
68   - #
69   - # * <tt>:error_class</tt> - the class of error
70   - # * <tt>:message</tt> - the error message
71   - # * <tt>:backtrace</tt> - an array of stack trace lines
72   - #
73   - # * <tt>:request</tt> - a hash of values describing the request
74   - # * <tt>:server_environment</tt> - a hash of values describing the server environment
75   - #
76   - # * <tt>:notifier</tt> - information to identify the source of the error report
77   - #
78   - def report_error!(hash)
79   - report = ErrorReport.new(hash.merge(:api_key => api_key))
80   - report.generate_notice!
81   - end
82   -
83 45 def find_or_create_err!(attrs)
84 46 Err.where(
85 47 :fingerprint => attrs[:fingerprint]
... ...
app/models/error_report.rb
1 1 require 'digest/sha1'
2 2 require 'hoptoad_notifier'
3 3  
  4 +##
  5 +# Processes a new error report.
  6 +#
  7 +# Accepts a hash with the following attributes:
  8 +#
  9 +# * <tt>:error_class</tt> - the class of error
  10 +# * <tt>:message</tt> - the error message
  11 +# * <tt>:backtrace</tt> - an array of stack trace lines
  12 +#
  13 +# * <tt>:request</tt> - a hash of values describing the request
  14 +# * <tt>:server_environment</tt> - a hash of values describing the server environment
  15 +#
  16 +# * <tt>:notifier</tt> - information to identify the source of the error report
  17 +#
4 18 class ErrorReport
5 19 attr_reader :error_class, :message, :request, :server_environment, :api_key, :notifier, :user_attributes, :framework
6 20  
... ...
lib/tasks/errbit/demo.rake
... ... @@ -42,15 +42,15 @@ namespace :errbit do
42 42  
43 43 errors.each do |error_template|
44 44 rand(34).times do
45   -
46   - error_report = error_template.reverse_merge({
  45 + ErrorReport.new(error_template.reverse_merge({
  46 + :api_key => app.api_key,
47 47 :error_class => "StandardError",
48 48 :message => "Oops. Something went wrong!",
49 49 :backtrace => random_backtrace,
50 50 :request => {
51   - 'component' => 'main',
52   - 'action' => 'error'
53   - },
  51 + 'component' => 'main',
  52 + 'action' => 'error'
  53 + },
54 54 :server_environment => {'environment-name' => Rails.env.to_s},
55 55 :notifier => {:name => "seeds.rb"},
56 56 :app_user => {
... ... @@ -59,9 +59,7 @@ namespace :errbit do
59 59 :name => "John Smith",
60 60 :url => "http://www.example.com/users/jsmith"
61 61 }
62   - })
63   -
64   - app.report_error!(error_report)
  62 + })).generate_notice!
65 63 end
66 64 end
67 65  
... ...
spec/controllers/notices_controller_spec.rb
... ... @@ -77,21 +77,6 @@ describe NoticesController do
77 77 expect(response.status).to eq 422
78 78 end
79 79 end
80   -
81   - # Not relevant here, Nee to be test on App.report_error! test
82   - it "sends a notification email", :pending => true do
83   - App.should_receive(:report_error!).with(xml).and_return(notice)
84   - request.should_receive(:raw_post).and_return(xml)
85   - post :create, :format => :xml
86   - response.should be_success
87   - response.body.should match(%r{<id[^>]*>#{notice.id}</id>})
88   - response.body.should match(%r{<url[^>]*>(.+)#{locate_path(notice.id)}</url>})
89   - email = ActionMailer::Base.deliveries.last
90   - email.to.should include(app.watchers.first.email)
91   - email.subject.should include(notice.message.truncate(50))
92   - email.subject.should include("[#{app.name}]")
93   - email.subject.should include("[#{notice.environment_name}]")
94   - end
95 80 end
96 81  
97 82 describe "GET /locate/:id" do
... ...
spec/models/app_spec.rb
... ... @@ -187,28 +187,6 @@ describe App do
187 187 end
188 188  
189 189  
190   - context '#report_error!', :pending => true do
191   - # method delete. test need to be on spec/models/error_report
192   - before do
193   - @xml = Rails.root.join('spec','fixtures','hoptoad_test_notice.xml').read
194   - @app = Fabricate(:app, :api_key => 'APIKEY')
195   - ErrorReport.any_instance.stub(:fingerprint).and_return('fingerprintdigest')
196   - end
197   -
198   - it "should handle params without 'request' section" do
199   - xml = Rails.root.join('spec','fixtures','hoptoad_test_notice_without_request_section.xml').read
200   - lambda { App.report_error!(xml) }.should_not raise_error
201   - end
202   -
203   - it "should handle params with only a single line of backtrace" do
204   - xml = Rails.root.join('spec','fixtures','hoptoad_test_notice_with_one_line_of_backtrace.xml').read
205   - lambda { @notice = App.report_error!(xml) }.should_not raise_error
206   - @notice.backtrace_lines.length.should == 1
207   - end
208   -
209   -
210   - end
211   -
212 190 describe ".find_by_api_key!" do
213 191 it 'return the app with api_key' do
214 192 app = Fabricate(:app)
... ...
spec/models/error_report_spec.rb
... ... @@ -97,6 +97,22 @@ describe ErrorReport do
97 97 }.from(true).to(false)
98 98 end
99 99  
  100 + context "with notification service configured" do
  101 + before do
  102 + app.notify_on_errs = true
  103 + app.watchers.build(:email => 'foo@example.com')
  104 + app.save
  105 + end
  106 + it 'send email' do
  107 + notice = error_report.generate_notice!
  108 + email = ActionMailer::Base.deliveries.last
  109 + email.to.should include(app.watchers.first.email)
  110 + email.subject.should include(notice.message.truncate(50))
  111 + email.subject.should include("[#{app.name}]")
  112 + email.subject.should include("[#{notice.environment_name}]")
  113 + end
  114 + end
  115 +
100 116 context "with xml without request section" do
101 117 let(:xml){
102 118 Rails.root.join('spec','fixtures','hoptoad_test_notice_without_request_section.xml').read
... ... @@ -159,6 +175,5 @@ describe ErrorReport do
159 175 end
160 176 end
161 177  
162   -
163 178 end
164 179 end
... ...