formtastic 3.1.5 → 4.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (119) hide show
  1. checksums.yaml +5 -5
  2. data/.gitattributes +1 -0
  3. data/.github/workflows/test.yml +61 -0
  4. data/.gitignore +3 -2
  5. data/CHANGELOG.md +52 -0
  6. data/Gemfile.lock +105 -0
  7. data/MIT-LICENSE +1 -1
  8. data/README.md +627 -629
  9. data/RELEASE_PROCESS +3 -1
  10. data/Rakefile +20 -1
  11. data/app/assets/stylesheets/formtastic.css +1 -1
  12. data/bin/appraisal +8 -0
  13. data/formtastic.gemspec +9 -15
  14. data/gemfiles/rails_5.2/Gemfile +5 -0
  15. data/gemfiles/rails_6.0/Gemfile +5 -0
  16. data/gemfiles/rails_6.1/Gemfile +5 -0
  17. data/gemfiles/rails_edge/Gemfile +13 -0
  18. data/lib/formtastic.rb +5 -11
  19. data/lib/formtastic/actions.rb +6 -3
  20. data/lib/formtastic/deprecation.rb +1 -38
  21. data/lib/formtastic/engine.rb +3 -1
  22. data/lib/formtastic/form_builder.rb +8 -24
  23. data/lib/formtastic/helpers/action_helper.rb +1 -48
  24. data/lib/formtastic/helpers/errors_helper.rb +2 -2
  25. data/lib/formtastic/helpers/fieldset_wrapper.rb +7 -3
  26. data/lib/formtastic/helpers/input_helper.rb +18 -76
  27. data/lib/formtastic/helpers/inputs_helper.rb +12 -3
  28. data/lib/formtastic/i18n.rb +1 -1
  29. data/lib/formtastic/inputs.rb +32 -29
  30. data/lib/formtastic/inputs/base/collections.rb +1 -5
  31. data/lib/formtastic/inputs/base/errors.rb +4 -4
  32. data/lib/formtastic/inputs/base/hints.rb +1 -1
  33. data/lib/formtastic/inputs/base/timeish.rb +5 -1
  34. data/lib/formtastic/inputs/base/validations.rb +19 -9
  35. data/lib/formtastic/inputs/check_boxes_input.rb +3 -3
  36. data/lib/formtastic/inputs/color_input.rb +0 -1
  37. data/lib/formtastic/inputs/select_input.rb +1 -1
  38. data/lib/formtastic/localizer.rb +5 -7
  39. data/lib/formtastic/version.rb +1 -1
  40. data/lib/generators/templates/formtastic.rb +4 -6
  41. data/sample/basic_inputs.html +1 -1
  42. data/script/integration-template.rb +74 -0
  43. data/script/integration.sh +19 -0
  44. data/spec/action_class_finder_spec.rb +1 -1
  45. data/spec/actions/button_action_spec.rb +8 -8
  46. data/spec/actions/generic_action_spec.rb +60 -60
  47. data/spec/actions/input_action_spec.rb +7 -7
  48. data/spec/actions/link_action_spec.rb +10 -10
  49. data/spec/builder/custom_builder_spec.rb +37 -21
  50. data/spec/builder/error_proc_spec.rb +4 -4
  51. data/spec/builder/semantic_fields_for_spec.rb +27 -27
  52. data/spec/generators/formtastic/form/form_generator_spec.rb +25 -25
  53. data/spec/generators/formtastic/input/input_generator_spec.rb +31 -31
  54. data/spec/generators/formtastic/install/install_generator_spec.rb +9 -9
  55. data/spec/helpers/action_helper_spec.rb +328 -10
  56. data/spec/helpers/actions_helper_spec.rb +17 -17
  57. data/spec/helpers/form_helper_spec.rb +33 -33
  58. data/spec/helpers/input_helper_spec.rb +975 -2
  59. data/spec/helpers/inputs_helper_spec.rb +120 -105
  60. data/spec/helpers/reflection_helper_spec.rb +3 -3
  61. data/spec/helpers/semantic_errors_helper_spec.rb +22 -22
  62. data/spec/i18n_spec.rb +26 -26
  63. data/spec/input_class_finder_spec.rb +1 -1
  64. data/spec/inputs/base/collections_spec.rb +6 -6
  65. data/spec/inputs/base/validations_spec.rb +157 -19
  66. data/spec/inputs/boolean_input_spec.rb +55 -55
  67. data/spec/inputs/check_boxes_input_spec.rb +96 -95
  68. data/spec/inputs/color_input_spec.rb +51 -63
  69. data/spec/inputs/country_input_spec.rb +20 -20
  70. data/spec/inputs/custom_input_spec.rb +2 -6
  71. data/spec/inputs/datalist_input_spec.rb +1 -1
  72. data/spec/inputs/date_picker_input_spec.rb +42 -42
  73. data/spec/inputs/date_select_input_spec.rb +51 -37
  74. data/spec/inputs/datetime_picker_input_spec.rb +46 -46
  75. data/spec/inputs/datetime_select_input_spec.rb +53 -37
  76. data/spec/inputs/email_input_spec.rb +5 -5
  77. data/spec/inputs/file_input_spec.rb +6 -6
  78. data/spec/inputs/hidden_input_spec.rb +18 -18
  79. data/spec/inputs/include_blank_spec.rb +8 -8
  80. data/spec/inputs/label_spec.rb +20 -20
  81. data/spec/inputs/number_input_spec.rb +112 -112
  82. data/spec/inputs/password_input_spec.rb +5 -5
  83. data/spec/inputs/phone_input_spec.rb +5 -5
  84. data/spec/inputs/placeholder_spec.rb +5 -5
  85. data/spec/inputs/radio_input_spec.rb +63 -65
  86. data/spec/inputs/range_input_spec.rb +66 -66
  87. data/spec/inputs/readonly_spec.rb +4 -4
  88. data/spec/inputs/search_input_spec.rb +5 -5
  89. data/spec/inputs/select_input_spec.rb +92 -96
  90. data/spec/inputs/string_input_spec.rb +23 -23
  91. data/spec/inputs/text_input_spec.rb +16 -16
  92. data/spec/inputs/time_picker_input_spec.rb +43 -43
  93. data/spec/inputs/time_select_input_spec.rb +67 -54
  94. data/spec/inputs/time_zone_input_spec.rb +19 -19
  95. data/spec/inputs/url_input_spec.rb +5 -5
  96. data/spec/inputs/with_options_spec.rb +7 -7
  97. data/spec/localizer_spec.rb +17 -17
  98. data/spec/namespaced_class_finder_spec.rb +2 -2
  99. data/spec/schema.rb +21 -0
  100. data/spec/spec_helper.rb +163 -223
  101. data/spec/support/custom_macros.rb +72 -75
  102. data/spec/support/shared_examples.rb +0 -1301
  103. data/spec/support/test_environment.rb +23 -9
  104. metadata +36 -126
  105. data/.travis.yml +0 -46
  106. data/Appraisals +0 -43
  107. data/CHANGELOG +0 -54
  108. data/DEPRECATIONS +0 -52
  109. data/gemfiles/rails_3.2.gemfile +0 -9
  110. data/gemfiles/rails_4.0.4.gemfile +0 -8
  111. data/gemfiles/rails_4.1.gemfile +0 -8
  112. data/gemfiles/rails_4.2.gemfile +0 -8
  113. data/gemfiles/rails_4.gemfile +0 -8
  114. data/gemfiles/rails_5.0.gemfile +0 -8
  115. data/gemfiles/rails_edge.gemfile +0 -15
  116. data/lib/formtastic/util.rb +0 -57
  117. data/spec/helpers/namespaced_action_helper_spec.rb +0 -43
  118. data/spec/helpers/namespaced_input_helper_spec.rb +0 -36
  119. data/spec/util_spec.rb +0 -66
