form_helper_test.rb 23.9 KB
Newer Older
1
require "#{File.dirname(__FILE__)}/../abstract_unit"
D
Initial  
David Heinemeier Hansson 已提交
2

3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
silence_warnings do
  Post = Struct.new(:title, :author_name, :body, :secret, :written_on, :cost)
  Post.class_eval do
    alias_method :title_before_type_cast, :title unless respond_to?(:title_before_type_cast)
    alias_method :body_before_type_cast, :body unless respond_to?(:body_before_type_cast)
    alias_method :author_name_before_type_cast, :author_name unless respond_to?(:author_name_before_type_cast)

    def new_record=(boolean)
      @new_record = boolean
    end
    
    def new_record?
      @new_record
    end
  end
end

D
Initial  
David Heinemeier Hansson 已提交
20 21
class FormHelperTest < Test::Unit::TestCase
  include ActionView::Helpers::FormHelper
22 23 24 25
  include ActionView::Helpers::FormTagHelper
  include ActionView::Helpers::UrlHelper
  include ActionView::Helpers::TagHelper
  include ActionView::Helpers::TextHelper
26
  include ActionView::Helpers::ActiveRecordHelper
27
  include ActionView::Helpers::RecordIdentificationHelper
D
Initial  
David Heinemeier Hansson 已提交
28 29

  def setup
30
    @post = Post.new
31 32 33 34 35 36 37 38
    def @post.errors() 
      Class.new{ 
        def on(field); "can't be empty" if field == "author_name"; end 
        def empty?() false end 
        def count() 1 end
        def full_messages() [ "Author name can't be empty" ] end  
      }.new 
    end
39
    def @post.id; 123; end
40
    def @post.id_before_type_cast; 123; end
41

D
Initial  
David Heinemeier Hansson 已提交
42 43 44 45 46
    @post.title       = "Hello World"
    @post.author_name = ""
    @post.body        = "Back to the hill and over it again!"
    @post.secret      = 1
    @post.written_on  = Date.new(2004, 6, 15)
47 48

    @controller = Class.new do
49
      attr_reader :url_for_options
50
      def url_for(options)
51
        @url_for_options = options
52 53 54 55
        "http://www.example.com"
      end
    end
    @controller = @controller.new
D
Initial  
David Heinemeier Hansson 已提交
56 57 58
  end

  def test_text_field
59
    assert_dom_equal(
D
Initial  
David Heinemeier Hansson 已提交
60 61
      '<input id="post_title" name="post[title]" size="30" type="text" value="Hello World" />', text_field("post", "title")
    )
62
    assert_dom_equal(
D
Initial  
David Heinemeier Hansson 已提交
63 64
      '<input id="post_title" name="post[title]" size="30" type="password" value="Hello World" />', password_field("post", "title")
    )
65
    assert_dom_equal(
66
      '<input id="person_name" name="person[name]" size="30" type="password" />', password_field("person", "name")
D
Initial  
David Heinemeier Hansson 已提交
67 68 69 70 71
    )
  end

  def test_text_field_with_escapes
    @post.title = "<b>Hello World</b>"
72
    assert_dom_equal(
D
Initial  
David Heinemeier Hansson 已提交
73 74 75 76 77
      '<input id="post_title" name="post[title]" size="30" type="text" value="&lt;b&gt;Hello World&lt;/b&gt;" />', text_field("post", "title")
    )
  end

  def test_text_field_with_options
78
    expected = '<input id="post_title" name="post[title]" size="35" type="text" value="Hello World" />'
79 80
    assert_dom_equal expected, text_field("post", "title", "size" => 35)
    assert_dom_equal expected, text_field("post", "title", :size => 35)
D
Initial  
David Heinemeier Hansson 已提交
81
  end
82

D
Initial  
David Heinemeier Hansson 已提交
83
  def test_text_field_assuming_size
84
    expected = '<input id="post_title" maxlength="35" name="post[title]" size="35" type="text" value="Hello World" />'
85 86
    assert_dom_equal expected, text_field("post", "title", "maxlength" => 35)
    assert_dom_equal expected, text_field("post", "title", :maxlength => 35)
D
Initial  
David Heinemeier Hansson 已提交
87
  end
88

