simple_form 1.5.2 → 2.0.0.rc

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of simple_form might be problematic. Click here for more details.

Files changed (105) hide show
  1. data/CHANGELOG.md +224 -0
  2. data/MIT-LICENSE +1 -1
  3. data/README.md +817 -0
  4. data/lib/generators/simple_form/install_generator.rb +15 -1
  5. data/lib/generators/simple_form/templates/README +12 -0
  6. data/lib/generators/simple_form/templates/config/initializers/simple_form.rb.tt +173 -0
  7. data/lib/simple_form.rb +109 -43
  8. data/lib/simple_form/action_view_extensions/builder.rb +158 -53
  9. data/lib/simple_form/action_view_extensions/form_helper.rb +29 -22
  10. data/lib/simple_form/components.rb +11 -1
  11. data/lib/simple_form/components/errors.rb +6 -24
  12. data/lib/simple_form/components/hints.rb +7 -21
  13. data/lib/simple_form/components/html5.rb +26 -0
  14. data/lib/simple_form/components/labels.rb +15 -13
  15. data/lib/simple_form/components/maxlength.rb +41 -0
  16. data/lib/simple_form/components/min_max.rb +49 -0
  17. data/lib/simple_form/components/pattern.rb +34 -0
  18. data/lib/simple_form/components/placeholders.rb +5 -17
  19. data/lib/simple_form/components/readonly.rb +22 -0
  20. data/lib/simple_form/core_ext/hash.rb +16 -0
  21. data/lib/simple_form/error_notification.rb +8 -1
  22. data/lib/simple_form/form_builder.rb +86 -22
  23. data/lib/simple_form/helpers.rb +7 -4
  24. data/lib/simple_form/helpers/autofocus.rb +11 -0
  25. data/lib/simple_form/helpers/disabled.rb +15 -0
  26. data/lib/simple_form/helpers/readonly.rb +15 -0
  27. data/lib/simple_form/helpers/required.rb +7 -10
  28. data/lib/simple_form/helpers/validators.rb +4 -4
  29. data/lib/simple_form/inputs.rb +17 -13
  30. data/lib/simple_form/inputs/base.rb +50 -81
  31. data/lib/simple_form/inputs/boolean_input.rb +43 -4
  32. data/lib/simple_form/inputs/collection_check_boxes_input.rb +21 -0
  33. data/lib/simple_form/inputs/collection_input.rb +27 -13
  34. data/lib/simple_form/inputs/collection_radio_buttons_input.rb +69 -0
  35. data/lib/simple_form/inputs/collection_select_input.rb +14 -0
  36. data/lib/simple_form/inputs/date_time_input.rb +2 -2
  37. data/lib/simple_form/inputs/grouped_collection_select_input.rb +41 -0
  38. data/lib/simple_form/inputs/hidden_input.rb +3 -6
  39. data/lib/simple_form/inputs/numeric_input.rb +3 -51
  40. data/lib/simple_form/inputs/password_input.rb +1 -2
  41. data/lib/simple_form/inputs/priority_input.rb +2 -2
  42. data/lib/simple_form/inputs/range_input.rb +1 -3
  43. data/lib/simple_form/inputs/string_input.rb +6 -8
  44. data/lib/simple_form/inputs/text_input.rb +1 -2
  45. data/lib/simple_form/version.rb +1 -1
  46. data/lib/simple_form/wrappers.rb +8 -0
  47. data/lib/simple_form/wrappers/builder.rb +75 -0
  48. data/lib/simple_form/wrappers/many.rb +68 -0
  49. data/lib/simple_form/wrappers/root.rb +34 -0
  50. data/lib/simple_form/wrappers/single.rb +18 -0
  51. data/test/action_view_extensions/builder_test.rb +195 -100
  52. data/test/action_view_extensions/form_helper_test.rb +24 -2
  53. data/test/components/label_test.rb +20 -5
  54. data/test/form_builder/association_test.rb +167 -0
  55. data/test/form_builder/button_test.rb +28 -0
  56. data/test/{error_notification_test.rb → form_builder/error_notification_test.rb} +2 -1
  57. data/test/form_builder/error_test.rb +101 -0
  58. data/test/form_builder/general_test.rb +348 -0
  59. data/test/form_builder/hint_test.rb +115 -0
  60. data/test/form_builder/input_field_test.rb +51 -0
  61. data/test/form_builder/label_test.rb +51 -0
  62. data/test/form_builder/wrapper_test.rb +140 -0
  63. data/test/generators/simple_form_generator_test.rb +32 -0
  64. data/test/inputs/boolean_input_test.rb +91 -0
  65. data/test/inputs/collection_check_boxes_input_test.rb +224 -0
  66. data/test/inputs/collection_radio_buttons_input_test.rb +326 -0
  67. data/test/inputs/collection_select_input_test.rb +241 -0
  68. data/test/inputs/datetime_input_test.rb +85 -0
  69. data/test/inputs/disabled_test.rb +38 -0
  70. data/test/inputs/discovery_test.rb +61 -0
  71. data/test/inputs/file_input_test.rb +16 -0
  72. data/test/inputs/general_test.rb +69 -0
  73. data/test/inputs/grouped_collection_select_input_test.rb +109 -0
  74. data/test/inputs/hidden_input_test.rb +30 -0
  75. data/test/inputs/numeric_input_test.rb +167 -0
  76. data/test/inputs/priority_input_test.rb +43 -0
  77. data/test/inputs/readonly_test.rb +61 -0
  78. data/test/inputs/required_test.rb +113 -0
  79. data/test/inputs/string_input_test.rb +140 -0
  80. data/test/inputs/text_input_test.rb +24 -0
  81. data/test/{discovery_inputs.rb → support/discovery_inputs.rb} +0 -0
  82. data/test/support/misc_helpers.rb +48 -6
  83. data/test/support/mock_controller.rb +2 -2
  84. data/test/support/models.rb +20 -5
  85. data/test/test_helper.rb +5 -8
  86. metadata +123 -98
  87. data/.gitignore +0 -3
  88. data/.gitmodules +0 -3
  89. data/.travis.yml +0 -15
  90. data/CHANGELOG.rdoc +0 -159
  91. data/Gemfile +0 -9
  92. data/README.rdoc +0 -466
  93. data/Rakefile +0 -27
  94. data/lib/generators/simple_form/templates/config/initializers/simple_form.rb +0 -93
  95. data/lib/simple_form/components/wrapper.rb +0 -38
  96. data/lib/simple_form/helpers/has_errors.rb +0 -15
  97. data/lib/simple_form/helpers/maxlength.rb +0 -24
  98. data/lib/simple_form/helpers/pattern.rb +0 -28
  99. data/simple_form.gemspec +0 -25
  100. data/test/components/error_test.rb +0 -56
  101. data/test/components/hint_test.rb +0 -74
  102. data/test/components/wrapper_test.rb +0 -63
  103. data/test/custom_components.rb +0 -7
  104. data/test/form_builder_test.rb +0 -930
  105. data/test/inputs_test.rb +0 -995
