git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@4 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
This commit is contained in:
David Heinemeier Hansson
2004-11-24 01:04:44 +00:00
commit db045dbbf6
296 changed files with 30881 additions and 0 deletions

View File

@@ -0,0 +1,9 @@
$:.unshift(File.dirname(__FILE__) + '/../lib')
require 'test/unit'
require 'action_controller'
require 'action_controller/test_process'
ActionController::Base.logger = nil
ActionController::Base.ignore_missing_templates = true

View File

@@ -0,0 +1,323 @@
require File.dirname(__FILE__) + '/../abstract_unit'
# a controller class to facilitate the tests
class ActionPackAssertionsController < ActionController::Base
# this does absolutely nothing
def nothing() render_text ""; end
# a standard template
def hello_world() render "test/hello_world"; end
# a standard template
def hello_xml_world() render "test/hello_xml_world"; end
# a redirect to an internal location
def redirect_internal() redirect_to "nothing"; end
# a redirect to an external location
def redirect_external() redirect_to_url "http://www.rubyonrails.org"; end
# a 404
def response404() render_text "", "404 AWOL"; end
# a 500
def response500() render_text "", "500 Sorry"; end
# a fictional 599
def response599() render_text "", "599 Whoah!"; end
# putting stuff in the flash
def flash_me
flash['hello'] = 'my name is inigo montoya...'
render_text "Inconceivable!"
end
# we have a flash, but nothing is in it
def flash_me_naked
flash.clear
render_text "wow!"
end
# assign some template instance variables
def assign_this
@howdy = "ho"
render_text "Mr. Henke"
end
def render_based_on_parameters
render_text "Mr. #{@params["name"]}"
end
# puts something in the session
def session_stuffing
session['xmas'] = 'turkey'
render_text "ho ho ho"
end
# 911
def rescue_action(e) raise; end
end
# ---------------------------------------------------------------------------
# tell the controller where to find its templates but start from parent
# directory of test_request_response to simulate the behaviour of a
# production environment
ActionPackAssertionsController.template_root = File.dirname(__FILE__) + "/../fixtures/"
# a test case to exercise the new capabilities TestRequest & TestResponse
class ActionPackAssertionsControllerTest < Test::Unit::TestCase
# let's get this party started
def setup
@controller = ActionPackAssertionsController.new
@request, @response = ActionController::TestRequest.new, ActionController::TestResponse.new
end
# -- assertion-based testing ------------------------------------------------
# test the session assertion to make sure something is there.
def test_assert_session_has
process :session_stuffing
assert_session_has 'xmas'
assert_session_has_no 'halloween'
end
# test the assertion of goodies in the template
def test_assert_template_has
process :assign_this
assert_template_has 'howdy'
end
# test the assertion for goodies that shouldn't exist in the template
def test_assert_template_has_no
process :nothing
assert_template_has_no 'maple syrup'
assert_template_has_no 'howdy'
end
# test the redirection assertions
def test_assert_redirect
process :redirect_internal
assert_redirect
end
# test the redirect url string
def test_assert_redirect_url
process :redirect_external
assert_redirect_url 'http://www.rubyonrails.org'
end
# test the redirection pattern matching on a string
def test_assert_redirect_url_match_string
process :redirect_external
assert_redirect_url_match 'rails.org'
end
# test the redirection pattern matching on a pattern
def test_assert_redirect_url_match_pattern
process :redirect_external
assert_redirect_url_match /ruby/
end
# test the flash-based assertions with something is in the flash
def test_flash_assertions_full
process :flash_me
assert @response.has_flash_with_contents?
assert_flash_exists
assert ActionController::TestResponse.assertion_target.has_flash_with_contents?
assert_flash_not_empty
assert_flash_has 'hello'
assert_flash_has_no 'stds'
end
# test the flash-based assertions with no flash at all
def test_flash_assertions_negative
process :nothing
assert_flash_not_exists
assert_flash_empty
assert_flash_has_no 'hello'
assert_flash_has_no 'qwerty'
end
# test the assert_rendered_file
def test_assert_rendered_file
process :hello_world
assert_rendered_file 'test/hello_world'
assert_rendered_file 'hello_world'
assert_rendered_file
end
# test the assert_success assertion
def test_assert_success
process :nothing
assert_success
end
# -- standard request/reponse object testing --------------------------------
# ensure our session is working properly
def test_session_objects
process :session_stuffing
assert @response.has_session_object?('xmas')
assert_session_equal 'turkey', 'xmas'
assert !@response.has_session_object?('easter')
end
# make sure that the template objects exist
def test_template_objects_alive
process :assign_this
assert !@response.has_template_object?('hi')
assert @response.has_template_object?('howdy')
end
# make sure we don't have template objects when we shouldn't
def test_template_object_missing
process :nothing
assert_nil @response.template_objects['howdy']
end
def test_assigned_equal
process :assign_this
assert_assigned_equal "ho", :howdy
end
# check the empty flashing
def test_flash_me_naked
process :flash_me_naked
assert @response.has_flash?
assert !@response.has_flash_with_contents?
end
# check if we have flash objects
def test_flash_haves
process :flash_me
assert @response.has_flash?
assert @response.has_flash_with_contents?
assert @response.has_flash_object?('hello')
end
# ensure we don't have flash objects
def test_flash_have_nots
process :nothing
assert !@response.has_flash?
assert !@response.has_flash_with_contents?
assert_nil @response.flash['hello']
end
# examine that the flash objects are what we expect
def test_flash_equals
process :flash_me
assert_flash_equal 'my name is inigo montoya...', 'hello'
end
# check if we were rendered by a file-based template?
def test_rendered_action
process :nothing
assert !@response.rendered_with_file?
process :hello_world
assert @response.rendered_with_file?
assert 'hello_world', @response.rendered_file
end
# check the redirection location
def test_redirection_location
process :redirect_internal
assert_equal 'nothing', @response.redirect_url
process :redirect_external
assert_equal 'http://www.rubyonrails.org', @response.redirect_url
process :nothing
assert_nil @response.redirect_url
end
# check server errors
def test_server_error_response_code
process :response500
assert @response.server_error?
process :response599
assert @response.server_error?
process :response404
assert !@response.server_error?
end
# check a 404 response code
def test_missing_response_code
process :response404
assert @response.missing?
end
# check to see if our redirection matches a pattern
def test_redirect_url_match
process :redirect_external
assert @response.redirect?
assert @response.redirect_url_match?("rubyonrails")
assert @response.redirect_url_match?(/rubyonrails/)
assert !@response.redirect_url_match?("phpoffrails")
assert !@response.redirect_url_match?(/perloffrails/)
end
# check for a redirection
def test_redirection
process :redirect_internal
assert @response.redirect?
process :redirect_external
assert @response.redirect?
process :nothing
assert !@response.redirect?
end
# check a successful response code
def test_successful_response_code
process :nothing
assert @response.success?
end
# a basic check to make sure we have a TestResponse object
def test_has_response
process :nothing
assert_kind_of ActionController::TestResponse, @response
end
def test_render_based_on_parameters
process :render_based_on_parameters, "name" => "David"
assert_equal "Mr. David", @response.body
end
def test_simple_one_element_xpath_match
process :hello_xml_world
assert_template_xpath_match('//title', "Hello World")
end
def test_array_of_elements_in_xpath_match
process :hello_xml_world
assert_template_xpath_match('//p', %w( abes monks wiseguys ))
end
end
class ActionPackHeaderTest < Test::Unit::TestCase
def setup
@controller = ActionPackAssertionsController.new
@request, @response = ActionController::TestRequest.new, ActionController::TestResponse.new
end
def test_rendering_xml_sets_content_type
process :hello_xml_world
assert_equal('text/xml', @controller.headers['Content-Type'])
end
def test_rendering_xml_respects_content_type
@response.headers['Content-Type'] = 'application/pdf'
process :hello_xml_world
assert_equal('application/pdf', @controller.headers['Content-Type'])
end
end

View File

