require 'test_helper' class BuilderTest < ActionView::TestCase def with_custom_form_for(object, *args, &block) with_concat_custom_form_for(object) do |f| assert f.instance_of?(CustomFormBuilder) yield f end end def with_collection_radio(object, attribute, collection, value_method, text_method, options={}, html_options={}) with_concat_form_for(object) do |f| f.collection_radio attribute, collection, value_method, text_method, options, html_options end end def with_collection_check_boxes(object, attribute, collection, value_method, text_method, options={}, html_options={}) with_concat_form_for(object) do |f| f.collection_check_boxes attribute, collection, value_method, text_method, options, html_options end end # COLLECTION RADIO test 'collection radio accepts a collection and generate inputs from value method' do with_collection_radio @user, :active, [true, false], :to_s, :to_s assert_select 'form input[type=radio][value=true]#user_active_true' assert_select 'form input[type=radio][value=false]#user_active_false' end test 'collection radio accepts a collection and generate inputs from label method' do with_collection_radio @user, :active, [true, false], :to_s, :to_s assert_select 'form label.collection_radio[for=user_active_true]', 'true' assert_select 'form label.collection_radio[for=user_active_false]', 'false' end test 'collection radio handles camelized collection values for labels correctly' do with_collection_radio @user, :active, ['Yes', 'No'], :to_s, :to_s assert_select 'form label.collection_radio[for=user_active_yes]', 'Yes' assert_select 'form label.collection_radio[for=user_active_no]', 'No' end test 'colection radio should sanitize collection values for labels correctly' do with_collection_radio @user, :name, ['$0.99', '$1.99'], :to_s, :to_s assert_select 'label.collection_radio[for=user_name_099]', '$0.99' assert_select 'label.collection_radio[for=user_name_199]', '$1.99' end test 'collection radio accepts checked item' do with_collection_radio @user, :active, [[1, true], [0, false]], :last, :first, :checked => true assert_select 'form input[type=radio][value=true][checked=checked]' assert_no_select 'form input[type=radio][value=false][checked=checked]' end test 'collection radio accepts multiple disabled items' do collection = [[1, true], [0, false], [2, 'other']] with_collection_radio @user, :active, collection, :last, :first, :disabled => [true, false] assert_select 'form input[type=radio][value=true][disabled=disabled]' assert_select 'form input[type=radio][value=false][disabled=disabled]' assert_no_select 'form input[type=radio][value=other][disabled=disabled]' end test 'collection radio accepts single disable item' do collection = [[1, true], [0, false]] with_collection_radio @user, :active, collection, :last, :first, :disabled => true assert_select 'form input[type=radio][value=true][disabled=disabled]' assert_no_select 'form input[type=radio][value=false][disabled=disabled]' end test 'collection radio accepts html options as input' do collection = [[1, true], [0, false]] with_collection_radio @user, :active, collection, :last, :first, {}, :class => 'radio' assert_select 'form input[type=radio][value=true].radio#user_active_true' assert_select 'form input[type=radio][value=false].radio#user_active_false' end test 'collection radio wraps the collection in the configured collection wrapper tag' do swap SimpleForm, :collection_wrapper_tag => :ul do with_collection_radio @user, :active, [true, false], :to_s, :to_s assert_select 'form ul input[type=radio][value=true]#user_active_true' assert_select 'form ul input[type=radio][value=false]#user_active_false' end end test 'collection radio wraps the collection in the given collection wrapper tag' do with_collection_radio @user, :active, [true, false], :to_s, :to_s, :collection_wrapper_tag => :ul assert_select 'form ul input[type=radio][value=true]#user_active_true' assert_select 'form ul input[type=radio][value=false]#user_active_false' end test 'collection radio does not wrap the collection in the explicitly false collection wrapper tag' do swap SimpleForm, :collection_wrapper_tag => :ul do with_collection_radio @user, :active, [true, false], :to_s, :to_s, :collection_wrapper_tag => false assert_no_select 'form ul' assert_no_select 'form ul' end end test 'collection radio does not wrap the collection in the explicitly nil collection wrapper tag' do swap SimpleForm, :collection_wrapper_tag => :ul do with_collection_radio @user, :active, [true, false], :to_s, :to_s, :collection_wrapper_tag => nil assert_no_select 'form ul' assert_no_select 'form ul' end end test 'collection radio does not wrap the collection by default' do with_collection_radio @user, :active, [true, false], :to_s, :to_s assert_no_select 'form ul' end test 'collection radio uses the configured class for collection wrapper tag' do swap SimpleForm, :collection_wrapper_tag => :ul, :collection_wrapper_class => 'inputs-list' do with_collection_radio @user, :active, [true, false], :to_s, :to_s assert_select 'form ul.inputs-list input[type=radio][value=true]#user_active_true' assert_select 'form ul.inputs-list input[type=radio][value=false]#user_active_false' end end test 'collection radio uses the given class for collection wrapper tag' do swap SimpleForm, :collection_wrapper_tag => :ul do with_collection_radio @user, :active, [true, false], :to_s, :to_s, :collection_wrapper_class => 'items-list' assert_select 'form ul.items-list input[type=radio][value=true]#user_active_true' assert_select 'form ul.items-list input[type=radio][value=false]#user_active_false' end end test 'collection radio uses both configured and given classes for collection wrapper tag' do swap SimpleForm, :collection_wrapper_tag => :ul, :collection_wrapper_class => 'inputs-list' do with_collection_radio @user, :active, [true, false], :to_s, :to_s, :collection_wrapper_class => 'items-list' assert_select 'form ul.inputs-list.items-list input[type=radio][value=true]#user_active_true' assert_select 'form ul.inputs-list.items-list input[type=radio][value=false]#user_active_false' end end test 'collection radio uses no class for collection wrapper tag by default' do swap SimpleForm, :collection_wrapper_tag => :ul do with_collection_radio @user, :active, [true, false], :to_s, :to_s assert_no_select 'form ul[class]' end end test 'collection radio wraps each label/radio in the configured item wrapper tag' do swap SimpleForm, :item_wrapper_tag => :li do with_collection_radio @user, :active, [true, false], :to_s, :to_s assert_select 'form li input[type=radio][value=true]#user_active_true' assert_select 'form li input[type=radio][value=false]#user_active_false' end end test 'collection radio wraps each label/radio in the given item wrapper tag' do with_collection_radio @user, :active, [true, false], :to_s, :to_s, :item_wrapper_tag => :li assert_select 'form li input[type=radio][value=true]#user_active_true' assert_select 'form li input[type=radio][value=false]#user_active_false' end test 'collection radio does not wrap each label/radio in the explicitly false item wrapper tag' do with_collection_radio @user, :active, [true, false], :to_s, :to_s, :item_wrapper_tag => false assert_no_select 'form span input[type=radio][value=true]#user_active_true' assert_no_select 'form span input[type=radio][value=false]#user_active_false' end test 'collection radio does not wrap each label/radio in the explicitly nil item wrapper tag' do with_collection_radio @user, :active, [true, false], :to_s, :to_s, :item_wrapper_tag => nil assert_no_select 'form span input[type=radio][value=true]#user_active_true' assert_no_select 'form span input[type=radio][value=false]#user_active_false' end test 'collection radio wrap items in a span tag by default' do with_collection_radio @user, :active, [true, false], :to_s, :to_s assert_select 'form span input[type=radio][value=true]#user_active_true + label' assert_select 'form span input[type=radio][value=false]#user_active_false + label' end test 'collection radio does not wrap input inside the label' do with_collection_radio @user, :active, [true, false], :to_s, :to_s assert_no_select 'form label input' end # COLLECTION CHECK BOX test 'collection check box accepts a collection and generate a serie of checkboxes for value method' do collection = [Tag.new(1, 'Tag 1'), Tag.new(2, 'Tag 2')] with_collection_check_boxes @user, :tag_ids, collection, :id, :name assert_select "form input[type=hidden][name='user[tag_ids][]'][value=]" assert_select 'form input#user_tag_ids_1[type=checkbox][value=1]' assert_select 'form input#user_tag_ids_2[type=checkbox][value=2]' end test 'collection check box accepts a collection and generate a serie of checkboxes with labels for label method' do collection = [Tag.new(1, 'Tag 1'), Tag.new(2, 'Tag 2')] with_collection_check_boxes @user, :tag_ids, collection, :id, :name assert_select 'form label.collection_check_boxes[for=user_tag_ids_1]', 'Tag 1' assert_select 'form label.collection_check_boxes[for=user_tag_ids_2]', 'Tag 2' end test 'collection check box handles camelized collection values for labels correctly' do with_collection_check_boxes @user, :active, ['Yes', 'No'], :to_s, :to_s assert_select 'form label.collection_check_boxes[for=user_active_yes]', 'Yes' assert_select 'form label.collection_check_boxes[for=user_active_no]', 'No' end test 'colection check box should sanitize collection values for labels correctly' do with_collection_check_boxes @user, :name, ['$0.99', '$1.99'], :to_s, :to_s assert_select 'label.collection_check_boxes[for=user_name_099]', '$0.99' assert_select 'label.collection_check_boxes[for=user_name_199]', '$1.99' end test 'collection check box accepts selected values as :checked option' do collection = (1..3).map{|i| [i, "Tag #{i}"] } with_collection_check_boxes @user, :tag_ids, collection, :first, :last, :checked => [1, 3] assert_select 'form input[type=checkbox][value=1][checked=checked]' assert_select 'form input[type=checkbox][value=3][checked=checked]' assert_no_select 'form input[type=checkbox][value=2][checked=checked]' end test 'collection check box accepts a single checked value' do collection = (1..3).map{|i| [i, "Tag #{i}"] } with_collection_check_boxes @user, :tag_ids, collection, :first, :last, :checked => 3 assert_select 'form input[type=checkbox][value=3][checked=checked]' assert_no_select 'form input[type=checkbox][value=1][checked=checked]' assert_no_select 'form input[type=checkbox][value=2][checked=checked]' end test 'collection check box accepts selected values as :checked option and override the model values' do collection = (1..3).map{|i| [i, "Tag #{i}"] } @user.tag_ids = [2] with_collection_check_boxes @user, :tag_ids, collection, :first, :last, :checked => [1, 3] assert_select 'form input[type=checkbox][value=1][checked=checked]' assert_select 'form input[type=checkbox][value=3][checked=checked]' assert_no_select 'form input[type=checkbox][value=2][checked=checked]' end test 'collection check box accepts multiple disabled items' do collection = (1..3).map{|i| [i, "Tag #{i}"] } with_collection_check_boxes @user, :tag_ids, collection, :first, :last, :disabled => [1, 3] assert_select 'form input[type=checkbox][value=1][disabled=disabled]' assert_select 'form input[type=checkbox][value=3][disabled=disabled]' assert_no_select 'form input[type=checkbox][value=2][disabled=disabled]' end test 'collection check box accepts single disable item' do collection = (1..3).map{|i| [i, "Tag #{i}"] } with_collection_check_boxes @user, :tag_ids, collection, :first, :last, :disabled => 1 assert_select 'form input[type=checkbox][value=1][disabled=disabled]' assert_no_select 'form input[type=checkbox][value=3][disabled=disabled]' assert_no_select 'form input[type=checkbox][value=2][disabled=disabled]' end test 'collection check box accepts a proc to disabled items' do collection = (1..3).map{|i| [i, "Tag #{i}"] } with_collection_check_boxes @user, :tag_ids, collection, :first, :last, :disabled => proc { |i| i.first == 1 } assert_select 'form input[type=checkbox][value=1][disabled=disabled]' assert_no_select 'form input[type=checkbox][value=3][disabled=disabled]' assert_no_select 'form input[type=checkbox][value=2][disabled=disabled]' end test 'collection check box accepts html options' do collection = [[1, 'Tag 1'], [2, 'Tag 2']] with_collection_check_boxes @user, :tag_ids, collection, :first, :last, {}, :class => 'check' assert_select 'form input.check[type=checkbox][value=1]' assert_select 'form input.check[type=checkbox][value=2]' end test 'collection check box with fields for' do collection = [Tag.new(1, 'Tag 1'), Tag.new(2, 'Tag 2')] with_concat_form_for(@user) do |f| f.fields_for(:post) do |p| p.collection_check_boxes :tag_ids, collection, :id, :name end end assert_select 'form input#user_post_tag_ids_1[type=checkbox][value=1]' assert_select 'form input#user_post_tag_ids_2[type=checkbox][value=2]' assert_select 'form label.collection_check_boxes[for=user_post_tag_ids_1]', 'Tag 1' assert_select 'form label.collection_check_boxes[for=user_post_tag_ids_2]', 'Tag 2' end test 'collection check box wraps the collection in the configured collection wrapper tag' do swap SimpleForm, :collection_wrapper_tag => :ul do with_collection_check_boxes @user, :active, [true, false], :to_s, :to_s assert_select 'form ul input[type=checkbox][value=true]#user_active_true' assert_select 'form ul input[type=checkbox][value=false]#user_active_false' end end test 'collection check box wraps the collection in the given collection wrapper tag' do with_collection_check_boxes @user, :active, [true, false], :to_s, :to_s, :collection_wrapper_tag => :ul assert_select 'form ul input[type=checkbox][value=true]#user_active_true' assert_select 'form ul input[type=checkbox][value=false]#user_active_false' end test 'collection check box does not wrap the collection in the explicitly false collection wrapper tag' do with_collection_check_boxes @user, :active, [true, false], :to_s, :to_s, :collection_wrapper_tag => false, :item_wrapper_tag => false assert_select 'form > input[type=checkbox][value=true]#user_active_true' assert_select 'form > input[type=checkbox][value=false]#user_active_false' end test 'collection check box does not wrap the collection by default' do with_collection_check_boxes @user, :active, [true, false], :to_s, :to_s assert_no_select 'form ul' end test 'collection check box uses the configured class for collection wrapper tag' do swap SimpleForm, :collection_wrapper_tag => :ul, :collection_wrapper_class => 'inputs-list' do with_collection_check_boxes @user, :active, [true, false], :to_s, :to_s assert_select 'form ul.inputs-list input[type=checkbox][value=true]#user_active_true' assert_select 'form ul.inputs-list input[type=checkbox][value=false]#user_active_false' end end test 'collection check box uses the given class for collection wrapper tag' do swap SimpleForm, :collection_wrapper_tag => :ul do with_collection_check_boxes @user, :active, [true, false], :to_s, :to_s, :collection_wrapper_class => 'items-list' assert_select 'form ul.items-list input[type=checkbox][value=true]#user_active_true' assert_select 'form ul.items-list input[type=checkbox][value=false]#user_active_false' end end test 'collection check box uses both configured and given classes for collection wrapper tag' do swap SimpleForm, :collection_wrapper_tag => :ul, :collection_wrapper_class => 'inputs-list' do with_collection_check_boxes @user, :active, [true, false], :to_s, :to_s, :collection_wrapper_class => 'items-list' assert_select 'form ul.inputs-list.items-list input[type=checkbox][value=true]#user_active_true' assert_select 'form ul.inputs-list.items-list input[type=checkbox][value=false]#user_active_false' end end test 'collection check box uses no class for collection wrapper tag by default' do swap SimpleForm, :collection_wrapper_tag => :ul do with_collection_check_boxes @user, :active, [true, false], :to_s, :to_s assert_no_select 'form ul[class]' end end test 'collection check box wraps each label/radio in the configured item wrapper tag' do swap SimpleForm, :item_wrapper_tag => :li do with_collection_check_boxes @user, :active, [true, false], :to_s, :to_s assert_select 'form li input[type=checkbox][value=true]#user_active_true' assert_select 'form li input[type=checkbox][value=false]#user_active_false' end end test 'collection check box wraps each label/radio in the given item wrapper tag' do with_collection_check_boxes @user, :active, [true, false], :to_s, :to_s, :item_wrapper_tag => :li assert_select 'form li input[type=checkbox][value=true]#user_active_true' assert_select 'form li input[type=checkbox][value=false]#user_active_false' end test 'collection check box does not wrapp each label/radio in the explicitly false item wrapper tag' do with_collection_check_boxes @user, :active, [true, false], :to_s, :to_s, :item_wrapper_tag => false assert_select 'form > input[type=checkbox][value=true]#user_active_true' assert_select 'form > input[type=checkbox][value=false]#user_active_false' end test 'collection check box wrap items in a span tag by default' do with_collection_check_boxes @user, :active, [true, false], :to_s, :to_s assert_select 'form span input[type=checkbox][value=true]#user_active_true + label' assert_select 'form span input[type=checkbox][value=false]#user_active_false + label' end test 'collection check box does not wrap input inside the label' do with_collection_check_boxes @user, :active, [true, false], :to_s, :to_s assert_no_select 'form label input' end # SIMPLE FIELDS test 'simple fields for is available and yields an instance of FormBuilder' do with_concat_form_for(@user) do |f| f.simple_fields_for(:posts) do |posts_form| assert posts_form.instance_of?(SimpleForm::FormBuilder) end end end test 'fields for with a hash like model yeilds an instance of FormBuilder' do @hash_backed_author = HashBackedAuthor.new with_concat_form_for(:user) do |f| f.simple_fields_for(:author, @hash_backed_author) do |author| assert author.instance_of?(SimpleForm::FormBuilder) author.input :name end end assert_select "input[name='user[author][name]'][value='hash backed author']" end test 'fields for yields an instance of CustomBuilder if main builder is a CustomBuilder' do with_custom_form_for(:user) do |f| f.simple_fields_for(:company) do |company| assert company.instance_of?(CustomFormBuilder) end end end test 'fields for yields an instance of FormBuilder if it was set in options' do with_custom_form_for(:user) do |f| f.simple_fields_for(:company, :builder => SimpleForm::FormBuilder) do |company| assert company.instance_of?(SimpleForm::FormBuilder) end end end test 'fields inherites wrapper option from the parent form' do swap_wrapper :another do simple_form_for(:user, :wrapper => :another) do |f| f.simple_fields_for(:company) do |company| assert_equal :another, company.options[:wrapper] end end end end end