forked from thoughtbot/hoptoad_notifier
-
Notifications
You must be signed in to change notification settings - Fork 1
/
notifier_test.rb
191 lines (163 loc) · 6.96 KB
/
notifier_test.rb
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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
require File.dirname(__FILE__) + '/helper'
class NotifierTest < Test::Unit::TestCase
context "Sending a notice" do
should "not fail without rails environment" do
assert_nothing_raised do
HoptoadNotifier.environment_info
end
end
should "have information about the notifier in the headers" do
assert_equal "Hoptoad Notifier", HoptoadNotifier::HEADERS['X-Hoptoad-Client-Name']
assert_equal HoptoadNotifier::VERSION, HoptoadNotifier::HEADERS['X-Hoptoad-Client-Version']
end
context "with an exception" do
setup do
@sender = HoptoadNotifier::Sender.new
@backtrace = caller
@exception = begin
raise
rescue => caught_exception
caught_exception
end
@options = {:error_message => "123",
:backtrace => @backtrace}
HoptoadNotifier.instance_variable_set("@backtrace_filters", [])
HoptoadNotifier::Sender.expects(:new).returns(@sender)
@sender.stubs(:public_environment?).returns(true)
HoptoadNotifier.stubs(:environment_info)
end
context "when using an HTTP Proxy" do
setup do
@body = 'body'
@response = stub(:body => @body)
@http = stub(:post => @response, :read_timeout= => nil, :open_timeout= => nil, :use_ssl= => nil)
@sender.stubs(:logger).returns(stub(:error => nil, :info => nil))
@proxy = stub
@proxy.stubs(:new).returns(@http)
HoptoadNotifier.port = nil
HoptoadNotifier.host = nil
HoptoadNotifier.secure = false
Net::HTTP.expects(:Proxy).with(
HoptoadNotifier.proxy_host,
HoptoadNotifier.proxy_port,
HoptoadNotifier.proxy_user,
HoptoadNotifier.proxy_pass
).returns(@proxy)
end
context "on notify" do
setup { HoptoadNotifier.notify(@exception) }
before_should "post to Hoptoad" do
url = "http://hoptoadapp.com:80/notices/"
uri = URI.parse(url)
URI.expects(:parse).with(url).returns(uri)
@http.expects(:post).with(uri.path, anything, HoptoadNotifier::HEADERS).returns(@response)
end
end
end
context "when stubbing out Net::HTTP" do
setup do
@body = 'body'
@response = stub(:body => @body)
@http = stub(:post => @response, :read_timeout= => nil, :open_timeout= => nil, :use_ssl= => nil)
@sender.stubs(:logger).returns(stub(:error => nil, :info => nil))
Net::HTTP.stubs(:new).returns(@http)
HoptoadNotifier.port = nil
HoptoadNotifier.host = nil
HoptoadNotifier.proxy_host = nil
end
context "on notify" do
setup { HoptoadNotifier.notify(@exception) }
before_should "post to the right url for non-ssl" do
HoptoadNotifier.secure = false
url = "http://hoptoadapp.com:80/notices/"
uri = URI.parse(url)
URI.expects(:parse).with(url).returns(uri)
@http.expects(:post).with(uri.path, anything, HoptoadNotifier::HEADERS).returns(@response)
end
before_should "post to the right path" do
@http.expects(:post).with("/notices/", anything, HoptoadNotifier::HEADERS).returns(@response)
end
before_should "call send_to_hoptoad" do
@sender.expects(:send_to_hoptoad)
end
before_should "default the open timeout to 2 seconds" do
HoptoadNotifier.http_open_timeout = nil
@http.expects(:open_timeout=).with(2)
end
before_should "default the read timeout to 5 seconds" do
HoptoadNotifier.http_read_timeout = nil
@http.expects(:read_timeout=).with(5)
end
before_should "allow override of the open timeout" do
HoptoadNotifier.http_open_timeout = 4
@http.expects(:open_timeout=).with(4)
end
before_should "allow override of the read timeout" do
HoptoadNotifier.http_read_timeout = 10
@http.expects(:read_timeout=).with(10)
end
before_should "connect to the right port for ssl" do
HoptoadNotifier.secure = true
Net::HTTP.expects(:new).with("hoptoadapp.com", 443).returns(@http)
end
before_should "connect to the right port for non-ssl" do
HoptoadNotifier.secure = false
Net::HTTP.expects(:new).with("hoptoadapp.com", 80).returns(@http)
end
before_should "use ssl if secure" do
HoptoadNotifier.secure = true
HoptoadNotifier.host = 'example.org'
Net::HTTP.expects(:new).with('example.org', 443).returns(@http)
end
before_should "not use ssl if not secure" do
HoptoadNotifier.secure = nil
HoptoadNotifier.host = 'example.org'
Net::HTTP.expects(:new).with('example.org', 80).returns(@http)
end
end
end
should "send as if it were a normally caught exception" do
@sender.expects(:notify_hoptoad).with(@exception)
HoptoadNotifier.notify(@exception)
end
should "make sure the exception is munged into a hash" do
options = HoptoadNotifier.default_notice_options.merge({
:backtrace => @exception.backtrace,
:environment => ENV.to_hash,
:error_class => @exception.class.name,
:error_message => "#{@exception.class.name}: #{@exception.message}",
:api_key => HoptoadNotifier.api_key,
})
@sender.expects(:send_to_hoptoad).with(:notice => options)
HoptoadNotifier.notify(@exception)
end
should "parse massive one-line exceptions into multiple lines" do
@original_backtrace = "one big line\n separated\n by new lines\nand some spaces"
@expected_backtrace = ["one big line", "separated", "by new lines", "and some spaces"]
@exception.set_backtrace [@original_backtrace]
options = HoptoadNotifier.default_notice_options.merge({
:backtrace => @expected_backtrace,
:environment => ENV.to_hash,
:error_class => @exception.class.name,
:error_message => "#{@exception.class.name}: #{@exception.message}",
:api_key => HoptoadNotifier.api_key,
})
@sender.expects(:send_to_hoptoad).with(:notice => options)
HoptoadNotifier.notify(@exception)
end
end
context "without an exception" do
setup do
@sender = HoptoadNotifier::Sender.new
@backtrace = caller
@options = {:error_message => "123",
:backtrace => @backtrace}
HoptoadNotifier::Sender.expects(:new).returns(@sender)
end
should "send sensible defaults" do
@sender.expects(:notify_hoptoad).with(@options)
HoptoadNotifier.notify(:error_message => "123", :backtrace => @backtrace)
end
end
end
end