@@ -0,0 +1,119 @@
path_to_ar = File.dirname(__FILE__) + '/../../../activerecord'
if Object.const_defined?("ActiveRecord") || File.exist?(path_to_ar)
# This test is very different than the others. It requires ActiveRecord to
# run. There's a bunch of stuff we are assuming here:
#
# 1. activerecord exists as a sibling directory to actionpack
# (i.e., actionpack/../activerecord)
# 2. you've created the appropriate database to run the active_record unit tests
# 3. you set the appropriate database connection below
driver_to_use = 'native_sqlite'
$: << path_to_ar + '/lib/'
$: << path_to_ar + '/test/'
require 'active_record' unless Object.const_defined?("ActiveRecord")
require "connections/#{driver_to_use}/connection"
require 'fixtures/company'
# -----------------------------------------------------------------------------
# add some validation rules to trip up the assertions
class Company
def validate
errors.add_on_empty('name')
errors.add('rating', 'rating should not be 2') if rating == 2
errors.add_to_base('oh oh') if rating == 3
end
end
# -----------------------------------------------------------------------------
require File.dirname(__FILE__) + '/../abstract_unit'
# a controller class to handle the AR assertions
class ActiveRecordAssertionsController < ActionController::Base
# fail with 1 bad column
def nasty_columns_1
@company = Company.new
@company.name = "B"
@company.rating = 2
render_text "snicker...."
end
# fail with 2 bad column
def nasty_columns_2
@company = Company.new
@company.name = ""
@company.rating = 2
render_text "double snicker...."
end
# this will pass validation
def good_company
@company = Company.new
@company.name = "A"
@company.rating = 69
render_text "Goodness Gracious!"
end
# this will fail validation
def bad_company
@company = Company.new
render_text "Who's Bad?"
end
# the safety dance......
def rescue_action(e) raise; end
end
# -----------------------------------------------------------------------------
ActiveRecordAssertionsController.template_root = File.dirname(__FILE__) + "/../fixtures/"
# The test case to try the AR assertions
class ActiveRecordAssertionsControllerTest < Test::Unit::TestCase
# set it up
def setup
@request = ActionController::TestRequest.new
@response = ActionController::TestResponse.new
@controller = ActiveRecordAssertionsController.new
end
# test for 1 bad apple column
def test_some_invalid_columns
process :nasty_columns_1
assert_success
assert_invalid_record 'company'
assert_invalid_column_on_record 'company', 'rating'
assert_valid_column_on_record 'company', 'name'
assert_valid_column_on_record 'company', ['name','id']
end
# test for 2 bad apples columns
def test_all_invalid_columns
process :nasty_columns_2
assert_success
assert_invalid_record 'company'
assert_invalid_column_on_record 'company', 'rating'
assert_invalid_column_on_record 'company', 'name'
assert_invalid_column_on_record 'company', ['name','rating']
end
# ensure we have no problems with an ActiveRecord
def test_valid_record
process :good_company
assert_success
assert_valid_record 'company'
end
# ensure we have problems with an ActiveRecord
def test_invalid_record
process :bad_company
assert_success
assert_invalid_record 'company'
end
end
end

View File

@@ -0,0 +1,142 @@
$:.unshift(File.dirname(__FILE__) + '/../../lib')
require 'test/unit'
require 'action_controller/cgi_ext/cgi_methods'
require 'stringio'
class MockUploadedFile < StringIO
def content_type
"img/jpeg"
end
def original_filename
"my_file.doc"
end
end
class CGITest < Test::Unit::TestCase
def setup
@query_string = "action=create_customer&full_name=David%20Heinemeier%20Hansson&customerId=1"
@query_string_with_nil = "action=create_customer&full_name="
@query_string_with_array = "action=create_customer&selected[]=1&selected[]=2&selected[]=3"
@query_string_with_amps = "action=create_customer&name=Don%27t+%26+Does"
@query_string_with_multiple_of_same_name =
"action=update_order&full_name=Lau%20Taarnskov&products=4&products=2&products=3"
end
def test_query_string
assert_equal(
{ "action" => "create_customer", "full_name" => "David Heinemeier Hansson", "customerId" => "1"},
CGIMethods.parse_query_parameters(@query_string)
)
end
def test_query_string_with_nil
assert_equal(
{ "action" => "create_customer", "full_name" => nil},
CGIMethods.parse_query_parameters(@query_string_with_nil)
)
end
def test_query_string_with_array
assert_equal(
{ "action" => "create_customer", "selected" => ["1", "2", "3"]},
CGIMethods.parse_query_parameters(@query_string_with_array)
)
end
def test_query_string_with_amps
assert_equal(
{ "action" => "create_customer", "name" => "Don't & Does"},
CGIMethods.parse_query_parameters(@query_string_with_amps)
)
end
def test_parse_params
input = {
"customers[boston][first][name]" => [ "David" ],
"customers[boston][first][url]" => [ "http://David" ],
"customers[boston][second][name]" => [ "Allan" ],
"customers[boston][second][url]" => [ "http://Allan" ],
"something_else" => [ "blah" ],
"something_nil" => [ nil ],
"something_empty" => [ "" ],
"products[first]" => [ "Apple Computer" ],
"products[second]" => [ "Pc" ]
}
expected_output = {
"customers" => {
"boston" => {
"first" => {
"name" => "David",
"url" => "http://David"
},
"second" => {
"name" => "Allan",
"url" => "http://Allan"
}
}
},
"something_else" => "blah",
"something_empty" => "",
"something_nil" => "",
"products" => {
"first" => "Apple Computer",
"second" => "Pc"
}
}
assert_equal expected_output, CGIMethods.parse_request_parameters(input)
end
def test_parse_params_from_multipart_upload
mock_file = MockUploadedFile.new
input = {
"something" => [ StringIO.new("") ],
"products[string]" => [ StringIO.new("Apple Computer") ],
"products[file]" => [ mock_file ]
}
expected_output = {
"something" => "",
"products" => {
"string" => "Apple Computer",
"file" => mock_file
}
}
assert_equal expected_output, CGIMethods.parse_request_parameters(input)
end
def test_parse_params_with_file
input = {
"customers[boston][first][name]" => [ "David" ],
"something_else" => [ "blah" ],
"logo" => [ File.new(File.dirname(__FILE__) + "/cgi_test.rb").path ]
}
expected_output = {
"customers" => {
"boston" => {
"first" => {
"name" => "David"
}
}
},
"something_else" => "blah",
"logo" => File.new(File.dirname(__FILE__) + "/cgi_test.rb").path,
}
assert_equal expected_output, CGIMethods.parse_request_parameters(input)
end
def test_parse_params_with_array
input = { "selected[]" => [ "1", "2", "3" ] }
expected_output = { "selected" => [ "1", "2", "3" ] }
assert_equal expected_output, CGIMethods.parse_request_parameters(input)
end
end

View File

@@ -0,0 +1,38 @@
require File.dirname(__FILE__) + '/../abstract_unit'
class CookieTest < Test::Unit::TestCase
class TestController < ActionController::Base
def authenticate
cookie "name" => "user_name", "value" => "david"
render_text "hello world"
end
def access_frozen_cookies
@cookies["wont"] = "work"
end
def rescue_action(e) raise end
end
def setup
@request = ActionController::TestRequest.new
@response = ActionController::TestResponse.new
@request.host = "www.nextangle.com"
end
def test_setting_cookie
@request.action = "authenticate"
assert_equal [ CGI::Cookie::new("name" => "user_name", "value" => "david") ], process_request.headers["cookie"]
end
def test_setting_cookie
@request.action = "access_frozen_cookies"
assert_raises(TypeError) { process_request }
end
private
def process_request
TestController.process(@request, @response)
end
end

View File

