airbrake 4.1.0 → 4.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG +72 -0
- data/LICENSE +10 -10
- data/README.md +1 -1
- data/Rakefile +2 -7
- data/airbrake.gemspec +7 -10
- data/features/rails.feature +42 -23
- data/features/rake.feature +4 -4
- data/features/step_definitions/rails_application_steps.rb +2 -2
- data/features/support/rails.rb +6 -6
- data/lib/airbrake/capistrano.rb +4 -4
- data/lib/airbrake/configuration.rb +3 -6
- data/lib/airbrake/notice.rb +1 -1
- data/lib/airbrake/rails/controller_methods.rb +40 -15
- data/lib/airbrake/rails3_tasks.rb +1 -0
- data/lib/airbrake/sidekiq.rb +5 -6
- data/lib/airbrake/tasks/airbrake.cap +1 -1
- data/lib/airbrake/utils/params_cleaner.rb +43 -31
- data/lib/airbrake/version.rb +1 -1
- data/lib/rails/generators/airbrake/airbrake_generator.rb +32 -8
- data/resources/notice.xml +1 -1
- data/test/backtrace_test.rb +34 -0
- data/test/capistrano_test.rb +1 -1
- data/test/controller_methods_test.rb +114 -20
- data/test/notice_test.rb +14 -1
- data/test/params_cleaner_test.rb +9 -0
- metadata +58 -43
@@ -114,6 +114,7 @@ namespace :airbrake do
|
|
114
114
|
protocol = (config.respond_to?(:force_ssl) && config.force_ssl) ? 'https' : 'http'
|
115
115
|
|
116
116
|
env = Rack::MockRequest.env_for("#{protocol}://www.example.com/verify")
|
117
|
+
env['REMOTE_ADDR'] = '127.0.0.1'
|
117
118
|
|
118
119
|
Rails.application.call(env)
|
119
120
|
|
data/lib/airbrake/sidekiq.rb
CHANGED
@@ -1,9 +1,8 @@
|
|
1
|
+
gem 'sidekiq', '~> 3.0'
|
1
2
|
require 'sidekiq'
|
2
3
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
Airbrake.notify_or_ignore(exception, :parameters => context)
|
7
|
-
end
|
4
|
+
Sidekiq.configure_server do |config|
|
5
|
+
config.error_handlers << lambda do |exception, context|
|
6
|
+
Airbrake.notify_or_ignore(exception, :parameters => context)
|
8
7
|
end
|
9
|
-
end
|
8
|
+
end
|
@@ -6,7 +6,7 @@ namespace :airbrake do
|
|
6
6
|
task :deploy do
|
7
7
|
# update scm state to get the repository information
|
8
8
|
invoke "#{scm}:update"
|
9
|
-
on roles(:
|
9
|
+
on roles(:all) do
|
10
10
|
within release_path do
|
11
11
|
# XXX: Invoking deploy:set_rails_env would set :rails_env to proper
|
12
12
|
# value, but that would make us depend on capistrano-rails
|
@@ -5,15 +5,16 @@ module Airbrake
|
|
5
5
|
attr_reader :parameters, :cgi_data, :session_data
|
6
6
|
|
7
7
|
# Public: Initialize a new Airbrake::Utils::ParamsCleaner
|
8
|
-
#
|
8
|
+
#
|
9
9
|
# opts - The Hash options that contain filters and params (default: {}):
|
10
10
|
# :filters - The Array of param keys that should be filtered
|
11
11
|
# :to_clean - The Hash of unfiltered params
|
12
12
|
def initialize(opts = {})
|
13
|
-
@filters = opts[:filters] ||
|
13
|
+
@filters = opts[:filters] || []
|
14
|
+
@filters.map!{|f| f.is_a?(Symbol) ? f.to_s : f }
|
14
15
|
@to_clean = opts[:to_clean]
|
15
16
|
end
|
16
|
-
|
17
|
+
|
17
18
|
# Public: Takes the params to_clean passed in an initializer
|
18
19
|
# and filters them out by filters passed.
|
19
20
|
#
|
@@ -23,7 +24,7 @@ module Airbrake
|
|
23
24
|
# could be extracted
|
24
25
|
def clean
|
25
26
|
clean_parameters
|
26
|
-
clean_session_data
|
27
|
+
clean_session_data
|
27
28
|
clean_cgi_data
|
28
29
|
clean_rack_request_data
|
29
30
|
|
@@ -33,50 +34,52 @@ module Airbrake
|
|
33
34
|
private
|
34
35
|
|
35
36
|
def clean_parameters
|
36
|
-
|
37
|
-
|
38
|
-
|
37
|
+
return unless @to_clean[:parameters]
|
38
|
+
|
39
|
+
@parameters = if @filters.any?
|
40
|
+
filter(clean_unserializable_data(@to_clean[:parameters]))
|
41
|
+
else
|
42
|
+
clean_unserializable_data(@to_clean[:parameters])
|
39
43
|
end
|
40
44
|
end
|
41
45
|
|
42
46
|
def clean_cgi_data
|
43
|
-
|
44
|
-
|
45
|
-
|
47
|
+
return unless @to_clean[:cgi_data]
|
48
|
+
|
49
|
+
@cgi_data = if @filters.any?
|
50
|
+
filter(clean_unserializable_data(@to_clean[:cgi_data]))
|
51
|
+
else
|
52
|
+
clean_unserializable_data(@to_clean[:cgi_data])
|
46
53
|
end
|
47
54
|
end
|
48
55
|
|
49
56
|
def clean_session_data
|
50
|
-
|
51
|
-
|
52
|
-
|
57
|
+
return unless @to_clean[:session_data]
|
58
|
+
|
59
|
+
@session_data = if @filters.any?
|
60
|
+
filter(clean_unserializable_data(@to_clean[:session_data]))
|
61
|
+
else
|
62
|
+
clean_unserializable_data(@to_clean[:session_data])
|
53
63
|
end
|
54
64
|
end
|
55
65
|
|
56
66
|
def clean_rack_request_data
|
57
67
|
if @cgi_data
|
58
|
-
@cgi_data.
|
59
|
-
|
60
|
-
@cgi_data.delete key
|
61
|
-
end
|
68
|
+
@cgi_data.reject! do |key, val|
|
69
|
+
Airbrake::FILTERED_RACK_VARS.include?(key) || Airbrake::SENSITIVE_ENV_VARS.any?{|re| re.match(key)}
|
62
70
|
end
|
63
71
|
end
|
64
72
|
end
|
65
73
|
|
66
|
-
def filter_key?(key
|
67
|
-
filters.any? do |filter|
|
68
|
-
|
69
|
-
when Regexp
|
70
|
-
filter.match(key)
|
71
|
-
else
|
72
|
-
key.to_s.eql?(filter.to_s)
|
73
|
-
end
|
74
|
+
def filter_key?(key)
|
75
|
+
@filters.any? do |filter|
|
76
|
+
key == filter || filter.is_a?(Regexp) && filter.match(key)
|
74
77
|
end
|
75
78
|
end
|
76
79
|
|
77
80
|
def filter(hash)
|
78
81
|
hash.each do |key, value|
|
79
|
-
if filter_key?(key
|
82
|
+
if filter_key?(key)
|
80
83
|
hash[key] = "[FILTERED]"
|
81
84
|
elsif value.respond_to?(:to_hash)
|
82
85
|
filter(hash[key])
|
@@ -93,16 +96,25 @@ module Airbrake
|
|
93
96
|
# and hashes. All other types are converted to strings.
|
94
97
|
def clean_unserializable_data(data, stack = [])
|
95
98
|
return "[possible infinite recursion halted]" if stack.any?{|item| item == data.object_id }
|
96
|
-
|
97
|
-
|
99
|
+
if data.is_a?(String)
|
100
|
+
data
|
101
|
+
elsif data.is_a?(Hash)
|
102
|
+
data.inject({}) do |result, (key, value)|
|
103
|
+
result.merge!(key => clean_unserializable_data(value, stack + [data.object_id]))
|
104
|
+
end
|
105
|
+
elsif data.respond_to?(:to_hash)
|
98
106
|
data.to_hash.inject({}) do |result, (key, value)|
|
99
|
-
result.merge(key => clean_unserializable_data(value, stack + [data.object_id]))
|
107
|
+
result.merge!(key => clean_unserializable_data(value, stack + [data.object_id]))
|
108
|
+
end
|
109
|
+
elsif data.respond_to?(:collect) and !data.is_a?(IO)
|
110
|
+
data = data.collect do |value|
|
111
|
+
clean_unserializable_data(value, stack + [data.object_id])
|
100
112
|
end
|
101
113
|
elsif data.respond_to?(:to_ary)
|
102
|
-
data.to_ary.collect do |value|
|
114
|
+
data = data.to_ary.collect do |value|
|
103
115
|
clean_unserializable_data(value, stack + [data.object_id])
|
104
116
|
end
|
105
|
-
|
117
|
+
elsif data.respond_to?(:to_s)
|
106
118
|
data.nil? ? nil : data.to_s
|
107
119
|
end
|
108
120
|
end
|
data/lib/airbrake/version.rb
CHANGED
@@ -25,7 +25,7 @@ class AirbrakeGenerator < Rails::Generators::Base
|
|
25
25
|
def install
|
26
26
|
ensure_api_key_was_configured
|
27
27
|
ensure_plugin_is_not_present
|
28
|
-
append_capistrano_hook
|
28
|
+
append_capistrano_hook if capistrano_present?
|
29
29
|
generate_initializer unless api_key_configured?
|
30
30
|
determine_api_key if heroku?
|
31
31
|
test_airbrake
|
@@ -47,18 +47,42 @@ class AirbrakeGenerator < Rails::Generators::Base
|
|
47
47
|
end
|
48
48
|
end
|
49
49
|
|
50
|
-
def
|
51
|
-
|
52
|
-
|
50
|
+
def capistrano_present?
|
51
|
+
!Gem.loaded_specs['capistrano'].nil? &&
|
52
|
+
File.exists?('config/deploy.rb') &&
|
53
|
+
File.exists?('Capfile')
|
54
|
+
end
|
53
55
|
|
54
|
-
|
55
|
-
|
56
|
-
|
56
|
+
def append_capistrano_hook
|
57
|
+
if capistrano_version < Gem::Version.new('3')
|
58
|
+
append_file('config/deploy.rb', capistrano2_hook)
|
59
|
+
else
|
60
|
+
append_file('config/deploy.rb', capistrano3_hook)
|
57
61
|
end
|
58
62
|
end
|
59
63
|
|
64
|
+
def capistrano_version
|
65
|
+
Gem.loaded_specs['capistrano'].version
|
66
|
+
end
|
67
|
+
|
68
|
+
def capistrano2_hook
|
69
|
+
<<-HOOK
|
70
|
+
|
71
|
+
require './config/boot'
|
72
|
+
require 'airbrake/capistrano'
|
73
|
+
HOOK
|
74
|
+
end
|
75
|
+
|
76
|
+
def capistrano3_hook
|
77
|
+
<<-HOOK
|
78
|
+
|
79
|
+
require 'airbrake/capistrano3'
|
80
|
+
after "deploy:finished", "airbrake:deploy"
|
81
|
+
HOOK
|
82
|
+
end
|
83
|
+
|
60
84
|
def api_key_expression
|
61
|
-
|
85
|
+
if options[:api_key]
|
62
86
|
"'#{options[:api_key]}'"
|
63
87
|
elsif options[:heroku]
|
64
88
|
"ENV['AIRBRAKE_API_KEY']"
|
data/resources/notice.xml
CHANGED
@@ -1 +1 @@
|
|
1
|
-
<?xml version="1.0" encoding="UTF-8"?><notice version="2.4"><api-key>myapikey</api-key><notifier><name>Airbrake Notifier</name><version>4.
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?><notice version="2.4"><api-key>myapikey</api-key><notifier><name>Airbrake Notifier</name><version>4.1.0</version><url>https://github.com/airbrake/airbrake</url></notifier><error><class>RuntimeError</class><message>RuntimeError: some message</message><backtrace><line number="5" file="[PROJECT_ROOT]/app/controllers/test_controller.rb" method="index"/><line number="4" file="[GEM_ROOT]/gems/actionpack-3.0.20/lib/action_controller/metal/implicit_render.rb" method="send_action"/><line number="150" file="[GEM_ROOT]/gems/actionpack-3.0.20/lib/abstract_controller/base.rb" method="process_action"/><line number="11" file="[GEM_ROOT]/gems/actionpack-3.0.20/lib/action_controller/metal/rendering.rb" method="process_action"/><line number="18" file="[GEM_ROOT]/gems/actionpack-3.0.20/lib/abstract_controller/callbacks.rb" method="block in process_action"/><line number="436" file="[GEM_ROOT]/gems/activesupport-3.0.20/lib/active_support/callbacks.rb" method="_run__2068053752208704527__process_action__3383495195678923616__callbacks"/><line number="410" file="[GEM_ROOT]/gems/activesupport-3.0.20/lib/active_support/callbacks.rb" method="_run_process_action_callbacks"/><line number="94" file="[GEM_ROOT]/gems/activesupport-3.0.20/lib/active_support/callbacks.rb" method="run_callbacks"/><line number="17" file="[GEM_ROOT]/gems/actionpack-3.0.20/lib/abstract_controller/callbacks.rb" method="process_action"/><line number="17" file="[GEM_ROOT]/gems/actionpack-3.0.20/lib/action_controller/metal/rescue.rb" method="process_action"/><line number="30" file="[GEM_ROOT]/gems/actionpack-3.0.20/lib/action_controller/metal/instrumentation.rb" method="block in process_action"/><line number="52" file="[GEM_ROOT]/gems/activesupport-3.0.20/lib/active_support/notifications.rb" method="block in instrument"/><line number="21" file="[GEM_ROOT]/gems/activesupport-3.0.20/lib/active_support/notifications/instrumenter.rb" method="instrument"/><line number="52" file="[GEM_ROOT]/gems/activesupport-3.0.20/lib/active_support/notifications.rb" method="instrument"/><line number="29" file="[GEM_ROOT]/gems/actionpack-3.0.20/lib/action_controller/metal/instrumentation.rb" method="process_action"/><line number="119" file="[GEM_ROOT]/gems/actionpack-3.0.20/lib/abstract_controller/base.rb" method="process"/><line number="41" file="[GEM_ROOT]/gems/actionpack-3.0.20/lib/abstract_controller/rendering.rb" method="process"/><line number="138" file="[GEM_ROOT]/gems/actionpack-3.0.20/lib/action_controller/metal.rb" method="dispatch"/><line number="14" file="[GEM_ROOT]/gems/actionpack-3.0.20/lib/action_controller/metal/rack_delegation.rb" method="dispatch"/><line number="178" file="[GEM_ROOT]/gems/actionpack-3.0.20/lib/action_controller/metal.rb" method="block in action"/><line number="68" file="[GEM_ROOT]/gems/actionpack-3.0.20/lib/action_dispatch/routing/route_set.rb" method="call"/><line number="68" file="[GEM_ROOT]/gems/actionpack-3.0.20/lib/action_dispatch/routing/route_set.rb" method="dispatch"/><line number="33" file="[GEM_ROOT]/gems/actionpack-3.0.20/lib/action_dispatch/routing/route_set.rb" method="call"/><line number="148" file="[GEM_ROOT]/gems/rack-mount-0.6.14/lib/rack/mount/route_set.rb" method="block in call"/><line number="93" file="[GEM_ROOT]/gems/rack-mount-0.6.14/lib/rack/mount/code_generation.rb" method="block in recognize"/><line number="68" file="[GEM_ROOT]/gems/rack-mount-0.6.14/lib/rack/mount/code_generation.rb" method="optimized_each"/><line number="92" file="[GEM_ROOT]/gems/rack-mount-0.6.14/lib/rack/mount/code_generation.rb" method="recognize"/><line number="139" file="[GEM_ROOT]/gems/rack-mount-0.6.14/lib/rack/mount/route_set.rb" method="call"/><line number="499" file="[GEM_ROOT]/gems/actionpack-3.0.20/lib/action_dispatch/routing/route_set.rb" method="call"/><line number="17" file="[GEM_ROOT]/gems/actionpack-3.0.20/lib/action_dispatch/middleware/best_standards_support.rb" method="call"/><line number="14" file="[GEM_ROOT]/gems/actionpack-3.0.20/lib/action_dispatch/middleware/head.rb" method="call"/><line number="24" file="[GEM_ROOT]/gems/rack-1.2.8/lib/rack/methodoverride.rb" method="call"/><line number="21" file="[GEM_ROOT]/gems/actionpack-3.0.20/lib/action_dispatch/middleware/params_parser.rb" method="call"/><line number="182" file="[GEM_ROOT]/gems/actionpack-3.0.20/lib/action_dispatch/middleware/flash.rb" method="call"/><line number="149" file="[GEM_ROOT]/gems/actionpack-3.0.20/lib/action_dispatch/middleware/session/abstract_store.rb" method="call"/><line number="302" file="[GEM_ROOT]/gems/actionpack-3.0.20/lib/action_dispatch/middleware/cookies.rb" method="call"/><line number="46" file="[GEM_ROOT]/gems/actionpack-3.0.20/lib/action_dispatch/middleware/callbacks.rb" method="block in call"/><line number="416" file="[GEM_ROOT]/gems/activesupport-3.0.20/lib/active_support/callbacks.rb" method="_run_call_callbacks"/><line number="44" file="[GEM_ROOT]/gems/actionpack-3.0.20/lib/action_dispatch/middleware/callbacks.rb" method="call"/><line number="106" file="[GEM_ROOT]/gems/rack-1.2.8/lib/rack/sendfile.rb" method="call"/><line number="48" file="[GEM_ROOT]/gems/actionpack-3.0.20/lib/action_dispatch/middleware/remote_ip.rb" method="call"/><line number="47" file="[GEM_ROOT]/gems/actionpack-3.0.20/lib/action_dispatch/middleware/show_exceptions.rb" method="call"/><line number="13" file="[GEM_ROOT]/gems/railties-3.0.20/lib/rails/rack/logger.rb" method="call"/><line number="17" file="[GEM_ROOT]/gems/rack-1.2.8/lib/rack/runtime.rb" method="call"/><line number="72" file="[GEM_ROOT]/gems/activesupport-3.0.20/lib/active_support/cache/strategy/local_cache.rb" method="call"/><line number="13" file="[GEM_ROOT]/gems/rack-1.2.8/lib/rack/lock.rb" method="block in call"/><line number="13" file="[GEM_ROOT]/gems/rack-1.2.8/lib/rack/lock.rb" method="synchronize"/><line number="13" file="[GEM_ROOT]/gems/rack-1.2.8/lib/rack/lock.rb" method="call"/><line number="168" file="[GEM_ROOT]/gems/railties-3.0.20/lib/rails/application.rb" method="call"/><line number="77" file="[GEM_ROOT]/gems/railties-3.0.20/lib/rails/application.rb" method="method_missing"/><line number="4" file="request.rb" method="<top (required)>"/><line number="48" file="[GEM_ROOT]/gems/railties-3.0.20/lib/rails/commands/runner.rb" method="eval"/><line number="48" file="[GEM_ROOT]/gems/railties-3.0.20/lib/rails/commands/runner.rb" method="<top (required)>"/><line number="39" file="[GEM_ROOT]/gems/railties-3.0.20/lib/rails/commands.rb" method="require"/><line number="39" file="[GEM_ROOT]/gems/railties-3.0.20/lib/rails/commands.rb" method="<top (required)>"/><line number="6" file="script/rails" method="require"/><line number="6" file="script/rails" method="<main>"/></backtrace></error><request><url>http://example.com:123/test/index?param=value</url><component>test</component><action>index</action><params><var key="param">value</var><var key="controller">test</var><var key="action">index</var></params><cgi-data><var key="rack.version">["1", "1"]</var><var key="rack.multithread">false</var><var key="rack.multiprocess">true</var><var key="rack.run_once">false</var><var key="REQUEST_METHOD">GET</var><var key="SERVER_NAME">example.com</var><var key="SERVER_PORT">123</var><var key="QUERY_STRING">param=value</var><var key="PATH_INFO">/test/index</var><var key="rack.url_scheme">http</var><var key="HTTPS">off</var><var key="SCRIPT_NAME"></var><var key="CONTENT_LENGTH">0</var><var key="action_dispatch.parameter_filter">["password"]</var><var key="action_dispatch.show_exceptions">true</var><var key="action_dispatch.remote_ip"></var><var key="action_dispatch.request.path_parameters"><var key="controller">test</var><var key="action">index</var></var><var key="action_dispatch.request.content_type"></var><var key="action_dispatch.request.request_parameters"></var><var key="rack.request.query_string">param=value</var><var key="rack.request.query_hash"><var key="param">value</var></var><var key="action_dispatch.request.query_parameters"><var key="param">value</var></var><var key="action_dispatch.request.parameters"><var key="param">value</var><var key="controller">test</var><var key="action">index</var></var><var key="action_dispatch.request.formats">["text/html"]</var></cgi-data></request><server-environment><project-root>/Users/shifi/work/rackspace/code/airbrake/tmp/rails_root</project-root><environment-name>production</environment-name><hostname>shifi-mac.mshome.net</hostname></server-environment><framework>Rails: 3.0.20</framework></notice>
|
data/test/backtrace_test.rb
CHANGED
@@ -75,6 +75,40 @@ class BacktraceTest < Test::Unit::TestCase
|
|
75
75
|
assert_equal expected_backtrace, original_backtrace
|
76
76
|
end
|
77
77
|
|
78
|
+
context "with a gem root" do
|
79
|
+
setup do
|
80
|
+
@gem_root = '/root/to/gem'
|
81
|
+
Gem.path << @gem_root
|
82
|
+
end
|
83
|
+
|
84
|
+
should "filter out the gem root" do
|
85
|
+
backtrace_with_gem_root = Airbrake::Backtrace.parse(
|
86
|
+
["#{@gem_root}/some/gem.rb:9:in `test'",
|
87
|
+
"#{@gem_root}/path/to/awesome_gem.rb:13:in `awesome'",
|
88
|
+
"/test/something.rb:55:in `hack'"],
|
89
|
+
:filters => default_filters)
|
90
|
+
backtrace_without_gem_root = Airbrake::Backtrace.parse(
|
91
|
+
["[GEM_ROOT]/some/gem.rb:9:in `test'",
|
92
|
+
"[GEM_ROOT]/path/to/awesome_gem.rb:13:in `awesome'",
|
93
|
+
"/test/something.rb:55:in `hack'"])
|
94
|
+
|
95
|
+
assert_equal backtrace_without_gem_root, backtrace_with_gem_root
|
96
|
+
end
|
97
|
+
|
98
|
+
should "ignore empty gem paths" do
|
99
|
+
Gem.path << ""
|
100
|
+
backtrace_with_gem_root = Airbrake::Backtrace.parse(
|
101
|
+
["#{@gem_root}/some/gem.rb:9:in `test'",
|
102
|
+
"/test/something.rb:55:in `hack'"],
|
103
|
+
:filters => default_filters)
|
104
|
+
backtrace_without_gem_root = Airbrake::Backtrace.parse(
|
105
|
+
["[GEM_ROOT]/some/gem.rb:9:in `test'",
|
106
|
+
"/test/something.rb:55:in `hack'"])
|
107
|
+
|
108
|
+
assert_equal backtrace_without_gem_root, backtrace_with_gem_root
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
78
112
|
context "with a project root" do
|
79
113
|
setup do
|
80
114
|
@project_root = '/some/path'
|
data/test/capistrano_test.rb
CHANGED
@@ -33,7 +33,7 @@ class CapistranoTest < Test::Unit::TestCase
|
|
33
33
|
@configuration.find_and_execute_task('airbrake:deploy')
|
34
34
|
|
35
35
|
assert io.string.include?('** Notifying Airbrake of Deploy')
|
36
|
-
assert io.string.include?('
|
36
|
+
assert io.string.include?('TO=production')
|
37
37
|
assert io.string.include?('** Airbrake Notification Complete')
|
38
38
|
assert io.string.include?(%q[D\'Angelo\ \"D\"\ Barksdale])
|
39
39
|
end
|
@@ -1,47 +1,106 @@
|
|
1
1
|
require File.expand_path '../helper', __FILE__
|
2
2
|
|
3
3
|
require 'airbrake/rails/controller_methods'
|
4
|
-
|
5
4
|
class TestController
|
6
5
|
include Airbrake::Rails::ControllerMethods
|
7
6
|
|
7
|
+
def params; {}; end
|
8
|
+
def session; nil; end
|
9
|
+
def request
|
10
|
+
OpenStruct.new(:port=> 80, :protocol => 'http://', host: 'example.com', :fullpath => 'path', :env => [])
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
class NilUserTestController < TestController
|
8
15
|
def current_user
|
9
16
|
nil
|
10
17
|
end
|
11
18
|
end
|
12
19
|
|
13
|
-
class
|
14
|
-
|
20
|
+
class CurrentUserTestController < TestController
|
21
|
+
def current_user
|
22
|
+
OpenStruct.new(:id => 123, :name => 'tape')
|
23
|
+
end
|
24
|
+
end
|
15
25
|
|
16
|
-
|
17
|
-
|
26
|
+
class CurrentMemberTestController < TestController
|
27
|
+
def current_member
|
28
|
+
OpenStruct.new(:id => 321, :name => 'mamba')
|
18
29
|
end
|
19
30
|
end
|
20
31
|
|
21
32
|
|
33
|
+
class NoSessionTestController < TestController
|
34
|
+
def session
|
35
|
+
nil
|
36
|
+
end
|
37
|
+
end
|
22
38
|
|
23
39
|
class ControllerMethodsTest < Test::Unit::TestCase
|
40
|
+
include DefinesConstants
|
41
|
+
|
24
42
|
context "#airbrake_current_user" do
|
25
|
-
|
43
|
+
context "without a logged in user" do
|
44
|
+
setup do
|
26
45
|
|
27
|
-
|
28
|
-
|
46
|
+
NilClass.class_eval do
|
47
|
+
@@called = false
|
29
48
|
|
30
|
-
|
31
|
-
|
32
|
-
|
49
|
+
def self.called
|
50
|
+
!! @@called
|
51
|
+
end
|
33
52
|
|
34
|
-
|
35
|
-
|
53
|
+
def id
|
54
|
+
@@called = true
|
55
|
+
end
|
36
56
|
end
|
57
|
+
|
58
|
+
@controller = NilUserTestController.new
|
37
59
|
end
|
38
60
|
|
39
|
-
|
61
|
+
should "not call #id on NilClass" do
|
62
|
+
@controller.send(:airbrake_current_user)
|
63
|
+
assert_equal false, NilClass.called
|
64
|
+
end
|
40
65
|
end
|
41
66
|
|
42
|
-
|
43
|
-
|
44
|
-
|
67
|
+
context "with a logged in User" do
|
68
|
+
teardown do
|
69
|
+
Object.__send__(:remove_const, :ActiveRecord) if defined?(ActiveRecord)
|
70
|
+
Object.__send__(:remove_const, :POOL) if defined?(POOL)
|
71
|
+
end
|
72
|
+
should 'include user info in the data sent to Ab' do
|
73
|
+
Airbrake.configuration.user_attributes = %w(id)
|
74
|
+
controller = CurrentUserTestController.new
|
75
|
+
ab_data = controller.airbrake_request_data
|
76
|
+
|
77
|
+
assert_equal( {:id => 123}, ab_data[:user])
|
78
|
+
end
|
79
|
+
|
80
|
+
should 'include more info if asked to, discarding unknown attributes' do
|
81
|
+
Airbrake.configuration.user_attributes = %w(id name collar-size)
|
82
|
+
|
83
|
+
controller = CurrentUserTestController.new
|
84
|
+
ab_data = controller.airbrake_request_data
|
85
|
+
|
86
|
+
assert_equal( {:id => 123, :name => 'tape'}, ab_data[:user])
|
87
|
+
end
|
88
|
+
|
89
|
+
should 'work with a "current_member" method too' do
|
90
|
+
Airbrake.configuration.user_attributes = %w(id)
|
91
|
+
controller = CurrentMemberTestController.new
|
92
|
+
ab_data = controller.airbrake_request_data
|
93
|
+
|
94
|
+
assert_equal( {:id => 321}, ab_data[:user])
|
95
|
+
end
|
96
|
+
|
97
|
+
should "release DB connections" do
|
98
|
+
::POOL = Object.new
|
99
|
+
module ::ActiveRecord; class Base; def self.connection_pool; ::POOL; end; end; end
|
100
|
+
::POOL.expects(:release_connection)
|
101
|
+
|
102
|
+
CurrentUserTestController.new.airbrake_request_data
|
103
|
+
end
|
45
104
|
end
|
46
105
|
end
|
47
106
|
|
@@ -55,15 +114,49 @@ class ControllerMethodsTest < Test::Unit::TestCase
|
|
55
114
|
end
|
56
115
|
end
|
57
116
|
|
117
|
+
context "#airbrake_request_url" do
|
118
|
+
setup do
|
119
|
+
@controller = NoSessionTestController.new
|
120
|
+
end
|
121
|
+
should "return correct request url" do
|
122
|
+
request_url = @controller.send(:airbrake_request_url)
|
123
|
+
assert_equal request_url, "http://example.com/path"
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
58
127
|
context "Rails 3" do
|
59
128
|
setup do
|
60
|
-
@controller =
|
129
|
+
@controller = NilUserTestController.new
|
61
130
|
::Rails = Object.new
|
62
131
|
::Rails.stubs(:version).returns("3.2.17")
|
63
132
|
end
|
64
|
-
|
65
|
-
|
133
|
+
|
134
|
+
should "respond to rails_3_or_4? with true" do
|
135
|
+
assert @controller.send(:rails_3_or_4?)
|
136
|
+
end
|
137
|
+
|
138
|
+
should "call filter_rails3_parameters" do
|
139
|
+
hash = {:a => "b"}
|
140
|
+
filtered_hash = {:c => "d"}
|
141
|
+
|
142
|
+
@controller.expects(:filter_rails3_parameters).with(hash).
|
143
|
+
returns(filtered_hash)
|
144
|
+
assert_equal filtered_hash,
|
145
|
+
@controller.send(:airbrake_filter_if_filtering, hash)
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
context "Rails 4.x" do
|
150
|
+
setup do
|
151
|
+
@controller = TestController.new
|
152
|
+
::Rails = Object.new
|
153
|
+
::Rails.stubs(:version).returns("4.5.6.7")
|
66
154
|
end
|
155
|
+
|
156
|
+
should 'be true when running Rails 4.x' do
|
157
|
+
assert @controller.send(:rails_3_or_4?)
|
158
|
+
end
|
159
|
+
|
67
160
|
should "call filter_rails3_parameters" do
|
68
161
|
hash = {:a => "b"}
|
69
162
|
filtered_hash = {:c => "d"}
|
@@ -74,4 +167,5 @@ class ControllerMethodsTest < Test::Unit::TestCase
|
|
74
167
|
@controller.send(:airbrake_filter_if_filtering, hash)
|
75
168
|
end
|
76
169
|
end
|
170
|
+
|
77
171
|
end
|