require 'abstract_unit'
require 'tzinfo'
TZInfo::Timezone.cattr_reader :loaded_zones
class FormOptionsHelperTest < ActionView::TestCase
tests ActionView::Helpers::FormOptionsHelper
silence_warnings do
Post = Struct.new('Post', :title, :author_name, :body, :secret, :written_on, :category, :origin)
Continent = Struct.new('Continent', :continent_name, :countries)
Country = Struct.new('Country', :country_id, :country_name)
Firm = Struct.new('Firm', :time_zone)
Album = Struct.new('Album', :id, :title, :genre)
end
def setup
@fake_timezones = %w(A B C D E).inject([]) do |zones, id|
tz = TZInfo::Timezone.loaded_zones[id] = stub(:name => id, :to_s => id)
ActiveSupport::TimeZone.stubs(:[]).with(id).returns(tz)
zones << tz
end
ActiveSupport::TimeZone.stubs(:all).returns(@fake_timezones)
end
def test_collection_options
assert_dom_equal(
"\n\n",
options_from_collection_for_select(dummy_posts, "author_name", "title")
)
end
def test_collection_options_with_preselected_value
assert_dom_equal(
"\n\n",
options_from_collection_for_select(dummy_posts, "author_name", "title", "Babe")
)
end
def test_collection_options_with_preselected_value_array
assert_dom_equal(
"\n\n",
options_from_collection_for_select(dummy_posts, "author_name", "title", [ "Babe", "Cabe" ])
)
end
def test_collection_options_with_proc_for_selected
assert_dom_equal(
"\n\n",
options_from_collection_for_select(dummy_posts, "author_name", "title", lambda{|p| p.author_name == 'Babe' })
)
end
def test_collection_options_with_disabled_value
assert_dom_equal(
"\n\n",
options_from_collection_for_select(dummy_posts, "author_name", "title", :disabled => "Babe")
)
end
def test_collection_options_with_disabled_array
assert_dom_equal(
"\n\n",
options_from_collection_for_select(dummy_posts, "author_name", "title", :disabled => [ "Babe", "Cabe" ])
)
end
def test_collection_options_with_preselected_and_disabled_value
assert_dom_equal(
"\n\n",
options_from_collection_for_select(dummy_posts, "author_name", "title", :selected => "Cabe", :disabled => "Babe")
)
end
def test_collection_options_with_proc_for_disabled
assert_dom_equal(
"\n\n",
options_from_collection_for_select(dummy_posts, "author_name", "title", :disabled => lambda{|p| %w(Babe Cabe).include? p.author_name })
)
end
def test_string_options_for_select
options = ""
assert_dom_equal(
options,
options_for_select(options)
)
end
def test_array_options_for_select
assert_dom_equal(
"\n\n",
options_for_select([ "", "USA", "Sweden" ])
)
end
def test_array_options_for_select_with_selection
assert_dom_equal(
"\n\n",
options_for_select([ "Denmark", "", "Sweden" ], "")
)
end
def test_array_options_for_select_with_selection_array
assert_dom_equal(
"\n\n",
options_for_select([ "Denmark", "", "Sweden" ], [ "", "Sweden" ])
)
end
def test_array_options_for_select_with_disabled_value
assert_dom_equal(
"\n\n",
options_for_select([ "Denmark", "", "Sweden" ], :disabled => "")
)
end
def test_array_options_for_select_with_disabled_array
assert_dom_equal(
"\n\n",
options_for_select([ "Denmark", "", "Sweden" ], :disabled => ["", "Sweden"])
)
end
def test_array_options_for_select_with_selection_and_disabled_value
assert_dom_equal(
"\n\n",
options_for_select([ "Denmark", "", "Sweden" ], :selected => "Denmark", :disabled => "")
)
end
def test_array_options_for_string_include_in_other_string_bug_fix
assert_dom_equal(
"\n",
options_for_select([ "ruby", "rubyonrails" ], "rubyonrails")
)
assert_dom_equal(
"\n",
options_for_select([ "ruby", "rubyonrails" ], "ruby")
)
assert_dom_equal(
%(\n\n),
options_for_select([ "ruby", "rubyonrails", nil ], "ruby")
)
end
def test_hash_options_for_select
assert_dom_equal(
"\n",
options_for_select("$" => "Dollar", "" => "").split("\n").sort.join("\n")
)
assert_dom_equal(
"\n",
options_for_select({ "$" => "Dollar", "" => "" }, "Dollar").split("\n").sort.join("\n")
)
assert_dom_equal(
"\n",
options_for_select({ "$" => "Dollar", "" => "" }, [ "Dollar", "" ]).split("\n").sort.join("\n")
)
end
def test_ducktyped_options_for_select
quack = Struct.new(:first, :last)
assert_dom_equal(
"\n",
options_for_select([quack.new("", ""), quack.new("$", "Dollar")])
)
assert_dom_equal(
"\n",
options_for_select([quack.new("", ""), quack.new("$", "Dollar")], "Dollar")
)
assert_dom_equal(
"\n",
options_for_select([quack.new("", ""), quack.new("$", "Dollar")], ["Dollar", ""])
)
end
def test_collection_options_with_preselected_value_as_string_and_option_value_is_integer
albums = [ Album.new(1, "first","rap"), Album.new(2, "second","pop")]
assert_dom_equal(
%(\n),
options_from_collection_for_select(albums, "id", "genre", :selected => "1")
)
end
def test_collection_options_with_preselected_value_as_integer_and_option_value_is_string
albums = [ Album.new("1", "first","rap"), Album.new("2", "second","pop")]
assert_dom_equal(
%(\n),
options_from_collection_for_select(albums, "id", "genre", :selected => 1)
)
end
def test_collection_options_with_preselected_value_as_string_and_option_value_is_float
albums = [ Album.new(1.0, "first","rap"), Album.new(2.0, "second","pop")]
assert_dom_equal(
%(\n),
options_from_collection_for_select(albums, "id", "genre", :selected => "2.0")
)
end
def test_collection_options_with_preselected_value_as_nil
albums = [ Album.new(1.0, "first","rap"), Album.new(2.0, "second","pop")]
assert_dom_equal(
%(\n),
options_from_collection_for_select(albums, "id", "genre", :selected => nil)
)
end
def test_collection_options_with_disabled_value_as_nil
albums = [ Album.new(1.0, "first","rap"), Album.new(2.0, "second","pop")]
assert_dom_equal(
%(\n),
options_from_collection_for_select(albums, "id", "genre", :disabled => nil)
)
end
def test_collection_options_with_disabled_value_as_array
albums = [ Album.new(1.0, "first","rap"), Album.new(2.0, "second","pop")]
assert_dom_equal(
%(\n),
options_from_collection_for_select(albums, "id", "genre", :disabled => ["1.0", 2.0])
)
end
def test_collection_options_with_preselected_values_as_string_array_and_option_value_is_float
albums = [ Album.new(1.0, "first","rap"), Album.new(2.0, "second","pop"), Album.new(3.0, "third","country") ]
assert_dom_equal(
%(\n\n),
options_from_collection_for_select(albums, "id", "genre", ["1.0","3.0"])
)
end
def test_option_groups_from_collection_for_select
assert_dom_equal(
"",
option_groups_from_collection_for_select(dummy_continents, "countries", "continent_name", "country_id", "country_name", "dk")
)
end
def test_option_groups_from_collection_for_select_returns_html_safe_string
assert option_groups_from_collection_for_select(dummy_continents, "countries", "continent_name", "country_id", "country_name", "dk").html_safe?
end
def test_grouped_options_for_select_with_array
assert_dom_equal(
"",
grouped_options_for_select([
["North America",
[['United States','US'],"Canada"]],
["Europe",
[["Great Britain","GB"], "Germany"]]
])
)
end
def test_grouped_options_for_select_with_selected_and_prompt
assert_dom_equal(
"",
grouped_options_for_select([["Hats", ["Baseball Cap","Cowboy Hat"]]], "Cowboy Hat", "Choose a product...")
)
end
def test_grouped_options_for_select_returns_html_safe_string
assert grouped_options_for_select([["Hats", ["Baseball Cap","Cowboy Hat"]]]).html_safe?
end
def test_grouped_options_for_select_with_prompt_returns_html_escaped_string
assert_dom_equal(
"",
grouped_options_for_select([["Hats", ["Baseball Cap","Cowboy Hat"]]], nil, ''))
end
def test_optgroups_with_with_options_with_hash
assert_dom_equal(
"",
grouped_options_for_select({'North America' => ['United States','Canada'], 'Europe' => ['Denmark','Germany']})
)
end
def test_time_zone_options_no_parms
opts = time_zone_options_for_select
assert_dom_equal "\n" +
"\n" +
"\n" +
"\n" +
"",
opts
end
def test_time_zone_options_with_selected
opts = time_zone_options_for_select( "D" )
assert_dom_equal "\n" +
"\n" +
"\n" +
"\n" +
"",
opts
end
def test_time_zone_options_with_unknown_selected
opts = time_zone_options_for_select( "K" )
assert_dom_equal "\n" +
"\n" +
"\n" +
"\n" +
"",
opts
end
def test_time_zone_options_with_priority_zones
zones = [ ActiveSupport::TimeZone.new( "B" ), ActiveSupport::TimeZone.new( "E" ) ]
opts = time_zone_options_for_select( nil, zones )
assert_dom_equal "\n" +
"" +
"\n" +
"\n" +
"\n" +
"",
opts
end
def test_time_zone_options_with_selected_priority_zones
zones = [ ActiveSupport::TimeZone.new( "B" ), ActiveSupport::TimeZone.new( "E" ) ]
opts = time_zone_options_for_select( "E", zones )
assert_dom_equal "\n" +
"" +
"\n" +
"\n" +
"\n" +
"",
opts
end
def test_time_zone_options_with_unselected_priority_zones
zones = [ ActiveSupport::TimeZone.new( "B" ), ActiveSupport::TimeZone.new( "E" ) ]
opts = time_zone_options_for_select( "C", zones )
assert_dom_equal "\n" +
"" +
"\n" +
"\n" +
"\n" +
"",
opts
end
def test_time_zone_options_returns_html_safe_string
assert time_zone_options_for_select.html_safe?
end
def test_select
@post = Post.new
@post.category = ""
assert_dom_equal(
"",
select("post", "category", %w( abe hest))
)
end
def test_select_under_fields_for
@post = Post.new
@post.category = ""
output_buffer = fields_for :post, @post do |f|
concat f.select(:category, %w( abe hest))
end
assert_dom_equal(
"",
output_buffer
)
end
def test_select_under_fields_for_with_index
@post = Post.new
@post.category = ""
output_buffer = fields_for :post, @post, :index => 108 do |f|
concat f.select(:category, %w( abe hest))
end
assert_dom_equal(
"",
output_buffer
)
end
def test_select_under_fields_for_with_auto_index
@post = Post.new
@post.category = ""
def @post.to_param; 108; end
output_buffer = fields_for "post[]", @post do |f|
concat f.select(:category, %w( abe hest))
end
assert_dom_equal(
"",
output_buffer
)
end
def test_select_under_fields_for_with_string_and_given_prompt
@post = Post.new
options = ""
output_buffer = fields_for :post, @post do |f|
concat f.select(:category, options, :prompt => 'The prompt')
end
assert_dom_equal(
"",
output_buffer
)
end
def test_select_with_blank
@post = Post.new
@post.category = ""
assert_dom_equal(
"",
select("post", "category", %w( abe hest), :include_blank => true)
)
end
def test_select_with_blank_as_string
@post = Post.new
@post.category = ""
assert_dom_equal(
"",
select("post", "category", %w( abe hest), :include_blank => 'None')
)
end
def test_select_with_blank_as_string_escaped
@post = Post.new
@post.category = ""
assert_dom_equal(
"",
select("post", "category", %w( abe hest), :include_blank => '')
)
end
def test_select_with_default_prompt
@post = Post.new
@post.category = ""
assert_dom_equal(
"",
select("post", "category", %w( abe hest), :prompt => true)
)
end
def test_select_no_prompt_when_select_has_value
@post = Post.new
@post.category = ""
assert_dom_equal(
"",
select("post", "category", %w( abe hest), :prompt => true)
)
end
def test_select_with_given_prompt
@post = Post.new
@post.category = ""
assert_dom_equal(
"",
select("post", "category", %w( abe hest), :prompt => 'The prompt')
)
end
def test_select_with_given_prompt_escaped
@post = Post.new
assert_dom_equal(
"",
select("post", "category", %w( abe hest), :prompt => '')
)
end
def test_select_with_prompt_and_blank
@post = Post.new
@post.category = ""
assert_dom_equal(
"",
select("post", "category", %w( abe hest), :prompt => true, :include_blank => true)
)
end
def test_select_with_selected_value
@post = Post.new
@post.category = ""
assert_dom_equal(
"",
select("post", "category", %w( abe hest ), :selected => 'abe')
)
end
def test_select_with_index_option
@album = Album.new
@album.id = 1
expected = ""
assert_dom_equal(
expected,
select("album[]", "genre", %w[rap rock country], {}, { :index => nil })
)
end
def test_select_with_selected_nil
@post = Post.new
@post.category = ""
assert_dom_equal(
"",
select("post", "category", %w( abe hest ), :selected => nil)
)
end
def test_select_with_disabled_value
@post = Post.new
@post.category = ""
assert_dom_equal(
"",
select("post", "category", %w( abe hest ), :disabled => 'hest')
)
end
def test_select_with_disabled_array
@post = Post.new
@post.category = ""
assert_dom_equal(
"",
select("post", "category", %w( abe hest ), :disabled => ['hest', 'abe'])
)
end
def test_collection_select
@post = Post.new
@post.author_name = "Babe"
assert_dom_equal(
"",
collection_select("post", "author_name", dummy_posts, "author_name", "author_name")
)
end
def test_collection_select_under_fields_for
@post = Post.new
@post.author_name = "Babe"
output_buffer = fields_for :post, @post do |f|
concat f.collection_select(:author_name, dummy_posts, :author_name, :author_name)
end
assert_dom_equal(
"",
output_buffer
)
end
def test_collection_select_under_fields_for_with_index
@post = Post.new
@post.author_name = "Babe"
output_buffer = fields_for :post, @post, :index => 815 do |f|
concat f.collection_select(:author_name, dummy_posts, :author_name, :author_name)
end
assert_dom_equal(
"",
output_buffer
)
end
def test_collection_select_under_fields_for_with_auto_index
@post = Post.new
@post.author_name = "Babe"
def @post.to_param; 815; end
output_buffer = fields_for "post[]", @post do |f|
concat f.collection_select(:author_name, dummy_posts, :author_name, :author_name)
end
assert_dom_equal(
"",
output_buffer
)
end
def test_collection_select_with_blank_and_style
@post = Post.new
@post.author_name = "Babe"
assert_dom_equal(
"",
collection_select("post", "author_name", dummy_posts, "author_name", "author_name", { :include_blank => true }, "style" => "width: 200px")
)
end
def test_collection_select_with_blank_as_string_and_style
@post = Post.new
@post.author_name = "Babe"
assert_dom_equal(
"",
collection_select("post", "author_name", dummy_posts, "author_name", "author_name", { :include_blank => 'No Selection' }, "style" => "width: 200px")
)
end
def test_collection_select_with_multiple_option_appends_array_brackets
@post = Post.new
@post.author_name = "Babe"
expected = ""
# Should suffix default name with [].
assert_dom_equal expected, collection_select("post", "author_name", dummy_posts, "author_name", "author_name", { :include_blank => true }, :multiple => true)
# Shouldn't suffix custom name with [].
assert_dom_equal expected, collection_select("post", "author_name", dummy_posts, "author_name", "author_name", { :include_blank => true, :name => 'post[author_name][]' }, :multiple => true)
end
def test_collection_select_with_blank_and_selected
@post = Post.new
@post.author_name = "Babe"
assert_dom_equal(
%{},
collection_select("post", "author_name", dummy_posts, "author_name", "author_name", {:include_blank => true, :selected => ""})
)
end
def test_collection_select_with_disabled
@post = Post.new
@post.author_name = "Babe"
assert_dom_equal(
"",
collection_select("post", "author_name", dummy_posts, "author_name", "author_name", :disabled => 'Cabe')
)
end
def test_time_zone_select
@firm = Firm.new("D")
html = time_zone_select( "firm", "time_zone" )
assert_dom_equal "",
html
end
def test_time_zone_select_under_fields_for
@firm = Firm.new("D")
output_buffer = fields_for :firm, @firm do |f|
concat f.time_zone_select(:time_zone)
end
assert_dom_equal(
"",
output_buffer
)
end
def test_time_zone_select_under_fields_for_with_index
@firm = Firm.new("D")
output_buffer = fields_for :firm, @firm, :index => 305 do |f|
concat f.time_zone_select(:time_zone)
end
assert_dom_equal(
"",
output_buffer
)
end
def test_time_zone_select_under_fields_for_with_auto_index
@firm = Firm.new("D")
def @firm.to_param; 305; end
output_buffer = fields_for "firm[]", @firm do |f|
concat f.time_zone_select(:time_zone)
end
assert_dom_equal(
"",
output_buffer
)
end
def test_time_zone_select_with_blank
@firm = Firm.new("D")
html = time_zone_select("firm", "time_zone", nil, :include_blank => true)
assert_dom_equal "",
html
end
def test_time_zone_select_with_blank_as_string
@firm = Firm.new("D")
html = time_zone_select("firm", "time_zone", nil, :include_blank => 'No Zone')
assert_dom_equal "",
html
end
def test_time_zone_select_with_style
@firm = Firm.new("D")
html = time_zone_select("firm", "time_zone", nil, {},
"style" => "color: red")
assert_dom_equal "",
html
assert_dom_equal html, time_zone_select("firm", "time_zone", nil, {},
:style => "color: red")
end
def test_time_zone_select_with_blank_and_style
@firm = Firm.new("D")
html = time_zone_select("firm", "time_zone", nil,
{ :include_blank => true }, "style" => "color: red")
assert_dom_equal "",
html
assert_dom_equal html, time_zone_select("firm", "time_zone", nil,
{ :include_blank => true }, :style => "color: red")
end
def test_time_zone_select_with_blank_as_string_and_style
@firm = Firm.new("D")
html = time_zone_select("firm", "time_zone", nil,
{ :include_blank => 'No Zone' }, "style" => "color: red")
assert_dom_equal "",
html
assert_dom_equal html, time_zone_select("firm", "time_zone", nil,
{ :include_blank => 'No Zone' }, :style => "color: red")
end
def test_time_zone_select_with_priority_zones
@firm = Firm.new("D")
zones = [ ActiveSupport::TimeZone.new("A"), ActiveSupport::TimeZone.new("D") ]
html = time_zone_select("firm", "time_zone", zones )
assert_dom_equal "",
html
end
def test_time_zone_select_with_priority_zones_as_regexp
@firm = Firm.new("D")
@fake_timezones.each_with_index do |tz, i|
tz.stubs(:=~).returns(i.zero? || i == 3)
end
html = time_zone_select("firm", "time_zone", /A|D/)
assert_dom_equal "",
html
end
def test_time_zone_select_with_default_time_zone_and_nil_value
@firm = Firm.new()
@firm.time_zone = nil
html = time_zone_select( "firm", "time_zone", nil, :default => 'B' )
assert_dom_equal "",
html
end
def test_time_zone_select_with_default_time_zone_and_value
@firm = Firm.new('D')
html = time_zone_select( "firm", "time_zone", nil, :default => 'B' )
assert_dom_equal "",
html
end
def test_options_for_select_with_element_attributes
assert_dom_equal(
"\n\n\n",
options_for_select([ [ "", { :class => 'bold' } ], [ "USA", { :onclick => "alert('Hello World');" } ], [ "Sweden" ], "Germany" ])
)
end
def test_options_for_select_with_element_attributes_and_selection
assert_dom_equal(
"\n\n",
options_for_select([ "", [ "USA", { :class => 'bold' } ], "Sweden" ], "USA")
)
end
def test_options_for_select_with_element_attributes_and_selection_array
assert_dom_equal(
"\n\n",
options_for_select([ "", [ "USA", { :class => 'bold' } ], "Sweden" ], [ "USA", "Sweden" ])
)
end
def test_option_html_attributes_from_without_hash
assert_dom_equal(
"",
option_html_attributes([ 'foo', 'bar' ])
)
end
def test_option_html_attributes_with_single_element_hash
assert_dom_equal(
" class=\"fancy\"",
option_html_attributes([ 'foo', 'bar', { :class => 'fancy' } ])
)
end
def test_option_html_attributes_with_multiple_element_hash
assert_dom_equal(
" class=\"fancy\" onclick=\"alert('Hello World');\"",
option_html_attributes([ 'foo', 'bar', { :class => 'fancy', 'onclick' => "alert('Hello World');" } ])
)
end
def test_option_html_attributes_with_multiple_hashes
assert_dom_equal(
" class=\"fancy\" onclick=\"alert('Hello World');\"",
option_html_attributes([ 'foo', 'bar', { :class => 'fancy' }, { 'onclick' => "alert('Hello World');" } ])
)
end
def test_option_html_attributes_with_special_characters
assert_dom_equal(
" onclick=\"alert("<code>")\"",
option_html_attributes([ 'foo', 'bar', { :onclick => %(alert("")) } ])
)
end
def test_grouped_collection_select
@post = Post.new
@post.origin = 'dk'
assert_dom_equal(
%Q{},
grouped_collection_select("post", "origin", dummy_continents, :countries, :continent_name, :country_id, :country_name)
)
end
def test_grouped_collection_select_under_fields_for
@post = Post.new
@post.origin = 'dk'
output_buffer = fields_for :post, @post do |f|
concat f.grouped_collection_select("origin", dummy_continents, :countries, :continent_name, :country_id, :country_name)
end
assert_dom_equal(
%Q{},
output_buffer
)
end
private
def dummy_posts
[ Post.new(" went home", "", "To a little house", "shh!"),
Post.new("Babe went home", "Babe", "To a little house", "shh!"),
Post.new("Cabe went home", "Cabe", "To a little house", "shh!") ]
end
def dummy_continents
[ Continent.new("", [Country.new("", ""), Country.new("so", "Somalia")] ),
Continent.new("Europe", [Country.new("dk", "Denmark"), Country.new("ie", "Ireland")] ) ]
end
end