forme 1.12.0 → 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 (47) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +54 -0
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +228 -206
  5. data/Rakefile +1 -7
  6. data/lib/forme/bs3.rb +23 -9
  7. data/lib/forme/erb.rb +13 -25
  8. data/lib/forme/form.rb +146 -149
  9. data/lib/forme/input.rb +1 -1
  10. data/lib/forme/rails.rb +39 -83
  11. data/lib/forme/raw.rb +2 -2
  12. data/lib/forme/tag.rb +3 -12
  13. data/lib/forme/template.rb +110 -0
  14. data/lib/forme/transformers/error_handler.rb +10 -10
  15. data/lib/forme/transformers/formatter.rb +32 -34
  16. data/lib/forme/transformers/helper.rb +0 -1
  17. data/lib/forme/transformers/inputs_wrapper.rb +4 -4
  18. data/lib/forme/version.rb +2 -2
  19. data/lib/forme.rb +13 -2
  20. data/lib/roda/plugins/forme.rb +1 -1
  21. data/lib/roda/plugins/forme_erubi_capture.rb +57 -0
  22. data/lib/roda/plugins/forme_route_csrf.rb +16 -34
  23. data/lib/roda/plugins/forme_set.rb +39 -76
  24. data/lib/sequel/plugins/forme.rb +45 -54
  25. data/lib/sequel/plugins/forme_i18n.rb +3 -1
  26. data/lib/sequel/plugins/forme_set.rb +2 -4
  27. data/spec/all.rb +1 -1
  28. data/spec/bs3_reference_spec.rb +291 -314
  29. data/spec/bs3_sequel_plugin_spec.rb +155 -155
  30. data/spec/bs3_spec.rb +247 -206
  31. data/spec/erb_helper.rb +69 -58
  32. data/spec/erubi_capture_helper.rb +198 -0
  33. data/spec/forme_coverage.rb +1 -0
  34. data/spec/forme_spec.rb +438 -377
  35. data/spec/rails_integration_spec.rb +21 -11
  36. data/spec/roda_integration_spec.rb +136 -70
  37. data/spec/sequel_helper.rb +3 -2
  38. data/spec/sequel_i18n_helper.rb +1 -1
  39. data/spec/sequel_i18n_plugin_spec.rb +6 -6
  40. data/spec/sequel_plugin_spec.rb +262 -150
  41. data/spec/sequel_set_plugin_spec.rb +9 -3
  42. data/spec/shared_erb_specs.rb +71 -0
  43. data/spec/sinatra_integration_spec.rb +31 -6
  44. data/spec/spec_helper.rb +21 -8
  45. metadata +8 -6
  46. data/lib/forme/erb_form.rb +0 -74
  47. data/lib/forme/sinatra.rb +0 -17
@@ -1,7 +1,6 @@
1
- require File.join(File.dirname(File.expand_path(__FILE__)), 'spec_helper.rb')
2
- require File.join(File.dirname(File.expand_path(__FILE__)), 'sequel_helper.rb')
1
+ require_relative 'spec_helper'
2
+ require_relative 'sequel_helper'
3
3
 
4
- require 'rubygems'
5
4
  begin
6
5
  require 'action_controller/railtie'
7
6
 
@@ -9,23 +8,22 @@ begin
9
8
  require 'active_pack/gem_version'
10
9
  rescue LoadError
11
10
  end
12
- require 'forme/rails'
11
+ require_relative '../lib/forme/rails'
13
12
 
14
13
  if Rails.respond_to?(:version) && Rails.version.start_with?('4')
15
14
  # Work around issue in backported openssl environments where
16
15
  # secret is 64 bytes intead of 32 bytes
17
16
  require 'active_support/message_encryptor'
18
- ActiveSupport::MessageEncryptor.send :prepend, Module.new {
19
- def initialize(secret, *signature_key_or_options)
20
- secret = secret[0, 32]
21
- super
22
- end
23
- }
17
+ def (ActiveSupport::MessageEncryptor).new(secret, *signature_key_or_options)
18
+ obj = allocate
19
+ obj.send(:initialize, secret[0, 32], *signature_key_or_options)
20
+ obj
21
+ end
24
22
  end
