form_helper_test.rb 61.7 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

W
wycats 已提交
7 8 9 10
  def form_for(*)
    @output_buffer = super
  end

D
Initial  
David Heinemeier Hansson 已提交
11
  def setup
12
    super
13 14 15 16 17 18 19 20 21 22

    # Create "label" locale for testing I18n label helpers
    I18n.backend.store_translations 'label', {
      :activemodel => {
        :attributes => {
          :post => {
            :cost => "Total cost"
          }
        }
      },
23 24
      :helpers => {
        :label => {
25 26 27 28 29 30 31
          :post => {
            :body => "Write entire text here"
          }
        }
      }
    }

32 33 34 35
    # Create "submit" locale for testing I18n submit helpers
    I18n.backend.store_translations 'submit', {
      :helpers => {
        :submit => {
36 37
          :create => 'Create %{model}',
          :update => 'Confirm %{model} changes',
38 39
          :submit => 'Save changes',
          :another_post => {
40
            :update => 'Update your %{model}'
41
          }
42 43 44 45
        }
      }
    }

46
    @post = Post.new
47
    @comment = Comment.new
48 49
    def @post.errors()
      Class.new{
50
        def [](field); field == "author_name" ? ["can't be empty"] : [] end
51
        def empty?() false end
52
        def count() 1 end
53 54
        def full_messages() [ "Author name can't be empty" ] end
      }.new
55
    end
56
    def @post.id; 123; end
57
    def @post.id_before_type_cast; 123; end
58
    def @post.to_param; '123'; end
59

60
    @post.persisted   = true
D
Initial  
David Heinemeier Hansson 已提交
61 62 63 64 65
    @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)
66
  end
67

68 69 70 71 72 73
  def url_for(object)
    @url_for_options = object
    if object.is_a?(Hash)
      "http://www.example.com"
    else
      super
74
    end
D
Initial  
David Heinemeier Hansson 已提交
75 76
  end

77 78 79 80 81 82 83
  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')
    )
84
    assert_dom_equal('<label for="post_secret">Secret?</label>', label("post", "secret?"))
85
  end
86

87 88
  def test_label_with_symbols
    assert_dom_equal('<label for="post_title">Title</label>', label(:post, :title))
89
    assert_dom_equal('<label for="post_secret">Secret?</label>', label(:post, :secret?))
90 91
  end

92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112
  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

113 114 115 116 117 118 119 120
  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

121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136
  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

137 138 139 140 141
  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 已提交
142 143 144 145
  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 已提交
146
  def test_text_field
147
    assert_dom_equal(
D
Initial  
David Heinemeier Hansson 已提交
148 149
      '<input id="post_title" name="post[title]" size="30" type="text" value="Hello World" />', text_field("post", "title")
    )
150
    assert_dom_equal(
D
Initial  
David Heinemeier Hansson 已提交
151 152
      '<input id="post_title" name="post[title]" size="30" type="password" value="Hello World" />', password_field("post", "title")
    )
153
    assert_dom_equal(
154
      '<input id="person_name" name="person[name]" size="30" type="password" />', password_field("person", "name")
D
Initial  
David Heinemeier Hansson 已提交
155 156 157 158 159
    )
  end

  def test_text_field_with_escapes
    @post.title = "<b>Hello World</b>"
