form_helper_test.rb 47.1 KB
Newer Older
1
require 'abstract_unit'
D
Initial  
David Heinemeier Hansson 已提交
2

3 4 5 6 7 8
silence_warnings do
  Post = Struct.new(:title, :author_name, :body, :secret, :written_on, :cost)
  Post.class_eval do
    alias_method :title_before_type_cast, :title unless respond_to?(:title_before_type_cast)
    alias_method :body_before_type_cast, :body unless respond_to?(:body_before_type_cast)
    alias_method :author_name_before_type_cast, :author_name unless respond_to?(:author_name_before_type_cast)
9
    alias_method :secret?, :secret
10

11 12 13
    def new_record=(boolean)
      @new_record = boolean
    end
14

15 16 17
    def new_record?
      @new_record
    end
18 19 20 21 22 23

    attr_accessor :author
    def author_attributes=(attributes); end

    attr_accessor :comments
    def comments_attributes=(attributes); end
24
  end
25 26 27 28

  class Comment
    attr_reader :id
    attr_reader :post_id
29
    def initialize(id = nil, post_id = nil); @id, @post_id = id, post_id end
30 31
    def save; @id = 1; @post_id = 1 end
    def new_record?; @id.nil? end
32
    def to_param; @id; end
33
    def name
34
      @id.nil? ? "new #{self.class.name.downcase}" : "#{self.class.name.downcase} ##{@id}"
35 36
    end
  end
37

38 39 40 41 42
  class Author < Comment
    attr_accessor :post
    def post_attributes=(attributes); end
  end
end
43

44 45
class FormHelperTest < ActionView::TestCase
  tests ActionView::Helpers::FormHelper
D
Initial  
David Heinemeier Hansson 已提交
46 47

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

D
Initial  
David Heinemeier Hansson 已提交
63 64 65 66 67
    @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)
68 69

    @controller = Class.new do
70
      attr_reader :url_for_options
71
      def url_for(options)
72
        @url_for_options = options
73 74 75 76
        "http://www.example.com"
      end
    end
    @controller = @controller.new
D
Initial  
David Heinemeier Hansson 已提交
77 78
  end

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

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

94 95 96 97 98 99 100 101
  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

102 103 104 105 106
  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

D
Initial  
David Heinemeier Hansson 已提交
107
  def test_text_field
108
    assert_dom_equal(
D
Initial  
David Heinemeier Hansson 已提交
109 110
      '<input id="post_title" name="post[title]" size="30" type="text" value="Hello World" />', text_field("post", "title")
    )
111
    assert_dom_equal(
D
Initial  
David Heinemeier Hansson 已提交
112 113
      '<input id="post_title" name="post[title]" size="30" type="password" value="Hello World" />', password_field("post", "title")
    )
114
    assert_dom_equal(
115
      '<input id="person_name" name="person[name]" size="30" type="password" />', password_field("person", "name")
D
Initial  
David Heinemeier Hansson 已提交
116 117 118 119 120
    )
  end

  def test_text_field_with_escapes
    @post.title = "<b>Hello World</b>"
