Skip to content

Commit

Permalink
Make TestProcess methods public for access via Integration::Session. …
Browse files Browse the repository at this point in the history
…Make return values from some of the Integration::Session methods sane.

git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@3724 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
  • Loading branch information
jamis committed Mar 1, 2006
1 parent 9ded584 commit abeb77b
Show file tree
Hide file tree
Showing 2 changed files with 112 additions and 115 deletions.
8 changes: 7 additions & 1 deletion actionpack/lib/action_controller/integration_test.rb
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -72,6 +72,7 @@ def reset!
def https!(flag=true) def https!(flag=true)
@https = flag @https = flag
initialize_url_writer initialize_url_writer
@https
end end


# Return +true+ if the session is mimicing a secure HTTPS request. # Return +true+ if the session is mimicing a secure HTTPS request.
Expand All @@ -89,6 +90,7 @@ def https?
def host!(name) def host!(name)
@host = name @host = name
initialize_url_writer initialize_url_writer
@host
end end


# Follow a single redirect response. If the last response was not a # Follow a single redirect response. If the last response was not a
Expand All @@ -97,6 +99,7 @@ def host!(name)
def follow_redirect! def follow_redirect!
raise "not a redirect! #{@status} #{@status_message}" unless redirect? raise "not a redirect! #{@status} #{@status_message}" unless redirect?
get(interpret_uri(headers["location"].first)) get(interpret_uri(headers["location"].first))
status
end end


# Performs a GET request, following any subsequent redirect. Note that # Performs a GET request, following any subsequent redirect. Note that
Expand All @@ -106,13 +109,15 @@ def follow_redirect!
def get_via_redirect(path, args={}) def get_via_redirect(path, args={})
get path, args get path, args
follow_redirect! while redirect? follow_redirect! while redirect?
status
end end


# Performs a POST request, following any subsequent redirect. This is # Performs a POST request, following any subsequent redirect. This is
# vulnerable to infinite loops, the same as #get_via_redirect. # vulnerable to infinite loops, the same as #get_via_redirect.
def post_via_redirect(path, args={}) def post_via_redirect(path, args={})
post path, args post path, args
follow_redirect! while redirect? follow_redirect! while redirect?
status
end end


# Returns +true+ if the last response was a redirect. # Returns +true+ if the last response was a redirect.
Expand Down Expand Up @@ -217,6 +222,7 @@ def process(method, path, parameters=nil, headers=nil)
@response = @controller.response @response = @controller.response


parse_result parse_result
return status
end end


# Parses the result of the response and extracts the various values, # Parses the result of the response and extracts the various values,
Expand Down Expand Up @@ -254,7 +260,7 @@ def initialize_url_writer
'QUERY_STRING' => "", 'QUERY_STRING' => "",
"REQUEST_URI" => "/", "REQUEST_URI" => "/",
"HTTP_HOST" => host, "HTTP_HOST" => host,
"SERVER_PORT" => https? ? "80" : "443", "SERVER_PORT" => https? ? "443" : "80",
"HTTPS" => https? ? "on" : "off") "HTTPS" => https? ? "on" : "off")
@rewriter = ActionController::UrlRewriter.new(ActionController::CgiRequest.new(cgi), {}) @rewriter = ActionController::UrlRewriter.new(ActionController::CgiRequest.new(cgi), {})
end end
Expand Down
219 changes: 105 additions & 114 deletions actionpack/lib/action_controller/test_process.rb
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -274,145 +274,136 @@ def delete() @attributes = {} end
end end


module TestProcess module TestProcess
private def self.included(base)
def self.included(base) # execute the request simulating a specific http method and set/volley the response
# execute the request simulating a specific http method and set/volley the response %w( get post put delete head ).each do |method|
%w( get post put delete head ).each do |method| base.class_eval <<-EOV, __FILE__, __LINE__
base.class_eval <<-EOV, __FILE__, __LINE__ def #{method}(action, parameters = nil, session = nil, flash = nil)
def #{method}(action, parameters = nil, session = nil, flash = nil) @request.env['REQUEST_METHOD'] = "#{method.upcase}" if @request
@request.env['REQUEST_METHOD'] = "#{method.upcase}" if @request process(action, parameters, session, flash)
process(action, parameters, session, flash) end
end EOV
EOV
end
end end
end


# execute the request and set/volley the response # execute the request and set/volley the response
def process(action, parameters = nil, session = nil, flash = nil) def process(action, parameters = nil, session = nil, flash = nil)
# Sanity check for required instance variables so we can give an # Sanity check for required instance variables so we can give an
# understandable error message. # understandable error message.
%w(controller request response).each do |iv_name| %w(controller request response).each do |iv_name|
raise "@#{iv_name} is nil: make sure you set it in your test's setup method." if instance_variable_get("@#{iv_name}").nil? raise "@#{iv_name} is nil: make sure you set it in your test's setup method." if instance_variable_get("@#{iv_name}").nil?
end end


@request.recycle! @request.recycle!


@html_document = nil @html_document = nil
@request.env['REQUEST_METHOD'] ||= "GET" @request.env['REQUEST_METHOD'] ||= "GET"
@request.action = action.to_s @request.action = action.to_s


parameters ||= {} parameters ||= {}
@request.assign_parameters(@controller.class.controller_path, action.to_s, parameters) @request.assign_parameters(@controller.class.controller_path, action.to_s, parameters)