160
    assert_dom_equal(
D
Initial  
David Heinemeier Hansson 已提交
161 162 163 164
      '<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

165 166 167 168 169 170 171 172
  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 已提交
173
  def test_text_field_with_options
174
    expected = '<input id="post_title" name="post[title]" size="35" type="text" value="Hello World" />'
175 176
    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 已提交
177
  end
178

D
Initial  
David Heinemeier Hansson 已提交
179
  def test_text_field_assuming_size
180
    expected = '<input id="post_title" maxlength="35" name="post[title]" size="35" type="text" value="Hello World" />'
181 182
    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 已提交
183
  end
184

185 186 187 188 189 190
  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

191 192 193 194 195 196 197
  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

198 199 200
  def test_hidden_field
    assert_dom_equal '<input id="post_title" name="post[title]" type="hidden" value="Hello World" />',
      hidden_field("post", "title")
201 202
      assert_dom_equal '<input id="post_secret" name="post[secret]" type="hidden" value="1" />',
        hidden_field("post", "secret?")
203 204 205 206 207 208 209 210 211 212 213 214 215
  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

  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

216 217 218 219 220
  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

D
Initial  
David Heinemeier Hansson 已提交
221
  def test_check_box
222
    assert_dom_equal(
223
      '<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 已提交
224 225 226
      check_box("post", "secret")
    )
    @post.secret = 0
227
    assert_dom_equal(
228
      '<input name="post[secret]" type="hidden" value="0" /><input id="post_secret" name="post[secret]" type="checkbox" value="1" />',
229
      check_box("post", "secret")
D
Initial  
David Heinemeier Hansson 已提交
230
    )
231
    assert_dom_equal(
232
      '<input name="post[secret]" type="hidden" value="0" /><input checked="checked" id="post_secret" name="post[secret]" type="checkbox" value="1" />',
233 234
      check_box("post", "secret" ,{"checked"=>"checked"})
    )
D
Initial  
David Heinemeier Hansson 已提交
235
    @post.secret = true
236
    assert_dom_equal(
237
      '<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 已提交
238 239
      check_box("post", "secret")
    )
240
    assert_dom_equal(
241
      '<input name="post[secret]" type="hidden" value="0" /><input checked="checked" id="post_secret" name="post[secret]" type="checkbox" value="1" />',
242 243
      check_box("post", "secret?")
    )
244 245 246

    @post.secret = ['0']
    assert_dom_equal(
247
      '<input name="post[secret]" type="hidden" value="0" /><input id="post_secret" name="post[secret]" type="checkbox" value="1" />',
248 249 250 251
      check_box("post", "secret")
    )
    @post.secret = ['1']
    assert_dom_equal(
252
      '<input name="post[secret]" type="hidden" value="0" /><input checked="checked" id="post_secret" name="post[secret]" type="checkbox" value="1" />',
253 254
      check_box("post", "secret")
    )
D
Initial  
David Heinemeier Hansson 已提交
255
  end
256

257 258
  def test_check_box_with_explicit_checked_and_unchecked_values
    @post.secret = "on"
259
    assert_dom_equal(
260
      '<input name="post[secret]" type="hidden" value="off" /><input checked="checked" id="post_secret" name="post[secret]" type="checkbox" value="on" />',
261 262 263
      check_box("post", "secret", {}, "on", "off")
    )
  end
264

265 266 267 268 269 270 271 272 273 274 275 276 277
  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


278 279
  def test_checkbox_disabled_still_submits_checked_value
    assert_dom_equal(
280
      '<input name="post[secret]" type="hidden" value="1" /><input checked="checked" disabled="disabled" id="post_secret" name="post[secret]" type="checkbox" value="1" />',
281 282 283 284
      check_box("post", "secret", { :disabled => :true })
    )
  end

285
  def test_radio_button
286
    assert_dom_equal('<input checked="checked" id="post_title_hello_world" name="post[title]" type="radio" value="Hello World" />',
287
      radio_button("post", "title", "Hello World")
288
    )
289
    assert_dom_equal('<input id="post_title_goodbye_world" name="post[title]" type="radio" value="Goodbye World" />',
290
      radio_button("post", "title", "Goodbye World")
291
    )
292 293 294
    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")
    )
295
  end
296

297 298 299 300 301
  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
302

303 304 305 306 307
  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
308

309 310 311 312 313 314 315 316 317 318
  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 已提交
319
  def test_text_area
320
    assert_dom_equal(
321
      '<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 已提交
322 323 324
      text_area("post", "body")
    )
  end
325

D
Initial  
David Heinemeier Hansson 已提交
326 327
  def test_text_area_with_escapes
    @post.body        = "Back to <i>the</i> hill and over it again!"
328
    assert_dom_equal(
329
      '<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 已提交
330 331 332
      text_area("post", "body")
    )
  end
333

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

341 342 343 344 345 346 347 348
  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

349 350 351 352 353 354
  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
355

356
  def test_search_field
357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385
    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 已提交
386
  def test_explicit_name
387
    assert_dom_equal(
D
Initial  
David Heinemeier Hansson 已提交
388
      '<input id="post_title" name="dont guess" size="30" type="text" value="Hello World" />', text_field("post", "title", "name" => "dont guess")
389
    )
390
    assert_dom_equal(
391
      '<textarea cols="40" id="post_body" name="really!" rows="20">Back to the hill and over it again!</textarea>',
D
Initial  
David Heinemeier Hansson 已提交
392 393
      text_area("post", "body", "name" => "really!")
    )
394
    assert_dom_equal(
395
      '<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 已提交
396 397
      check_box("post", "secret", "name" => "i mean it")
    )
398
    assert_dom_equal text_field("post", "title", "name" => "dont guess"),
399
                 text_field("post", "title", :name => "dont guess")
400
    assert_dom_equal text_area("post", "body", "name" => "really!"),
401
                 text_area("post", "body", :name => "really!")
402
    assert_dom_equal check_box("post", "secret", "name" => "i mean it"),
403
                 check_box("post", "secret", :name => "i mean it")
D
Initial  
David Heinemeier Hansson 已提交
404
  end
405

D
Initial  
David Heinemeier Hansson 已提交
406
  def test_explicit_id
407
    assert_dom_equal(
D
Initial  
David Heinemeier Hansson 已提交
408
      '<input id="dont guess" name="post[title]" size="30" type="text" value="Hello World" />', text_field("post", "title", "id" => "dont guess")
409
    )
410
    assert_dom_equal(
411
      '<textarea cols="40" id="really!" name="post[body]" rows="20">Back to the hill and over it again!</textarea>',
D
Initial  
David Heinemeier Hansson 已提交
412 413
      text_area("post", "body", "id" => "really!")
    )
414
    assert_dom_equal(
415
      '<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 已提交
416 417
      check_box("post", "secret", "id" => "i mean it")
    )
418
    assert_dom_equal text_field("post", "title", "id" => "dont guess"),
419
                 text_field("post", "title", :id => "dont guess")
420
    assert_dom_equal text_area("post", "body", "id" => "really!"),
421
                 text_area("post", "body", :id => "really!")
422
    assert_dom_equal check_box("post", "secret", "id" => "i mean it"),
423
                 check_box("post", "secret", :id => "i mean it")
D
Initial  
David Heinemeier Hansson 已提交
424
  end
425 426 427

  def test_auto_index
    pid = @post.id