121
    assert_dom_equal(
D
Initial  
David Heinemeier Hansson 已提交
122 123 124 125
      '<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

126 127 128 129 130 131 132 133
  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 已提交
134
  def test_text_field_with_options
135
    expected = '<input id="post_title" name="post[title]" size="35" type="text" value="Hello World" />'
136 137
    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 已提交
138
  end
139

D
Initial  
David Heinemeier Hansson 已提交
140
  def test_text_field_assuming_size
141
    expected = '<input id="post_title" maxlength="35" name="post[title]" size="35" type="text" value="Hello World" />'
142 143
    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 已提交
144
  end
145

146 147 148 149 150 151
  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

152 153 154 155 156 157 158
  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

159 160 161
  def test_hidden_field
    assert_dom_equal '<input id="post_title" name="post[title]" type="hidden" value="Hello World" />',
      hidden_field("post", "title")
162 163
      assert_dom_equal '<input id="post_secret" name="post[secret]" type="hidden" value="1" />',
        hidden_field("post", "secret?")
164 165 166 167 168 169 170 171 172 173 174 175 176
  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

D
Initial  
David Heinemeier Hansson 已提交
177
  def test_check_box
178
    assert_dom_equal(
179
      '<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 已提交
180 181 182
      check_box("post", "secret")
    )
    @post.secret = 0
183
    assert_dom_equal(
184
      '<input name="post[secret]" type="hidden" value="0" /><input id="post_secret" name="post[secret]" type="checkbox" value="1" />',
185
      check_box("post", "secret")
D
Initial  
David Heinemeier Hansson 已提交
186
    )
187
    assert_dom_equal(
188
      '<input name="post[secret]" type="hidden" value="0" /><input checked="checked" id="post_secret" name="post[secret]" type="checkbox" value="1" />',
189 190
      check_box("post", "secret" ,{"checked"=>"checked"})
    )
D
Initial  
David Heinemeier Hansson 已提交
191
    @post.secret = true
192
    assert_dom_equal(
193
      '<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 已提交
194 195
      check_box("post", "secret")
    )
196
    assert_dom_equal(
197
      '<input name="post[secret]" type="hidden" value="0" /><input checked="checked" id="post_secret" name="post[secret]" type="checkbox" value="1" />',
198 199
      check_box("post", "secret?")
    )
200 201 202

    @post.secret = ['0']
    assert_dom_equal(
203
      '<input name="post[secret]" type="hidden" value="0" /><input id="post_secret" name="post[secret]" type="checkbox" value="1" />',
204 205 206 207
      check_box("post", "secret")
    )
    @post.secret = ['1']
    assert_dom_equal(
208
      '<input name="post[secret]" type="hidden" value="0" /><input checked="checked" id="post_secret" name="post[secret]" type="checkbox" value="1" />',
209 210
      check_box("post", "secret")
    )
D
Initial  
David Heinemeier Hansson 已提交
211
  end
212

213 214
  def test_check_box_with_explicit_checked_and_unchecked_values
    @post.secret = "on"
215
    assert_dom_equal(
216
      '<input name="post[secret]" type="hidden" value="off" /><input checked="checked" id="post_secret" name="post[secret]" type="checkbox" value="on" />',
217 218 219
      check_box("post", "secret", {}, "on", "off")
    )
  end
220

221 222
  def test_checkbox_disabled_still_submits_checked_value
    assert_dom_equal(
223
      '<input name="post[secret]" type="hidden" value="1" /><input checked="checked" disabled="disabled" id="post_secret" name="post[secret]" type="checkbox" value="1" />',
224 225 226 227
      check_box("post", "secret", { :disabled => :true })
    )
  end

228
  def test_radio_button
229
    assert_dom_equal('<input checked="checked" id="post_title_hello_world" name="post[title]" type="radio" value="Hello World" />',
230
      radio_button("post", "title", "Hello World")
231
    )
232
    assert_dom_equal('<input id="post_title_goodbye_world" name="post[title]" type="radio" value="Goodbye World" />',
233
      radio_button("post", "title", "Goodbye World")
234
    )
235 236 237
    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")
    )
238
  end
239

240 241 242 243 244
  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
245

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

D
Initial  
David Heinemeier Hansson 已提交
252
  def test_text_area
253
    assert_dom_equal(
254
      '<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 已提交
255 256 257
      text_area("post", "body")
    )
  end
258

D
Initial  
David Heinemeier Hansson 已提交
259 260
  def test_text_area_with_escapes
    @post.body        = "Back to <i>the</i> hill and over it again!"
261
    assert_dom_equal(
262
      '<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 已提交
263 264 265
      text_area("post", "body")
    )
  end
266

267 268 269 270 271 272
  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
273

274 275 276 277 278 279 280 281
  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

282 283 284 285 286 287
  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
288

D
Initial  
David Heinemeier Hansson 已提交
289
  def test_explicit_name
290
    assert_dom_equal(
D
Initial  
David Heinemeier Hansson 已提交
291
      '<input id="post_title" name="dont guess" size="30" type="text" value="Hello World" />', text_field("post", "title", "name" => "dont guess")
292
    )
293
    assert_dom_equal(
294
      '<textarea cols="40" id="post_body" name="really!" rows="20">Back to the hill and over it again!</textarea>',
D
Initial  
David Heinemeier Hansson 已提交
295 296
      text_area("post", "body", "name" => "really!")
    )
297
    assert_dom_equal(
298
      '<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 已提交
299 300
      check_box("post", "secret", "name" => "i mean it")
    )
301
    assert_dom_equal text_field("post", "title", "name" => "dont guess"),
