simple_form_awesome 2.2.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 (103) hide show
  1. data/CHANGELOG.md +327 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +25 -0
  4. data/lib/generators/simple_form/USAGE +3 -0
  5. data/lib/generators/simple_form/install_generator.rb +48 -0
  6. data/lib/generators/simple_form/templates/AUI_README +19 -0
  7. data/lib/generators/simple_form/templates/README +12 -0
  8. data/lib/generators/simple_form/templates/_form.html.erb +13 -0
  9. data/lib/generators/simple_form/templates/_form.html.haml +10 -0
  10. data/lib/generators/simple_form/templates/_form.html.slim +10 -0
  11. data/lib/generators/simple_form/templates/config/initializers/simple_form.rb +142 -0
  12. data/lib/generators/simple_form/templates/config/initializers/simple_form_aui.rb +21 -0
  13. data/lib/generators/simple_form/templates/config/initializers/simple_form_bootstrap.rb +45 -0
  14. data/lib/generators/simple_form/templates/config/initializers/simple_form_foundation.rb +26 -0
  15. data/lib/generators/simple_form/templates/config/locales/simple_form.en.yml +26 -0
  16. data/lib/simple_form/action_view_extensions/builder.rb +340 -0
  17. data/lib/simple_form/action_view_extensions/form_helper.rb +72 -0
  18. data/lib/simple_form/components/errors.rb +35 -0
  19. data/lib/simple_form/components/hints.rb +18 -0
  20. data/lib/simple_form/components/html5.rb +26 -0
  21. data/lib/simple_form/components/label_input.rb +15 -0
  22. data/lib/simple_form/components/labels.rb +79 -0
  23. data/lib/simple_form/components/maxlength.rb +41 -0
  24. data/lib/simple_form/components/min_max.rb +50 -0
  25. data/lib/simple_form/components/pattern.rb +34 -0
  26. data/lib/simple_form/components/placeholders.rb +16 -0
  27. data/lib/simple_form/components/readonly.rb +22 -0
  28. data/lib/simple_form/components.rb +20 -0
  29. data/lib/simple_form/core_ext/hash.rb +16 -0
  30. data/lib/simple_form/error_notification.rb +48 -0
  31. data/lib/simple_form/form_builder.rb +482 -0
  32. data/lib/simple_form/helpers/autofocus.rb +11 -0
  33. data/lib/simple_form/helpers/disabled.rb +15 -0
  34. data/lib/simple_form/helpers/readonly.rb +15 -0
  35. data/lib/simple_form/helpers/required.rb +35 -0
  36. data/lib/simple_form/helpers/validators.rb +44 -0
  37. data/lib/simple_form/helpers.rb +12 -0
  38. data/lib/simple_form/i18n_cache.rb +22 -0
  39. data/lib/simple_form/inputs/aui_string_input.rb +10 -0
  40. data/lib/simple_form/inputs/base.rb +184 -0
  41. data/lib/simple_form/inputs/block_input.rb +14 -0
  42. data/lib/simple_form/inputs/boolean_input.rb +78 -0
  43. data/lib/simple_form/inputs/collection_check_boxes_input.rb +21 -0
  44. data/lib/simple_form/inputs/collection_input.rb +101 -0
  45. data/lib/simple_form/inputs/collection_radio_buttons_input.rb +63 -0
  46. data/lib/simple_form/inputs/collection_select_input.rb +14 -0
  47. data/lib/simple_form/inputs/date_time_input.rb +28 -0
  48. data/lib/simple_form/inputs/file_input.rb +9 -0
  49. data/lib/simple_form/inputs/grouped_collection_select_input.rb +41 -0
  50. data/lib/simple_form/inputs/hidden_input.rb +17 -0
  51. data/lib/simple_form/inputs/numeric_input.rb +24 -0
  52. data/lib/simple_form/inputs/password_input.rb +12 -0
  53. data/lib/simple_form/inputs/priority_input.rb +24 -0
  54. data/lib/simple_form/inputs/range_input.rb +14 -0
  55. data/lib/simple_form/inputs/string_input.rb +23 -0
  56. data/lib/simple_form/inputs/text_area_input.rb +12 -0
  57. data/lib/simple_form/inputs/text_input.rb +11 -0
  58. data/lib/simple_form/inputs.rb +23 -0
  59. data/lib/simple_form/map_type.rb +16 -0
  60. data/lib/simple_form/version.rb +3 -0
  61. data/lib/simple_form/wrappers/builder.rb +103 -0
  62. data/lib/simple_form/wrappers/many.rb +73 -0
  63. data/lib/simple_form/wrappers/root.rb +36 -0
  64. data/lib/simple_form/wrappers/single.rb +24 -0
  65. data/lib/simple_form/wrappers.rb +8 -0
  66. data/lib/simple_form.rb +221 -0
  67. data/test/action_view_extensions/builder_test.rb +583 -0
  68. data/test/action_view_extensions/form_helper_test.rb +143 -0
  69. data/test/components/label_test.rb +327 -0
  70. data/test/form_builder/association_test.rb +186 -0
  71. data/test/form_builder/button_test.rb +47 -0
  72. data/test/form_builder/error_notification_test.rb +79 -0
  73. data/test/form_builder/error_test.rb +121 -0
  74. data/test/form_builder/general_test.rb +402 -0
  75. data/test/form_builder/hint_test.rb +138 -0
  76. data/test/form_builder/input_field_test.rb +63 -0
  77. data/test/form_builder/label_test.rb +71 -0
  78. data/test/form_builder/wrapper_test.rb +203 -0
  79. data/test/generators/simple_form_generator_test.rb +42 -0
  80. data/test/inputs/boolean_input_test.rb +140 -0
  81. data/test/inputs/collection_check_boxes_input_test.rb +224 -0
  82. data/test/inputs/collection_radio_buttons_input_test.rb +326 -0
  83. data/test/inputs/collection_select_input_test.rb +241 -0
  84. data/test/inputs/datetime_input_test.rb +99 -0
  85. data/test/inputs/disabled_test.rb +78 -0
  86. data/test/inputs/discovery_test.rb +69 -0
  87. data/test/inputs/file_input_test.rb +16 -0
  88. data/test/inputs/general_test.rb +116 -0
  89. data/test/inputs/grouped_collection_select_input_test.rb +118 -0
  90. data/test/inputs/hidden_input_test.rb +30 -0
  91. data/test/inputs/numeric_input_test.rb +173 -0
  92. data/test/inputs/priority_input_test.rb +43 -0
  93. data/test/inputs/readonly_test.rb +101 -0
  94. data/test/inputs/required_test.rb +113 -0
  95. data/test/inputs/string_input_test.rb +146 -0
  96. data/test/inputs/text_input_test.rb +24 -0
  97. data/test/simple_form_test.rb +9 -0
  98. data/test/support/discovery_inputs.rb +27 -0
  99. data/test/support/misc_helpers.rb +138 -0
  100. data/test/support/mock_controller.rb +24 -0
  101. data/test/support/models.rb +216 -0
  102. data/test/test_helper.rb +95 -0
  103. metadata +217 -0