@@ -0,0 +1,159 @@
require File.dirname(__FILE__) + '/../abstract_unit'
class FilterTest < Test::Unit::TestCase
class TestController < ActionController::Base
before_filter :ensure_login
def show
render_text "ran action"
end
private
def ensure_login
@ran_filter ||= []
@ran_filter << "ensure_login"
end
end
class PrependingController < TestController
prepend_before_filter :wonderful_life
private
def wonderful_life
@ran_filter ||= []
@ran_filter << "wonderful_life"
end
end
class ProcController < PrependingController
before_filter(proc { |c| c.assigns["ran_proc_filter"] = true })
end
class ImplicitProcController < PrependingController
before_filter { |c| c.assigns["ran_proc_filter"] = true }
end
class AuditFilter
def self.filter(controller)
controller.assigns["was_audited"] = true
end
end
class AroundFilter
def before(controller)
@execution_log = "before"
controller.class.execution_log << " before aroundfilter " if controller.respond_to? :execution_log
controller.assigns["before_ran"] = true
end
def after(controller)
controller.assigns["execution_log"] = @execution_log + " and after"
controller.assigns["after_ran"] = true
controller.class.execution_log << " after aroundfilter " if controller.respond_to? :execution_log
end
end
class AppendedAroundFilter
def before(controller)
controller.class.execution_log << " before appended aroundfilter "
end
def after(controller)
controller.class.execution_log << " after appended aroundfilter "
end
end
class AuditController < ActionController::Base
before_filter(AuditFilter)
def show
render_text "hello"
end
end
class BadFilterController < ActionController::Base
before_filter 2
def show() "show" end
protected
def rescue_action(e) raise(e) end
end
class AroundFilterController < PrependingController
around_filter AroundFilter.new
end
class MixedFilterController < PrependingController
cattr_accessor :execution_log
def initialize
@@execution_log = ""
end
before_filter { |c| c.class.execution_log << " before procfilter " }
prepend_around_filter AroundFilter.new
after_filter { |c| c.class.execution_log << " after procfilter " }
append_around_filter AppendedAroundFilter.new
end
def test_added_filter_to_inheritance_graph
assert_equal [ :fire_flash, :ensure_login ], TestController.before_filters
end
def test_base_class_in_isolation
assert_equal [ :fire_flash ], ActionController::Base.before_filters
end
def test_prepending_filter
assert_equal [ :wonderful_life, :fire_flash, :ensure_login ], PrependingController.before_filters
end
def test_running_filters
assert_equal %w( wonderful_life ensure_login ), test_process(PrependingController).template.assigns["ran_filter"]
end
def test_running_filters_with_proc
assert test_process(ProcController).template.assigns["ran_proc_filter"]
end
def test_running_filters_with_implicit_proc
assert test_process(ImplicitProcController).template.assigns["ran_proc_filter"]
end
def test_running_filters_with_class
assert test_process(AuditController).template.assigns["was_audited"]
end
def test_bad_filter
assert_raises(ActionController::ActionControllerError) {
test_process(BadFilterController)
}
end
def test_around_filter
controller = test_process(AroundFilterController)
assert controller.template.assigns["before_ran"]
assert controller.template.assigns["after_ran"]
end
def test_having_properties_in_around_filter
controller = test_process(AroundFilterController)
assert_equal "before and after", controller.template.assigns["execution_log"]
end
def test_prepending_and_appending_around_filter
controller = test_process(MixedFilterController)
assert_equal " before aroundfilter before procfilter before appended aroundfilter " +
" after appended aroundfilter after aroundfilter after procfilter ",
MixedFilterController.execution_log
end
private
def test_process(controller)
request = ActionController::TestRequest.new
request.action = "show"
controller.process(request, ActionController::TestResponse.new)
end
end

View File

@@ -0,0 +1,69 @@
require File.dirname(__FILE__) + '/../abstract_unit'
class FlashTest < Test::Unit::TestCase
class TestController < ActionController::Base
def set_flash
flash["that"] = "hello"
render_text "hello"
end
def use_flash
@flashy = flash["that"]
render_text "hello"
end
def use_flash_and_keep_it
@flashy = flash["that"]
keep_flash
render_text "hello"
end
def rescue_action(e)
raise unless ActionController::MissingTemplate === e
end
end
def setup
initialize_request_and_response
end
def test_flash
@request.action = "set_flash"
response = process_request
@request.action = "use_flash"
first_response = process_request
assert_equal "hello", first_response.template.assigns["flash"]["that"]
assert_equal "hello", first_response.template.assigns["flashy"]
second_response = process_request
assert_nil second_response.template.assigns["flash"]["that"], "On second flash"
end
def test_keep_flash
@request.action = "set_flash"
response = process_request
@request.action = "use_flash_and_keep_it"
first_response = process_request
assert_equal "hello", first_response.template.assigns["flash"]["that"]
assert_equal "hello", first_response.template.assigns["flashy"]
@request.action = "use_flash"
second_response = process_request
assert_equal "hello", second_response.template.assigns["flash"]["that"], "On second flash"
third_response = process_request
assert_nil third_response.template.assigns["flash"]["that"], "On third flash"
end
private
def initialize_request_and_response
@request = ActionController::TestRequest.new
@response = ActionController::TestResponse.new
end
def process_request
TestController.process(@request, @response)
end
end

View File

@@ -0,0 +1,110 @@
require File.dirname(__FILE__) + '/../abstract_unit'
class HelperTest < Test::Unit::TestCase
HELPER_PATHS = %w(/../fixtures/helpers)
class TestController < ActionController::Base
attr_accessor :delegate_attr
def delegate_method() end
def rescue_action(e) raise end
end
module LocalAbcHelper
def a() end
def b() end
def c() end
end
def setup
# Increment symbol counter.
@symbol = (@@counter ||= 'A0').succ!.dup
# Generate new controller class.
controller_class_name = "Helper#{@symbol}Controller"
eval("class #{controller_class_name} < TestController; end")
@controller_class = self.class.const_get(controller_class_name)
# Generate new template class and assign to controller.
template_class_name = "Test#{@symbol}View"
eval("class #{template_class_name} < ActionView::Base; end")
@template_class = self.class.const_get(template_class_name)
@controller_class.template_class = @template_class
# Add helper paths to LOAD_PATH.
HELPER_PATHS.each { |path|
$LOAD_PATH.unshift(File.dirname(__FILE__) + path)
}
# Set default test helper.
self.test_helper = LocalAbcHelper
end
def teardown
# Reset template class.
#ActionController::Base.template_class = ActionView::Base
# Remove helper paths from LOAD_PATH.
HELPER_PATHS.each { |path|
$LOAD_PATH.delete(File.dirname(__FILE__) + path)
}
end
def test_deprecated_helper
assert_equal helper_methods, missing_methods
assert_nothing_raised { @controller_class.helper TestHelper }
assert_equal [], missing_methods
end
def test_declare_helper
require 'abc_helper'
self.test_helper = AbcHelper
assert_equal helper_methods, missing_methods
assert_nothing_raised { @controller_class.helper :abc }
assert_equal [], missing_methods
end
def test_declare_missing_helper
assert_equal helper_methods, missing_methods
assert_raise(LoadError) { @controller_class.helper :missing }
end
def test_helper_block
assert_nothing_raised {
@controller_class.helper { def block_helper_method; end }
}
assert template_methods.include?('block_helper_method')
end
def test_helper_block_include
assert_equal helper_methods, missing_methods
assert_nothing_raised {
@controller_class.helper { include TestHelper }
}
assert [], missing_methods
end
def test_helper_method
assert_nothing_raised { @controller_class.helper_method :delegate_method }
assert template_methods.include?('delegate_method')
end
def test_helper_attr
assert_nothing_raised { @controller_class.helper_attr :delegate_attr }
assert template_methods.include?('delegate_attr')
assert template_methods.include?('delegate_attr=')
end
private
def helper_methods; TestHelper.instance_methods end
def template_methods; @template_class.instance_methods end
def missing_methods; helper_methods - template_methods end
def test_helper=(helper_module)
old_verbose, $VERBOSE = $VERBOSE, nil
self.class.const_set('TestHelper', helper_module)
$VERBOSE = old_verbose
end
end

View File

@@ -0,0 +1,49 @@
require File.dirname(__FILE__) + '/../abstract_unit'
class TestLayoutController < ActionController::Base
layout "layouts/standard"
def hello_world
end
def hello_world_outside_layout
end
def rescue_action(e) raise end
end
class ChildWithoutTestLayoutController < TestLayoutController
layout nil
def hello_world
end
end
class ChildWithOtherTestLayoutController < TestLayoutController
layout nil
def hello_world
end
end
class RenderTest < Test::Unit::TestCase
def setup
@request = ActionController::TestRequest.new
@response = ActionController::TestResponse.new
@request.host = "www.nextangle.com"
end
def test_layout_rendering
@request.action = "hello_world"
response = process_request
assert_equal "200 OK", response.headers["Status"]
assert_equal "layouts/standard", response.template.template_name
end
private
def process_request
TestLayoutController.process(@request, @response)
end
end

View File

@@ -0,0 +1,44 @@
require File.dirname(__FILE__) + '/../abstract_unit'
class RedirectTest < Test::Unit::TestCase
class RedirectController < ActionController::Base
def simple_redirect
redirect_to :action => "hello_world"
end
def method_redirect
redirect_to :dashbord_url, 1, "hello"
end
def rescue_errors(e) raise e end
protected
def dashbord_url(id, message)
url_for :action => "dashboard", :params => { "id" => id, "message" => message }
end
end
def setup
@request = ActionController::TestRequest.new
@response = ActionController::TestResponse.new
end
def test_simple_redirect
@request.path = "/redirect/simple_redirect"
@request.action = "simple_redirect"
response = process_request
assert_equal "http://test.host/redirect/hello_world", response.headers["location"]
end
def test_redirect_with_method_reference_and_parameters
@request.path = "/redirect/method_redirect"
@request.action = "method_redirect"
response = process_request
assert_equal "http://test.host/redirect/dashboard?message=hello&id=1", response.headers["location"]
end
private
def process_request
RedirectController.process(@request, @response)
end
end