302
                 text_field("post", "title", :name => "dont guess")
303
    assert_dom_equal text_area("post", "body", "name" => "really!"),
304
                 text_area("post", "body", :name => "really!")
305
    assert_dom_equal check_box("post", "secret", "name" => "i mean it"),
306
                 check_box("post", "secret", :name => "i mean it")
D
Initial  
David Heinemeier Hansson 已提交
307
  end
308

D
Initial  
David Heinemeier Hansson 已提交
309
  def test_explicit_id
310
    assert_dom_equal(
D
Initial  
David Heinemeier Hansson 已提交
311
      '<input id="dont guess" name="post[title]" size="30" type="text" value="Hello World" />', text_field("post", "title", "id" => "dont guess")
312
    )
313
    assert_dom_equal(
314
      '<textarea cols="40" id="really!" name="post[body]" rows="20">Back to the hill and over it again!</textarea>',
D
Initial  
David Heinemeier Hansson 已提交
315 316
      text_area("post", "body", "id" => "really!")
    )
317
    assert_dom_equal(
318
      '<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 已提交
319 320
      check_box("post", "secret", "id" => "i mean it")
    )
321
    assert_dom_equal text_field("post", "title", "id" => "dont guess"),
322
                 text_field("post", "title", :id => "dont guess")
323
    assert_dom_equal text_area("post", "body", "id" => "really!"),
324
                 text_area("post", "body", :id => "really!")
325
    assert_dom_equal check_box("post", "secret", "id" => "i mean it"),
326
                 check_box("post", "secret", :id => "i mean it")
D
Initial  
David Heinemeier Hansson 已提交
327
  end
328 329 330

  def test_auto_index
    pid = @post.id
331 332 333 334
    assert_dom_equal(
      "<label for=\"post_#{pid}_title\">Title</label>",
      label("post[]", "title")
    )
335
    assert_dom_equal(
336 337
      "<input id=\"post_#{pid}_title\" name=\"post[#{pid}][title]\" size=\"30\" type=\"text\" value=\"Hello World\" />", text_field("post[]","title")
    )
338
    assert_dom_equal(
339
      "<textarea cols=\"40\" id=\"post_#{pid}_body\" name=\"post[#{pid}][body]\" rows=\"20\">Back to the hill and over it again!</textarea>",
340 341
      text_area("post[]", "body")
    )
342
    assert_dom_equal(
343
      "<input name=\"post[#{pid}][secret]\" type=\"hidden\" value=\"0\" /><input checked=\"checked\" id=\"post_#{pid}_secret\" name=\"post[#{pid}][secret]\" type=\"checkbox\" value=\"1\" />",
344 345
      check_box("post[]", "secret")
    )
346
   assert_dom_equal(
347
"<input checked=\"checked\" id=\"post_#{pid}_title_hello_world\" name=\"post[#{pid}][title]\" type=\"radio\" value=\"Hello World\" />",
348 349
      radio_button("post[]", "title", "Hello World")
    )
350
    assert_dom_equal("<input id=\"post_#{pid}_title_goodbye_world\" name=\"post[#{pid}][title]\" type=\"radio\" value=\"Goodbye World\" />",
351 352 353
      radio_button("post[]", "title", "Goodbye World")
    )
  end
354 355

  def test_form_for
356
    form_for(:post, @post, :html => { :id => 'create-post' }) do |f|
357 358 359 360 361
      concat f.label(:title)
      concat f.text_field(:title)
      concat f.text_area(:body)
      concat f.check_box(:secret)
      concat f.submit('Create post')
362 363
    end

364
    expected =
365
      "<form action='http://www.example.com' id='create-post' method='post'>" +
366
      "<label for='post_title'>Title</label>" +
367 368
      "<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>" +
369
      "<input name='post[secret]' type='hidden' value='0' />" +
370
      "<input name='post[secret]' checked='checked' type='checkbox' id='post_secret' value='1' />" +
371
      "<input name='commit' id='post_submit' type='submit' value='Create post' />" +
372 373
      "</form>"

374
    assert_dom_equal expected, output_buffer
375 376 377 378
  end

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

384
    expected =
385
      "<form action='http://www.example.com' id='create-post' method='post'>" +
386
      "<div style='margin:0;padding:0'><input name='_method' type='hidden' value='put' /></div>" +
387 388
      "<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>" +
389
      "<input name='post[secret]' type='hidden' value='0' />" +