428 429 430 431
    assert_dom_equal(
      "<label for=\"post_#{pid}_title\">Title</label>",
      label("post[]", "title")
    )
432
    assert_dom_equal(
433 434
      "<input id=\"post_#{pid}_title\" name=\"post[#{pid}][title]\" size=\"30\" type=\"text\" value=\"Hello World\" />", text_field("post[]","title")
    )
435
    assert_dom_equal(
436
      "<textarea cols=\"40\" id=\"post_#{pid}_body\" name=\"post[#{pid}][body]\" rows=\"20\">Back to the hill and over it again!</textarea>",
437 438
      text_area("post[]", "body")
    )
439
    assert_dom_equal(
440
      "<input name=\"post[#{pid}][secret]\" type=\"hidden\" value=\"0\" /><input checked=\"checked\" id=\"post_#{pid}_secret\" name=\"post[#{pid}][secret]\" type=\"checkbox\" value=\"1\" />",
441 442
      check_box("post[]", "secret")
    )
443
   assert_dom_equal(
444
"<input checked=\"checked\" id=\"post_#{pid}_title_hello_world\" name=\"post[#{pid}][title]\" type=\"radio\" value=\"Hello World\" />",
445 446
      radio_button("post[]", "title", "Hello World")
    )
447
    assert_dom_equal("<input id=\"post_#{pid}_title_goodbye_world\" name=\"post[#{pid}][title]\" type=\"radio\" value=\"Goodbye World\" />",
448 449 450
      radio_button("post[]", "title", "Goodbye World")
    )
  end
451 452

  def test_form_for
453 454
    assert_deprecated do
      form_for(:post, @post, :html => { :id => 'create-post' }) do |f|
S
Stephen Celis 已提交
455
        concat f.label(:title) { "The Title" }
456 457 458 459 460
        concat f.text_field(:title)
        concat f.text_area(:body)
        concat f.check_box(:secret)
        concat f.submit('Create post')
      end
461 462
    end

463
    expected =
464
      "<form action='http://www.example.com' id='create-post' method='post'>" +
S
Stephen Celis 已提交
465
      "<label for='post_title'>The Title</label>" +
466 467
      "<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>" +
468
      "<input name='post[secret]' type='hidden' value='0' />" +
469
      "<input name='post[secret]' checked='checked' type='checkbox' id='post_secret' value='1' />" +
470
      "<input name='commit' id='post_submit' type='submit' value='Create post' />" +
471 472
      "</form>"

473
    assert_dom_equal expected, output_buffer
474 475
  end

476
  def test_form_for_with_symbol_object_name
477
    form_for(@post, :as => "other_name", :html => { :id => 'create-post' }) do |f|
478
      concat f.label(:title)
479 480 481
      concat f.text_field(:title)
      concat f.text_area(:body)
      concat f.check_box(:secret)
482 483 484 485 486 487 488 489 490 491
      concat f.submit('Create post')
    end

    expected =
      "<form class='other_name_edit' method='post' action='/posts/123' id='create-post'>" +
      "<div style='margin:0;padding:0;display:inline'><input name='_method' value='put' type='hidden' /></div>" +
      "<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 已提交
492
      "<input name='other_name[secret]' checked='checked' id='other_name_secret' value='1' type='checkbox' />" +
493 494 495 496 497 498 499 500 501 502 503 504
      "<input name='commit' id='other_name_submit' value='Create post' type='submit' /></form>"

    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
505 506
    end

507
    expected =
508
      "<form action='http://www.example.com' id='create-post' method='post'>" +
509
      "<div style='margin:0;padding:0;display:inline'><input name='_method' type='hidden' value='put' /></div>" +
510 511
      "<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>" +
512
      "<input name='post[secret]' type='hidden' value='0' />" +
513
      "<input name='post[secret]' checked='checked' type='checkbox' id='post_secret' value='1' />" +
514 515
      "</form>"

516
    assert_dom_equal expected, output_buffer
517 518
  end

519
  def test_form_for_with_remote
520 521 522 523 524 525
    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
526 527 528 529 530 531 532 533 534 535 536 537 538 539
    end

    expected =
      "<form action='http://www.example.com' id='create-post' method='post' data-remote='true'>" +
      "<div style='margin:0;padding:0;display:inline'><input name='_method' type='hidden' value='put' /></div>" +
      "<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' />" +
      "<input name='post[secret]' checked='checked' type='checkbox' id='post_secret' value='1' />" +
      "</form>"

    assert_dom_equal expected, output_buffer
  end

540
  def test_form_for_without_object
541 542 543 544
    form_for(:post, :html => { :id => 'create-post' }) do |f|
      concat f.text_field(:title)
      concat f.text_area(:body)
      concat f.check_box(:secret)
545 546
    end

547
    expected =
548
      "<form action='http://www.example.com' id='create-post' method='post'>" +
549 550 551
      "<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' />" +
552
      "<input name='post[secret]' checked='checked' type='checkbox' id='post_secret' value='1' />" +
553 554
      "</form>"

555
    assert_dom_equal expected, output_buffer
556
  end
557

558
  def test_form_for_with_index
559 560 561 562 563 564 565
    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
566
    end
567

568
    expected =
569
      "<form action='http://www.example.com' method='post'>" +
570
      "<label for='post_123_title'>Title</label>" +