@@ -2,7 +2,7 @@ require 'spec_helper'
2
2
 
3
3
  require 'generators/formtastic/input/input_generator'
4
4
 
5
- describe Formtastic::InputGenerator do
5
+ RSpec.describe Formtastic::InputGenerator do
6
6
  include FormtasticSpecHelper
7
7
 
8
8
  destination File.expand_path("../../../../../tmp", __FILE__)
@@ -17,7 +17,7 @@ describe Formtastic::InputGenerator do
17
17
 
18
18
  describe 'without file name' do
19
19
  it 'should raise Thor::RequiredArgumentMissingError' do
20
- lambda { run_generator }.should raise_error(Thor::RequiredArgumentMissingError)
20
+ expect { run_generator }.to raise_error(Thor::RequiredArgumentMissingError)
21
21
  end
22
22
  end
23
23
 
@@ -26,11 +26,11 @@ describe Formtastic::InputGenerator do
26
26
 
27
27
  describe 'generate an input in its respective folder' do
28
28
  subject{ file('app/inputs/hat_size_input.rb')}
29
- it { should exist}
30
- it { should contain "class HatSizeInput"}
31
- it { should contain "def to_html"}
32
- it { should contain "include Formtastic::Inputs::Base"}
33
- it { should_not contain "super"}
29
+ it { is_expected.to exist}
30
+ it { is_expected.to contain "class HatSizeInput"}
31
+ it { is_expected.to contain "def to_html"}
32
+ it { is_expected.to contain "include Formtastic::Inputs::Base"}
33
+ it { is_expected.not_to contain "super"}
34
34
  end