View File

@@ -0,0 +1,178 @@
require File.dirname(__FILE__) + '/../abstract_unit'
Customer = Struct.new("Customer", :name)
class RenderTest < Test::Unit::TestCase
class TestController < ActionController::Base
layout :determine_layout
def hello_world
end
def render_hello_world
render "test/hello_world"
end
def render_hello_world_from_variable
@person = "david"
render_text "hello #{@person}"
end
def render_action_hello_world
render_action "hello_world"
end
def render_text_hello_world
render_text "hello world"
end
def render_custom_code
render_text "hello world", "404 Moved"
end
def render_xml_hello
@name = "David"
render "test/hello"
end
def greeting
# let's just rely on the template
end
def layout_test
render_action "hello_world"
end
def builder_layout_test
render_action "hello"
end
def partials_list
@customers = [ Customer.new("david"), Customer.new("mary") ]
render_action "list"
end
def modgreet
end
def rescue_action(e) raise end
private
def determine_layout
case action_name
when "layout_test": "layouts/standard"
when "builder_layout_test": "layouts/builder"
end
end
end
TestController.template_root = File.dirname(__FILE__) + "/../fixtures/"
class TestLayoutController < ActionController::Base
layout "layouts/standard"
def hello_world
end
def hello_world_outside_layout
end
def rescue_action(e)
raise unless ActionController::MissingTemplate === e
end
end
def setup
@request = ActionController::TestRequest.new
@response = ActionController::TestResponse.new
@request.host = "www.nextangle.com"
end
def test_simple_show
@request.action = "hello_world"
response = process_request
assert_equal "200 OK", response.headers["Status"]
assert_equal "test/hello_world", response.template.first_render
end
def test_do_with_render
@request.action = "render_hello_world"
assert_equal "test/hello_world", process_request.template.first_render
end
def test_do_with_render_from_variable
@request.action = "render_hello_world_from_variable"
assert_equal "hello david", process_request.body
end
def test_do_with_render_action
@request.action = "render_action_hello_world"
assert_equal "test/hello_world", process_request.template.first_render
end
def test_do_with_render_text
@request.action = "render_text_hello_world"
assert_equal "hello world", process_request.body
end
def test_do_with_render_custom_code
@request.action = "render_custom_code"
assert_equal "404 Moved", process_request.headers["Status"]
end
def test_attempt_to_access_object_method
@request.action = "clone"
assert_raises(ActionController::UnknownAction, "No action responded to [clone]") { process_request }
end
def test_access_to_request_in_view
ActionController::Base.view_controller_internals = false
@request.action = "hello_world"
response = process_request
assert_nil response.template.assigns["request"]
ActionController::Base.view_controller_internals = true
@request.action = "hello_world"
response = process_request
assert_kind_of ActionController::AbstractRequest, response.template.assigns["request"]
end
def test_render_xml
@request.action = "render_xml_hello"
assert_equal "<html>\n <p>Hello David</p>\n<p>This is grand!</p>\n</html>\n", process_request.body
end
def test_render_xml_with_default
@request.action = "greeting"
assert_equal "<p>This is grand!</p>\n", process_request.body
end
def test_layout_rendering
@request.action = "layout_test"
assert_equal "<html>Hello world!</html>", process_request.body
end
def test_render_xml_with_layouts
@request.action = "builder_layout_test"
assert_equal "<wrapper>\n<html>\n <p>Hello </p>\n<p>This is grand!</p>\n</html>\n</wrapper>\n", process_request.body
end
def test_partials_list
@request.action = "partials_list"
assert_equal "Hello: davidHello: mary", process_request.body
end
def test_module_rendering
@request.action = "modgreet"
@request.parameters["module"] = "scope"
assert_equal "<p>Beautiful modules!</p>", process_request.body
end
private
def process_request
TestController.process(@request, @response)
end
end

View File

@@ -0,0 +1,68 @@
require File.join(File.dirname(__FILE__), '..', 'abstract_unit')
module TestFileUtils
def file_name() File.basename(__FILE__) end
def file_path() File.expand_path(__FILE__) end
def file_data() File.open(file_path, 'rb') { |f| f.read } end
end
class SendFileController < ActionController::Base
include TestFileUtils
attr_writer :options
def options() @options ||= {} end
def file() send_file(file_path, options) end
def data() send_data(file_data, options) end
def rescue_action(e) raise end
end
class SendFileTest < Test::Unit::TestCase
include TestFileUtils
def setup
@controller = SendFileController.new
@request = ActionController::TestRequest.new
@response = ActionController::TestResponse.new
end
def test_file_nostream
@controller.options = { :stream => false }
response = nil
assert_nothing_raised { response = process('file') }
assert_not_nil response
assert_kind_of String, response.body
assert_equal file_data, response.body
end
def test_file_stream
response = nil
assert_nothing_raised { response = process('file') }
assert_not_nil response
assert_kind_of Proc, response.body
old_stdout = $stdout
begin
require 'stringio'
$stdout = StringIO.new
$stdout.binmode
assert_nothing_raised { response.body.call }
assert_equal file_data, $stdout.string
ensure
$stdout = old_stdout
end
end
def test_data
response = nil
assert_nothing_raised { response = process('data') }
assert_not_nil response
assert_kind_of String, response.body
assert_equal file_data, response.body
end
end

View File