89 90 91 92 93 94
  def test_text_field_removing_size
    expected = '<input id="post_title" maxlength="35" name="post[title]" type="text" value="Hello World" />'
    assert_dom_equal expected, text_field("post", "title", "maxlength" => 35, "size" => nil)
    assert_dom_equal expected, text_field("post", "title", :maxlength => 35, :size => nil)
  end

95 96 97 98 99 100 101
  def test_text_field_doesnt_change_param_values
    object_name = 'post[]'
    expected = '<input id="post_123_title" name="post[123][title]" size="30" type="text" value="Hello World" />'
    assert_equal expected, text_field(object_name, "title")
    assert_equal object_name, "post[]"
  end

D
Initial  
David Heinemeier Hansson 已提交
102
  def test_check_box
103
    assert_dom_equal(
D
Initial  
David Heinemeier Hansson 已提交
104 105 106 107
      '<input checked="checked" id="post_secret" name="post[secret]" type="checkbox" value="1" /><input name="post[secret]" type="hidden" value="0" />',
      check_box("post", "secret")
    )
    @post.secret = 0
108
    assert_dom_equal(
D
Initial  
David Heinemeier Hansson 已提交
109
      '<input id="post_secret" name="post[secret]" type="checkbox" value="1" /><input name="post[secret]" type="hidden" value="0" />',
110
      check_box("post", "secret")
D
Initial  
David Heinemeier Hansson 已提交
111
    )
112
    assert_dom_equal(
113
      '<input checked="checked" id="post_secret" name="post[secret]" type="checkbox" value="1" /><input name="post[secret]" type="hidden" value="0" />',
114 115
      check_box("post", "secret" ,{"checked"=>"checked"})
    )
D
Initial  
David Heinemeier Hansson 已提交
116
    @post.secret = true
117
    assert_dom_equal(
D
Initial  
David Heinemeier Hansson 已提交
118 119 120 121
      '<input checked="checked" id="post_secret" name="post[secret]" type="checkbox" value="1" /><input name="post[secret]" type="hidden" value="0" />',
      check_box("post", "secret")
    )
  end
122

123 124
  def test_check_box_with_explicit_checked_and_unchecked_values
    @post.secret = "on"
125
    assert_dom_equal(
126 127 128 129
      '<input checked="checked" id="post_secret" name="post[secret]" type="checkbox" value="on" /><input name="post[secret]" type="hidden" value="off" />',
      check_box("post", "secret", {}, "on", "off")
    )
  end
130 131

  def test_radio_button
132
    assert_dom_equal('<input checked="checked" id="post_title_hello_world" name="post[title]" type="radio" value="Hello World" />',
133
      radio_button("post", "title", "Hello World")
134
    )
135
    assert_dom_equal('<input id="post_title_goodbye_world" name="post[title]" type="radio" value="Goodbye World" />',
136
      radio_button("post", "title", "Goodbye World")
137 138
    )
  end
139

140 141 142 143 144
  def test_radio_button_is_checked_with_integers
    assert_dom_equal('<input checked="checked" id="post_secret_1" name="post[secret]" type="radio" value="1" />',
      radio_button("post", "secret", "1")
   )
  end
145 146 147 148 149 150
  
  def test_radio_button_respects_passed_in_id
     assert_dom_equal('<input checked="checked" id="foo" name="post[secret]" type="radio" value="1" />',
       radio_button("post", "secret", "1", :id=>"foo")
    )
  end
151

D
Initial  
David Heinemeier Hansson 已提交
152
  def test_text_area
153
    assert_dom_equal(
154
      '<textarea cols="40" id="post_body" name="post[body]" rows="20">Back to the hill and over it again!</textarea>',
D
Initial  
David Heinemeier Hansson 已提交
155 156 157
      text_area("post", "body")
    )
  end
158

D
Initial  
David Heinemeier Hansson 已提交
159 160
  def test_text_area_with_escapes
    @post.body        = "Back to <i>the</i> hill and over it again!"
161
    assert_dom_equal(
162
      '<textarea cols="40" id="post_body" name="post[body]" rows="20">Back to &lt;i&gt;the&lt;/i&gt; hill and over it again!</textarea>',
D
Initial  
David Heinemeier Hansson 已提交
163 164 165
      text_area("post", "body")
    )
  end