35
35
  end
36
36
 
@@ -39,8 +39,8 @@ describe Formtastic::InputGenerator do
39
39
 
40
40
  describe 'generate an input in its respective folder' do
41
41
  subject{ file('app/inputs/hat_size_input.rb')}
42
- it { should exist}
43
- it { should contain "class HatSizeInput"}
42
+ it { is_expected.to exist}
43
+ it { is_expected.to contain "class HatSizeInput"}
44
44
  end
45
45
  end
46
46
 
@@ -49,8 +49,8 @@ describe Formtastic::InputGenerator do
49
49
 
50
50
  describe 'generate an input in its respective folder' do
51
51
  subject{ file('app/inputs/hat_size_input.rb')}
52
- it { should exist}
53
- it { should contain "class HatSizeInput"}
52
+ it { is_expected.to exist}
53
+ it { is_expected.to contain "class HatSizeInput"}
54
54
  end
55
55
  end
56
56
 
@@ -59,8 +59,8 @@ describe Formtastic::InputGenerator do
59
59
 
60
60
  describe 'generate an input in its respective folder' do
61
61
  subject{ file('app/inputs/hat_size_input.rb')}
62
- it { should exist}
63
- it { should contain "class HatSizeInput"}
62
+ it { is_expected.to exist}
63
+ it { is_expected.to contain "class HatSizeInput"}
64
64
  end
65
65
  end
66
66
 
@@ -69,8 +69,8 @@ describe Formtastic::InputGenerator do
69
69
 
70
70
  describe 'generate an input in its respective folder' do
71
71
  subject{ file('app/inputs/hat_size_input.rb')}
72
- it { should exist}
73
- it { should contain "class HatSizeInput"}
72
+ it { is_expected.to exist}
73
+ it { is_expected.to contain "class HatSizeInput"}
74
74
  end
75
75
  end
76
76
 
@@ -79,12 +79,12 @@ describe Formtastic::InputGenerator do
79
79
 
80
80
  describe 'app/inputs/string_input.rb' do
81
81
  subject{ file('app/inputs/string_input.rb')}