@@ -0,0 +1,118 @@
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 empty array collection form' do
24
+ with_input_for @user, :tag_ids, :grouped_select,
25
+ :collection => [],
26
+ :group_method => :last
27
+
28
+ assert_select 'select.grouped_select#user_tag_ids'
29
+ end
30
+
31
+
32
+ test 'grouped collection accepts proc as collection' do
33
+ with_input_for @user, :tag_ids, :grouped_select,
34
+ :collection => Proc.new { [['Authors', ['Jose', 'Carlos']], ['General', ['Bob', 'John']]] },
35
+ :group_method => :last
36
+
37
+ assert_select 'select.grouped_select#user_tag_ids' do
38
+ assert_select 'optgroup[label=Authors]' do
39
+ assert_select 'option', 'Jose'
40
+ assert_select 'option', 'Carlos'
41
+ end
42
+
43
+ assert_select 'optgroup[label=General]' do
44
+ assert_select 'option', 'Bob'
45
+ assert_select 'option', 'John'
46
+ end
47
+ end
48
+ end
49
+
50
+ test 'grouped collection accepts hash collection form' do
51
+ with_input_for @user, :tag_ids, :grouped_select,
52
+ :collection => { 'Authors' => ['Jose', 'Carlos'], 'General' => ['Bob', 'John'] },
53
+ :group_method => :last
54
+
55
+ assert_select 'select.grouped_select#user_tag_ids' do
56
+ assert_select 'optgroup[label=Authors]' do
57
+ assert_select 'option', 'Jose'
58
+ assert_select 'option', 'Carlos'
59
+ end
60
+
61
+ assert_select 'optgroup[label=General]' do
62
+ assert_select 'option', 'Bob'
63
+ assert_select 'option', 'John'
64
+ end
65
+ end
66
+ end
67
+
68
+ test 'grouped collection accepts group_label_method option' do
69
+ with_input_for @user, :tag_ids, :grouped_select,
70
+ :collection => { ['Jose', 'Carlos'] => 'Authors' },
71
+ :group_method => :first,
72
+ :group_label_method => :last
73
+
74
+ assert_select 'select.grouped_select#user_tag_ids' do
75
+ assert_select 'optgroup[label=Authors]' do
76
+ assert_select 'option', 'Jose'
77
+ assert_select 'option', 'Carlos'
78
+ end
79
+ end
80
+ end
81
+
82
+ test 'grouped collection accepts label and value methods options' do
83
+ with_input_for @user, :tag_ids, :grouped_select,
84
+ :collection => { 'Authors' => ['Jose', 'Carlos'] },
85
+ :group_method => :last,
86
+ :label_method => :upcase,
87
+ :value_method => :downcase
88
+
89
+ assert_select 'select.grouped_select#user_tag_ids' do
90
+ assert_select 'optgroup[label=Authors]' do
91
+ assert_select 'option[value=jose]', 'JOSE'
92
+ assert_select 'option[value=carlos]', 'CARLOS'
93
+ end
94
+ end
95
+ end
96
+
97
+ test 'grouped collection with associations' do
98
+ tag_groups = [
99
+ TagGroup.new(1, "Group of Tags", [Tag.new(1, "Tag 1"), Tag.new(2, "Tag 2")]),
100
+ TagGroup.new(2, "Other group", [Tag.new(3, "Tag 3"), Tag.new(4,"Tag 4")])
101
+ ]
102
+
103
+ with_input_for @user, :tag_ids, :grouped_select,
104
+ :collection => tag_groups, :group_method => :tags
105
+
106
+ assert_select 'select.grouped_select#user_tag_ids' do
107
+ assert_select 'optgroup[label=Group of Tags]' do
108
+ assert_select 'option[value=1]', 'Tag 1'
109
+ assert_select 'option[value=2]', 'Tag 2'
110
+ end
111
+
112
+ assert_select 'optgroup[label=Other group]' do
113
+ assert_select 'option[value=3]', 'Tag 3'
114
+ assert_select 'option[value=4]', 'Tag 4'
115
+ end
116
+ end
117
+ end
118
+ 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,173 @@
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
+
168
+ test 'min_max should not emit max value as bare string' do
169
+ with_input_for @other_validating_user, :age, :integer
170
+ assert_select 'input[max]'
171
+ assert_no_select 'div', %r{^99}
172
+ end
173
+ 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 SimpleForm 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,101 @@
1
+ require 'test_helper'
2
+
3
+ class ReadonlyTest < ActionView::TestCase
4
+ test 'string input should generate readonly elements when readonly option is true' do
5
+ with_input_for @user, :name, :string, :readonly => true
6
+ assert_select 'input.string.readonly[readonly]'
7
+ end
8
+
9
+ test 'text input should generate readonly elements when readonly option is true' do
10
+ with_input_for @user, :description, :text, :readonly => true
11
+ assert_select 'textarea.text.readonly[readonly]'
12
+ end
13
+
14
+ test 'numeric input should generate readonly elements when readonly option is true' do
15
+ with_input_for @user, :age, :integer, :readonly => true
16
+ assert_select 'input.integer.readonly[readonly]'
17
+ end
18
+
19
+ test 'date input should generate readonly elements when readonly option is true' do
20
+ with_input_for @user, :born_at, :date, :readonly => true
21
+ assert_select 'select.date.readonly[readonly]'
22
+ end
23
+
24
+ test 'datetime input should generate readonly elements when readonly option is true' do
25
+ with_input_for @user, :created_at, :datetime, :readonly => true
26
+ assert_select 'select.datetime.readonly[readonly]'
27
+ end
28
+
29
+ test 'string input should generate readonly elements when readonly option is false' do
30
+ with_input_for @user, :name, :string, :readonly => false
31
+ assert_no_select 'input.string.readonly[readonly]'
32
+ end
33
+
34
+ test 'text input should generate readonly elements when readonly option is false' do
35
+ with_input_for @user, :description, :text, :readonly => false
36
+ assert_no_select 'textarea.text.readonly[readonly]'
37
+ end
38
+
39
+ test 'numeric input should generate readonly elements when readonly option is false' do
40
+ with_input_for @user, :age, :integer, :readonly => false
41
+ assert_no_select 'input.integer.readonly[readonly]'
42
+ end
43
+
44
+ test 'date input should generate readonly elements when readonly option is false' do
45
+ with_input_for @user, :born_at, :date, :readonly => false
46
+ assert_no_select 'select.date.readonly[readonly]'
47
+ end
48
+
49
+ test 'datetime input should generate readonly elements when readonly option is false' do
50
+ with_input_for @user, :created_at, :datetime, :readonly => false
51
+ assert_no_select 'select.datetime.readonly[readonly]'
52
+ end
53
+
54
+ test 'string input should generate readonly elements when readonly option is not present' do
55
+ with_input_for @user, :name, :string
56
+ assert_no_select 'input.string.readonly[readonly]'
57
+ end
58
+
59
+ test 'text input should generate readonly elements when readonly option is not present' do
60
+ with_input_for @user, :description, :text
61
+ assert_no_select 'textarea.text.readonly[readonly]'
62
+ end
63
+
64
+ test 'numeric input should generate readonly elements when readonly option is not present' do
65
+ with_input_for @user, :age, :integer
66
+ assert_no_select 'input.integer.readonly[readonly]'
67
+ end
68
+
69
+ test 'date input should generate readonly elements when readonly option is not present' do
70
+ with_input_for @user, :born_at, :date
71
+ assert_no_select 'select.date.readonly[readonly]'
72
+ end
73
+
74
+ test 'datetime input should generate readonly elements when readonly option is not present' do
75
+ with_input_for @user, :created_at, :datetime
76
+ assert_no_select 'select.datetime.readonly[readonly]'
77
+ end
78
+
79
+ test 'input should generate readonly attribute when the field is readonly and the object is persisted' do
80
+ with_input_for @user, :credit_card, :string, :readonly => :lookup
81
+ assert_select 'input.string.readonly[readonly]'
82
+ end
83
+
84
+ test 'input should not generate readonly attribute when the field is readonly and the object is not persisted' do
85
+ @user.new_record!
86
+ with_input_for @user, :credit_card, :string, :readonly => :lookup
87
+ assert_no_select 'input.string.readonly[readonly]'
88
+ end
89
+
90
+ test 'input should not generate readonly attribute when the field is not readonly and the object is persisted' do
91
+ with_input_for @user, :name, :string
92
+ assert_no_select 'input.string.readonly[readonly]'
93
+ end
94
+
95
+ test 'input should not generate readonly attribute when the component is not used' do
96
+ swap_wrapper do
97
+ with_input_for @user, :credit_card, :string
98
+ assert_no_select 'input.string.readonly[readonly]'
99
+ end
100
+ end
101
+ 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