390
      "<input name='post[secret]' checked='checked' type='checkbox' id='post_secret' value='1' />" +
391 392
      "</form>"

393
    assert_dom_equal expected, output_buffer
394 395
  end

396
  def test_form_for_without_object
397
    form_for(:post, :html => { :id => 'create-post' }) do |f|
398 399 400
      concat f.text_field(:title)
      concat f.text_area(:body)
      concat f.check_box(:secret)
401 402
    end

403
    expected =
404
      "<form action='http://www.example.com' id='create-post' method='post'>" +
405 406 407
      "<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' />" +
408
      "<input name='post[secret]' checked='checked' type='checkbox' id='post_secret' value='1' />" +
409 410
      "</form>"

411
    assert_dom_equal expected, output_buffer
412
  end
413

414 415
  def test_form_for_with_index
    form_for("post[]", @post) do |f|
416 417 418 419
      concat f.label(:title)
      concat f.text_field(:title)
      concat f.text_area(:body)
      concat f.check_box(:secret)
420
    end
421

422
    expected =
423
      "<form action='http://www.example.com' method='post'>" +
424
      "<label for=\"post_123_title\">Title</label>" +
425 426
      "<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>" +
427
      "<input name='post[123][secret]' type='hidden' value='0' />" +
428
      "<input name='post[123][secret]' checked='checked' type='checkbox' id='post_123_secret' value='1' />" +
429
      "</form>"
430

431
    assert_dom_equal expected, output_buffer
432 433
  end

434 435
  def test_form_for_with_nil_index_option_override
    form_for("post[]", @post, :index => nil) do |f|
436 437 438
      concat f.text_field(:title)
      concat f.text_area(:body)
      concat f.check_box(:secret)
439 440 441 442 443 444 445
    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' />" +
446
      "<input name='post[][secret]' checked='checked' type='checkbox' id='post__secret' value='1' />" +
447 448
      "</form>"

449
    assert_dom_equal expected, output_buffer
450 451
  end

452 453 454
  def test_nested_fields_for
    form_for(:post, @post) do |f|
      f.fields_for(:comment, @post) do |c|
455
        concat c.text_field(:title)
456 457 458 459 460 461 462
      end
    end

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

463
    assert_dom_equal expected, output_buffer
464
  end
465

466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481
  def test_nested_fields_for_with_nested_collections
    form_for('post[]', @post) do |f|
      concat f.text_field(:title)
      f.fields_for('comment[]', @comment) do |c|
        concat c.text_field(:name)
      end
    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

482
  def test_nested_fields_for_with_index_and_parent_fields
483 484 485 486 487 488 489 490 491 492 493 494 495 496 497
    form_for('post', @post, :index => 1) do |c|
      concat c.text_field(:title)
      c.fields_for('comment', @comment, :index => 1) do |r|
        concat r.text_field(:name)
      end
    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

498
  def test_form_for_with_index_and_nested_fields_for
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
    form_for(:post, @post, :index => 1) do |f|
      f.fields_for(:comment, @post) do |c|
        concat c.text_field(:title)
      end
    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
    form_for(:post, @post, :index => 1) do |f|
      f.fields_for(:comment, @post, :index => 5) do |c|
        concat c.text_field(:title)
      end
    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
    form_for("post[]", @post) do |f|
      f.fields_for(:comment, @post) do |c|
        concat c.text_field(:title)
      end
    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

540 541 542 543 544 545 546 547 548 549 550 551 552 553
  def test_nested_fields_for_with_index_radio_button
    form_for(:post, @post) do |f|
      f.fields_for(:comment, @post, :index => 5) do |c|
        concat c.radio_button(:title, "hello")
      end
    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

554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590
  def test_nested_fields_for_with_auto_index_on_both
    form_for("post[]", @post) do |f|
      f.fields_for("comment[]", @post) do |c|
        concat c.text_field(:title)
      end
    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
    form_for("post[]", @post) do |f|
      f.fields_for(:comment, @post, :index => 5) do |c|
        concat c.text_field(:title)
      end
    end

    form_for(:post, @post, :index => 1) do |f|
      f.fields_for("comment[]", @post) do |c|
        concat c.text_field(:title)
      end
    end

    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>"

    assert_dom_equal expected, output_buffer
  end

