aboutsummaryrefslogtreecommitdiffstats
path: root/spec/integration/errors_spec.rb
blob: ed0d7bfecd949f05c40d8d97989463c3491739bf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
# -*- coding: utf-8 -*-
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')

describe "When errors occur" do

    def set_consider_all_requests_local(value)
        @requests_local = Rails.application.config.consider_all_requests_local
        Rails.application.config.consider_all_requests_local = value
    end

    def restore_consider_all_requests_local
        Rails.application.config.consider_all_requests_local = @requests_local
    end

    before(:each) do
        # This should happen automatically before each test but doesn't with these integration
        # tests for some reason.
        ActionMailer::Base.deliveries = []
    end

    after(:each) do
        restore_consider_all_requests_local
    end

    context 'when considering all requests local (by default all in development)' do

        before(:each) { set_consider_all_requests_local(true) }

        it 'should show a full trace for general errors' do
            InfoRequest.stub!(:find_by_url_title!).and_raise("An example error")
            get("/request/example")
            response.body.should have_selector('div[id=traces]')
            response.body.should match('An example error')
        end

    end

    context 'when not considering all requests local' do

        before(:each) { set_consider_all_requests_local(false) }

        it "should render a 404 for unrouteable URLs using the general/exception_caught template" do
            get("/frobsnasm")
            response.should render_template('general/exception_caught')
            response.code.should == "404"
        end

        it "should render a 404 for users or bodies that don't exist using the general/exception_caught
            template" do
            ['/user/wobsnasm', '/body/wobsnasm'].each do |non_existent_url|
                get(non_existent_url)
                response.should render_template('general/exception_caught')
                response.code.should == "404"
            end
        end

        it "should render a 500 for general errors using the general/exception_caught template" do
            InfoRequest.stub!(:find_by_url_title!).and_raise("An example error")
            get("/request/example")
            response.should render_template('general/exception_caught')
            response.body.should match('An example error')
            response.code.should == "500"
        end

        it 'should notify of a general error' do
            InfoRequest.stub!(:find_by_url_title!).and_raise("An example error")
            get("/request/example")
            deliveries = ActionMailer::Base.deliveries
            deliveries.size.should == 1
            mail = deliveries[0]
            mail.body.should =~ /An example error/
        end

        it 'should log a general error' do
            Rails.logger.should_receive(:fatal)
            InfoRequest.stub!(:find_by_url_title!).and_raise("An example error")
            get("/request/example")
        end

        it 'should assign the locale for the general/exception_caught template' do
            InfoRequest.stub!(:find_by_url_title!).and_raise("An example error")
            get("/es/request/example")
            response.should render_template('general/exception_caught')
            response.body.should match('Lo sentimos, hubo un problema procesando esta página')
            response.body.should match('An example error')
        end

        it "should render a 403 with text body for attempts at directory listing for attachments" do
            # make a fake cache
            foi_cache_path = File.expand_path(File.join(File.dirname(__FILE__), '../../cache'))
            FileUtils.mkdir_p(File.join(foi_cache_path, "views/en/request/101/101/response/1/attach/html/1"))
            get("/request/101/response/1/attach/html/1/" )
            response.body.should include("Directory listing not allowed")
            response.code.should == "403"
            get("/request/101/response/1/attach/html" )
            response.body.should include("Directory listing not allowed")
            response.code.should == "403"
        end

        context "in the admin interface" do

            it 'should show a full trace for general errors' do
                InfoRequest.stub!(:find).and_raise("An example error")
                get("/admin/request/show/333")
                response.body.should have_selector('div[id=traces]')
                response.body.should match('An example error')
            end

        end

    end

end