simple_form 2.1.0 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of simple_form might be problematic. Click here for more details.
- checksums.yaml +7 -0
- data/CHANGELOG.md +22 -32
- data/README.md +161 -119
- data/lib/generators/simple_form/install_generator.rb +3 -3
- data/lib/generators/simple_form/templates/README +1 -1
- data/lib/generators/simple_form/templates/config/initializers/simple_form.rb +16 -13
- data/lib/generators/simple_form/templates/config/initializers/simple_form_bootstrap.rb +14 -14
- data/lib/generators/simple_form/templates/config/initializers/simple_form_foundation.rb +3 -3
- data/lib/simple_form/action_view_extensions/builder.rb +1 -319
- data/lib/simple_form/action_view_extensions/form_helper.rb +2 -9
- data/lib/simple_form/components/html5.rb +5 -2
- data/lib/simple_form/components/labels.rb +3 -3
- data/lib/simple_form/components/maxlength.rb +1 -8
- data/lib/simple_form/components/pattern.rb +2 -2
- data/lib/simple_form/components.rb +1 -1
- data/lib/simple_form/error_notification.rb +2 -2
- data/lib/simple_form/form_builder.rb +155 -51
- data/lib/simple_form/helpers.rb +1 -1
- data/lib/simple_form/inputs/base.rb +6 -6
- data/lib/simple_form/inputs/block_input.rb +1 -1
- data/lib/simple_form/inputs/boolean_input.rb +6 -4
- data/lib/simple_form/inputs/collection_input.rb +6 -6
- data/lib/simple_form/inputs/date_time_input.rb +1 -1
- data/lib/simple_form/inputs/numeric_input.rb +0 -6
- data/lib/simple_form/inputs/password_input.rb +0 -1
- data/lib/simple_form/inputs/string_input.rb +0 -1
- data/lib/simple_form/railtie.rb +7 -0
- data/lib/simple_form/tags.rb +62 -0
- data/lib/simple_form/version.rb +1 -1
- data/lib/simple_form/wrappers/builder.rb +5 -29
- data/lib/simple_form/wrappers/many.rb +1 -1
- data/lib/simple_form/wrappers/root.rb +1 -1
- data/lib/simple_form/wrappers.rb +1 -1
- data/lib/simple_form.rb +43 -47
- data/test/action_view_extensions/builder_test.rb +78 -92
- data/test/action_view_extensions/form_helper_test.rb +25 -16
- data/test/components/label_test.rb +46 -46
- data/test/form_builder/association_test.rb +47 -29
- data/test/form_builder/button_test.rb +4 -4
- data/test/form_builder/error_notification_test.rb +8 -8
- data/test/form_builder/error_test.rb +12 -12
- data/test/form_builder/general_test.rb +71 -52
- data/test/form_builder/hint_test.rb +22 -22
- data/test/form_builder/input_field_test.rb +29 -12
- data/test/form_builder/label_test.rb +7 -7
- data/test/form_builder/wrapper_test.rb +21 -21
- data/test/inputs/boolean_input_test.rb +35 -23
- data/test/inputs/collection_check_boxes_input_test.rb +66 -55
- data/test/inputs/collection_radio_buttons_input_test.rb +81 -79
- data/test/inputs/collection_select_input_test.rb +76 -45
- data/test/inputs/datetime_input_test.rb +17 -11
- data/test/inputs/disabled_test.rb +10 -10
- data/test/inputs/discovery_test.rb +4 -4
- data/test/inputs/file_input_test.rb +1 -1
- data/test/inputs/general_test.rb +28 -12
- data/test/inputs/grouped_collection_select_input_test.rb +33 -20
- data/test/inputs/hidden_input_test.rb +3 -2
- data/test/inputs/numeric_input_test.rb +3 -3
- data/test/inputs/priority_input_test.rb +9 -3
- data/test/inputs/readonly_test.rb +12 -12
- data/test/inputs/required_test.rb +5 -5
- data/test/inputs/string_input_test.rb +15 -25
- data/test/inputs/text_input_test.rb +1 -1
- data/test/support/misc_helpers.rb +46 -24
- data/test/support/mock_controller.rb +6 -6
- data/test/support/models.rb +80 -62
- data/test/test_helper.rb +17 -34
- metadata +31 -29
- data/lib/simple_form/core_ext/hash.rb +0 -16
| @@ -20,7 +20,7 @@ class IsolatedLabelTest < ActionView::TestCase | |
| 20 20 | 
             
              end
         | 
| 21 21 |  | 
| 22 22 | 
             
              test 'label should allow a customized description' do
         | 
| 23 | 
            -
                with_label_for @user, :name, :string, : | 
| 23 | 
            +
                with_label_for @user, :name, :string, label: 'My label!'
         | 
| 24 24 | 
             
                assert_select 'label[for=user_name]', /My label!/
         | 
| 25 25 | 
             
              end
         | 
| 26 26 |  | 
| @@ -30,14 +30,14 @@ class IsolatedLabelTest < ActionView::TestCase | |
| 30 30 | 
             
              end
         | 
| 31 31 |  | 
| 32 32 | 
             
              test 'label should use human attribute name based on association name' do
         | 
| 33 | 
            -
                with_label_for @user, :company_id, :string, : | 
| 33 | 
            +
                with_label_for @user, :company_id, :string, setup_association: true
         | 
| 34 34 | 
             
                assert_select 'label', /Company Human Name!/
         | 
| 35 35 | 
             
              end
         | 
| 36 36 |  | 
| 37 37 | 
             
              test 'label should use i18n based on model, action, and attribute to lookup translation' do
         | 
| 38 38 | 
             
                @controller.action_name = "new"
         | 