571 572
      "<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>" +
573
      "<input name='post[123][secret]' type='hidden' value='0' />" +
574
      "<input name='post[123][secret]' checked='checked' type='checkbox' id='post_123_secret' value='1' />" +
575
      "</form>"
576

577
    assert_dom_equal expected, output_buffer
578 579
  end

580
  def test_form_for_with_nil_index_option_override
581 582 583 584 585 586
    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
587 588 589 590 591 592 593
    end

    expected =
      "<form action='http://www.example.com' method='post'>" +
      "<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' />" +
594
      "<input name='post[][secret]' checked='checked' type='checkbox' id='post__secret' value='1' />" +
595 596
      "</form>"

597
    assert_dom_equal expected, output_buffer
598 599
  end

600 601 602
  def test_submit_with_object_as_new_record_and_locale_strings
    old_locale, I18n.locale = I18n.locale, :submit

603
    @post.persisted = false
604 605 606 607
    assert_deprecated do
      form_for(:post, @post) do |f|
        concat f.submit
      end
608 609 610 611 612 613 614 615 616 617 618 619 620
    end

    expected = "<form action='http://www.example.com' method='post'>" +
               "<input name='commit' id='post_submit' type='submit' value='Create Post' />" +
               "</form>"
    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

621 622 623 624
    assert_deprecated do
      form_for(:post, @post) do |f|
        concat f.submit
      end
625 626 627 628 629 630 631 632 633 634 635 636 637
    end

    expected = "<form action='http://www.example.com' method='post'>" +
               "<input name='commit' id='post_submit' type='submit' value='Confirm Post changes' />" +
               "</form>"
    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

638 639
    form_for(:post) do |f|
      concat f.submit :class => "extra"
640 641 642
    end

    expected = "<form action='http://www.example.com' method='post'>" +
643
               "<input name='commit' class='extra' id='post_submit' type='submit' value='Save changes' />" +
644 645 646 647 648 649
               "</form>"
    assert_dom_equal expected, output_buffer
  ensure
    I18n.locale = old_locale
  end

650 651 652
  def test_submit_with_object_and_nested_lookup
    old_locale, I18n.locale = I18n.locale, :submit

653 654 655 656
    assert_deprecated do
      form_for(:another_post, @post) do |f|
        concat f.submit
      end
657 658 659 660 661 662 663 664 665 666
    end

    expected = "<form action='http://www.example.com' method='post'>" +
               "<input name='commit' id='another_post_submit' type='submit' value='Update your Post' />" +
               "</form>"
    assert_dom_equal expected, output_buffer
  ensure
    I18n.locale = old_locale
  end

667
  def test_nested_fields_for
668 669 670 671 672 673
    assert_deprecated do
      form_for(:post, @post) do |f|
        concat f.fields_for(:comment, @post) { |c|
          concat c.text_field(:title)
        }
      end
674 675 676 677 678 679
    end

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

680
    assert_dom_equal expected, output_buffer
681
  end
682

683
  def test_nested_fields_for_with_nested_collections
684 685 686 687 688 689 690
    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
691 692 693 694 695 696 697 698 699 700
    end

    expected = "<form action='http://www.example.com' method='post'>" +
               "<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' />" +
               "</form>"

    assert_dom_equal expected, output_buffer
  end

701
  def test_nested_fields_for_with_index_and_parent_fields
702 703 704 705 706 707 708
    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
709 710 711 712 713 714 715 716 717 718
    end

    expected = "<form action='http://www.example.com' method='post'>" +
               "<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' />" +
               "</form>"

    assert_dom_equal expected, output_buffer
  end

719
  def test_form_for_with_index_and_nested_fields_for
720 721 722 723 724 725
    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
726 727 728 729 730 731 732 733 734 735
    end

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

    assert_dom_equal expected, output_buffer
  end

  def test_nested_fields_for_with_index_on_both
736 737 738 739 740 741
    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
742 743 744 745 746 747 748 749 750 751
    end

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

    assert_dom_equal expected, output_buffer
  end

  def test_nested_fields_for_with_auto_index
752 753 754 755 756 757
    assert_deprecated do
      form_for("post[]", @post) do |f|
        concat f.fields_for(:comment, @post) { |c|
          concat c.text_field(:title)
        }
      end
758 759 760 761 762 763 764 765 766
    end

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

    assert_dom_equal expected, output_buffer
  end

767
  def test_nested_fields_for_with_index_radio_button
768 769 770 771 772 773
    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
774 775 776 777 778 779 780 781 782
    end

    expected = "<form action='http://www.example.com' method='post'>" +
               "<input name='post[comment][5][title]' type='radio' id='post_comment_5_title_hello' value='hello' />" +
               "</form>"

    assert_dom_equal expected, output_buffer
  end

783
  def test_nested_fields_for_with_auto_index_on_both
784 785 786 787 788 789
    assert_deprecated do
      form_for("post[]", @post) do |f|
        concat f.fields_for("comment[]", @post) { |c|
          concat c.text_field(:title)
        }
      end
790 791 792 793 794 795 796 797 798 799
    end

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

    assert_dom_equal expected, output_buffer
  end

  def test_nested_fields_for_with_index_and_auto_index
800 801 802 803 804 805
    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
806