25
23
 
26
24
  class FormeRails < Rails::Application
27
25
  routes.append do
28
- %w'index inputs_block inputs_block_wrapper nest nest_sep nest_inputs nest_seq hash legend combined noblock noblock_post safe_buffer'.each do |action|
26
+ %w'index inputs_block inputs_block_wrapper nest nest_sep nest_inputs nest_seq hash legend combined noblock noblock_post safe_buffer no_forgery_protection'.each do |action|
29
27
  get action, :controller=>'forme', :action=>action
30
28
  end
31
29
  end
@@ -59,6 +57,14 @@ class FormeController < ActionController::Base
59
57
  END
60
58
  end
61
59
 
60
+ def no_forgery_protection
61
+ def self.protect_against_forgery?; false end
62
+ render :inline => <<END
63
+ <%= forme(:method=>'POST') do |f| %>
64
+ <% end %>
65
+ END
66
+ end
67
+
62
68
  def inputs_block
63
69
  render :inline => <<END
64
70
  <%= forme([:foo, :bar], :action=>'/baz') do |f| %>
@@ -272,5 +278,9 @@ describe "Forme Rails integration" do
272
278
  it "#form should handle Rails SafeBuffers" do
273
279
  sin_get('/safe_buffer').must_equal '<form action="/baz"><fieldset class="inputs"><legend><b>foo</b></legend><input id="first" name="first" type="text" value="foo"/></fieldset><input type="submit" value="xyz"/></form>'
274
280
  end
281
+
282
+ it "#form should handle case where forgery protection is disabled" do
283
+ sin_get('/no_forgery_protection').must_equal '<form method="POST"> </form>'
284
+ end
275
285
  end
276
286
  end
@@ -1,8 +1,7 @@
1
- require File.join(File.dirname(File.expand_path(__FILE__)), 'spec_helper.rb')
2
- require File.join(File.dirname(File.expand_path(__FILE__)), 'sequel_helper.rb')
3
- require File.join(File.dirname(File.expand_path(__FILE__)), 'erb_helper.rb')
1
+ require_relative 'spec_helper'
2
+ require_relative 'sequel_helper'
3
+ require_relative 'erb_helper'
4
4
 
5
- require 'rubygems'
6
5
  begin
7
6
  require 'roda'
8
7
  require 'tilt'
@@ -17,34 +16,39 @@ rescue LoadError
17
16
  rescue LoadError
18
17
  require 'tilt/erb'
19
18
  end
20
- end
21
-
22
- class FormeRodaTest < Roda
23
- opts[:check_dynamic_arity] = opts[:check_arity] = :warn
24
-
25
- if defined?(Roda::RodaVersionNumber) && Roda::RodaVersionNumber >= 30100
26
- require 'roda/session_middleware'
27
- opts[:sessions_convert_symbols] = true
28
- use RodaSessionMiddleware, :secret=>SecureRandom.random_bytes(64), :key=>'rack.session'
29
- else
30
- use Rack::Session::Cookie, :secret => "__a_very_long_string__"
31
- end
32
-
33
- def erb(s, opts={})
34
- render(opts.merge(:inline=>s))
19
+ else
20
+ begin
21
+ require 'erubi/capture_end'
22
+ require_relative 'erubi_capture_helper'
23
+ rescue LoadError
35
24
  end
25
+ end
36
26
 
37
- route do |r|
38
- r.get 'use_request_specific_token', :use do |use|
39
- render :inline=>"[#{Base64.strict_encode64(send(:csrf_secret))}]<%= form({:method=>:post}, {:use_request_specific_token=>#{use == '1'}}) %>"
27
+ def FormeRodaTest(block=ERB_BLOCK)
28
+ Class.new(Roda) do
29
+ opts[:check_dynamic_arity] = opts[:check_arity] = :warn
30
+
31
+ if defined?(Roda::RodaVersionNumber) && Roda::RodaVersionNumber >= 30100
32
+ require 'roda/session_middleware'
33
+ opts[:sessions_convert_symbols] = true
34
+ use RodaSessionMiddleware, :secret=>SecureRandom.random_bytes(64), :key=>'rack.session'
35
+ else
36
+ use Rack::Session::Cookie, :secret => "__a_very_long_string__"
40
37
  end