166 167 168 169 170 171 172 173
  
  def test_text_area_with_alternate_value
    assert_dom_equal(
      '<textarea cols="40" id="post_body" name="post[body]" rows="20">Testing alternate values.</textarea>',
      text_area("post", "body", :value => 'Testing alternate values.')
    )
  end
  
174 175 176 177 178 179 180
  def test_text_area_with_size_option
    assert_dom_equal(
      '<textarea cols="183" id="post_body" name="post[body]" rows="820">Back to the hill and over it again!</textarea>',
      text_area("post", "body", :size => "183x820")
    )
  end
  
D
Initial  
David Heinemeier Hansson 已提交
181
  def test_explicit_name
182
    assert_dom_equal(
D
Initial  
David Heinemeier Hansson 已提交
183
      '<input id="post_title" name="dont guess" size="30" type="text" value="Hello World" />', text_field("post", "title", "name" => "dont guess")
184
    )
185
    assert_dom_equal(
186
      '<textarea cols="40" id="post_body" name="really!" rows="20">Back to the hill and over it again!</textarea>',
D
Initial  
David Heinemeier Hansson 已提交
187 188
      text_area("post", "body", "name" => "really!")
    )
189
    assert_dom_equal(
D
Initial  
David Heinemeier Hansson 已提交
190 191 192
      '<input checked="checked" id="post_secret" name="i mean it" type="checkbox" value="1" /><input name="i mean it" type="hidden" value="0" />',
      check_box("post", "secret", "name" => "i mean it")
    )
193
    assert_dom_equal text_field("post", "title", "name" => "dont guess"),
194
                 text_field("post", "title", :name => "dont guess")
195
    assert_dom_equal text_area("post", "body", "name" => "really!"),
196
                 text_area("post", "body", :name => "really!")
197
    assert_dom_equal check_box("post", "secret", "name" => "i mean it"),
198
                 check_box("post", "secret", :name => "i mean it")
D
Initial  
David Heinemeier Hansson 已提交
199
  end
200

D
Initial  
David Heinemeier Hansson 已提交
201
  def test_explicit_id
202
    assert_dom_equal(
D
Initial  
David Heinemeier Hansson 已提交
203
      '<input id="dont guess" name="post[title]" size="30" type="text" value="Hello World" />', text_field("post", "title", "id" => "dont guess")
204
    )
205
    assert_dom_equal(
206
      '<textarea cols="40" id="really!" name="post[body]" rows="20">Back to the hill and over it again!</textarea>',
D
Initial  
David Heinemeier Hansson 已提交
207 208
      text_area("post", "body", "id" => "really!")
    )
209
    assert_dom_equal(
D
Initial  
David Heinemeier Hansson 已提交
210 211 212
      '<input checked="checked" id="i mean it" name="post[secret]" type="checkbox" value="1" /><input name="post[secret]" type="hidden" value="0" />',
      check_box("post", "secret", "id" => "i mean it")
    )
213
    assert_dom_equal text_field("post", "title", "id" => "dont guess"),
214
                 text_field("post", "title", :id => "dont guess")
215
    assert_dom_equal text_area("post", "body", "id" => "really!"),
216
                 text_area("post", "body", :id => "really!")
217
    assert_dom_equal check_box("post", "secret", "id" => "i mean it"),
218
                 check_box("post", "secret", :id => "i mean it")
D
Initial  
David Heinemeier Hansson 已提交
219
  end
220 221 222

  def test_auto_index
    pid = @post.id
223
    assert_dom_equal(
224 225
      "<input id=\"post_#{pid}_title\" name=\"post[#{pid}][title]\" size=\"30\" type=\"text\" value=\"Hello World\" />", text_field("post[]","title")
    )
226
    assert_dom_equal(
227
      "<textarea cols=\"40\" id=\"post_#{pid}_body\" name=\"post[#{pid}][body]\" rows=\"20\">Back to the hill and over it again!</textarea>",
228 229
      text_area("post[]", "body")
    )
230
    assert_dom_equal(
231 232 233
      "<input checked=\"checked\" id=\"post_#{pid}_secret\" name=\"post[#{pid}][secret]\" type=\"checkbox\" value=\"1\" /><input name=\"post[#{pid}][secret]\" type=\"hidden\" value=\"0\" />",
      check_box("post[]", "secret")
    )