807 808 809 810 811
      output_buffer << form_for(:post, @post, :index => 1) do |f|
        concat f.fields_for("comment[]", @post) { |c|
          concat c.text_field(:title)
        }
      end
812

813 814 815 816 817 818
      expected = "<form action='http://www.example.com' method='post'>" +
                 "<input name='post[123][comment][5][title]' size='30' type='text' id='post_123_comment_5_title' value='Hello World' />" +
                 "</form>" +
                 "<form action='http://www.example.com' method='post'>" +
                 "<input name='post[1][comment][123][title]' size='30' type='text' id='post_1_comment_123_title' value='Hello World' />" +
                 "</form>"
819

820 821
      assert_dom_equal expected, output_buffer
    end
822 823
  end

824 825 826
  def test_nested_fields_for_with_a_new_record_on_a_nested_attributes_one_to_one_association
    @post.author = Author.new

827 828 829 830 831 832 833
    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
834 835 836 837 838 839 840 841 842 843
    end

    expected = '<form action="http://www.example.com" method="post">' +
               '<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" />' +
               '</form>'

    assert_dom_equal expected, output_buffer
  end

844
  def test_nested_fields_for_with_explicitly_passed_object_on_a_nested_attributes_one_to_one_association
845 846 847 848 849 850
    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
851 852 853 854
      end
    end
  end

855 856 857
  def test_nested_fields_for_with_an_existing_record_on_a_nested_attributes_one_to_one_association
    @post.author = Author.new(321)

858 859 860 861 862 863 864
    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
865 866
    end

867 868 869 870 871 872 873 874
    expected = '<form action="http://www.example.com" method="post">' +
               '<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" />' +
               '</form>'

    assert_dom_equal expected, output_buffer
  end
875

876 877 878
  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)

879 880 881 882 883 884 885 886
    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
887
    end
888

889 890
    expected = '<form action="http://www.example.com" method="post">' +
               '<input name="post[title]" size="30" type="text" id="post_title" value="Hello World" />' +
891
               '<input id="post_author_attributes_id" name="post[author_attributes][id]" type="hidden" value="321" />' +
892 893 894 895 896 897 898 899 900
               '<input id="post_author_attributes_name" name="post[author_attributes][name]" size="30" type="text" value="author #321" />' +
               '</form>'

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

901 902 903 904 905 906 907 908
    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
909 910 911
      end
    end

912 913 914 915 916 917 918 919 920 921 922 923 924 925
    expected = '<form action="http://www.example.com" method="post">' +
               '<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" />' +
               '</form>'

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

926 927 928 929 930 931 932 933 934
    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
935 936
      end
    end
937

938 939
    expected = '<form action="http://www.example.com" method="post">' +
               '<input name="post[title]" size="30" type="text" id="post_title" value="Hello World" />' +
940 941 942 943
               '<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" />' +
944 945 946 947 948 949 950 951
               '</form>'

    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]

952 953 954 955 956 957 958 959
    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
960 961 962 963 964
      end
    end

    expected = '<form action="http://www.example.com" method="post">' +
               '<input name="post[title]" size="30" type="text" id="post_title" value="Hello World" />' +
965 966
               '<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" />' +
967 968 969 970 971 972 973 974
               '</form>'

    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]

975 976 977 978 979 980 981 982
    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
983 984 985 986 987
      end
    end

    expected = '<form action="http://www.example.com" method="post">' +
               '<input name="post[title]" size="30" type="text" id="post_title" value="Hello World" />' +
988
               '<input id="post_comments_attributes_0_name" name="post[comments_attributes][0][name]" size="30" type="text" value="comment #321" />' +
989
               '<input id="post_comments_attributes_0_id" name="post[comments_attributes][0][id]" type="hidden" value="321" />' +
990
               '<input id="post_comments_attributes_1_name" name="post[comments_attributes][1][name]" size="30" type="text" value="new comment" />' +
991 992 993 994 995
               '</form>'

    assert_dom_equal expected, output_buffer
  end

996
  def test_nested_fields_for_with_an_empty_supplied_attributes_collection
997 998 999 1000 1001 1002
    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
1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015
      end
    end

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

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

1016 1017 1018 1019 1020 1021 1022
    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
1023 1024
    end

1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039
    expected = '<form action="http://www.example.com" method="post">' +
               '<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" />' +
               '</form>'

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

1040 1041 1042 1043 1044 1045 1046
    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
1047 1048
    end

1049 1050 1051
    expected = '<form action="http://www.example.com" method="post">' +
               '<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" />' +
1052
               '<input id="post_comments_attributes_0_id" name="post[comments_attributes][0][id]" type="hidden" value="1" />' +
1053
               '<input id="post_comments_attributes_1_name" name="post[comments_attributes][1][name]" size="30" type="text" value="comment #2" />' +
1054
               '<input id="post_comments_attributes_1_id" name="post[comments_attributes][1][id]" type="hidden" value="2" />' +
1055 1056 1057 1058 1059
               '</form>'

    assert_dom_equal expected, output_buffer
  end

1060 1061 1062 1063
  def test_nested_fields_for_on_a_nested_attributes_collection_association_yields_only_builder
    @post.comments = [Comment.new(321), Comment.new]
    yielded_comments = []

1064 1065 1066 1067 1068 1069 1070 1071
    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
1072 1073 1074 1075
    end

    expected = '<form action="http://www.example.com" method="post">' +
               '<input name="post[title]" size="30" type="text" id="post_title" value="Hello World" />' +
