projectlocker_pulse 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (82) hide show
  1. data/CHANGELOG +26 -0
  2. data/Gemfile +3 -0
  3. data/Guardfile +6 -0
  4. data/INSTALL +20 -0
  5. data/MIT-LICENSE +23 -0
  6. data/README.md +439 -0
  7. data/README_FOR_HEROKU_ADDON.md +89 -0
  8. data/Rakefile +223 -0
  9. data/SUPPORTED_RAILS_VERSIONS +38 -0
  10. data/TESTING.md +41 -0
  11. data/features/metal.feature +18 -0
  12. data/features/rack.feature +60 -0
  13. data/features/rails.feature +272 -0
  14. data/features/rails_with_js_notifier.feature +97 -0
  15. data/features/rake.feature +27 -0
  16. data/features/sinatra.feature +29 -0
  17. data/features/step_definitions/file_steps.rb +10 -0
  18. data/features/step_definitions/metal_steps.rb +23 -0
  19. data/features/step_definitions/rack_steps.rb +23 -0
  20. data/features/step_definitions/rails_application_steps.rb +478 -0
  21. data/features/step_definitions/rake_steps.rb +17 -0
  22. data/features/support/env.rb +18 -0
  23. data/features/support/matchers.rb +35 -0
  24. data/features/support/projectlocker_pulse_shim.rb.template +16 -0
  25. data/features/support/rails.rb +201 -0
  26. data/features/support/rake/Rakefile +68 -0
  27. data/features/support/terminal.rb +107 -0
  28. data/features/user_informer.feature +63 -0
  29. data/generators/pulse/lib/insert_commands.rb +34 -0
  30. data/generators/pulse/lib/rake_commands.rb +24 -0
  31. data/generators/pulse/pulse_generator.rb +94 -0
  32. data/generators/pulse/templates/capistrano_hook.rb +6 -0
  33. data/generators/pulse/templates/initializer.rb +6 -0
  34. data/generators/pulse/templates/pulse_tasks.rake +25 -0
  35. data/install.rb +1 -0
  36. data/lib/projectlocker_pulse.rb +159 -0
  37. data/lib/pulse/backtrace.rb +108 -0
  38. data/lib/pulse/capistrano.rb +43 -0
  39. data/lib/pulse/configuration.rb +305 -0
  40. data/lib/pulse/notice.rb +390 -0
  41. data/lib/pulse/rack.rb +54 -0
  42. data/lib/pulse/rails/action_controller_catcher.rb +30 -0
  43. data/lib/pulse/rails/controller_methods.rb +85 -0
  44. data/lib/pulse/rails/error_lookup.rb +33 -0
  45. data/lib/pulse/rails/javascript_notifier.rb +47 -0
  46. data/lib/pulse/rails/middleware/exceptions_catcher.rb +33 -0
  47. data/lib/pulse/rails.rb +40 -0
  48. data/lib/pulse/rails3_tasks.rb +99 -0
  49. data/lib/pulse/railtie.rb +49 -0
  50. data/lib/pulse/rake_handler.rb +65 -0
  51. data/lib/pulse/sender.rb +128 -0
  52. data/lib/pulse/shared_tasks.rb +47 -0
  53. data/lib/pulse/tasks.rb +83 -0
  54. data/lib/pulse/user_informer.rb +27 -0
  55. data/lib/pulse/utils/blank.rb +53 -0
  56. data/lib/pulse/version.rb +3 -0
  57. data/lib/pulse_tasks.rb +64 -0
  58. data/lib/rails/generators/pulse/pulse_generator.rb +100 -0
  59. data/lib/templates/javascript_notifier.erb +15 -0
  60. data/lib/templates/rescue.erb +91 -0
  61. data/pulse.gemspec +39 -0
  62. data/rails/init.rb +1 -0
  63. data/resources/README.md +34 -0
  64. data/resources/ca-bundle.crt +3376 -0
  65. data/script/integration_test.rb +38 -0
  66. data/test/backtrace_test.rb +162 -0
  67. data/test/capistrano_test.rb +34 -0
  68. data/test/catcher_test.rb +333 -0
  69. data/test/configuration_test.rb +236 -0
  70. data/test/helper.rb +263 -0
  71. data/test/javascript_notifier_test.rb +51 -0
  72. data/test/logger_test.rb +79 -0
  73. data/test/notice_test.rb +490 -0
  74. data/test/notifier_test.rb +276 -0
  75. data/test/projectlocker_pulse_tasks_test.rb +170 -0
  76. data/test/pulse.xsd +88 -0
  77. data/test/rack_test.rb +58 -0
  78. data/test/rails_initializer_test.rb +36 -0
  79. data/test/recursion_test.rb +10 -0
  80. data/test/sender_test.rb +288 -0
  81. data/test/user_informer_test.rb +29 -0
  82. metadata +432 -0
