simple_form 3.0.4 → 3.1.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.
Files changed (86) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +45 -45
  3. data/MIT-LICENSE +1 -1
  4. data/README.md +204 -81
  5. data/lib/generators/simple_form/install_generator.rb +3 -3
  6. data/lib/generators/simple_form/templates/README +3 -4
  7. data/lib/generators/simple_form/templates/config/initializers/simple_form.rb +28 -7
  8. data/lib/generators/simple_form/templates/config/initializers/simple_form_bootstrap.rb +115 -24
  9. data/lib/generators/simple_form/templates/config/initializers/simple_form_foundation.rb +86 -5
  10. data/lib/generators/simple_form/templates/config/locales/simple_form.en.yml +7 -2
  11. data/lib/simple_form/action_view_extensions/builder.rb +1 -0
  12. data/lib/simple_form/action_view_extensions/form_helper.rb +6 -2
  13. data/lib/simple_form/components/errors.rb +24 -4
  14. data/lib/simple_form/components/hints.rb +2 -2
  15. data/lib/simple_form/components/html5.rb +1 -1
  16. data/lib/simple_form/components/label_input.rb +20 -2
  17. data/lib/simple_form/components/labels.rb +10 -6
  18. data/lib/simple_form/components/maxlength.rb +1 -1
  19. data/lib/simple_form/components/min_max.rb +1 -1
  20. data/lib/simple_form/components/pattern.rb +1 -1
  21. data/lib/simple_form/components/placeholders.rb +2 -2
  22. data/lib/simple_form/components/readonly.rb +1 -1
  23. data/lib/simple_form/form_builder.rb +122 -74
  24. data/lib/simple_form/helpers.rb +5 -5
  25. data/lib/simple_form/inputs/base.rb +34 -12
  26. data/lib/simple_form/inputs/block_input.rb +1 -1
  27. data/lib/simple_form/inputs/boolean_input.rb +28 -15
  28. data/lib/simple_form/inputs/collection_input.rb +30 -9
  29. data/lib/simple_form/inputs/collection_radio_buttons_input.rb +6 -11
  30. data/lib/simple_form/inputs/collection_select_input.rb +4 -2
  31. data/lib/simple_form/inputs/date_time_input.rb +12 -2
  32. data/lib/simple_form/inputs/file_input.rb +4 -2
  33. data/lib/simple_form/inputs/grouped_collection_select_input.rb +15 -3
  34. data/lib/simple_form/inputs/hidden_input.rb +4 -2
  35. data/lib/simple_form/inputs/numeric_input.rb +5 -4
  36. data/lib/simple_form/inputs/password_input.rb +4 -2
  37. data/lib/simple_form/inputs/priority_input.rb +4 -2
  38. data/lib/simple_form/inputs/range_input.rb +1 -1
  39. data/lib/simple_form/inputs/string_input.rb +4 -2
  40. data/lib/simple_form/inputs/text_input.rb +4 -2
  41. data/lib/simple_form/railtie.rb +7 -0
  42. data/lib/simple_form/tags.rb +6 -0
  43. data/lib/simple_form/version.rb +1 -1
  44. data/lib/simple_form/wrappers/builder.rb +6 -6
  45. data/lib/simple_form/wrappers/leaf.rb +28 -0
  46. data/lib/simple_form/wrappers/many.rb +6 -6
  47. data/lib/simple_form/wrappers/root.rb +1 -1
  48. data/lib/simple_form/wrappers/single.rb +5 -3
  49. data/lib/simple_form/wrappers.rb +1 -0
  50. data/lib/simple_form.rb +59 -8
  51. data/test/action_view_extensions/builder_test.rb +36 -36
  52. data/test/action_view_extensions/form_helper_test.rb +33 -14
  53. data/test/components/label_test.rb +37 -37
  54. data/test/form_builder/association_test.rb +52 -35
  55. data/test/form_builder/button_test.rb +10 -10
  56. data/test/form_builder/error_notification_test.rb +1 -1
  57. data/test/form_builder/error_test.rb +111 -33
  58. data/test/form_builder/general_test.rb +89 -64
  59. data/test/form_builder/hint_test.rb +18 -18
  60. data/test/form_builder/input_field_test.rb +40 -16
  61. data/test/form_builder/label_test.rb +45 -13
  62. data/test/form_builder/wrapper_test.rb +135 -19
  63. data/test/generators/simple_form_generator_test.rb +4 -4
  64. data/test/inputs/boolean_input_test.rb +62 -6
  65. data/test/inputs/collection_check_boxes_input_test.rb +85 -17
  66. data/test/inputs/collection_radio_buttons_input_test.rb +134 -36
  67. data/test/inputs/collection_select_input_test.rb +146 -41
  68. data/test/inputs/datetime_input_test.rb +117 -50
  69. data/test/inputs/disabled_test.rb +15 -15
  70. data/test/inputs/discovery_test.rb +56 -6
  71. data/test/inputs/file_input_test.rb +2 -2
  72. data/test/inputs/general_test.rb +20 -20
  73. data/test/inputs/grouped_collection_select_input_test.rb +44 -8
  74. data/test/inputs/hidden_input_test.rb +4 -4
  75. data/test/inputs/numeric_input_test.rb +43 -43
  76. data/test/inputs/priority_input_test.rb +13 -13
  77. data/test/inputs/readonly_test.rb +19 -19
  78. data/test/inputs/required_test.rb +13 -13
  79. data/test/inputs/string_input_test.rb +50 -30
  80. data/test/inputs/text_input_test.rb +7 -7
  81. data/test/simple_form_test.rb +8 -0
  82. data/test/support/discovery_inputs.rb +32 -2
  83. data/test/support/misc_helpers.rb +71 -5
  84. data/test/support/models.rb +60 -24
  85. data/test/test_helper.rb +5 -1
  86. metadata +5 -5