82
- it { should exist }
83
- it { should contain "class StringInput < Formtastic::Inputs::StringInput" }
84
- it { should contain "def to_html" }
85
- it { should_not contain "include Formtastic::Inputs::Base" }
86
- it { should contain "super" }
87
- it { should_not contain "def input_html_options" }
82
+ it { is_expected.to exist }
83
+ it { is_expected.to contain "class StringInput < Formtastic::Inputs::StringInput" }
84
+ it { is_expected.to contain "def to_html" }
85
+ it { is_expected.not_to contain "include Formtastic::Inputs::Base" }
86
+ it { is_expected.to contain "super" }
87
+ it { is_expected.not_to contain "def input_html_options" }
88
88
  end
89
89
  end
90
90
 
@@ -93,10 +93,10 @@ describe Formtastic::InputGenerator do
93
93
 
94
94
  describe 'app/inputs/flexible_text_input.rb' do
95
95
  subject{ file('app/inputs/flexible_text_input.rb')}
96
- it { should contain "class FlexibleTextInput < Formtastic::Inputs::StringInput" }
97
- it { should contain "def input_html_options" }
98
- it { should_not contain "include Formtastic::Inputs::Base" }
99
- it { should_not contain "def to_html" }
96
+ it { is_expected.to contain "class FlexibleTextInput < Formtastic::Inputs::StringInput" }
97
+ it { is_expected.to contain "def input_html_options" }
98
+ it { is_expected.not_to contain "include Formtastic::Inputs::Base" }
99
+ it { is_expected.not_to contain "def to_html" }
100
100
  end
101
101
  end
102
102
 
@@ -105,9 +105,9 @@ describe Formtastic::InputGenerator do
105
105
 
106
106
  describe 'app/inputs/stuff/foo_input.rb' do
107
107
  subject{ file('app/inputs/stuff/foo_input.rb')}
108
- it {should exist}
109
- it { should contain "class Stuff::FooInput" }
110
- it { should contain "include Formtastic::Inputs::Base" }
108
+ it {is_expected.to exist}
109
+ it { is_expected.to contain "class Stuff::FooInput" }
110
+ it { is_expected.to contain "include Formtastic::Inputs::Base" }
111
111
  end
112
112
  end
113
113
 
@@ -116,9 +116,9 @@ describe Formtastic::InputGenerator do
116
116
 
117
117
  describe 'app/inputs/stuff/foo_input.rb' do
118
118
  subject{ file('app/inputs/stuff/foo_input.rb')}
119
- it {should exist}
120
- it { should contain "class Stuff::FooInput" }
121
- it { should contain "include Formtastic::Inputs::Base" }
119
+ it {is_expected.to exist}
120
+ it { is_expected.to contain "class Stuff::FooInput" }
121
+ it { is_expected.to contain "include Formtastic::Inputs::Base" }
122
122
  end
123
123
  end
124
124
  end
@@ -3,7 +3,7 @@ require 'spec_helper'
3
3
  # Generators are not automatically loaded by Rails
4
4
  require 'generators/formtastic/install/install_generator'
5
5
 
6
- describe Formtastic::InstallGenerator do
6
+ RSpec.describe Formtastic::InstallGenerator do
7
7
  # Tell the generator where to put its output (what it thinks of as Rails.root)
8
8
  destination File.expand_path("../../../../../tmp", __FILE__)
9
9
 
@@ -14,14 +14,14 @@ describe Formtastic::InstallGenerator do
14
14
 
15
15
  describe 'config/initializers/formtastic.rb' do
16
16
  subject { file('config/initializers/formtastic.rb') }
17
- it { should exist }
18
- it { should contain "#" }
17
+ it { is_expected.to exist }
18
+ it { is_expected.to contain "#" }
19
19
  end
20
20
 
21
21
  describe 'lib/templates/erb/scaffold/_form.html.erb' do