@@ -0,0 +1,368 @@
require File.dirname(__FILE__) + '/../abstract_unit'
require 'action_controller/url_rewriter'
MockRequest = Struct.new("MockRequest", :protocol, :host, :port, :path, :parameters)
class MockRequest
def host_with_port
if (protocol == "http://" && port == 80) || (protocol == "https://" && port == 443)
host
else
host + ":#{port}"
end
end
end
class UrlTest < Test::Unit::TestCase
def setup
@library_url = ActionController::UrlRewriter.new(MockRequest.new(
"http://",
"www.singlefile.com",
80,
"/library/books/ISBN/0743536703/show",
{ "type" => "ISBN", "code" => "0743536703" }
), "books", "show")
@library_url_on_index = ActionController::UrlRewriter.new(MockRequest.new(
"http://",
"www.singlefile.com",
80,
"/library/books/ISBN/0743536703/",
{ "type" => "ISBN", "code" => "0743536703" }
), "books", "index")
@clean_urls = [
ActionController::UrlRewriter.new(MockRequest.new(
"http://", "www.singlefile.com", 80, "/identity/", {}
), "identity", "index"),
ActionController::UrlRewriter.new(MockRequest.new(
"http://", "www.singlefile.com", 80, "/identity", {}
), "identity", "index")
]
@clean_url_with_id = ActionController::UrlRewriter.new(MockRequest.new(
"http://", "www.singlefile.com", 80, "/identity/show/5", { "id" => "5" }
), "identity", "show")
@clean_url_with_id_as_char = ActionController::UrlRewriter.new(MockRequest.new(
"http://", "www.singlefile.com", 80, "/teachers/show/t", { "id" => "t" }
), "teachers", "show")
end
def test_clean_action
assert_equal "http://www.singlefile.com/library/books/ISBN/0743536703/edit", @library_url.rewrite(:action => "edit")
end
def test_clean_action_with_only_path
assert_equal "/library/books/ISBN/0743536703/edit", @library_url.rewrite(:action => "edit", :only_path => true)
end
def test_action_from_index
assert_equal "http://www.singlefile.com/library/books/ISBN/0743536703/edit", @library_url_on_index.rewrite(:action => "edit")
end
def test_action_from_index_on_clean
@clean_urls.each do |url|
assert_equal "http://www.singlefile.com/identity/edit", url.rewrite(:action => "edit")
end
end
def test_action_without_prefix
assert_equal "http://www.singlefile.com/library/books/", @library_url.rewrite(:action => "index", :action_prefix => "")
end
def test_action_with_prefix
assert_equal(
"http://www.singlefile.com/library/books/XTC/123/show",
@library_url.rewrite(:action => "show", :action_prefix => "XTC/123")
)
end
def test_action_prefix_alone
assert_equal(
"http://www.singlefile.com/library/books/XTC/123/",
@library_url.rewrite(:action_prefix => "XTC/123")
)
end
def test_action_with_suffix
assert_equal(
"http://www.singlefile.com/library/books/show/XTC/123",
@library_url.rewrite(:action => "show", :action_prefix => "", :action_suffix => "XTC/123")
)
end
def test_clean_controller
assert_equal "http://www.singlefile.com/library/settings/", @library_url.rewrite(:controller => "settings")
end
def test_clean_controller_prefix
assert_equal "http://www.singlefile.com/shop/", @library_url.rewrite(:controller_prefix => "shop")
end
def test_clean_controller_with_module
assert_equal "http://www.singlefile.com/shop/purchases/", @library_url.rewrite(:module => "shop", :controller => "purchases")
end
def test_controller_and_action
assert_equal "http://www.singlefile.com/library/settings/show", @library_url.rewrite(:controller => "settings", :action => "show")
end
def test_controller_and_action_and_anchor
assert_equal(
"http://www.singlefile.com/library/settings/show#5",
@library_url.rewrite(:controller => "settings", :action => "show", :anchor => "5")
)
end
def test_controller_and_action_and_empty_overwrite_params_and_anchor
assert_equal(
"http://www.singlefile.com/library/settings/show?code=0743536703&type=ISBN#5",
@library_url.rewrite(:controller => "settings", :action => "show", :overwrite_params => {}, :anchor => "5")
)
end
def test_controller_and_action_and_overwrite_params_and_anchor
assert_equal(
"http://www.singlefile.com/library/settings/show?code=0000001&type=ISBN#5",
@library_url.rewrite(:controller => "settings", :action => "show", :overwrite_params => {"code"=>"0000001"}, :anchor => "5")
)
end
def test_controller_and_action_and_overwrite_params_with_nil_value_and_anchor
assert_equal(
"http://www.singlefile.com/library/settings/show?type=ISBN#5",
@library_url.rewrite(:controller => "settings", :action => "show", :overwrite_params => {"code" => nil}, :anchor => "5")
)
end
def test_controller_and_action_params_and_overwrite_params_and_anchor
assert_equal(
"http://www.singlefile.com/library/settings/show?code=0000001&version=5.0#5",
@library_url.rewrite(:controller => "settings", :action => "show", :params=>{"version" => "5.0"}, :overwrite_params => {"code"=>"0000001"}, :anchor => "5")
)
end
def test_controller_and_action_and_params_anchor
assert_equal(
"http://www.singlefile.com/library/settings/show?update=1#5",
@library_url.rewrite(:controller => "settings", :action => "show", :params => { "update" => "1"}, :anchor => "5")
)
end
def test_controller_and_index_action
assert_equal "http://www.singlefile.com/library/settings/", @library_url.rewrite(:controller => "settings", :action => "index")
end
def test_controller_and_action_with_same_name_as_controller
@clean_urls.each do |url|
assert_equal "http://www.singlefile.com/anything/identity", url.rewrite(:controller => "anything", :action => "identity")
end
end
def test_controller_and_index_action_without_controller_prefix
assert_equal(
"http://www.singlefile.com/settings/",
@library_url.rewrite(:controller => "settings", :action => "index", :controller_prefix => "")
)
end
def test_controller_and_index_action_with_controller_prefix
assert_equal(
"http://www.singlefile.com/fantastic/settings/show",
@library_url.rewrite(:controller => "settings", :action => "show", :controller_prefix => "fantastic")
)
end
def test_path_parameters
assert_equal "http://www.singlefile.com/library/books/EXBC/0743536703/show", @library_url.rewrite(:path_params => {"type" => "EXBC"})
end
def test_parameters
assert_equal(
"http://www.singlefile.com/library/books/ISBN/0743536703/show?delete=1&name=David",
@library_url.rewrite(:params => {"delete" => "1", "name" => "David"})
)
end
def test_parameters_with_id
@clean_urls.each do |url|
assert_equal(
"http://www.singlefile.com/identity/show?name=David&id=5",
url.rewrite(
:action => "show",
:params => { "id" => "5", "name" => "David" }
)
)
end
end
def test_action_with_id
assert_equal(
"http://www.singlefile.com/identity/show/7",
@clean_url_with_id.rewrite(
:action => "show",
:id => 7
)
)
@clean_urls.each do |url|
assert_equal(
"http://www.singlefile.com/identity/index/7",
url.rewrite(:id => 7)
)
end
end
def test_parameters_with_id_and_away
assert_equal(
"http://www.singlefile.com/identity/show/25?name=David",
@clean_url_with_id.rewrite(
:path_params => { "id" => "25" },
:params => { "name" => "David" }
)
)
end
def test_parameters_with_index_and_id
@clean_urls.each do |url|
assert_equal(
"http://www.singlefile.com/identity/index/25?name=David",
url.rewrite(
:path_params => { "id" => "25" },
:params => { "name" => "David" }
)
)
end
end
def test_action_going_away_from_id
assert_equal(
"http://www.singlefile.com/identity/list",
@clean_url_with_id.rewrite(
:action => "list"
)
)
end
def test_parameters_with_direct_id_and_away
assert_equal(
"http://www.singlefile.com/identity/show/25?name=David",
@clean_url_with_id.rewrite(
:id => "25",
:params => { "name" => "David" }
)
)
end
def test_parameters_with_direct_id_and_away
assert_equal(
"http://www.singlefile.com/store/open/25?name=David",
@clean_url_with_id.rewrite(
:controller => "store",
:action => "open",
:id => "25",
:params => { "name" => "David" }
)
)
end
def test_parameters_to_id
@clean_urls.each do |url|
%w(show index).each do |action|
assert_equal(
"http://www.singlefile.com/identity/#{action}/25?name=David",
url.rewrite(
:action => action,
:path_params => { "id" => "25" },
:params => { "name" => "David" }
)
)
end
end
end
def test_parameters_from_id
assert_equal(
"http://www.singlefile.com/identity/",
@clean_url_with_id.rewrite(
:action => "index"
)
)
end
def test_id_as_char_and_part_of_controller
assert_equal(
"http://www.singlefile.com/teachers/skill/5",
@clean_url_with_id_as_char.rewrite(
:action => "skill",
:id => 5
)
)
end
def test_from_clean_to_library
@clean_urls.each do |url|
assert_equal(
"http://www.singlefile.com/library/books/ISBN/0743536703/show?delete=1&name=David",
url.rewrite(
:controller_prefix => "library",
:controller => "books",
:action_prefix => "ISBN/0743536703",
:action => "show",
:params => { "delete" => "1", "name" => "David" }
)
)
end
end
def test_from_library_to_clean
assert_equal(
"http://www.singlefile.com/identity/",
@library_url.rewrite(
:controller => "identity", :controller_prefix => ""
)
)
end
def test_from_another_port
@library_url = ActionController::UrlRewriter.new(MockRequest.new(
"http://",
"www.singlefile.com",
8080,
"/library/books/ISBN/0743536703/show",
{ "type" => "ISBN", "code" => "0743536703" }
), "books", "show")
assert_equal(
"http://www.singlefile.com:8080/identity/",
@library_url.rewrite(
:controller => "identity", :controller_prefix => ""
)
)
end
def test_basecamp
basecamp_url = ActionController::UrlRewriter.new(MockRequest.new(
"http://",
"projects.basecamp",
80,
"/clients/disarray/1/msg/transcripts/",
{"category_name"=>"transcripts", "client_name"=>"disarray", "action"=>"index", "controller"=>"msg", "project_name"=>"1"}
), "msg", "index")
assert_equal(
"http://projects.basecamp/clients/disarray/1/msg/transcripts/1/comments",
basecamp_url.rewrite(:action_prefix => "transcripts/1", :action => "comments")
)
end
def test_on_explicit_index_page # My index page is very modest, thank you...
url = ActionController::UrlRewriter.new(
MockRequest.new(
"http://", "example.com", 80, "/controller/index",
{"controller"=>"controller", "action"=>"index"}
), "controller", "index"
)
assert_equal("http://example.com/controller/foo", url.rewrite(:action => 'foo'))
end
end

View File

@@ -0,0 +1,5 @@
module AbcHelper
def bare_a() end
def bare_b() end
def bare_c() end
end

View File

@@ -0,0 +1,3 @@
xml.wrapper do
xml << @content_for_layout
end

View File

@@ -0,0 +1 @@
<html><%= @content_for_layout %></html>

View File

@@ -0,0 +1 @@
<p>Beautiful modules!</p>

View File

@@ -0,0 +1 @@
Hello: <%= customer.name %>

View File

@@ -0,0 +1 @@
<p>This is grand!</p>

View File

@@ -0,0 +1,4 @@
xml.html do
xml.p "Hello #{@name}"
xml << render_file("test/greeting")
end