@request.session = ActionController::TestSession.new(session) unless session.nil? @request.session = ActionController::TestSession.new(session) unless session.nil?
@request.session["flash"] = ActionController::Flash::FlashHash.new.update(flash) if flash @request.session["flash"] = ActionController::Flash::FlashHash.new.update(flash) if flash
build_request_uri(action, parameters) build_request_uri(action, parameters)
@controller.process(@request, @response) @controller.process(@request, @response)
end end


def xml_http_request(request_method, action, parameters = nil, session = nil, flash = nil) def xml_http_request(request_method, action, parameters = nil, session = nil, flash = nil)
@request.env['HTTP_X_REQUESTED_WITH'] = 'XMLHttpRequest' @request.env['HTTP_X_REQUESTED_WITH'] = 'XMLHttpRequest'
returning self.send(request_method, action, parameters, session, flash) do returning self.send(request_method, action, parameters, session, flash) do
@request.env.delete 'HTTP_X_REQUESTED_WITH' @request.env.delete 'HTTP_X_REQUESTED_WITH'
end
end end
alias xhr :xml_http_request end

alias xhr :xml_http_request
def follow_redirect
if @response.redirected_to[:controller]
raise "Can't follow redirects outside of current controller (#{@response.redirected_to[:controller]})"
end


get(@response.redirected_to.delete(:action), @response.redirected_to.stringify_keys) def follow_redirect
if @response.redirected_to[:controller]
raise "Can't follow redirects outside of current controller (#{@response.redirected_to[:controller]})"
end end


def assigns(key = nil) get(@response.redirected_to.delete(:action), @response.redirected_to.stringify_keys)
if key.nil? end
@response.template.assigns
else
@response.template.assigns[key.to_s]
end
end


def build_request_uri(action, parameters) def build_request_uri(action, parameters)
options = @controller.send(:rewrite_options, parameters) options = @controller.send(:rewrite_options, parameters)
options.update(:only_path => true, :action => action) options.update(:only_path => true, :action => action)
url = ActionController::UrlRewriter.new(@request, parameters) url = ActionController::UrlRewriter.new(@request, parameters)
@request.set_REQUEST_URI(url.rewrite(options)) @request.set_REQUEST_URI(url.rewrite(options))
end end


def session def session
@response.session @response.session
end end


def flash def flash
@response.flash @response.flash
end end


def cookies def cookies
@response.cookies @response.cookies
end end


def redirect_to_url def redirect_to_url
@response.redirect_url @response.redirect_url
end end


def build_request_uri(action, parameters) def build_request_uri(action, parameters)
unless @request.env['REQUEST_URI'] unless @request.env['REQUEST_URI']
options = @controller.send(:rewrite_options, parameters) options = @controller.send(:rewrite_options, parameters)
options.update(:only_path => true, :action => action) options.update(:only_path => true, :action => action)


url = ActionController::UrlRewriter.new(@request, parameters) url = ActionController::UrlRewriter.new(@request, parameters)
@request.set_REQUEST_URI(url.rewrite(options)) @request.set_REQUEST_URI(url.rewrite(options))
end
end end
end


def html_document def html_document
@html_document ||= HTML::Document.new(@response.body) @html_document ||= HTML::Document.new(@response.body)
end end


def find_tag(conditions) def find_tag(conditions)
html_document.find(conditions) html_document.find(conditions)
end end


def find_all_tag(conditions) def find_all_tag(conditions)
html_document.find_all(conditions) html_document.find_all(conditions)
end end


def method_missing(selector, *args) def method_missing(selector, *args)
return @controller.send(selector, *args) if ActionController::Routing::NamedRoutes::Helpers.include?(selector) return @controller.send(selector, *args) if ActionController::Routing::NamedRoutes::Helpers.include?(selector)
return super return super
end end


# A helper to make it easier to test different route configurations. # A helper to make it easier to test different route configurations.
# This method temporarily replaces ActionController::Routing::Routes # This method temporarily replaces ActionController::Routing::Routes
# with a new RouteSet instance. # with a new RouteSet instance.
# #
# The new instance is yielded to the passed block. Typically the block # The new instance is yielded to the passed block. Typically the block
# will create some routes using map.draw { map.connect ... }: # will create some routes using map.draw { map.connect ... }:
# #
# with_routing do |set| # with_routing do |set|
# set.draw { set.connect ':controller/:id/:action' } # set.draw { set.connect ':controller/:id/:action' }
# assert_equal( # assert_equal(
# ['/content/10/show', {}], # ['/content/10/show', {}],
# set.generate(:controller => 'content', :id => 10, :action => 'show') # set.generate(:controller => 'content', :id => 10, :action => 'show')
# ) # )
# end # end
# #
def with_routing def with_routing
real_routes = ActionController::Routing::Routes real_routes = ActionController::Routing::Routes
ActionController::Routing.send :remove_const, :Routes ActionController::Routing.send :remove_const, :Routes


temporary_routes = ActionController::Routing::RouteSet.new temporary_routes = ActionController::Routing::RouteSet.new
ActionController::Routing.send :const_set, :Routes, temporary_routes ActionController::Routing.send :const_set, :Routes, temporary_routes


yield temporary_routes yield temporary_routes
ensure ensure
if ActionController::Routing.const_defined? :Routes if ActionController::Routing.const_defined? :Routes
ActionController::Routing.send(:remove_const, :Routes) ActionController::Routing.send(:remove_const, :Routes)
end
ActionController::Routing.const_set(:Routes, real_routes) if real_routes
end end
ActionController::Routing.const_set(:Routes, real_routes) if real_routes
end
end end
end end


Expand Down

0 comments on commit abeb77b

Please sign in to comment.