22
22
  subject { file('lib/templates/erb/scaffold/_form.html.erb') }
23
- it { should exist }
24
- it { should contain "<%%= semantic_form_for @<%= singular_name %> do |f| %>" }
23
+ it { is_expected.to exist }
24
+ it { is_expected.to contain "<%%= semantic_form_for @<%= singular_name %> do |f| %>" }
25
25
  end
26
26
  end
27
27
 
@@ -30,8 +30,8 @@ describe Formtastic::InstallGenerator do
30
30
 
31
31
  describe 'lib/templates/erb/scaffold/_form.html.haml' do
32
32
  subject { file('lib/templates/haml/scaffold/_form.html.haml') }
33
- it { should exist }
34
- it { should contain "= semantic_form_for @<%= singular_name %> do |f|" }
33
+ it { is_expected.to exist }
34
+ it { is_expected.to contain "= semantic_form_for @<%= singular_name %> do |f|" }
35
35
  end
36
36
  end
37
37
 
@@ -40,8 +40,8 @@ describe Formtastic::InstallGenerator do
40
40
 
41
41
  describe 'lib/templates/erb/scaffold/_form.html.slim' do
42
42
  subject { file('lib/templates/slim/scaffold/_form.html.slim') }
43
- it { should exist }
44
- it { should contain "= semantic_form_for @<%= singular_name %> do |f|" }
43
+ it { is_expected.to exist }
44
+ it { is_expected.to contain "= semantic_form_for @<%= singular_name %> do |f|" }
45
45
  end
46
46
  end
47
47
  end
@@ -1,19 +1,337 @@
1
- # encoding: utf-8
2
1
  require 'spec_helper'
3
2
 
