form_helper_test.rb 66.9 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
  def test_label_with_locales_and_options
    old_locale, I18n.locale = I18n.locale, :label
    assert_dom_equal('<label for="post_body" class="post_body">Write entire text here</label>', label(:post, :body, :class => 'post_body'))
  ensure
    I18n.locale = old_locale
  end

130 131 132 133 134 135 136 137
  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

138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153
  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

154 155 156 157 158
  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 已提交
159 160 161 162
  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 已提交
163
  def test_text_field
164
    assert_dom_equal(
D
Initial  
David Heinemeier Hansson 已提交
165 166
      '<input id="post_title" name="post[title]" size="30" type="text" value="Hello World" />', text_field("post", "title")
    )
167
    assert_dom_equal(
D
Initial  
David Heinemeier Hansson 已提交
168 169
      '<input id="post_title" name="post[title]" size="30" type="password" value="Hello World" />', password_field("post", "title")
    )
170
    assert_dom_equal(
171
      '<input id="person_name" name="person[name]" size="30" type="password" />', password_field("person", "name")
D
Initial  
David Heinemeier Hansson 已提交
172 173 174 175 176
    )
  end

  def test_text_field_with_escapes
    @post.title = "<b>Hello World</b>"
177
    assert_dom_equal(
D
Initial  
David Heinemeier Hansson 已提交
178 179 180 181
      '<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

182 183 184 185 186 187 188 189
  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 已提交
190
  def test_text_field_with_options
191
    expected = '<input id="post_title" name="post[title]" size="35" type="text" value="Hello World" />'
192 193
    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 已提交
194
  end
195

D
Initial  
David Heinemeier Hansson 已提交
196
  def test_text_field_assuming_size
197
    expected = '<input id="post_title" maxlength="35" name="post[title]" size="35" type="text" value="Hello World" />'
198 199
    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 已提交
200
  end
201

202 203 204 205 206 207
  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

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

213 214 215 216 217 218 219
  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

220 221 222 223 224
  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

225 226 227
  def test_hidden_field
    assert_dom_equal '<input id="post_title" name="post[title]" type="hidden" value="Hello World" />',
      hidden_field("post", "title")
228 229
      assert_dom_equal '<input id="post_secret" name="post[secret]" type="hidden" value="1" />',
        hidden_field("post", "secret?")
230 231 232 233 234 235 236 237
  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

238 239 240 241 242
  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

243 244 245 246 247
  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

248 249 250 251 252
  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

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

    @post.secret = ['0']
    assert_dom_equal(
286
      '<input name="post[secret]" type="hidden" value="0" /><input id="post_secret" name="post[secret]" type="checkbox" value="1" />',
287 288 289 290
      check_box("post", "secret")
    )
    @post.secret = ['1']
    assert_dom_equal(
291
      '<input name="post[secret]" type="hidden" value="0" /><input checked="checked" id="post_secret" name="post[secret]" type="checkbox" value="1" />',
292 293
      check_box("post", "secret")
    )
D
Initial  
David Heinemeier Hansson 已提交
294
  end
295

296 297
  def test_check_box_with_explicit_checked_and_unchecked_values
    @post.secret = "on"
298
    assert_dom_equal(
299
      '<input name="post[secret]" type="hidden" value="off" /><input checked="checked" id="post_secret" name="post[secret]" type="checkbox" value="on" />',
300 301 302
      check_box("post", "secret", {}, "on", "off")
    )
  end
303

304 305 306 307 308 309 310 311 312 313 314 315 316
  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


317 318
  def test_checkbox_disabled_still_submits_checked_value
    assert_dom_equal(
319
      '<input name="post[secret]" type="hidden" value="1" /><input checked="checked" disabled="disabled" id="post_secret" name="post[secret]" type="checkbox" value="1" />',
320 321 322 323
      check_box("post", "secret", { :disabled => :true })
    )
  end

324
  def test_radio_button
325
    assert_dom_equal('<input checked="checked" id="post_title_hello_world" name="post[title]" type="radio" value="Hello World" />',
326
      radio_button("post", "title", "Hello World")
327
    )
328
    assert_dom_equal('<input id="post_title_goodbye_world" name="post[title]" type="radio" value="Goodbye World" />',
329
      radio_button("post", "title", "Goodbye World")
330
    )
331 332 333
    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")
    )
