simple_form 1.5.2 → 2.0.0.rc

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 (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