4
- describe 'Formtastic::FormBuilder#action' do
5
- include_context 'Action Helper' # from spec/support/shared_examples.rb
3
+ RSpec.describe 'with action class finder' do
4
+ include_context 'form builder'
5
+
6
+ describe 'arguments and options' do
7
+
8
+ it 'should require the first argument (the action method)' do
9
+ expect {
10
+ concat(semantic_form_for(@new_post) do |builder|
11
+ concat(builder.action()) # no args passed in at all
12
+ end)
13
+ }.to raise_error(ArgumentError)
14
+ end
15
+
16
+ describe ':as option' do
17
+
18
+ describe 'when not provided' do
19
+
20
+ it 'should default to a commit for commit' do
21
+ concat(semantic_form_for(:project, :url => 'http://test.host') do |builder|
22
+ concat(builder.action(:submit))
23
+ end)
24
+ expect(output_buffer).to have_tag('form li.action.input_action', :count => 1)
25
+ end
26
+
27
+ it 'should default to a button for reset' do
28
+ concat(semantic_form_for(:project, :url => 'http://test.host') do |builder|
29
+ concat(builder.action(:reset))
30
+ end)
31
+ expect(output_buffer).to have_tag('form li.action.input_action', :count => 1)
32
+ end
33
+
34
+ it 'should default to a link for cancel' do
35
+ concat(semantic_form_for(:project, :url => 'http://test.host') do |builder|
36
+ concat(builder.action(:cancel))
37
+ end)
38
+ expect(output_buffer).to have_tag('form li.action.link_action', :count => 1)
39
+ end
40
+ end
41
+
42
+ it 'should call the corresponding action class with .to_html' do
43
+ [:input, :button, :link].each do |action_style|
44
+ semantic_form_for(:project, :url => "http://test.host") do |builder|
45
+ action_instance = double('Action instance')
46
+ action_class = "#{action_style.to_s}_action".classify
47
+ action_constant = "Formtastic::Actions::#{action_class}".constantize
48
+
49
+ expect(action_constant).to receive(:new).and_return(action_instance)
50
+ expect(action_instance).to receive(:to_html).and_return("some HTML")
51
+
52
+ concat(builder.action(:submit, :as => action_style))
53
+ end
54
+ end
55
+ end
56
+
57
+ end
58
+
59
+ #describe ':label option' do
60
+ #
61
+ # describe 'when provided' do
62
+ # it 'should be passed down to the label tag' do
63
+ # concat(semantic_form_for(@new_post) do |builder|
64
+ # concat(builder.input(:title, :label => "Kustom"))
65
+ # end)
66
+ # output_buffer.should have_tag("form li label", /Kustom/)
67
+ # end
68
+ #
69
+ # it 'should not generate a label if false' do
70
+ # concat(semantic_form_for(@new_post) do |builder|
71
+ # concat(builder.input(:title, :label => false))
72
+ # end)
73
+ # output_buffer.should_not have_tag("form li label")
74
+ # end
75
+ #
76
+ # it 'should be dupped if frozen' do
77
+ # concat(semantic_form_for(@new_post) do |builder|
78
+ # concat(builder.input(:title, :label => "Kustom".freeze))
79
+ # end)
80
+ # output_buffer.should have_tag("form li label", /Kustom/)
81
+ # end
82
+ # end
83
+ #
84
+ # describe 'when not provided' do
85
+ # describe 'when localized label is provided' do
86
+ # describe 'and object is given' do
87
+ # describe 'and label_str_method not :humanize' do
88
+ # it 'should render a label with localized text and not apply the label_str_method' do
89
+ # with_config :label_str_method, :reverse do
90
+ # @localized_label_text = 'Localized title'
91
+ # @new_post.stub(:meta_description)
92
+ # ::I18n.backend.store_translations :en,
93
+ # :formtastic => {
94
+ # :labels => {
95
+ # :meta_description => @localized_label_text
96
+ # }
97
+ # }
98
+ #
99
+ # concat(semantic_form_for(@new_post) do |builder|
100
+ # concat(builder.input(:meta_description))
101
+ # end)
102
+ # output_buffer.should have_tag('form li label', /Localized title/)
103
+ # end
104
+ # end
105
+ # end
106
+ # end
107
+ # end
108
+ #
109
+ # describe 'when localized label is NOT provided' do
110
+ # describe 'and object is not given' do
111
+ # it 'should default the humanized method name, passing it down to the label tag' do
112
+ # ::I18n.backend.store_translations :en, :formtastic => {}
113
+ # with_config :label_str_method, :humanize do
114
+ # concat(semantic_form_for(:project, :url => 'http://test.host') do |builder|
115
+ # concat(builder.input(:meta_description))
116
+ # end)
117
+ # output_buffer.should have_tag("form li label", /#{'meta_description'.humanize}/)
118
+ # end
119
+ # end
120
+ # end
121
+ #
122
+ # describe 'and object is given' do
123
+ # it 'should delegate the label logic to class human attribute name and pass it down to the label tag' do
124
+ # @new_post.stub(:meta_description) # a two word method name
125
+ # @new_post.class.should_receive(:human_attribute_name).with('meta_description').and_return('meta_description'.humanize)
126
+ #
127
+ # concat(semantic_form_for(@new_post) do |builder|
128
+ # concat(builder.input(:meta_description))
129
+ # end)
130
+ # output_buffer.should have_tag("form li label", /#{'meta_description'.humanize}/)
131
+ # end
132
+ # end
133
+ #
134
+ # describe 'and object is given with label_str_method set to :capitalize' do
135
+ # it 'should capitalize method name, passing it down to the label tag' do
136
+ # with_config :label_str_method, :capitalize do
137
+ # @new_post.stub(:meta_description)
138
+ #
139
+ # concat(semantic_form_for(@new_post) do |builder|
140
+ # concat(builder.input(:meta_description))
141
+ # end)
142
+ # output_buffer.should have_tag("form li label", /#{'meta_description'.capitalize}/)
143
+ # end
144
+ # end
145
+ # end
146
+ # end
147
+ #
148
+ # describe 'when localized label is provided' do
149
+ # before do
150
+ # @localized_label_text = 'Localized title'
151
+ # @default_localized_label_text = 'Default localized title'
152
+ # ::I18n.backend.store_translations :en,
153
+ # :formtastic => {
154
+ # :labels => {
155
+ # :title => @default_localized_label_text,
156
+ # :published => @default_localized_label_text,
157
+ # :post => {
158
+ # :title => @localized_label_text,
159
+ # :published => @default_localized_label_text
160
+ # }
161
+ # }
162
+ # }
163
+ # end
164
+ #
165
+ # it 'should render a label with localized label (I18n)' do
166
+ # with_config :i18n_lookups_by_default, false do
167
+ # concat(semantic_form_for(@new_post) do |builder|
168
+ # concat(builder.input(:title, :label => true))
169
+ # concat(builder.input(:published, :as => :boolean, :label => true))
170
+ # end)
171
+ # output_buffer.should have_tag('form li label', Regexp.new('^' + @localized_label_text))
172
+ # end
173
+ # end
174
+ #
175
+ # it 'should render a hint paragraph containing an optional localized label (I18n) if first is not set' do
176
+ # with_config :i18n_lookups_by_default, false do
177
+ # ::I18n.backend.store_translations :en,
178
+ # :formtastic => {
179
+ # :labels => {
180
+ # :post => {
181
+ # :title => nil,
182
+ # :published => nil
183
+ # }
184
+ # }
185
+ # }
186
+ # concat(semantic_form_for(@new_post) do |builder|
187
+ # concat(builder.input(:title, :label => true))
188
+ # concat(builder.input(:published, :as => :boolean, :label => true))
189
+ # end)
190
+ # output_buffer.should have_tag('form li label', Regexp.new('^' + @default_localized_label_text))
191
+ # end
192
+ # end
193
+ # end
194
+ # end
195
+ #
196
+ #end
197
+ #
198
+ describe ':wrapper_html option' do
199
+
200
+ describe 'when provided' do
201
+ it 'should be passed down to the li tag' do
202
+ concat(semantic_form_for(@new_post) do |builder|
203
+ concat(builder.action(:submit, :wrapper_html => {:id => :another_id}))
204
+ end)
205
+ expect(output_buffer).to have_tag("form li#another_id")
206
+ end
207
+
208
+ it 'should append given classes to li default classes' do
209
+ concat(semantic_form_for(@new_post) do |builder|
210
+ concat(builder.action(:submit, :wrapper_html => {:class => :another_class}))
211
+ end)
212
+ expect(output_buffer).to have_tag("form li.action")
213
+ expect(output_buffer).to have_tag("form li.input_action")
214
+ expect(output_buffer).to have_tag("form li.another_class")
215
+ end
216
+
217
+ it 'should allow classes to be an array' do
218
+ concat(semantic_form_for(@new_post) do |builder|
219
+ concat(builder.action(:submit, :wrapper_html => {:class => [ :my_class, :another_class ]}))
220
+ end)
221
+ expect(output_buffer).to have_tag("form li.action")
222
+ expect(output_buffer).to have_tag("form li.input_action")
223
+ expect(output_buffer).to have_tag("form li.my_class")
224
+ expect(output_buffer).to have_tag("form li.another_class")
225
+ end
226
+ end
227
+
228
+ describe 'when not provided' do
229
+ it 'should use default id and class' do
230
+ concat(semantic_form_for(@new_post) do |builder|
231
+ concat(builder.action(:submit))
232
+ end)
233
+ expect(output_buffer).to have_tag("form li#post_submit_action")
234
+ expect(output_buffer).to have_tag("form li.action")
235
+ expect(output_buffer).to have_tag("form li.input_action")
236
+ end
237
+ end
238
+
239
+ end
240
+
241
+ end
6
242
 