334
  end
335

336 337 338 339 340
  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
341

N
Neeraj Singh 已提交
342 343 344 345 346
  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

347 348 349 350 351
  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
352

353 354 355 356 357 358 359 360 361 362
  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 已提交
363
  def test_text_area
364
    assert_dom_equal(
365
      '<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 已提交
366 367 368
      text_area("post", "body")
    )
  end
369

D
Initial  
David Heinemeier Hansson 已提交
370 371
  def test_text_area_with_escapes
    @post.body        = "Back to <i>the</i> hill and over it again!"
372
    assert_dom_equal(
373
      '<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 已提交
374 375 376
      text_area("post", "body")
    )
  end
377

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

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

393 394 395 396 397 398
  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
399

400
  def test_search_field
401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429
    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 已提交
430
  def test_explicit_name
431
    assert_dom_equal(
D
Initial  
David Heinemeier Hansson 已提交
432
      '<input id="post_title" name="dont guess" size="30" type="text" value="Hello World" />', text_field("post", "title", "name" => "dont guess")
433
    )
434
    assert_dom_equal(
435
      '<textarea cols="40" id="post_body" name="really!" rows="20">Back to the hill and over it again!</textarea>',
D
Initial  
David Heinemeier Hansson 已提交
436 437
      text_area("post", "body", "name" => "really!")
    )
438
    assert_dom_equal(
439
      '<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 已提交
440 441
      check_box("post", "secret", "name" => "i mean it")
    )
442
    assert_dom_equal text_field("post", "title", "name" => "dont guess"),
443
                 text_field("post", "title", :name => "dont guess")
444
    assert_dom_equal text_area("post", "body", "name" => "really!"),
445
                 text_area("post", "body", :name => "really!")
446
    assert_dom_equal check_box("post", "secret", "name" => "i mean it"),
447
                 check_box("post", "secret", :name => "i mean it")
D
Initial  
David Heinemeier Hansson 已提交
448
  end
449

D
Initial  
David Heinemeier Hansson 已提交
450
  def test_explicit_id
451
    assert_dom_equal(
D
Initial  
David Heinemeier Hansson 已提交
452
      '<input id="dont guess" name="post[title]" size="30" type="text" value="Hello World" />', text_field("post", "title", "id" => "dont guess")
453
    )
454
    assert_dom_equal(
455
      '<textarea cols="40" id="really!" name="post[body]" rows="20">Back to the hill and over it again!</textarea>',
D
Initial  
David Heinemeier Hansson 已提交
456 457
      text_area("post", "body", "id" => "really!")
    )
458
    assert_dom_equal(
459
      '<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 已提交
460 461
      check_box("post", "secret", "id" => "i mean it")
    )
462
    assert_dom_equal text_field("post", "title", "id" => "dont guess"),
463
                 text_field("post", "title", :id => "dont guess")
464
    assert_dom_equal text_area("post", "body", "id" => "really!"),
465
                 text_area("post", "body", :id => "really!")
466
    assert_dom_equal check_box("post", "secret", "id" => "i mean it"),
467
                 check_box("post", "secret", :id => "i mean it")
D
Initial  
David Heinemeier Hansson 已提交
468
  end
469

470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495
  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)
496 497
    assert_dom_equal radio_button("post", "secret", "0", "id" => nil),
                 radio_button("post", "secret", "0", :id => nil)
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 547 548 549 550 551 552 553
  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

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

580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602
  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

603
  def test_form_for
604 605
    assert_deprecated do
      form_for(:post, @post, :html => { :id => 'create-post' }) do |f|
S
Stephen Celis 已提交
606
        concat f.label(:title) { "The Title" }
607 608 609 610 611
        concat f.text_field(:title)
        concat f.text_area(:body)
        concat f.check_box(:secret)
        concat f.submit('Create post')
      end
612 613
    end

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

625
    assert_dom_equal expected, output_buffer
626 627
  end

628
  def test_form_for_with_symbol_object_name
629
    form_for(@post, :as => "other_name", :html => { :id => 'create-post' }) do |f|
630
      concat f.label(:title, :class => 'post_title')
631 632 633
      concat f.text_field(:title)
      concat f.text_area(:body)
      concat f.check_box(:secret)
