form_helper_test.rb 23.8 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 95
  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 已提交
96
  def test_check_box
97
    assert_dom_equal(
D
Initial  
David Heinemeier Hansson 已提交
98 99 100 101
      '<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
102
    assert_dom_equal(
D
Initial  
David Heinemeier Hansson 已提交
103
      '<input id="post_secret" name="post[secret]" type="checkbox" value="1" /><input name="post[secret]" type="hidden" value="0" />',
104
      check_box("post", "secret")
D
Initial  
David Heinemeier Hansson 已提交
105
    )
106
    assert_dom_equal(
107
      '<input checked="checked" id="post_secret" name="post[secret]" type="checkbox" value="1" /><input name="post[secret]" type="hidden" value="0" />',
108 109
      check_box("post", "secret" ,{"checked"=>"checked"})
    )
D
Initial  
David Heinemeier Hansson 已提交
110
    @post.secret = true
111
    assert_dom_equal(
D
Initial  
David Heinemeier Hansson 已提交
112 113 114 115
      '<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
116

117 118
  def test_check_box_with_explicit_checked_and_unchecked_values
    @post.secret = "on"
119
    assert_dom_equal(
120 121 122 123
      '<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
124 125

  def test_radio_button
126
    assert_dom_equal('<input checked="checked" id="post_title_hello_world" name="post[title]" type="radio" value="Hello World" />',
127
      radio_button("post", "title", "Hello World")
128
    )
129
    assert_dom_equal('<input id="post_title_goodbye_world" name="post[title]" type="radio" value="Goodbye World" />',
130
      radio_button("post", "title", "Goodbye World")
131 132
    )
  end
133

134 135 136 137 138
  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
139 140 141 142 143 144
  
  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
145

D
Initial  
David Heinemeier Hansson 已提交
146
  def test_text_area
147
    assert_dom_equal(
148
      '<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 已提交
149 150 151
      text_area("post", "body")
    )
  end
152

D
Initial  
David Heinemeier Hansson 已提交
153 154
  def test_text_area_with_escapes
    @post.body        = "Back to <i>the</i> hill and over it again!"
155
    assert_dom_equal(
156
      '<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 已提交
157 158 159
      text_area("post", "body")
    )
  end
160 161 162 163 164 165 166 167
  
  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
  
168 169 170 171 172 173 174
  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 已提交
175
  def test_date_selects
176
    assert_dom_equal(
177
      '<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 已提交
178 179 180
      text_area("post", "body")
    )
  end
181

D
Initial  
David Heinemeier Hansson 已提交
182
  def test_explicit_name
183
    assert_dom_equal(
D
Initial  
David Heinemeier Hansson 已提交
184
      '<input id="post_title" name="dont guess" size="30" type="text" value="Hello World" />', text_field("post", "title", "name" => "dont guess")
185
    )
186
    assert_dom_equal(
187
      '<textarea cols="40" id="post_body" name="really!" rows="20">Back to the hill and over it again!</textarea>',
D
Initial  
David Heinemeier Hansson 已提交
188 189
      text_area("post", "body", "name" => "really!")
    )
190
    assert_dom_equal(
D
Initial  
David Heinemeier Hansson 已提交
191 192 193
      '<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")
    )
194
    assert_dom_equal text_field("post", "title", "name" => "dont guess"),
195
                 text_field("post", "title", :name => "dont guess")
196
    assert_dom_equal text_area("post", "body", "name" => "really!"),
197
                 text_area("post", "body", :name => "really!")
198
    assert_dom_equal check_box("post", "secret", "name" => "i mean it"),
199
                 check_box("post", "secret", :name => "i mean it")
D
Initial  
David Heinemeier Hansson 已提交
200
  end
201

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

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

  def test_form_for
    _erbout = ''

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

    expected = 
255
      "<form action='http://www.example.com' id='create-post' method='post'>" +
256 257
      "<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>" +
258 259
      "<input name='post[secret]' checked='checked' type='checkbox' id='post_secret' value='1' />" +
      "<input name='post[secret]' type='hidden' value='0' />" +
260
      "<input name='commit' id='post_submit' type='submit' value='Create post' />" +
261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276
      "</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'>" +
277
      "<div style='margin:0;padding:0'><input name='_method' type='hidden' value='put' /></div>" +
278 279
      "<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>" +
280 281 282 283 284 285 286
      "<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

287 288 289
  def test_form_for_without_object
    _erbout = ''

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

    expected = 
297
      "<form action='http://www.example.com' id='create-post' method='post'>" +
298 299 300 301 302 303 304 305
      "<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
306 307 308 309 310 311 312 313 314 315 316 317
  
  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'>" +
318 319 320
      "<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' />" +
321 322
      "<input name='post[123][secret]' type='hidden' value='0' />" +
      "</form>"
323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339

    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
340
  end
341

342 343 344
  def test_fields_for
    _erbout = ''

345
    fields_for(:post, @post) do |f|
346 347 348 349 350 351 352 353 354 355 356 357 358
      _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
359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376

  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

377 378 379 380 381 382 383 384 385 386
  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

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

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

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

    expected = 
404
      "<form action='http://www.example.com' id='create-post' method='post'>" +
405 406 407 408 409 410 411 412
      "<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
413
  
414
  class LabelledFormBuilder < ActionView::Helpers::FormBuilder
415 416 417 418 419 420 421 422 423 424 425 426 427
    (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 = ''

428
    form_for(:post, @post, :builder => LabelledFormBuilder) do |f|
429 430 431 432 433 434 435 436 437 438 439 440 441 442 443
      _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
444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467

  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
468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484
  
  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
485

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

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

     expected = 
498
       %(<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">) +
499 500 501 502 503 504 505 506 507 508 509
       "<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 = ''
510 511
    
    fields_for(:post, @post, :builder => LabelledFormBuilder) do |f|
512 513 514 515
      _erbout.concat f.text_field(:title)
      _erbout.concat f.text_area(:body)
      _erbout.concat f.check_box(:secret)
    end
516
    
517 518 519 520 521
    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/>"
522
    
523 524
    assert_dom_equal expected, _erbout
  end
525 526 527 528 529 530 531 532 533 534
  
  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
  
535 536 537 538 539
  def test_form_for_with_string_url_option
    _erbout = ''

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

540
    assert_equal '<form action="http://www.otherdomain.com" method="post"></form>', _erbout
541 542 543 544 545 546 547 548 549 550 551
  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
  
552 553 554 555 556 557
  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>"
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 589
    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
590 591
  end
  
592 593 594 595 596 597 598 599 600
  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
601 602 603


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