@@ -0,0 +1,236 @@
1
+ require File.expand_path '../helper', __FILE__
2
+
3
+ class ConfigurationTest < Test::Unit::TestCase
4
+
5
+ include DefinesConstants
6
+
7
+ should "provide default values" do
8
+ assert_config_default :proxy_host, nil
9
+ assert_config_default :proxy_port, nil
10
+ assert_config_default :proxy_user, nil
11
+ assert_config_default :proxy_pass, nil
12
+ assert_config_default :project_root, nil
13
+ assert_config_default :environment_name, nil
14
+ assert_config_default :logger, nil
15
+ assert_config_default :notifier_version, Pulse::VERSION
16
+ assert_config_default :notifier_name, 'Pulse Notifier'
17
+ assert_config_default :notifier_url, 'http://rubyforge.org/projects/pl-errata/'
18
+ assert_config_default :secure, false
19
+ assert_config_default :host, 'errors.projectlocker.com'
20
+ assert_config_default :http_open_timeout, 2
21
+ assert_config_default :http_read_timeout, 5
22
+ assert_config_default :ignore_by_filters, []
23
+ assert_config_default :ignore_user_agent, []
24
+ assert_config_default :params_filters,
25
+ Pulse::Configuration::DEFAULT_PARAMS_FILTERS
26
+ assert_config_default :backtrace_filters,
27
+ Pulse::Configuration::DEFAULT_BACKTRACE_FILTERS
28
+ assert_config_default :ignore,
29
+ Pulse::Configuration::IGNORE_DEFAULT
30
+ assert_config_default :development_lookup, true
31
+ assert_config_default :framework, 'Standalone'
32
+ assert_config_default :async, nil
33
+ end
34
+
35
+ should "set GirlFriday-callable for async=true" do
36
+ config = Pulse::Configuration.new
37
+ config.async = true
38
+ assert config.async.respond_to?(:call)
39
+ end
40
+
41
+ should "set provided-callable for async {}" do
42
+ config = Pulse::Configuration.new
43
+ config.async {|notice| :ok}
44
+ assert config.async.respond_to?(:call)
45
+ assert_equal :ok, config.async.call
46
+ end
47
+
48
+ should "provide default values for secure connections" do
49
+ config = Pulse::Configuration.new
50
+ config.secure = true
51
+ assert_equal 443, config.port
52
+ assert_equal 'https', config.protocol
53
+ end
54
+
55
+ should "provide default values for insecure connections" do
56
+ config = Pulse::Configuration.new
57
+ config.secure = false
58
+ assert_equal 80, config.port
59
+ assert_equal 'http', config.protocol
60
+ end
61
+
62
+ should "not cache inferred ports" do
63
+ config = Pulse::Configuration.new
64
+ config.secure = false
65
+ config.port
66
+ config.secure = true
67
+ assert_equal 443, config.port
68
+ end
69
+
70
+ should "allow values to be overwritten" do
71
+ assert_config_overridable :proxy_host
72
+ assert_config_overridable :proxy_port
73
+ assert_config_overridable :proxy_user
74
+ assert_config_overridable :proxy_pass
75
+ assert_config_overridable :secure
76
+ assert_config_overridable :host
77
+ assert_config_overridable :port
78
+ assert_config_overridable :http_open_timeout
79
+ assert_config_overridable :http_read_timeout
80
+ assert_config_overridable :project_root
81
+ assert_config_overridable :notifier_version
82
+ assert_config_overridable :notifier_name
83
+ assert_config_overridable :notifier_url
84
+ assert_config_overridable :environment_name
85
+ assert_config_overridable :development_lookup
86
+ assert_config_overridable :logger
87
+ assert_config_overridable :async
88
+ end
89
+
90
+ should "have an api key" do
91
+ assert_config_overridable :api_key
92
+ end
93
+
94
+ should "act like a hash" do
95
+ config = Pulse::Configuration.new
96
+ hash = config.to_hash
97
+ [:api_key, :backtrace_filters, :development_environments,
98
+ :environment_name, :host, :http_open_timeout,
99
+ :http_read_timeout, :ignore, :ignore_by_filters, :ignore_user_agent,
100
+ :notifier_name, :notifier_url, :notifier_version, :params_filters,
101
+ :project_root, :port, :protocol, :proxy_host, :proxy_pass, :proxy_port,
102
+ :proxy_user, :secure, :development_lookup, :async].each do |option|
103
+ assert_equal config[option], hash[option], "Wrong value for #{option}"
104
+ end
105
+ end
106
+
107
+ should "be mergable" do
108
+ config = Pulse::Configuration.new
109
+ hash = config.to_hash
110
+ assert_equal hash.merge(:key => 'value'), config.merge(:key => 'value')
111
+ end
112
+
113
+ should "allow param filters to be appended" do
114
+ assert_appends_value :params_filters
115
+ end
116
+
117
+ should "warn when attempting to read environment filters" do
118
+ config = Pulse::Configuration.new
119
+ config.
120
+ expects(:warn).
121
+ with(regexp_matches(/deprecated/i))
122
+ assert_equal [], config.environment_filters
123
+ end
124
+
125
+ should "warn when attempting to write js_notifier" do
126
+ config = Pulse::Configuration.new
127
+ config.
128
+ expects(:warn).
129
+ with(regexp_matches(/deprecated/i))
130
+ config.js_notifier = true
131
+ end
132
+
133
+ should "allow ignored user agents to be appended" do
134
+ assert_appends_value :ignore_user_agent
135
+ end
136
+
137
+ should "allow backtrace filters to be appended" do
138
+ assert_appends_value(:backtrace_filters) do |config|
139
+ new_filter = lambda {}
140
+ config.filter_backtrace(&new_filter)
141
+ new_filter
142
+ end
143
+ end
144
+
145
+ should "allow ignore by filters to be appended" do
146
+ assert_appends_value(:ignore_by_filters) do |config|
147
+ new_filter = lambda {}
148
+ config.ignore_by_filter(&new_filter)
149
+ new_filter
150
+ end
151
+ end
152
+
153
+ should "allow ignored exceptions to be appended" do
154
+ config = Pulse::Configuration.new
155
+ original_filters = config.ignore.dup
156
+ new_filter = 'hello'
157
+ config.ignore << new_filter
158
+ assert_same_elements original_filters + [new_filter], config.ignore
159
+ end
160
+
161
+ should "allow ignored exceptions to be replaced" do
162
+ assert_replaces(:ignore, :ignore_only=)
163
+ end
164
+
165
+ should "allow ignored user agents to be replaced" do
166
+ assert_replaces(:ignore_user_agent, :ignore_user_agent_only=)
167
+ end
168
+
169
+ should "use development and test as development environments by default" do
170
+ config = Pulse::Configuration.new
171
+ assert_same_elements %w(development test cucumber), config.development_environments
172
+ end
173
+
174
+ should "be public in a public environment" do
175
+ config = Pulse::Configuration.new
176
+ config.development_environments = %w(development)
177
+ config.environment_name = 'production'
178
+ assert config.public?
179
+ end
180
+
181
+ should "not be public in a development environment" do
182
+ config = Pulse::Configuration.new
183
+ config.development_environments = %w(staging)
184
+ config.environment_name = 'staging'
185
+ assert !config.public?
186
+ end
187
+
188
+ should "be public without an environment name" do
189
+ config = Pulse::Configuration.new
190
+ assert config.public?
191
+ end
192
+
193
+ should "use the assigned logger if set" do
194
+ config = Pulse::Configuration.new
195
+ config.logger = "CUSTOM LOGGER"
196
+ assert_equal "CUSTOM LOGGER", config.logger
197
+ end
198
+
199
+ should 'give a new instance if non defined' do
200
+ Pulse.configuration = nil
201
+ assert_kind_of Pulse::Configuration, Pulse.configuration
202
+ end
203
+
204
+ def assert_config_default(option, default_value, config = nil)
205
+ config ||= Pulse::Configuration.new
206
+ assert_equal default_value, config.send(option)
207
+ end
208
+
209
+ def assert_config_overridable(option, value = 'a value')
210
+ config = Pulse::Configuration.new
211
+ config.send(:"#{option}=", value)
212
+ assert_equal value, config.send(option)
213
+ end
214
+
215
+ def assert_appends_value(option, &block)
216
+ config = Pulse::Configuration.new
217
+ original_values = config.send(option).dup
218
+ block ||= lambda do |config|
219
+ new_value = 'hello'
220
+ config.send(option) << new_value
221
+ new_value
222
+ end
223
+ new_value = block.call(config)
224
+ assert_same_elements original_values + [new_value], config.send(option)
225
+ end
226
+
227
+ def assert_replaces(option, setter)
228
+ config = Pulse::Configuration.new
229
+ new_value = 'hello'
230
+ config.send(setter, [new_value])
231
+ assert_equal [new_value], config.send(option)
232
+ config.send(setter, new_value)
233
+ assert_equal [new_value], config.send(option)
234
+ end
235
+
236
+ end
data/test/helper.rb ADDED
@@ -0,0 +1,263 @@
1
+ require 'simplecov'
2
+ SimpleCov.start
3
+ require 'test/unit'
4
+ require 'rubygems'
5
+
6
+ $LOAD_PATH << File.expand_path(File.join(File.dirname(__FILE__), "..", "lib"))
7
+
8
+ require 'thread'
9
+
10
+ require 'shoulda'
11
+ require 'mocha'
12
+
13
+ require 'action_controller'
14
+ require 'action_controller/test_process'
15
+ require 'active_record'
16
+ require 'active_support'
17
+ require 'nokogiri'
18
+ require 'rack'
19
+ require 'bourne'
20
+ require 'sham_rack'
21
+
22
+ require "pulse"
23
+
24
+ begin require 'redgreen'; rescue LoadError; end
25
+
26
+ module TestMethods
27
+ def rescue_action e
28
+ raise e
29
+ end
30
+
31
+ def do_raise
32
+ raise "Pulse"
33
+ end
34
+
35
+ def do_not_raise
36
+ render :text => "Success"
37
+ end
38
+
39
+ def do_raise_ignored
40
+ raise ActiveRecord::RecordNotFound.new("404")
41
+ end
42
+
43
+ def do_raise_not_ignored
44
+ raise ActiveRecord::StatementInvalid.new("Statement invalid")
45
+ end
46
+
47
+ def manual_notify
48
+ notify_pulse(Exception.new)
49
+ render :text => "Success"
50
+ end
51
+
52
+ def manual_notify_ignored
53
+ notify_pulse(ActiveRecord::RecordNotFound.new("404"))
54
+ render :text => "Success"
55
+ end
56
+ end
57
+
58
+ class Test::Unit::TestCase
59
+ def request(action = nil, method = :get, user_agent = nil, params = {})
60
+ @request = ActionController::TestRequest.new
61
+ @request.action = action ? action.to_s : ""
62
+
63
+ if user_agent
64
+ if @request.respond_to?(:user_agent=)
65
+ @request.user_agent = user_agent
66
+ else
67
+ @request.env["HTTP_USER_AGENT"] = user_agent
68
+ end
69
+ end
70
+ @request.query_parameters = @request.query_parameters.merge(params)
71
+ @response = ActionController::TestResponse.new
72
+ @controller.process(@request, @response)
73
+ end
74
+
75
+ # Borrowed from ActiveSupport 2.3.2
76
+ def assert_difference(expression, difference = 1, message = nil, &block)
77
+ b = block.send(:binding)
78
+ exps = Array.wrap(expression)
79
+ before = exps.map { |e| eval(e, b) }
80
+
81
+ yield
82
+
83
+ exps.each_with_index do |e, i|
84
+ error = "#{e.inspect} didn't change by #{difference}"
85
+ error = "#{message}.\n#{error}" if message
86
+ assert_equal(before[i] + difference, eval(e, b), error)
87
+ end
88
+ end
89
+
90
+ def assert_no_difference(expression, message = nil, &block)
91
+ assert_difference expression, 0, message, &block
92
+ end
93
+
94
+ def stub_sender
95
+ stub('sender', :send_to_pulse => nil)
96
+ end
97
+
98
+ def stub_sender!
99
+ Pulse.sender = stub_sender
100
+ end
101
+
102
+ def stub_notice
103
+ stub('notice', :to_xml => 'some yaml', :ignore? => false)
104
+ end
105
+
106
+ def stub_notice!
107
+ stub_notice.tap do |notice|
108
+ Pulse::Notice.stubs(:new => notice)
109
+ end
110
+ end
111
+
112
+ def create_dummy
113
+ Pulse::DummySender.new
114
+ end
115
+
116
+ def reset_config
117
+ Pulse.configuration = nil
118
+ Pulse.configure do |config|
119
+ config.api_key = 'abc123'
120
+ end
121
+ end
122
+
123
+ def clear_backtrace_filters
124
+ Pulse.configuration.backtrace_filters.clear
125
+ end
126
+
127
+ def build_exception(opts = {})
128
+ backtrace = ["pulse/test/helper.rb:132:in `build_exception'",
129
+ "pulse/test/backtrace.rb:4:in `build_notice_data'",
130
+ "/var/lib/gems/1.8/gems/pulse-2.4.5/rails/init.rb:2:in `send_exception'"]
131
+ opts = {:backtrace => backtrace}.merge(opts)
132
+ BacktracedException.new(opts)
133
+ end
134
+
135
+ def build_notice_data(exception = nil)
136
+ exception ||= build_exception
137
+ {
138
+ :api_key => 'abc123',
139
+ :error_class => exception.class.name,
140
+ :error_message => "#{exception.class.name}: #{exception.message}",
141
+ :backtrace => exception.backtrace,
142
+ :environment => { 'PATH' => '/bin', 'REQUEST_URI' => '/users/1' },
143
+ :request => {
144
+ :params => { 'controller' => 'users', 'action' => 'show', 'id' => '1' },
145
+ :rails_root => '/path/to/application',
146
+ :url => "http://test.host/users/1"
147
+ },
148
+ :session => {
149
+ :key => '123abc',
150
+ :data => { 'user_id' => '5', 'flash' => { 'notice' => 'Logged in successfully' } }
151
+ }
152
+ }
153
+ end
154
+
155
+ def assert_caught_and_sent
156
+ assert !Pulse.sender.collected.empty?
157
+ end
158
+
159
+ def assert_caught_and_not_sent
160
+ assert Pulse.sender.collected.empty?
161
+ end
162
+
163
+ def assert_array_starts_with(expected, actual)
164
+ assert_respond_to actual, :to_ary
165
+ array = actual.to_ary.reverse
166
+ expected.reverse.each_with_index do |value, i|
167
+ assert_equal value, array[i]
168
+ end
169
+ end
170
+
171
+ def assert_valid_node(document, xpath, content)
172
+ nodes = document.xpath(xpath)
173
+ assert nodes.any?{|node| node.content == content },
174
+ "Expected xpath #{xpath} to have content #{content}, " +
175
+ "but found #{nodes.map { |n| n.content }} in #{nodes.size} matching nodes." +
176
+ "Document:\n#{document.to_s}"
177
+ end
178
+
179
+ def assert_logged(expected)
180
+ assert_received(Pulse, :write_verbose_log) do |expect|
181
+ expect.with {|actual| actual =~ expected }
182
+ end
183
+ end
184
+
185
+ def assert_not_logged(expected)
186
+ assert_received(Pulse, :write_verbose_log) do |expect|
187
+ expect.with {|actual| actual =~ expected }.never
188
+ end
189
+ end
190
+
191
+
192
+ end
193
+
194
+ module DefinesConstants
195
+ def setup
196
+ @defined_constants = []
197
+ end
198
+
199
+ def teardown
200
+ @defined_constants.each do |constant|
201
+ Object.__send__(:remove_const, constant)
202
+ end
203
+ end
204
+
205
+ def define_constant(name, value)
206
+ Object.const_set(name, value)
207
+ @defined_constants << name
208
+ end
209
+ end
210
+
211
+ # Also stolen from AS 2.3.2
212
+ class Array
213
+ # Wraps the object in an Array unless it's an Array. Converts the
214
+ # object to an Array using #to_ary if it implements that.
215
+ def self.wrap(object)
216
+ case object
217
+ when nil
218
+ []
219
+ when self
220
+ object
221
+ else
222
+ if object.respond_to?(:to_ary)
223
+ object.to_ary
224
+ else
225
+ [object]
226
+ end
227
+ end
228
+ end
229
+
230
+ end
231
+
232
+ class CollectingSender
233
+ attr_reader :collected
234
+
235
+ def initialize
236
+ @collected = []
237
+ end
238
+
239
+ def send_to_pulse(data)
240
+ @collected << data
241
+ end
242
+ end
243
+
244
+ class FakeLogger
245
+ def info(*args); end
246
+ def debug(*args); end
247
+ def warn(*args); end
248
+ def error(*args); end
249
+ def fatal(*args); end
250
+ end
251
+
252
+ class BacktracedException < Exception
253
+ attr_accessor :backtrace
254
+ def initialize(opts)
255
+ @backtrace = opts[:backtrace]
256
+ end
257
+ def set_backtrace(bt)
258
+ @backtrace = bt
259
+ end
260
+ def message
261
+ "Something went wrong. Did you press the red button?"
262
+ end
263
+ end
@@ -0,0 +1,51 @@
1
+ require File.expand_path '../helper', __FILE__
2
+ require 'pulse/rails/javascript_notifier'
3
+ require 'ostruct'
4
+
5
+ class JavascriptNotifierTest < Test::Unit::TestCase
6
+ module FakeRenderer
7
+ def javascript_tag(text)
8
+ "<script>#{text}</script>"
9
+ end
10
+ def escape_javascript(text)
11
+ "ESC#{text}ESC"
12
+ end
13
+ end
14
+
15
+ class FakeController
16
+ def self.helper_method(*args)
17
+ end
18
+
19
+ include Pulse::Rails::JavascriptNotifier
20
+
21
+ def action_name
22
+ "action"
23
+ end
24
+
25
+ def controller_name
26
+ "controller"
27
+ end
28
+
29
+ def request
30
+ @request ||= OpenStruct.new
31
+ end
32
+
33
+ def render_to_string(options)
34
+ context = OpenStruct.new(options[:locals])
35
+ context.extend(FakeRenderer)
36
+ context.instance_eval do
37
+ erb = ERB.new(IO.read(options[:file]))
38
+ erb.result(binding)
39
+ end
40
+ end
41
+ end
42
+
43
+ should "make sure escape_javacript is called on the request.url" do
44
+ Pulse.configure do
45
+ end
46
+ controller = FakeController.new
47
+ controller.request.url = "bad_javascript"
48
+ assert controller.send(:pulse_javascript_notifier)['"ESCbad_javascriptESC"']
49
+ assert ! controller.send(:pulse_javascript_notifier)['"bad_javascript"']
50
+ end
51
+ end
@@ -0,0 +1,79 @@
1
+ require File.expand_path '../helper', __FILE__
2
+
3
+ class LoggerTest < Test::Unit::TestCase
4
+ def stub_http(response, body = nil)
5
+ response.stubs(:body => body) if body
6
+ @http = stub(:post => response,
7
+ :read_timeout= => nil,
8
+ :open_timeout= => nil,
9
+ :use_ssl= => nil)
10
+ Net::HTTP.stubs(:new).returns(@http)
11
+ end
12
+
13
+ def send_notice
14
+ Pulse.sender.send_to_pulse({'foo' => "bar"})
15
+ end
16
+
17
+ def stub_verbose_log
18
+ Pulse.stubs(:write_verbose_log)
19
+ end
20
+
21
+ def configure
22
+ Pulse.configure { |config| }
23
+ end
24
+
25
+ should "report that notifier is ready when configured" do
26
+ stub_verbose_log
27
+ configure
28
+ assert_logged /Notifier (.*) ready/
29
+ end
30
+
31
+ should "not report that notifier is ready when internally configured" do
32
+ stub_verbose_log
33
+ Pulse.configure(true) { |config| }
34
+ assert_not_logged /.*/
35
+ end
36
+
37
+ should "print environment info a successful notification without a body" do
38
+ reset_config
39
+ stub_verbose_log
40
+ stub_http(Net::HTTPSuccess)
41
+ send_notice
42
+ assert_logged /Environment Info:/
43
+ assert_not_logged /Response from Pulse:/
44
+ end
45
+
46
+ should "print environment info on a failed notification without a body" do
47
+ reset_config
48
+ stub_verbose_log
49
+ stub_http(Net::HTTPError)
50
+ send_notice
51
+ assert_logged /Environment Info:/
52
+ assert_not_logged /Response from Pulse:/
53
+ end
54
+
55
+ should "print environment info and response on a success with a body" do
56
+ reset_config
57
+ stub_verbose_log
58
+ stub_http(Net::HTTPSuccess, 'test')
59
+ send_notice
60
+ assert_logged /Environment Info:/
61
+ assert_logged /Response from Pulse:/
62
+ end
63
+
64
+ should "print environment info and response on a failure with a body" do
65
+ reset_config
66
+ stub_verbose_log
67
+ stub_http(Net::HTTPError, 'test')
68
+ send_notice
69
+ assert_logged /Environment Info:/
70
+ assert_logged /Response from Pulse:/
71
+ end
72
+
73
+ should "print information about the notice when Pulse server fails" do
74
+ stub_verbose_log
75
+ stub_http(Net::HTTPError, "test")
76
+ send_notice
77
+ assert_logged /Notice details:/
78
+ end
79
+ end