634 635 636
      concat f.submit('Create post')
    end

W
wycats 已提交
637
    expected =  whole_form("/posts/123", "create-post", "other_name_edit", :method => "put") do
638
      "<label for='other_name_title' class='post_title'>Title</label>" +
639 640 641
      "<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 已提交
642
      "<input name='other_name[secret]' checked='checked' id='other_name_secret' value='1' type='checkbox' />" +
W
wycats 已提交
643 644
      "<input name='commit' id='other_name_submit' value='Create post' type='submit' />"
    end
645 646 647 648 649 650 651 652 653 654 655

    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
656 657
    end

W
wycats 已提交
658
    expected =  whole_form("http://www.example.com", "create-post", nil, "put") do
659 660
      "<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>" +
661
      "<input name='post[secret]' type='hidden' value='0' />" +
W
wycats 已提交
662 663
      "<input name='post[secret]' checked='checked' type='checkbox' id='post_secret' value='1' />"
    end
664

665
    assert_dom_equal expected, output_buffer
666 667
  end

668
  def test_form_for_with_remote
669 670 671 672 673 674
    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
675 676
    end

W
wycats 已提交
677
    expected =  whole_form("http://www.example.com", "create-post", nil, :method => "put", :remote => true) do
678 679 680
      "<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 已提交
681 682
      "<input name='post[secret]' checked='checked' type='checkbox' id='post_secret' value='1' />"
    end
683 684 685 686

    assert_dom_equal expected, output_buffer
  end

687 688 689 690 691 692 693 694 695
  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 已提交
696
    expected =  whole_form("http://www.example.com", nil, nil, :remote => true) do
697 698 699
      "<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 已提交
700 701
      "<input name='post[secret]' checked='checked' type='checkbox' id='post_secret' value='1' />"
    end
702 703 704 705

    assert_dom_equal expected, output_buffer
  end

706
  def test_form_for_without_object
707 708 709 710
    form_for(:post, :html => { :id => 'create-post' }) do |f|
      concat f.text_field(:title)
      concat f.text_area(:body)
      concat f.check_box(:secret)
711 712
    end

W
wycats 已提交
713
    expected =  whole_form("http://www.example.com", "create-post") do
714 715 716
      "<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 已提交
717 718
      "<input name='post[secret]' checked='checked' type='checkbox' id='post_secret' value='1' />"
    end
719

720
    assert_dom_equal expected, output_buffer
721
  end
722

723
  def test_form_for_with_index
724 725 726 727 728 729 730
    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
731
    end
732

W
wycats 已提交
733
    expected = whole_form do
734
      "<label for='post_123_title'>Title</label>" +
735 736
      "<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>" +
737
      "<input name='post[123][secret]' type='hidden' value='0' />" +
W
wycats 已提交
738 739
      "<input name='post[123][secret]' checked='checked' type='checkbox' id='post_123_secret' value='1' />"
    end
740

741
    assert_dom_equal expected, output_buffer
742 743
  end

744
  def test_form_for_with_nil_index_option_override
745 746 747 748 749 750
    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
751 752
    end

W
wycats 已提交
753
    expected = whole_form do
754 755 756
      "<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 已提交
757 758
      "<input name='post[][secret]' checked='checked' type='checkbox' id='post__secret' value='1' />"
    end
759

760
    assert_dom_equal expected, output_buffer
761 762
  end

763 764 765
  def test_submit_with_object_as_new_record_and_locale_strings
    old_locale, I18n.locale = I18n.locale, :submit

766
    @post.persisted = false
767 768 769 770
    assert_deprecated do
      form_for(:post, @post) do |f|
        concat f.submit
      end
771 772
    end

W
wycats 已提交
773 774 775 776
    expected =  whole_form do
                  "<input name='commit' id='post_submit' type='submit' value='Create Post' />"
                end

777 778 779 780 781 782 783 784
    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

785 786 787 788
    assert_deprecated do
      form_for(:post, @post) do |f|
        concat f.submit
      end
789 790
    end

W
wycats 已提交
791 792 793 794
    expected =  whole_form do
                  "<input name='commit' id='post_submit' type='submit' value='Confirm Post changes' />"
                end

795 796 797 798 799 800 801 802
    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

803 804
    form_for(:post) do |f|
      concat f.submit :class => "extra"
