formtastic 2.1.0 → 4.0.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.
- checksums.yaml +7 -0
- data/.gitattributes +1 -0
- data/.github/workflows/test.yml +61 -0
- data/.gitignore +4 -2
- data/CHANGELOG.md +52 -0
- data/Gemfile +1 -1
- data/Gemfile.lock +105 -0
- data/MIT-LICENSE +1 -1
- data/{README.textile → README.md} +204 -219
- data/RELEASE_PROCESS +3 -1
- data/Rakefile +27 -29
- data/app/assets/stylesheets/formtastic.css +3 -2
- data/bin/appraisal +8 -0
- data/formtastic.gemspec +11 -14
- data/gemfiles/rails_5.2/Gemfile +5 -0
- data/gemfiles/rails_6.0/Gemfile +5 -0
- data/gemfiles/rails_6.1/Gemfile +5 -0
- data/gemfiles/rails_edge/Gemfile +13 -0
- data/lib/formtastic/action_class_finder.rb +18 -0
- data/lib/formtastic/actions/button_action.rb +55 -60
- data/lib/formtastic/actions/input_action.rb +59 -57
- data/lib/formtastic/actions/link_action.rb +68 -67
- data/lib/formtastic/actions.rb +6 -3
- data/lib/formtastic/deprecation.rb +5 -0
- data/lib/formtastic/engine.rb +3 -1
- data/lib/formtastic/form_builder.rb +35 -16
- data/lib/formtastic/helpers/action_helper.rb +34 -28
- data/lib/formtastic/helpers/enum.rb +13 -0
- data/lib/formtastic/helpers/errors_helper.rb +2 -2
- data/lib/formtastic/helpers/fieldset_wrapper.rb +16 -12
- data/lib/formtastic/helpers/form_helper.rb +19 -16
- data/lib/formtastic/helpers/input_helper.rb +69 -97
- data/lib/formtastic/helpers/inputs_helper.rb +35 -25
- data/lib/formtastic/helpers/reflection.rb +4 -4
- data/lib/formtastic/helpers.rb +1 -2
- data/lib/formtastic/html_attributes.rb +12 -1
- data/lib/formtastic/i18n.rb +1 -1
- data/lib/formtastic/input_class_finder.rb +18 -0
- data/lib/formtastic/inputs/base/choices.rb +2 -2
- data/lib/formtastic/inputs/base/collections.rb +46 -14
- data/lib/formtastic/inputs/base/database.rb +7 -2
- data/lib/formtastic/inputs/base/datetime_pickerish.rb +85 -0
- data/lib/formtastic/inputs/base/errors.rb +7 -7
- data/lib/formtastic/inputs/base/hints.rb +2 -2
- data/lib/formtastic/inputs/base/html.rb +10 -9
- data/lib/formtastic/inputs/base/labelling.rb +5 -8
- data/lib/formtastic/inputs/base/naming.rb +4 -4
- data/lib/formtastic/inputs/base/numeric.rb +1 -1
- data/lib/formtastic/inputs/base/options.rb +3 -4
- data/lib/formtastic/inputs/base/stringish.rb +10 -2
- data/lib/formtastic/inputs/base/timeish.rb +34 -22
- data/lib/formtastic/inputs/base/validations.rb +41 -13
- data/lib/formtastic/inputs/base/wrapping.rb +29 -26
- data/lib/formtastic/inputs/base.rb +22 -15
- data/lib/formtastic/inputs/boolean_input.rb +26 -12
- data/lib/formtastic/inputs/check_boxes_input.rb +39 -31
- data/lib/formtastic/inputs/color_input.rb +41 -0
- data/lib/formtastic/inputs/country_input.rb +24 -5
- data/lib/formtastic/inputs/datalist_input.rb +41 -0
- data/lib/formtastic/inputs/date_picker_input.rb +93 -0
- data/lib/formtastic/inputs/{date_input.rb → date_select_input.rb} +1 -1
- data/lib/formtastic/inputs/datetime_picker_input.rb +103 -0
- data/lib/formtastic/inputs/{datetime_input.rb → datetime_select_input.rb} +1 -1
- data/lib/formtastic/inputs/file_input.rb +2 -2
- data/lib/formtastic/inputs/hidden_input.rb +2 -6
- data/lib/formtastic/inputs/radio_input.rb +28 -22
- data/lib/formtastic/inputs/select_input.rb +36 -39
- data/lib/formtastic/inputs/time_picker_input.rb +99 -0
- data/lib/formtastic/inputs/{time_input.rb → time_select_input.rb} +6 -2
- data/lib/formtastic/inputs/time_zone_input.rb +16 -6
- data/lib/formtastic/inputs.rb +32 -21
- data/lib/formtastic/localized_string.rb +1 -1
- data/lib/formtastic/localizer.rb +24 -24
- data/lib/formtastic/namespaced_class_finder.rb +99 -0
- data/lib/formtastic/version.rb +1 -1
- data/lib/formtastic.rb +20 -10
- data/lib/generators/formtastic/form/form_generator.rb +10 -4
- data/lib/generators/formtastic/input/input_generator.rb +46 -0
- data/lib/generators/formtastic/install/install_generator.rb +5 -19
- data/lib/generators/templates/_form.html.slim +2 -2
- data/lib/generators/templates/formtastic.rb +46 -25
- data/lib/generators/templates/input.rb +19 -0
- data/sample/basic_inputs.html +23 -3
- data/script/integration-template.rb +74 -0
- data/script/integration.sh +19 -0
- data/spec/action_class_finder_spec.rb +12 -0
- data/spec/actions/button_action_spec.rb +8 -8
- data/spec/actions/generic_action_spec.rb +92 -56
- data/spec/actions/input_action_spec.rb +7 -7
- data/spec/actions/link_action_spec.rb +10 -10
- data/spec/builder/custom_builder_spec.rb +36 -20
- data/spec/builder/error_proc_spec.rb +4 -4
- data/spec/builder/semantic_fields_for_spec.rb +28 -29
- data/spec/fast_spec_helper.rb +12 -0
- data/spec/generators/formtastic/form/form_generator_spec.rb +45 -32
- data/spec/generators/formtastic/input/input_generator_spec.rb +124 -0
- data/spec/generators/formtastic/install/install_generator_spec.rb +9 -9
- data/spec/helpers/action_helper_spec.rb +75 -103
- data/spec/helpers/actions_helper_spec.rb +17 -17
- data/spec/helpers/form_helper_spec.rb +84 -33
- data/spec/helpers/input_helper_spec.rb +333 -285
- data/spec/helpers/inputs_helper_spec.rb +167 -121
- data/spec/helpers/reflection_helper_spec.rb +3 -3
- data/spec/helpers/semantic_errors_helper_spec.rb +23 -23
- data/spec/i18n_spec.rb +26 -26
- data/spec/input_class_finder_spec.rb +10 -0
- data/spec/inputs/base/collections_spec.rb +76 -0
- data/spec/inputs/base/validations_spec.rb +480 -0
- data/spec/inputs/boolean_input_spec.rb +100 -65
- data/spec/inputs/check_boxes_input_spec.rb +200 -101
- data/spec/inputs/color_input_spec.rb +85 -0
- data/spec/inputs/country_input_spec.rb +20 -20
- data/spec/inputs/custom_input_spec.rb +3 -4
- data/spec/inputs/datalist_input_spec.rb +61 -0
- data/spec/inputs/date_picker_input_spec.rb +449 -0
- data/spec/inputs/date_select_input_spec.rb +249 -0
- data/spec/inputs/datetime_picker_input_spec.rb +490 -0
- data/spec/inputs/datetime_select_input_spec.rb +209 -0
- data/spec/inputs/email_input_spec.rb +5 -5
- data/spec/inputs/file_input_spec.rb +6 -6
- data/spec/inputs/hidden_input_spec.rb +22 -35
- data/spec/inputs/include_blank_spec.rb +11 -11
- data/spec/inputs/label_spec.rb +62 -25
- data/spec/inputs/number_input_spec.rb +112 -112
- data/spec/inputs/password_input_spec.rb +5 -5
- data/spec/inputs/phone_input_spec.rb +5 -5
- data/spec/inputs/placeholder_spec.rb +6 -6
- data/spec/inputs/radio_input_spec.rb +99 -55
- data/spec/inputs/range_input_spec.rb +66 -66
- data/spec/inputs/readonly_spec.rb +50 -0
- data/spec/inputs/search_input_spec.rb +5 -5
- data/spec/inputs/select_input_spec.rb +170 -170
- data/spec/inputs/string_input_spec.rb +68 -16
- data/spec/inputs/text_input_spec.rb +16 -16
- data/spec/inputs/time_picker_input_spec.rb +455 -0
- data/spec/inputs/time_select_input_spec.rb +261 -0
- data/spec/inputs/time_zone_input_spec.rb +54 -28
- data/spec/inputs/url_input_spec.rb +5 -5
- data/spec/inputs/with_options_spec.rb +7 -7
- data/spec/localizer_spec.rb +39 -17
- data/spec/namespaced_class_finder_spec.rb +79 -0
- data/spec/schema.rb +21 -0
- data/spec/spec_helper.rb +254 -221
- data/spec/support/custom_macros.rb +128 -95
- data/spec/support/shared_examples.rb +12 -0
- data/spec/support/specialized_class_finder_shared_example.rb +27 -0
- data/spec/support/test_environment.rb +26 -10
- metadata +177 -238
- data/.travis.yml +0 -8
- data/Appraisals +0 -11
- data/CHANGELOG +0 -371
- data/gemfiles/rails-3.0.gemfile +0 -7
- data/gemfiles/rails-3.1.gemfile +0 -7
- data/gemfiles/rails-3.2.gemfile +0 -7
- data/lib/formtastic/helpers/buttons_helper.rb +0 -310
- data/lib/formtastic/inputs/base/grouped_collections.rb +0 -77
- data/lib/formtastic/util.rb +0 -25
- data/lib/tasks/verify_rcov.rb +0 -44
- data/spec/helpers/buttons_helper_spec.rb +0 -166
- data/spec/helpers/commit_button_helper_spec.rb +0 -530
- data/spec/inputs/date_input_spec.rb +0 -227
- data/spec/inputs/datetime_input_spec.rb +0 -185
- data/spec/inputs/time_input_spec.rb +0 -267
- data/spec/support/deferred_garbage_collection.rb +0 -21
|
@@ -1,10 +1,15 @@
|
|
|
1
1
|
# encoding: utf-8
|
|
2
2
|
require 'spec_helper'
|
|
3
3
|
|
|
4
|
-
describe 'check_boxes input' do
|
|
4
|
+
RSpec.describe 'check_boxes input' do
|
|
5
5
|
|
|
6
6
|
include FormtasticSpecHelper
|
|
7
7
|
|
|
8
|
+
before do
|
|
9
|
+
@output_buffer = ''
|
|
10
|
+
mock_everything
|
|
11
|
+
end
|
|
12
|
+
|
|
8
13
|
describe 'for a has_many association' do
|
|
9
14
|
before do
|
|
10
15
|
@output_buffer = ''
|
|
@@ -26,75 +31,75 @@ describe 'check_boxes input' do
|
|
|
26
31
|
it_should_use_the_collection_when_provided(:check_boxes, 'input[@type="checkbox"]')
|
|
27
32
|
|
|
28
33
|
it 'should generate a legend containing a label with text for the input' do
|
|
29
|
-
output_buffer.
|
|
30
|
-
output_buffer.
|
|
34
|
+
expect(output_buffer).to have_tag('form li fieldset legend.label label')
|
|
35
|
+
expect(output_buffer).to have_tag('form li fieldset legend.label label', :text => /Posts/)
|
|
31
36
|
end
|
|
32
37
|
|
|
33
38
|
it 'should not link the label within the legend to any input' do
|
|
34
|
-
output_buffer.
|
|
39
|
+
expect(output_buffer).not_to have_tag('form li fieldset legend label[@for^="author_post_ids_"]')
|
|
35
40
|
end
|
|
36
41
|
|
|
37
42
|
it 'should generate an ordered list with an li.choice for each choice' do
|
|
38
|
-
output_buffer.
|
|
39
|
-
output_buffer.
|
|
43
|
+
expect(output_buffer).to have_tag('form li fieldset ol')
|
|
44
|
+
expect(output_buffer).to have_tag('form li fieldset ol li.choice input[@type=checkbox]', :count => ::Post.all.size)
|
|
40
45
|
end
|
|
41
46
|
|
|
42
47
|
it 'should have one option with a "checked" attribute' do
|
|
43
|
-
output_buffer.
|
|
48
|
+
expect(output_buffer).to have_tag('form li input[@checked]', :count => 1)
|
|
44
49
|
end
|
|
45
50
|
|
|
46
51
|
it 'should not generate hidden inputs with default value blank' do
|
|
47
|
-
output_buffer.
|
|
52
|
+
expect(output_buffer).not_to have_tag("form li fieldset ol li label input[@type='hidden'][@value='']")
|
|
48
53
|
end
|
|
49
54
|
|
|
50
55
|
it 'should not render hidden inputs inside the ol' do
|
|
51
|
-
output_buffer.
|
|
56
|
+
expect(output_buffer).not_to have_tag("form li fieldset ol li input[@type='hidden']")
|
|
52
57
|
end
|
|
53
58
|
|
|
54
59
|
it 'should render one hidden input for each choice outside the ol' do
|
|
55
|
-
output_buffer.
|
|
60
|
+
expect(output_buffer).to have_tag("form li fieldset > input[@type='hidden']", :count => 1)
|
|
56
61
|
end
|
|
57
62
|
|
|
58
63
|
describe "each choice" do
|
|
59
|
-
|
|
64
|
+
|
|
60
65
|
it 'should not give the choice label the .label class' do
|
|
61
|
-
output_buffer.
|
|
66
|
+
expect(output_buffer).not_to have_tag('li.choice label.label')
|
|
62
67
|
end
|
|
63
|
-
|
|
68
|
+
|
|
64
69
|
it 'should not be marked as required' do
|
|
65
|
-
output_buffer.
|
|
70
|
+
expect(output_buffer).not_to have_tag('li.choice input[@required]')
|
|
66
71
|
end
|
|
67
|
-
|
|
72
|
+
|
|
68
73
|
it 'should contain a label for the radio input with a nested input and label text' do
|
|
69
74
|
::Post.all.each do |post|
|
|
70
|
-
output_buffer.
|
|
71
|
-
output_buffer.
|
|
75
|
+
expect(output_buffer).to have_tag('form li fieldset ol li label', :text => /#{post.to_label}/)
|
|
76
|
+
expect(output_buffer).to have_tag("form li fieldset ol li label[@for='author_post_ids_#{post.id}']")
|
|
72
77
|
end
|
|
73
78
|
end
|
|
74
79
|
|
|
75
80
|
it 'should use values as li.class when value_as_class is true' do
|
|
76
81
|
::Post.all.each do |post|
|
|
77
|
-
output_buffer.
|
|
82
|
+
expect(output_buffer).to have_tag("form li fieldset ol li.post_#{post.id} label")
|
|
78
83
|
end
|
|
79
84
|
end
|
|
80
|
-
|
|
85
|
+
|
|
81
86
|
it 'should have a checkbox input but no hidden field for each post' do
|
|
82
87
|
::Post.all.each do |post|
|
|
83
|
-
output_buffer.
|
|
84
|
-
output_buffer.
|
|
88
|
+
expect(output_buffer).to have_tag("form li fieldset ol li label input#author_post_ids_#{post.id}")
|
|
89
|
+
expect(output_buffer).to have_tag("form li fieldset ol li label input[@name='author[post_ids][]']", :count => 1)
|
|
85
90
|
end
|
|
86
91
|
end
|
|
87
92
|
|
|
88
93
|
it 'should have a hidden field with an empty array value for the collection to allow clearing of all checkboxes' do
|
|
89
|
-
output_buffer.
|
|
94
|
+
expect(output_buffer).to have_tag("form li fieldset > input[@type=hidden][@name='author[post_ids][]'][@value='']", :count => 1)
|
|
90
95
|
end
|
|
91
96
|
|
|
92
97
|
it 'the hidden field with an empty array value should be followed by the ol' do
|
|
93
|
-
output_buffer.
|
|
98
|
+
expect(output_buffer).to have_tag("form li fieldset > input[@type=hidden][@name='author[post_ids][]'][@value=''] + ol", :count => 1)
|
|
94
99
|
end
|
|
95
100
|
|
|
96
101
|
it 'should not have a hidden field with an empty string value for the collection' do
|
|
97
|
-
output_buffer.
|
|
102
|
+
expect(output_buffer).not_to have_tag("form li fieldset > input[@type=hidden][@name='author[post_ids]'][@value='']", :count => 1)
|
|
98
103
|
end
|
|
99
104
|
|
|
100
105
|
it 'should have a checkbox and a hidden field for each post with :hidden_field => true' do
|
|
@@ -105,20 +110,21 @@ describe 'check_boxes input' do
|
|
|
105
110
|
end)
|
|
106
111
|
|
|
107
112
|
::Post.all.each do |post|
|
|
108
|
-
output_buffer.
|
|
109
|
-
output_buffer.
|
|
113
|
+
expect(output_buffer).to have_tag("form li fieldset ol li label input#author_post_ids_#{post.id}")
|
|
114
|
+
expect(output_buffer).to have_tag("form li fieldset ol li label input[@name='author[post_ids][]']", :count => 2)
|
|
115
|
+
expect(output_buffer).to have_tag('form li fieldset ol li label', :text => /#{post.to_label}/)
|
|
110
116
|
end
|
|
111
117
|
|
|
112
118
|
end
|
|
113
119
|
|
|
114
120
|
it "should mark input as checked if it's the the existing choice" do
|
|
115
|
-
::Post.all.include?(@fred.posts.first).
|
|
116
|
-
output_buffer.
|
|
121
|
+
expect(::Post.all.include?(@fred.posts.first)).to be_truthy
|
|
122
|
+
expect(output_buffer).to have_tag("form li fieldset ol li label input[@checked='checked']")
|
|
117
123
|
end
|
|
118
124
|
end
|
|
119
125
|
|
|
120
126
|
describe 'and no object is given' do
|
|
121
|
-
before(:
|
|
127
|
+
before(:example) do
|
|
122
128
|
output_buffer.replace ''
|
|
123
129
|
concat(semantic_form_for(:project, :url => 'http://test.host') do |builder|
|
|
124
130
|
concat(builder.input(:author_id, :as => :check_boxes, :collection => ::Author.all))
|
|
@@ -126,26 +132,26 @@ describe 'check_boxes input' do
|
|
|
126
132
|
end
|
|
127
133
|
|
|
128
134
|
it 'should generate a fieldset with legend' do
|
|
129
|
-
output_buffer.
|
|
135
|
+
expect(output_buffer).to have_tag('form li fieldset legend', :text => /Author/)
|
|
130
136
|
end
|
|
131
137
|
|
|
132
138
|
it 'shold generate an li tag for each item in the collection' do
|
|
133
|
-
output_buffer.
|
|
139
|
+
expect(output_buffer).to have_tag('form li fieldset ol li input[@type=checkbox]', :count => ::Author.all.size)
|
|
134
140
|
end
|
|
135
141
|
|
|
136
142
|
it 'should generate labels for each item' do
|
|
137
143
|
::Author.all.each do |author|
|
|
138
|
-
output_buffer.
|
|
139
|
-
output_buffer.
|
|
144
|
+
expect(output_buffer).to have_tag('form li fieldset ol li label', :text => /#{author.to_label}/)
|
|
145
|
+
expect(output_buffer).to have_tag("form li fieldset ol li label[@for='project_author_id_#{author.id}']")
|
|
140
146
|
end
|
|
141
147
|
end
|
|
142
148
|
|
|
143
149
|
it 'should generate inputs for each item' do
|
|
144
150
|
::Author.all.each do |author|
|
|
145
|
-
output_buffer.
|
|
146
|
-
output_buffer.
|
|
147
|
-
output_buffer.
|
|
148
|
-
output_buffer.
|
|
151
|
+
expect(output_buffer).to have_tag("form li fieldset ol li label input#project_author_id_#{author.id}")
|
|
152
|
+
expect(output_buffer).to have_tag("form li fieldset ol li label input[@type='checkbox']")
|
|
153
|
+
expect(output_buffer).to have_tag("form li fieldset ol li label input[@value='#{author.id}']")
|
|
154
|
+
expect(output_buffer).to have_tag("form li fieldset ol li label input[@name='project[author_id][]']")
|
|
149
155
|
end
|
|
150
156
|
end
|
|
151
157
|
|
|
@@ -154,8 +160,9 @@ describe 'check_boxes input' do
|
|
|
154
160
|
concat(builder.input(:author_id, :as => :check_boxes, :collection => [["<b>Item 1</b>", 1], ["<b>Item 2</b>", 2]]))
|
|
155
161
|
end)
|
|
156
162
|
|
|
157
|
-
output_buffer.
|
|
158
|
-
label.
|
|
163
|
+
expect(output_buffer).to have_tag('form li fieldset ol li label', text: %r{<b>Item [12]</b>}, count: 2) do |label|
|
|
164
|
+
expect(label).to have_text('<b>Item 1</b>', count: 1)
|
|
165
|
+
expect(label).to have_text('<b>Item 2</b>', count: 1)
|
|
159
166
|
end
|
|
160
167
|
end
|
|
161
168
|
end
|
|
@@ -172,18 +179,18 @@ describe 'check_boxes input' do
|
|
|
172
179
|
|
|
173
180
|
it 'should have a checkbox input for each post' do
|
|
174
181
|
::Post.all.each do |post|
|
|
175
|
-
output_buffer.
|
|
176
|
-
output_buffer.
|
|
182
|
+
expect(output_buffer).to have_tag("form li fieldset ol li label input#author_post_ids_#{post.id}")
|
|
183
|
+
expect(output_buffer).to have_tag("form li fieldset ol li label input[@name='author[post_ids][]']", :count => ::Post.all.length)
|
|
177
184
|
end
|
|
178
185
|
end
|
|
179
186
|
|
|
180
187
|
it "should mark input as checked if it's the the existing choice" do
|
|
181
|
-
::Post.all.include?(@fred.posts.first).
|
|
182
|
-
output_buffer.
|
|
188
|
+
expect(::Post.all.include?(@fred.posts.first)).to be_truthy
|
|
189
|
+
expect(output_buffer).to have_tag("form li fieldset ol li label input[@checked='checked']")
|
|
183
190
|
end
|
|
184
191
|
|
|
185
192
|
it 'should not generate empty hidden inputs' do
|
|
186
|
-
output_buffer.
|
|
193
|
+
expect(output_buffer).not_to have_tag("form li fieldset ol li label input[@type='hidden'][@value='']", :count => ::Post.all.length)
|
|
187
194
|
end
|
|
188
195
|
end
|
|
189
196
|
|
|
@@ -194,7 +201,7 @@ describe 'check_boxes input' do
|
|
|
194
201
|
|
|
195
202
|
describe "no disabled items" do
|
|
196
203
|
before do
|
|
197
|
-
@new_post.
|
|
204
|
+
allow(@new_post).to receive(:author_ids).and_return(nil)
|
|
198
205
|
|
|
199
206
|
concat(semantic_form_for(@new_post) do |builder|
|
|
200
207
|
concat(builder.input(:authors, :as => :check_boxes, :disabled => nil))
|
|
@@ -202,13 +209,13 @@ describe 'check_boxes input' do
|
|
|
202
209
|
end
|
|
203
210
|
|
|
204
211
|
it 'should not have any disabled item(s)' do
|
|
205
|
-
output_buffer.
|
|
212
|
+
expect(output_buffer).not_to have_tag("form li fieldset ol li label input[@disabled='disabled']")
|
|
206
213
|
end
|
|
207
214
|
end
|
|
208
215
|
|
|
209
216
|
describe "single disabled item" do
|
|
210
217
|
before do
|
|
211
|
-
@new_post.
|
|
218
|
+
allow(@new_post).to receive(:author_ids).and_return(nil)
|
|
212
219
|
|
|
213
220
|
concat(semantic_form_for(@new_post) do |builder|
|
|
214
221
|
concat(builder.input(:authors, :as => :check_boxes, :disabled => @fred.id))
|
|
@@ -216,15 +223,15 @@ describe 'check_boxes input' do
|
|
|
216
223
|
end
|
|
217
224
|
|
|
218
225
|
it "should have one item disabled; the specified one" do
|
|
219
|
-
output_buffer.
|
|
220
|
-
output_buffer.
|
|
221
|
-
output_buffer.
|
|
226
|
+
expect(output_buffer).to have_tag("form li fieldset ol li label input[@disabled='disabled']", :count => 1)
|
|
227
|
+
expect(output_buffer).to have_tag("form li fieldset ol li label[@for='post_author_ids_#{@fred.id}']", :text => /fred/i)
|
|
228
|
+
expect(output_buffer).to have_tag("form li fieldset ol li label input[@disabled='disabled'][@value='#{@fred.id}']")
|
|
222
229
|
end
|
|
223
230
|
end
|
|
224
231
|
|
|
225
232
|
describe "multiple disabled items" do
|
|
226
233
|
before do
|
|
227
|
-
@new_post.
|
|
234
|
+
allow(@new_post).to receive(:author_ids).and_return(nil)
|
|
228
235
|
|
|
229
236
|
concat(semantic_form_for(@new_post) do |builder|
|
|
230
237
|
concat(builder.input(:authors, :as => :check_boxes, :disabled => [@bob.id, @fred.id]))
|
|
@@ -232,11 +239,11 @@ describe 'check_boxes input' do
|
|
|
232
239
|
end
|
|
233
240
|
|
|
234
241
|
it "should have multiple items disabled; the specified ones" do
|
|
235
|
-
output_buffer.
|
|
236
|
-
output_buffer.
|
|
237
|
-
output_buffer.
|
|
238
|
-
output_buffer.
|
|
239
|
-
output_buffer.
|
|
242
|
+
expect(output_buffer).to have_tag("form li fieldset ol li label input[@disabled='disabled']", :count => 2)
|
|
243
|
+
expect(output_buffer).to have_tag("form li fieldset ol li label[@for='post_author_ids_#{@bob.id}']", :text => /bob/i)
|
|
244
|
+
expect(output_buffer).to have_tag("form li fieldset ol li label input[@disabled='disabled'][@value='#{@bob.id}']")
|
|
245
|
+
expect(output_buffer).to have_tag("form li fieldset ol li label[@for='post_author_ids_#{@fred.id}']", :text => /fred/i)
|
|
246
|
+
expect(output_buffer).to have_tag("form li fieldset ol li label input[@disabled='disabled'][@value='#{@fred.id}']")
|
|
240
247
|
end
|
|
241
248
|
end
|
|
242
249
|
|
|
@@ -247,7 +254,7 @@ describe 'check_boxes input' do
|
|
|
247
254
|
before do
|
|
248
255
|
::I18n.backend.store_translations :en, :formtastic => { :labels => { :post => { :authors => "Translated!" }}}
|
|
249
256
|
with_config :i18n_lookups_by_default, true do
|
|
250
|
-
@new_post.
|
|
257
|
+
allow(@new_post).to receive(:author_ids).and_return(nil)
|
|
251
258
|
concat(semantic_form_for(@new_post) do |builder|
|
|
252
259
|
concat(builder.input(:authors, :as => :check_boxes))
|
|
253
260
|
end)
|
|
@@ -259,56 +266,72 @@ describe 'check_boxes input' do
|
|
|
259
266
|
end
|
|
260
267
|
|
|
261
268
|
it "should do foo" do
|
|
262
|
-
output_buffer.
|
|
269
|
+
expect(output_buffer).to have_tag("legend.label label", :text => /Translated/)
|
|
263
270
|
end
|
|
264
271
|
|
|
265
272
|
end
|
|
266
273
|
|
|
267
274
|
describe "when :label option is set" do
|
|
268
275
|
before do
|
|
269
|
-
@new_post.
|
|
276
|
+
allow(@new_post).to receive(:author_ids).and_return(nil)
|
|
270
277
|
concat(semantic_form_for(@new_post) do |builder|
|
|
271
278
|
concat(builder.input(:authors, :as => :check_boxes, :label => 'The authors'))
|
|
272
279
|
end)
|
|
273
280
|
end
|
|
274
281
|
|
|
275
282
|
it "should output the correct label title" do
|
|
276
|
-
output_buffer.
|
|
283
|
+
expect(output_buffer).to have_tag("legend.label label", :text => /The authors/)
|
|
277
284
|
end
|
|
278
285
|
end
|
|
279
286
|
|
|
280
287
|
describe "when :label option is false" do
|
|
281
288
|
before do
|
|
282
289
|
@output_buffer = ''
|
|
283
|
-
@new_post.
|
|
290
|
+
allow(@new_post).to receive(:author_ids).and_return(nil)
|
|
284
291
|
concat(semantic_form_for(@new_post) do |builder|
|
|
285
292
|
concat(builder.input(:authors, :as => :check_boxes, :label => false))
|
|
286
293
|
end)
|
|
287
294
|
end
|
|
288
295
|
|
|
289
296
|
it "should not output the legend" do
|
|
290
|
-
output_buffer.
|
|
297
|
+
expect(output_buffer).not_to have_tag("legend.label")
|
|
291
298
|
end
|
|
292
|
-
|
|
299
|
+
|
|
293
300
|
it "should not cause escaped HTML" do
|
|
294
|
-
output_buffer.
|
|
301
|
+
expect(output_buffer).not_to include(">")
|
|
295
302
|
end
|
|
296
|
-
|
|
303
|
+
|
|
297
304
|
end
|
|
298
305
|
|
|
299
306
|
describe "when :required option is true" do
|
|
300
307
|
before do
|
|
301
|
-
@new_post.
|
|
308
|
+
allow(@new_post).to receive(:author_ids).and_return(nil)
|
|
302
309
|
concat(semantic_form_for(@new_post) do |builder|
|
|
303
310
|
concat(builder.input(:authors, :as => :check_boxes, :required => true))
|
|
304
311
|
end)
|
|
305
312
|
end
|
|
306
313
|
|
|
307
314
|
it "should output the correct label title" do
|
|
308
|
-
output_buffer.
|
|
315
|
+
expect(output_buffer).to have_tag("legend.label label abbr")
|
|
309
316
|
end
|
|
310
317
|
end
|
|
318
|
+
end
|
|
311
319
|
|
|
320
|
+
describe 'for a enum column' do
|
|
321
|
+
before do
|
|
322
|
+
allow(@new_post).to receive(:status) { 'inactive' }
|
|
323
|
+
statuses = ActiveSupport::HashWithIndifferentAccess.new("active"=>0, "inactive"=>1)
|
|
324
|
+
allow(@new_post.class).to receive(:statuses) { statuses }
|
|
325
|
+
allow(@new_post).to receive(:defined_enums) { { "status" => statuses } }
|
|
326
|
+
end
|
|
327
|
+
|
|
328
|
+
it 'should have a select inside the wrapper' do
|
|
329
|
+
expect {
|
|
330
|
+
concat(semantic_form_for(@new_post) do |builder|
|
|
331
|
+
concat(builder.input(:status, :as => :check_boxes))
|
|
332
|
+
end)
|
|
333
|
+
}.to raise_error(Formtastic::UnsupportedEnumCollection)
|
|
334
|
+
end
|
|
312
335
|
end
|
|
313
336
|
|
|
314
337
|
describe 'for a has_and_belongs_to_many association' do
|
|
@@ -324,14 +347,39 @@ describe 'check_boxes input' do
|
|
|
324
347
|
|
|
325
348
|
it 'should render checkboxes' do
|
|
326
349
|
# I'm aware these two lines test the same thing
|
|
327
|
-
output_buffer.
|
|
328
|
-
output_buffer.
|
|
350
|
+
expect(output_buffer).to have_tag('input[type="checkbox"]', :count => 2)
|
|
351
|
+
expect(output_buffer).to have_tag('input[type="checkbox"]', :count => ::Author.all.size)
|
|
329
352
|
end
|
|
330
353
|
|
|
331
354
|
it 'should only select checkboxes that are present in the association' do
|
|
332
355
|
# I'm aware these two lines test the same thing
|
|
333
|
-
output_buffer.
|
|
334
|
-
output_buffer.
|
|
356
|
+
expect(output_buffer).to have_tag('input[checked="checked"]', :count => 1)
|
|
357
|
+
expect(output_buffer).to have_tag('input[checked="checked"]', :count => @freds_post.authors.size)
|
|
358
|
+
end
|
|
359
|
+
|
|
360
|
+
end
|
|
361
|
+
|
|
362
|
+
describe ':collection for a has_and_belongs_to_many association' do
|
|
363
|
+
|
|
364
|
+
before do
|
|
365
|
+
@output_buffer = ''
|
|
366
|
+
mock_everything
|
|
367
|
+
|
|
368
|
+
concat(semantic_form_for(@freds_post) do |builder|
|
|
369
|
+
concat(builder.input(:authors, as: :check_boxes, collection: Author.all))
|
|
370
|
+
end)
|
|
371
|
+
end
|
|
372
|
+
|
|
373
|
+
it 'should render checkboxes' do
|
|
374
|
+
# I'm aware these two lines test the same thing
|
|
375
|
+
expect(output_buffer).to have_tag('input[type="checkbox"]', :count => 2)
|
|
376
|
+
expect(output_buffer).to have_tag('input[type="checkbox"]', :count => ::Author.all.size)
|
|
377
|
+
end
|
|
378
|
+
|
|
379
|
+
it 'should only select checkboxes that are present in the association' do
|
|
380
|
+
# I'm aware these two lines test the same thing
|
|
381
|
+
expect(output_buffer).to have_tag('input[checked="checked"]', :count => 1)
|
|
382
|
+
expect(output_buffer).to have_tag('input[checked="checked"]', :count => @freds_post.authors.size)
|
|
335
383
|
end
|
|
336
384
|
|
|
337
385
|
end
|
|
@@ -344,33 +392,54 @@ describe 'check_boxes input' do
|
|
|
344
392
|
end
|
|
345
393
|
|
|
346
394
|
it 'to set the right input value' do
|
|
347
|
-
item =
|
|
348
|
-
item.
|
|
349
|
-
item.
|
|
350
|
-
item.
|
|
351
|
-
@new_post.author.
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
395
|
+
item = double('item')
|
|
396
|
+
expect(item).not_to receive(:id)
|
|
397
|
+
allow(item).to receive(:custom_value).and_return('custom_value')
|
|
398
|
+
expect(item).to receive(:custom_value).exactly(3).times
|
|
399
|
+
expect(@new_post.author).to receive(:custom_value).exactly(1).times
|
|
400
|
+
|
|
401
|
+
with_deprecation_silenced do
|
|
402
|
+
concat(semantic_form_for(@new_post) do |builder|
|
|
403
|
+
concat(builder.input(:author, :as => :check_boxes, :member_value => :custom_value, :collection => [item, item, item]))
|
|
404
|
+
end)
|
|
405
|
+
end
|
|
406
|
+
expect(output_buffer).to have_tag('input[@type=checkbox][@value="custom_value"]', :count => 3)
|
|
356
407
|
end
|
|
357
408
|
end
|
|
358
409
|
end
|
|
359
|
-
|
|
410
|
+
|
|
360
411
|
describe 'when :collection is provided as an array of arrays' do
|
|
361
412
|
before do
|
|
362
413
|
@output_buffer = ''
|
|
363
414
|
mock_everything
|
|
364
|
-
@fred.
|
|
365
|
-
|
|
415
|
+
allow(@fred).to receive(:genres) { ['fiction', 'biography'] }
|
|
416
|
+
|
|
366
417
|
concat(semantic_form_for(@fred) do |builder|
|
|
367
418
|
concat(builder.input(:genres, :as => :check_boxes, :collection => [['Fiction', 'fiction'], ['Non-fiction', 'non_fiction'], ['Biography', 'biography']]))
|
|
368
419
|
end)
|
|
369
420
|
end
|
|
370
|
-
|
|
421
|
+
|
|
371
422
|
it 'should check the correct checkboxes' do
|
|
372
|
-
output_buffer.
|
|
373
|
-
output_buffer.
|
|
423
|
+
expect(output_buffer).to have_tag("form li fieldset ol li label input[@value='fiction'][@checked='checked']")
|
|
424
|
+
expect(output_buffer).to have_tag("form li fieldset ol li label input[@value='biography'][@checked='checked']")
|
|
425
|
+
end
|
|
426
|
+
end
|
|
427
|
+
|
|
428
|
+
describe 'when :collection is a set' do
|
|
429
|
+
before do
|
|
430
|
+
@output_buffer = ''
|
|
431
|
+
mock_everything
|
|
432
|
+
allow(@fred).to receive(:roles) { Set.new([:reviewer, :admin]) }
|
|
433
|
+
|
|
434
|
+
concat(semantic_form_for(@fred) do |builder|
|
|
435
|
+
concat(builder.input(:roles, :as => :check_boxes, :collection => [['User', :user], ['Reviewer', :reviewer], ['Administrator', :admin]]))
|
|
436
|
+
end)
|
|
437
|
+
end
|
|
438
|
+
|
|
439
|
+
it 'should check the correct checkboxes' do
|
|
440
|
+
expect(output_buffer).to have_tag("form li fieldset ol li label input[@value='user']")
|
|
441
|
+
expect(output_buffer).to have_tag("form li fieldset ol li label input[@value='admin'][@checked='checked']")
|
|
442
|
+
expect(output_buffer).to have_tag("form li fieldset ol li label input[@value='reviewer'][@checked='checked']")
|
|
374
443
|
end
|
|
375
444
|
end
|
|
376
445
|
|
|
@@ -384,15 +453,15 @@ describe 'check_boxes input' do
|
|
|
384
453
|
concat(builder.input(:posts, :as => :check_boxes))
|
|
385
454
|
end)
|
|
386
455
|
end
|
|
387
|
-
|
|
456
|
+
|
|
388
457
|
it "should have a label for #context2_author_post_ids_19" do
|
|
389
|
-
output_buffer.
|
|
458
|
+
expect(output_buffer).to have_tag("form li label[@for='context2_author_post_ids_19']")
|
|
390
459
|
end
|
|
391
460
|
|
|
392
461
|
it_should_have_input_with_id('context2_author_post_ids_19')
|
|
393
462
|
it_should_have_input_wrapper_with_id("context2_author_posts_input")
|
|
394
463
|
end
|
|
395
|
-
|
|
464
|
+
|
|
396
465
|
describe "when index is provided" do
|
|
397
466
|
|
|
398
467
|
before do
|
|
@@ -405,21 +474,21 @@ describe 'check_boxes input' do
|
|
|
405
474
|
end)
|
|
406
475
|
end)
|
|
407
476
|
end
|
|
408
|
-
|
|
477
|
+
|
|
409
478
|
it 'should index the id of the wrapper' do
|
|
410
|
-
output_buffer.
|
|
479
|
+
expect(output_buffer).to have_tag("li#author_post_3_authors_input")
|
|
411
480
|
end
|
|
412
|
-
|
|
481
|
+
|
|
413
482
|
it 'should index the id of the input tag' do
|
|
414
|
-
output_buffer.
|
|
483
|
+
expect(output_buffer).to have_tag("input#author_post_3_author_ids_42")
|
|
415
484
|
end
|
|
416
485
|
|
|
417
486
|
it 'should index the name of the checkbox input' do
|
|
418
|
-
output_buffer.
|
|
487
|
+
expect(output_buffer).to have_tag("input[@type='checkbox'][@name='author[post][3][author_ids][]']")
|
|
419
488
|
end
|
|
420
|
-
|
|
489
|
+
|
|
421
490
|
end
|
|
422
|
-
|
|
491
|
+
|
|
423
492
|
|
|
424
493
|
describe "when collection is an array" do
|
|
425
494
|
before do
|
|
@@ -434,15 +503,45 @@ describe 'check_boxes input' do
|
|
|
434
503
|
|
|
435
504
|
it "should use array items for labels and values" do
|
|
436
505
|
@_collection.each do |post|
|
|
437
|
-
output_buffer.
|
|
438
|
-
output_buffer.
|
|
506
|
+
expect(output_buffer).to have_tag('form li fieldset ol li label', :text => /#{post.first}/)
|
|
507
|
+
expect(output_buffer).to have_tag("form li fieldset ol li label[@for='author_post_ids_#{post.last}']")
|
|
439
508
|
end
|
|
440
509
|
end
|
|
441
510
|
|
|
442
511
|
it "should not check any items" do
|
|
443
|
-
output_buffer.
|
|
444
|
-
end
|
|
512
|
+
expect(output_buffer).to have_tag('form li input[@checked]', :count => 0)
|
|
513
|
+
end
|
|
514
|
+
|
|
515
|
+
describe "and the attribute has values" do
|
|
516
|
+
before do
|
|
517
|
+
allow(@fred).to receive(:posts) { [1] }
|
|
518
|
+
|
|
519
|
+
concat(semantic_form_for(@fred) do |builder|
|
|
520
|
+
concat(builder.input(:posts, :as => :check_boxes, :collection => @_collection))
|
|
521
|
+
end)
|
|
522
|
+
end
|
|
523
|
+
|
|
524
|
+
it "should check the appropriate items" do
|
|
525
|
+
expect(output_buffer).to have_tag("form li input[@value='1'][@checked]")
|
|
526
|
+
end
|
|
527
|
+
end
|
|
528
|
+
|
|
529
|
+
describe "and the collection includes html options" do
|
|
530
|
+
before do
|
|
531
|
+
@_collection = [["First", 1, {'data-test' => 'test-data'}], ["Second", 2, {'data-test2' => 'test-data2'}]]
|
|
532
|
+
|
|
533
|
+
concat(semantic_form_for(@fred) do |builder|
|
|
534
|
+
concat(builder.input(:posts, :as => :check_boxes, :collection => @_collection))
|
|
535
|
+
end)
|
|
536
|
+
end
|
|
537
|
+
|
|
538
|
+
it "should have injected the html attributes" do
|
|
539
|
+
@_collection.each do |v|
|
|
540
|
+
expect(output_buffer).to have_tag("form li input[@value='#{v[1]}'][@#{v[2].keys[0]}='#{v[2].values[0]}']")
|
|
541
|
+
end
|
|
542
|
+
end
|
|
543
|
+
end
|
|
445
544
|
end
|
|
446
|
-
|
|
545
|
+
|
|
447
546
|
end
|
|
448
547
|
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
require 'spec_helper'
|
|
3
|
+
|
|
4
|
+
RSpec.describe 'color input' do
|
|
5
|
+
|
|
6
|
+
include FormtasticSpecHelper
|
|
7
|
+
|
|
8
|
+
before do
|
|
9
|
+
@output_buffer = ''
|
|
10
|
+
mock_everything
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
describe "when object is provided" do
|
|
14
|
+
before do
|
|
15
|
+
concat(semantic_form_for(@new_post) do |builder|
|
|
16
|
+
concat(builder.input(:color))
|
|
17
|
+
end)
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
it_should_have_input_wrapper_with_class(:color)
|
|
21
|
+
it_should_have_input_wrapper_with_class(:input)
|
|
22
|
+
it_should_have_input_wrapper_with_class(:stringish)
|
|
23
|
+
it_should_have_input_wrapper_with_id("post_color_input")
|
|
24
|
+
it_should_have_label_with_text(/Color/)
|
|
25
|
+
it_should_have_label_for("post_color")
|
|
26
|
+
it_should_have_input_with_id("post_color")
|
|
27
|
+
it_should_have_input_with_type(:color)
|
|
28
|
+
it_should_have_input_with_name("post[color]")
|
|
29
|
+
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
describe "when namespace is provided" do
|
|
33
|
+
|
|
34
|
+
before do
|
|
35
|
+
concat(semantic_form_for(@new_post, :namespace => 'context2') do |builder|
|
|
36
|
+
concat(builder.input(:color))
|
|
37
|
+
end)
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
it_should_have_input_wrapper_with_id("context2_post_color_input")
|
|
41
|
+
it_should_have_label_and_input_with_id("context2_post_color")
|
|
42
|
+
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
describe "when index is provided" do
|
|
46
|
+
|
|
47
|
+
before do
|
|
48
|
+
@output_buffer = ''
|
|
49
|
+
mock_everything
|
|
50
|
+
|
|
51
|
+
concat(semantic_form_for(@new_post) do |builder|
|
|
52
|
+
concat(builder.fields_for(:author, :index => 3) do |author|
|
|
53
|
+
concat(author.input(:name, :as => :color))
|
|
54
|
+
end)
|
|
55
|
+
end)
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
it 'should index the id of the wrapper' do
|
|
59
|
+
expect(output_buffer).to have_tag("li#post_author_attributes_3_name_input")
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
it 'should index the id of the select tag' do
|
|
63
|
+
expect(output_buffer).to have_tag("input#post_author_attributes_3_name")
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
it 'should index the name of the select tag' do
|
|
67
|
+
expect(output_buffer).to have_tag("input[@name='post[author_attributes][3][name]']")
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
describe "when required" do
|
|
74
|
+
it "should add the required attribute to the input's html options" do
|
|
75
|
+
with_config :use_required_attribute, true do
|
|
76
|
+
concat(semantic_form_for(@new_post) do |builder|
|
|
77
|
+
concat(builder.input(:title, :as => :color, :required => true))
|
|
78
|
+
end)
|
|
79
|
+
expect(output_buffer).to have_tag("input[@required]")
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
end
|
|
85
|
+
|