@@ -2,7 +2,7 @@ require 'test_helper'
2
2
 
3
3
  # Tests for f.input_field
4
4
  class InputFieldTest < ActionView::TestCase
5
- test "builder input_field should only render the input tag, nothing else" do
5
+ test "builder input_field only renders the input tag, nothing else" do
6
6
  with_concat_form_for(@user) do |f|
7
7
  f.input_field :name
8
8
  end
@@ -12,7 +12,7 @@ class InputFieldTest < ActionView::TestCase
12
12
  assert_no_select '.hint'
13
13
  end
14
14
 
15
- test 'builder input_field should allow overriding default input type' do
15
+ test 'builder input_field allows overriding default input type' do
16
16
  with_concat_form_for(@user) do |f|
17
17
  f.input_field :name, as: :text
18
18
  end
@@ -21,7 +21,7 @@ class InputFieldTest < ActionView::TestCase
21
21
  assert_select 'textarea#user_name.text'
22
22
  end
23
23
 
24
- test 'builder input_field should generate input type based on column type' do
24
+ test 'builder input_field generates input type based on column type' do
25
25
  with_concat_form_for(@user) do |f|
26
26
  f.input_field :age
27
27
  end
@@ -29,7 +29,7 @@ class InputFieldTest < ActionView::TestCase
29
29
  assert_select 'input[type=number].integer#user_age'
30
30
  end
31
31
 
32
- test 'builder input_field should be able to disable any component' do
32
+ test 'builder input_field is able to disable any component' do
33
33
  with_concat_form_for(@user) do |f|
34
34
  f.input_field :age, html5: false
35
35
  end
@@ -38,7 +38,7 @@ class InputFieldTest < ActionView::TestCase
38
38
  assert_select 'input[type=text].integer#user_age'
39
39
  end
40
40
 
41
- test 'builder input_field should allow passing options to input tag' do
41
+ test 'builder input_field allows passing options to input tag' do
42
42
  with_concat_form_for(@user) do |f|
43
43
  f.input_field :name, id: 'name_input', class: 'name'
44
44
  end
@@ -46,7 +46,7 @@ class InputFieldTest < ActionView::TestCase
46
46
  assert_select 'input.string.name#name_input'
47
47
  end
48
48
 
49
- test 'builder input_field should not modify the options hash' do
49
+ test 'builder input_field does not modify the options hash' do
50
50
  options = { id: 'name_input', class: 'name' }
51
51
 
52
52
  with_concat_form_for(@user) do |f|
@@ -58,7 +58,7 @@ class InputFieldTest < ActionView::TestCase
58
58
  end
59
59
 
60
60
 
61
- test 'builder input_field should generate an input tag with a clean HTML' do
61
+ test 'builder input_field generates an input tag with a clean HTML' do
62
62
  with_concat_form_for(@user) do |f|
63
63
  f.input_field :name, as: :integer, class: 'name'
64
64
  end
@@ -67,7 +67,7 @@ class InputFieldTest < ActionView::TestCase
67
67
  assert_no_select 'input.integer[as]'
68
68
  end
69
69
 
70
- test 'builder input_field should use i18n to translate placeholder text' do
70
+ test 'builder input_field uses i18n to translate placeholder text' do
71
71
  store_translations(:en, simple_form: { placeholders: { user: {
72
72
  name: 'Name goes here'
73
73
  } } }) do
