require "#{File.dirname(__FILE__)}/../abstract_unit" class MockTimeZone attr_reader :name def initialize( name ) @name = name end def self.all [ "A", "B", "C", "D", "E" ].map { |s| new s } end def ==( z ) z && @name == z.name end def to_s @name end end ActionView::Helpers::FormOptionsHelper::TimeZone = MockTimeZone class FormOptionsHelperTest < Test::Unit::TestCase include ActionView::Helpers::FormHelper include 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) end def test_collection_options @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!") ] assert_dom_equal( "\n\n", options_from_collection_for_select(@posts, "author_name", "title") ) end def test_collection_options_with_preselected_value @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!") ] assert_dom_equal( "\n\n", options_from_collection_for_select(@posts, "author_name", "title", "Babe") ) end def test_collection_options_with_preselected_value_array @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!") ] assert_dom_equal( "\n\n", options_from_collection_for_select(@posts, "author_name", "title", [ "Babe", "Cabe" ]) ) 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_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 # FIXME: fails on Ruby 1.9, probably in html-scanner def test_hash_options_for_select assert_dom_equal( "\n", options_for_select({ "$" => "Dollar", "" => "" }) ) assert_dom_equal( "\n", options_for_select({ "$" => "Dollar", "" => "" }, "Dollar") ) assert_dom_equal( "\n", options_for_select({ "$" => "Dollar", "" => "" }, [ "Dollar", "" ]) ) 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_option_groups_from_collection_for_select @continents = [ Continent.new("", [Country.new("", ""), Country.new("so", "Somalia")] ), Continent.new("Europe", [Country.new("dk", "Denmark"), Country.new("ie", "Ireland")] ) ] assert_dom_equal( "\n\n", option_groups_from_collection_for_select(@continents, "countries", "continent_name", "country_id", "country_name", "dk") ) 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 = [ TimeZone.new( "B" ), 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 = [ TimeZone.new( "B" ), 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 = [ TimeZone.new( "B" ), TimeZone.new( "E" ) ] opts = time_zone_options_for_select( "C", zones ) assert_dom_equal "\n" + "" + "\n" + "\n" + "\n" + "", opts 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 = "" _erbout = '' fields_for :post, @post do |f| _erbout.concat f.select(:category, %w( abe hest)) end assert_dom_equal( "", _erbout ) 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_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_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_selected_nil @post = Post.new @post.category = "" assert_dom_equal( "", select("post", "category", %w( abe hest ), :selected => nil) ) end def test_collection_select @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!") ] @post = Post.new @post.author_name = "Babe" assert_dom_equal( "", collection_select("post", "author_name", @posts, "author_name", "author_name") ) end def test_collection_select_under_fields_for @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!") ] @post = Post.new @post.author_name = "Babe" _erbout = '' fields_for :post, @post do |f| _erbout.concat f.collection_select(:author_name, @posts, :author_name, :author_name) end assert_dom_equal( "", _erbout ) end def test_collection_select_with_blank_and_style @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!") ] @post = Post.new @post.author_name = "Babe" assert_dom_equal( "", collection_select("post", "author_name", @posts, "author_name", "author_name", { :include_blank => true }, "style" => "width: 200px") ) end def test_collection_select_with_blank_as_string_and_style @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!") ] @post = Post.new @post.author_name = "Babe" assert_dom_equal( "", collection_select("post", "author_name", @posts, "author_name", "author_name", { :include_blank => 'No Selection' }, "style" => "width: 200px") ) end def test_collection_select_with_multiple_option_appends_array_brackets @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!") ] @post = Post.new @post.author_name = "Babe" expected = "" # Should suffix default name with []. assert_dom_equal expected, collection_select("post", "author_name", @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", @posts, "author_name", "author_name", { :include_blank => true, :name => 'post[author_name][]' }, :multiple => true) end def test_country_select @post = Post.new @post.origin = "Denmark" expected_select = <<-COUNTRIES COUNTRIES assert_dom_equal(expected_select[0..-2], country_select("post", "origin")) end def test_country_select_with_priority_countries @post = Post.new @post.origin = "Denmark" expected_select = <<-COUNTRIES COUNTRIES assert_dom_equal(expected_select[0..-2], country_select("post", "origin", ["New Zealand", "Nicaragua"])) end def test_country_select_with_selected_priority_country @post = Post.new @post.origin = "New Zealand" expected_select = <<-COUNTRIES COUNTRIES assert_dom_equal(expected_select[0..-2], country_select("post", "origin", ["New Zealand", "Nicaragua"])) 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") _erbout = '' fields_for :firm, @firm do |f| _erbout.concat f.time_zone_select(:time_zone) end assert_dom_equal( "", _erbout ) 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 = [ TimeZone.new("A"), TimeZone.new("D") ] html = time_zone_select("firm", "time_zone", zones ) 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 end