| 39 | 
            -
                store_translations(:en, : | 
| 40 | 
            -
                  : | 
| 39 | 
            +
                store_translations(:en, simple_form: { labels: { user: {
         | 
| 40 | 
            +
                  new: { description: 'Nova descrição' }
         | 
| 41 41 | 
             
                } } }) do
         | 
| 42 42 | 
             
                  with_label_for @user, :description, :text
         | 
| 43 43 | 
             
                  assert_select 'label[for=user_description]', /Nova descrição/
         | 
| @@ -46,8 +46,8 @@ class IsolatedLabelTest < ActionView::TestCase | |
| 46 46 |  | 
| 47 47 | 
             
              test 'label should fallback to new when action is create' do
         | 
| 48 48 | 
             
                @controller.action_name = "create"
         | 
| 49 | 
            -
                store_translations(:en, : | 
| 50 | 
            -
                  : | 
| 49 | 
            +
                store_translations(:en, simple_form: { labels: { user: {
         | 
| 50 | 
            +
                  new: { description: 'Nova descrição' }
         | 
| 51 51 | 
             
                } } }) do
         | 
| 52 52 | 
             
                  with_label_for @user, :description, :text
         | 
| 53 53 | 
             
                  assert_select 'label[for=user_description]', /Nova descrição/
         | 
| @@ -64,8 +64,8 @@ class IsolatedLabelTest < ActionView::TestCase | |
| 64 64 | 
             
              end
         | 
| 65 65 |  | 
| 66 66 | 
             
              test 'label should use i18n based on model and attribute to lookup translation' do
         | 
| 67 | 
            -
                store_translations(:en, : | 
| 68 | 
            -
                  : | 
| 67 | 
            +
                store_translations(:en, simple_form: { labels: { user: {
         | 
| 68 | 
            +
                  description: 'Descrição'
         | 
| 69 69 | 
             
                } } }) do
         | 
| 70 70 | 
             
                  with_label_for @user, :description, :text
         | 
| 71 71 | 
             
                  assert_select 'label[for=user_description]', /Descrição/
         | 
| @@ -73,15 +73,15 @@ class IsolatedLabelTest < ActionView::TestCase | |
| 73 73 | 
             
              end
         | 
| 74 74 |  | 
| 75 75 | 
             
              test 'label should use i18n under defaults to lookup translation' do
         | 
| 76 | 
            -
                store_translations(:en, : | 
| 76 | 
            +
                store_translations(:en, simple_form: { labels: { defaults: { age: 'Idade' } } }) do
         | 
| 77 77 | 
             
                  with_label_for @user, :age, :integer
         | 
| 78 78 | 
             
                  assert_select 'label[for=user_age]', /Idade/
         | 
| 79 79 | 
             
                end
         | 
| 80 80 | 
             
              end
         | 
| 81 81 |  | 
| 82 82 | 
             
              test 'label should not use i18n label if translate is false' do
         | 
| 83 | 
            -
                swap SimpleForm, : | 
| 84 | 
            -
                  store_translations(:en, : | 
| 83 | 
            +
                swap SimpleForm, translate_labels: false do
         | 
| 84 | 
            +
                  store_translations(:en, simple_form: { labels: { defaults: { age: 'Idade' } } }) do
         | 
| 85 85 | 
             
                    with_label_for @user, :age, :integer
         | 
| 86 86 | 
             
                    assert_select 'label[for=user_age]', /Age/
         | 
| 87 87 | 
             
                  end
         | 
| @@ -89,19 +89,19 @@ class IsolatedLabelTest < ActionView::TestCase | |
| 89 89 | 
             
              end
         | 
| 90 90 |  | 
| 91 91 | 
             
              test 'label uses i18n with lookup for association name' do
         | 
| 92 | 
            -
                store_translations(:en, : | 
| 93 | 
            -
                  : | 
| 92 | 
            +
                store_translations(:en, simple_form: { labels: {
         | 
| 93 | 
            +
                  user: { company: 'My company!' }
         | 
| 94 94 | 
             
                } }) do
         | 
| 95 | 
            -
                  with_label_for @user, :company_id, :string, : | 
| 95 | 
            +
                  with_label_for @user, :company_id, :string, setup_association: true
         | 
| 96 96 | 
             
                  assert_select 'label[for=user_company_id]', /My company!/
         | 
| 97 97 | 
             
                end
         | 
| 98 98 | 
             
              end
         | 
| 99 99 |  | 
| 100 100 | 
             
              test 'label uses i18n under defaults namespace to lookup for association name' do
         | 
| 101 | 
            -
                store_translations(:en, : | 
| 102 | 
            -
                  : | 
| 101 | 
            +
                store_translations(:en, simple_form: { labels: {
         | 
| 102 | 
            +
                  defaults: { company: 'Plataformatec' }
         | 
| 103 103 | 
             
                } }) do
         | 
| 104 | 
            -
                  with_label_for @user, :company, :string, : | 
| 104 | 
            +
                  with_label_for @user, :company, :string, setup_association: true
         | 
| 105 105 |  | 
| 106 106 | 
             
                  assert_select 'form label', /Plataformatec/
         | 
| 107 107 | 
             
                end
         | 
| @@ -110,8 +110,8 @@ class IsolatedLabelTest < ActionView::TestCase | |
| 110 110 | 
             
              test 'label should do correct i18n lookup for nested models with nested translation' do
         | 
| 111 111 | 
             
                @user.company = Company.new(1, 'Empresa')
         | 
| 112 112 |  | 
| 113 | 
            -
                store_translations(:en, : | 
| 114 | 
            -
                  : | 
| 113 | 
            +
                store_translations(:en, simple_form: { labels: {
         | 
| 114 | 
            +
                  user: { name: 'Usuario', company: { name: 'Nome da empresa' } }
         | 
| 115 115 | 
             
                } }) do
         | 
| 116 116 | 
             
                  with_concat_form_for @user do |f|
         | 
| 117 117 | 
             
                    concat f.input :name
         | 
| @@ -128,9 +128,9 @@ class IsolatedLabelTest < ActionView::TestCase | |
| 128 128 | 
             
              test 'label should do correct i18n lookup for nested models with no nested translation' do
         | 
| 129 129 | 
             
                @user.company = Company.new(1, 'Empresa')
         | 
| 130 130 |  | 
| 131 | 
            -
                store_translations(:en, : | 
| 132 | 
            -
                  : | 
| 133 | 
            -
                  : | 
| 131 | 
            +
                store_translations(:en, simple_form: { labels: {
         | 
| 132 | 
            +
                  user: { name: 'Usuario' },
         | 
| 133 | 
            +
                  company: { name: 'Nome da empresa' }
         | 
| 134 134 | 
             
                } }) do
         | 
| 135 135 | 
             
                  with_concat_form_for @user do |f|
         | 
| 136 136 | 
             
                    concat f.input :name
         | 
| @@ -147,13 +147,13 @@ class IsolatedLabelTest < ActionView::TestCase | |
| 147 147 | 
             
              test 'label should do correct i18n lookup for nested has_many models with no nested translation' do
         | 
| 148 148 | 
             
                @user.tags = [Tag.new(1, 'Empresa')]
         | 
| 149 149 |  | 
| 150 | 
            -
                store_translations(:en, : | 
| 151 | 
            -
                  : | 
| 152 | 
            -
                  : | 
| 150 | 
            +
                store_translations(:en, simple_form: { labels: {
         | 
| 151 | 
            +
                  user: { name: 'Usuario' },
         | 
| 152 | 
            +
                  tags: { name: 'Nome da empresa' }
         | 
| 153 153 | 
             
                } }) do
         | 
| 154 154 | 
             
                  with_concat_form_for @user do |f|
         | 
| 155 155 | 
             
                    concat f.input :name
         | 
| 156 | 
            -
                    concat(f.simple_fields_for(:tags, : | 
| 156 | 
            +
                    concat(f.simple_fields_for(:tags, child_index: "new_index") do |tags_form|
         | 
| 157 157 | 
             
                      concat(tags_form.input :name)
         | 
| 158 158 | 
             
                    end)
         | 
| 159 159 | 
             
                  end
         | 
| @@ -177,7 +177,7 @@ class IsolatedLabelTest < ActionView::TestCase | |
| 177 177 | 
             
              end
         | 
| 178 178 |  | 
| 179 179 | 
             
              test 'label should not have css class from type when generate_additional_classes_for does not include :label' do
         | 
| 180 | 
            -
                swap SimpleForm, : | 
| 180 | 
            +
                swap SimpleForm, generate_additional_classes_for: [:wrapper, :input] do
         | 
| 181 181 | 
             
                  with_label_for @user, :name, :string
         | 
| 182 182 | 
             
                  assert_no_select 'label.string'
         | 
| 183 183 | 
             
                  with_label_for @user, :description, :text
         | 
| @@ -192,7 +192,7 @@ class IsolatedLabelTest < ActionView::TestCase | |
| 192 192 | 
             
              end
         | 
| 193 193 |  | 
| 194 194 | 
             
              test 'label should not generate empty css class' do
         | 
| 195 | 
            -
                swap SimpleForm, : | 
| 195 | 
            +
                swap SimpleForm, generate_additional_classes_for: [:wrapper, :input] do
         | 
| 196 196 | 
             
                  with_label_for @user, :name, :string
         | 
| 197 197 | 
             
                  assert_no_select 'label[class]'
         | 
| 198 198 | 
             
                end
         | 
| @@ -206,7 +206,7 @@ class IsolatedLabelTest < ActionView::TestCase | |
| 206 206 | 
             
              end
         | 
| 207 207 |  | 
| 208 208 | 
             
              test 'label should not obtain required from ActiveModel::Validations when generate_additional_classes_for does not include :label' do
         | 
| 209 | 
            -
                swap SimpleForm, : | 
| 209 | 
            +
                swap SimpleForm, generate_additional_classes_for: [:wrapper, :input] do
         | 
| 210 210 | 
             
                  with_label_for @validating_user, :name, :string
         | 
| 211 211 | 
             
                  assert_no_select 'label.required'
         | 
| 212 212 | 
             
                  with_label_for @validating_user, :status, :string
         | 
| @@ -215,9 +215,9 @@ class IsolatedLabelTest < ActionView::TestCase | |
| 215 215 | 
             
              end
         | 
| 216 216 |  | 
| 217 217 | 
             
              test 'label should allow overriding required when ActiveModel::Validations is included' do
         | 
| 218 | 
            -
                with_label_for @validating_user, :name, :string, : | 
| 218 | 
            +
                with_label_for @validating_user, :name, :string, required: false
         | 
| 219 219 | 
             
                assert_select 'label.optional'
         | 
| 220 | 
            -
                with_label_for @validating_user, :status, :string, : | 
| 220 | 
            +
                with_label_for @validating_user, :status, :string, required: true
         | 
| 221 221 | 
             
                assert_select 'label.required'
         | 
| 222 222 | 
             
              end
         | 
| 223 223 |  | 
| @@ -227,7 +227,7 @@ class IsolatedLabelTest < ActionView::TestCase | |
| 227 227 | 
             
              end
         | 
| 228 228 |  | 
| 229 229 | 
             
              test 'label should be able to disable required when ActiveModel::Validations is not included' do
         | 
| 230 | 
            -
                with_label_for @user, :name, :string, : | 
| 230 | 
            +
                with_label_for @user, :name, :string, required: false
         | 
| 231 231 | 
             
                assert_no_select 'label.required'
         | 
| 232 232 | 
             
              end
         | 
| 233 233 |  | 
| @@ -237,26 +237,26 @@ class IsolatedLabelTest < ActionView::TestCase | |
| 237 237 | 
             
              end
         | 
| 238 238 |  | 
| 239 239 | 
             
              test 'label should not have required text in no required inputs' do
         | 
| 240 | 
            -
                with_label_for @user, :name, :string, : | 
| 240 | 
            +
                with_label_for @user, :name, :string, required: false
         | 
| 241 241 | 
             
                assert_no_select 'form label abbr'
         | 
| 242 242 | 
             
              end
         | 
| 243 243 |  | 
| 244 244 | 
             
              test 'label should use i18n to find required text' do
         | 
| 245 | 
            -
                store_translations(:en, : | 
| 245 | 
            +
                store_translations(:en, simple_form: { required: { text: 'campo requerido' } }) do
         | 
| 246 246 | 
             
                  with_label_for @user, :name, :string
         | 
| 247 247 | 
             
                  assert_select 'form label abbr[title=campo requerido]', '*'
         | 
| 248 248 | 
             
                end
         | 
| 249 249 | 
             
              end
         | 
| 250 250 |  | 
| 251 251 | 
             
              test 'label should use i18n to find required mark' do
         | 
| 252 | 
            -
                store_translations(:en, : | 
| 252 | 
            +
                store_translations(:en, simple_form: { required: { mark: '*-*' } }) do
         | 
| 253 253 | 
             
                  with_label_for @user, :name, :string
         | 
| 254 254 | 
             
                  assert_select 'form label abbr', '*-*'
         | 
| 255 255 | 
             
                end
         | 
| 256 256 | 
             
              end
         | 
| 257 257 |  | 
| 258 258 | 
             
              test 'label should use i18n to find required string tag' do
         | 
| 259 | 
            -
                store_translations(:en, : | 
| 259 | 
            +
                store_translations(:en, simple_form: { required: { html: '<span class="required" title="requerido">*</span>' } }) do
         | 
| 260 260 | 
             
                  with_label_for @user, :name, :string
         | 
| 261 261 | 
             
                  assert_no_select 'form label abbr'
         | 
| 262 262 | 
             
                  assert_select 'form label span.required[title=requerido]', '*'
         | 
| @@ -264,22 +264,22 @@ class IsolatedLabelTest < ActionView::TestCase | |
| 264 264 | 
             
              end
         | 
| 265 265 |  | 
| 266 266 | 
             
              test 'label should allow overwriting input id' do
         | 
| 267 | 
            -
                with_label_for @user, :name, :string, : | 
| 267 | 
            +
                with_label_for @user, :name, :string, input_html: { id: 'my_new_id' }
         | 
| 268 268 | 
             
                assert_select 'label[for=my_new_id]'
         | 
| 269 269 | 
             
              end
         | 
| 270 270 |  | 
| 271 271 | 
             
              test 'label should allow overwriting of for attribute' do
         | 
| 272 | 
            -
                with_label_for @user, :name, :string, : | 
| 272 | 
            +
                with_label_for @user, :name, :string, label_html: { for: 'my_new_id' }
         | 
| 273 273 | 
             
                assert_select 'label[for=my_new_id]'
         | 
| 274 274 | 
             
              end
         | 
| 275 275 |  | 
| 276 276 | 
             
              test 'label should allow overwriting of for attribute with input_html not containing id' do
         | 
| 277 | 
            -
                with_label_for @user, :name, :string, : | 
| 277 | 
            +
                with_label_for @user, :name, :string, label_html: { for: 'my_new_id' }, input_html: { class: 'foo' }
         | 
| 278 278 | 
             
                assert_select 'label[for=my_new_id]'
         | 
| 279 279 | 
             
              end
         | 
| 280 280 |  | 
| 281 281 | 
             
              test 'label should use default input id when it was not overridden' do
         | 
| 282 | 
            -
                with_label_for @user, :name, :string, : | 
| 282 | 
            +
                with_label_for @user, :name, :string, input_html: { class: 'my_new_id' }
         | 
| 283 283 | 
             
                assert_select 'label[for=user_name]'
         | 
| 284 284 | 
             
              end
         | 
| 285 285 |  | 
| @@ -289,13 +289,13 @@ class IsolatedLabelTest < ActionView::TestCase | |
| 289 289 | 
             
              end
         | 
| 290 290 |  | 
| 291 291 | 
             
              test 'label should include for attribute for select collection' do
         | 
| 292 | 
            -
                with_label_for @user, :sex, :select, : | 
| 292 | 
            +
                with_label_for @user, :sex, :select, collection: [:male, :female]
         | 
| 293 293 | 
             
                assert_select 'label[for=user_sex]'
         | 
| 294 294 | 
             
              end
         | 
| 295 295 |  | 
| 296 296 | 
             
              test 'label should use i18n properly when object is not present' do
         | 
| 297 | 
            -
                store_translations(:en, : | 
| 298 | 
            -
                  : | 
| 297 | 
            +
                store_translations(:en, simple_form: { labels: {
         | 
| 298 | 
            +
                  project: { name: 'Nome' }
         | 
| 299 299 | 
             
                } }) do
         | 
| 300 300 | 
             
                  with_label_for :project, :name, :string
         | 
| 301 301 | 
             
                  assert_select 'label[for=project_name]', /Nome/
         | 
| @@ -305,19 +305,19 @@ class IsolatedLabelTest < ActionView::TestCase | |
| 305 305 | 
             
              test 'label should add required by default when object is not present' do
         | 
| 306 306 | 
             
                with_label_for :project, :name, :string
         | 
| 307 307 | 
             
                assert_select 'label.required[for=project_name]'
         | 
| 308 | 
            -
                with_label_for :project, :description, :string, : | 
| 308 | 
            +
                with_label_for :project, :description, :string, required: false
         | 
| 309 309 | 
             
                assert_no_select 'label.required[for=project_description]'
         | 
| 310 310 | 
             
              end
         | 
| 311 311 |  | 
| 312 312 | 
             
              test 'label should add chosen label class' do
         | 
| 313 | 
            -
                swap SimpleForm, : | 
| 313 | 
            +
                swap SimpleForm, label_class: :my_custom_class do
         | 
| 314 314 | 
             
                  with_label_for @user, :name, :string
         | 
| 315 315 | 
             
                  assert_select 'label.my_custom_class'
         | 
| 316 316 | 
             
                end
         | 
| 317 317 | 
             
              end
         | 
| 318 318 |  | 
| 319 319 | 
             
              test 'label strips extra classes even when label_class is nil' do
         | 
| 320 | 
            -
                swap SimpleForm, : | 
| 320 | 
            +
                swap SimpleForm, label_class: nil do
         | 
| 321 321 | 
             
                  with_label_for @user, :name, :string
         | 
| 322 322 | 
             
                  assert_select "label[class='string required']"
         | 
| 323 323 | 
             
                  assert_no_select "label[class='string required ']"
         | 
| @@ -25,7 +25,7 @@ class AssociationTest < ActionView::TestCase | |
| 25 25 | 
             
              test 'builder association forwards collection to simple_fields_for' do
         | 
| 26 26 | 
             
                calls = 0
         | 
| 27 27 | 
             
                simple_form_for @user do |f|
         | 
| 28 | 
            -
                  f.association :company, : | 
| 28 | 
            +
                  f.association :company, collection: Company.all do |c|
         | 
| 29 29 | 
             
                    calls += 1
         | 
| 30 30 | 
             
                  end
         | 
| 31 31 | 
             
                end
         | 
| @@ -34,43 +34,53 @@ class AssociationTest < ActionView::TestCase | |
| 34 34 | 
             
              end
         | 
| 35 35 |  | 
| 36 36 | 
             
              test 'builder association marks input as required based on both association and attribute' do
         | 
| 37 | 
            -
                swap SimpleForm, : | 
| 38 | 
            -
                  with_association_for @validating_user, :company, : | 
| 37 | 
            +
                swap SimpleForm, required_by_default: false do
         | 
| 38 | 
            +
                  with_association_for @validating_user, :company, collection: []
         | 
| 39 39 | 
             
                  assert_select 'label.required'
         | 
| 40 40 | 
             
                end
         | 
| 41 41 | 
             
              end
         | 
| 42 42 |  | 
| 43 43 | 
             
              test 'builder preloads collection association' do
         | 
| 44 | 
            -
                value = @user.tags =  | 
| 45 | 
            -
                value. | 
| 44 | 
            +
                value = @user.tags = MiniTest::Mock.new
         | 
| 45 | 
            +
                value.expect(:to_a, value)
         | 
| 46 46 |  | 
| 47 47 | 
             
                with_association_for @user, :tags
         | 
| 48 48 | 
             
                assert_select 'form select.select#user_tag_ids'
         | 
| 49 49 | 
             
                assert_select 'form select option[value=1]', 'Tag 1'
         | 
| 50 50 | 
             
                assert_select 'form select option[value=2]', 'Tag 2'
         | 
| 51 51 | 
             
                assert_select 'form select option[value=3]', 'Tag 3'
         | 
| 52 | 
            +
             | 
| 53 | 
            +
                value.verify
         | 
| 52 54 | 
             
              end
         | 
| 53 55 |  | 
| 54 56 | 
             
              test 'builder does not preload collection association if preload is false' do
         | 
| 55 | 
            -
                value = @user.tags =  | 
| 56 | 
            -
                value. | 
| 57 | 
            +
                value = @user.tags = MiniTest::Mock.new
         | 
| 58 | 
            +
                value.expect(:to_a, nil)
         | 
| 57 59 |  | 
| 58 | 
            -
                with_association_for @user, :tags, : | 
| 60 | 
            +
                with_association_for @user, :tags, preload: false
         | 
| 59 61 | 
             
                assert_select 'form select.select#user_tag_ids'
         | 
| 60 62 | 
             
                assert_select 'form select option[value=1]', 'Tag 1'
         | 
| 61 63 | 
             
                assert_select 'form select option[value=2]', 'Tag 2'
         | 
| 62 64 | 
             
                assert_select 'form select option[value=3]', 'Tag 3'
         | 
| 65 | 
            +
             | 
| 66 | 
            +
                assert_raises MockExpectationError do
         | 
| 67 | 
            +
                  value.verify
         | 
| 68 | 
            +
                end
         | 
| 63 69 | 
             
              end
         | 
| 64 70 |  | 
| 65 71 | 
             
              test 'builder does not preload non-collection association' do
         | 
| 66 | 
            -
                value = @user.company =  | 
| 67 | 
            -
                value. | 
| 72 | 
            +
                value = @user.company = MiniTest::Mock.new
         | 
| 73 | 
            +
                value.expect(:to_a, nil)
         | 
| 68 74 |  | 
| 69 75 | 
             
                with_association_for @user, :company
         | 
| 70 76 | 
             
                assert_select 'form select.select#user_company_id'
         | 
| 71 77 | 
             
                assert_select 'form select option[value=1]', 'Company 1'
         | 
| 72 78 | 
             
                assert_select 'form select option[value=2]', 'Company 2'
         | 
| 73 79 | 
             
                assert_select 'form select option[value=3]', 'Company 3'
         | 
| 80 | 
            +
             | 
| 81 | 
            +
                assert_raises MockExpectationError do
         | 
| 82 | 
            +
                  value.verify
         | 
| 83 | 
            +
                end
         | 
| 74 84 | 
             
              end
         | 
| 75 85 |  | 
| 76 86 | 
             
              # ASSOCIATIONS - BELONGS TO
         | 
| @@ -83,21 +93,29 @@ class AssociationTest < ActionView::TestCase | |
| 83 93 | 
             
              end
         | 
| 84 94 |  | 
| 85 95 | 
             
              test 'builder creates blank select if collection is nil' do
         | 
| 86 | 
            -
                with_association_for @user, :company, : | 
| 96 | 
            +
                with_association_for @user, :company, collection: nil
         | 
| 87 97 | 
             
                assert_select 'form select.select#user_company_id'
         | 
| 88 98 | 
             
                assert_no_select 'form select option[value=1]', 'Company 1'
         | 
| 89 99 | 
             
              end
         | 
| 90 100 |  | 
| 91 101 | 
             
              test 'builder allows collection radio for belongs_to associations' do
         | 
| 92 | 
            -
                with_association_for @user, :company, : | 
| 102 | 
            +
                with_association_for @user, :company, as: :radio_buttons
         | 
| 93 103 | 
             
                assert_select 'form input.radio_buttons#user_company_id_1'
         | 
| 94 104 | 
             
                assert_select 'form input.radio_buttons#user_company_id_2'
         | 
| 95 105 | 
             
                assert_select 'form input.radio_buttons#user_company_id_3'
         | 
| 96 106 | 
             
              end
         | 
| 97 107 |  | 
| 108 | 
            +
              test 'builder allows collection to have a proc as a condition' do
         | 
| 109 | 
            +
                with_association_for @user, :extra_special_company
         | 
| 110 | 
            +
                assert_select 'form select.select#user_extra_special_company_id'
         | 
| 111 | 
            +
                assert_select 'form select option[value=1]'
         | 
| 112 | 
            +
                assert_no_select 'form select option[value=2]'
         | 
| 113 | 
            +
                assert_no_select 'form select option[value=3]'
         | 
| 114 | 
            +
              end
         | 
| 115 | 
            +
             | 
| 98 116 | 
             
              test 'builder marks the record which already belongs to the user' do
         | 
| 99 117 | 
             
                @user.company_id = 2
         | 
| 100 | 
            -
                with_association_for @user, :company, : | 
| 118 | 
            +
                with_association_for @user, :company, as: :radio_buttons
         | 
| 101 119 | 
             
                assert_no_select 'form input.radio_buttons#user_company_id_1[checked=checked]'
         | 
| 102 120 | 
             
                assert_select 'form input.radio_buttons#user_company_id_2[checked=checked]'
         | 
| 103 121 | 
             
                assert_no_select 'form input.radio_buttons#user_company_id_3[checked=checked]'
         | 
| @@ -113,32 +131,32 @@ class AssociationTest < ActionView::TestCase | |
| 113 131 | 
             
              end
         | 
| 114 132 |  | 
| 115 133 | 
             
              test 'builder should allow overriding collection to association input' do
         | 
| 116 | 
            -
                with_association_for @user, :company, : | 
| 117 | 
            -
                                     : | 
| 134 | 
            +
                with_association_for @user, :company, include_blank: false,
         | 
| 135 | 
            +
                                     collection: [Company.new(999, 'Teste')]
         | 
| 118 136 | 
             
                assert_select 'form select.select#user_company_id'
         | 
| 119 137 | 
             
                assert_no_select 'form select option[value=1]'
         | 
| 120 138 | 
             
                assert_select 'form select option[value=999]', 'Teste'
         | 
| 121 | 
            -
                assert_select 'form select option', : | 
| 139 | 
            +
                assert_select 'form select option', count: 1
         | 
| 122 140 | 
             
              end
         | 
| 123 141 |  | 
| 124 142 | 
             
              # ASSOCIATIONS - has_*
         | 
| 125 143 | 
             
              test 'builder does not allow has_one associations' do
         | 
| 126 144 | 
             
                assert_raise ArgumentError do
         | 
| 127 | 
            -
                  with_association_for @user, :first_company, : | 
| 145 | 
            +
                  with_association_for @user, :first_company, as: :radio_buttons
         | 
| 128 146 | 
             
                end
         | 
| 129 147 | 
             
              end
         | 
| 130 148 |  | 
| 131 149 | 
             
              test 'builder creates a select with multiple options for collection associations' do
         | 
| 132 150 | 
             
                with_association_for @user, :tags
         | 
| 133 151 | 
             
                assert_select 'form select.select#user_tag_ids'
         | 
| 134 | 
            -
                assert_select 'form select[multiple=multiple] | 
| 152 | 
            +
                assert_select 'form select[multiple=multiple]'
         | 
| 135 153 | 
             
                assert_select 'form select option[value=1]', 'Tag 1'
         | 
| 136 154 | 
             
                assert_select 'form select option[value=2]', 'Tag 2'
         | 
| 137 155 | 
             
                assert_select 'form select option[value=3]', 'Tag 3'
         | 
| 138 156 | 
             
              end
         | 
| 139 157 |  | 
| 140 158 | 
             
              test 'builder allows size to be overwritten for collection associations' do
         | 
| 141 | 
            -
                with_association_for @user, :tags, : | 
| 159 | 
            +
                with_association_for @user, :tags, input_html: { size: 10 }
         | 
| 142 160 | 
             
                assert_select 'form select[multiple=multiple][size=10]'
         | 
| 143 161 | 
             
              end
         | 
| 144 162 |  | 
| @@ -152,7 +170,7 @@ class AssociationTest < ActionView::TestCase | |
| 152 170 |  | 
| 153 171 | 
             
              test 'builder allows a collection of check boxes for collection associations' do
         | 
| 154 172 | 
             
                @user.tag_ids = [1, 2]
         | 
| 155 | 
            -
                with_association_for @user, :tags, : | 
| 173 | 
            +
                with_association_for @user, :tags, as: :check_boxes
         | 
| 156 174 | 
             
                assert_select 'form input#user_tag_ids_1[type=checkbox]'
         | 
| 157 175 | 
             
                assert_select 'form input#user_tag_ids_2[type=checkbox]'
         | 
| 158 176 | 
             
                assert_select 'form input#user_tag_ids_3[type=checkbox]'
         | 
| @@ -160,27 +178,27 @@ class AssociationTest < ActionView::TestCase | |
| 160 178 |  | 
| 161 179 | 
             
              test 'builder marks all selected records for collection boxes' do
         | 
| 162 180 | 
             
                @user.tag_ids = [1, 2]
         | 
| 163 | 
            -
                with_association_for @user, :tags, : | 
| 181 | 
            +
                with_association_for @user, :tags, as: :check_boxes
         | 
| 164 182 | 
             
                assert_select 'form input[type=checkbox][value=1][checked=checked]'
         | 
| 165 183 | 
             
                assert_select 'form input[type=checkbox][value=2][checked=checked]'
         | 
| 166 184 | 
             
                assert_no_select 'form input[type=checkbox][value=3][checked=checked]'
         | 
| 167 185 | 
             
              end
         | 
| 168 186 |  | 
| 169 187 | 
             
              test 'builder with collection support giving collection and item wrapper tags' do
         | 
| 170 | 
            -
                with_association_for @user, :tags, : | 
| 171 | 
            -
                  : | 
| 188 | 
            +
                with_association_for @user, :tags, as: :check_boxes,
         | 
| 189 | 
            +
                  collection_wrapper_tag: :ul, item_wrapper_tag: :li
         | 
| 172 190 |  | 
| 173 | 
            -
                assert_select 'form ul', : | 
| 174 | 
            -
                assert_select 'form ul li', : | 
| 191 | 
            +
                assert_select 'form ul', count: 1
         | 
| 192 | 
            +
                assert_select 'form ul li', count: 3
         | 
| 175 193 | 
             
              end
         | 
| 176 194 |  | 
| 177 195 | 
             
              test 'builder with collection support should not change the options hash' do
         | 
| 178 | 
            -
                options = { : | 
| 196 | 
            +
                options = { as: :check_boxes, collection_wrapper_tag: :ul, item_wrapper_tag: :li}
         | 
| 179 197 | 
             
                with_association_for @user, :tags, options
         | 
| 180 198 |  | 
| 181 | 
            -
                assert_select 'form ul', : | 
| 182 | 
            -
                assert_select 'form ul li', : | 
| 183 | 
            -
                assert_equal({ : | 
| 199 | 
            +
                assert_select 'form ul', count: 1
         | 
| 200 | 
            +
                assert_select 'form ul li', count: 3
         | 
| 201 | 
            +
                assert_equal({ as: :check_boxes, collection_wrapper_tag: :ul, item_wrapper_tag: :li},
         | 
| 184 202 | 
             
                             options)
         | 
| 185 203 | 
             
              end
         | 
| 186 204 | 
             
            end
         | 
| @@ -14,15 +14,15 @@ class ButtonTest < ActionView::TestCase | |
| 14 14 | 
             
              end
         | 
| 15 15 |  | 
| 16 16 | 
             
              test 'builder should create buttons with options' do
         | 
| 17 | 
            -
                with_button_for :post, :submit, : | 
| 17 | 
            +
                with_button_for :post, :submit, class: 'my_button'
         | 
| 18 18 | 
             
                assert_select 'form input.button.my_button[type=submit][value=Save Post]'
         | 
| 19 19 | 
             
              end
         | 
| 20 20 |  | 
| 21 21 | 
             
              test 'builder should not modify the options hash' do
         | 
| 22 | 
            -
                options = { : | 
| 22 | 
            +
                options = { class: 'my_button' }
         | 
| 23 23 | 
             
                with_button_for :post, :submit, options
         | 
| 24 24 | 
             
                assert_select 'form input.button.my_button[type=submit][value=Save Post]'
         | 
| 25 | 
            -
                assert_equal({ : | 
| 25 | 
            +
                assert_equal({ class: 'my_button' }, options)
         | 
| 26 26 | 
             
              end
         | 
| 27 27 |  | 
| 28 28 | 
             
              test 'builder should create buttons for records' do
         | 
| @@ -32,7 +32,7 @@ class ButtonTest < ActionView::TestCase | |
| 32 32 | 
             
              end
         | 
| 33 33 |  | 
| 34 34 | 
             
              test "builder should use the default class from the configuration" do
         | 
| 35 | 
            -
                swap SimpleForm, : | 
| 35 | 
            +
                swap SimpleForm, button_class: 'btn' do
         | 
| 36 36 | 
             
                  with_button_for :post, :submit
         | 
| 37 37 | 
             
                  assert_select 'form input.btn[type=submit][value=Save Post]'
         | 
| 38 38 | 
             
                end
         | 
| @@ -27,7 +27,7 @@ class ErrorNotificationTest < ActionView::TestCase | |
| 27 27 | 
             
              end
         | 
| 28 28 |  | 
| 29 29 | 
             
              test 'error notification uses I18n based on model to generate the notification message' do
         | 
| 30 | 
            -
                store_translations(:en, : | 
| 30 | 
            +
                store_translations(:en, simple_form: { error_notification: { user:
         | 
| 31 31 | 
             
                  'Alguns erros foram encontrados para o usuário:'
         | 
| 32 32 | 
             
                } }) do
         | 
| 33 33 | 
             
                  with_error_notification_for @user
         | 
| @@ -36,8 +36,8 @@ class ErrorNotificationTest < ActionView::TestCase | |
| 36 36 | 
             
              end
         | 
| 37 37 |  | 
| 38 38 | 
             
              test 'error notification uses I18n fallbacking to default message' do
         | 
| 39 | 
            -
                store_translations(:en, : | 
| 40 | 
            -
                  : | 
| 39 | 
            +
                store_translations(:en, simple_form: { error_notification: {
         | 
| 40 | 
            +
                  default_message: 'Opa! Alguns erros foram encontrados, poderia verificar?'
         | 
| 41 41 | 
             
                } }) do
         | 
| 42 42 | 
             
                  with_error_notification_for @user
         | 
| 43 43 | 
             
                  assert_select 'p.error_notification', 'Opa! Alguns erros foram encontrados, poderia verificar?'
         | 
| @@ -45,30 +45,30 @@ class ErrorNotificationTest < ActionView::TestCase | |
| 45 45 | 
             
              end
         | 
| 46 46 |  | 
| 47 47 | 
             
              test 'error notification allows passing the notification message' do
         | 
| 48 | 
            -
                with_error_notification_for @user, : | 
| 48 | 
            +
                with_error_notification_for @user, message: 'Erro encontrado ao criar usuario'
         | 
| 49 49 | 
             
                assert_select 'p.error_notification', 'Erro encontrado ao criar usuario'
         | 
| 50 50 | 
             
              end
         | 
| 51 51 |  | 
| 52 52 | 
             
              test 'error notification accepts other html options' do
         | 
| 53 | 
            -
                with_error_notification_for @user, : | 
| 53 | 
            +
                with_error_notification_for @user, id: 'user_error_message', class: 'form_error'
         | 
| 54 54 | 
             
                assert_select 'p#user_error_message.form_error.error_notification'
         | 
| 55 55 | 
             
              end
         | 
| 56 56 |  | 
| 57 57 | 
             
              test 'error notification allows configuring the wrapper element' do
         | 
| 58 | 
            -
                swap SimpleForm, : | 
| 58 | 
            +
                swap SimpleForm, error_notification_tag: :div do
         | 
| 59 59 | 
             
                  with_error_notification_for @user
         | 
| 60 60 | 
             
                  assert_select 'div.error_notification'
         | 
| 61 61 | 
             
                end
         | 
| 62 62 | 
             
              end
         | 
| 63 63 |  | 
| 64 64 | 
             
              test 'error notification can contain HTML tags' do
         | 
| 65 | 
            -
                with_error_notification_for @user, : | 
| 65 | 
            +
                with_error_notification_for @user, message: 'Erro encontrado ao criar <b>usuário</b>'
         | 
| 66 66 | 
             
                assert_select 'p.error_notification', 'Erro encontrado ao criar usuário'
         | 
| 67 67 | 
             
                assert_select 'p.error_notification b', 'usuário'
         | 
| 68 68 | 
             
              end
         | 
| 69 69 |  | 
| 70 70 | 
             
              test 'error notification uses I18n based on model to generate the notification message and accepts HTML' do
         | 
| 71 | 
            -
                store_translations(:en, : | 
| 71 | 
            +
                store_translations(:en, simple_form: { error_notification: { user:
         | 
| 72 72 | 
             
                  'Alguns erros foram encontrados para o <b>usuário</b>:'
         | 
| 73 73 | 
             
                } }) do
         | 
| 74 74 | 
             
                  with_error_notification_for @user
         | 
| @@ -36,34 +36,34 @@ class ErrorTest < ActionView::TestCase | |
| 36 36 | 
             
              end
         | 
| 37 37 |  | 
| 38 38 | 
             
              test 'error should generate messages for attribute with one error when using first' do
         | 
| 39 | 
            -
                swap SimpleForm, : | 
| 39 | 
            +
                swap SimpleForm, error_method: :first do
         | 
| 40 40 | 
             
                  with_error_for @user, :age
         | 
| 41 41 | 
             
                  assert_select 'span.error', 'is not a number'
         | 
| 42 42 | 
             
                end
         | 
| 43 43 | 
             
              end
         | 
| 44 44 |  | 
| 45 45 | 
             
              test 'error should generate messages for attribute with several errors when using to_sentence' do
         | 
| 46 | 
            -
                swap SimpleForm, : | 
| 46 | 
            +
                swap SimpleForm, error_method: :to_sentence do
         | 
| 47 47 | 
             
                  with_error_for @user, :age
         | 
| 48 48 | 
             
                  assert_select 'span.error', 'is not a number and must be greater than 18'
         | 
| 49 49 | 
             
                end
         | 
| 50 50 | 
             
              end
         | 
| 51 51 |  | 
| 52 52 | 
             
              test 'error should be able to pass html options' do
         | 
| 53 | 
            -
                with_error_for @user, :name, : | 
| 53 | 
            +
                with_error_for @user, :name, id: 'error', class: 'yay'
         | 
| 54 54 | 
             
                assert_select 'span#error.error.yay'
         | 
| 55 55 | 
             
              end
         | 
| 56 56 |  | 
| 57 57 | 
             
              test 'error should not modify the options hash' do
         | 
| 58 | 
            -
                options = { : | 
| 58 | 
            +
                options = { id: 'error', class: 'yay' }
         | 
| 59 59 | 
             
                with_error_for @user, :name, options
         | 
| 60 60 | 
             
                assert_select 'span#error.error.yay'
         | 
| 61 | 
            -
                assert_equal({ : | 
| 61 | 
            +
                assert_equal({ id: 'error', class: 'yay' }, options)
         | 
| 62 62 | 
             
              end
         | 
| 63 63 |  | 
| 64 64 | 
             
              test 'error should find errors on attribute and association' do
         | 
| 65 | 
            -
                with_error_for @user, :company_id, : | 
| 66 | 
            -
                  : | 
| 65 | 
            +
                with_error_for @user, :company_id, as: :select,
         | 
| 66 | 
            +
                  error_method: :to_sentence, reflection: Association.new(Company, :company, {})
         | 
| 67 67 | 
             
                assert_select 'span.error', 'must be valid and company must be present'
         | 
| 68 68 | 
             
              end
         | 
| 69 69 |  | 
| @@ -73,7 +73,7 @@ class ErrorTest < ActionView::TestCase | |
| 73 73 | 
             
              end
         | 
| 74 74 |  | 
| 75 75 | 
             
              test 'error should generate an error tag with a clean HTML when errors options are present' do
         | 
| 76 | 
            -
                with_error_for @user, :name, : | 
| 76 | 
            +
                with_error_for @user, :name, error_tag: :p, error_prefix: 'Name', error_method: :first
         | 
| 77 77 | 
             
                assert_no_select 'p.error[error_html]'
         | 
| 78 78 | 
             
                assert_no_select 'p.error[error_tag]'
         | 
| 79 79 | 
             
                assert_no_select 'p.error[error_prefix]'
         | 
| @@ -81,7 +81,7 @@ class ErrorTest < ActionView::TestCase | |
| 81 81 | 
             
              end
         | 
| 82 82 |  | 
| 83 83 | 
             
              test 'error should generate an error message with raw HTML tags' do
         | 
| 84 | 
            -
                with_error_for @user, :name, : | 
| 84 | 
            +
                with_error_for @user, :name, error_prefix: '<b>Name</b>'
         | 
| 85 85 | 
             
                assert_select 'span.error', "Name can't be blank"
         | 
| 86 86 | 
             
                assert_select 'span.error b', "Name"
         | 
| 87 87 | 
             
              end
         | 
| @@ -99,15 +99,15 @@ class ErrorTest < ActionView::TestCase | |
| 99 99 | 
             
              end
         | 
| 100 100 |  | 
| 101 101 | 
             
              test 'full error should allow passing options to full error tag' do
         | 
| 102 | 
            -
                with_full_error_for @user, :name, : | 
| 102 | 
            +
                with_full_error_for @user, :name, id: 'name_error', error_prefix: "Your name"
         | 
| 103 103 | 
             
                assert_select 'span.error#name_error', "Your name can't be blank"
         | 
| 104 104 | 
             
              end
         | 
| 105 105 |  | 
| 106 106 | 
             
              test 'full error should not modify the options hash' do
         | 
| 107 | 
            -
                options = { : | 
| 107 | 
            +
                options = { id: 'name_error' }
         | 
| 108 108 | 
             
                with_full_error_for @user, :name, options
         | 
| 109 109 | 
             
                assert_select 'span.error#name_error', "Super User Name! can't be blank"
         | 
| 110 | 
            -
                assert_equal({ : | 
| 110 | 
            +
                assert_equal({ id: 'name_error' }, options)
         | 
| 111 111 | 
             
              end
         | 
| 112 112 |  | 
| 113 113 | 
             
              # CUSTOM WRAPPERS
         |