Commit aef9896f211acdc2d967eaf287be82461204b54a
1 parent
6eb59b4e
Exists in
master
and in
1 other branch
Add some test to try report issue #470
Add some test with notice send with empty backtrace Add some test directly in the ErrorReport model
Showing
5 changed files
with
163 additions
and
7 deletions
Show diff stats
app/models/error_report.rb
... | ... | @@ -44,19 +44,30 @@ class ErrorReport |
44 | 44 | :user_attributes => user_attributes, |
45 | 45 | :framework => framework |
46 | 46 | ) |
47 | + error.notices << notice | |
48 | + notice | |
49 | + end | |
47 | 50 | |
48 | - err = app.find_or_create_err!( | |
51 | + ## | |
52 | + # Error associate to this error_report | |
53 | + # | |
54 | + # Can already exist or not | |
55 | + # | |
56 | + # @return [ Error ] | |
57 | + def error | |
58 | + @error ||= app.find_or_create_err!( | |
49 | 59 | :error_class => error_class, |
50 | 60 | :component => component, |
51 | 61 | :action => action, |
52 | 62 | :environment => rails_env, |
53 | - :fingerprint => fingerprint) | |
54 | - | |
55 | - err.notices << notice | |
56 | - notice | |
63 | + :fingerprint => fingerprint | |
64 | + ) | |
57 | 65 | end |
58 | 66 | |
59 | 67 | private |
68 | + | |
69 | + | |
70 | + | |
60 | 71 | def fingerprint_source |
61 | 72 | # Find the first backtrace line with a file and line number. |
62 | 73 | if line = backtrace.lines.detect {|l| l.number.present? && l.file.present? } | ... | ... |
spec/controllers/notices_controller_spec.rb
... | ... | @@ -24,13 +24,13 @@ describe NoticesController do |
24 | 24 | response.body.should match(%r{<url[^>]*>(.+)#{locate_path(@notice.id)}</url>}) |
25 | 25 | end |
26 | 26 | |
27 | - it "should trnasform xml <va> tags to hashes correctly" do | |
27 | + it "should transform xml <va> tags to hashes correctly" do | |
28 | 28 | App.should_receive(:report_error!).with(@xml).and_return(@notice) |
29 | 29 | request.should_receive(:raw_post).and_return(@xml) |
30 | 30 | post :create, :format => :xml |
31 | 31 | |
32 | 32 | # XML: <var key="SCRIPT_NAME"/> |
33 | - @notice.env_vars.should have_key('SCRIPT_NAME') | |
33 | + @notice.env_vars.should have_key('SCRIPT_NAME') | |
34 | 34 | @notice.env_vars['SCRIPT_NAME'].should be_nil # blank ends up nil |
35 | 35 | |
36 | 36 | # XML representation: | ... | ... |
spec/fixtures/hoptoad_test_notice_without_line_of_backtrace.xml
0 → 100644
... | ... | @@ -0,0 +1,73 @@ |
1 | +<?xml version="1.0" encoding="UTF-8"?> | |
2 | +<notice version="2.0"> | |
3 | + <api-key>APIKEY</api-key> | |
4 | + <notifier> | |
5 | + <name>Hoptoad Notifier</name> | |
6 | + <version>2.3.2</version> | |
7 | + <url>http://hoptoadapp.com</url> | |
8 | + </notifier> | |
9 | + <error> | |
10 | + <class>HoptoadTestingException</class> | |
11 | + <message>HoptoadTestingException: Testing hoptoad via "rake hoptoad:test". If you can see this, it works.</message> | |
12 | + <backtrace></backtrace> | |
13 | + </error> | |
14 | + <request> | |
15 | + <url>http://example.org/verify</url> | |
16 | + <component>application</component> | |
17 | + <action>verify</action> | |
18 | + <params> | |
19 | + <var key="action">verify</var> | |
20 | + <var key="controller">application</var> | |
21 | + </params> | |
22 | + <cgi-data> | |
23 | + <var key="rack.session"/> | |
24 | + <var key="action_dispatch.request.formats">text/html</var> | |
25 | + <var key="action_dispatch.request.parameters"> | |
26 | + <var key="action">verify</var> | |
27 | + <var key="controller">application</var> | |
28 | + </var> | |
29 | + <var key="SERVER_NAME">example.org</var> | |
30 | + <var key="rack.url_scheme">http</var> | |
31 | + <var key="action_dispatch.remote_ip"/> | |
32 | + <var key="CONTENT_LENGTH">0</var> | |
33 | + <var key="rack.errors">#<StringIO:0x103d9dec0></var> | |
34 | + <var key="action_dispatch.request.unsigned_session_cookie"/> | |
35 | + <var key="action_dispatch.request.query_parameters"/> | |
36 | + <var key="HTTPS">off</var> | |
37 | + <var key="rack.run_once">false</var> | |
38 | + <var key="PATH_INFO">/verify</var> | |
39 | + <var key="action_dispatch.secret_token">994f235e3372684bc736dd11842b754d2ddcffc8c2958d33a29527c3217becd6655fa4653a318bc7c34131f9baf2acc0c424ed07e48e0e5e87c6cd34d711e985</var> | |
40 | + <var key="rack.version">11</var> | |
41 | + <var key="SCRIPT_NAME"/> | |
42 | + <var key="action_dispatch.request.path_parameters"> | |
43 | + <var key="action">verify</var> | |
44 | + <var key="controller">application</var> | |
45 | + </var> | |
46 | + <var key="rack.multithread">false</var> | |
47 | + <var key="action_dispatch.parameter_filter">password</var> | |
48 | + <var key="action_dispatch.cookies"/> | |
49 | + <var key="action_dispatch.request.request_parameters"/> | |
50 | + <var key="rack.multiprocess">true</var> | |
51 | + <var key="rack.request.query_hash"/> | |
52 | + <var key="SERVER_PORT">80</var> | |
53 | + <var key="REQUEST_METHOD">GET</var> | |
54 | + <var key="action_controller.instance">#<ApplicationController:0x103d2f560></var> | |
55 | + <var key="rack.session.options"> | |
56 | + <var key="secure">false</var> | |
57 | + <var key="httponly">true</var> | |
58 | + <var key="path">/</var> | |
59 | + <var key="expire_after"/> | |
60 | + <var key="domain"/> | |
61 | + <var key="id"/> | |
62 | + </var> | |
63 | + <var key="rack.input">#<StringIO:0x103d9dc90></var> | |
64 | + <var key="action_dispatch.request.content_type"/> | |
65 | + <var key="rack.request.query_string"/> | |
66 | + <var key="QUERY_STRING"/> | |
67 | + </cgi-data> | |
68 | + </request> | |
69 | + <server-environment> | |
70 | + <project-root>/path/to/sample/project</project-root> | |
71 | + <environment-name>development</environment-name> | |
72 | + </server-environment> | |
73 | +</notice> | ... | ... |
... | ... | @@ -0,0 +1,37 @@ |
1 | +require 'spec_helper' | |
2 | + | |
3 | +describe ErrorReport do | |
4 | + context "with notice without line of backtrace" do | |
5 | + let(:xml){ | |
6 | + Rails.root.join('spec','fixtures','hoptoad_test_notice_with_one_line_of_backtrace.xml').read | |
7 | + } | |
8 | + | |
9 | + let(:error_report) { | |
10 | + ErrorReport.new(xml) | |
11 | + } | |
12 | + | |
13 | + let(:app) { | |
14 | + Fabricate( | |
15 | + :app, | |
16 | + :api_key => 'APIKEY' | |
17 | + ) | |
18 | + } | |
19 | + | |
20 | + describe "#backtrace" do | |
21 | + | |
22 | + it 'should have valid backtrace' do | |
23 | + error_report.backtrace.should be_valid | |
24 | + end | |
25 | + end | |
26 | + | |
27 | + context "#generate_notice!" do | |
28 | + it "save a notice" do | |
29 | + expect { | |
30 | + error_report.generate_notice! | |
31 | + }.to change { | |
32 | + app.reload.problems.count | |
33 | + }.by(1) | |
34 | + end | |
35 | + end | |
36 | + end | |
37 | +end | ... | ... |
... | ... | @@ -0,0 +1,35 @@ |
1 | +require 'spec_helper' | |
2 | + | |
3 | +describe "Notices management" do | |
4 | + | |
5 | + let(:errbit_app) { Fabricate(:app, | |
6 | + :api_key => 'APIKEY') } | |
7 | + | |
8 | + describe "create a new notice" do | |
9 | + context "with valide notice" do | |
10 | + let(:xml) { Rails.root.join('spec','fixtures','hoptoad_test_notice.xml').read } | |
11 | + it 'save a new notice' do | |
12 | + expect { | |
13 | + post '/notifier_api/v2/notices', :data => xml | |
14 | + expect(response).to be_success | |
15 | + }.to change { | |
16 | + errbit_app.problems.count | |
17 | + }.by(1) | |
18 | + end | |
19 | + end | |
20 | + | |
21 | + context "with notice with empty backtrace" do | |
22 | + let(:xml) { Rails.root.join('spec','fixtures','hoptoad_test_notice_without_line_of_backtrace.xml').read } | |
23 | + it 'save a new notice' do | |
24 | + expect { | |
25 | + post '/notifier_api/v2/notices', :data => xml | |
26 | + expect(response).to be_success | |
27 | + }.to change { | |
28 | + errbit_app.problems.count | |
29 | + }.by(1) | |
30 | + end | |
31 | + end | |
32 | + | |
33 | + end | |
34 | + | |
35 | +end | ... | ... |