41
- r.get 'hidden_tags' do |use|
42
- render :inline=>"<%= form({:method=>:post}, {:hidden_tags=>[{:foo=>'bar'}]}) %>"
38
+
39
+ def erb(s, opts={})
40
+ render(opts.merge(:inline=>s))
43
41
  end
44
- r.get 'csrf', :use do |use|
45
- render :inline=>"<%= form({:method=>:post}, {:csrf=>#{use == '1'}}) %>"
42
+
43
+ route do |r|
44
+ r.get 'use_request_specific_token', :use do |use|
45
+ render :inline=>"[#{Base64.strict_encode64(send(:csrf_secret))}]<%= form({:method=>:post}, {:use_request_specific_token=>#{use == '1'}}) %>"
46
+ end
47
+ r.get 'csrf', :use do |use|
48
+ render :inline=>"<%= form({:method=>:post}, {:csrf=>#{use == '1'}}) %>"
49
+ end
50
+ instance_exec(r, &block)
46
51
  end
47
- instance_exec(r, &ERB_BLOCK)
48
52
  end
49
53
  end
50
54
 
@@ -54,7 +58,7 @@ rescue LoadError
54
58
  warn "unable to load rack/csrf, skipping roda csrf plugin spec"
55
59
  else
56
60
  describe "Forme Roda ERB integration with roda forme and csrf plugins" do
57
- app = FormeRodaCSRFTest = Class.new(FormeRodaTest)
61
+ app = FormeRodaCSRFTest = FormeRodaTest()
58
62
  app.plugin :csrf
59
63
  app.plugin :forme
60
64
 
@@ -68,64 +72,85 @@ describe "Forme Roda ERB integration with roda forme and csrf plugins" do
68
72
  end
69
73
  end
70
74
 
75
+ module FormeRouteCsrfSpecs
76
+ extend Minitest::Spec::DSL
77
+ include FormeErbSpecs
78
+
79
+ it "should have a valid CSRF tag" do
80
+ output = sin_get('/use_request_specific_token/1')
81
+ output =~ /\[([^\]]+)\].*?value=\"([^\"]+)\"/
82
+ secret = $1
83
+ token = $2
84
+ app.new({'SCRIPT_NAME'=>'', 'PATH_INFO'=>'/use_request_specific_token/1', 'REQUEST_METHOD'=>'POST', 'rack.session'=>{'_roda_csrf_secret'=>secret}, 'rack.input'=>StringIO.new}).valid_csrf?(:token=>token).must_equal true
85
+ app.new({'SCRIPT_NAME'=>'', 'PATH_INFO'=>'/use_request_specific_token/2', 'REQUEST_METHOD'=>'POST', 'rack.session'=>{'_roda_csrf_secret'=>secret}, 'rack.input'=>StringIO.new}).valid_csrf?(:token=>token).must_equal false
86
+ end
87
+
88
+ it "should handle the :use_request_specific_token => true option" do
89
+ output = sin_get('/use_request_specific_token/1')
90
+ output =~ /\[([^\]]+)\].*?value=\"([^\"]+)\"/
91
+ secret = $1
92
+ token = $2
93
+ app.new({'SCRIPT_NAME'=>'', 'PATH_INFO'=>'/use_request_specific_token/1', 'REQUEST_METHOD'=>'POST', 'rack.session'=>{'_roda_csrf_secret'=>secret}, 'rack.input'=>StringIO.new}).valid_csrf?(:token=>token).must_equal true
94
+ app.new({'SCRIPT_NAME'=>'', 'PATH_INFO'=>'/use_request_specific_token/2', 'REQUEST_METHOD'=>'POST', 'rack.session'=>{'_roda_csrf_secret'=>secret}, 'rack.input'=>StringIO.new}).valid_csrf?(:token=>token).must_equal false
95
+ end
96
+
97
+ it "should handle the :use_request_specific_token => false option" do
98
+ output = sin_get('/use_request_specific_token/0')
99
+ output =~ /\[([^\]]+)\].*?value=\"([^\"]+)\"/
100
+ secret = $1
101
+ token = $2
102
+ app.new({'SCRIPT_NAME'=>'', 'PATH_INFO'=>'/use_request_specific_token/0', 'REQUEST_METHOD'=>'POST', 'rack.session'=>{'_roda_csrf_secret'=>secret}, 'rack.input'=>StringIO.new}).valid_csrf?(:token=>token).must_equal(plugin_opts.empty? ? false : true)
103
+ end
104
+
105
+ it "should handle the :csrf option" do
106
+ sin_get('/csrf/1').must_include '<input name="_csrf" type="hidden" value="'
107
+ sin_get('/csrf/0').wont_include '<input name="_csrf" type="hidden" value="'
108
+ end
109
+ end
110
+
71
111
  begin