7
- # TODO: remove this in Formtastic 4.0
8
243
  describe 'instantiating an action class' do
9
- context 'of unknown action' do
10
- it "should try to load class named as the action" do
244
+ context 'when a class does not exist' do
245
+ it "should raise an error" do
11
246
  expect {
12
- semantic_form_for(@new_post) do |builder|
13
- builder.action(:destroy)
14
- end
15
- }.to raise_error(Formtastic::UnknownActionError, 'Unable to find action destroy')
247
+ concat(semantic_form_for(@new_post) do |builder|
248
+ builder.action(:submit, :as => :non_existant)
249
+ end)
250
+ }.to raise_error(Formtastic::UnknownActionError)
16
251
  end
17
252
  end
253
+
254
+ context 'when a customized top-level class does not exist' do
255
+ it 'should instantiate the Formtastic action' do
256
+ action = double('action', :to_html => 'some HTML')
257
+ expect(Formtastic::Actions::ButtonAction).to receive(:new).and_return(action)
258
+ concat(semantic_form_for(@new_post) do |builder|
259
+ builder.action(:commit, :as => :button)
260
+ end)
261
+ end
262
+ end
263
+
264
+ describe 'when a top-level (custom) action class exists' do
265
+ it "should instantiate the top-level action instead of the Formtastic one" do
266
+ class ::ButtonAction < Formtastic::Actions::ButtonAction
267
+ end
268
+
269
+ action = double('action', :to_html => 'some HTML')
270
+ expect(Formtastic::Actions::ButtonAction).not_to receive(:new)
271
+ expect(::ButtonAction).to receive(:new).and_return(action)
272
+
273
+ concat(semantic_form_for(@new_post) do |builder|
274
+ builder.action(:commit, :as => :button)
275
+ end)
276
+ end
277
+ end
278
+
279
+ describe 'support for :as on each action' do
280
+
281
+ it "should raise an error when the action does not support the :as" do
282
+ expect {
283
+ concat(semantic_form_for(@new_post) do |builder|
284
+ concat(builder.action(:submit, :as => :link))
285
+ end)
286
+ }.to raise_error(Formtastic::UnsupportedMethodForAction)
287
+
288
+ expect {
289
+ concat(semantic_form_for(@new_post) do |builder|
290
+ concat(builder.action(:cancel, :as => :input))
291
+ end)
292
+ }.to raise_error(Formtastic::UnsupportedMethodForAction)
293
+
294
+ expect {
295
+ concat(semantic_form_for(@new_post) do |builder|
296
+ concat(builder.action(:cancel, :as => :button))
297
+ end)
298
+ }.to raise_error(Formtastic::UnsupportedMethodForAction)
299
+ end
300
+
301
+ it "should not raise an error when the action does not support the :as" do
302
+ expect {
303
+ concat(semantic_form_for(@new_post) do |builder|
304
+ concat(builder.action(:cancel, :as => :link))
305
+ end)
306
+ }.not_to raise_error
307
+
308
+ expect {
309
+ concat(semantic_form_for(@new_post) do |builder|
310
+ concat(builder.action(:submit, :as => :input))
311
+ end)
312
+ }.not_to raise_error
313
+
314
+ expect {
315
+ concat(semantic_form_for(@new_post) do |builder|
316
+ concat(builder.action(:submit, :as => :button))
317
+ end)
318
+ }.not_to raise_error
319
+
320
+ expect {
321
+ concat(semantic_form_for(@new_post) do |builder|
322
+ concat(builder.action(:reset, :as => :input))
323
+ end)
324
+ }.not_to raise_error
325
+
326
+ expect {
327
+ concat(semantic_form_for(@new_post) do |builder|
328
+ concat(builder.action(:reset, :as => :button))
329
+ end)
330
+ }.not_to raise_error
331
+ end
332
+
333
+ end
334
+
18
335
  end
336
+
19
337
  end