mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
TestProcess belongs in AD
This commit is contained in:
parent
96deabace7
commit
ee395fe626
10 changed files with 109 additions and 129 deletions
|
@ -1,7 +1,6 @@
|
|||
require 'active_support/test_case'
|
||||
require 'rack/session/abstract/id'
|
||||
require 'action_controller/metal/testing'
|
||||
require 'action_controller/testing/process'
|
||||
require 'action_dispatch/test_case'
|
||||
|
||||
module ActionController
|
||||
|
@ -183,7 +182,7 @@ module ActionController
|
|||
#
|
||||
# assert_redirected_to page_url(:title => 'foo')
|
||||
class TestCase < ActiveSupport::TestCase
|
||||
include TestProcess
|
||||
include ActionDispatch::TestProcess
|
||||
|
||||
# Executes a request simulating GET HTTP method and set/volley the response
|
||||
def get(action, parameters = nil, session = nil, flash = nil)
|
||||
|
|
|
@ -1,111 +0,0 @@
|
|||
require 'active_support/core_ext/object/conversions'
|
||||
require "rack/test"
|
||||
|
||||
module ActionController #:nodoc:
|
||||
# Essentially generates a modified Tempfile object similar to the object
|
||||
# you'd get from the standard library CGI module in a multipart
|
||||
# request. This means you can use an ActionController::TestUploadedFile
|
||||
# object in the params of a test request in order to simulate
|
||||
# a file upload.
|
||||
#
|
||||
# Usage example, within a functional test:
|
||||
# post :change_avatar, :avatar => ActionController::TestUploadedFile.new(ActionController::TestCase.fixture_path + '/files/spongebob.png', 'image/png')
|
||||
#
|
||||
# Pass a true third parameter to ensure the uploaded file is opened in binary mode (only required for Windows):
|
||||
# post :change_avatar, :avatar => ActionController::TestUploadedFile.new(ActionController::TestCase.fixture_path + '/files/spongebob.png', 'image/png', :binary)
|
||||
TestUploadedFile = Rack::Test::UploadedFile
|
||||
|
||||
module TestProcess
|
||||
def assigns(key = nil)
|
||||
assigns = {}
|
||||
@controller.instance_variable_names.each do |ivar|
|
||||
next if ActionController::Base.protected_instance_variables.include?(ivar)
|
||||
assigns[ivar[1..-1]] = @controller.instance_variable_get(ivar)
|
||||
end
|
||||
|
||||
key.nil? ? assigns : assigns[key.to_s]
|
||||
end
|
||||
|
||||
def session
|
||||
@request.session
|
||||
end
|
||||
|
||||
def flash
|
||||
@request.flash
|
||||
end
|
||||
|
||||
def cookies
|
||||
@request.cookies.merge(@response.cookies)
|
||||
end
|
||||
|
||||
def redirect_to_url
|
||||
@response.redirect_url
|
||||
end
|
||||
|
||||
def html_document
|
||||
xml = @response.content_type =~ /xml$/
|
||||
@html_document ||= HTML::Document.new(@response.body, false, xml)
|
||||
end
|
||||
|
||||
def find_tag(conditions)
|
||||
html_document.find(conditions)
|
||||
end
|
||||
|
||||
def find_all_tag(conditions)
|
||||
html_document.find_all(conditions)
|
||||
end
|
||||
|
||||
def method_missing(selector, *args, &block)
|
||||
if @controller && ActionController::Routing::Routes.named_routes.helpers.include?(selector)
|
||||
@controller.send(selector, *args, &block)
|
||||
else
|
||||
super
|
||||
end
|
||||
end
|
||||
|
||||
# Shortcut for <tt>ActionController::TestUploadedFile.new(ActionController::TestCase.fixture_path + path, type)</tt>:
|
||||
#
|
||||
# post :change_avatar, :avatar => fixture_file_upload('/files/spongebob.png', 'image/png')
|
||||
#
|
||||
# To upload binary files on Windows, pass <tt>:binary</tt> as the last parameter.
|
||||
# This will not affect other platforms:
|
||||
#
|
||||
# post :change_avatar, :avatar => fixture_file_upload('/files/spongebob.png', 'image/png', :binary)
|
||||
def fixture_file_upload(path, mime_type = nil, binary = false)
|
||||
fixture_path = ActionController::TestCase.send(:fixture_path) if ActionController::TestCase.respond_to?(:fixture_path)
|
||||
ActionController::TestUploadedFile.new("#{fixture_path}#{path}", mime_type, binary)
|
||||
end
|
||||
|
||||
# A helper to make it easier to test different route configurations.
|
||||
# This method temporarily replaces ActionController::Routing::Routes
|
||||
# with a new RouteSet instance.
|
||||
#
|
||||
# The new instance is yielded to the passed block. Typically the block
|
||||
# will create some routes using <tt>map.draw { map.connect ... }</tt>:
|
||||
#
|
||||
# with_routing do |set|
|
||||
# set.draw do |map|
|
||||
# map.connect ':controller/:action/:id'
|
||||
# assert_equal(
|
||||
# ['/content/10/show', {}],
|
||||
# map.generate(:controller => 'content', :id => 10, :action => 'show')
|
||||
# end
|
||||
# end
|
||||
# end
|
||||
#
|
||||
def with_routing
|
||||
real_routes = ActionController::Routing::Routes
|
||||
ActionController::Routing.module_eval { remove_const :Routes }
|
||||
|
||||
temporary_routes = ActionController::Routing::RouteSet.new
|
||||
ActionController::Routing.module_eval { const_set :Routes, temporary_routes }
|
||||
|
||||
yield temporary_routes
|
||||
ensure
|
||||
if ActionController::Routing.const_defined? :Routes
|
||||
ActionController::Routing.module_eval { remove_const :Routes }
|
||||
end
|
||||
ActionController::Routing.const_set(:Routes, real_routes) if real_routes
|
||||
end
|
||||
end
|
||||
end
|
|
@ -1,3 +1,4 @@
|
|||
require "rack/test"
|
||||
require "action_dispatch/testing/assertions"
|
||||
require "action_dispatch/testing/integration"
|
||||
require "action_dispatch/testing/performance_test"
|
||||
|
|
|
@ -126,6 +126,46 @@ module ActionDispatch
|
|||
assert_generates(path.is_a?(Hash) ? path[:path] : path, options, defaults, extras, message)
|
||||
end
|
||||
|
||||
# A helper to make it easier to test different route configurations.
|
||||
# This method temporarily replaces ActionController::Routing::Routes
|
||||
# with a new RouteSet instance.
|
||||
#
|
||||
# The new instance is yielded to the passed block. Typically the block
|
||||
# will create some routes using <tt>map.draw { map.connect ... }</tt>:
|
||||
#
|
||||
# with_routing do |set|
|
||||
# set.draw do |map|
|
||||
# map.connect ':controller/:action/:id'
|
||||
# assert_equal(
|
||||
# ['/content/10/show', {}],
|
||||
# map.generate(:controller => 'content', :id => 10, :action => 'show')
|
||||
# end
|
||||
# end
|
||||
# end
|
||||
#
|
||||
def with_routing
|
||||
real_routes = ActionController::Routing::Routes
|
||||
ActionController::Routing.module_eval { remove_const :Routes }
|
||||
|
||||
temporary_routes = ActionController::Routing::RouteSet.new
|
||||
ActionController::Routing.module_eval { const_set :Routes, temporary_routes }
|
||||
|
||||
yield temporary_routes
|
||||
ensure
|
||||
if ActionController::Routing.const_defined? :Routes
|
||||
ActionController::Routing.module_eval { remove_const :Routes }
|
||||
end
|
||||
ActionController::Routing.const_set(:Routes, real_routes) if real_routes
|
||||
end
|
||||
|
||||
def method_missing(selector, *args, &block)
|
||||
if @controller && ActionController::Routing::Routes.named_routes.helpers.include?(selector)
|
||||
@controller.send(selector, *args, &block)
|
||||
else
|
||||
super
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
# Recognizes the route for a given path.
|
||||
def recognized_request_for(path, request_method = nil)
|
||||
|
|
|
@ -76,10 +76,10 @@ module ActionDispatch
|
|||
# # Assert that there is a "span" containing between 2 and 4 "em" tags
|
||||
# # as immediate children
|
||||
# assert_tag :tag => "span",
|
||||
# :children => { :count => 2..4, :only => { :tag => "em" } }
|
||||
# :children => { :count => 2..4, :only => { :tag => "em" } }
|
||||
#
|
||||
# # Get funky: assert that there is a "div", with an "ul" ancestor
|
||||
# # and an "li" parent (with "class" = "enum"), and containing a
|
||||
# # and an "li" parent (with "class" = "enum"), and containing a
|
||||
# # "span" descendant that contains text matching /hello world/
|
||||
# assert_tag :tag => "div",
|
||||
# :ancestor => { :tag => "ul" },
|
||||
|
@ -98,7 +98,7 @@ module ActionDispatch
|
|||
tag = find_tag(opts)
|
||||
assert tag, "expected tag, but no tag found matching #{opts.inspect} in:\n#{@response.body.inspect}"
|
||||
end
|
||||
|
||||
|
||||
# Identical to +assert_tag+, but asserts that a matching tag does _not_
|
||||
# exist. (See +assert_tag+ for a full discussion of the syntax.)
|
||||
#
|
||||
|
@ -118,6 +118,19 @@ module ActionDispatch
|
|||
tag = find_tag(opts)
|
||||
assert !tag, "expected no tag, but found tag matching #{opts.inspect} in:\n#{@response.body.inspect}"
|
||||
end
|
||||
|
||||
def find_tag(conditions)
|
||||
html_document.find(conditions)
|
||||
end
|
||||
|
||||
def find_all_tag(conditions)
|
||||
html_document.find_all(conditions)
|
||||
end
|
||||
|
||||
def html_document
|
||||
xml = @response.content_type =~ /xml$/
|
||||
@html_document ||= HTML::Document.new(@response.body, false, xml)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -2,9 +2,8 @@ require 'stringio'
|
|||
require 'uri'
|
||||
require 'active_support/test_case'
|
||||
require 'active_support/core_ext/object/metaclass'
|
||||
|
||||
# TODO: Remove circular dependency on ActionController
|
||||
require 'action_controller/testing/process'
|
||||
require 'action_dispatch/testing/test_process'
|
||||
require 'rack/test'
|
||||
|
||||
module ActionDispatch
|
||||
module Integration #:nodoc:
|
||||
|
@ -128,9 +127,7 @@ module ActionDispatch
|
|||
DEFAULT_HOST = "www.example.com"
|
||||
|
||||
include Test::Unit::Assertions
|
||||
include ActionDispatch::Assertions
|
||||
include ActionController::TestProcess
|
||||
include RequestHelpers
|
||||
include TestProcess, RequestHelpers, Assertions
|
||||
|
||||
%w( status status_message headers body redirect? ).each do |method|
|
||||
delegate method, :to => :response, :allow_nil => true
|
||||
|
|
42
actionpack/lib/action_dispatch/testing/test_process.rb
Normal file
42
actionpack/lib/action_dispatch/testing/test_process.rb
Normal file
|
@ -0,0 +1,42 @@
|
|||
module ActionDispatch
|
||||
module TestProcess
|
||||
def assigns(key = nil)
|
||||
assigns = {}
|
||||
@controller.instance_variable_names.each do |ivar|
|
||||
next if ActionController::Base.protected_instance_variables.include?(ivar)
|
||||
assigns[ivar[1..-1]] = @controller.instance_variable_get(ivar)
|
||||
end
|
||||
|
||||
key.nil? ? assigns : assigns[key.to_s]
|
||||
end
|
||||
|
||||
def session
|
||||
@request.session
|
||||
end
|
||||
|
||||
def flash
|
||||
@request.flash
|
||||
end
|
||||
|
||||
def cookies
|
||||
@request.cookies.merge(@response.cookies)
|
||||
end
|
||||
|
||||
def redirect_to_url
|
||||
@response.redirect_url
|
||||
end
|
||||
|
||||
# Shortcut for <tt>ARack::Test::UploadedFile.new(ActionController::TestCase.fixture_path + path, type)</tt>:
|
||||
#
|
||||
# post :change_avatar, :avatar => fixture_file_upload('/files/spongebob.png', 'image/png')
|
||||
#
|
||||
# To upload binary files on Windows, pass <tt>:binary</tt> as the last parameter.
|
||||
# This will not affect other platforms:
|
||||
#
|
||||
# post :change_avatar, :avatar => fixture_file_upload('/files/spongebob.png', 'image/png', :binary)
|
||||
def fixture_file_upload(path, mime_type = nil, binary = false)
|
||||
fixture_path = ActionController::TestCase.send(:fixture_path) if ActionController::TestCase.respond_to?(:fixture_path)
|
||||
Rack::Test::UploadedFile.new("#{fixture_path}#{path}", mime_type, binary)
|
||||
end
|
||||
end
|
||||
end
|
|
@ -39,8 +39,7 @@ module ActionView
|
|||
end
|
||||
end
|
||||
|
||||
include ActionDispatch::Assertions
|
||||
include ActionController::TestProcess
|
||||
include ActionDispatch::Assertions, ActionDispatch::TestProcess
|
||||
include ActionView::Context
|
||||
|
||||
include ActionController::PolymorphicRoutes
|
||||
|
|
|
@ -198,7 +198,7 @@ module ActionController
|
|||
Base.view_paths = FIXTURE_LOAD_PATH
|
||||
|
||||
class TestCase
|
||||
include TestProcess
|
||||
include ActionDispatch::TestProcess
|
||||
|
||||
def assert_template(options = {}, message = nil)
|
||||
validate_request!
|
||||
|
|
|
@ -563,7 +563,7 @@ XML
|
|||
expected = File.read(path)
|
||||
expected.force_encoding(Encoding::BINARY) if expected.respond_to?(:force_encoding)
|
||||
|
||||
file = ActionController::TestUploadedFile.new(path, content_type)
|
||||
file = Rack::Test::UploadedFile.new(path, content_type)
|
||||
assert_equal filename, file.original_filename
|
||||
assert_equal content_type, file.content_type
|
||||
assert_equal file.path, file.local_path
|
||||
|
@ -580,10 +580,10 @@ XML
|
|||
path = "#{FILES_DIR}/#{filename}"
|
||||
content_type = 'image/png'
|
||||
|
||||
binary_uploaded_file = ActionController::TestUploadedFile.new(path, content_type, :binary)
|
||||
binary_uploaded_file = Rack::Test::UploadedFile.new(path, content_type, :binary)
|
||||
assert_equal File.open(path, READ_BINARY).read, binary_uploaded_file.read
|
||||
|
||||
plain_uploaded_file = ActionController::TestUploadedFile.new(path, content_type)
|
||||
plain_uploaded_file = Rack::Test::UploadedFile.new(path, content_type)
|
||||
assert_equal File.open(path, READ_PLAIN).read, plain_uploaded_file.read
|
||||
end
|
||||
|
||||
|
@ -605,7 +605,7 @@ XML
|
|||
end
|
||||
|
||||
def test_test_uploaded_file_exception_when_file_doesnt_exist
|
||||
assert_raise(RuntimeError) { ActionController::TestUploadedFile.new('non_existent_file') }
|
||||
assert_raise(RuntimeError) { Rack::Test::UploadedFile.new('non_existent_file') }
|
||||
end
|
||||
|
||||
def test_redirect_url_only_cares_about_location_header
|
||||
|
|
Loading…
Reference in a new issue