72
112
  require 'roda/plugins/route_csrf'
113
+ require 'roda/plugins/capture_erb'
114
+ require 'roda/plugins/inject_erb'
73
115
  rescue LoadError
74
- warn "unable to load roda/plugins/route_csrf, skipping forme_route_csrf plugin spec"
116
+ warn "unable to load necessary Roda plugins, skipping forme_erubi_capture plugin spec"
75
117
  else
118
+ describe "Forme Roda Erubi::CaptureEnd integration with roda forme_route_csrf" do
119
+ app = FormeRodaTest(ERUBI_CAPTURE_BLOCK)
120
+ app.plugin :forme_erubi_capture
121
+ app.plugin :render, :engine_opts=>{'erb'=>{:engine_class=>Erubi::CaptureEndEngine}}
122
+
123
+ define_method(:app){app}
124
+ define_method(:plugin_opts){{}}
125
+ define_method(:sin_get) do |path|
126
+ s = String.new
127
+ app.call(@rack.merge('PATH_INFO'=>path))[2].each{|str| s << str}
128
+ s.gsub(/\s+/, ' ').strip
129
+ end
130
+
131
+ include FormeRouteCsrfSpecs
132
+ end if defined?(ERUBI_CAPTURE_BLOCK)
133
+
76
134
  [{}, {:require_request_specific_tokens=>false}].each do |plugin_opts|
77
135
  describe "Forme Roda ERB integration with roda forme_route_csrf and route_csrf plugin with #{plugin_opts}" do
78
- app = Class.new(FormeRodaTest)
136
+ app = FormeRodaTest()
79
137
  app.plugin :forme_route_csrf
80
138
  app.plugin :route_csrf, plugin_opts
81
139
 
140
+ define_method(:app){app}
141
+ define_method(:plugin_opts){plugin_opts}
82
142
  define_method(:sin_get) do |path|
83
143
  s = String.new
84
144
  app.call(@rack.merge('PATH_INFO'=>path))[2].each{|str| s << str}
85
145
  s.gsub(/\s+/, ' ').strip
86
146
  end
87
147
 