1076
               '<input id="post_comments_attributes_0_name" name="post[comments_attributes][0][name]" size="30" type="text" value="comment #321" />' +
1077
               '<input id="post_comments_attributes_0_id" name="post[comments_attributes][0][id]" type="hidden" value="321" />' +
1078
               '<input id="post_comments_attributes_1_name" name="post[comments_attributes][1][name]" size="30" type="text" value="new comment" />' +
1079 1080 1081 1082 1083 1084
               '</form>'

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

1085 1086 1087
  def test_nested_fields_for_with_child_index_option_override_on_a_nested_attributes_collection_association
    @post.comments = []

1088 1089 1090 1091 1092 1093
    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
1094 1095 1096 1097
    end

    expected = '<form action="http://www.example.com" method="post">' +
               '<input id="post_comments_attributes_abc_name" name="post[comments_attributes][abc][name]" size="30" type="text" value="comment #321" />' +
1098
               '<input id="post_comments_attributes_abc_id" name="post[comments_attributes][abc][id]" type="hidden" value="321" />' +
1099 1100 1101 1102 1103
               '</form>'

    assert_dom_equal expected, output_buffer
  end

1104 1105 1106 1107 1108 1109
  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 = []
1110 1111 1112 1113 1114 1115 1116 1117

    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 已提交
1118
        }
1119 1120 1121 1122 1123
        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 已提交
1124
        }
1125 1126 1127 1128 1129
        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 已提交
1130
        }
1131
      end
1132 1133 1134 1135 1136
    end

    expected = '<form action="http://www.example.com" method="post">' +
               '<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" />' +
1137 1138
               '<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" />' +
1139 1140
               '<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" />' +
1141 1142
               '<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" />' +
1143 1144
               '<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" />' +
1145 1146
               '<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" />' +
1147 1148 1149 1150 1151
               '</form>'

    assert_dom_equal expected, output_buffer
  end

1152
  def test_fields_for
W
wycats 已提交
1153
    output_buffer = fields_for(:post, @post) do |f|
1154 1155 1156
      concat f.text_field(:title)
      concat f.text_area(:body)
      concat f.check_box(:secret)
1157 1158
    end

1159
    expected =
1160 1161
      "<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>" +
1162 1163
      "<input name='post[secret]' type='hidden' value='0' />" +
      "<input name='post[secret]' checked='checked' type='checkbox' id='post_secret' value='1' />"
1164

1165
    assert_dom_equal expected, output_buffer
1166 1167 1168
  end

  def test_fields_for_with_index
W
wycats 已提交
1169
    output_buffer = fields_for("post[]", @post) do |f|
1170 1171 1172
      concat f.text_field(:title)
      concat f.text_area(:body)
      concat f.check_box(:secret)
1173 1174 1175 1176 1177
    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>" +
1178 1179
      "<input name='post[123][secret]' type='hidden' value='0' />" +
      "<input name='post[123][secret]' checked='checked' type='checkbox' id='post_123_secret' value='1' />"
1180

1181
    assert_dom_equal expected, output_buffer
1182 1183 1184
  end

  def test_fields_for_with_nil_index_option_override
W
wycats 已提交
1185
    output_buffer = fields_for("post[]", @post, :index => nil) do |f|
1186 1187 1188
      concat f.text_field(:title)
      concat f.text_area(:body)
      concat f.check_box(:secret)
1189 1190 1191 1192 1193
    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>" +
1194 1195
      "<input name='post[][secret]' type='hidden' value='0' />" +
      "<input name='post[][secret]' checked='checked' type='checkbox' id='post__secret' value='1' />"
1196

1197
    assert_dom_equal expected, output_buffer
1198 1199 1200
  end

  def test_fields_for_with_index_option_override
W
wycats 已提交
1201
    output_buffer = fields_for("post[]", @post, :index => "abc") do |f|
1202 1203 1204
      concat f.text_field(:title)
      concat f.text_area(:body)
      concat f.check_box(:secret)
1205 1206 1207 1208 1209
    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>" +
1210 1211
      "<input name='post[abc][secret]' type='hidden' value='0' />" +
      "<input name='post[abc][secret]' checked='checked' type='checkbox' id='post_abc_secret' value='1' />"
1212

1213
    assert_dom_equal expected, output_buffer
1214
  end
1215 1216

  def test_fields_for_without_object
W
wycats 已提交
1217
    output_buffer = fields_for(:post) do |f|
1218 1219 1220
      concat f.text_field(:title)
      concat f.text_area(:body)
      concat f.check_box(:secret)
1221 1222
    end

1223
    expected =
1224 1225
      "<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>" +
1226 1227
      "<input name='post[secret]' type='hidden' value='0' />" +
      "<input name='post[secret]' checked='checked' type='checkbox' id='post_secret' value='1' />"
1228

1229
    assert_dom_equal expected, output_buffer
1230 1231 1232
  end

  def test_fields_for_with_only_object
W
wycats 已提交
1233
    output_buffer = fields_for(@post) do |f|
1234 1235 1236
      concat f.text_field(:title)
      concat f.text_area(:body)
      concat f.check_box(:secret)
1237 1238
    end

1239
    expected =
1240 1241
      "<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>" +
