ehoch_simple_form 2.0.2.dev

Sign up to get free protection for your applications and to get access to all the features.
Files changed (97) hide show
  1. data/CHANGELOG.md +257 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +797 -0
  4. data/lib/generators/simple_form/USAGE +3 -0
  5. data/lib/generators/simple_form/install_generator.rb +32 -0
  6. data/lib/generators/simple_form/templates/README +12 -0
  7. data/lib/generators/simple_form/templates/_form.html.erb +13 -0
  8. data/lib/generators/simple_form/templates/_form.html.haml +10 -0
  9. data/lib/generators/simple_form/templates/_form.html.slim +10 -0
  10. data/lib/generators/simple_form/templates/config/initializers/simple_form.rb.tt +181 -0
  11. data/lib/generators/simple_form/templates/config/locales/simple_form.en.yml +26 -0
  12. data/lib/simple_form.rb +215 -0
  13. data/lib/simple_form/action_view_extensions/builder.rb +338 -0
  14. data/lib/simple_form/action_view_extensions/form_helper.rb +74 -0
  15. data/lib/simple_form/components.rb +20 -0
  16. data/lib/simple_form/components/errors.rb +35 -0
  17. data/lib/simple_form/components/hints.rb +18 -0
  18. data/lib/simple_form/components/html5.rb +26 -0
  19. data/lib/simple_form/components/label_input.rb +15 -0
  20. data/lib/simple_form/components/labels.rb +79 -0
  21. data/lib/simple_form/components/maxlength.rb +41 -0
  22. data/lib/simple_form/components/min_max.rb +50 -0
  23. data/lib/simple_form/components/pattern.rb +34 -0
  24. data/lib/simple_form/components/placeholders.rb +16 -0
  25. data/lib/simple_form/components/readonly.rb +22 -0
  26. data/lib/simple_form/core_ext/hash.rb +16 -0
  27. data/lib/simple_form/error_notification.rb +48 -0
  28. data/lib/simple_form/form_builder.rb +472 -0
  29. data/lib/simple_form/helpers.rb +12 -0
  30. data/lib/simple_form/helpers/autofocus.rb +11 -0
  31. data/lib/simple_form/helpers/disabled.rb +15 -0
  32. data/lib/simple_form/helpers/readonly.rb +15 -0
  33. data/lib/simple_form/helpers/required.rb +35 -0
  34. data/lib/simple_form/helpers/validators.rb +44 -0
  35. data/lib/simple_form/i18n_cache.rb +22 -0
  36. data/lib/simple_form/inputs.rb +21 -0
  37. data/lib/simple_form/inputs/base.rb +162 -0
  38. data/lib/simple_form/inputs/block_input.rb +14 -0
  39. data/lib/simple_form/inputs/boolean_input.rb +64 -0
  40. data/lib/simple_form/inputs/collection_check_boxes_input.rb +21 -0
  41. data/lib/simple_form/inputs/collection_input.rb +101 -0
  42. data/lib/simple_form/inputs/collection_radio_buttons_input.rb +63 -0
  43. data/lib/simple_form/inputs/collection_select_input.rb +14 -0
  44. data/lib/simple_form/inputs/date_time_input.rb +28 -0
  45. data/lib/simple_form/inputs/file_input.rb +9 -0
  46. data/lib/simple_form/inputs/grouped_collection_select_input.rb +41 -0
  47. data/lib/simple_form/inputs/hidden_input.rb +17 -0
  48. data/lib/simple_form/inputs/numeric_input.rb +24 -0
  49. data/lib/simple_form/inputs/password_input.rb +12 -0
  50. data/lib/simple_form/inputs/priority_input.rb +24 -0
  51. data/lib/simple_form/inputs/range_input.rb +14 -0
  52. data/lib/simple_form/inputs/string_input.rb +23 -0
  53. data/lib/simple_form/inputs/text_input.rb +11 -0
  54. data/lib/simple_form/map_type.rb +16 -0
  55. data/lib/simple_form/version.rb +3 -0
  56. data/lib/simple_form/wrappers.rb +8 -0
  57. data/lib/simple_form/wrappers/builder.rb +103 -0
  58. data/lib/simple_form/wrappers/many.rb +69 -0
  59. data/lib/simple_form/wrappers/root.rb +34 -0
  60. data/lib/simple_form/wrappers/single.rb +18 -0
  61. data/test/action_view_extensions/builder_test.rb +577 -0
  62. data/test/action_view_extensions/form_helper_test.rb +104 -0
  63. data/test/components/label_test.rb +310 -0
  64. data/test/form_builder/association_test.rb +177 -0
  65. data/test/form_builder/button_test.rb +47 -0
  66. data/test/form_builder/error_notification_test.rb +79 -0
  67. data/test/form_builder/error_test.rb +121 -0
  68. data/test/form_builder/general_test.rb +356 -0
  69. data/test/form_builder/hint_test.rb +139 -0
  70. data/test/form_builder/input_field_test.rb +63 -0
  71. data/test/form_builder/label_test.rb +71 -0
  72. data/test/form_builder/wrapper_test.rb +149 -0
  73. data/test/generators/simple_form_generator_test.rb +32 -0
  74. data/test/inputs/boolean_input_test.rb +108 -0
  75. data/test/inputs/collection_check_boxes_input_test.rb +224 -0
  76. data/test/inputs/collection_radio_buttons_input_test.rb +326 -0
  77. data/test/inputs/collection_select_input_test.rb +241 -0
  78. data/test/inputs/datetime_input_test.rb +99 -0
  79. data/test/inputs/disabled_test.rb +38 -0
  80. data/test/inputs/discovery_test.rb +61 -0
  81. data/test/inputs/file_input_test.rb +16 -0
  82. data/test/inputs/general_test.rb +69 -0
  83. data/test/inputs/grouped_collection_select_input_test.rb +118 -0
  84. data/test/inputs/hidden_input_test.rb +30 -0
  85. data/test/inputs/numeric_input_test.rb +173 -0
  86. data/test/inputs/priority_input_test.rb +43 -0
  87. data/test/inputs/readonly_test.rb +61 -0
  88. data/test/inputs/required_test.rb +113 -0
  89. data/test/inputs/string_input_test.rb +140 -0
  90. data/test/inputs/text_input_test.rb +24 -0
  91. data/test/simple_form_test.rb +9 -0
  92. data/test/support/discovery_inputs.rb +21 -0
  93. data/test/support/misc_helpers.rb +102 -0
  94. data/test/support/mock_controller.rb +24 -0
  95. data/test/support/models.rb +210 -0
  96. data/test/test_helper.rb +90 -0
  97. metadata +210 -0