88
- include FormeErbSpecs
89
-
90
- it "should handle the :hidden_tags option" do
91
- output = sin_get('/use_request_specific_token/1')
92
- output =~ /\[([^\]]+)\].*?value=\"([^\"]+)\"/
93
- secret = $1
94
- token = $2
95
- app.new({'SCRIPT_NAME'=>'', 'PATH_INFO'=>'/use_request_specific_token/1', 'REQUEST_METHOD'=>'POST', 'rack.session'=>{'_roda_csrf_secret'=>secret}, 'rack.input'=>StringIO.new}).valid_csrf?(:token=>token).must_equal true
96
- app.new({'SCRIPT_NAME'=>'', 'PATH_INFO'=>'/use_request_specific_token/2', 'REQUEST_METHOD'=>'POST', 'rack.session'=>{'_roda_csrf_secret'=>secret}, 'rack.input'=>StringIO.new}).valid_csrf?(:token=>token).must_equal false
97
- end
98
-
99
- it "should handle the :use_request_specific_token => true option" do
100
- output = sin_get('/use_request_specific_token/1')
101
- output =~ /\[([^\]]+)\].*?value=\"([^\"]+)\"/
102
- secret = $1
103
- token = $2
104
- app.new({'SCRIPT_NAME'=>'', 'PATH_INFO'=>'/use_request_specific_token/1', 'REQUEST_METHOD'=>'POST', 'rack.session'=>{'_roda_csrf_secret'=>secret}, 'rack.input'=>StringIO.new}).valid_csrf?(:token=>token).must_equal true
105
- app.new({'SCRIPT_NAME'=>'', 'PATH_INFO'=>'/use_request_specific_token/2', 'REQUEST_METHOD'=>'POST', 'rack.session'=>{'_roda_csrf_secret'=>secret}, 'rack.input'=>StringIO.new}).valid_csrf?(:token=>token).must_equal false
106
- end
107
-
108
- it "should handle the :use_request_specific_token => false option" do
109
- output = sin_get('/use_request_specific_token/0')
110
- output =~ /\[([^\]]+)\].*?value=\"([^\"]+)\"/
111
- secret = $1
112
- token = $2
113
- app.new({'SCRIPT_NAME'=>'', 'PATH_INFO'=>'/use_request_specific_token/0', 'REQUEST_METHOD'=>'POST', 'rack.session'=>{'_roda_csrf_secret'=>secret}, 'rack.input'=>StringIO.new}).valid_csrf?(:token=>token).must_equal(plugin_opts.empty? ? false : true)
114
- end
115
-
116
- it "should handle the :hidden_tags option" do
117
- sin_get('/hidden_tags').must_include 'name="foo" type="hidden" value="bar"'
118
- end
119
-
120
- it "should handle the :csrf option" do
121
- sin_get('/csrf/1').must_include '<input name="_csrf" type="hidden" value="'
122
- sin_get('/csrf/0').wont_include '<input name="_csrf" type="hidden" value="'
123
- end
148
+ include FormeRouteCsrfSpecs
124
149
  end
125
150
 
126
151
  describe "Forme Roda ERB Sequel integration with roda forme_set plugin and route_csrf plugin with #{plugin_opts}" do
127
152
  before do
128
- @app = Class.new(FormeRodaTest)
153
+ @app = FormeRodaTest()
129
154
  @app.plugin :route_csrf, plugin_opts
130
155
  @app.plugin(:forme_set, :secret=>'1'*64)
131
156
 
@@ -147,13 +172,18 @@ else
147
172
  def _forme_set(meth, obj, orig_hash, *form_args, &block)
148
173
  hash = {}
149
174
  forme_set_block = orig_hash.delete(:forme_set_block)
175
+ handle_params = hash.delete(:handle_params)
150
176
  orig_hash.each{|k,v| hash[k.to_s] = v}
151
- album = @ab
177
+ album = obj
152
178
  ret, _, data, hmac = nil
153
179
 
154
180
  @app.route do |r|
155
181
  r.get do
156
- form(*env[:args], &env[:block]).to_s
182
+ if @block = env[:block]
183
+ render(:inline=>'<% form(*env[:args]) do |f| %><%= @block.call(f) %><% end %>')
184
+ else
185
+ form(*env[:args])
186
+ end
157
187
  end
158
188
  r.post do
159
189
  r.params.replace(env[:params])
@@ -167,12 +197,32 @@ else
167
197
  data = $2
168
198
  hmac = $3
169
199
  data.gsub!("&quot;", '"') if data
170
- h = {"album"=>hash, "_forme_set_data"=>data, "_forme_set_data_hmac"=>hmac, "_csrf"=>csrf}
200
+ h = {"album"=>hash, "_forme_set_data"=>data, "_forme_set_data_hmac"=>hmac, "_csrf"=>csrf, "body"=>body}
171
201
  if data && hmac
202
+ h = handle_params.call(h) if handle_params
172
203
  forme_call(h)
173
204
  end
174
205
  meth == :forme_parse ? ret : h
175
206
  end