1242 1243
      "<input name='post[secret]' type='hidden' value='0' />" +
      "<input name='post[secret]' checked='checked' type='checkbox' id='post_secret' value='1' />"
1244

1245
    assert_dom_equal expected, output_buffer
1246 1247
  end

1248
  def test_fields_for_object_with_bracketed_name
W
wycats 已提交
1249
    output_buffer = fields_for("author[post]", @post) do |f|
1250 1251
      concat f.label(:title)
      concat f.text_field(:title)
1252 1253
    end

1254 1255
    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' />",
1256
      output_buffer
1257 1258
  end

1259
  def test_fields_for_object_with_bracketed_name_and_index
W
wycats 已提交
1260
    output_buffer = fields_for("author[post]", @post, :index => 1) do |f|
1261 1262
      concat f.label(:title)
      concat f.text_field(:title)
1263 1264 1265 1266
    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' />",
1267
      output_buffer
1268 1269
  end

1270 1271 1272
  def test_form_builder_does_not_have_form_for_method
    assert ! ActionView::Helpers::FormBuilder.instance_methods.include?('form_for')
  end
1273

1274
  def test_form_for_and_fields_for
1275 1276 1277 1278
    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)
1279

1280 1281 1282 1283
        concat fields_for(:parent_post, @post) { |parent_fields|
          concat parent_fields.check_box(:secret)
        }
      end
1284 1285
    end

1286
    expected =
1287
      "<form action='http://www.example.com' id='create-post' method='post'>" +
1288 1289 1290
      "<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' />" +
1291
      "<input name='parent_post[secret]' checked='checked' type='checkbox' id='parent_post_secret' value='1' />" +
1292 1293
      "</form>"

1294
    assert_dom_equal expected, output_buffer
1295
  end
1296

1297
  def test_form_for_and_fields_for_with_object
1298 1299 1300 1301
    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)
1302

1303 1304 1305 1306
        concat post_form.fields_for(@comment) { |comment_fields|
          concat comment_fields.text_field(:name)
        }
      end
1307 1308
    end

1309
    expected =
1310 1311 1312 1313 1314 1315
      "<form action='http://www.example.com' id='create-post' method='post'>" +
      "<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' />" +
      "</form>"

1316
    assert_dom_equal expected, output_buffer
1317 1318
  end

1319
  class LabelledFormBuilder < ActionView::Helpers::FormBuilder
1320
    (field_helpers - %w(hidden_field)).each do |selector|
1321
      src, line = <<-END_SRC, __LINE__ + 1
1322
        def #{selector}(field, *args, &proc)
1323
          ("<label for='\#{field}'>\#{field.to_s.humanize}:</label> " + super + "<br/>").html_safe
1324 1325
        end
      END_SRC
1326
      class_eval src, __FILE__, line
1327 1328
    end
  end
1329

1330
  def test_form_for_with_labelled_builder
1331 1332 1333 1334 1335 1336
    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
1337 1338
    end

1339
    expected =
1340 1341 1342
      "<form action='http://www.example.com' method='post'>" +
      "<label for='title'>Title:</label> <input name='post[title]' size='30' type='text' id='post_title' value='Hello World' /><br/>" +
      "<label for='body'>Body:</label> <textarea name='post[body]' id='post_body' rows='20' cols='40'>Back to the hill and over it again!</textarea><br/>" +
1343
      "<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/>" +
1344 1345
      "</form>"

1346
    assert_dom_equal expected, output_buffer
1347
  end
1348 1349

  def test_default_form_builder
1350 1351
    old_default_form_builder, ActionView::Base.default_form_builder =
      ActionView::Base.default_form_builder, LabelledFormBuilder
1352

1353 1354 1355 1356 1357 1358
    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
1359 1360
    end

1361
    expected =
1362 1363 1364
      "<form action='http://www.example.com' method='post'>" +
      "<label for='title'>Title:</label> <input name='post[title]' size='30' type='text' id='post_title' value='Hello World' /><br/>" +
      "<label for='body'>Body:</label> <textarea name='post[body]' id='post_body' rows='20' cols='40'>Back to the hill and over it again!</textarea><br/>" +
1365
      "<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/>" +
1366 1367
      "</form>"

1368
    assert_dom_equal expected, output_buffer
1369
  ensure
1370
    ActionView::Base.default_form_builder = old_default_form_builder
1371
  end
1372

1373
  def test_fields_for_with_labelled_builder
W
wycats 已提交
1374
    output_buffer = fields_for(:post, @post, :builder => LabelledFormBuilder) do |f|
1375 1376 1377
      concat f.text_field(:title)
      concat f.text_area(:body)
      concat f.check_box(:secret)
1378
    end
1379 1380

    expected =
1381 1382
      "<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/>" +
1383
      "<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/>"
1384

1385
    assert_dom_equal expected, output_buffer
1386
  end
1387

1388 1389 1390
  def test_form_for_with_labelled_builder_with_nested_fields_for_without_options_hash
    klass = nil

1391 1392 1393 1394 1395 1396
    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
1397 1398 1399 1400 1401 1402 1403 1404 1405
      end
    end

    assert_equal LabelledFormBuilder, klass
  end

  def test_form_for_with_labelled_builder_with_nested_fields_for_with_options_hash
    klass = nil

1406 1407 1408 1409 1410 1411
    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
1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422
      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

1423 1424 1425 1426 1427 1428
    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