@@ -0,0 +1,69 @@
1
+ # encoding: UTF-8
2
+ require 'test_helper'
3
+
4
+ class InputTest < ActionView::TestCase
5
+ test 'input should generate css class based on default input type' do
6
+ with_input_for @user, :name, :string
7
+ assert_select 'input.string'
8
+ with_input_for @user, :description, :text
9
+ assert_select 'textarea.text'
10
+ with_input_for @user, :age, :integer
11
+ assert_select 'input.integer'
12
+ with_input_for @user, :born_at, :date
13
+ assert_select 'select.date'
14
+ with_input_for @user, :created_at, :datetime
15
+ assert_select 'select.datetime'
16
+ end
17
+
18
+ test 'input should generate autofocus attribute based on the autofocus option' do
19
+ with_input_for @user, :name, :string, :autofocus => true
20
+ assert_select 'input.string[autofocus]'
21
+ with_input_for @user, :description, :text, :autofocus => true
22
+ assert_select 'textarea.text[autofocus]'
23
+ with_input_for @user, :age, :integer, :autofocus => true
24
+ assert_select 'input.integer[autofocus]'
25
+ with_input_for @user, :born_at, :date, :autofocus => true
26
+ assert_select 'select.date[autofocus]'
27
+ with_input_for @user, :created_at, :datetime, :autofocus => true
28
+ assert_select 'select.datetime[autofocus]'
29
+
30
+ with_input_for @user, :name, :string, :autofocus => false
31
+ assert_select 'input.string:not([autofocus])'
32
+ with_input_for @user, :description, :text, :autofocus => false
33
+ assert_select 'textarea.text:not([autofocus])'
34
+ with_input_for @user, :age, :integer, :autofocus => false
35
+ assert_select 'input.integer:not([autofocus])'
36
+ with_input_for @user, :born_at, :date, :autofocus => false
37
+ assert_select 'select.date:not([autofocus])'
38
+ with_input_for @user, :created_at, :datetime, :autofocus => false
39
+ assert_select 'select.datetime:not([autofocus])'
40
+
41
+ with_input_for @user, :name, :string
42
+ assert_select 'input.string:not([autofocus])'
43
+ with_input_for @user, :description, :text
44
+ assert_select 'textarea.text:not([autofocus])'
45
+ with_input_for @user, :age, :integer
46
+ assert_select 'input.integer:not([autofocus])'
47
+ with_input_for @user, :born_at, :date
48
+ assert_select 'select.date:not([autofocus])'
49
+ with_input_for @user, :created_at, :datetime
50
+ assert_select 'select.datetime:not([autofocus])'
51
+ end
52
+
53
+ # With no object
54
+ test 'input should be generated properly when object is not present' do
55
+ with_input_for :project, :name, :string
56
+ assert_select 'input.string.required#project_name'
57
+ end
58
+
59
+ test 'input as radio should be generated properly when object is not present ' do
60
+ with_input_for :project, :name, :radio_buttons
61
+ assert_select 'input.radio_buttons#project_name_true'
62
+ assert_select 'input.radio_buttons#project_name_false'
63
+ end
64
+
65
+ test 'input as select with collection should be generated properly when object is not present' do
66
+ with_input_for :project, :name, :select, :collection => ['Jose', 'Carlos']
67
+ assert_select 'select.select#project_name'
68
+ end
69
+ end
@@ -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,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