234
   assert_dom_equal(
235
"<input checked=\"checked\" id=\"post_#{pid}_title_hello_world\" name=\"post[#{pid}][title]\" type=\"radio\" value=\"Hello World\" />",
236 237
      radio_button("post[]", "title", "Hello World")
    )
238
    assert_dom_equal("<input id=\"post_#{pid}_title_goodbye_world\" name=\"post[#{pid}][title]\" type=\"radio\" value=\"Goodbye World\" />",
239 240 241
      radio_button("post[]", "title", "Goodbye World")
    )
  end
242 243 244 245

  def test_form_for
    _erbout = ''

246
    form_for(:post, @post, :html => { :id => 'create-post' }) do |f|
247 248 249
      _erbout.concat f.text_field(:title)
      _erbout.concat f.text_area(:body)
      _erbout.concat f.check_box(:secret)
250
      _erbout.concat f.submit('Create post')
251 252 253
    end

    expected = 
254
      "<form action='http://www.example.com' id='create-post' method='post'>" +
255 256
      "<input name='post[title]' size='30' type='text' id='post_title' value='Hello World' />" +
      "<textarea name='post[body]' id='post_body' rows='20' cols='40'>Back to the hill and over it again!</textarea>" +
257 258
      "<input name='post[secret]' checked='checked' type='checkbox' id='post_secret' value='1' />" +
      "<input name='post[secret]' type='hidden' value='0' />" +
259
      "<input name='commit' id='post_submit' type='submit' value='Create post' />" +
260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275
      "</form>"

    assert_dom_equal expected, _erbout
  end

  def test_form_for_with_method
    _erbout = ''

    form_for(:post, @post, :html => { :id => 'create-post', :method => :put }) do |f|
      _erbout.concat f.text_field(:title)
      _erbout.concat f.text_area(:body)
      _erbout.concat f.check_box(:secret)
    end

    expected = 
      "<form action='http://www.example.com' id='create-post' method='post'>" +
276
      "<div style='margin:0;padding:0'><input name='_method' type='hidden' value='put' /></div>" +
277 278
      "<input name='post[title]' size='30' type='text' id='post_title' value='Hello World' />" +
      "<textarea name='post[body]' id='post_body' rows='20' cols='40'>Back to the hill and over it again!</textarea>" +
279 280 281 282 283 284 285
      "<input name='post[secret]' checked='checked' type='checkbox' id='post_secret' value='1' />" +
      "<input name='post[secret]' type='hidden' value='0' />" +
      "</form>"

    assert_dom_equal expected, _erbout
  end

286 287 288
  def test_form_for_without_object
    _erbout = ''

289
    form_for(:post, :html => { :id => 'create-post' }) do |f|
290 291 292 293 294 295
      _erbout.concat f.text_field(:title)
      _erbout.concat f.text_area(:body)
      _erbout.concat f.check_box(:secret)
    end

    expected = 
296
      "<form action='http://www.example.com' id='create-post' method='post'>" +
297 298 299 300 301 302 303 304
      "<input name='post[title]' size='30' type='text' id='post_title' value='Hello World' />" +
      "<textarea name='post[body]' id='post_body' rows='20' cols='40'>Back to the hill and over it again!</textarea>" +
      "<input name='post[secret]' checked='checked' type='checkbox' id='post_secret' value='1' />" +
      "<input name='post[secret]' type='hidden' value='0' />" +
      "</form>"

    assert_dom_equal expected, _erbout
  end
305 306 307 308 309 310 311 312 313 314 315 316
  
  def test_form_for_with_index
    _erbout = ''
    
    form_for("post[]", @post) do |f|
      _erbout.concat f.text_field(:title)
      _erbout.concat f.text_area(:body)
      _erbout.concat f.check_box(:secret)
    end
    
    expected = 
      "<form action='http://www.example.com' method='post'>" +
317 318 319
      "<input name='post[123][title]' size='30' type='text' id='post_123_title' value='Hello World' />" +
      "<textarea name='post[123][body]' id='post_123_body' rows='20' cols='40'>Back to the hill and over it again!</textarea>" +
      "<input name='post[123][secret]' checked='checked' type='checkbox' id='post_123_secret' value='1' />" +