207
+
208
+ it "should have subform work correctly" do
209
+ @app.route do |r|
210
+ @album = Album.load(:name=>'N', :copies_sold=>2, :id=>1)
211
+ @album.associations[:artist] = Artist.load(:name=>'A', :id=>2)
212
+ erb <<END
213
+ 0
214
+ <% form(@album, {:action=>'/baz'}, :button=>'Sub') do |f| %>
215
+ 1
216
+ <%= f.subform(:artist, :inputs=>[:name], :legend=>'Foo', :grid=>true, :labels=>%w'Name') %>
217
+ 2
218
+ <% end %>
219
+ 3
220
+ END
221
+ end
222
+
223
+ body = @app.call('REQUEST_METHOD'=>'GET')[2].join.gsub("\n", ' ').gsub(/ +/, ' ').chomp(' ')
224
+ body.sub(%r{<input name="_csrf" type="hidden" value="([^"]+)"/>}, '<input name="_csrf" type="hidden" value="csrf"/>').must_equal '0 <form action="/baz" class="forme album" method="post"><input name="_csrf" type="hidden" value="csrf"/> 1 <input id="album_artist_attributes_id" name="album[artist_attributes][id]" type="hidden" value="2"/><table><caption>Foo</caption><thead><tr><th>Name</th></tr></thead><tbody><tr><td class="string"><input id="album_artist_attributes_name" maxlength="255" name="album[artist_attributes][name]" type="text" value="A"/></td></tr></tbody></table> 2 <input type="submit" value="Sub"/></form>3'
225
+ end
176
226
 
177
227
  it "#forme_set should include HMAC values if form includes inputs for obj" do
178
228
  h = forme_set(@ab, :name=>'Foo')
@@ -196,6 +246,18 @@ else
196
246
  @ab.copies_sold.must_be_nil
197
247
  end
198
248
 
249
+ it "#forme_set handle missing csrf" do
250
+ h = forme_set(@ab, :name=>'Foo'){|f| f.input(:name)}
251
+ @ab.name = nil
252
+ data = JSON.parse(h["_forme_set_data"])
253
+ data.delete('csrf')
254
+ data = data.to_json
255
+ hmac = OpenSSL::HMAC.hexdigest(OpenSSL::Digest::SHA512.new, '1'*64, data)
256
+ forme_call(h.merge("_forme_set_data_hmac"=>hmac, "_forme_set_data"=>data))
257
+ @ab.name.must_equal 'Foo'
258
+ @ab.copies_sold.must_be_nil
259
+ end
260
+
199
261
  it "#forme_set should handle custom form namespaces" do
200
262
  forme_set(@ab, {"album"=>{"name"=>'Foo', 'copies_sold'=>'100'}}, {}, :namespace=>'album'){|f| f.input(:name); f.input(:copies_sold)}
201
263
  @ab.name.must_equal 'Foo'
@@ -469,6 +531,10 @@ else
469
531
  @ab.forme_validations.merge!(hash[:validations])
470
532
  @ab.valid?.must_equal true
471
533
  end
534
+
535
+ it "should handle forms with objects that don't support forme_inputs" do
536
+ forme_set(String, {:name=>'Foo'}, {}, :inputs=>[:name])['body'].must_equal '<form><fieldset class="inputs"><input id="name" name="name" type="text" value="String"/></fieldset></form>'
537
+ end
472
538
  end
473
539
  end
474
540
  end
@@ -1,7 +1,6 @@
1
- require 'rubygems'
2
1
  require 'sequel'
3
2
 
4
- db_url = defined?(RUBY_ENGINE) && RUBY_ENGINE == 'jruby' ? 'jdbc:sqlite::memory:' : 'sqlite:/'
3
+ db_url = RUBY_ENGINE == 'jruby' ? 'jdbc:sqlite::memory:' : 'sqlite:/'
5
4
  DB = Sequel.connect(db_url, :identifier_mangling=>false)
6
5
  DB.extension(:freeze_datasets)
7
6
  Sequel.default_timezone = :utc
@@ -18,6 +17,8 @@ DB.create_table(:albums) do
18
17
  Date :release_date
19
18
  DateTime :created_at
20
19
  Integer :copies_sold
20
+ Float :fl
21
+ BigDecimal :bd
21
22
  end
22
23
  DB.create_table(:album_infos) do
23
24
  primary_key :id