591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608
  def test_nested_fields_for_with_a_new_record_on_a_nested_attributes_one_to_one_association
    @post.author = Author.new

    form_for(:post, @post) do |f|
      concat f.text_field(:title)
      f.fields_for(:author) do |af|
        concat af.text_field(:name)
      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" />' +
               '<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

609 610 611 612 613 614 615 616 617
  def test_nested_fields_for_with_explicitly_passed_object_on_a_nested_attributes_one_to_one_association
    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
    end
  end

618 619 620 621 622 623 624 625 626 627 628 629
  def test_nested_fields_for_with_an_existing_record_on_a_nested_attributes_one_to_one_association
    @post.author = Author.new(321)

    form_for(:post, @post) do |f|
      concat f.text_field(:title)
      f.fields_for(:author) do |af|
        concat af.text_field(:name)
      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" />' +
630
               '<input id="post_author_attributes_id" name="post[author_attributes][id]" type="hidden" value="321" />' +
631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650
               '<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) }

    form_for(:post, @post) do |f|
      concat f.text_field(:title)
      @post.comments.each do |comment|
        f.fields_for(:comments, comment) do |cf|
          concat cf.text_field(:name)
        end
      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" />' +
651 652 653 654
               '<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" />' +
655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673
               '</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]

    form_for(:post, @post) do |f|
      concat f.text_field(:title)
      @post.comments.each do |comment|
        f.fields_for(:comments, comment) do |cf|
          concat cf.text_field(:name)
        end
      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" />' +
674 675
               '<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" />' +
676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694
               '</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]

    form_for(:post, @post) do |f|
      concat f.text_field(:title)
      @post.comments.each do |comment|
        f.fields_for(:comments, comment) do |cf|
          concat cf.text_field(:name)
        end
      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" />' +
695 696 697
               '<input id="post_comments_attributes_0_id" name="post[comments_attributes][0][id]" type="hidden" value="321" />' +
               '<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_1_name" name="post[comments_attributes][1][name]" size="30" type="text" value="new comment" />' +
698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716
               '</form>'

    assert_dom_equal expected, output_buffer
  end

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

    form_for(:post, @post) do |f|
      concat f.text_field(:title)
      f.fields_for(:comments) do |cf|
        concat cf.text_field(:name)
        yielded_comments << cf.object
      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" />' +
717 718 719
               '<input id="post_comments_attributes_0_id" name="post[comments_attributes][0][id]" type="hidden" value="321" />' +
               '<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_1_name" name="post[comments_attributes][1][name]" size="30" type="text" value="new comment" />' +
720 721 722 723 724 725
               '</form>'

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

726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742
  def test_nested_fields_for_with_child_index_option_override_on_a_nested_attributes_collection_association
    @post.comments = []

    form_for(:post, @post) do |f|
      f.fields_for(:comments, Comment.new(321), :child_index => 'abc') do |cf|
        concat cf.text_field(:name)
      end
    end

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

    assert_dom_equal expected, output_buffer
  end

743
  def test_fields_for
744
    fields_for(:post, @post) do |f|
745 746 747
      concat f.text_field(:title)
      concat f.text_area(:body)
      concat f.check_box(:secret)
748 749
    end

750
    expected =
751 752
      "<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>" +
753 754
      "<input name='post[secret]' type='hidden' value='0' />" +
      "<input name='post[secret]' checked='checked' type='checkbox' id='post_secret' value='1' />"
755

756
    assert_dom_equal expected, output_buffer
757 758 759 760
  end

  def test_fields_for_with_index
    fields_for("post[]", @post) do |f|
761 762 763
      concat f.text_field(:title)
      concat f.text_area(:body)
      concat f.check_box(:secret)
764 765 766 767 768
    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>" +
769 770
      "<input name='post[123][secret]' type='hidden' value='0' />" +
      "<input name='post[123][secret]' checked='checked' type='checkbox' id='post_123_secret' value='1' />"
771

772
    assert_dom_equal expected, output_buffer
773 774 775 776
  end

  def test_fields_for_with_nil_index_option_override
    fields_for("post[]", @post, :index => nil) do |f|
777 778 779
      concat f.text_field(:title)
      concat f.text_area(:body)
      concat f.check_box(:secret)
780 781 782 783 784
    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>" +
785 786
      "<input name='post[][secret]' type='hidden' value='0' />" +
      "<input name='post[][secret]' checked='checked' type='checkbox' id='post__secret' value='1' />"