View File

@@ -0,0 +1 @@
Hello world!

View File

@@ -0,0 +1,11 @@
xml.html do
xml.head do
xml.title "Hello World"
end
xml.body do
xml.p "abes"
xml.p "monks"
xml.p "wiseguys"
end
end

View File

@@ -0,0 +1 @@
<%= render_collection_of_partials "customer", @customers %>

View File

@@ -0,0 +1,76 @@
require 'test/unit'
require File.dirname(__FILE__) + '/../../lib/action_view/helpers/date_helper'
require File.dirname(__FILE__) + '/../../lib/action_view/helpers/form_helper'
# require File.dirname(__FILE__) + '/../../lib/action_view/helpers/active_record_helper'
class ActiveRecordHelperTest < Test::Unit::TestCase
include ActionView::Helpers::FormHelper
include ActionView::Helpers::ActiveRecordHelper
Post = Struct.new("Post", :title, :author_name, :body, :secret, :written_on)
Column = Struct.new("Column", :type, :name, :human_name)
def setup
@post = Post.new
def @post.errors() Class.new{ def on(field) field == "author_name" || field == "body" end }.new end
def @post.new_record?() true end
def @post.column_for_attribute(attr_name)
Post.content_columns.select { |column| column.name == attr_name }.first
end
def Post.content_columns() [ Column.new(:string, "title", "Title"), Column.new(:text, "body", "Body") ] end
@post.title = "Hello World"
@post.author_name = ""
@post.body = "Back to the hill and over it again!"
@post.secret = 1
@post.written_on = Date.new(2004, 6, 15)
end
def test_generic_input_tag
assert_equal(
'<input id="post_title" name="post[title]" size="30" type="text" value="Hello World" />', input("post", "title")
)
end
def test_text_area_with_errors
assert_equal(
"<div class=\"fieldWithErrors\"><textarea cols=\"40\" id=\"post_body\" name=\"post[body]\" rows=\"20\" wrap=\"virtual\">Back to the hill and over it again!</textarea></div>",
text_area("post", "body")
)
end
def test_text_field_with_errors
assert_equal(
'<div class="fieldWithErrors"><input id="post_author_name" name="post[author_name]" size="30" type="text" value="" /></div>',
text_field("post", "author_name")
)
end
def test_form_with_string
assert_equal(
"<form action='create' method='POST'><p><label for=\"post_title\">Title</label><br /><input id=\"post_title\" name=\"post[title]\" size=\"30\" type=\"text\" value=\"Hello World\" /></p>\n<p><label for=\"post_body\">Body</label><br /><div class=\"fieldWithErrors\"><textarea cols=\"40\" id=\"post_body\" name=\"post[body]\" rows=\"20\" wrap=\"virtual\">Back to the hill and over it again!</textarea></div></p><input type='submit' value='Create' /></form>",
form("post")
)
end
def test_form_with_date
def Post.content_columns() [ Column.new(:date, "written_on", "Written on") ] end
assert_equal(
"<form action='create' method='POST'><p><label for=\"post_written_on\">Written on</label><br /><select name='post[written_on(1i)]'>\n<option>1999</option>\n<option>2000</option>\n<option>2001</option>\n<option>2002</option>\n<option>2003</option>\n<option selected=\"selected\">2004</option>\n<option>2005</option>\n<option>2006</option>\n<option>2007</option>\n<option>2008</option>\n<option>2009</option>\n</select>\n<select name='post[written_on(2i)]'>\n<option value='1'>January</option>\n<option value='2'>February</option>\n<option value='3'>March</option>\n<option value='4'>April</option>\n<option value='5'>May</option>\n<option value='6' selected=\"selected\">June</option>\n<option value='7'>July</option>\n<option value='8'>August</option>\n<option value='9'>September</option>\n<option value='10'>October</option>\n<option value='11'>November</option>\n<option value='12'>December</option>\n</select>\n<select name='post[written_on(3i)]'>\n<option>1</option>\n<option>2</option>\n<option>3</option>\n<option>4</option>\n<option>5</option>\n<option>6</option>\n<option>7</option>\n<option>8</option>\n<option>9</option>\n<option>10</option>\n<option>11</option>\n<option>12</option>\n<option>13</option>\n<option>14</option>\n<option selected=\"selected\">15</option>\n<option>16</option>\n<option>17</option>\n<option>18</option>\n<option>19</option>\n<option>20</option>\n<option>21</option>\n<option>22</option>\n<option>23</option>\n<option>24</option>\n<option>25</option>\n<option>26</option>\n<option>27</option>\n<option>28</option>\n<option>29</option>\n<option>30</option>\n<option>31</option>\n</select>\n</p><input type='submit' value='Create' /></form>",
form("post")
)
end
def test_form_with_datetime
def Post.content_columns() [ Column.new(:datetime, "written_on", "Written on") ] end
@post.written_on = Time.gm(2004, 6, 15, 16, 30)
assert_equal(
"<form action='create' method='POST'><p><label for=\"post_written_on\">Written on</label><br /><select name='post[written_on(1i)]'>\n<option>1999</option>\n<option>2000</option>\n<option>2001</option>\n<option>2002</option>\n<option>2003</option>\n<option selected=\"selected\">2004</option>\n<option>2005</option>\n<option>2006</option>\n<option>2007</option>\n<option>2008</option>\n<option>2009</option>\n</select>\n<select name='post[written_on(2i)]'>\n<option value='1'>January</option>\n<option value='2'>February</option>\n<option value='3'>March</option>\n<option value='4'>April</option>\n<option value='5'>May</option>\n<option value='6' selected=\"selected\">June</option>\n<option value='7'>July</option>\n<option value='8'>August</option>\n<option value='9'>September</option>\n<option value='10'>October</option>\n<option value='11'>November</option>\n<option value='12'>December</option>\n</select>\n<select name='post[written_on(3i)]'>\n<option>1</option>\n<option>2</option>\n<option>3</option>\n<option>4</option>\n<option>5</option>\n<option>6</option>\n<option>7</option>\n<option>8</option>\n<option>9</option>\n<option>10</option>\n<option>11</option>\n<option>12</option>\n<option>13</option>\n<option>14</option>\n<option selected=\"selected\">15</option>\n<option>16</option>\n<option>17</option>\n<option>18</option>\n<option>19</option>\n<option>20</option>\n<option>21</option>\n<option>22</option>\n<option>23</option>\n<option>24</option>\n<option>25</option>\n<option>26</option>\n<option>27</option>\n<option>28</option>\n<option>29</option>\n<option>30</option>\n<option>31</option>\n</select>\n &mdash; <select name='post[written_on(4i)]'>\n<option>00</option>\n<option>01</option>\n<option>02</option>\n<option>03</option>\n<option>04</option>\n<option>05</option>\n<option>06</option>\n<option>07</option>\n<option>08</option>\n<option>09</option>\n<option>10</option>\n<option>11</option>\n<option>12</option>\n<option>13</option>\n<option>14</option>\n<option>15</option>\n<option selected=\"selected\">16</option>\n<option>17</option>\n<option>18</option>\n<option>19</option>\n<option>20</option>\n<option>21</option>\n<option>22</option>\n<option>23</option>\n</select>\n : <select name='post[written_on(5i)]'>\n<option>00</option>\n<option>01</option>\n<option>02</option>\n<option>03</option>\n<option>04</option>\n<option>05</option>\n<option>06</option>\n<option>07</option>\n<option>08</option>\n<option>09</option>\n<option>10</option>\n<option>11</option>\n<option>12</option>\n<option>13</option>\n<option>14</option>\n<option>15</option>\n<option>16</option>\n<option>17</option>\n<option>18</option>\n<option>19</option>\n<option>20</option>\n<option>21</option>\n<option>22</option>\n<option>23</option>\n<option>24</option>\n<option>25</option>\n<option>26</option>\n<option>27</option>\n<option>28</option>\n<option>29</option>\n<option selected=\"selected\">30</option>\n<option>31</option>\n<option>32</option>\n<option>33</option>\n<option>34</option>\n<option>35</option>\n<option>36</option>\n<option>37</option>\n<option>38</option>\n<option>39</option>\n<option>40</option>\n<option>41</option>\n<option>42</option>\n<option>43</option>\n<option>44</option>\n<option>45</option>\n<option>46</option>\n<option>47</option>\n<option>48</option>\n<option>49</option>\n<option>50</option>\n<option>51</option>\n<option>52</option>\n<option>53</option>\n<option>54</option>\n<option>55</option>\n<option>56</option>\n<option>57</option>\n<option>58</option>\n<option>59</option>\n</select>\n</p><input type='submit' value='Create' /></form>",
form("post")
)
end
end