@@ -76,27 +76,43 @@ class InputFieldTest < ActionView::TestCase
76
76
  f.input_field :name
77
77
  end
78
78
 
79
- assert_select 'input.string[placeholder=Name goes here]'
79
+ assert_select 'input.string[placeholder="Name goes here"]'
80
80
  end
81
81
  end
82
82
 
83
- test 'builder input_field should use min_max component' do
83
+ test 'builder input_field uses min_max component' do
84
84
  with_concat_form_for(@other_validating_user) do |f|
85
85
  f.input_field :age, as: :integer
86
86
  end
87
87
 
88
- assert_select 'input[min=18]'
88
+ assert_select 'input[min="18"]'
89
89
  end
90
90
 
91
- test 'builder input_field should use pattern component' do
91
+ test 'builder input_field does not use pattern component by default' do
92
92
  with_concat_form_for(@other_validating_user) do |f|
93
93
  f.input_field :country, as: :string
94
94
  end
95
95
 
96
+ assert_no_select 'input[pattern="\w+"]'
97
+ end
98
+
99
+ test 'builder input_field infers pattern from attributes' do
100
+ with_concat_form_for(@other_validating_user) do |f|
101
+ f.input_field :country, as: :string, pattern: true
102
+ end
103
+
96
104
  assert_select 'input[pattern="\w+"]'
97
105
  end
98
106
 
99
- test 'builder input_field should use readonly component' do
107
+ test 'builder input_field accepts custom patter' do
108
+ with_concat_form_for(@other_validating_user) do |f|
109
+ f.input_field :country, as: :string, pattern: '\d+'
110
+ end
111
+
112
+ assert_select 'input[pattern="\d+"]'
113
+ end
114
+
115
+ test 'builder input_field uses readonly component' do
100
116
  with_concat_form_for(@other_validating_user) do |f|
101
117
  f.input_field :age, as: :integer, readonly: true
102
118
  end
@@ -104,15 +120,15 @@ class InputFieldTest < ActionView::TestCase
104
120
  assert_select 'input.integer.readonly[readonly]'
105
121
  end
106
122
 
107
- test 'builder input_field should use maxlength component' do
123
+ test 'builder input_field uses maxlength component' do
108
124
  with_concat_form_for(@validating_user) do |f|
109
125
  f.input_field :name, as: :string
110
126
  end
111
127
 
112
- assert_select 'input.string[maxlength=25]'
128
+ assert_select 'input.string[maxlength="25"]'
113
129
  end
114
130
 
115
- test 'builder collection input_field should generate input tag with a clean HTML' do
131
+ test 'builder collection input_field generates input tag with a clean HTML' do
116
132
  with_concat_form_for(@user) do |f|
117
133
  f.input_field :status, collection: ['Open', 'Closed'], class: 'status', label_method: :to_s, value_method: :to_s
118
134
  end
@@ -123,6 +139,14 @@ class InputFieldTest < ActionView::TestCase
123
139
  assert_no_select 'select.status[value_method]'
124
140
  end
125
141
 
142
+ test 'build input_field does not treat "boolean_style" as a HTML attribute' do
143
+ with_concat_form_for(@user) do |f|
144
+ f.input_field :active, boolean_style: :nested
145
+ end
146
+
147
+ assert_no_select 'input.boolean[boolean_style]'
148
+ end
149
+
126
150
  test 'build input_field without pattern component use the pattern string' do
127
151
  swap_wrapper :default, self.custom_wrapper_with_html5_components do
128
152
  with_concat_form_for(@user) do |f|
@@ -8,63 +8,63 @@ class LabelTest < ActionView::TestCase
8
8
  end
9
9
  end
10
10
 
11
- test 'builder should generate a label for the attribute' do
11
+ test 'builder generates a label for the attribute' do
12
12
  with_label_for @user, :name
13
13
  assert_select 'label.string[for=user_name]', /Name/
14
14
  end
15
15
 
16
- test 'builder should generate a label for the boolean attrbiute' do
16
+ test 'builder generates a label for the boolean attrbiute' do
17
17
  with_label_for @user, :name, as: :boolean
18
18
  assert_select 'label.boolean[for=user_name]', /Name/
19
19
  assert_no_select 'label[as=boolean]'
20
20
  end
21
21
 
22
- test 'builder should generate a label component tag with a clean HTML' do
22
+ test 'builder generates a label component tag with a clean HTML' do
23
23
  with_label_for @user, :name
24
24
  assert_no_select 'label.string[label_html]'