@@ -0,0 +1,109 @@
1
+ # encoding: UTF-8
2
+ require 'test_helper'
3
+
4
+ class GroupedCollectionSelectInputTest < ActionView::TestCase
5
+ test 'grouped collection accepts array collection form' do
6
+ with_input_for @user, :tag_ids, :grouped_select,
7
+ :collection => [['Authors', ['Jose', 'Carlos']], ['General', ['Bob', 'John']]],
8
+ :group_method => :last
9
+
10
+ assert_select 'select.grouped_select#user_tag_ids' do
11
+ assert_select 'optgroup[label=Authors]' do
12
+ assert_select 'option', 'Jose'
13
+ assert_select 'option', 'Carlos'
14
+ end
15
+
16
+ assert_select 'optgroup[label=General]' do
17
+ assert_select 'option', 'Bob'
18
+ assert_select 'option', 'John'
19
+ end
20
+ end
21
+ end
22
+
23
+ test 'grouped collection accepts proc as collection' do
24
+ with_input_for @user, :tag_ids, :grouped_select,
25
+ :collection => Proc.new { [['Authors', ['Jose', 'Carlos']], ['General', ['Bob', 'John']]] },
26
+ :group_method => :last
27
+
28
+ assert_select 'select.grouped_select#user_tag_ids' do
29
+ assert_select 'optgroup[label=Authors]' do
30
+ assert_select 'option', 'Jose'
31
+ assert_select 'option', 'Carlos'
32
+ end
33
+
34
+ assert_select 'optgroup[label=General]' do
35
+ assert_select 'option', 'Bob'
36
+ assert_select 'option', 'John'
37
+ end
38
+ end
39
+ end
40
+
41
+ test 'grouped collection accepts hash collection form' do
42
+ with_input_for @user, :tag_ids, :grouped_select,
43
+ :collection => { 'Authors' => ['Jose', 'Carlos'], 'General' => ['Bob', 'John'] },
44
+ :group_method => :last
45
+
46
+ assert_select 'select.grouped_select#user_tag_ids' do
47
+ assert_select 'optgroup[label=Authors]' do
48
+ assert_select 'option', 'Jose'
49
+ assert_select 'option', 'Carlos'
50
+ end
51
+
52
+ assert_select 'optgroup[label=General]' do
53
+ assert_select 'option', 'Bob'
54
+ assert_select 'option', 'John'
55
+ end
56
+ end
57
+ end
58
+
59
+ test 'grouped collection accepts group_label_method option' do
60
+ with_input_for @user, :tag_ids, :grouped_select,
61
+ :collection => { ['Jose', 'Carlos'] => 'Authors' },
62
+ :group_method => :first,
63
+ :group_label_method => :last
64
+
65
+ assert_select 'select.grouped_select#user_tag_ids' do
66
+ assert_select 'optgroup[label=Authors]' do
67
+ assert_select 'option', 'Jose'
68
+ assert_select 'option', 'Carlos'
69
+ end
70
+ end
71
+ end
72
+
73
+ test 'grouped collection accepts label and value methods options' do
74
+ with_input_for @user, :tag_ids, :grouped_select,
75
+ :collection => { 'Authors' => ['Jose', 'Carlos'] },
76
+ :group_method => :last,
77
+ :label_method => :upcase,
78
+ :value_method => :downcase
79
+
80
+ assert_select 'select.grouped_select#user_tag_ids' do
81
+ assert_select 'optgroup[label=Authors]' do
82
+ assert_select 'option[value=jose]', 'JOSE'
83
+ assert_select 'option[value=carlos]', 'CARLOS'
84
+ end
85
+ end
86
+ end
87
+
88
+ test 'grouped collection with associations' do
89
+ tag_groups = [
90
+ TagGroup.new(1, "Group of Tags", [Tag.new(1, "Tag 1"), Tag.new(2, "Tag 2")]),
91
+ TagGroup.new(2, "Other group", [Tag.new(3, "Tag 3"), Tag.new(4,"Tag 4")])
92
+ ]
93
+
94
+ with_input_for @user, :tag_ids, :grouped_select,
95
+ :collection => tag_groups, :group_method => :tags
96
+
97
+ assert_select 'select.grouped_select#user_tag_ids' do
98
+ assert_select 'optgroup[label=Group of Tags]' do
99
+ assert_select 'option[value=1]', 'Tag 1'
100
+ assert_select 'option[value=2]', 'Tag 2'
101
+ end
102
+
103
+ assert_select 'optgroup[label=Other group]' do
104
+ assert_select 'option[value=3]', 'Tag 3'
105
+ assert_select 'option[value=4]', 'Tag 4'
106
+ end
107
+ end
108
+ end
109
+ end
@@ -0,0 +1,30 @@
1
+ # encoding: UTF-8
2
+ require 'test_helper'
3
+
4
+ class HiddenInputTest < ActionView::TestCase
5
+ test 'input should generate a hidden field' do
6
+ with_input_for @user, :name, :hidden
7
+ assert_no_select 'input[type=text]'
8
+ assert_select 'input#user_name[type=hidden]'
9
+ end
10
+
11
+ test 'hint should not be generated for hidden fields' do
12
+ store_translations(:en, :simple_form => { :hints => { :user => { :name => "text" } } }) do
13
+ with_input_for @user, :name, :hidden
14
+ assert_no_select 'span.hint'
15
+ end
16
+ end
17
+
18
+ test 'label should not be generated for hidden inputs' do
19
+ with_input_for @user, :name, :hidden
20
+ assert_no_select 'label'
21
+ end
22
+
23
+ test 'required/optional options should not be generated for hidden inputs' do
24
+ with_input_for @user, :name, :hidden
25
+ assert_no_select 'input.required'
26
+ assert_no_select 'input[required]'
27
+ assert_no_select 'input.optional'
28
+ assert_select 'input.hidden#user_name'
29
+ end
30
+ end
@@ -0,0 +1,167 @@
1
+ # encoding: UTF-8
2
+ require 'test_helper'
3
+
4
+ class NumericInputTest < ActionView::TestCase
5
+ test 'input should generate an integer text field for integer attributes ' do
6
+ with_input_for @user, :age, :integer
7
+ assert_select 'input[type=number].integer#user_age'
8
+ end
9
+
10
+ test 'input should generate a float text field for float attributes ' do
11
+ with_input_for @user, :age, :float
12
+ assert_select 'input[type=number].float#user_age'
13
+ end
14
+
15
+ test 'input should generate a decimal text field for decimal attributes ' do
16
+ with_input_for @user, :age, :decimal
17
+ assert_select 'input[type=number].decimal#user_age'
18
+ end
19
+
20
+ test 'input should not generate min attribute by default' do
21
+ with_input_for @user, :age, :integer
22
+ assert_no_select 'input[min]'
23
+ end
24
+
25
+ test 'input should not generate max attribute by default' do
26
+ with_input_for @user, :age, :integer
27
+ assert_no_select 'input[max]'
28
+ end
29
+
30
+ test 'input should infer min value from integer attributes with greater than validation' do
31
+ with_input_for @other_validating_user, :age, :float
32
+ assert_no_select 'input[min]'
33
+
34
+ with_input_for @other_validating_user, :age, :integer
35
+ assert_select 'input[min=18]'
36
+ end
37
+
38
+ test 'input should infer min value from integer attributes with greater than validation using symbol' do
39
+ with_input_for @validating_user, :amount, :float
40
+ assert_no_select 'input[min]'
41
+
42
+ with_input_for @validating_user, :amount, :integer
43
+ assert_select 'input[min=11]'
44
+ end
45
+
46
+ test 'input should infer min value from integer attributes with greater than or equal to validation using symbol' do
47
+ with_input_for @validating_user, :attempts, :float
48
+ assert_select 'input[min=1]'
49
+
50
+ with_input_for @validating_user, :attempts, :integer
51
+ assert_select 'input[min=1]'
52
+ end
53
+
54
+ test 'input should infer min value from integer attributes with greater than validation using proc' do
55
+ with_input_for @other_validating_user, :amount, :float
56
+ assert_no_select 'input[min]'
57
+
58
+ with_input_for @other_validating_user, :amount, :integer
59
+ assert_select 'input[min=20]'
60
+ end
61
+
62
+ test 'input should infer min value from integer attributes with greater than or equal to validation using proc' do
63
+ with_input_for @other_validating_user, :attempts, :float
64
+ assert_select 'input[min=19]'
65
+
66
+ with_input_for @other_validating_user, :attempts, :integer
67
+ assert_select 'input[min=19]'
68
+ end
69
+
70
+ test 'input should infer max value from attributes with less than validation' do
71
+ with_input_for @other_validating_user, :age, :float
72
+ assert_no_select 'input[max]'
73
+
74
+ with_input_for @other_validating_user, :age, :integer
75
+ assert_select 'input[max=99]'
76
+ end
77
+
78
+ test 'input should infer max value from attributes with less than validation using symbol' do
79
+ with_input_for @validating_user, :amount, :float
80
+ assert_no_select 'input[max]'
81
+
82
+ with_input_for @validating_user, :amount, :integer
83
+ assert_select 'input[max=99]'
84
+ end
85
+
86
+ test 'input should infer max value from attributes with less than or equal to validation using symbol' do
87
+ with_input_for @validating_user, :attempts, :float
88
+ assert_select 'input[max=100]'
89
+
90
+ with_input_for @validating_user, :attempts, :integer
91
+ assert_select 'input[max=100]'
92
+ end
93
+
94
+ test 'input should infer max value from attributes with less than validation using proc' do
95
+ with_input_for @other_validating_user, :amount, :float
96
+ assert_no_select 'input[max]'
97
+
98
+ with_input_for @other_validating_user, :amount, :integer
99
+ assert_select 'input[max=118]'
100
+ end
101
+
102
+ test 'input should infer max value from attributes with less than or equal to validation using proc' do
103
+ with_input_for @other_validating_user, :attempts, :float
104
+ assert_select 'input[max=119]'
105
+
106
+ with_input_for @other_validating_user, :attempts, :integer
107
+ assert_select 'input[max=119]'
108
+ end
109
+
110
+ test 'input should have step value of any except for integer attribute' do
111
+ with_input_for @validating_user, :age, :float
112
+ assert_select 'input[step="any"]'
113
+
114
+ with_input_for @validating_user, :age, :integer
115
+ assert_select 'input[step=1]'
116
+ end
117
+
118
+ test 'numeric input should not generate placeholder by default' do
119
+ with_input_for @user, :age, :integer
120
+ assert_no_select 'input[placeholder]'
121
+ end
122
+
123
+ test 'numeric input should accept the placeholder option' do
124
+ with_input_for @user, :age, :integer, :placeholder => 'Put in your age'
125
+ assert_select 'input.integer[placeholder=Put in your age]'
126
+ end
127
+
128
+ test 'numeric input should use i18n to translate placeholder text' do
129
+ store_translations(:en, :simple_form => { :placeholders => { :user => {
130
+ :age => 'Age goes here'
131
+ } } }) do
132
+ with_input_for @user, :age, :integer
133
+ assert_select 'input.integer[placeholder=Age goes here]'
134
+ end
135
+ end
136
+
137
+ # Numeric input but HTML5 disabled
138
+ test ' when not using HTML5 input should not generate field with type number and use text instead' do
139
+ swap_wrapper do
140
+ with_input_for @user, :age, :integer
141
+ assert_no_select "input[type=number]"
142
+ assert_no_select "input#user_age[text]"
143
+ end
144
+ end
145
+
146
+ test 'when not using HTML5 input should not use min or max or step attributes' do
147
+ swap_wrapper do
148
+ with_input_for @validating_user, :age, :integer
149
+ assert_no_select "input[type=number]"
150
+ assert_no_select "input[min]"
151
+ assert_no_select "input[max]"
152
+ assert_no_select "input[step]"
153
+ end
154
+ end
155
+
156
+ [:integer, :float, :decimal].each do |type|
157
+ test "#{type} input should infer min value from attributes with greater than or equal validation" do
158
+ with_input_for @validating_user, :age, type
159
+ assert_select 'input[min=18]'
160
+ end
161
+
162
+ test "#{type} input should infer the max value from attributes with less than or equal to validation" do
163
+ with_input_for @validating_user, :age, type
164
+ assert_select 'input[max=99]'
165
+ end
166
+ end
167
+ end
@@ -0,0 +1,43 @@
1
+ # encoding: UTF-8
2
+ require 'test_helper'
3
+
4
+ class PriorityInputTest < ActionView::TestCase
5
+ test 'input should generate a country select field' do
6
+ with_input_for @user, :country, :country
7
+ assert_select 'select#user_country'
8
+ assert_select 'select option[value=Brazil]', 'Brazil'
9
+ assert_no_select 'select option[value=][disabled=disabled]'
10
+ end
11
+
12
+ test 'input should generate a country select with simple form default' do
13
+ swap SimpleForm, :country_priority => [ 'Brazil' ] do
14
+ with_input_for @user, :country, :country
15
+ assert_select 'select option[value=][disabled=disabled]'
16
+ end
17
+ end
18
+
19
+ test 'input should generate a time zone select field' do
20
+ with_input_for @user, :time_zone, :time_zone
21
+ assert_select 'select#user_time_zone'
22
+ assert_select 'select option[value=Brasilia]', '(GMT-03:00) Brasilia'
23
+ assert_no_select 'select option[value=][disabled=disabled]'
24
+ end
25
+
26
+ test 'input should generate a time zone select field with default' do
27
+ with_input_for @user, :time_zone, :time_zone, :default => 'Brasilia'
28
+ assert_select 'select option[value=Brasilia][selected=selected]'
29
+ assert_no_select 'select option[value=]'
30
+ end
31
+
32
+ test 'input should generate a time zone select using options priority' do
33
+ with_input_for @user, :time_zone, :time_zone, :priority => /Brasilia/
34
+ assert_select 'select option[value=][disabled=disabled]'
35
+ assert_no_select 'select option[value=]', /^$/
36
+ end
37
+
38
+ test 'priority input should not generate invalid required html attribute' do
39
+ with_input_for @user, :country, :country
40
+ assert_select 'select.required'
41
+ assert_no_select 'select[required]'
42
+ end
43
+ end
@@ -0,0 +1,61 @@
1
+ require 'test_helper'
2
+
3
+ class ReadonlyTest < ActionView::TestCase
4
+ test 'input should generate readonly elements based on the readonly option' do
5
+ with_input_for @user, :name, :string, :readonly => true
6
+ assert_select 'input.string.readonly[readonly]'
7
+ with_input_for @user, :description, :text, :readonly => true
8
+ assert_select 'textarea.text.readonly[readonly]'
9
+ with_input_for @user, :age, :integer, :readonly => true
10
+ assert_select 'input.integer.readonly[readonly]'
11
+ with_input_for @user, :born_at, :date, :readonly => true
12
+ assert_select 'select.date.readonly[readonly]'
13
+ with_input_for @user, :created_at, :datetime, :readonly => true
14
+ assert_select 'select.datetime.readonly[readonly]'
15
+
16
+ with_input_for @user, :name, :string, :readonly => false
17
+ assert_select 'input.string:not(.readonly[readonly])'
18
+ with_input_for @user, :description, :text, :readonly => false
19
+ assert_select 'textarea.text:not(.readonly[readonly])'
20
+ with_input_for @user, :age, :integer, :readonly => false
21
+ assert_select 'input.integer:not(.readonly[readonly])'
22
+ with_input_for @user, :born_at, :date, :readonly => false
23
+ assert_select 'select.date:not(.readonly[readonly])'
24
+ with_input_for @user, :created_at, :datetime, :readonly => false
25
+ assert_select 'select.datetime:not(.readonly[readonly])'
26
+
27
+ with_input_for @user, :name, :string
28
+ assert_select 'input.string:not(.readonly[readonly])'
29
+ with_input_for @user, :description, :text
30
+ assert_select 'textarea.text:not(.readonly[readonly])'
31
+ with_input_for @user, :age, :integer
32
+ assert_select 'input.integer:not(.readonly[readonly])'
33
+ with_input_for @user, :born_at, :date
34
+ assert_select 'select.date:not(.readonly[readonly])'
35
+ with_input_for @user, :created_at, :datetime
36
+ assert_select 'select.datetime:not(.readonly[readonly])'
37
+ end
38
+
39
+ test 'input should generate readonly attribute when the field is readonly and the object is persisted' do
40
+ with_input_for @user, :credit_card, :string, :readonly => :lookup
41
+ assert_select 'input.string.readonly[readonly]'
42
+ end
43
+
44
+ test 'input should not generate readonly attribute when the field is readonly and the object is not persisted' do
45
+ @user.new_record!
46
+ with_input_for @user, :credit_card, :string, :readonly => :lookup
47
+ assert_no_select 'input.string.readonly[readonly]'
48
+ end
49
+
50
+ test 'input should not generate readonly attribute when the field is not readonly and the object is persisted' do
51
+ with_input_for @user, :name, :string
52
+ assert_no_select 'input.string.readonly[readonly]'
53
+ end
54
+
55
+ test 'input should not generate readonly attribute when the component is not used' do
56
+ swap_wrapper do
57
+ with_input_for @user, :credit_card, :string
58
+ assert_no_select 'input.string.readonly[readonly]'
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,113 @@
1
+ require 'test_helper'
2
+
3
+ class RequiredTest < ActionView::TestCase
4
+ # REQUIRED AND PRESENCE VALIDATION
5
+ test 'builder input should obtain required from ActiveModel::Validations when it is included' do
6
+ with_form_for @validating_user, :name
7
+ assert_select 'input.required[required]#validating_user_name'
8
+ with_form_for @validating_user, :status
9
+ assert_select 'input.optional#validating_user_status'
10
+ end
11
+
12
+ test 'builder input should allow overriding required when ActiveModel::Validations is included' do
13
+ with_form_for @validating_user, :name, :required => false
14
+ assert_select 'input.optional#validating_user_name'
15
+ with_form_for @validating_user, :status, :required => true
16
+ assert_select 'input.required[required]#validating_user_status'
17
+ end
18
+
19
+ test 'builder input should be required by default when ActiveModel::Validations is not included' do
20
+ with_form_for @user, :name
21
+ assert_select 'input.required[required]#user_name'
22
+ end
23
+
24
+ test 'builder input should not be required by default when ActiveModel::Validations is not included if option is set to false' do
25
+ swap SimpleForm, :required_by_default => false do
26
+ with_form_for @user, :name
27
+ assert_select 'input.optional#user_name'
28
+ assert_no_select 'input[required]'
29
+ end
30
+ end
31
+
32
+ test 'when not using browser validations, input should not generate required html attribute' do
33
+ swap SimpleForm, :browser_validations => false do
34
+ with_input_for @user, :name, :string
35
+ assert_select 'input[type=text].required'
36
+ assert_no_select 'input[type=text][required]'
37
+ end
38
+ end
39
+
40
+ test 'builder input should allow disabling required when ActiveModel::Validations is not included' do
41
+ with_form_for @user, :name, :required => false
42
+ assert_no_select 'input.required'
43
+ assert_no_select 'input[required]'
44
+ assert_select 'input.optional#user_name'
45
+ end
46
+
47
+ test 'when not the required component the input does not have the required attribute but has the required class' do
48
+ swap_wrapper do
49
+ with_input_for @user, :name, :string
50
+ assert_select 'input[type=text].required'
51
+ assert_no_select 'input[type=text][required]'
52
+ end
53
+ end
54
+
55
+ # VALIDATORS :if :unless
56
+ test 'builder input should not be required when ActiveModel::Validations is included and if option is present' do
57
+ with_form_for @validating_user, :age
58
+ assert_no_select 'input.required'
59
+ assert_no_select 'input[required]'
60
+ assert_select 'input.optional#validating_user_age'
61
+ end
62
+
63
+ test 'builder input should not be required when ActiveModel::Validations is included and unless option is present' do
64
+ with_form_for @validating_user, :amount
65
+ assert_no_select 'input.required'
66
+ assert_no_select 'input[required]'
67
+ assert_select 'input.optional#validating_user_amount'
68
+ end
69
+
70
+ # VALIDATORS :on
71
+ test 'builder input should be required when validation is on create and is not persisted' do
72
+ @validating_user.new_record!
73
+ with_form_for @validating_user, :action
74
+ assert_select 'input.required'
75
+ assert_select 'input[required]'
76
+ assert_select 'input.required[required]#validating_user_action'
77
+ end
78
+
79
+ test 'builder input should not be required when validation is on create and is persisted' do
80
+ with_form_for @validating_user, :action
81
+ assert_no_select 'input.required'
82
+ assert_no_select 'input[required]'
83
+ assert_select 'input.optional#validating_user_action'
84
+ end
85
+
86
+ test 'builder input should be required when validation is on save' do
87
+ with_form_for @validating_user, :credit_limit
88
+ assert_select 'input.required'
89
+ assert_select 'input[required]'
90
+ assert_select 'input.required[required]#validating_user_credit_limit'
91
+
92
+ @validating_user.new_record!
93
+ with_form_for @validating_user, :credit_limit
94
+ assert_select 'input.required'
95
+ assert_select 'input[required]'
96
+ assert_select 'input.required[required]#validating_user_credit_limit'
97
+ end
98
+
99
+ test 'builder input should be required when validation is on update and is persisted' do
100
+ with_form_for @validating_user, :phone_number
101
+ assert_select 'input.required'
102
+ assert_select 'input[required]'
103
+ assert_select 'input.required[required]#validating_user_phone_number'
104
+ end
105
+
106
+ test 'builder input should not be required when validation is on update and is not persisted' do
107
+ @validating_user.new_record!
108
+ with_form_for @validating_user, :phone_number
109
+ assert_no_select 'input.required'
110
+ assert_no_select 'input[required]'
111
+ assert_select 'input.optional#validating_user_phone_number'
112
+ end
113
+ end