805 806
    end

W
wycats 已提交
807 808 809 810
    expected =  whole_form do
                  "<input name='commit' class='extra' id='post_submit' type='submit' value='Save changes' />"
                end

811 812 813 814 815
    assert_dom_equal expected, output_buffer
  ensure
    I18n.locale = old_locale
  end

816 817 818
  def test_submit_with_object_and_nested_lookup
    old_locale, I18n.locale = I18n.locale, :submit

819 820 821 822
    assert_deprecated do
      form_for(:another_post, @post) do |f|
        concat f.submit
      end
823 824
    end

W
wycats 已提交
825 826 827 828
    expected =  whole_form do
                  "<input name='commit' id='another_post_submit' type='submit' value='Update your Post' />"
                end

829 830 831 832 833
    assert_dom_equal expected, output_buffer
  ensure
    I18n.locale = old_locale
  end

834
  def test_nested_fields_for
835 836 837 838 839 840
    assert_deprecated do
      form_for(:post, @post) do |f|
        concat f.fields_for(:comment, @post) { |c|
          concat c.text_field(:title)
        }
      end
841 842
    end

W
wycats 已提交
843 844 845
    expected =  whole_form do
                  "<input name='post[comment][title]' size='30' type='text' id='post_comment_title' value='Hello World' />"
                end
846

847
    assert_dom_equal expected, output_buffer
848
  end
849

850
  def test_nested_fields_for_with_nested_collections
851 852 853 854 855 856 857
    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
858 859
    end

W
wycats 已提交
860 861 862 863
    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
864 865 866 867

    assert_dom_equal expected, output_buffer
  end

868
  def test_nested_fields_for_with_index_and_parent_fields
869 870 871 872 873 874 875
    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
876 877
    end

W
wycats 已提交
878 879 880 881
    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
882 883 884 885

    assert_dom_equal expected, output_buffer
  end

886
  def test_form_for_with_index_and_nested_fields_for
887 888 889 890 891 892
    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
893 894
    end

W
wycats 已提交
895 896 897
    expected =  whole_form do
                  "<input name='post[1][comment][title]' size='30' type='text' id='post_1_comment_title' value='Hello World' />"
                end
898 899 900 901 902

    assert_dom_equal expected, output_buffer
  end

  def test_nested_fields_for_with_index_on_both
903 904 905 906 907 908
    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
909 910
    end

W
wycats 已提交
911 912 913
    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
914 915 916 917 918

    assert_dom_equal expected, output_buffer
  end

  def test_nested_fields_for_with_auto_index
919 920 921 922 923 924
    assert_deprecated do
      form_for("post[]", @post) do |f|
        concat f.fields_for(:comment, @post) { |c|
          concat c.text_field(:title)
        }
      end
925 926
    end

W
wycats 已提交
927 928 929
    expected =  whole_form do
                  "<input name='post[123][comment][title]' size='30' type='text' id='post_123_comment_title' value='Hello World' />"
                end
930 931 932 933

    assert_dom_equal expected, output_buffer
  end

934
  def test_nested_fields_for_with_index_radio_button
935 936 937 938 939 940
    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
941 942
    end

W
wycats 已提交
943 944 945
    expected =  whole_form do
                  "<input name='post[comment][5][title]' type='radio' id='post_comment_5_title_hello' value='hello' />"
                end
946 947 948 949

    assert_dom_equal expected, output_buffer
  end

950
  def test_nested_fields_for_with_auto_index_on_both
951 952 953 954 955 956
    assert_deprecated do
      form_for("post[]", @post) do |f|
        concat f.fields_for("comment[]", @post) { |c|
          concat c.text_field(:title)
        }
      end
957 958
    end

W
wycats 已提交
959 960 961
    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
962 963 964 965 966

    assert_dom_equal expected, output_buffer
  end

  def test_nested_fields_for_with_index_and_auto_index
967 968 969 970 971 972
    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
973

974 975 976 977 978
      output_buffer << form_for(:post, @post, :index => 1) do |f|
        concat f.fields_for("comment[]", @post) { |c|
          concat c.text_field(:title)
        }
      end
979

W
wycats 已提交
980 981 982 983 984
      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
985

986 987
      assert_dom_equal expected, output_buffer
    end
988 989
  end