320 321
      "<input name='post[123][secret]' type='hidden' value='0' />" +
      "</form>"
322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338

    assert_dom_equal expected, _erbout
  end

  def test_nested_fields_for
    _erbout = ''
    form_for(:post, @post) do |f|
      f.fields_for(:comment, @post) do |c|
        _erbout.concat c.text_field(:title)
      end
    end

    expected = "<form action='http://www.example.com' method='post'>" +
               "<input name='post[comment][title]' size='30' type='text' id='post_comment_title' value='Hello World' />" +
               "</form>"

    assert_dom_equal expected, _erbout
339
  end
340

341 342 343
  def test_fields_for
    _erbout = ''

344
    fields_for(:post, @post) do |f|
345 346 347 348 349 350 351 352 353 354 355 356 357
      _erbout.concat f.text_field(:title)
      _erbout.concat f.text_area(:body)
      _erbout.concat f.check_box(:secret)
    end

    expected = 
      "<input name='post[title]' size='30' type='text' id='post_title' value='Hello World' />" +
      "<textarea name='post[body]' id='post_body' rows='20' cols='40'>Back to the hill and over it again!</textarea>" +
      "<input name='post[secret]' checked='checked' type='checkbox' id='post_secret' value='1' />" +
      "<input name='post[secret]' type='hidden' value='0' />"

    assert_dom_equal expected, _erbout
  end
358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375

  def test_fields_for_without_object
    _erbout = ''
    fields_for(:post) do |f|
      _erbout.concat f.text_field(:title)
      _erbout.concat f.text_area(:body)
      _erbout.concat f.check_box(:secret)
    end

    expected = 
      "<input name='post[title]' size='30' type='text' id='post_title' value='Hello World' />" +
      "<textarea name='post[body]' id='post_body' rows='20' cols='40'>Back to the hill and over it again!</textarea>" +
      "<input name='post[secret]' checked='checked' type='checkbox' id='post_secret' value='1' />" +
      "<input name='post[secret]' type='hidden' value='0' />"

    assert_dom_equal expected, _erbout
  end

376 377 378 379 380 381 382 383 384 385
  def test_fields_for_object_with_bracketed_name
    _erbout = ''
    fields_for("author[post]", @post) do |f|
      _erbout.concat f.text_field(:title)
    end

    assert_dom_equal "<input name='author[post][title]' size='30' type='text' id='author_post_title' value='Hello World' />",
      _erbout
  end

386 387 388 389
  def test_form_builder_does_not_have_form_for_method
    assert ! ActionView::Helpers::FormBuilder.instance_methods.include?('form_for')
  end
  
390 391 392
  def test_form_for_and_fields_for
    _erbout = ''

393
    form_for(:post, @post, :html => { :id => 'create-post' }) do |post_form|
394 395 396
      _erbout.concat post_form.text_field(:title)
      _erbout.concat post_form.text_area(:body)

397
      fields_for(:parent_post, @post) do |parent_fields|
398 399 400 401 402
        _erbout.concat parent_fields.check_box(:secret)
      end
    end

    expected = 
403
      "<form action='http://www.example.com' id='create-post' method='post'>" +
404 405 406 407 408 409 410 411
      "<input name='post[title]' size='30' type='text' id='post_title' value='Hello World' />" +
      "<textarea name='post[body]' id='post_body' rows='20' cols='40'>Back to the hill and over it again!</textarea>" +
      "<input name='parent_post[secret]' checked='checked' type='checkbox' id='parent_post_secret' value='1' />" +
      "<input name='parent_post[secret]' type='hidden' value='0' />" +
      "</form>"

    assert_dom_equal expected, _erbout
  end
412
  
413
  class LabelledFormBuilder < ActionView::Helpers::FormBuilder
414 415 416 417 418 419 420 421 422 423 424 425 426
    (field_helpers - %w(hidden_field)).each do |selector|
      src = <<-END_SRC
        def #{selector}(field, *args, &proc)
          "<label for='\#{field}'>\#{field.to_s.humanize}:</label> " + super + "<br/>"
        end
      END_SRC
      class_eval src, __FILE__, __LINE__
    end
  end
  
  def test_form_for_with_labelled_builder
    _erbout = ''

