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 'active_support/test_case'
|
||||||
require 'rack/session/abstract/id'
|
require 'rack/session/abstract/id'
|
||||||
require 'action_controller/metal/testing'
|
require 'action_controller/metal/testing'
|
||||||
require 'action_controller/testing/process'
|
|
||||||
require 'action_dispatch/test_case'
|
require 'action_dispatch/test_case'
|
||||||
|
|
||||||
module ActionController
|
module ActionController
|
||||||
|
@ -183,7 +182,7 @@ module ActionController
|
||||||
#
|
#
|
||||||
# assert_redirected_to page_url(:title => 'foo')
|
# assert_redirected_to page_url(:title => 'foo')
|
||||||
class TestCase < ActiveSupport::TestCase
|
class TestCase < ActiveSupport::TestCase
|
||||||
include TestProcess
|
include ActionDispatch::TestProcess
|
||||||
|
|
||||||
# Executes a request simulating GET HTTP method and set/volley the response
|
# Executes a request simulating GET HTTP method and set/volley the response
|
||||||
def get(action, parameters = nil, session = nil, flash = nil)
|
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/assertions"
|
||||||
require "action_dispatch/testing/integration"
|
require "action_dispatch/testing/integration"
|
||||||
require "action_dispatch/testing/performance_test"
|
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)
|
assert_generates(path.is_a?(Hash) ? path[:path] : path, options, defaults, extras, message)
|
||||||
end
|
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
|
private
|
||||||
# Recognizes the route for a given path.
|
# Recognizes the route for a given path.
|
||||||
def recognized_request_for(path, request_method = nil)
|
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
|
# # Assert that there is a "span" containing between 2 and 4 "em" tags
|
||||||
# # as immediate children
|
# # as immediate children
|
||||||
# assert_tag :tag => "span",
|
# 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
|
# # 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/
|
# # "span" descendant that contains text matching /hello world/
|
||||||
# assert_tag :tag => "div",
|
# assert_tag :tag => "div",
|
||||||
# :ancestor => { :tag => "ul" },
|
# :ancestor => { :tag => "ul" },
|
||||||
|
@ -98,7 +98,7 @@ module ActionDispatch
|
||||||
tag = find_tag(opts)
|
tag = find_tag(opts)
|
||||||
assert tag, "expected tag, but no tag found matching #{opts.inspect} in:\n#{@response.body.inspect}"
|
assert tag, "expected tag, but no tag found matching #{opts.inspect} in:\n#{@response.body.inspect}"
|
||||||
end
|
end
|
||||||
|
|
||||||
# Identical to +assert_tag+, but asserts that a matching tag does _not_
|
# Identical to +assert_tag+, but asserts that a matching tag does _not_
|
||||||
# exist. (See +assert_tag+ for a full discussion of the syntax.)
|
# exist. (See +assert_tag+ for a full discussion of the syntax.)
|
||||||
#
|
#
|
||||||
|
@ -118,6 +118,19 @@ module ActionDispatch
|
||||||
tag = find_tag(opts)
|
tag = find_tag(opts)
|
||||||
assert !tag, "expected no tag, but found tag matching #{opts.inspect} in:\n#{@response.body.inspect}"
|
assert !tag, "expected no tag, but found tag matching #{opts.inspect} in:\n#{@response.body.inspect}"
|
||||||
end
|
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
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -2,9 +2,8 @@ require 'stringio'
|
||||||
require 'uri'
|
require 'uri'
|
||||||
require 'active_support/test_case'
|
require 'active_support/test_case'
|
||||||
require 'active_support/core_ext/object/metaclass'
|
require 'active_support/core_ext/object/metaclass'
|
||||||
|
require 'action_dispatch/testing/test_process'
|
||||||
# TODO: Remove circular dependency on ActionController
|
require 'rack/test'
|
||||||
require 'action_controller/testing/process'
|
|
||||||
|
|
||||||
module ActionDispatch
|
module ActionDispatch
|
||||||
module Integration #:nodoc:
|
module Integration #:nodoc:
|
||||||
|
@ -128,9 +127,7 @@ module ActionDispatch
|
||||||
DEFAULT_HOST = "www.example.com"
|
DEFAULT_HOST = "www.example.com"
|
||||||
|
|
||||||
include Test::Unit::Assertions
|
include Test::Unit::Assertions
|
||||||
include ActionDispatch::Assertions
|
include TestProcess, RequestHelpers, Assertions
|
||||||
include ActionController::TestProcess
|
|
||||||
include RequestHelpers
|
|
||||||
|
|
||||||
%w( status status_message headers body redirect? ).each do |method|
|
%w( status status_message headers body redirect? ).each do |method|
|
||||||
delegate method, :to => :response, :allow_nil => true
|
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
|
||||||
end
|
end
|
||||||
|
|
||||||
include ActionDispatch::Assertions
|
include ActionDispatch::Assertions, ActionDispatch::TestProcess
|
||||||
include ActionController::TestProcess
|
|
||||||
include ActionView::Context
|
include ActionView::Context
|
||||||
|
|
||||||
include ActionController::PolymorphicRoutes
|
include ActionController::PolymorphicRoutes
|
||||||
|
|
|
@ -198,7 +198,7 @@ module ActionController
|
||||||
Base.view_paths = FIXTURE_LOAD_PATH
|
Base.view_paths = FIXTURE_LOAD_PATH
|
||||||
|
|
||||||
class TestCase
|
class TestCase
|
||||||
include TestProcess
|
include ActionDispatch::TestProcess
|
||||||
|
|
||||||
def assert_template(options = {}, message = nil)
|
def assert_template(options = {}, message = nil)
|
||||||
validate_request!
|
validate_request!
|
||||||
|
|
|
@ -563,7 +563,7 @@ XML
|
||||||
expected = File.read(path)
|
expected = File.read(path)
|
||||||
expected.force_encoding(Encoding::BINARY) if expected.respond_to?(:force_encoding)
|
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 filename, file.original_filename
|
||||||
assert_equal content_type, file.content_type
|
assert_equal content_type, file.content_type
|
||||||
assert_equal file.path, file.local_path
|
assert_equal file.path, file.local_path
|
||||||
|
@ -580,10 +580,10 @@ XML
|
||||||
path = "#{FILES_DIR}/#{filename}"
|
path = "#{FILES_DIR}/#{filename}"
|
||||||
content_type = 'image/png'
|
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
|
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
|
assert_equal File.open(path, READ_PLAIN).read, plain_uploaded_file.read
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -605,7 +605,7 @@ XML
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_test_uploaded_file_exception_when_file_doesnt_exist
|
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
|
end
|
||||||
|
|
||||||
def test_redirect_url_only_cares_about_location_header
|
def test_redirect_url_only_cares_about_location_header
|
||||||
|
|
Loading…
Reference in a new issue