1429 1430 1431 1432 1433 1434
      end
    end

    assert_equal LabelledFormBuilderSubclass, klass
  end

1435
  def test_form_for_with_html_options_adds_options_to_form_tag
1436 1437 1438
    assert_deprecated do
      form_for(:post, @post, :html => {:id => 'some_form', :class => 'some_class'}) do |f| end
    end
1439
    expected = "<form action=\"http://www.example.com\" class=\"some_class\" id=\"some_form\" method=\"post\"></form>"
1440

1441
    assert_dom_equal expected, output_buffer
1442
  end
1443

1444
  def test_form_for_with_string_url_option
1445 1446 1447
    assert_deprecated do
      form_for(:post, @post, :url => 'http://www.otherdomain.com') do |f| end
    end
1448

1449
    assert_equal '<form action="http://www.otherdomain.com" method="post"></form>', output_buffer
1450 1451 1452
  end

  def test_form_for_with_hash_url_option
1453 1454 1455
    assert_deprecated do
      form_for(:post, @post, :url => {:controller => 'controller', :action => 'action'}) do |f| end
    end
1456

1457 1458
    assert_equal 'controller', @url_for_options[:controller]
    assert_equal 'action', @url_for_options[:action]
1459
  end
1460

1461
  def test_form_for_with_record_url_option
1462 1463 1464
    assert_deprecated do
      form_for(:post, @post, :url => @post) do |f| end
    end
1465 1466

    expected = "<form action=\"/posts/123\" method=\"post\"></form>"
1467
    assert_equal expected, output_buffer
1468 1469 1470 1471 1472
  end

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

1473
    expected = "<form action=\"/posts/123\" class=\"edit_post\" id=\"edit_post_123\" method=\"post\"><div style=\"margin:0;padding:0;display:inline\"><input name=\"_method\" type=\"hidden\" value=\"put\" /></div></form>"
1474
    assert_equal expected, output_buffer
1475 1476 1477 1478
  end

  def test_form_for_with_new_object
    post = Post.new
1479
    post.persisted = false
1480 1481 1482 1483 1484
    def post.id() nil end

    form_for(post) do |f| end

    expected = "<form action=\"/posts\" class=\"new_post\" id=\"new_post\" method=\"post\"></form>"
1485
    assert_equal expected, output_buffer
1486 1487
  end

1488 1489 1490 1491
  def test_form_for_with_existing_object_in_list
    @comment.save
    form_for([@post, @comment]) {}

1492
    expected = %(<form action="#{comment_path(@post, @comment)}" class="edit_comment" id="edit_comment_1" method="post"><div style="margin:0;padding:0;display:inline"><input name="_method" type="hidden" value="put" /></div></form>)
1493
    assert_dom_equal expected, output_buffer
1494 1495 1496 1497 1498 1499
  end

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

    expected = %(<form action="#{comments_path(@post)}" class="new_comment" id="new_comment" method="post"></form>)
1500
    assert_dom_equal expected, output_buffer
1501 1502
  end

1503 1504 1505
  def test_form_for_with_existing_object_and_namespace_in_list
    @comment.save
    form_for([:admin, @post, @comment]) {}
1506

1507
    expected = %(<form action="#{admin_comment_path(@post, @comment)}" class="edit_comment" id="edit_comment_1" method="post"><div style="margin:0;padding:0;display:inline"><input name="_method" type="hidden" value="put" /></div></form>)
1508
    assert_dom_equal expected, output_buffer
1509
  end
1510

1511 1512
  def test_form_for_with_new_object_and_namespace_in_list
    form_for([:admin, @post, @comment]) {}
1513

1514
    expected = %(<form action="#{admin_comments_path(@post)}" class="new_comment" id="new_comment" method="post"></form>)
1515
    assert_dom_equal expected, output_buffer
1516 1517
  end

1518 1519 1520
  def test_form_for_with_existing_object_and_custom_url
    form_for(@post, :url => "/super_posts") do |f| end

1521
    expected = "<form action=\"/super_posts\" class=\"edit_post\" id=\"edit_post_123\" method=\"post\"><div style=\"margin:0;padding:0;display:inline\"><input name=\"_method\" type=\"hidden\" value=\"put\" /></div></form>"
1522
    assert_equal expected, output_buffer
1523
  end
1524

1525 1526 1527 1528 1529
  def test_fields_for_returns_block_result
    output = fields_for(Post.new) { |f| "fields" }
    assert_equal "fields", output
  end

1530
  protected
1531 1532 1533
    def comments_path(post)
      "/posts/#{post.id}/comments"
    end
1534
    alias_method :post_comments_path, :comments_path
1535 1536 1537 1538

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

1541 1542 1543 1544
    def admin_comments_path(post)
      "/admin/posts/#{post.id}/comments"
    end
    alias_method :admin_post_comments_path, :admin_comments_path
1545

1546 1547 1548 1549
    def admin_comment_path(post, comment)
      "/admin/posts/#{post.id}/comments/#{comment.id}"
    end
    alias_method :admin_post_comment_path, :admin_comment_path
1550

1551 1552
    def posts_path
      "/posts"
1553 1554
    end

1555 1556
    def post_path(post)
      "/posts/#{post.id}"
1557
    end
1558 1559 1560

    def protect_against_forgery?
      false
1561
    end
1562
end