View File

@@ -0,0 +1,104 @@
require 'test/unit'
require File.dirname(__FILE__) + '/../../lib/action_view/helpers/date_helper'
class DateHelperTest < Test::Unit::TestCase
include ActionView::Helpers::DateHelper
def test_distance_in_words
from = Time.mktime(2004, 3, 6, 21, 41, 18)
assert_equal "less than a minute", distance_of_time_in_words(from, Time.mktime(2004, 3, 6, 21, 41, 25))
assert_equal "5 minutes", distance_of_time_in_words(from, Time.mktime(2004, 3, 6, 21, 46, 25))
assert_equal "about 1 hour", distance_of_time_in_words(from, Time.mktime(2004, 3, 6, 22, 47, 25))
assert_equal "about 3 hours", distance_of_time_in_words(from, Time.mktime(2004, 3, 7, 0, 41))
assert_equal "about 4 hours", distance_of_time_in_words(from, Time.mktime(2004, 3, 7, 1, 20))
assert_equal "2 days", distance_of_time_in_words(from, Time.mktime(2004, 3, 9, 15, 40))
end
def test_select_day
expected = "<select name='date[day]'>\n"
expected <<
"<option>1</option>\n<option>2</option>\n<option>3</option>\n<option>4</option>\n<option>5</option>\n<option>6</option>\n<option>7</option>\n<option>8</option>\n<option>9</option>\n<option>10</option>\n<option>11</option>\n<option>12</option>\n<option>13</option>\n<option>14</option>\n<option>15</option>\n<option selected=\"selected\">16</option>\n<option>17</option>\n<option>18</option>\n<option>19</option>\n<option>20</option>\n<option>21</option>\n<option>22</option>\n<option>23</option>\n<option>24</option>\n<option>25</option>\n<option>26</option>\n<option>27</option>\n<option>28</option>\n<option>29</option>\n<option>30</option>\n<option>31</option>\n"
expected << "</select>\n"
assert_equal expected, select_day(Time.mktime(2003, 8, 16))
assert_equal expected, select_day(16)
end
def test_select_day_with_blank
expected = "<select name='date[day]'>\n"
expected <<
"<option></option>\n<option>1</option>\n<option>2</option>\n<option>3</option>\n<option>4</option>\n<option>5</option>\n<option>6</option>\n<option>7</option>\n<option>8</option>\n<option>9</option>\n<option>10</option>\n<option>11</option>\n<option>12</option>\n<option>13</option>\n<option>14</option>\n<option>15</option>\n<option selected=\"selected\">16</option>\n<option>17</option>\n<option>18</option>\n<option>19</option>\n<option>20</option>\n<option>21</option>\n<option>22</option>\n<option>23</option>\n<option>24</option>\n<option>25</option>\n<option>26</option>\n<option>27</option>\n<option>28</option>\n<option>29</option>\n<option>30</option>\n<option>31</option>\n"
expected << "</select>\n"
assert_equal expected, select_day(Time.mktime(2003, 8, 16), :include_blank => true)
assert_equal expected, select_day(16, :include_blank => true)
end
def test_select_month
expected = "<select name='date[month]'>\n"
expected << "<option value='1'>January</option>\n<option value='2'>February</option>\n<option value='3'>March</option>\n<option value='4'>April</option>\n<option value='5'>May</option>\n<option value='6'>June</option>\n<option value='7'>July</option>\n<option value='8' selected=\"selected\">August</option>\n<option value='9'>September</option>\n<option value='10'>October</option>\n<option value='11'>November</option>\n<option value='12'>December</option>\n"
expected << "</select>\n"
assert_equal expected, select_month(Time.mktime(2003, 8, 16))
assert_equal expected, select_month(8)
end
def test_select_month_with_numbers
expected = "<select name='date[month]'>\n"
expected << "<option value='1'>1</option>\n<option value='2'>2</option>\n<option value='3'>3</option>\n<option value='4'>4</option>\n<option value='5'>5</option>\n<option value='6'>6</option>\n<option value='7'>7</option>\n<option value='8' selected=\"selected\">8</option>\n<option value='9'>9</option>\n<option value='10'>10</option>\n<option value='11'>11</option>\n<option value='12'>12</option>\n"
expected << "</select>\n"
assert_equal expected, select_month(Time.mktime(2003, 8, 16), :use_month_numbers => true)
assert_equal expected, select_month(8, :use_month_numbers => true)
end
def test_select_month_with_numbers_and_names
expected = "<select name='date[month]'>\n"
expected << "<option value='1'>1 - January</option>\n<option value='2'>2 - February</option>\n<option value='3'>3 - March</option>\n<option value='4'>4 - April</option>\n<option value='5'>5 - May</option>\n<option value='6'>6 - June</option>\n<option value='7'>7 - July</option>\n<option value='8' selected=\"selected\">8 - August</option>\n<option value='9'>9 - September</option>\n<option value='10'>10 - October</option>\n<option value='11'>11 - November</option>\n<option value='12'>12 - December</option>\n"
expected << "</select>\n"
assert_equal expected, select_month(Time.mktime(2003, 8, 16), :add_month_numbers => true)
assert_equal expected, select_month(8, :add_month_numbers => true)
end
def test_select_year
expected = "<select name='date[year]'>\n"
expected << "<option selected=\"selected\">2003</option>\n<option>2004</option>\n<option>2005</option>\n"
expected << "</select>\n"
assert_equal expected, select_year(Time.mktime(2003, 8, 16), :start_year => 2003, :end_year => 2005)
assert_equal expected, select_year(2003, :start_year => 2003, :end_year => 2005)
end
def test_select_year_with_type_discarding
expected = "<select name='date_year'>\n"
expected << "<option selected=\"selected\">2003</option>\n<option>2004</option>\n<option>2005</option>\n"
expected << "</select>\n"
assert_equal expected, select_year(
Time.mktime(2003, 8, 16), :prefix => "date_year", :discard_type => true, :start_year => 2003, :end_year => 2005)
assert_equal expected, select_year(
2003, :prefix => "date_year", :discard_type => true, :start_year => 2003, :end_year => 2005)
end
def test_select_date
expected = "<select name='date[first][year]'>\n"
expected << "<option selected=\"selected\">2003</option>\n<option>2004</option>\n<option>2005</option>\n"
expected << "</select>\n"
expected << "<select name='date[first][month]'>\n"
expected << "<option value='1'>January</option>\n<option value='2'>February</option>\n<option value='3'>March</option>\n<option value='4'>April</option>\n<option value='5'>May</option>\n<option value='6'>June</option>\n<option value='7'>July</option>\n<option value='8' selected=\"selected\">August</option>\n<option value='9'>September</option>\n<option value='10'>October</option>\n<option value='11'>November</option>\n<option value='12'>December</option>\n"
expected << "</select>\n"
expected << "<select name='date[first][day]'>\n"
expected <<
"<option>1</option>\n<option>2</option>\n<option>3</option>\n<option>4</option>\n<option>5</option>\n<option>6</option>\n<option>7</option>\n<option>8</option>\n<option>9</option>\n<option>10</option>\n<option>11</option>\n<option>12</option>\n<option>13</option>\n<option>14</option>\n<option>15</option>\n<option selected=\"selected\">16</option>\n<option>17</option>\n<option>18</option>\n<option>19</option>\n<option>20</option>\n<option>21</option>\n<option>22</option>\n<option>23</option>\n<option>24</option>\n<option>25</option>\n<option>26</option>\n<option>27</option>\n<option>28</option>\n<option>29</option>\n<option>30</option>\n<option>31</option>\n"
expected << "</select>\n"
assert_equal expected, select_date(
Time.mktime(2003, 8, 16), :start_year => 2003, :end_year => 2005, :prefix => "date[first]"
)
end
end

View File