@@ -1,4 +1,4 @@
1
- require File.join(File.dirname(File.expand_path(__FILE__)), 'sequel_helper.rb')
1
+ require_relative 'sequel_helper'
2
2
 
3
3
  gem 'i18n', '>= 0.7.0'
4
4
  require 'i18n'
@@ -1,8 +1,8 @@
1
- require File.join(File.dirname(File.expand_path(__FILE__)), 'spec_helper.rb')
1
+ require_relative 'spec_helper'
2
2
 
3
3
  begin
4
4
  raise LoadError if defined?(JRUBY_VERSION) && /\A9\.2\./.match(JRUBY_VERSION)
5
- require File.join(File.dirname(File.expand_path(__FILE__)), 'sequel_i18n_helper.rb')
5
+ require_relative 'sequel_i18n_helper'
6
6
  rescue LoadError
7
7
  warn "unable to load i18n, skipping i18n Sequel plugin spec"
8
8
  else
@@ -13,19 +13,19 @@ describe "Forme Sequel::Model forms" do
13
13
  end
14
14
 
15
15
  it "should not change the usual label input if translation is not present" do
16
- @b.input(:name).to_s.must_equal '<label>Name: <input id="invoice_name" maxlength="255" name="invoice[name]" type="text" value="b"/></label>'
16
+ @b.input(:name).must_equal '<label>Name: <input id="invoice_name" maxlength="255" name="invoice[name]" type="text" value="b"/></label>'
17
17
  end
18
18
 
19
19
  it "should use the translation for the label if present" do
20
- @b.input(:summary).to_s.must_equal '<label>Brief Description: <input id="invoice_summary" maxlength="255" name="invoice[summary]" type="text" value="a brief summary"/></label>'
20
+ @b.input(:summary).must_equal '<label>Brief Description: <input id="invoice_summary" maxlength="255" name="invoice[summary]" type="text" value="a brief summary"/></label>'
21
21
  end
22
22
 
23
23
  it "should not change the usual legend for the subform if the translation is not present" do
24
- Forme.form(Firm[1]){|f| f.subform(:invoices){ f.input(:name) }}.to_s.must_equal '<form class="forme firm" method="post"><input id="firm_invoices_attributes_0_id" name="firm[invoices_attributes][0][id]" type="hidden" value="1"/><fieldset class="inputs"><legend>Invoice #1</legend><label>Name: <input id="firm_invoices_attributes_0_name" maxlength="255" name="firm[invoices_attributes][0][name]" type="text" value="b"/></label></fieldset></form>'
24
+ Forme.form(Firm[1]){|f| f.subform(:invoices){ f.input(:name) }}.must_equal '<form class="forme firm" method="post"><input id="firm_invoices_attributes_0_id" name="firm[invoices_attributes][0][id]" type="hidden" value="1"/><fieldset class="inputs"><legend>Invoice #1</legend><label>Name: <input id="firm_invoices_attributes_0_name" maxlength="255" name="firm[invoices_attributes][0][name]" type="text" value="b"/></label></fieldset></form>'
25
25
  end
26
26
 
27
27
  it "should use the translation for the legend on the subform if present" do
28
- Forme.form(Firm[1]){|f| f.subform(:clients){ f.input(:name) }}.to_s.must_equal '<form class="forme firm" method="post"><input id="firm_clients_attributes_0_id" name="firm[clients_attributes][0][id]" type="hidden" value="1"/><fieldset class="inputs"><legend>Clientes</legend><label>Name: <input id="firm_clients_attributes_0_name" maxlength="255" name="firm[clients_attributes][0][name]" type="text" value="a great client"/></label></fieldset></form>'
28
+ Forme.form(Firm[1]){|f| f.subform(:clients){ f.input(:name) }}.must_equal '<form class="forme firm" method="post"><input id="firm_clients_attributes_0_id" name="firm[clients_attributes][0][id]" type="hidden" value="1"/><fieldset class="inputs"><legend>Clientes</legend><label>Name: <input id="firm_clients_attributes_0_name" maxlength="255" name="firm[clients_attributes][0][name]" type="text" value="a great client"/></label></fieldset></form>'
29
29
  end
30
30
  end
31
31
  end