427
    form_for(:post, @post, :builder => LabelledFormBuilder) do |f|
428 429 430 431 432 433 434 435 436 437 438 439 440 441 442
      _erbout.concat f.text_field(:title)
      _erbout.concat f.text_area(:body)
      _erbout.concat f.check_box(:secret)
    end

    expected = 
      "<form action='http://www.example.com' method='post'>" +
      "<label for='title'>Title:</label> <input name='post[title]' size='30' type='text' id='post_title' value='Hello World' /><br/>" +
      "<label for='body'>Body:</label> <textarea name='post[body]' id='post_body' rows='20' cols='40'>Back to the hill and over it again!</textarea><br/>" +
      "<label for='secret'>Secret:</label> <input name='post[secret]' checked='checked' type='checkbox' id='post_secret' value='1' />" +
      "<input name='post[secret]' type='hidden' value='0' /><br/>" +
      "</form>"

    assert_dom_equal expected, _erbout
  end
443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466

  def test_default_form_builder
    old_default_form_builder, ActionView::Base.default_form_builder =
      ActionView::Base.default_form_builder, LabelledFormBuilder

    _erbout = ''
    form_for(:post, @post) do |f|
      _erbout.concat f.text_field(:title)
      _erbout.concat f.text_area(:body)
      _erbout.concat f.check_box(:secret)
    end

    expected = 
      "<form action='http://www.example.com' method='post'>" +
      "<label for='title'>Title:</label> <input name='post[title]' size='30' type='text' id='post_title' value='Hello World' /><br/>" +
      "<label for='body'>Body:</label> <textarea name='post[body]' id='post_body' rows='20' cols='40'>Back to the hill and over it again!</textarea><br/>" +
      "<label for='secret'>Secret:</label> <input name='post[secret]' checked='checked' type='checkbox' id='post_secret' value='1' />" +
      "<input name='post[secret]' type='hidden' value='0' /><br/>" +
      "</form>"

    assert_dom_equal expected, _erbout
  ensure
    ActionView::Base.default_form_builder = old_default_form_builder
  end