@@ -0,0 +1,124 @@
require 'test/unit'
require File.dirname(__FILE__) + '/../../lib/action_view/helpers/form_helper'
class FormHelperTest < Test::Unit::TestCase
include ActionView::Helpers::FormHelper
old_verbose, $VERBOSE = $VERBOSE, nil
Post = Struct.new("Post", :title, :author_name, :body, :secret, :written_on)
$VERBOSE = old_verbose
def setup
@post = Post.new
def @post.errors() Class.new{ def on(field) field == "author_name" end }.new end
@post.title = "Hello World"
@post.author_name = ""
@post.body = "Back to the hill and over it again!"
@post.secret = 1
@post.written_on = Date.new(2004, 6, 15)
end
def test_text_field
assert_equal(
'<input id="post_title" name="post[title]" size="30" type="text" value="Hello World" />', text_field("post", "title")
)
assert_equal(
'<input id="post_title" name="post[title]" size="30" type="password" value="Hello World" />', password_field("post", "title")
)
assert_equal(
'<input id="person_name" name="person[name]" size="30" type="password" value="" />', password_field("person", "name")
)
end
def test_text_field_with_escapes
@post.title = "<b>Hello World</b>"
assert_equal(
'<input id="post_title" name="post[title]" size="30" type="text" value="&lt;b&gt;Hello World&lt;/b&gt;" />', text_field("post", "title")
)
end
def test_text_field_with_options
assert_equal(
'<input id="post_title" name="post[title]" size="35" type="text" value="Hello World" />',
text_field("post", "title", "size" => "35")
)
end
def test_text_field_assuming_size
assert_equal(
'<input id="post_title" maxlength="35" name="post[title]" size="35" type="text" value="Hello World" />',
text_field("post", "title", "maxlength" => 35)
)
end
def test_check_box
assert_equal(
'<input checked="checked" id="post_secret" name="post[secret]" type="checkbox" value="1" /><input name="post[secret]" type="hidden" value="0" />',
check_box("post", "secret")
)
@post.secret = 0
assert_equal(
'<input id="post_secret" name="post[secret]" type="checkbox" value="1" /><input name="post[secret]" type="hidden" value="0" />',
check_box("post", "secret")
)
@post.secret = true
assert_equal(
'<input checked="checked" id="post_secret" name="post[secret]" type="checkbox" value="1" /><input name="post[secret]" type="hidden" value="0" />',
check_box("post", "secret")
)
end
def test_text_area
assert_equal(
'<textarea cols="40" id="post_body" name="post[body]" rows="20" wrap="virtual">Back to the hill and over it again!</textarea>',
text_area("post", "body")
)
end
def test_text_area_with_escapes
@post.body = "Back to <i>the</i> hill and over it again!"
assert_equal(
'<textarea cols="40" id="post_body" name="post[body]" rows="20" wrap="virtual">Back to &lt;i&gt;the&lt;/i&gt; hill and over it again!</textarea>',
text_area("post", "body")
)
end
def test_date_selects
assert_equal(
'<textarea cols="40" id="post_body" name="post[body]" rows="20" wrap="virtual">Back to the hill and over it again!</textarea>',
text_area("post", "body")
)
end
def test_explicit_name
assert_equal(
'<input id="post_title" name="dont guess" size="30" type="text" value="Hello World" />', text_field("post", "title", "name" => "dont guess")
)
assert_equal(
'<textarea cols="40" id="post_body" name="really!" rows="20" wrap="virtual">Back to the hill and over it again!</textarea>',
text_area("post", "body", "name" => "really!")
)
assert_equal(
'<input checked="checked" id="post_secret" name="i mean it" type="checkbox" value="1" /><input name="i mean it" type="hidden" value="0" />',
check_box("post", "secret", "name" => "i mean it")
)
end
def test_explicit_id
assert_equal(
'<input id="dont guess" name="post[title]" size="30" type="text" value="Hello World" />', text_field("post", "title", "id" => "dont guess")
)
assert_equal(
'<textarea cols="40" id="really!" name="post[body]" rows="20" wrap="virtual">Back to the hill and over it again!</textarea>',
text_area("post", "body", "id" => "really!")
)
assert_equal(
'<input checked="checked" id="i mean it" name="post[secret]" type="checkbox" value="1" /><input name="post[secret]" type="hidden" value="0" />',
check_box("post", "secret", "id" => "i mean it")
)
end
end

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,18 @@
require 'test/unit'
require File.dirname(__FILE__) + '/../../lib/action_view/helpers/tag_helper'
require File.dirname(__FILE__) + '/../../lib/action_view/helpers/url_helper'
class TagHelperTest < Test::Unit::TestCase
include ActionView::Helpers::TagHelper
include ActionView::Helpers::UrlHelper
def test_tag
assert_equal "<p class=\"show\" />", tag("p", "class" => "show")
end
def test_content_tag
assert_equal "<a href=\"create\">Create</a>", content_tag("a", "Create", "href" => "create")
end
# FIXME: Test form tag
end

View File

@@ -0,0 +1,62 @@
require 'test/unit'
require File.dirname(__FILE__) + '/../../lib/action_view/helpers/text_helper'
class TextHelperTest < Test::Unit::TestCase
include ActionView::Helpers::TextHelper
def test_truncate
assert_equal "Hello World!", truncate("Hello World!", 12)
assert_equal "Hello Worl...", truncate("Hello World!!", 12)
end
def test_strip_links
assert_equal "on my mind", strip_links("<a href='almost'>on my mind</a>")
end
def test_highlighter
assert_equal(
"This is a <strong class=\"highlight\">beautiful</strong> morning",
highlight("This is a beautiful morning", "beautiful")
)
assert_equal(
"This is a <strong class=\"highlight\">beautiful</strong> morning, but also a <strong class=\"highlight\">beautiful</strong> day",
highlight("This is a beautiful morning, but also a beautiful day", "beautiful")
)
assert_equal(
"This is a <b>beautiful</b> morning, but also a <b>beautiful</b> day",
highlight("This is a beautiful morning, but also a beautiful day", "beautiful", '<b>\1</b>')
)
end
def test_highlighter_with_regexp
assert_equal(
"This is a <strong class=\"highlight\">beautiful!</strong> morning",
highlight("This is a beautiful! morning", "beautiful!")
)
assert_equal(
"This is a <strong class=\"highlight\">beautiful! morning</strong>",
highlight("This is a beautiful! morning", "beautiful! morning")
)
assert_equal(
"This is a <strong class=\"highlight\">beautiful? morning</strong>",
highlight("This is a beautiful? morning", "beautiful? morning")
)
end
def test_excerpt
assert_equal("...is a beautiful morni...", excerpt("This is a beautiful morning", "beautiful", 5))
assert_equal("This is a...", excerpt("This is a beautiful morning", "this", 5))
assert_equal("...iful morning", excerpt("This is a beautiful morning", "morning", 5))
assert_equal("...iful morning", excerpt("This is a beautiful morning", "morning", 5))
assert_nil excerpt("This is a beautiful morning", "day")
end
def test_pluralization
assert_equal("1 count", pluralize(1, "count"))
assert_equal("2 counts", pluralize(2, "count"))
end
end

View File

@@ -0,0 +1,49 @@
require 'test/unit'
require File.dirname(__FILE__) + '/../../lib/action_view/helpers/url_helper'
require File.dirname(__FILE__) + '/../../lib/action_view/helpers/tag_helper'
class UrlHelperTest < Test::Unit::TestCase
include ActionView::Helpers::UrlHelper
include ActionView::Helpers::TagHelper
def setup
@controller = Class.new do
def url_for(options, *parameters_for_method_reference)
"http://www.world.com"
end
end
@controller = @controller.new
end
# todo: missing test cases
def test_link_tag_with_straight_url
assert_equal "<a href=\"http://www.world.com\">Hello</a>", link_to("Hello", "http://www.world.com")
end
def test_link_tag_with_javascript_confirm
assert_equal(
"<a href=\"http://www.world.com\" onclick=\"return confirm('Are you sure?');\">Hello</a>",
link_to("Hello", "http://www.world.com", :confirm => "Are you sure?")
)
end
def test_link_unless_current
@params = { "controller" => "weblog", "action" => "show"}
assert_equal "Showing", link_to_unless_current("Showing", :action => "show", :controller => "weblog")
assert "<a href=\"http://www.world.com\">Listing</a>", link_to_unless_current("Listing", :action => "list", :controller => "weblog")
end
def test_mail_to
assert_equal "<a href=\"mailto:david@loudthinking.com\">david@loudthinking.com</a>", mail_to("david@loudthinking.com")
assert_equal "<a href=\"mailto:david@loudthinking.com\">David Heinemeier Hansson</a>", mail_to("david@loudthinking.com", "David Heinemeier Hansson")
assert_equal(
"<a class=\"admin\" href=\"mailto:david@loudthinking.com\">David Heinemeier Hansson</a>",
mail_to("david@loudthinking.com", "David Heinemeier Hansson", "class" => "admin")
)
end
def test_link_with_nil_html_options
assert "<a href=\"http://www.world.com\">Hello</a>",
link_to("Hello", {:action => 'myaction'}, nil)
end
end