990 991 992
  def test_nested_fields_for_with_a_new_record_on_a_nested_attributes_one_to_one_association
    @post.author = Author.new

993 994 995 996 997 998 999
    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
1000 1001
    end

W
wycats 已提交
1002 1003 1004 1005
    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
1006 1007 1008 1009

    assert_dom_equal expected, output_buffer
  end

1010
  def test_nested_fields_for_with_explicitly_passed_object_on_a_nested_attributes_one_to_one_association
1011 1012 1013 1014 1015 1016
    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
1017 1018 1019 1020
      end
    end
  end

1021 1022 1023
  def test_nested_fields_for_with_an_existing_record_on_a_nested_attributes_one_to_one_association
    @post.author = Author.new(321)

1024 1025 1026 1027 1028 1029 1030
    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
1031 1032
    end

W
wycats 已提交
1033 1034 1035 1036 1037
    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
1038 1039 1040

    assert_dom_equal expected, output_buffer
  end
1041

1042 1043 1044
  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)

1045 1046 1047 1048 1049 1050 1051 1052
    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
1053
    end
1054

W
wycats 已提交
1055 1056 1057 1058 1059
    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
1060 1061 1062 1063 1064 1065 1066

    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) }

1067 1068 1069 1070 1071 1072 1073 1074
    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
1075 1076 1077
      end
    end

W
wycats 已提交
1078 1079 1080 1081 1082 1083 1084
    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
1085 1086 1087 1088 1089 1090 1091

    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) }

1092 1093 1094 1095 1096 1097 1098 1099 1100
    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
1101 1102
      end
    end
1103

W
wycats 已提交
1104 1105 1106 1107 1108 1109 1110
    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
1111 1112 1113 1114 1115 1116 1117

    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]

1118 1119 1120 1121 1122 1123 1124 1125
    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
1126 1127 1128
      end
    end

W
wycats 已提交
1129 1130 1131 1132 1133
    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
1134 1135 1136 1137 1138 1139 1140

    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]

1141 1142 1143 1144 1145 1146 1147 1148
    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
1149 1150 1151
      end
    end

W
wycats 已提交
1152 1153 1154 1155 1156 1157
    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
1158 1159 1160 1161

    assert_dom_equal expected, output_buffer
  end

1162
  def test_nested_fields_for_with_an_empty_supplied_attributes_collection
1163 1164 1165 1166 1167 1168
    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
1169 1170 1171
      end
    end

W
wycats 已提交
1172 1173 1174
    expected =  whole_form do
                  '<input name="post[title]" size="30" type="text" id="post_title" value="Hello World" />'
                end
1175 1176 1177 1178 1179 1180 1181

    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) }

1182 1183 1184 1185 1186 1187 1188
    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
1189 1190
    end

W
wycats 已提交
1191 1192 1193 1194 1195 1196 1197
    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
1198 1199 1200 1201 1202 1203 1204 1205

    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 = []

1206 1207 1208 1209 1210 1211 1212
    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
1213 1214
    end

W
wycats 已提交
1215 1216 1217 1218 1219 1220 1221
    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
1222 1223 1224 1225

    assert_dom_equal expected, output_buffer
  end

1226 1227 1228 1229
  def test_nested_fields_for_on_a_nested_attributes_collection_association_yields_only_builder
    @post.comments = [Comment.new(321), Comment.new]
    yielded_comments = []

1230 1231 1232 1233 1234 1235 1236 1237
    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
1238 1239
    end

W
wycats 已提交
1240 1241 1242 1243 1244 1245
    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
1246 1247 1248 1249 1250

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

1251 1252 1253
  def test_nested_fields_for_with_child_index_option_override_on_a_nested_attributes_collection_association
    @post.comments = []

1254 1255 1256 1257 1258 1259
    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
1260 1261
    end

W
wycats 已提交
1262 1263 1264 1265
    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
1266 1267 1268 1269

    assert_dom_equal expected, output_buffer
  end

1270 1271 1272 1273 1274 1275
  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 = []
1276 1277 1278 1279 1280 1281 1282 1283

    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 已提交
1284
        }
1285 1286 1287 1288 1289
        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 已提交
1290
        }
1291 1292 1293 1294 1295
        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 已提交
1296
        }
1297
      end
1298 1299
    end

W
wycats 已提交
1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313
    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