25
25
  end
26
26
 
27
- test 'builder should add a required class to label if the attribute is required' do
27
+ test 'builder adds a required class to label if the attribute is required' do
28
28
  with_label_for @validating_user, :name
29
29
  assert_select 'label.string.required[for=validating_user_name]', /Name/
30
30
  end
31
31
 
32
- test 'builder should escape label text' do
32
+ test 'builder escapes label text' do
33
33
  with_label_for @user, :name, label: '<script>alert(1337)</script>', required: false
34
- assert_select 'label.string', "&lt;script&gt;alert(1337)&lt;/script&gt;"
34
+ assert_no_select 'label.string script'
35
35
  end
36
36
 
37
- test 'builder should not escape label text if it is safe' do
37
+ test 'builder does not escape label text if it is safe' do
38
38
  with_label_for @user, :name, label: '<script>alert(1337)</script>'.html_safe, required: false
39
39
  assert_select 'label.string script', "alert(1337)"
40
40
  end
41
41
 
42
- test 'builder should allow passing options to label tag' do
42
+ test 'builder allows passing options to label tag' do
43
43
  with_label_for @user, :name, label: 'My label', id: 'name_label'
44
44
  assert_select 'label.string#name_label', /My label/
45
45
  end
46
46
 
47
- test 'builder label should generate label tag with clean HTML' do
47
+ test 'builder label generates label tag with clean HTML' do
48
48
  with_label_for @user, :name, label: 'My label', required: true, id: 'name_label'
49
49
  assert_select 'label.string#name_label', /My label/
50
50
  assert_no_select 'label[label]'
51
51
  assert_no_select 'label[required]'
52
52
  end
53
53
 
54
- test 'builder should not modify the options hash' do
54
+ test 'builder does not modify the options hash' do
55
55
  options = { label: 'My label', id: 'name_label' }
56
56
  with_label_for @user, :name, options
57
57
  assert_select 'label.string#name_label', /My label/
58
58
  assert_equal({ label: 'My label', id: 'name_label' }, options)
59
59
  end
60
60
 
61
- test 'builder should fallback to default label when string is given' do
61
+ test 'builder fallbacks to default label when string is given' do
62
62
  with_label_for @user, :name, 'Nome do usuário'
63
63
  assert_select 'label', 'Nome do usuário'
64
64
  assert_no_select 'label.string'
65
65
  end
66
66
 
67
- test 'builder should fallback to default label when block is given' do
67
+ test 'builder fallbacks to default label when block is given' do
68
68
  with_label_for @user, :name do
69
69
  'Nome do usuário'
70
70
  end
@@ -73,9 +73,41 @@ class LabelTest < ActionView::TestCase
73
73
  end
74
74
 
75
75
  test 'builder allows label order to be changed' do
76
- swap SimpleForm, label_text: lambda { |l, r| "#{l}:" } do
76
+ swap SimpleForm, label_text: proc { |l, r| "#{l}:" } do
77
77
  with_label_for @user, :age
78
78
  assert_select 'label.integer[for=user_age]', "Age:"
79
79
  end
80
80
  end
81
+
82
+ test 'configuration allow set label text for wrappers' do
83
+ swap_wrapper :default, self.custom_wrapper_with_label_text do
84
+ with_concat_form_for(@user) do |f|
85
+ concat f.input :age
86
+ end
87
+ assert_select "label.integer[for=user_age]", "**Age**"
88
+ end
89
+ end
90
+
91
+ test 'configuration allow set rewrited label tag for wrappers' do
92
+ swap_wrapper :default, self.custom_wrapper_with_custom_label_component do
93
+ with_concat_form_for(@user) do |f|
94
+ concat f.input :age
95
+ end
96
+ assert_select "span.integer.user_age", /Age/
97
+ end
98
+ end
99
+
100
+ test 'builder allows custom formatting when label is explicitly specified' do
101
+ swap SimpleForm, label_text: lambda { |l, r, explicit_label| explicit_label ? l : "#{l.titleize}:" } do
102
+ with_label_for @user, :time_zone, 'What is your home time zone?'
103
+ assert_select 'label[for=user_time_zone]', 'What is your home time zone?'
104
+ end
105
+ end
106
+
107
+ test 'builder allows custom formatting when label is generated' do
108
+ swap SimpleForm, label_text: lambda { |l, r, explicit_label| explicit_label ? l : "#{l.titleize}:" } do
109
+ with_label_for @user, :time_zone
110
+ assert_select 'label[for=user_time_zone]', 'Time Zone:'
111
+ end
112
+ end
81
113
  end
