form_helper_test.rb 66.6 KB
Newer Older
1
require 'abstract_unit'
2
require 'controller/fake_models'
3

4 5
class FormHelperTest < ActionView::TestCase
  tests ActionView::Helpers::FormHelper
D
Initial  
David Heinemeier Hansson 已提交
6

7 8 9 10 11 12 13 14 15 16
  class Developer
    def name_before_type_cast
      "David"
    end

    def name
      "Santiago"
    end
  end

W
wycats 已提交
17 18 19 20
  def form_for(*)
    @output_buffer = super
  end

D
Initial  
David Heinemeier Hansson 已提交
21
  def setup
22
    super
23 24 25 26 27 28 29 30 31 32

    # Create "label" locale for testing I18n label helpers
    I18n.backend.store_translations 'label', {
      :activemodel => {
        :attributes => {
          :post => {
            :cost => "Total cost"
          }
        }
      },
33 34
      :helpers => {
        :label => {
35 36 37 38 39 40 41
          :post => {
            :body => "Write entire text here"
          }
        }
      }
    }

42 43 44 45
    # Create "submit" locale for testing I18n submit helpers
    I18n.backend.store_translations 'submit', {
      :helpers => {
        :submit => {
46 47
          :create => 'Create %{model}',
          :update => 'Confirm %{model} changes',
48 49
          :submit => 'Save changes',
          :another_post => {
50
            :update => 'Update your %{model}'
51
          }
52 53 54 55
        }
      }
    }

56
    @post = Post.new
57
    @comment = Comment.new
58 59
    def @post.errors()
      Class.new{
60
        def [](field); field == "author_name" ? ["can't be empty"] : [] end
61
        def empty?() false end
62
        def count() 1 end
63 64
        def full_messages() [ "Author name can't be empty" ] end
      }.new
65
    end
66
    def @post.id; 123; end
67
    def @post.id_before_type_cast; 123; end
68
    def @post.to_param; '123'; end
69

70
    @post.persisted   = true
D
Initial  
David Heinemeier Hansson 已提交
71 72 73 74 75
    @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)
76
  end
77

78 79 80 81 82 83
  def url_for(object)
    @url_for_options = object
    if object.is_a?(Hash)
      "http://www.example.com"
    else
      super
84
    end
D
Initial  
David Heinemeier Hansson 已提交
85 86
  end

87 88 89 90 91 92 93
  def test_label
    assert_dom_equal('<label for="post_title">Title</label>', label("post", "title"))
    assert_dom_equal('<label for="post_title">The title goes here</label>', label("post", "title", "The title goes here"))
    assert_dom_equal(
      '<label class="title_label" for="post_title">Title</label>',
      label("post", "title", nil, :class => 'title_label')
    )
94
    assert_dom_equal('<label for="post_secret">Secret?</label>', label("post", "secret?"))
95
  end
96

97 98
  def test_label_with_symbols
    assert_dom_equal('<label for="post_title">Title</label>', label(:post, :title))
99
    assert_dom_equal('<label for="post_secret">Secret?</label>', label(:post, :secret?))
100 101
  end

102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122
  def test_label_with_locales_strings
    old_locale, I18n.locale = I18n.locale, :label
    assert_dom_equal('<label for="post_body">Write entire text here</label>', label("post", "body"))
  ensure
    I18n.locale = old_locale
  end

  def test_label_with_human_attribute_name
    old_locale, I18n.locale = I18n.locale, :label
    assert_dom_equal('<label for="post_cost">Total cost</label>', label(:post, :cost))
  ensure
    I18n.locale = old_locale
  end

  def test_label_with_locales_symbols
    old_locale, I18n.locale = I18n.locale, :label
    assert_dom_equal('<label for="post_body">Write entire text here</label>', label(:post, :body))
  ensure
    I18n.locale = old_locale
  end

123 124 125 126 127 128 129 130
  def test_label_with_for_attribute_as_symbol
    assert_dom_equal('<label for="my_for">Title</label>', label(:post, :title, nil, :for => "my_for"))
  end

  def test_label_with_for_attribute_as_string
    assert_dom_equal('<label for="my_for">Title</label>', label(:post, :title, nil, "for" => "my_for"))
  end

131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146
  def test_label_with_id_attribute_as_symbol
    assert_dom_equal('<label for="post_title" id="my_id">Title</label>', label(:post, :title, nil, :id => "my_id"))
  end

  def test_label_with_id_attribute_as_string
    assert_dom_equal('<label for="post_title" id="my_id">Title</label>', label(:post, :title, nil, "id" => "my_id"))
  end

  def test_label_with_for_and_id_attributes_as_symbol
    assert_dom_equal('<label for="my_for" id="my_id">Title</label>', label(:post, :title, nil, :for => "my_for", :id => "my_id"))
  end

  def test_label_with_for_and_id_attributes_as_string
    assert_dom_equal('<label for="my_for" id="my_id">Title</label>', label(:post, :title, nil, "for" => "my_for", "id" => "my_id"))
  end

147 148 149 150 151
  def test_label_for_radio_buttons_with_value
    assert_dom_equal('<label for="post_title_great_title">The title goes here</label>', label("post", "title", "The title goes here", :value => "great_title"))
    assert_dom_equal('<label for="post_title_great_title">The title goes here</label>', label("post", "title", "The title goes here", :value => "great title"))
  end

S
Stephen Celis 已提交
152 153 154 155
  def test_label_with_block
    assert_dom_equal('<label for="post_title">The title, please:</label>', label(:post, :title) { "The title, please:" })
  end

D
Initial  
David Heinemeier Hansson 已提交
156
  def test_text_field
157
    assert_dom_equal(
D
Initial  
David Heinemeier Hansson 已提交
158 159
      '<input id="post_title" name="post[title]" size="30" type="text" value="Hello World" />', text_field("post", "title")
    )
160
    assert_dom_equal(
D
Initial  
David Heinemeier Hansson 已提交
161 162
      '<input id="post_title" name="post[title]" size="30" type="password" value="Hello World" />', password_field("post", "title")
    )
163
    assert_dom_equal(
164
      '<input id="person_name" name="person[name]" size="30" type="password" />', password_field("person", "name")
D
Initial  
David Heinemeier Hansson 已提交
165 166 167 168 169
    )
  end

  def test_text_field_with_escapes
    @post.title = "<b>Hello World</b>"