1314 1315 1316 1317

    assert_dom_equal expected, output_buffer
  end

1318
  def test_fields_for
W
wycats 已提交
1319
    output_buffer = fields_for(:post, @post) do |f|
1320 1321 1322
      concat f.text_field(:title)
      concat f.text_area(:body)
      concat f.check_box(:secret)
1323 1324
    end

1325
    expected =
1326 1327
      "<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>" +
1328 1329
      "<input name='post[secret]' type='hidden' value='0' />" +
      "<input name='post[secret]' checked='checked' type='checkbox' id='post_secret' value='1' />"
1330

1331
    assert_dom_equal expected, output_buffer
1332 1333 1334
  end

  def test_fields_for_with_index
W
wycats 已提交
1335
    output_buffer = fields_for("post[]", @post) do |f|
1336 1337 1338
      concat f.text_field(:title)
      concat f.text_area(:body)
      concat f.check_box(:secret)
1339 1340 1341 1342 1343
    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>" +
1344 1345
      "<input name='post[123][secret]' type='hidden' value='0' />" +
      "<input name='post[123][secret]' checked='checked' type='checkbox' id='post_123_secret' value='1' />"
1346

1347
    assert_dom_equal expected, output_buffer
1348 1349 1350
  end

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

1363
    assert_dom_equal expected, output_buffer
1364 1365 1366
  end

  def test_fields_for_with_index_option_override
W
wycats 已提交
1367
    output_buffer = fields_for("post[]", @post, :index => "abc") do |f|
1368 1369 1370
      concat f.text_field(:title)
      concat f.text_area(:body)
      concat f.check_box(:secret)
1371 1372 1373 1374 1375
    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>" +
1376 1377
      "<input name='post[abc][secret]' type='hidden' value='0' />" +
      "<input name='post[abc][secret]' checked='checked' type='checkbox' id='post_abc_secret' value='1' />"
1378

1379
    assert_dom_equal expected, output_buffer
1380
  end
1381 1382

  def test_fields_for_without_object
W
wycats 已提交
1383
    output_buffer = fields_for(:post) do |f|
1384 1385 1386
      concat f.text_field(:title)
      concat f.text_area(:body)
      concat f.check_box(:secret)
1387 1388
    end

1389
    expected =
1390 1391
      "<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>" +
1392 1393
      "<input name='post[secret]' type='hidden' value='0' />" +
      "<input name='post[secret]' checked='checked' type='checkbox' id='post_secret' value='1' />"
1394

1395
    assert_dom_equal expected, output_buffer
1396 1397 1398
  end

  def test_fields_for_with_only_object
W
wycats 已提交
1399
    output_buffer = fields_for(@post) do |f|
1400 1401 1402
      concat f.text_field(:title)
      concat f.text_area(:body)
      concat f.check_box(:secret)
1403 1404
    end

1405
    expected =
1406 1407
      "<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>" +
1408 1409
      "<input name='post[secret]' type='hidden' value='0' />" +
      "<input name='post[secret]' checked='checked' type='checkbox' id='post_secret' value='1' />"
1410

1411
    assert_dom_equal expected, output_buffer
1412 1413
  end

1414
  def test_fields_for_object_with_bracketed_name
W
wycats 已提交
1415
    output_buffer = fields_for("author[post]", @post) do |f|
1416 1417
      concat f.label(:title)
      concat f.text_field(:title)
1418 1419
    end

1420 1421
    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' />",
1422
      output_buffer
1423 1424
  end

1425
  def test_fields_for_object_with_bracketed_name_and_index
W
wycats 已提交
1426
    output_buffer = fields_for("author[post]", @post, :index => 1) do |f|
1427 1428
      concat f.label(:title)
      concat f.text_field(:title)
1429 1430 1431 1432
    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' />",
1433
      output_buffer
1434 1435
  end

1436 1437 1438
  def test_form_builder_does_not_have_form_for_method
    assert ! ActionView::Helpers::FormBuilder.instance_methods.include?('form_for')
  end
1439

1440
  def test_form_for_and_fields_for
1441 1442 1443 1444
    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)
1445

1446 1447 1448 1449
        concat fields_for(:parent_post, @post) { |parent_fields|
          concat parent_fields.check_box(:secret)
        }
      end