@@ -1,22 +1,22 @@
1
1
  require 'test_helper'
2
2
 
3
3
  class WrapperTest < ActionView::TestCase
4
- test 'wrapper should not have error class for attribute without errors' do
4
+ test 'wrapper does not have error class for attribute without errors' do
5
5
  with_form_for @user, :active
6
6
  assert_no_select 'div.field_with_errors'
7
7
  end
8
8
 
9
- test 'wrapper should not have error class when object is not present' do
9
+ test 'wrapper does not have error class when object is not present' do
10
10
  with_form_for :project, :name
11
11
  assert_no_select 'div.field_with_errors'
12
12
  end
13
13
 
14
- test 'wrapper should add the attribute name class' do
14
+ test 'wrapper adds the attribute name class' do
15
15
  with_form_for @user, :name
16
16
  assert_select 'div.user_name'
17
17
  end
18
18
 
19
- test 'wrapper should add the attribute name class for nested forms' do
19
+ test 'wrapper adds the attribute name class for nested forms' do
20
20
  @user.company = Company.new(1, 'Empresa')
21
21
  with_concat_form_for @user do |f|
22
22
  concat(f.simple_fields_for(:company) do |company_form|
@@ -27,44 +27,44 @@ class WrapperTest < ActionView::TestCase
27
27
  assert_select 'div.user_company_name'
28
28
  end
29
29
 
30
- test 'wrapper should add the association name class' do
30
+ test 'wrapper adds the association name class' do
31
31
  with_form_for @user, :company
32
32
  assert_select 'div.user_company'
33
33
  end
34
34
 
35
- test 'wrapper should add error class for attribute with errors' do
35
+ test 'wrapper adds error class for attribute with errors' do
36
36
  with_form_for @user, :name
37
37
  assert_select 'div.field_with_errors'
38
38
  end
39
39
 
40
- test 'wrapper should add hint class for attribute with a hint' do
40
+ test 'wrapper adds hint class for attribute with a hint' do
41
41
  with_form_for @user, :name, hint: 'hint'
42
42
  assert_select 'div.field_with_hint'
43
43
  end
44
44
 
45
- test 'wrapper should not have disabled class by default' do
45
+ test 'wrapper does not have disabled class by default' do
46
46
  with_form_for @user, :active
47
47
  assert_no_select 'div.disabled'
48
48
  end
49
49
 
50
- test 'wrapper should have disabled class when input is disabled' do
50
+ test 'wrapper has disabled class when input is disabled' do
51
51
  with_form_for @user, :active, disabled: true
52
52
  assert_select 'div.disabled'
53
53
  end
54
54
 
55
- test 'wrapper should support no wrapping when wrapper is false' do
55
+ test 'wrapper supports no wrapping when wrapper is false' do
56
56
  with_form_for @user, :name, wrapper: false
57
57
  assert_select 'form > label[for=user_name]'
58
58
  assert_select 'form > input#user_name.string'
59
59
  end
60
60
 
61
- test 'wrapper should support no wrapping when wrapper tag is false' do
61
+ test 'wrapper supports no wrapping when wrapper tag is false' do
62
62
  with_form_for @user, :name, wrapper: custom_wrapper_without_top_level
63
63
  assert_select 'form > label[for=user_name]'
64
64
  assert_select 'form > input#user_name.string'
65
65
  end
66
66
 
67
- test 'wrapper should wrapping tag adds required/optional css classes' do
67
+ test 'wrapper wraps tag adds required/optional css classes' do
68
68
  with_form_for @user, :name
69
69
  assert_select 'form div.input.required.string'
70
70
 
@@ -72,22 +72,22 @@ class WrapperTest < ActionView::TestCase
72
72
  assert_select 'form div.input.optional.integer'
73
73
  end
74
74
 
75
- test 'wrapper should allow custom options to be given' do
75
+ test 'wrapper allows custom options to be given' do
76
76
  with_form_for @user, :name, wrapper_html: { id: "super_cool", class: 'yay' }
77
77
  assert_select 'form #super_cool.required.string.yay'
78
78
  end
79
79
 
80
- test 'wrapper should allow tag to be given on demand' do
80
+ test 'wrapper allows tag to be given on demand' do
81
81
  with_form_for @user, :name, wrapper_tag: :b
82
82
  assert_select 'form b.required.string'
83
83
  end
84
84
 
85
- test 'wrapper should allow wrapper class to be given on demand' do
85
+ test 'wrapper allows wrapper class to be given on demand' do
86
86
  with_form_for @user, :name, wrapper_class: :wrapper
87
87
  assert_select 'form div.wrapper.required.string'
88
88
  end
89
89
 
90
- test 'wrapper should skip additional classes when configured' do
90
+ test 'wrapper skips additional classes when configured' do
91
91
  swap SimpleForm, generate_additional_classes_for: [:input, :label] do
92
92
  with_form_for @user, :name, wrapper_class: :wrapper
93
93
  assert_select 'form div.wrapper'
@@ -97,7 +97,7 @@ class WrapperTest < ActionView::TestCase
97
97
  end
98
98
  end
99
99
 
100
- test 'wrapper should not generate empty css class' do
100
+ test 'wrapper does not generate empty css class' do
101
101
  swap SimpleForm, generate_additional_classes_for: [:input, :label] do
102
102
  swap_wrapper :default, custom_wrapper_without_class do
103
103
  with_form_for @user, :name
@@ -128,6 +128,21 @@ class WrapperTest < ActionView::TestCase
128
128
  end
129
129
  end
130
130
 
131
+ test 'custom wrappers can have additional attributes' do
132
+ swap_wrapper :default, self.custom_wrapper_with_additional_attributes do
133
+ with_form_for @user, :name
134
+
135
+ assert_select "div.custom_wrapper[title='some title'][data-wrapper='test']"
136
+ end
137
+ end
138
+
139
+ test 'custom wrappers can have full error message on attributes' do
140
+ swap_wrapper :default, self.custom_wrapper_with_full_error do
141
+ with_form_for @user, :name
142
+ assert_select 'span.error', "Name cannot be blank"
143
+ end
144
+ end
145
+
131
146
  test 'custom wrappers on a form basis' do
132
147
  swap_wrapper :another do
133
148
  with_concat_form_for(@user) do |f|
@@ -172,7 +187,7 @@ class WrapperTest < ActionView::TestCase
172
187
  end
173
188
  end
174
189
 
175
- test 'do not duplicate label classes for different inputs' do
190
+ test 'does not duplicate label classes for different inputs' do
176
191
  swap_wrapper :default, self.custom_wrapper_with_label_html_option do
177
192
  with_concat_form_for(@user) do |f|
178
193
  concat f.input :name, required: false
@@ -191,7 +206,7 @@ class WrapperTest < ActionView::TestCase
191
206
  end
192
207
  end
193
208
 
194
- test 'use wrapper for specified in config mapping' do
209
+ test 'uses wrapper for specified in config mapping' do
195
210
  swap_wrapper :another do
196
211
  swap SimpleForm, wrapper_mappings: { string: :another } do
197
212
  with_form_for @user, :name
@@ -200,4 +215,105 @@ class WrapperTest < ActionView::TestCase
200
215
  end
201
216
  end
202
217
  end
218
+
219
+ test 'uses custom wrapper mapping per form basis' do
220
+ swap_wrapper :another do
221
+ with_concat_form_for @user, wrapper_mappings: { string: :another } do |f|
222
+ concat f.input :name
223
+ end
224
+ end
225
+
226
+ assert_select "section.custom_wrapper div.another_wrapper label"
227
+ assert_select "section.custom_wrapper div.another_wrapper input.string"
228
+ end
229
+
230
+ test 'simple_fields_form reuses custom wrapper mapping per form basis' do
231
+ @user.company = Company.new(1, 'Empresa')
232
+
233
+ swap_wrapper :another do
234
+ with_concat_form_for @user, wrapper_mappings: { string: :another } do |f|
235
+ concat(f.simple_fields_for(:company) do |company_form|
236
+ concat(company_form.input(:name))
237
+ end)
238
+ end
239
+ end
240
+
241
+ assert_select "section.custom_wrapper div.another_wrapper label"
242
+ assert_select "section.custom_wrapper div.another_wrapper input.string"
243
+ end
244
+
245
+ test 'input accepts attributes in the DSL' do
246
+ swap_wrapper :default, self.custom_wrapper_with_input_class do
247
+ with_concat_form_for @user do |f|
248
+ concat f.input :name
249
+ end
250
+ end
251
+
252
+ assert_select "div.custom_wrapper input.string.inline-class"
253
+ end
254
+
255
+ test 'label accepts attributes in the DSL' do
256
+ swap_wrapper :default, self.custom_wrapper_with_label_class do
257
+ with_concat_form_for @user do |f|
258
+ concat f.input :name
259
+ end
260
+ end
261
+
262
+ assert_select "div.custom_wrapper label.string.inline-class"
263
+ end
264
+
265
+ test 'label_input accepts attributes in the DSL' do
266
+ swap_wrapper :default, self.custom_wrapper_with_label_input_class do
267
+ with_concat_form_for @user do |f|
268
+ concat f.input :name
269
+ end
270
+ end
271
+
272
+ assert_select "div.custom_wrapper label.string.inline-class"
273
+ assert_select "div.custom_wrapper input.string.inline-class"
274
+ end
275
+
276
+ test 'input accepts data attributes in the DSL' do
277
+ swap_wrapper :default, self.custom_wrapper_with_input_attributes do
278
+ with_concat_form_for @user do |f|
279
+ concat f.input :name
280
+ end
281
+ end
282
+
283
+ assert_select "div.custom_wrapper input.string[data-modal=true]"
284
+ end
285
+
286
+ test 'inline wrapper displays when there is content' do
287
+ swap_wrapper :default, self.custom_wrapper_with_wrapped_optional_component do
288
+ with_form_for @user, :name, hint: "cannot be blank"
289
+ assert_select 'section.custom_wrapper div.no_output_wrapper p.omg_hint', "cannot be blank"
290
+ assert_select 'p.omg_hint'
291
+ end
292
+ end
293
+
294
+ test 'inline wrapper does not display when there is no content' do
295
+ swap_wrapper :default, self.custom_wrapper_with_wrapped_optional_component do
296
+ with_form_for @user, :name
297
+ assert_select 'section.custom_wrapper div.no_output_wrapper'
298
+ assert_no_select 'p.omg_hint'
299
+ end
300
+ end
301
+
302
+ test 'optional wrapper does not display when there is content' do
303
+ swap_wrapper :default, self.custom_wrapper_with_unless_blank do
304
+ with_form_for @user, :name, hint: "can't be blank"
305
+ assert_select 'section.custom_wrapper div.no_output_wrapper'
306
+ assert_select 'div.no_output_wrapper'
307
+ assert_select 'p.omg_hint'
308
+ end
309
+ end
310
+
311
+ test 'optional wrapper does not display when there is no content' do
312
+ swap_wrapper :default, self.custom_wrapper_with_unless_blank do
313
+ with_form_for @user, :name
314
+ assert_no_select 'section.custom_wrapper div.no_output_wrapper'
315
+ assert_no_select 'div.no_output_wrapper'
316
+ assert_no_select 'p.omg_hint'
317
+ end
318
+ end
203
319
  end
@@ -21,16 +21,16 @@ class SimpleFormGeneratorTest < Rails::Generators::TestCase
21
21
  run_generator %w(--bootstrap)
22
22
  assert_file 'config/initializers/simple_form.rb',
23
23
  /config\.default_wrapper = :default/, /config\.boolean_style = :nested/
24
- assert_file 'config/initializers/simple_form_bootstrap.rb', /config\.wrappers :bootstrap/,
25
- /config\.default_wrapper = :bootstrap/
24
+ assert_file 'config/initializers/simple_form_bootstrap.rb', /config\.wrappers :vertical_form/,
25
+ /config\.wrappers :horizontal_form/, /config\.default_wrapper = :vertical_form/
26
26
  end
27
27
 
28
28
  test 'generates the simple_form initializer with the foundation wrappers' do
29
29
  run_generator %w(--foundation)
30
30
  assert_file 'config/initializers/simple_form.rb',
31
31
  /config\.default_wrapper = :default/, /config\.boolean_style = :nested/
32
- assert_file 'config/initializers/simple_form_foundation.rb', /config\.wrappers :foundation/,
33
- /config\.default_wrapper = :foundation/
32
+ assert_file 'config/initializers/simple_form_foundation.rb', /config\.wrappers :vertical_form/,
33
+ /config\.default_wrapper = :vertical_form/, /config\.item_wrapper_tag = :div/
34
34
  end
35
35
 
36
36
  %W(erb haml slim).each do |engine|
@@ -2,7 +2,7 @@
2
2
  require 'test_helper'
3
3
 
4
4
  class BooleanInputTest < ActionView::TestCase
5
- test 'input should generate a checkbox by default for boolean attributes' do
5
+ test 'input generates a checkbox by default for boolean attributes' do
6
6
  with_input_for @user, :active, :boolean
7
7
  assert_select 'input[type=checkbox].boolean#user_active'
8
8
  assert_select 'label.boolean.optional', 'Active'
@@ -49,15 +49,43 @@ class BooleanInputTest < ActionView::TestCase
49
49
 
50
50
  test 'input boolean with nested allows :inline_label' do
51
51
  swap SimpleForm, boolean_style: :nested do
52
- with_input_for @user, :active, :boolean, label: false, inline_label: 'I am so inline.'
53
- assert_select 'label.checkbox', text: 'I am so inline.'
52
+ with_input_for @user, :active, :boolean, inline_label: 'I am so inline.'
53
+ assert_select 'label.checkbox', text: ' I am so inline.'
54
+ end
55
+ end
56
+
57
+ test 'input boolean with nested escapes :inline_label with HTML' do
58
+ swap SimpleForm, boolean_style: :nested do
59
+ with_input_for @user, :active, :boolean, inline_label: '<b>I am so inline.</b>'
60
+ assert_no_select 'label.checkbox b'
61
+ end
62
+ end
63
+
64
+ test 'input boolean with nested allows :inline_label with HTML when safe' do
65
+ swap SimpleForm, boolean_style: :nested do
66
+ with_input_for @user, :active, :boolean, inline_label: '<b>I am so inline.</b>'.html_safe
67
+ assert_select 'label.checkbox b', text: 'I am so inline.'
54
68
  end
55
69
  end
56
70
 
57
71
  test 'input boolean with nested style creates an inline label using the default label text when inline_label option set to true' do
58
72
  swap SimpleForm, boolean_style: :nested do
59
- with_input_for @user, :active, :boolean, label: false, inline_label: true
60
- assert_select 'label.checkbox', text: 'Active'
73
+ with_input_for @user, :active, :boolean, inline_label: true
74
+ assert_select 'label.checkbox', text: ' Active'
75
+ end
76
+ end
77
+
78
+ test 'input boolean with nested style creates an inline label using the label text when inline_label option set to true' do
79
+ swap SimpleForm, boolean_style: :nested do
80
+ with_input_for @user, :active, :boolean, inline_label: true, label_text: proc { 'New Active' }
81
+ assert_select 'label.checkbox', text: ' New Active'
82
+ end
83
+ end
84
+
85
+ test 'input boolean with nested style creates an inline label using the label html when inline_label option set to true' do
86
+ swap SimpleForm, boolean_style: :nested do
87
+ with_input_for @user, :active, :boolean, inline_label: true, label_text: proc { '<b>New Active</b>' }
88
+ assert_select 'label.checkbox', text: ' New Active'
61
89
  end
62
90
  end
63
91
 
@@ -128,6 +156,16 @@ class BooleanInputTest < ActionView::TestCase
128
156
  end
129
157
  end
130
158
 
159
+ test 'input boolean with nested style works using :input only in wrapper config (no label_input), adding the extra label wrapper with custom class' do
160
+ swap_wrapper do
161
+ swap SimpleForm, boolean_style: :nested, boolean_label_class: 'foo' do
162
+ with_input_for @user, :active, :boolean
163
+
164
+ assert_select 'label.boolean + input[type=hidden] + label.foo > input.boolean'
165
+ end
166
+ end
167
+ end
168
+
131
169
  test 'input boolean with nested style works using :label_input in wrapper config, adding "checkbox" class to label' do
132
170
  swap_wrapper :default, self.custom_wrapper_without_top_level do
133
171
  swap SimpleForm, boolean_style: :nested do
@@ -138,7 +176,17 @@ class BooleanInputTest < ActionView::TestCase
138
176
  end
139
177
  end
140
178
 
141
- test 'input boolean without additional classes should add "checkbox" class to label' do
179
+ test 'input boolean with nested style works using :label_input in wrapper config, adding custom class to label' do
180
+ swap_wrapper :default, self.custom_wrapper_without_top_level do
181
+ swap SimpleForm, boolean_style: :nested, boolean_label_class: 'foo' do
182
+ with_input_for @user, :active, :boolean
183
+
184
+ assert_select 'input[type=hidden] + label.boolean.foo > input.boolean'
185
+ end
186
+ end
187
+ end
188
+
189
+ test 'input boolean without additional classes adds "checkbox" class to label' do
142
190
  swap_wrapper :default, self.custom_wrapper_without_top_level do
143
191
  swap SimpleForm, boolean_style: :nested, generate_additional_classes_for: [:input] do
144
192
  with_input_for @user, :active, :boolean
@@ -149,4 +197,12 @@ class BooleanInputTest < ActionView::TestCase
149
197
  end
150
198
  end
151
199
  end
200
+
201
+ test 'input boolean works with wrapper config defining a class for the input' do
202
+ swap_wrapper :default, self.custom_wrapper_with_input_class do
203
+ with_input_for @user, :active, :boolean
204
+
205
+ assert_select 'input.boolean.inline-class'
206
+ end
207
+ end
152
208
  end