467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483
  
  def test_default_form_builder_with_active_record_helpers
     
    _erbout = '' 
    form_for(:post, @post) do |f|
       _erbout.concat f.error_message_on('author_name')
       _erbout.concat f.error_messages
    end    
    
    expected = %(<form action='http://www.example.com' method='post'>) + 
               %(<div class='formError'>can't be empty</div>) + 
               %(<div class="errorExplanation" id="errorExplanation"><h2>1 error prohibited this post from being saved</h2><p>There were problems with the following fields:</p><ul><li>Author name can't be empty</li></ul></div>) +
               %(</form>)
    
    assert_dom_equal expected, _erbout

  end
484

485 486 487 488 489
  # Perhaps this test should be moved to prototype helper tests.
  def test_remote_form_for_with_labelled_builder
    self.extend ActionView::Helpers::PrototypeHelper
     _erbout = ''

490
     remote_form_for(:post, @post, :builder => LabelledFormBuilder) do |f|
491 492 493 494 495 496
       _erbout.concat f.text_field(:title)
       _erbout.concat f.text_area(:body)
       _erbout.concat f.check_box(:secret)
     end

     expected = 
497
       %(<form action="http://www.example.com" onsubmit="new Ajax.Request('http://www.example.com', {asynchronous:true, evalScripts:true, parameters:Form.serialize(this)}); return false;" method="post">) +
498 499 500 501 502 503 504 505 506 507 508
       "<label for='title'>Title:</label> <input name='post[title]' size='30' type='text' id='post_title' value='Hello World' /><br/>" +
       "<label for='body'>Body:</label> <textarea name='post[body]' id='post_body' rows='20' cols='40'>Back to the hill and over it again!</textarea><br/>" +
       "<label for='secret'>Secret:</label> <input name='post[secret]' checked='checked' type='checkbox' id='post_secret' value='1' />" +
       "<input name='post[secret]' type='hidden' value='0' /><br/>" +
       "</form>"

     assert_dom_equal expected, _erbout
  end
   
  def test_fields_for_with_labelled_builder
    _erbout = ''
509 510
    
    fields_for(:post, @post, :builder => LabelledFormBuilder) do |f|
511 512 513 514
      _erbout.concat f.text_field(:title)
      _erbout.concat f.text_area(:body)
      _erbout.concat f.check_box(:secret)
    end
515
    
516 517 518 519 520
    expected = 
      "<label for='title'>Title:</label> <input name='post[title]' size='30' type='text' id='post_title' value='Hello World' /><br/>" +
      "<label for='body'>Body:</label> <textarea name='post[body]' id='post_body' rows='20' cols='40'>Back to the hill and over it again!</textarea><br/>" +
      "<label for='secret'>Secret:</label> <input name='post[secret]' checked='checked' type='checkbox' id='post_secret' value='1' />" +
      "<input name='post[secret]' type='hidden' value='0' /><br/>"
521
    
522 523
    assert_dom_equal expected, _erbout
  end
524 525 526 527 528 529 530 531 532 533
  
  def test_form_for_with_html_options_adds_options_to_form_tag
    _erbout = ''
    
    form_for(:post, @post, :html => {:id => 'some_form', :class => 'some_class'}) do |f| end
    expected = "<form action=\"http://www.example.com\" class=\"some_class\" id=\"some_form\" method=\"post\"></form>"
    
    assert_dom_equal expected, _erbout
  end
  
534 535 536 537 538
  def test_form_for_with_string_url_option
    _erbout = ''

    form_for(:post, @post, :url => 'http://www.otherdomain.com') do |f| end

539
    assert_equal '<form action="http://www.otherdomain.com" method="post"></form>', _erbout
540 541 542 543 544 545 546 547 548 549 550
  end

  def test_form_for_with_hash_url_option
    _erbout = ''

    form_for(:post, @post, :url => {:controller => 'controller', :action => 'action'}) do |f| end

    assert_equal 'controller', @controller.url_for_options[:controller]
    assert_equal 'action', @controller.url_for_options[:action]
  end
  
551 552 553 554 555 556
  def test_form_for_with_record_url_option
    _erbout = ''

    form_for(:post, @post, :url => @post) do |f| end

    expected = "<form action=\"/posts/123\" method=\"post\"></form>"
557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588
    assert_equal expected, _erbout
  end

  def test_form_for_with_existing_object
    _erbout = ''

    form_for(@post) do |f| end

    expected = "<form action=\"/posts/123\" class=\"edit_post\" id=\"edit_post_123\" method=\"post\"><div style=\"margin:0;padding:0\"><input name=\"_method\" type=\"hidden\" value=\"put\" /></div></form>"
    assert_equal expected, _erbout
  end

  def test_form_for_with_new_object
    _erbout = ''

    post = Post.new
    post.new_record = true
    def post.id() nil end

    form_for(post) do |f| end

    expected = "<form action=\"/posts\" class=\"new_post\" id=\"new_post\" method=\"post\"></form>"
    assert_equal expected, _erbout
  end

  def test_form_for_with_existing_object_and_custom_url
    _erbout = ''

    form_for(@post, :url => "/super_posts") do |f| end

    expected = "<form action=\"/super_posts\" class=\"edit_post\" id=\"edit_post_123\" method=\"post\"><div style=\"margin:0;padding:0\"><input name=\"_method\" type=\"hidden\" value=\"put\" /></div></form>"
    assert_equal expected, _erbout
589 590
  end
  
591 592 593 594 595 596 597 598 599
  def test_remote_form_for_with_html_options_adds_options_to_form_tag
    self.extend ActionView::Helpers::PrototypeHelper
    _erbout = ''
    
    remote_form_for(:post, @post, :html => {:id => 'some_form', :class => 'some_class'}) do |f| end
    expected = "<form action=\"http://www.example.com\" class=\"some_class\" id=\"some_form\" method=\"post\" onsubmit=\"new Ajax.Request('http://www.example.com', {asynchronous:true, evalScripts:true, parameters:Form.serialize(this)}); return false;\"></form>"
    
    assert_dom_equal expected, _erbout
  end
600 601 602


  protected
603
    def polymorphic_path(record)
604 605 606 607 608
      if record.new_record?
        "/posts"
      else
        "/posts/#{record.id}"
      end
609
    end
610
end