787

788
    assert_dom_equal expected, output_buffer
789 790 791 792
  end

  def test_fields_for_with_index_option_override
    fields_for("post[]", @post, :index => "abc") do |f|
793 794 795
      concat f.text_field(:title)
      concat f.text_area(:body)
      concat f.check_box(:secret)
796 797 798 799 800
    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>" +
801 802
      "<input name='post[abc][secret]' type='hidden' value='0' />" +
      "<input name='post[abc][secret]' checked='checked' type='checkbox' id='post_abc_secret' value='1' />"
803

804
    assert_dom_equal expected, output_buffer
805
  end
806 807 808

  def test_fields_for_without_object
    fields_for(:post) do |f|
809 810 811
      concat f.text_field(:title)
      concat f.text_area(:body)
      concat f.check_box(:secret)
812 813
    end

814
    expected =
815 816
      "<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>" +
817 818
      "<input name='post[secret]' type='hidden' value='0' />" +
      "<input name='post[secret]' checked='checked' type='checkbox' id='post_secret' value='1' />"
819

820
    assert_dom_equal expected, output_buffer
821 822 823 824
  end

  def test_fields_for_with_only_object
    fields_for(@post) do |f|
825 826 827
      concat f.text_field(:title)
      concat f.text_area(:body)
      concat f.check_box(:secret)
828 829
    end

830
    expected =
831 832
      "<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>" +
833 834
      "<input name='post[secret]' type='hidden' value='0' />" +
      "<input name='post[secret]' checked='checked' type='checkbox' id='post_secret' value='1' />"
835

836
    assert_dom_equal expected, output_buffer
837 838
  end

839 840
  def test_fields_for_object_with_bracketed_name
    fields_for("author[post]", @post) do |f|
841 842
      concat f.label(:title)
      concat f.text_field(:title)
843 844
    end

845 846
    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' />",
847
      output_buffer
848 849
  end

850 851
  def test_fields_for_object_with_bracketed_name_and_index
    fields_for("author[post]", @post, :index => 1) do |f|
852 853
      concat f.label(:title)
      concat f.text_field(:title)
854 855 856 857
    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' />",
858
      output_buffer
859 860
  end

861 862 863
  def test_form_builder_does_not_have_form_for_method
    assert ! ActionView::Helpers::FormBuilder.instance_methods.include?('form_for')
  end
864

865
  def test_form_for_and_fields_for
866
    form_for(:post, @post, :html => { :id => 'create-post' }) do |post_form|
867 868
      concat post_form.text_field(:title)
      concat post_form.text_area(:body)
869

870
      fields_for(:parent_post, @post) do |parent_fields|
871
        concat parent_fields.check_box(:secret)
872 873 874
      end
    end

875
    expected =
876
      "<form action='http://www.example.com' id='create-post' method='post'>" +
877 878 879
      "<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' />" +
880
      "<input name='parent_post[secret]' checked='checked' type='checkbox' id='parent_post_secret' value='1' />" +
881 882
      "</form>"

883
    assert_dom_equal expected, output_buffer
884
  end
885

886 887
  def test_form_for_and_fields_for_with_object
    form_for(:post, @post, :html => { :id => 'create-post' }) do |post_form|
888 889
      concat post_form.text_field(:title)
      concat post_form.text_area(:body)
890 891

      post_form.fields_for(@comment) do |comment_fields|
892
        concat comment_fields.text_field(:name)
893 894 895
      end
    end

896
    expected =
897 898 899 900 901 902
      "<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>"

903
    assert_dom_equal expected, output_buffer
904 905
  end

906
  class LabelledFormBuilder < ActionView::Helpers::FormBuilder
907 908 909 910 911 912 913 914 915
    (field_helpers - %w(hidden_field)).each do |selector|
      src = <<-END_SRC
        def #{selector}(field, *args, &proc)
          "<label for='\#{field}'>\#{field.to_s.humanize}:</label> " + super + "<br/>"
        end
      END_SRC
      class_eval src, __FILE__, __LINE__
    end
  end
916

917
  def test_form_for_with_labelled_builder
918
    form_for(:post, @post, :builder => LabelledFormBuilder) do |f|
919 920 921
      concat f.text_field(:title)
      concat f.text_area(:body)
      concat f.check_box(:secret)
922 923
    end

924
    expected =
925 926 927
      "<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/>" +