1450 1451
    end

1452
    expected =
W
wycats 已提交
1453 1454
      "<form accept-charset='UTF-8' action='http://www.example.com' id='create-post' method='post'>" +
      snowman +
1455 1456 1457
      "<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' />" +
1458
      "<input name='parent_post[secret]' checked='checked' type='checkbox' id='parent_post_secret' value='1' />" +
1459 1460
      "</form>"

1461
    assert_dom_equal expected, output_buffer
1462
  end
1463

1464
  def test_form_for_and_fields_for_with_object
1465 1466 1467 1468
    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)
1469

1470 1471 1472 1473
        concat post_form.fields_for(@comment) { |comment_fields|
          concat comment_fields.text_field(:name)
        }
      end
1474 1475
    end

1476
    expected =
W
wycats 已提交
1477 1478 1479 1480 1481
      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
1482

1483
    assert_dom_equal expected, output_buffer
1484 1485
  end

1486
  class LabelledFormBuilder < ActionView::Helpers::FormBuilder
1487
    (field_helpers - %w(hidden_field)).each do |selector|
1488
      class_eval <<-RUBY_EVAL, __FILE__, __LINE__ + 1
1489
        def #{selector}(field, *args, &proc)
1490
          ("<label for='\#{field}'>\#{field.to_s.humanize}:</label> " + super + "<br/>").html_safe
1491
        end
1492
      RUBY_EVAL
1493 1494
    end
  end
1495

1496
  def test_form_for_with_labelled_builder
1497 1498 1499 1500 1501 1502
    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
1503 1504
    end

W
wycats 已提交
1505 1506 1507 1508 1509
    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
1510

1511
    assert_dom_equal expected, output_buffer
1512
  end
1513

W
wycats 已提交
1514 1515
  def snowman(method = nil)
    txt =  %{<div style="margin:0;padding:0;display:inline">}
J
Jeremy Kemper 已提交
1516
    txt << %{<input name="_utf8" type="hidden" value="&#9731;" />}
W
wycats 已提交
1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540
    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

1541
  def test_default_form_builder
1542 1543
    old_default_form_builder, ActionView::Base.default_form_builder =
      ActionView::Base.default_form_builder, LabelledFormBuilder
1544

1545 1546 1547 1548 1549 1550
    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
1551 1552
    end

W
wycats 已提交
1553
    expected =  whole_form do
1554 1555
      "<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 已提交
1556 1557
      "<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
1558

1559
    assert_dom_equal expected, output_buffer
1560
  ensure
1561
    ActionView::Base.default_form_builder = old_default_form_builder
1562
  end
1563

1564
  def test_fields_for_with_labelled_builder
W
wycats 已提交
1565
    output_buffer = fields_for(:post, @post, :builder => LabelledFormBuilder) do |f|
1566 1567 1568
      concat f.text_field(:title)
      concat f.text_area(:body)
      concat f.check_box(:secret)
1569
    end
1570 1571

    expected =
1572 1573
      "<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/>" +
1574
      "<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/>"
1575

1576
    assert_dom_equal expected, output_buffer
1577
  end
1578

1579 1580 1581
  def test_form_for_with_labelled_builder_with_nested_fields_for_without_options_hash
    klass = nil

1582 1583 1584 1585 1586 1587
    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
1588 1589 1590 1591 1592 1593 1594 1595 1596
      end
    end

    assert_equal LabelledFormBuilder, klass
  end

  def test_form_for_with_labelled_builder_with_nested_fields_for_with_options_hash
    klass = nil

1597 1598 1599 1600 1601 1602
    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
1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613
      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

1614 1615 1616 1617 1618 1619
    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
1620 1621 1622 1623 1624 1625
      end
    end

    assert_equal LabelledFormBuilderSubclass, klass
  end

1626
  def test_form_for_with_html_options_adds_options_to_form_tag
1627 1628 1629
    assert_deprecated do
      form_for(:post, @post, :html => {:id => 'some_form', :class => 'some_class'}) do |f| end
    end
W
wycats 已提交
1630
    expected = whole_form("http://www.example.com", "some_form", "some_class")
1631

1632
    assert_dom_equal expected, output_buffer
1633
  end
1634

1635
  def test_form_for_with_string_url_option