170
    assert_dom_equal(
D
Initial  
David Heinemeier Hansson 已提交
171 172 173 174
      '<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

175 176 177 178 179 180 181 182
  def test_text_field_with_html_entities
    @post.title = "The HTML Entity for & is &amp;"
    assert_dom_equal(
      '<input id="post_title" name="post[title]" size="30" type="text" value="The HTML Entity for &amp; is &amp;amp;" />',
      text_field("post", "title")
    )
  end

D
Initial  
David Heinemeier Hansson 已提交
183
  def test_text_field_with_options
184
    expected = '<input id="post_title" name="post[title]" size="35" type="text" value="Hello World" />'
185 186
    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 已提交
187
  end
188

D
Initial  
David Heinemeier Hansson 已提交
189
  def test_text_field_assuming_size
190
    expected = '<input id="post_title" maxlength="35" name="post[title]" size="35" type="text" value="Hello World" />'
191 192
    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 已提交
193
  end
194

195 196 197 198 199 200
  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

201 202 203 204 205
  def test_text_field_with_nil_value
    expected = '<input id="post_title" name="post[title]" size="30" type="text" />'
    assert_dom_equal expected, text_field("post", "title", :value => nil)
  end

206 207 208 209 210 211 212
  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

213 214 215 216 217
  def test_file_field_has_no_size
    expected = '<input id="user_avatar" name="user[avatar]" type="file" />'
    assert_dom_equal expected, file_field("user", "avatar")
  end

218 219 220
  def test_hidden_field
    assert_dom_equal '<input id="post_title" name="post[title]" type="hidden" value="Hello World" />',
      hidden_field("post", "title")
221 222
      assert_dom_equal '<input id="post_secret" name="post[secret]" type="hidden" value="1" />',
        hidden_field("post", "secret?")
223 224 225 226 227 228 229 230
  end

  def test_hidden_field_with_escapes
    @post.title = "<b>Hello World</b>"
    assert_dom_equal '<input id="post_title" name="post[title]" type="hidden" value="&lt;b&gt;Hello World&lt;/b&gt;" />',
      hidden_field("post", "title")
  end

231 232 233 234 235
  def test_hidden_field_with_nil_value
    expected = '<input id="post_title" name="post[title]" type="hidden" />'
    assert_dom_equal expected, hidden_field("post", "title", :value => nil)
  end

236 237 238 239 240
  def test_text_field_with_options
    assert_dom_equal '<input id="post_title" name="post[title]" type="hidden" value="Something Else" />',
      hidden_field("post", "title", :value => "Something Else")
  end

241 242 243 244 245
  def test_text_field_with_custom_type
    assert_dom_equal '<input id="user_email" size="30" name="user[email]" type="email" />',
      text_field("user", "email", :type => "email")
  end

246 247 248 249 250 251 252
  def test_text_field_from_a_user_defined_method
    @developer = Developer.new
    assert_dom_equal(
      '<input id="developer_name" name="developer[name]" size="30" type="text" value="Santiago" />', text_field("developer", "name")
    )
  end

D
Initial  
David Heinemeier Hansson 已提交
253
  def test_check_box
254
    assert_dom_equal(
255
      '<input name="post[secret]" type="hidden" value="0" /><input checked="checked" id="post_secret" name="post[secret]" type="checkbox" value="1" />',
D
Initial  
David Heinemeier Hansson 已提交
256 257 258
      check_box("post", "secret")
    )
    @post.secret = 0
259
    assert_dom_equal(
260
      '<input name="post[secret]" type="hidden" value="0" /><input id="post_secret" name="post[secret]" type="checkbox" value="1" />',
261
      check_box("post", "secret")
D
Initial  
David Heinemeier Hansson 已提交
262
    )
263
    assert_dom_equal(
264
      '<input name="post[secret]" type="hidden" value="0" /><input checked="checked" id="post_secret" name="post[secret]" type="checkbox" value="1" />',
265 266
      check_box("post", "secret" ,{"checked"=>"checked"})
    )
D
Initial  
David Heinemeier Hansson 已提交
267
    @post.secret = true
268
    assert_dom_equal(
269
      '<input name="post[secret]" type="hidden" value="0" /><input checked="checked" id="post_secret" name="post[secret]" type="checkbox" value="1" />',
D
Initial  
David Heinemeier Hansson 已提交
270 271
      check_box("post", "secret")
    )
272
    assert_dom_equal(
273
      '<input name="post[secret]" type="hidden" value="0" /><input checked="checked" id="post_secret" name="post[secret]" type="checkbox" value="1" />',
274 275
      check_box("post", "secret?")
    )
276 277 278

    @post.secret = ['0']
    assert_dom_equal(
279
      '<input name="post[secret]" type="hidden" value="0" /><input id="post_secret" name="post[secret]" type="checkbox" value="1" />',
280 281 282 283
      check_box("post", "secret")
    )
    @post.secret = ['1']
    assert_dom_equal(
284
      '<input name="post[secret]" type="hidden" value="0" /><input checked="checked" id="post_secret" name="post[secret]" type="checkbox" value="1" />',
285 286
      check_box("post", "secret")
    )
D
Initial  
David Heinemeier Hansson 已提交
287
  end
288

289 290
  def test_check_box_with_explicit_checked_and_unchecked_values
    @post.secret = "on"
291
    assert_dom_equal(
292
      '<input name="post[secret]" type="hidden" value="off" /><input checked="checked" id="post_secret" name="post[secret]" type="checkbox" value="on" />',
293 294 295
      check_box("post", "secret", {}, "on", "off")
    )
  end
296

297 298 299 300 301 302 303 304 305 306 307 308 309
  def test_check_box_with_multiple_behavior
    @post.comment_ids = [2,3]
    assert_dom_equal(
      '<input name="post[comment_ids][]" type="hidden" value="0" /><input id="post_comment_ids_1" name="post[comment_ids][]" type="checkbox" value="1" />',
      check_box("post", "comment_ids", { :multiple => true }, 1)
    )
    assert_dom_equal(
      '<input name="post[comment_ids][]" type="hidden" value="0" /><input checked="checked" id="post_comment_ids_3" name="post[comment_ids][]" type="checkbox" value="3" />',
      check_box("post", "comment_ids", { :multiple => true }, 3)
    )
  end


310 311
  def test_checkbox_disabled_still_submits_checked_value
    assert_dom_equal(
312
      '<input name="post[secret]" type="hidden" value="1" /><input checked="checked" disabled="disabled" id="post_secret" name="post[secret]" type="checkbox" value="1" />',
313 314 315 316
      check_box("post", "secret", { :disabled => :true })
    )
  end

317
  def test_radio_button
318
    assert_dom_equal('<input checked="checked" id="post_title_hello_world" name="post[title]" type="radio" value="Hello World" />',
319
      radio_button("post", "title", "Hello World")
320
    )
321
    assert_dom_equal('<input id="post_title_goodbye_world" name="post[title]" type="radio" value="Goodbye World" />',
322
      radio_button("post", "title", "Goodbye World")
323
    )
324 325 326
    assert_dom_equal('<input id="item_subobject_title_inside_world" name="item[subobject][title]" type="radio" value="inside world"/>',
      radio_button("item[subobject]", "title", "inside world")
    )
327
  end
328

329 330 331 332 333
  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
334

N
Neeraj Singh 已提交
335 336 337 338 339
  def test_radio_button_with_negative_integer_value
    assert_dom_equal('<input id="post_secret_-1" name="post[secret]" type="radio" value="-1" />',
      radio_button("post", "secret", "-1"))
  end

340 341 342 343 344
  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
345

346 347 348 349 350 351 352 353 354 355
  def test_radio_button_with_booleans
    assert_dom_equal('<input id="post_secret_true" name="post[secret]" type="radio" value="true" />',
      radio_button("post", "secret", true)
    )

    assert_dom_equal('<input id="post_secret_false" name="post[secret]" type="radio" value="false" />',
      radio_button("post", "secret", false)
    )
  end

D
Initial  
David Heinemeier Hansson 已提交
356
  def test_text_area
357
    assert_dom_equal(
358
      '<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 已提交
359 360 361
      text_area("post", "body")
    )
  end
362

D
Initial  
David Heinemeier Hansson 已提交
363 364
  def test_text_area_with_escapes
    @post.body        = "Back to <i>the</i> hill and over it again!"
365
    assert_dom_equal(
366
      '<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 已提交
367 368 369
      text_area("post", "body")
    )
  end
370

371 372 373 374 375 376
  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
377

378 379 380 381 382 383 384 385
  def test_text_area_with_html_entities
    @post.body        = "The HTML Entity for & is &amp;"
    assert_dom_equal(
      '<textarea cols="40" id="post_body" name="post[body]" rows="20">The HTML Entity for &amp; is &amp;amp;</textarea>',
      text_area("post", "body")
    )
  end

386 387 388 389 390 391
  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
392

393
  def test_search_field
394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422
    expected = %{<input id="contact_notes_query" size="30" name="contact[notes_query]" type="search" />}
    assert_dom_equal(expected, search_field("contact", "notes_query"))
  end

  def test_telephone_field
    expected = %{<input id="user_cell" size="30" name="user[cell]" type="tel" />}
    assert_dom_equal(expected, telephone_field("user", "cell"))
  end

  def test_url_field
    expected = %{<input id="user_homepage" size="30" name="user[homepage]" type="url" />}
    assert_dom_equal(expected, url_field("user", "homepage"))
  end

  def test_email_field
    expected = %{<input id="user_address" size="30" name="user[address]" type="email" />}
    assert_dom_equal(expected, email_field("user", "address"))
  end

  def test_number_field
    expected = %{<input name="order[quantity]" size="30" max="9" id="order_quantity" type="number" min="1" />}
    assert_dom_equal(expected, number_field("order", "quantity", :in => 1...10))
  end

  def test_range_input
    expected = %{<input name="hifi[volume]" step="0.1" size="30" max="11" id="hifi_volume" type="range" min="0" />}
    assert_dom_equal(expected, range_field("hifi", "volume", :in => 0..11, :step => 0.1))
  end

D
Initial  
David Heinemeier Hansson 已提交
423
  def test_explicit_name
424
    assert_dom_equal(
D
Initial  
David Heinemeier Hansson 已提交
425
      '<input id="post_title" name="dont guess" size="30" type="text" value="Hello World" />', text_field("post", "title", "name" => "dont guess")
426
    )
427
    assert_dom_equal(
428
      '<textarea cols="40" id="post_body" name="really!" rows="20">Back to the hill and over it again!</textarea>',
D
Initial  
David Heinemeier Hansson 已提交
429 430
      text_area("post", "body", "name" => "really!")
    )
431
    assert_dom_equal(
432
      '<input name="i mean it" type="hidden" value="0" /><input checked="checked" id="post_secret" name="i mean it" type="checkbox" value="1" />',
D
Initial  
David Heinemeier Hansson 已提交
433 434
      check_box("post", "secret", "name" => "i mean it")
    )
435
    assert_dom_equal text_field("post", "title", "name" => "dont guess"),
436
                 text_field("post", "title", :name => "dont guess")
437
    assert_dom_equal text_area("post", "body", "name" => "really!"),
438
                 text_area("post", "body", :name => "really!")
439
    assert_dom_equal check_box("post", "secret", "name" => "i mean it"),
440
                 check_box("post", "secret", :name => "i mean it")
D
Initial  
David Heinemeier Hansson 已提交
441
  end
442

D
Initial  
David Heinemeier Hansson 已提交
443
  def test_explicit_id
444
    assert_dom_equal(
D
Initial  
David Heinemeier Hansson 已提交
445
      '<input id="dont guess" name="post[title]" size="30" type="text" value="Hello World" />', text_field("post", "title", "id" => "dont guess")
446
    )
447
    assert_dom_equal(
448
      '<textarea cols="40" id="really!" name="post[body]" rows="20">Back to the hill and over it again!</textarea>',
D
Initial  
David Heinemeier Hansson 已提交
449 450
      text_area("post", "body", "id" => "really!")
    )
451
    assert_dom_equal(
452
      '<input name="post[secret]" type="hidden" value="0" /><input checked="checked" id="i mean it" name="post[secret]" type="checkbox" value="1" />',
D
Initial  
David Heinemeier Hansson 已提交
453 454
      check_box("post", "secret", "id" => "i mean it")
    )
455
    assert_dom_equal text_field("post", "title", "id" => "dont guess"),
456
                 text_field("post", "title", :id => "dont guess")
457
    assert_dom_equal text_area("post", "body", "id" => "really!"),
458
                 text_area("post", "body", :id => "really!")
459
    assert_dom_equal check_box("post", "secret", "id" => "i mean it"),
460
                 check_box("post", "secret", :id => "i mean it")
D
Initial  
David Heinemeier Hansson 已提交
461
  end
462

463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488
  def test_nil_id
    assert_dom_equal(
      '<input name="post[title]" size="30" type="text" value="Hello World" />', text_field("post", "title", "id" => nil)
    )
    assert_dom_equal(
      '<textarea cols="40" name="post[body]" rows="20">Back to the hill and over it again!</textarea>',
      text_area("post", "body", "id" => nil)
    )
    assert_dom_equal(
      '<input name="post[secret]" type="hidden" value="0" /><input checked="checked" name="post[secret]" type="checkbox" value="1" />',
      check_box("post", "secret", "id" => nil)
    )
    assert_dom_equal(
      '<input type="radio" name="post[secret]" value="0" />',
      radio_button("post", "secret", "0", "id" => nil)
    )
    assert_dom_equal(
      '<select name="post[secret]"></select>',
      select("post", "secret", [], {}, "id" => nil)
    )
    assert_dom_equal text_field("post", "title", "id" => nil),
                 text_field("post", "title", :id => nil)
    assert_dom_equal text_area("post", "body", "id" => nil),
                 text_area("post", "body", :id => nil)
    assert_dom_equal check_box("post", "secret", "id" => nil),
                 check_box("post", "secret", :id => nil)
489 490
    assert_dom_equal radio_button("post", "secret", "0", "id" => nil),
                 radio_button("post", "secret", "0", :id => nil)
491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546
  end

  def test_index
    assert_dom_equal(
      '<input name="post[5][title]" size="30" id="post_5_title" type="text" value="Hello World" />',
      text_field("post", "title", "index" => 5)
    )
    assert_dom_equal(
      '<textarea cols="40" name="post[5][body]" id="post_5_body" rows="20">Back to the hill and over it again!</textarea>',
      text_area("post", "body", "index" => 5)
    )
    assert_dom_equal(
      '<input name="post[5][secret]" type="hidden" value="0" /><input checked="checked" name="post[5][secret]" type="checkbox" value="1" id="post_5_secret" />',
      check_box("post", "secret", "index" => 5)
    )
    assert_dom_equal(
      text_field("post", "title", "index" => 5),
      text_field("post", "title", "index" => 5)
    )
    assert_dom_equal(
      text_area("post", "body", "index" => 5),
      text_area("post", "body", "index" => 5)
    )
    assert_dom_equal(
      check_box("post", "secret", "index" => 5),
      check_box("post", "secret", "index" => 5)
    )
  end

  def test_index_with_nil_id
    assert_dom_equal(
      '<input name="post[5][title]" size="30" type="text" value="Hello World" />',
      text_field("post", "title", "index" => 5, 'id' => nil)
    )
    assert_dom_equal(
      '<textarea cols="40" name="post[5][body]" rows="20">Back to the hill and over it again!</textarea>',
      text_area("post", "body", "index" => 5, 'id' => nil)
    )
    assert_dom_equal(
      '<input name="post[5][secret]" type="hidden" value="0" /><input checked="checked" name="post[5][secret]" type="checkbox" value="1" />',
      check_box("post", "secret", "index" => 5, 'id' => nil)
    )
    assert_dom_equal(
      text_field("post", "title", "index" => 5, 'id' => nil),
      text_field("post", "title", :index => 5, :id => nil)
    )
    assert_dom_equal(
      text_area("post", "body", "index" => 5, 'id' => nil),
      text_area("post", "body", :index => 5, :id => nil)
    )
    assert_dom_equal(
      check_box("post", "secret", "index" => 5, 'id' => nil),
      check_box("post", "secret", :index => 5, :id => nil)
    )
  end

547 548
  def test_auto_index
    pid = @post.id
549 550 551 552
    assert_dom_equal(
      "<label for=\"post_#{pid}_title\">Title</label>",
      label("post[]", "title")
    )
553
    assert_dom_equal(
554 555
      "<input id=\"post_#{pid}_title\" name=\"post[#{pid}][title]\" size=\"30\" type=\"text\" value=\"Hello World\" />", text_field("post[]","title")
    )
556
    assert_dom_equal(
557
      "<textarea cols=\"40\" id=\"post_#{pid}_body\" name=\"post[#{pid}][body]\" rows=\"20\">Back to the hill and over it again!</textarea>",
558 559
      text_area("post[]", "body")
    )
560
    assert_dom_equal(
561
      "<input name=\"post[#{pid}][secret]\" type=\"hidden\" value=\"0\" /><input checked=\"checked\" id=\"post_#{pid}_secret\" name=\"post[#{pid}][secret]\" type=\"checkbox\" value=\"1\" />",
562 563
      check_box("post[]", "secret")
    )
564
   assert_dom_equal(
565
"<input checked=\"checked\" id=\"post_#{pid}_title_hello_world\" name=\"post[#{pid}][title]\" type=\"radio\" value=\"Hello World\" />",
566 567
      radio_button("post[]", "title", "Hello World")
    )
568
    assert_dom_equal("<input id=\"post_#{pid}_title_goodbye_world\" name=\"post[#{pid}][title]\" type=\"radio\" value=\"Goodbye World\" />",
569 570 571
      radio_button("post[]", "title", "Goodbye World")
    )
  end
572

573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595
  def test_auto_index_with_nil_id
    pid = @post.id
    assert_dom_equal(
      "<input name=\"post[#{pid}][title]\" size=\"30\" type=\"text\" value=\"Hello World\" />",
      text_field("post[]","title", :id => nil)
    )
    assert_dom_equal(
      "<textarea cols=\"40\" name=\"post[#{pid}][body]\" rows=\"20\">Back to the hill and over it again!</textarea>",
      text_area("post[]", "body", :id => nil)
    )
    assert_dom_equal(
      "<input name=\"post[#{pid}][secret]\" type=\"hidden\" value=\"0\" /><input checked=\"checked\" name=\"post[#{pid}][secret]\" type=\"checkbox\" value=\"1\" />",
      check_box("post[]", "secret", :id => nil)
    )
   assert_dom_equal(
"<input checked=\"checked\" name=\"post[#{pid}][title]\" type=\"radio\" value=\"Hello World\" />",
      radio_button("post[]", "title", "Hello World", :id => nil)
    )
    assert_dom_equal("<input name=\"post[#{pid}][title]\" type=\"radio\" value=\"Goodbye World\" />",
      radio_button("post[]", "title", "Goodbye World", :id => nil)
    )
  end

596
  def test_form_for
597 598
    assert_deprecated do
      form_for(:post, @post, :html => { :id => 'create-post' }) do |f|
S
Stephen Celis 已提交
599
        concat f.label(:title) { "The Title" }
600 601 602 603 604
        concat f.text_field(:title)
        concat f.text_area(:body)
        concat f.check_box(:secret)
        concat f.submit('Create post')
      end
605 606
    end

607
    expected =
W
wycats 已提交
608 609
      "<form accept-charset='UTF-8' action='http://www.example.com' id='create-post' method='post'>" +
      snowman +
S
Stephen Celis 已提交
610
      "<label for='post_title'>The Title</label>" +
611 612
      "<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>" +
613
      "<input name='post[secret]' type='hidden' value='0' />" +
614
      "<input name='post[secret]' checked='checked' type='checkbox' id='post_secret' value='1' />" +
615
      "<input name='commit' id='post_submit' type='submit' value='Create post' />" +
616 617
      "</form>"

618
    assert_dom_equal expected, output_buffer
619 620
  end

621
  def test_form_for_with_symbol_object_name
622
    form_for(@post, :as => "other_name", :html => { :id => 'create-post' }) do |f|
623
      concat f.label(:title)
624 625 626
      concat f.text_field(:title)
      concat f.text_area(:body)
      concat f.check_box(:secret)
627 628 629
      concat f.submit('Create post')
    end

W
wycats 已提交
630
    expected =  whole_form("/posts/123", "create-post", "other_name_edit", :method => "put") do
631 632 633 634
      "<label for='other_name_title'>Title</label>" +
      "<input name='other_name[title]' size='30' id='other_name_title' value='Hello World' type='text' />" +
      "<textarea name='other_name[body]' id='other_name_body' rows='20' cols='40'>Back to the hill and over it again!</textarea>" +
      "<input name='other_name[secret]' value='0' type='hidden' />" +
S
Stephen Celis 已提交
635
      "<input name='other_name[secret]' checked='checked' id='other_name_secret' value='1' type='checkbox' />" +
W
wycats 已提交
636 637
      "<input name='commit' id='other_name_submit' value='Create post' type='submit' />"
    end
638 639 640 641 642 643 644 645 646 647 648

    assert_dom_equal expected, output_buffer
  end

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

W
wycats 已提交
651
    expected =  whole_form("http://www.example.com", "create-post", nil, "put") do
652 653
      "<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>" +
654
      "<input name='post[secret]' type='hidden' value='0' />" +
W
wycats 已提交
655 656
      "<input name='post[secret]' checked='checked' type='checkbox' id='post_secret' value='1' />"
    end
657

658
    assert_dom_equal expected, output_buffer
659 660
  end

661
  def test_form_for_with_remote
662 663 664 665 666 667
    assert_deprecated do
      form_for(:post, @post, :remote => true, :html => { :id => 'create-post', :method => :put }) do |f|
        concat f.text_field(:title)
        concat f.text_area(:body)
        concat f.check_box(:secret)
      end
668 669
    end

W
wycats 已提交
670
    expected =  whole_form("http://www.example.com", "create-post", nil, :method => "put", :remote => true) do
671 672 673
      "<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]' type='hidden' value='0' />" +
W
wycats 已提交
674 675
      "<input name='post[secret]' checked='checked' type='checkbox' id='post_secret' value='1' />"
    end
676 677 678 679

    assert_dom_equal expected, output_buffer
  end

680 681 682 683 684 685 686 687 688
  def test_form_for_with_remote_without_html
    assert_deprecated do
      form_for(:post, @post, :remote => true) do |f|
        concat f.text_field(:title)
        concat f.text_area(:body)
        concat f.check_box(:secret)
      end
    end

W
wycats 已提交
689
    expected =  whole_form("http://www.example.com", nil, nil, :remote => true) do
690 691 692
      "<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]' type='hidden' value='0' />" +
W
wycats 已提交
693 694
      "<input name='post[secret]' checked='checked' type='checkbox' id='post_secret' value='1' />"
    end
695 696 697 698

    assert_dom_equal expected, output_buffer
  end

699
  def test_form_for_without_object
700 701 702 703
    form_for(:post, :html => { :id => 'create-post' }) do |f|
      concat f.text_field(:title)
      concat f.text_area(:body)
      concat f.check_box(:secret)
704 705
    end

W
wycats 已提交
706
    expected =  whole_form("http://www.example.com", "create-post") do
707 708 709
      "<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]' type='hidden' value='0' />" +
W
wycats 已提交
710 711
      "<input name='post[secret]' checked='checked' type='checkbox' id='post_secret' value='1' />"
    end
712

713
    assert_dom_equal expected, output_buffer
714
  end
715

716
  def test_form_for_with_index
717 718 719 720 721 722 723
    assert_deprecated do
      form_for("post[]", @post) do |f|
        concat f.label(:title)
        concat f.text_field(:title)
        concat f.text_area(:body)
        concat f.check_box(:secret)
      end
724
    end
725

W
wycats 已提交
726
    expected = whole_form do
727
      "<label for='post_123_title'>Title</label>" +
728 729
      "<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>" +
730
      "<input name='post[123][secret]' type='hidden' value='0' />" +
W
wycats 已提交
731 732
      "<input name='post[123][secret]' checked='checked' type='checkbox' id='post_123_secret' value='1' />"
    end
733

734
    assert_dom_equal expected, output_buffer
735 736
  end

737
  def test_form_for_with_nil_index_option_override
738 739 740 741 742 743
    assert_deprecated do
      form_for("post[]", @post, :index => nil) do |f|
        concat f.text_field(:title)
        concat f.text_area(:body)
        concat f.check_box(:secret)
      end
744 745
    end

W
wycats 已提交
746
    expected = whole_form do
747 748 749
      "<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]' type='hidden' value='0' />" +
W
wycats 已提交
750 751
      "<input name='post[][secret]' checked='checked' type='checkbox' id='post__secret' value='1' />"
    end
752

753
    assert_dom_equal expected, output_buffer
754 755
  end

756 757 758
  def test_submit_with_object_as_new_record_and_locale_strings
    old_locale, I18n.locale = I18n.locale, :submit

759
    @post.persisted = false
760 761 762 763
    assert_deprecated do
      form_for(:post, @post) do |f|
        concat f.submit
      end
764 765
    end

W
wycats 已提交
766 767 768 769
    expected =  whole_form do
                  "<input name='commit' id='post_submit' type='submit' value='Create Post' />"
                end

770 771 772 773 774 775 776 777
    assert_dom_equal expected, output_buffer
  ensure
    I18n.locale = old_locale
  end

  def test_submit_with_object_as_existing_record_and_locale_strings
    old_locale, I18n.locale = I18n.locale, :submit

778 779 780 781
    assert_deprecated do
      form_for(:post, @post) do |f|
        concat f.submit
      end
782 783
    end

W
wycats 已提交
784 785 786 787
    expected =  whole_form do
                  "<input name='commit' id='post_submit' type='submit' value='Confirm Post changes' />"
                end

788 789 790 791 792 793 794 795
    assert_dom_equal expected, output_buffer
  ensure
    I18n.locale = old_locale
  end

  def test_submit_without_object_and_locale_strings
    old_locale, I18n.locale = I18n.locale, :submit

796 797
    form_for(:post) do |f|
      concat f.submit :class => "extra"
798 799
    end

W
wycats 已提交
800 801 802 803
    expected =  whole_form do
                  "<input name='commit' class='extra' id='post_submit' type='submit' value='Save changes' />"
                end

804 805 806 807 808
    assert_dom_equal expected, output_buffer
  ensure
    I18n.locale = old_locale
  end

809 810 811
  def test_submit_with_object_and_nested_lookup
    old_locale, I18n.locale = I18n.locale, :submit

812 813 814 815
    assert_deprecated do
      form_for(:another_post, @post) do |f|
        concat f.submit
      end
816 817
    end

W
wycats 已提交
818 819 820 821
    expected =  whole_form do
                  "<input name='commit' id='another_post_submit' type='submit' value='Update your Post' />"
                end

822 823 824 825 826
    assert_dom_equal expected, output_buffer
  ensure
    I18n.locale = old_locale
  end

827
  def test_nested_fields_for
828 829 830 831 832 833
    assert_deprecated do
      form_for(:post, @post) do |f|
        concat f.fields_for(:comment, @post) { |c|
          concat c.text_field(:title)
        }
      end
834 835
    end

W
wycats 已提交
836 837 838
    expected =  whole_form do
                  "<input name='post[comment][title]' size='30' type='text' id='post_comment_title' value='Hello World' />"
                end
839

840
    assert_dom_equal expected, output_buffer
841
  end
842

843
  def test_nested_fields_for_with_nested_collections
844 845 846 847 848 849 850
    assert_deprecated do
      form_for('post[]', @post) do |f|
        concat f.text_field(:title)
        concat f.fields_for('comment[]', @comment) { |c|
          concat c.text_field(:name)
        }
      end
851 852
    end

W
wycats 已提交
853 854 855 856
    expected =  whole_form do
                  "<input name='post[123][title]' size='30' type='text' id='post_123_title' value='Hello World' />" +
                  "<input name='post[123][comment][][name]' size='30' type='text' id='post_123_comment__name' value='new comment' />"
                end
857 858 859 860

    assert_dom_equal expected, output_buffer
  end

861
  def test_nested_fields_for_with_index_and_parent_fields
862 863 864 865 866 867 868
    assert_deprecated do
      form_for('post', @post, :index => 1) do |c|
        concat c.text_field(:title)
        concat c.fields_for('comment', @comment, :index => 1) { |r|
          concat r.text_field(:name)
        }
      end
869 870
    end

W
wycats 已提交
871 872 873 874
    expected =  whole_form do
                  "<input name='post[1][title]' size='30' type='text' id='post_1_title' value='Hello World' />" +
                  "<input name='post[1][comment][1][name]' size='30' type='text' id='post_1_comment_1_name' value='new comment' />"
                end
875 876 877 878

    assert_dom_equal expected, output_buffer
  end

879
  def test_form_for_with_index_and_nested_fields_for
880 881 882 883 884 885
    assert_deprecated do
      output_buffer = form_for(:post, @post, :index => 1) do |f|
        concat f.fields_for(:comment, @post) { |c|
          concat c.text_field(:title)
        }
      end
886 887
    end

W
wycats 已提交
888 889 890
    expected =  whole_form do
                  "<input name='post[1][comment][title]' size='30' type='text' id='post_1_comment_title' value='Hello World' />"
                end
891 892 893 894 895

    assert_dom_equal expected, output_buffer
  end

  def test_nested_fields_for_with_index_on_both
896 897 898 899 900 901
    assert_deprecated do
      form_for(:post, @post, :index => 1) do |f|
        concat f.fields_for(:comment, @post, :index => 5) { |c|
          concat c.text_field(:title)
        }
      end
902 903
    end

W
wycats 已提交
904 905 906
    expected =  whole_form do
                  "<input name='post[1][comment][5][title]' size='30' type='text' id='post_1_comment_5_title' value='Hello World' />"
                end
907 908 909 910 911

    assert_dom_equal expected, output_buffer
  end

  def test_nested_fields_for_with_auto_index
912 913 914 915 916 917
    assert_deprecated do
      form_for("post[]", @post) do |f|
        concat f.fields_for(:comment, @post) { |c|
          concat c.text_field(:title)
        }
      end
918 919
    end

W
wycats 已提交
920 921 922
    expected =  whole_form do
                  "<input name='post[123][comment][title]' size='30' type='text' id='post_123_comment_title' value='Hello World' />"
                end
923 924 925 926

    assert_dom_equal expected, output_buffer
  end

927
  def test_nested_fields_for_with_index_radio_button
928 929 930 931 932 933
    assert_deprecated do
      form_for(:post, @post) do |f|
        concat f.fields_for(:comment, @post, :index => 5) { |c|
          concat c.radio_button(:title, "hello")
        }
      end
934 935
    end

W
wycats 已提交
936 937 938
    expected =  whole_form do
                  "<input name='post[comment][5][title]' type='radio' id='post_comment_5_title_hello' value='hello' />"
                end
939 940 941 942

    assert_dom_equal expected, output_buffer
  end

943
  def test_nested_fields_for_with_auto_index_on_both
944 945 946 947 948 949
    assert_deprecated do
      form_for("post[]", @post) do |f|
        concat f.fields_for("comment[]", @post) { |c|
          concat c.text_field(:title)
        }
      end
950 951
    end

W
wycats 已提交
952 953 954
    expected =  whole_form do
                  "<input name='post[123][comment][123][title]' size='30' type='text' id='post_123_comment_123_title' value='Hello World' />"
                end
955 956 957 958 959

    assert_dom_equal expected, output_buffer
  end

  def test_nested_fields_for_with_index_and_auto_index
960 961 962 963 964 965
    assert_deprecated do
      output_buffer = form_for("post[]", @post) do |f|
        concat f.fields_for(:comment, @post, :index => 5) { |c|
          concat c.text_field(:title)
        }
      end
966

967 968 969 970 971
      output_buffer << form_for(:post, @post, :index => 1) do |f|
        concat f.fields_for("comment[]", @post) { |c|
          concat c.text_field(:title)
        }
      end
972

W
wycats 已提交
973 974 975 976 977
      expected =  whole_form do
                    "<input name='post[123][comment][5][title]' size='30' type='text' id='post_123_comment_5_title' value='Hello World' />"
                  end + whole_form do
                    "<input name='post[1][comment][123][title]' size='30' type='text' id='post_1_comment_123_title' value='Hello World' />"
                  end
978

979 980
      assert_dom_equal expected, output_buffer
    end
981 982
  end

983 984 985
  def test_nested_fields_for_with_a_new_record_on_a_nested_attributes_one_to_one_association
    @post.author = Author.new

986 987 988 989 990 991 992
    assert_deprecated do
      form_for(:post, @post) do |f|
        concat f.text_field(:title)
        concat f.fields_for(:author) { |af|
          concat af.text_field(:name)
        }
      end
993 994
    end

W
wycats 已提交
995 996 997 998
    expected =  whole_form do
                  '<input name="post[title]" size="30" type="text" id="post_title" value="Hello World" />' +
                  '<input id="post_author_attributes_name" name="post[author_attributes][name]" size="30" type="text" value="new author" />'
                end
999 1000 1001 1002

    assert_dom_equal expected, output_buffer
  end

1003
  def test_nested_fields_for_with_explicitly_passed_object_on_a_nested_attributes_one_to_one_association
1004 1005 1006 1007 1008 1009
    assert_deprecated do
      form_for(:post, @post) do |f|
        f.fields_for(:author, Author.new(123)) do |af|
          assert_not_nil af.object
          assert_equal 123, af.object.id
        end
1010 1011 1012 1013
      end
    end
  end

1014 1015 1016
  def test_nested_fields_for_with_an_existing_record_on_a_nested_attributes_one_to_one_association
    @post.author = Author.new(321)

1017 1018 1019 1020 1021 1022 1023
    assert_deprecated do
      form_for(:post, @post) do |f|
        concat f.text_field(:title)
        concat f.fields_for(:author) { |af|
          concat af.text_field(:name)
        }
      end
1024 1025
    end

W
wycats 已提交
1026 1027 1028 1029 1030
    expected =  whole_form do
                  '<input name="post[title]" size="30" type="text" id="post_title" value="Hello World" />' +
                  '<input id="post_author_attributes_name" name="post[author_attributes][name]" size="30" type="text" value="author #321" />' +
                  '<input id="post_author_attributes_id" name="post[author_attributes][id]" type="hidden" value="321" />'
                end
1031 1032 1033

    assert_dom_equal expected, output_buffer
  end
1034

1035 1036 1037
  def test_nested_fields_for_with_existing_records_on_a_nested_attributes_one_to_one_association_with_explicit_hidden_field_placement
    @post.author = Author.new(321)

1038 1039 1040 1041 1042 1043 1044 1045
    assert_deprecated do
      form_for(:post, @post) do |f|
        concat f.text_field(:title)
        concat f.fields_for(:author) { |af|
          concat af.hidden_field(:id)
          concat af.text_field(:name)
        }
      end
1046
    end
1047

W
wycats 已提交
1048 1049 1050 1051 1052
    expected =  whole_form do
                  '<input name="post[title]" size="30" type="text" id="post_title" value="Hello World" />' +
                  '<input id="post_author_attributes_id" name="post[author_attributes][id]" type="hidden" value="321" />' +
                  '<input id="post_author_attributes_name" name="post[author_attributes][name]" size="30" type="text" value="author #321" />'
                end
1053 1054 1055 1056 1057 1058 1059

    assert_dom_equal expected, output_buffer
  end

  def test_nested_fields_for_with_existing_records_on_a_nested_attributes_collection_association
    @post.comments = Array.new(2) { |id| Comment.new(id + 1) }

1060 1061 1062 1063 1064 1065 1066 1067
    assert_deprecated do
      form_for(:post, @post) do |f|
        concat f.text_field(:title)
        @post.comments.each do |comment|
          concat f.fields_for(:comments, comment) { |cf|
            concat cf.text_field(:name)
          }
        end
1068 1069 1070
      end
    end

W
wycats 已提交
1071 1072 1073 1074 1075 1076 1077
    expected =  whole_form do
                  '<input name="post[title]" size="30" type="text" id="post_title" value="Hello World" />' +
                  '<input id="post_comments_attributes_0_name" name="post[comments_attributes][0][name]" size="30" type="text" value="comment #1" />' +
                  '<input id="post_comments_attributes_0_id" name="post[comments_attributes][0][id]" type="hidden" value="1" />' +
                  '<input id="post_comments_attributes_1_name" name="post[comments_attributes][1][name]" size="30" type="text" value="comment #2" />' +
                  '<input id="post_comments_attributes_1_id" name="post[comments_attributes][1][id]" type="hidden" value="2" />'
                end
1078 1079 1080 1081 1082 1083 1084

    assert_dom_equal expected, output_buffer
  end

  def test_nested_fields_for_with_existing_records_on_a_nested_attributes_collection_association_with_explicit_hidden_field_placement
    @post.comments = Array.new(2) { |id| Comment.new(id + 1) }

1085 1086 1087 1088 1089 1090 1091 1092 1093
    assert_deprecated do
      form_for(:post, @post) do |f|
        concat f.text_field(:title)
        @post.comments.each do |comment|
          concat f.fields_for(:comments, comment) { |cf|
            concat cf.hidden_field(:id)
            concat cf.text_field(:name)
          }
        end
1094 1095
      end
    end
1096

W
wycats 已提交
1097 1098 1099 1100 1101 1102 1103
    expected =  whole_form do
                  '<input name="post[title]" size="30" type="text" id="post_title" value="Hello World" />' +
                  '<input id="post_comments_attributes_0_id" name="post[comments_attributes][0][id]" type="hidden" value="1" />' +
                  '<input id="post_comments_attributes_0_name" name="post[comments_attributes][0][name]" size="30" type="text" value="comment #1" />' +
                  '<input id="post_comments_attributes_1_id" name="post[comments_attributes][1][id]" type="hidden" value="2" />' +
                  '<input id="post_comments_attributes_1_name" name="post[comments_attributes][1][name]" size="30" type="text" value="comment #2" />'
                end
1104 1105 1106 1107 1108 1109 1110

    assert_dom_equal expected, output_buffer
  end

  def test_nested_fields_for_with_new_records_on_a_nested_attributes_collection_association
    @post.comments = [Comment.new, Comment.new]

1111 1112 1113 1114 1115 1116 1117 1118
    assert_deprecated do
      form_for(:post, @post) do |f|
        concat f.text_field(:title)
        @post.comments.each do |comment|
          concat f.fields_for(:comments, comment) { |cf|
            concat cf.text_field(:name)
          }
        end
1119 1120 1121
      end
    end

W
wycats 已提交
1122 1123 1124 1125 1126
    expected =  whole_form do
                  '<input name="post[title]" size="30" type="text" id="post_title" value="Hello World" />' +
                  '<input id="post_comments_attributes_0_name" name="post[comments_attributes][0][name]" size="30" type="text" value="new comment" />' +
                  '<input id="post_comments_attributes_1_name" name="post[comments_attributes][1][name]" size="30" type="text" value="new comment" />'
                end
1127 1128 1129 1130 1131 1132 1133

    assert_dom_equal expected, output_buffer
  end

  def test_nested_fields_for_with_existing_and_new_records_on_a_nested_attributes_collection_association
    @post.comments = [Comment.new(321), Comment.new]

1134 1135 1136 1137 1138 1139 1140 1141
    assert_deprecated do
      form_for(:post, @post) do |f|
        concat f.text_field(:title)
        @post.comments.each do |comment|
          concat f.fields_for(:comments, comment) { |cf|
            concat cf.text_field(:name)
          }
        end
1142 1143 1144
      end
    end

W
wycats 已提交
1145 1146 1147 1148 1149 1150
    expected =  whole_form do
                  '<input name="post[title]" size="30" type="text" id="post_title" value="Hello World" />' +
                  '<input id="post_comments_attributes_0_name" name="post[comments_attributes][0][name]" size="30" type="text" value="comment #321" />' +
                  '<input id="post_comments_attributes_0_id" name="post[comments_attributes][0][id]" type="hidden" value="321" />' +
                  '<input id="post_comments_attributes_1_name" name="post[comments_attributes][1][name]" size="30" type="text" value="new comment" />'
                end
1151 1152 1153 1154

    assert_dom_equal expected, output_buffer
  end

1155
  def test_nested_fields_for_with_an_empty_supplied_attributes_collection
1156 1157 1158 1159 1160 1161
    assert_deprecated do
      form_for(:post, @post) do |f|
        concat f.text_field(:title)
        f.fields_for(:comments, []) do |cf|
          concat cf.text_field(:name)
        end
1162 1163 1164
      end
    end

W
wycats 已提交
1165 1166 1167
    expected =  whole_form do
                  '<input name="post[title]" size="30" type="text" id="post_title" value="Hello World" />'
                end
1168 1169 1170 1171 1172 1173 1174

    assert_dom_equal expected, output_buffer
  end

  def test_nested_fields_for_with_existing_records_on_a_supplied_nested_attributes_collection
    @post.comments = Array.new(2) { |id| Comment.new(id + 1) }

1175 1176 1177 1178 1179 1180 1181
    assert_deprecated do
      form_for(:post, @post) do |f|
        concat f.text_field(:title)
        concat f.fields_for(:comments, @post.comments) { |cf|
          concat cf.text_field(:name)
        }
      end
1182 1183
    end

W
wycats 已提交
1184 1185 1186 1187 1188 1189 1190
    expected =  whole_form do
                  '<input name="post[title]" size="30" type="text" id="post_title" value="Hello World" />' +
                  '<input id="post_comments_attributes_0_name" name="post[comments_attributes][0][name]" size="30" type="text" value="comment #1" />' +
                  '<input id="post_comments_attributes_0_id" name="post[comments_attributes][0][id]" type="hidden" value="1" />' +
                  '<input id="post_comments_attributes_1_name" name="post[comments_attributes][1][name]" size="30" type="text" value="comment #2" />' +
                  '<input id="post_comments_attributes_1_id" name="post[comments_attributes][1][id]" type="hidden" value="2" />'
                end
1191 1192 1193 1194 1195 1196 1197 1198

    assert_dom_equal expected, output_buffer
  end

  def test_nested_fields_for_with_existing_records_on_a_supplied_nested_attributes_collection_different_from_record_one
    comments = Array.new(2) { |id| Comment.new(id + 1) }
    @post.comments = []

1199 1200 1201 1202 1203 1204 1205
    assert_deprecated do
      form_for(:post, @post) do |f|
        concat f.text_field(:title)
        concat f.fields_for(:comments, comments) { |cf|
          concat cf.text_field(:name)
        }
      end
1206 1207
    end

W
wycats 已提交
1208 1209 1210 1211 1212 1213 1214
    expected =  whole_form do
                  '<input name="post[title]" size="30" type="text" id="post_title" value="Hello World" />' +
                  '<input id="post_comments_attributes_0_name" name="post[comments_attributes][0][name]" size="30" type="text" value="comment #1" />' +
                  '<input id="post_comments_attributes_0_id" name="post[comments_attributes][0][id]" type="hidden" value="1" />' +
                  '<input id="post_comments_attributes_1_name" name="post[comments_attributes][1][name]" size="30" type="text" value="comment #2" />' +
                  '<input id="post_comments_attributes_1_id" name="post[comments_attributes][1][id]" type="hidden" value="2" />'
                end
1215 1216 1217 1218

    assert_dom_equal expected, output_buffer
  end

1219 1220 1221 1222
  def test_nested_fields_for_on_a_nested_attributes_collection_association_yields_only_builder
    @post.comments = [Comment.new(321), Comment.new]
    yielded_comments = []

1223 1224 1225 1226 1227 1228 1229 1230
    assert_deprecated do
      form_for(:post, @post) do |f|
        concat f.text_field(:title)
        concat f.fields_for(:comments) { |cf|
          concat cf.text_field(:name)
          yielded_comments << cf.object
        }
      end
1231 1232
    end

W
wycats 已提交
1233 1234 1235 1236 1237 1238
    expected =  whole_form do
                  '<input name="post[title]" size="30" type="text" id="post_title" value="Hello World" />' +
                  '<input id="post_comments_attributes_0_name" name="post[comments_attributes][0][name]" size="30" type="text" value="comment #321" />' +
                  '<input id="post_comments_attributes_0_id" name="post[comments_attributes][0][id]" type="hidden" value="321" />' +
                  '<input id="post_comments_attributes_1_name" name="post[comments_attributes][1][name]" size="30" type="text" value="new comment" />'
                end
1239 1240 1241 1242 1243

    assert_dom_equal expected, output_buffer
    assert_equal yielded_comments, @post.comments
  end

1244 1245 1246
  def test_nested_fields_for_with_child_index_option_override_on_a_nested_attributes_collection_association
    @post.comments = []

1247 1248 1249 1250 1251 1252
    assert_deprecated do
      form_for(:post, @post) do |f|
        concat f.fields_for(:comments, Comment.new(321), :child_index => 'abc') { |cf|
          concat cf.text_field(:name)
        }
      end
1253 1254
    end

W
wycats 已提交
1255 1256 1257 1258
    expected =  whole_form do
                  '<input id="post_comments_attributes_abc_name" name="post[comments_attributes][abc][name]" size="30" type="text" value="comment #321" />' +
                  '<input id="post_comments_attributes_abc_id" name="post[comments_attributes][abc][id]" type="hidden" value="321" />'
                end
1259 1260 1261 1262

    assert_dom_equal expected, output_buffer
  end

1263 1264 1265 1266 1267 1268
  def test_nested_fields_uses_unique_indices_for_different_collection_associations
    @post.comments = [Comment.new(321)]
    @post.tags = [Tag.new(123), Tag.new(456)]
    @post.comments[0].relevances = []
    @post.tags[0].relevances = []
    @post.tags[1].relevances = []
1269 1270 1271 1272 1273 1274 1275 1276

    assert_deprecated do
      form_for(:post, @post) do |f|
        concat f.fields_for(:comments, @post.comments[0]) { |cf|
          concat cf.text_field(:name)
          concat cf.fields_for(:relevances, CommentRelevance.new(314)) { |crf|
            concat crf.text_field(:value)
          }
W
wycats 已提交
1277
        }
1278 1279 1280 1281 1282
        concat f.fields_for(:tags, @post.tags[0]) { |tf|
          concat tf.text_field(:value)
          concat tf.fields_for(:relevances, TagRelevance.new(3141)) { |trf|
            concat trf.text_field(:value)
          }
W
wycats 已提交
1283
        }
1284 1285 1286 1287 1288
        concat f.fields_for('tags', @post.tags[1]) { |tf|
          concat tf.text_field(:value)
          concat tf.fields_for(:relevances, TagRelevance.new(31415)) { |trf|
            concat trf.text_field(:value)
          }
W
wycats 已提交
1289
        }
1290
      end
1291 1292
    end

W
wycats 已提交
1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306
    expected =  whole_form do
                  '<input id="post_comments_attributes_0_name" name="post[comments_attributes][0][name]" size="30" type="text" value="comment #321" />' +
                  '<input id="post_comments_attributes_0_relevances_attributes_0_value" name="post[comments_attributes][0][relevances_attributes][0][value]" size="30" type="text" value="commentrelevance #314" />' +
                  '<input id="post_comments_attributes_0_relevances_attributes_0_id" name="post[comments_attributes][0][relevances_attributes][0][id]" type="hidden" value="314" />' +
                  '<input id="post_comments_attributes_0_id" name="post[comments_attributes][0][id]" type="hidden" value="321" />' +
                  '<input id="post_tags_attributes_0_value" name="post[tags_attributes][0][value]" size="30" type="text" value="tag #123" />' +
                  '<input id="post_tags_attributes_0_relevances_attributes_0_value" name="post[tags_attributes][0][relevances_attributes][0][value]" size="30" type="text" value="tagrelevance #3141" />' +
                  '<input id="post_tags_attributes_0_relevances_attributes_0_id" name="post[tags_attributes][0][relevances_attributes][0][id]" type="hidden" value="3141" />' +
                  '<input id="post_tags_attributes_0_id" name="post[tags_attributes][0][id]" type="hidden" value="123" />' +
                  '<input id="post_tags_attributes_1_value" name="post[tags_attributes][1][value]" size="30" type="text" value="tag #456" />' +
                  '<input id="post_tags_attributes_1_relevances_attributes_0_value" name="post[tags_attributes][1][relevances_attributes][0][value]" size="30" type="text" value="tagrelevance #31415" />' +
                  '<input id="post_tags_attributes_1_relevances_attributes_0_id" name="post[tags_attributes][1][relevances_attributes][0][id]" type="hidden" value="31415" />' +
                  '<input id="post_tags_attributes_1_id" name="post[tags_attributes][1][id]" type="hidden" value="456" />'
                end
1307 1308 1309 1310

    assert_dom_equal expected, output_buffer
  end

1311
  def test_fields_for
W
wycats 已提交
1312
    output_buffer = fields_for(:post, @post) do |f|
1313 1314 1315
      concat f.text_field(:title)
      concat f.text_area(:body)
      concat f.check_box(:secret)
1316 1317
    end

1318
    expected =
1319 1320
      "<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>" +
1321 1322
      "<input name='post[secret]' type='hidden' value='0' />" +
      "<input name='post[secret]' checked='checked' type='checkbox' id='post_secret' value='1' />"
1323

1324
    assert_dom_equal expected, output_buffer
1325 1326 1327
  end

  def test_fields_for_with_index
W
wycats 已提交
1328
    output_buffer = fields_for("post[]", @post) do |f|
1329 1330 1331
      concat f.text_field(:title)
      concat f.text_area(:body)
      concat f.check_box(:secret)
1332 1333 1334 1335 1336
    end

    expected =
      "<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>" +
1337 1338
      "<input name='post[123][secret]' type='hidden' value='0' />" +
      "<input name='post[123][secret]' checked='checked' type='checkbox' id='post_123_secret' value='1' />"
1339

1340
    assert_dom_equal expected, output_buffer
1341 1342 1343
  end

  def test_fields_for_with_nil_index_option_override
W
wycats 已提交
1344
    output_buffer = fields_for("post[]", @post, :index => nil) do |f|
1345 1346 1347
      concat f.text_field(:title)
      concat f.text_area(:body)
      concat f.check_box(:secret)
1348 1349 1350 1351 1352
    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>" +
1353 1354
      "<input name='post[][secret]' type='hidden' value='0' />" +
      "<input name='post[][secret]' checked='checked' type='checkbox' id='post__secret' value='1' />"
1355

1356
    assert_dom_equal expected, output_buffer
1357 1358 1359
  end

  def test_fields_for_with_index_option_override
W
wycats 已提交
1360
    output_buffer = fields_for("post[]", @post, :index => "abc") do |f|
1361 1362 1363
      concat f.text_field(:title)
      concat f.text_area(:body)
      concat f.check_box(:secret)
1364 1365 1366 1367 1368
    end

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

1372
    assert_dom_equal expected, output_buffer
1373
  end
1374 1375

  def test_fields_for_without_object
W
wycats 已提交
1376
    output_buffer = fields_for(:post) do |f|
1377 1378 1379
      concat f.text_field(:title)
      concat f.text_area(:body)
      concat f.check_box(:secret)
1380 1381
    end

1382
    expected =
1383 1384
      "<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>" +
1385 1386
      "<input name='post[secret]' type='hidden' value='0' />" +
      "<input name='post[secret]' checked='checked' type='checkbox' id='post_secret' value='1' />"
1387

1388
    assert_dom_equal expected, output_buffer
1389 1390 1391
  end

  def test_fields_for_with_only_object
W
wycats 已提交
1392
    output_buffer = fields_for(@post) do |f|
1393 1394 1395
      concat f.text_field(:title)
      concat f.text_area(:body)
      concat f.check_box(:secret)
1396 1397
    end

1398
    expected =
1399 1400
      "<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>" +
1401 1402
      "<input name='post[secret]' type='hidden' value='0' />" +
      "<input name='post[secret]' checked='checked' type='checkbox' id='post_secret' value='1' />"
1403

1404
    assert_dom_equal expected, output_buffer
1405 1406
  end

1407
  def test_fields_for_object_with_bracketed_name
W
wycats 已提交
1408
    output_buffer = fields_for("author[post]", @post) do |f|
1409 1410
      concat f.label(:title)
      concat f.text_field(:title)
1411 1412
    end

1413 1414
    assert_dom_equal "<label for=\"author_post_title\">Title</label>" +
    "<input name='author[post][title]' size='30' type='text' id='author_post_title' value='Hello World' />",
1415
      output_buffer
1416 1417
  end

1418
  def test_fields_for_object_with_bracketed_name_and_index
W
wycats 已提交
1419
    output_buffer = fields_for("author[post]", @post, :index => 1) do |f|
1420 1421
      concat f.label(:title)
      concat f.text_field(:title)
1422 1423 1424 1425
    end

    assert_dom_equal "<label for=\"author_post_1_title\">Title</label>" +
      "<input name='author[post][1][title]' size='30' type='text' id='author_post_1_title' value='Hello World' />",
1426
      output_buffer
1427 1428
  end

1429 1430 1431
  def test_form_builder_does_not_have_form_for_method
    assert ! ActionView::Helpers::FormBuilder.instance_methods.include?('form_for')
  end
1432

1433
  def test_form_for_and_fields_for
1434 1435 1436 1437
    assert_deprecated do
      form_for(:post, @post, :html => { :id => 'create-post' }) do |post_form|
        concat post_form.text_field(:title)
        concat post_form.text_area(:body)
1438

1439 1440 1441 1442
        concat fields_for(:parent_post, @post) { |parent_fields|
          concat parent_fields.check_box(:secret)
        }
      end
1443 1444
    end

1445
    expected =
W
wycats 已提交
1446 1447
      "<form accept-charset='UTF-8' action='http://www.example.com' id='create-post' method='post'>" +
      snowman +
1448 1449 1450
      "<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]' type='hidden' value='0' />" +
1451
      "<input name='parent_post[secret]' checked='checked' type='checkbox' id='parent_post_secret' value='1' />" +
1452 1453
      "</form>"

1454
    assert_dom_equal expected, output_buffer
1455
  end
1456

1457
  def test_form_for_and_fields_for_with_object
1458 1459 1460 1461
    assert_deprecated do
      form_for(:post, @post, :html => { :id => 'create-post' }) do |post_form|
        concat post_form.text_field(:title)
        concat post_form.text_area(:body)
1462

1463 1464 1465 1466
        concat post_form.fields_for(@comment) { |comment_fields|
          concat comment_fields.text_field(:name)
        }
      end
1467 1468
    end

1469
    expected =
W
wycats 已提交
1470 1471 1472 1473 1474
      whole_form("http://www.example.com", "create-post") do
        "<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[comment][name]' type='text' id='post_comment_name' value='new comment' size='30' />"
      end
1475

1476
    assert_dom_equal expected, output_buffer
1477 1478
  end

1479
  class LabelledFormBuilder < ActionView::Helpers::FormBuilder
1480
    (field_helpers - %w(hidden_field)).each do |selector|
1481
      class_eval <<-RUBY_EVAL, __FILE__, __LINE__ + 1
1482
        def #{selector}(field, *args, &proc)
1483
          ("<label for='\#{field}'>\#{field.to_s.humanize}:</label> " + super + "<br/>").html_safe
1484
        end
1485
      RUBY_EVAL
1486 1487
    end
  end
1488

1489
  def test_form_for_with_labelled_builder
1490 1491 1492 1493 1494 1495
    assert_deprecated do
      form_for(:post, @post, :builder => LabelledFormBuilder) do |f|
        concat f.text_field(:title)
        concat f.text_area(:body)
        concat f.check_box(:secret)
      end
1496 1497
    end

W
wycats 已提交
1498 1499 1500 1501 1502
    expected =  whole_form do
        "<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]' type='hidden' value='0' /><input name='post[secret]' checked='checked' type='checkbox' id='post_secret' value='1' /><br/>"
      end
1503

1504
    assert_dom_equal expected, output_buffer
1505
  end
1506

W
wycats 已提交
1507 1508
  def snowman(method = nil)
    txt =  %{<div style="margin:0;padding:0;display:inline">}
1509
    txt << %{<input name="_snowman" type="hidden" value="&#9731;" />}
W
wycats 已提交
1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533
    txt << %{<input name="_method" type="hidden" value="#{method}" />} if method
    txt << %{</div>}
  end

  def form_text(action = "http://www.example.com", id = nil, html_class = nil, remote = nil)
    txt =  %{<form accept-charset="UTF-8" action="#{action}"}
    txt << %{ data-remote="true"} if remote
    txt << %{ class="#{html_class}"} if html_class
    txt << %{ id="#{id}"} if id
    txt << %{ method="post">}
  end

  def whole_form(action = "http://www.example.com", id = nil, html_class = nil, options = nil)
    contents = block_given? ? yield : ""

    if options.is_a?(Hash)
      method, remote = options.values_at(:method, :remote)
    else
      method = options
    end

    form_text(action, id, html_class, remote) + snowman(method) + contents + "</form>"
  end

1534
  def test_default_form_builder
1535 1536
    old_default_form_builder, ActionView::Base.default_form_builder =
      ActionView::Base.default_form_builder, LabelledFormBuilder
1537

1538 1539 1540 1541 1542 1543
    assert_deprecated do
      form_for(:post, @post) do |f|
        concat f.text_field(:title)
        concat f.text_area(:body)
        concat f.check_box(:secret)
      end
1544 1545
    end

W
wycats 已提交
1546
    expected =  whole_form do
1547 1548
      "<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/>" +
W
wycats 已提交
1549 1550
      "<label for='secret'>Secret:</label> <input name='post[secret]' type='hidden' value='0' /><input name='post[secret]' checked='checked' type='checkbox' id='post_secret' value='1' /><br/>"
    end
1551

1552
    assert_dom_equal expected, output_buffer
1553
  ensure
1554
    ActionView::Base.default_form_builder = old_default_form_builder
1555
  end
1556

1557
  def test_fields_for_with_labelled_builder
W
wycats 已提交
1558
    output_buffer = fields_for(:post, @post, :builder => LabelledFormBuilder) do |f|
1559 1560 1561
      concat f.text_field(:title)
      concat f.text_area(:body)
      concat f.check_box(:secret)
1562
    end
1563 1564

    expected =
1565 1566
      "<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/>" +
1567
      "<label for='secret'>Secret:</label> <input name='post[secret]' type='hidden' value='0' /><input name='post[secret]' checked='checked' type='checkbox' id='post_secret' value='1' /><br/>"
1568

1569
    assert_dom_equal expected, output_buffer
1570
  end
1571

1572 1573 1574
  def test_form_for_with_labelled_builder_with_nested_fields_for_without_options_hash
    klass = nil

1575 1576 1577 1578 1579 1580
    assert_deprecated do
      form_for(:post, @post, :builder => LabelledFormBuilder) do |f|
        f.fields_for(:comments, Comment.new) do |nested_fields|
          klass = nested_fields.class
          ''
        end
1581 1582 1583 1584 1585 1586 1587 1588 1589
      end
    end

    assert_equal LabelledFormBuilder, klass
  end

  def test_form_for_with_labelled_builder_with_nested_fields_for_with_options_hash
    klass = nil

1590 1591 1592 1593 1594 1595
    assert_deprecated do
      form_for(:post, @post, :builder => LabelledFormBuilder) do |f|
        f.fields_for(:comments, Comment.new, :index => 'foo') do |nested_fields|
          klass = nested_fields.class
          ''
        end
1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606
      end
    end

    assert_equal LabelledFormBuilder, klass
  end

  class LabelledFormBuilderSubclass < LabelledFormBuilder; end

  def test_form_for_with_labelled_builder_with_nested_fields_for_with_custom_builder
    klass = nil

1607 1608 1609 1610 1611 1612
    assert_deprecated do
      form_for(:post, @post, :builder => LabelledFormBuilder) do |f|
        f.fields_for(:comments, Comment.new, :builder => LabelledFormBuilderSubclass) do |nested_fields|
          klass = nested_fields.class
          ''
        end
1613 1614 1615 1616 1617 1618
      end
    end

    assert_equal LabelledFormBuilderSubclass, klass
  end

1619
  def test_form_for_with_html_options_adds_options_to_form_tag
1620 1621 1622
    assert_deprecated do
      form_for(:post, @post, :html => {:id => 'some_form', :class => 'some_class'}) do |f| end
    end
W
wycats 已提交
1623
    expected = whole_form("http://www.example.com", "some_form", "some_class")
1624

1625
    assert_dom_equal expected, output_buffer
1626
  end
1627

1628
  def test_form_for_with_string_url_option
1629 1630 1631
    assert_deprecated do
      form_for(:post, @post, :url => 'http://www.otherdomain.com') do |f| end
    end
1632

W
wycats 已提交
1633 1634
    assert_equal whole_form("http://www.otherdomain.com"), output_buffer
    # assert_equal '<form action="http://www.otherdomain.com" method="post"></form>', output_buffer
1635 1636 1637
  end

  def test_form_for_with_hash_url_option
1638 1639 1640
    assert_deprecated do
      form_for(:post, @post, :url => {:controller => 'controller', :action => 'action'}) do |f| end
    end
1641

1642 1643
    assert_equal 'controller', @url_for_options[:controller]
    assert_equal 'action', @url_for_options[:action]
1644
  end
1645

1646
  def test_form_for_with_record_url_option
1647 1648 1649
    assert_deprecated do
      form_for(:post, @post, :url => @post) do |f| end
    end
1650

W
wycats 已提交
1651 1652
    expected = whole_form("/posts/123")
    # expected = "<form action=\"/posts/123\" method=\"post\"></form>"
1653
    assert_equal expected, output_buffer
1654 1655 1656 1657 1658
  end

  def test_form_for_with_existing_object
    form_for(@post) do |f| end

W
wycats 已提交
1659
    expected = whole_form("/posts/123", "edit_post_123", "edit_post", "put")
1660
    assert_equal expected, output_buffer
1661 1662 1663 1664
  end

  def test_form_for_with_new_object
    post = Post.new
1665
    post.persisted = false
1666 1667 1668 1669
    def post.id() nil end

    form_for(post) do |f| end

W
wycats 已提交
1670
    expected = whole_form("/posts", "new_post", "new_post")
1671
    assert_equal expected, output_buffer
1672 1673
  end

1674 1675 1676 1677
  def test_form_for_with_existing_object_in_list
    @comment.save
    form_for([@post, @comment]) {}

W
wycats 已提交
1678
    expected = whole_form(comment_path(@post, @comment), "edit_comment_1", "edit_comment", "put")
1679
    assert_dom_equal expected, output_buffer
1680 1681 1682 1683 1684
  end

  def test_form_for_with_new_object_in_list
    form_for([@post, @comment]) {}

W
wycats 已提交
1685
    expected = whole_form(comments_path(@post), "new_comment", "new_comment")
1686
    assert_dom_equal expected, output_buffer
1687 1688
  end

1689 1690 1691
  def test_form_for_with_existing_object_and_namespace_in_list
    @comment.save
    form_for([:admin, @post, @comment]) {}
1692

W
wycats 已提交
1693
    expected = whole_form(admin_comment_path(@post, @comment), "edit_comment_1", "edit_comment", "put")
1694
    assert_dom_equal expected, output_buffer
1695
  end
1696

1697 1698
  def test_form_for_with_new_object_and_namespace_in_list
    form_for([:admin, @post, @comment]) {}
1699

W
wycats 已提交
1700
    expected = whole_form(admin_comments_path(@post), "new_comment", "new_comment")
1701
    assert_dom_equal expected, output_buffer
1702 1703
  end

1704 1705 1706
  def test_form_for_with_existing_object_and_custom_url
    form_for(@post, :url => "/super_posts") do |f| end

W
wycats 已提交
1707
    expected = whole_form("/super_posts", "edit_post_123", "edit_post", "put")
1708
    assert_equal expected, output_buffer
1709
  end
1710

1711 1712 1713 1714 1715
  def test_fields_for_returns_block_result
    output = fields_for(Post.new) { |f| "fields" }
    assert_equal "fields", output
  end

1716
  protected
1717 1718 1719
    def comments_path(post)
      "/posts/#{post.id}/comments"
    end
1720
    alias_method :post_comments_path, :comments_path
1721 1722 1723 1724

    def comment_path(post, comment)
      "/posts/#{post.id}/comments/#{comment.id}"
    end
1725
    alias_method :post_comment_path, :comment_path
1726

1727 1728 1729 1730
    def admin_comments_path(post)
      "/admin/posts/#{post.id}/comments"
    end
    alias_method :admin_post_comments_path, :admin_comments_path
1731

1732 1733 1734 1735
    def admin_comment_path(post, comment)
      "/admin/posts/#{post.id}/comments/#{comment.id}"
    end
    alias_method :admin_post_comment_path, :admin_comment_path
1736

1737 1738
    def posts_path
      "/posts"
1739 1740
    end

1741 1742
    def post_path(post)
      "/posts/#{post.id}"
1743
    end
1744 1745 1746

    def protect_against_forgery?
      false
1747
    end
1748
end