2007-10-25 22:21:21 -04:00
|
|
|
require 'active_support/test_case'
|
|
|
|
|
|
|
|
module ActionController
|
|
|
|
class NonInferrableControllerError < ActionControllerError
|
|
|
|
def initialize(name)
|
2008-01-29 20:32:28 -05:00
|
|
|
@name = name
|
2007-10-25 22:21:21 -04:00
|
|
|
super "Unable to determine the controller to test from #{name}. " +
|
2007-12-05 09:31:41 -05:00
|
|
|
"You'll need to specify it using 'tests YourController' in your " +
|
2008-01-29 20:32:28 -05:00
|
|
|
"test case definition. This could mean that #{inferred_controller_name} does not exist " +
|
|
|
|
"or it contains syntax errors"
|
|
|
|
end
|
|
|
|
|
|
|
|
def inferred_controller_name
|
|
|
|
@name.sub(/Test$/, '')
|
2007-10-25 22:21:21 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2008-07-16 08:00:36 -04:00
|
|
|
# Superclass for Action Controller functional tests. Infers the controller under test from the test class name,
|
|
|
|
# and creates @controller, @request, @response instance variables.
|
|
|
|
#
|
|
|
|
# class WidgetsControllerTest < ActionController::TestCase
|
|
|
|
# def test_index
|
|
|
|
# get :index
|
|
|
|
# end
|
|
|
|
# end
|
|
|
|
#
|
|
|
|
# * @controller - WidgetController.new
|
|
|
|
# * @request - ActionController::TestRequest.new
|
|
|
|
# * @response - ActionController::TestResponse.new
|
|
|
|
#
|
|
|
|
# (Earlier versions of Rails required each functional test to subclass Test::Unit::TestCase and define
|
|
|
|
# @controller, @request, @response in +setup+.)
|
|
|
|
#
|
|
|
|
# If the controller cannot be inferred from the test class name, you can explicity set it with +tests+.
|
|
|
|
#
|
|
|
|
# class SpecialEdgeCaseWidgetsControllerTest < ActionController::TestCase
|
|
|
|
# tests WidgetController
|
|
|
|
# end
|
2007-10-25 22:21:21 -04:00
|
|
|
class TestCase < ActiveSupport::TestCase
|
2008-04-27 20:42:13 -04:00
|
|
|
# When the request.remote_addr remains the default for testing, which is 0.0.0.0, the exception is simply raised inline
|
|
|
|
# (bystepping the regular exception handling from rescue_action). If the request.remote_addr is anything else, the regular
|
|
|
|
# rescue_action process takes place. This means you can test your rescue_action code by setting remote_addr to something else
|
|
|
|
# than 0.0.0.0.
|
|
|
|
#
|
|
|
|
# The exception is stored in the exception accessor for further inspection.
|
2008-01-05 08:34:15 -05:00
|
|
|
module RaiseActionExceptions
|
2008-04-27 20:42:13 -04:00
|
|
|
attr_accessor :exception
|
|
|
|
|
2008-01-05 08:34:15 -05:00
|
|
|
def rescue_action(e)
|
2008-04-27 20:42:13 -04:00
|
|
|
self.exception = e
|
|
|
|
|
|
|
|
if request.remote_addr == "0.0.0.0"
|
|
|
|
raise(e)
|
|
|
|
else
|
|
|
|
super(e)
|
|
|
|
end
|
2008-01-05 08:34:15 -05:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
setup :setup_controller_request_and_response
|
|
|
|
|
2007-10-25 22:21:21 -04:00
|
|
|
@@controller_class = nil
|
2008-01-05 08:34:15 -05:00
|
|
|
|
2007-10-25 22:21:21 -04:00
|
|
|
class << self
|
2008-07-16 08:00:36 -04:00
|
|
|
# Sets the controller class name. Useful if the name can't be inferred from test class.
|
|
|
|
# Expects +controller_class+ as a constant. Example: <tt>tests WidgetController</tt>.
|
2007-10-25 22:21:21 -04:00
|
|
|
def tests(controller_class)
|
|
|
|
self.controller_class = controller_class
|
|
|
|
end
|
|
|
|
|
|
|
|
def controller_class=(new_class)
|
|
|
|
prepare_controller_class(new_class)
|
|
|
|
write_inheritable_attribute(:controller_class, new_class)
|
|
|
|
end
|
|
|
|
|
|
|
|
def controller_class
|
|
|
|
if current_controller_class = read_inheritable_attribute(:controller_class)
|
|
|
|
current_controller_class
|
|
|
|
else
|
2008-01-05 08:34:15 -05:00
|
|
|
self.controller_class = determine_default_controller_class(name)
|
2007-10-25 22:21:21 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def determine_default_controller_class(name)
|
|
|
|
name.sub(/Test$/, '').constantize
|
|
|
|
rescue NameError
|
|
|
|
raise NonInferrableControllerError.new(name)
|
|
|
|
end
|
|
|
|
|
|
|
|
def prepare_controller_class(new_class)
|
2008-01-05 08:34:15 -05:00
|
|
|
new_class.send :include, RaiseActionExceptions
|
2007-10-25 22:21:21 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2008-01-05 08:34:15 -05:00
|
|
|
def setup_controller_request_and_response
|
2007-10-25 22:21:21 -04:00
|
|
|
@controller = self.class.controller_class.new
|
2008-03-08 07:56:41 -05:00
|
|
|
@controller.request = @request = TestRequest.new
|
|
|
|
@response = TestResponse.new
|
2007-10-25 22:21:21 -04:00
|
|
|
end
|
2008-04-27 20:42:13 -04:00
|
|
|
|
|
|
|
# Cause the action to be rescued according to the regular rules for rescue_action when the visitor is not local
|
|
|
|
def rescue_action_in_public!
|
|
|
|
@request.remote_addr = '208.77.188.166' # example.com
|
|
|
|
end
|
2007-12-28 00:21:24 -05:00
|
|
|
end
|
2008-04-27 20:42:13 -04:00
|
|
|
end
|