1636 1637 1638
    assert_deprecated do
      form_for(:post, @post, :url => 'http://www.otherdomain.com') do |f| end
    end
1639

W
wycats 已提交
1640 1641
    assert_equal whole_form("http://www.otherdomain.com"), output_buffer
    # assert_equal '<form action="http://www.otherdomain.com" method="post"></form>', output_buffer
1642 1643 1644
  end

  def test_form_for_with_hash_url_option
1645 1646 1647
    assert_deprecated do
      form_for(:post, @post, :url => {:controller => 'controller', :action => 'action'}) do |f| end
    end
1648

1649 1650
    assert_equal 'controller', @url_for_options[:controller]
    assert_equal 'action', @url_for_options[:action]
1651
  end
1652

1653
  def test_form_for_with_record_url_option
1654 1655 1656
    assert_deprecated do
      form_for(:post, @post, :url => @post) do |f| end
    end
1657

W
wycats 已提交
1658 1659
    expected = whole_form("/posts/123")
    # expected = "<form action=\"/posts/123\" method=\"post\"></form>"
1660
    assert_equal expected, output_buffer
1661 1662 1663 1664 1665
  end

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

W
wycats 已提交
1666
    expected = whole_form("/posts/123", "edit_post_123", "edit_post", "put")
1667
    assert_equal expected, output_buffer
1668 1669 1670 1671
  end

  def test_form_for_with_new_object
    post = Post.new
1672
    post.persisted = false
1673 1674 1675 1676
    def post.id() nil end

    form_for(post) do |f| end

W
wycats 已提交
1677
    expected = whole_form("/posts", "new_post", "new_post")
1678
    assert_equal expected, output_buffer
1679 1680
  end

1681 1682 1683 1684
  def test_form_for_with_existing_object_in_list
    @comment.save
    form_for([@post, @comment]) {}

W
wycats 已提交
1685
    expected = whole_form(comment_path(@post, @comment), "edit_comment_1", "edit_comment", "put")
1686
    assert_dom_equal expected, output_buffer
1687 1688 1689 1690 1691
  end

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

W
wycats 已提交
1692
    expected = whole_form(comments_path(@post), "new_comment", "new_comment")
1693
    assert_dom_equal expected, output_buffer
1694 1695
  end

1696 1697 1698
  def test_form_for_with_existing_object_and_namespace_in_list
    @comment.save
    form_for([:admin, @post, @comment]) {}
1699

W
wycats 已提交
1700
    expected = whole_form(admin_comment_path(@post, @comment), "edit_comment_1", "edit_comment", "put")
1701
    assert_dom_equal expected, output_buffer
1702
  end
1703

1704 1705
  def test_form_for_with_new_object_and_namespace_in_list
    form_for([:admin, @post, @comment]) {}
1706

W
wycats 已提交
1707
    expected = whole_form(admin_comments_path(@post), "new_comment", "new_comment")
1708
    assert_dom_equal expected, output_buffer
1709 1710
  end

1711 1712 1713
  def test_form_for_with_existing_object_and_custom_url
    form_for(@post, :url => "/super_posts") do |f| end

W
wycats 已提交
1714
    expected = whole_form("/super_posts", "edit_post_123", "edit_post", "put")
1715
    assert_equal expected, output_buffer
1716
  end
1717

1718 1719 1720 1721 1722
  def test_fields_for_returns_block_result
    output = fields_for(Post.new) { |f| "fields" }
    assert_equal "fields", output
  end

1723
  protected
1724 1725 1726
    def comments_path(post)
      "/posts/#{post.id}/comments"
    end
1727
    alias_method :post_comments_path, :comments_path
1728 1729 1730 1731

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

1734 1735 1736 1737
    def admin_comments_path(post)
      "/admin/posts/#{post.id}/comments"
    end
    alias_method :admin_post_comments_path, :admin_comments_path
1738

1739 1740 1741 1742
    def admin_comment_path(post, comment)
      "/admin/posts/#{post.id}/comments/#{comment.id}"
    end
    alias_method :admin_post_comment_path, :admin_comment_path
1743

1744 1745
    def posts_path
      "/posts"
1746 1747
    end

1748 1749
    def post_path(post)
      "/posts/#{post.id}"
1750
    end
1751 1752 1753

    def protect_against_forgery?
      false
1754
    end
1755
end