928
      "<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/>" +
929 930
      "</form>"

931
    assert_dom_equal expected, output_buffer
932
  end
933 934 935 936 937 938

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

    form_for(:post, @post) do |f|
939 940 941
      concat f.text_field(:title)
      concat f.text_area(:body)
      concat f.check_box(:secret)
942 943
    end

944
    expected =
945 946 947
      "<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/>" +
948
      "<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/>" +
949 950
      "</form>"

951
    assert_dom_equal expected, output_buffer
952 953 954
  ensure
    ActionView::Base.default_form_builder = old_default_form_builder
  end
955

956 957
  def test_default_form_builder_with_active_record_helpers
    form_for(:post, @post) do |f|
958 959
       concat f.error_message_on('author_name')
       concat f.error_messages
960 961 962 963
    end

    expected = %(<form action='http://www.example.com' method='post'>) +
               %(<div class='formError'>can't be empty</div>) +
964 965
               %(<div class="errorExplanation" id="errorExplanation"><h2>1 error prohibited this post from being saved</h2><p>There were problems with the following fields:</p><ul><li>Author name can't be empty</li></ul></div>) +
               %(</form>)
966

967
    assert_dom_equal expected, output_buffer
968 969

  end
970

971 972 973
  def test_default_form_builder_no_instance_variable
    post = @post
    @post = nil
974

975
    form_for(:post, post) do |f|
976 977
       concat f.error_message_on('author_name')
       concat f.error_messages
978 979 980 981
    end

    expected = %(<form action='http://www.example.com' method='post'>) +
               %(<div class='formError'>can't be empty</div>) +
982 983
               %(<div class="errorExplanation" id="errorExplanation"><h2>1 error prohibited this post from being saved</h2><p>There were problems with the following fields:</p><ul><li>Author name can't be empty</li></ul></div>) +
               %(</form>)
984

985
    assert_dom_equal expected, output_buffer
986

987
  end
988

989 990 991 992
  # Perhaps this test should be moved to prototype helper tests.
  def test_remote_form_for_with_labelled_builder
    self.extend ActionView::Helpers::PrototypeHelper

993
     remote_form_for(:post, @post, :builder => LabelledFormBuilder) do |f|
994 995 996
       concat f.text_field(:title)
       concat f.text_area(:body)
       concat f.check_box(:secret)
997 998
     end

999
     expected =
1000
       %(<form action="http://www.example.com" onsubmit="new Ajax.Request('http://www.example.com', {asynchronous:true, evalScripts:true, parameters:Form.serialize(this)}); return false;" method="post">) +
1001 1002
       "<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/>" +
1003
       "<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/>" +
1004 1005
       "</form>"

1006
     assert_dom_equal expected, output_buffer
1007
  end
1008

1009
  def test_fields_for_with_labelled_builder
1010
    fields_for(:post, @post, :builder => LabelledFormBuilder) do |f|
1011 1012 1013
      concat f.text_field(:title)
      concat f.text_area(:body)
      concat f.check_box(:secret)
1014
    end
1015 1016

    expected =
1017 1018
      "<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/>" +
1019
      "<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/>"
1020

1021
    assert_dom_equal expected, output_buffer
1022
  end
1023

1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064
  def test_form_for_with_labelled_builder_with_nested_fields_for_without_options_hash
    klass = nil

    form_for(:post, @post, :builder => LabelledFormBuilder) do |f|
      f.fields_for(:comments, Comment.new) do |nested_fields|
        klass = nested_fields.class
        ''
      end
    end

    assert_equal LabelledFormBuilder, klass
  end

  def test_form_for_with_labelled_builder_with_nested_fields_for_with_options_hash
    klass = nil

    form_for(:post, @post, :builder => LabelledFormBuilder) do |f|
      f.fields_for(:comments, Comment.new, :index => 'foo') do |nested_fields|
        klass = nested_fields.class
        ''
      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

    form_for(:post, @post, :builder => LabelledFormBuilder) do |f|
      f.fields_for(:comments, Comment.new, :builder => LabelledFormBuilderSubclass) do |nested_fields|
        klass = nested_fields.class
        ''
      end
    end

    assert_equal LabelledFormBuilderSubclass, klass
  end

1065 1066 1067
  def test_form_for_with_html_options_adds_options_to_form_tag
    form_for(:post, @post, :html => {:id => 'some_form', :class => 'some_class'}) do |f| end
    expected = "<form action=\"http://www.example.com\" class=\"some_class\" id=\"some_form\" method=\"post\"></form>"
1068

1069
    assert_dom_equal expected, output_buffer
1070
  end
1071

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

1075
    assert_equal '<form action="http://www.otherdomain.com" method="post"></form>', output_buffer
1076 1077 1078 1079 1080 1081 1082 1083
  end

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

    assert_equal 'controller', @controller.url_for_options[:controller]
    assert_equal 'action', @controller.url_for_options[:action]
  end
1084

1085 1086 1087 1088
  def test_form_for_with_record_url_option
    form_for(:post, @post, :url => @post) do |f| end

    expected = "<form action=\"/posts/123\" method=\"post\"></form>"
1089
    assert_equal expected, output_buffer
1090 1091 1092 1093 1094 1095
  end

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

    expected = "<form action=\"/posts/123\" class=\"edit_post\" id=\"edit_post_123\" method=\"post\"><div style=\"margin:0;padding:0\"><input name=\"_method\" type=\"hidden\" value=\"put\" /></div></form>"
1096
    assert_equal expected, output_buffer
1097 1098 1099 1100 1101 1102 1103 1104 1105 1106
  end

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

    form_for(post) do |f| end

    expected = "<form action=\"/posts\" class=\"new_post\" id=\"new_post\" method=\"post\"></form>"
1107
    assert_equal expected, output_buffer
1108 1109
  end

1110 1111 1112
  def test_form_for_with_existing_object_in_list
    @post.new_record = false
    @comment.save
1113

1114 1115 1116
    form_for([@post, @comment]) {}

    expected = %(<form action="#{comment_path(@post, @comment)}" class="edit_comment" id="edit_comment_1" method="post"><div style="margin:0;padding:0"><input name="_method" type="hidden" value="put" /></div></form>)
1117
    assert_dom_equal expected, output_buffer
1118 1119 1120 1121
  end

  def test_form_for_with_new_object_in_list
    @post.new_record = false
1122

1123 1124 1125
    form_for([@post, @comment]) {}

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

1129 1130 1131
  def test_form_for_with_existing_object_and_namespace_in_list
    @post.new_record = false
    @comment.save
1132

1133
    form_for([:admin, @post, @comment]) {}
1134

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

1139 1140
  def test_form_for_with_new_object_and_namespace_in_list
    @post.new_record = false
1141

1142
    form_for([:admin, @post, @comment]) {}
1143

1144
    expected = %(<form action="#{admin_comments_path(@post)}" class="new_comment" id="new_comment" method="post"></form>)
1145
    assert_dom_equal expected, output_buffer
1146 1147
  end

1148 1149 1150 1151
  def test_form_for_with_existing_object_and_custom_url
    form_for(@post, :url => "/super_posts") do |f| end

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

1155 1156
  def test_remote_form_for_with_html_options_adds_options_to_form_tag
    self.extend ActionView::Helpers::PrototypeHelper
1157

1158 1159
    remote_form_for(:post, @post, :html => {:id => 'some_form', :class => 'some_class'}) do |f| end
    expected = "<form action=\"http://www.example.com\" class=\"some_class\" id=\"some_form\" method=\"post\" onsubmit=\"new Ajax.Request('http://www.example.com', {asynchronous:true, evalScripts:true, parameters:Form.serialize(this)}); return false;\"></form>"
1160

1161
    assert_dom_equal expected, output_buffer
1162
  end
1163 1164

  protected
1165 1166 1167
    def comments_path(post)
      "/posts/#{post.id}/comments"
    end
1168
    alias_method :post_comments_path, :comments_path
1169 1170 1171 1172

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

1175 1176 1177 1178
    def admin_comments_path(post)
      "/admin/posts/#{post.id}/comments"
    end
    alias_method :admin_post_comments_path, :admin_comments_path
1179

1180 1181 1182 1183
    def admin_comment_path(post, comment)
      "/admin/posts/#{post.id}/comments/#{comment.id}"
    end
    alias_method :admin_post_comment_path, :admin_comment_path
1184

1185 1186
    def posts_path
      "/posts"
1187 1188
    end

1189 1190
    def post_path(post)
      "/posts/#{post.id}"
1191
    end
1192 1193 1194

    def protect_against_forgery?
      false
1195
    end
1196
end