form_options_helper_test.rb 63.0 KB
Newer Older
1 2
# frozen_string_literal: true

3
require "abstract_unit"
D
Initial  
David Heinemeier Hansson 已提交
4

5 6 7 8 9 10
class Map < Hash
  def category
    "<mus>"
  end
end

11 12 13 14 15 16 17 18 19
class CustomEnumerable
  include Enumerable

  def each
    yield "one"
    yield "two"
  end
end

20 21 22 23
class FormOptionsHelperTest < ActionView::TestCase
  tests ActionView::Helpers::FormOptionsHelper

  silence_warnings do
24 25 26 27 28
    Post        = Struct.new("Post", :title, :author_name, :body, :secret, :written_on, :category, :origin, :allow_comments)
    Continent   = Struct.new("Continent", :continent_name, :countries)
    Country     = Struct.new("Country", :country_id, :country_name)
    Firm        = Struct.new("Firm", :time_zone)
    Album       = Struct.new("Album", :id, :title, :genre)
29
  end
D
Initial  
David Heinemeier Hansson 已提交
30

R
Ronak Jangir 已提交
31 32 33 34 35 36
  module FakeZones
    FakeZone = Struct.new(:name) do
      def to_s; name; end
    end

    module ClassMethods
K
Kasper Timm Hansen 已提交
37 38
      def [](id); fake_zones ? fake_zones[id] : super; end
      def all; fake_zones ? fake_zones.values : super; end
R
Ronak Jangir 已提交
39 40 41 42 43
      def dummy; :test; end
    end

    def self.prepended(base)
      class << base
K
Kasper Timm Hansen 已提交
44
        mattr_accessor(:fake_zones)
R
Ronak Jangir 已提交
45 46
        prepend ClassMethods
      end
47
    end
R
Ronak Jangir 已提交
48 49 50 51 52
  end

  ActiveSupport::TimeZone.prepend FakeZones

  setup do
K
Kasper Timm Hansen 已提交
53 54 55 56 57
    ActiveSupport::TimeZone.fake_zones = %w(A B C D E).map do |id|
      [ id, FakeZones::FakeZone.new(id) ]
    end.to_h

    @fake_timezones = ActiveSupport::TimeZone.all
R
Ronak Jangir 已提交
58 59 60
  end

  teardown do
K
Kasper Timm Hansen 已提交
61
    ActiveSupport::TimeZone.fake_zones = nil
62
  end
D
Initial  
David Heinemeier Hansson 已提交
63

64 65 66
  def test_collection_options
    assert_dom_equal(
      "<option value=\"&lt;Abe&gt;\">&lt;Abe&gt; went home</option>\n<option value=\"Babe\">Babe went home</option>\n<option value=\"Cabe\">Cabe went home</option>",
T
Tekin Suleyman 已提交
67
      options_from_collection_for_select(dummy_posts, "author_name", "title")
68 69
    )
  end
70

71 72 73
  def test_collection_options_with_preselected_value
    assert_dom_equal(
      "<option value=\"&lt;Abe&gt;\">&lt;Abe&gt; went home</option>\n<option value=\"Babe\" selected=\"selected\">Babe went home</option>\n<option value=\"Cabe\">Cabe went home</option>",
T
Tekin Suleyman 已提交
74
      options_from_collection_for_select(dummy_posts, "author_name", "title", "Babe")
75 76 77 78
    )
  end

  def test_collection_options_with_preselected_value_array
79 80 81 82
    assert_dom_equal(
      "<option value=\"&lt;Abe&gt;\">&lt;Abe&gt; went home</option>\n<option value=\"Babe\" selected=\"selected\">Babe went home</option>\n<option value=\"Cabe\" selected=\"selected\">Cabe went home</option>",
      options_from_collection_for_select(dummy_posts, "author_name", "title", [ "Babe", "Cabe" ])
    )
83
  end
D
Initial  
David Heinemeier Hansson 已提交
84

85 86 87
  def test_collection_options_with_proc_for_selected
    assert_dom_equal(
      "<option value=\"&lt;Abe&gt;\">&lt;Abe&gt; went home</option>\n<option value=\"Babe\" selected=\"selected\">Babe went home</option>\n<option value=\"Cabe\">Cabe went home</option>",
88
      options_from_collection_for_select(dummy_posts, "author_name", "title", lambda { |p| p.author_name == "Babe" })
89 90 91 92 93 94
    )
  end

  def test_collection_options_with_disabled_value
    assert_dom_equal(
      "<option value=\"&lt;Abe&gt;\">&lt;Abe&gt; went home</option>\n<option value=\"Babe\" disabled=\"disabled\">Babe went home</option>\n<option value=\"Cabe\">Cabe went home</option>",
95
      options_from_collection_for_select(dummy_posts, "author_name", "title", disabled: "Babe")
96 97 98 99 100 101
    )
  end

  def test_collection_options_with_disabled_array
    assert_dom_equal(
      "<option value=\"&lt;Abe&gt;\">&lt;Abe&gt; went home</option>\n<option value=\"Babe\" disabled=\"disabled\">Babe went home</option>\n<option value=\"Cabe\" disabled=\"disabled\">Cabe went home</option>",
102
      options_from_collection_for_select(dummy_posts, "author_name", "title", disabled: [ "Babe", "Cabe" ])
103 104 105 106 107 108
    )
  end

  def test_collection_options_with_preselected_and_disabled_value
    assert_dom_equal(
      "<option value=\"&lt;Abe&gt;\">&lt;Abe&gt; went home</option>\n<option value=\"Babe\" disabled=\"disabled\">Babe went home</option>\n<option value=\"Cabe\" selected=\"selected\">Cabe went home</option>",
109
      options_from_collection_for_select(dummy_posts, "author_name", "title", selected: "Cabe", disabled: "Babe")
110 111 112 113 114 115
    )
  end

  def test_collection_options_with_proc_for_disabled
    assert_dom_equal(
      "<option value=\"&lt;Abe&gt;\">&lt;Abe&gt; went home</option>\n<option value=\"Babe\" disabled=\"disabled\">Babe went home</option>\n<option value=\"Cabe\" disabled=\"disabled\">Cabe went home</option>",
116
      options_from_collection_for_select(dummy_posts, "author_name", "title", disabled: lambda { |p| %w(Babe Cabe).include?(p.author_name) })
117 118 119
    )
  end

120 121 122 123 124 125 126 127 128 129 130 131 132 133
  def test_collection_options_with_proc_for_value_method
    assert_dom_equal(
      "<option value=\"&lt;Abe&gt;\">&lt;Abe&gt; went home</option>\n<option value=\"Babe\">Babe went home</option>\n<option value=\"Cabe\">Cabe went home</option>",
      options_from_collection_for_select(dummy_posts, lambda { |p| p.author_name }, "title")
    )
  end

  def test_collection_options_with_proc_for_text_method
    assert_dom_equal(
      "<option value=\"&lt;Abe&gt;\">&lt;Abe&gt; went home</option>\n<option value=\"Babe\">Babe went home</option>\n<option value=\"Cabe\">Cabe went home</option>",
      options_from_collection_for_select(dummy_posts, "author_name", lambda { |p| p.title })
    )
  end

134 135 136
  def test_collection_options_with_element_attributes
    assert_dom_equal(
      "<option value=\"USA\" class=\"bold\">USA</option>",
137
      options_from_collection_for_select([[ "USA", "USA", { class: "bold" } ]], :first, :second)
138 139 140
    )
  end

141 142 143 144 145 146 147 148
  def test_string_options_for_select
    options = "<option value=\"Denmark\">Denmark</option><option value=\"USA\">USA</option><option value=\"Sweden\">Sweden</option>"
    assert_dom_equal(
      options,
      options_for_select(options)
    )
  end

149 150 151 152 153 154
  def test_array_options_for_select
    assert_dom_equal(
      "<option value=\"&lt;Denmark&gt;\">&lt;Denmark&gt;</option>\n<option value=\"USA\">USA</option>\n<option value=\"Sweden\">Sweden</option>",
      options_for_select([ "<Denmark>", "USA", "Sweden" ])
    )
  end
D
Initial  
David Heinemeier Hansson 已提交
155

156 157 158 159
  def test_array_options_for_select_with_custom_defined_selected
    assert_dom_equal(
      "<option selected=\"selected\" type=\"Coach\" value=\"1\">Richard Bandler</option>\n<option type=\"Coachee\" value=\"1\">Richard Bandler</option>",
      options_for_select([
160 161
        ["Richard Bandler", 1, { type: "Coach", selected: "selected" }],
        ["Richard Bandler", 1, { type: "Coachee" }]
162 163 164 165 166 167 168 169
      ])
    )
  end

  def test_array_options_for_select_with_custom_defined_disabled
    assert_dom_equal(
      "<option disabled=\"disabled\" type=\"Coach\" value=\"1\">Richard Bandler</option>\n<option type=\"Coachee\" value=\"1\">Richard Bandler</option>",
      options_for_select([
170 171
        ["Richard Bandler", 1, { type: "Coach", disabled: "disabled" }],
        ["Richard Bandler", 1, { type: "Coachee" }]
172 173 174 175
      ])
    )
  end

176 177 178 179 180 181
  def test_array_options_for_select_with_selection
    assert_dom_equal(
      "<option value=\"Denmark\">Denmark</option>\n<option value=\"&lt;USA&gt;\" selected=\"selected\">&lt;USA&gt;</option>\n<option value=\"Sweden\">Sweden</option>",
      options_for_select([ "Denmark", "<USA>", "Sweden" ], "<USA>")
    )
  end
D
Initial  
David Heinemeier Hansson 已提交
182

183
  def test_array_options_for_select_with_selection_array
184 185 186 187
    assert_dom_equal(
      "<option value=\"Denmark\">Denmark</option>\n<option value=\"&lt;USA&gt;\" selected=\"selected\">&lt;USA&gt;</option>\n<option value=\"Sweden\" selected=\"selected\">Sweden</option>",
      options_for_select([ "Denmark", "<USA>", "Sweden" ], [ "<USA>", "Sweden" ])
    )
188
  end
189

190 191 192
  def test_array_options_for_select_with_disabled_value
    assert_dom_equal(
      "<option value=\"Denmark\">Denmark</option>\n<option value=\"&lt;USA&gt;\" disabled=\"disabled\">&lt;USA&gt;</option>\n<option value=\"Sweden\">Sweden</option>",
193
      options_for_select([ "Denmark", "<USA>", "Sweden" ], disabled: "<USA>")
194 195 196 197 198 199
    )
  end

  def test_array_options_for_select_with_disabled_array
    assert_dom_equal(
      "<option value=\"Denmark\">Denmark</option>\n<option value=\"&lt;USA&gt;\" disabled=\"disabled\">&lt;USA&gt;</option>\n<option value=\"Sweden\" disabled=\"disabled\">Sweden</option>",
200
      options_for_select([ "Denmark", "<USA>", "Sweden" ], disabled: ["<USA>", "Sweden"])
201 202 203 204 205 206
    )
  end

  def test_array_options_for_select_with_selection_and_disabled_value
    assert_dom_equal(
      "<option value=\"Denmark\" selected=\"selected\">Denmark</option>\n<option value=\"&lt;USA&gt;\" disabled=\"disabled\">&lt;USA&gt;</option>\n<option value=\"Sweden\">Sweden</option>",
207
      options_for_select([ "Denmark", "<USA>", "Sweden" ], selected: "Denmark", disabled: "<USA>")
208 209 210
    )
  end

211 212 213
  def test_boolean_array_options_for_select_with_selection_and_disabled_value
    assert_dom_equal(
      "<option value=\"true\">true</option>\n<option value=\"false\" selected=\"selected\">false</option>",
214
      options_for_select([ true, false ], selected: false, disabled: nil)
215 216 217
    )
  end

218 219 220 221 222 223 224
  def test_range_options_for_select
    assert_dom_equal(
      "<option value=\"1\">1</option>\n<option value=\"2\">2</option>\n<option value=\"3\">3</option>",
      options_for_select(1..3)
    )
  end

225
  def test_array_options_for_string_include_in_other_string_bug_fix
226 227 228 229 230 231 232 233 234 235 236 237
    assert_dom_equal(
      "<option value=\"ruby\">ruby</option>\n<option value=\"rubyonrails\" selected=\"selected\">rubyonrails</option>",
      options_for_select([ "ruby", "rubyonrails" ], "rubyonrails")
    )
    assert_dom_equal(
      "<option value=\"ruby\" selected=\"selected\">ruby</option>\n<option value=\"rubyonrails\">rubyonrails</option>",
      options_for_select([ "ruby", "rubyonrails" ], "ruby")
    )
    assert_dom_equal(
      %(<option value="ruby" selected="selected">ruby</option>\n<option value="rubyonrails">rubyonrails</option>\n<option value=""></option>),
      options_for_select([ "ruby", "rubyonrails", nil ], "ruby")
    )
238
  end
D
Initial  
David Heinemeier Hansson 已提交
239

240 241
  def test_hash_options_for_select
    assert_dom_equal(
V
Vasiliy Ermolovich 已提交
242 243
      "<option value=\"Dollar\">$</option>\n<option value=\"&lt;Kroner&gt;\">&lt;DKR&gt;</option>",
      options_for_select("$" => "Dollar", "<DKR>" => "<Kroner>").split("\n").join("\n")
244 245
    )
    assert_dom_equal(
V
Vasiliy Ermolovich 已提交
246 247
      "<option value=\"Dollar\" selected=\"selected\">$</option>\n<option value=\"&lt;Kroner&gt;\">&lt;DKR&gt;</option>",
      options_for_select({ "$" => "Dollar", "<DKR>" => "<Kroner>" }, "Dollar").split("\n").join("\n")
248 249
    )
    assert_dom_equal(
V
Vasiliy Ermolovich 已提交
250 251
      "<option value=\"Dollar\" selected=\"selected\">$</option>\n<option value=\"&lt;Kroner&gt;\" selected=\"selected\">&lt;DKR&gt;</option>",
      options_for_select({ "$" => "Dollar", "<DKR>" => "<Kroner>" }, [ "Dollar", "<Kroner>" ]).split("\n").join("\n")
252 253
    )
  end
D
Initial  
David Heinemeier Hansson 已提交
254

255 256 257 258 259 260 261 262 263 264 265 266 267 268 269
  def test_ducktyped_options_for_select
    quack = Struct.new(:first, :last)
    assert_dom_equal(
      "<option value=\"&lt;Kroner&gt;\">&lt;DKR&gt;</option>\n<option value=\"Dollar\">$</option>",
      options_for_select([quack.new("<DKR>", "<Kroner>"), quack.new("$", "Dollar")])
    )
    assert_dom_equal(
      "<option value=\"&lt;Kroner&gt;\">&lt;DKR&gt;</option>\n<option value=\"Dollar\" selected=\"selected\">$</option>",
      options_for_select([quack.new("<DKR>", "<Kroner>"), quack.new("$", "Dollar")], "Dollar")
    )
    assert_dom_equal(
      "<option value=\"&lt;Kroner&gt;\" selected=\"selected\">&lt;DKR&gt;</option>\n<option value=\"Dollar\" selected=\"selected\">$</option>",
      options_for_select([quack.new("<DKR>", "<Kroner>"), quack.new("$", "Dollar")], ["Dollar", "<Kroner>"])
    )
  end
D
Initial  
David Heinemeier Hansson 已提交
270

271
  def test_collection_options_with_preselected_value_as_string_and_option_value_is_integer
272
    albums = [ Album.new(1, "first", "rap"), Album.new(2, "second", "pop")]
273
    assert_dom_equal(
274 275
      %(<option selected="selected" value="1">rap</option>\n<option value="2">pop</option>),
      options_from_collection_for_select(albums, "id", "genre", selected: "1")
276 277 278 279
    )
  end

  def test_collection_options_with_preselected_value_as_integer_and_option_value_is_string
280
    albums = [ Album.new("1", "first", "rap"), Album.new("2", "second", "pop")]
281 282

    assert_dom_equal(
283 284
      %(<option selected="selected" value="1">rap</option>\n<option value="2">pop</option>),
      options_from_collection_for_select(albums, "id", "genre", selected: 1)
285 286 287 288
    )
  end

  def test_collection_options_with_preselected_value_as_string_and_option_value_is_float
289
    albums = [ Album.new(1.0, "first", "rap"), Album.new(2.0, "second", "pop")]
290 291

    assert_dom_equal(
292 293
      %(<option value="1.0">rap</option>\n<option value="2.0" selected="selected">pop</option>),
      options_from_collection_for_select(albums, "id", "genre", selected: "2.0")
294 295 296 297
    )
  end

  def test_collection_options_with_preselected_value_as_nil
298
    albums = [ Album.new(1.0, "first", "rap"), Album.new(2.0, "second", "pop")]
299 300

    assert_dom_equal(
301 302
      %(<option value="1.0">rap</option>\n<option value="2.0">pop</option>),
      options_from_collection_for_select(albums, "id", "genre", selected: nil)
303 304 305 306
    )
  end

  def test_collection_options_with_disabled_value_as_nil
307
    albums = [ Album.new(1.0, "first", "rap"), Album.new(2.0, "second", "pop")]
308 309

    assert_dom_equal(
310 311
      %(<option value="1.0">rap</option>\n<option value="2.0">pop</option>),
      options_from_collection_for_select(albums, "id", "genre", disabled: nil)
312 313 314 315
    )
  end

  def test_collection_options_with_disabled_value_as_array
316
    albums = [ Album.new(1.0, "first", "rap"), Album.new(2.0, "second", "pop")]
317 318

    assert_dom_equal(
319 320
      %(<option disabled="disabled" value="1.0">rap</option>\n<option disabled="disabled" value="2.0">pop</option>),
      options_from_collection_for_select(albums, "id", "genre", disabled: ["1.0", 2.0])
321 322 323 324
    )
  end

  def test_collection_options_with_preselected_values_as_string_array_and_option_value_is_float
325
    albums = [ Album.new(1.0, "first", "rap"), Album.new(2.0, "second", "pop"), Album.new(3.0, "third", "country") ]
326 327

    assert_dom_equal(
328 329
      %(<option value="1.0" selected="selected">rap</option>\n<option value="2.0">pop</option>\n<option value="3.0" selected="selected">country</option>),
      options_from_collection_for_select(albums, "id", "genre", ["1.0", "3.0"])
330 331 332
    )
  end

333 334 335
  def test_option_groups_from_collection_for_select
    assert_dom_equal(
      "<optgroup label=\"&lt;Africa&gt;\"><option value=\"&lt;sa&gt;\">&lt;South Africa&gt;</option>\n<option value=\"so\">Somalia</option></optgroup><optgroup label=\"Europe\"><option value=\"dk\" selected=\"selected\">Denmark</option>\n<option value=\"ie\">Ireland</option></optgroup>",
336
      option_groups_from_collection_for_select(dummy_continents, "countries", "continent_name", "country_id", "country_name", "dk")
337 338
    )
  end
339

340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355
  def test_option_groups_from_collection_for_select_with_callable_group_method
    group_proc = Proc.new { |c| c.countries }
    assert_dom_equal(
      "<optgroup label=\"&lt;Africa&gt;\"><option value=\"&lt;sa&gt;\">&lt;South Africa&gt;</option>\n<option value=\"so\">Somalia</option></optgroup><optgroup label=\"Europe\"><option value=\"dk\" selected=\"selected\">Denmark</option>\n<option value=\"ie\">Ireland</option></optgroup>",
      option_groups_from_collection_for_select(dummy_continents, group_proc, "continent_name", "country_id", "country_name", "dk")
    )
  end

  def test_option_groups_from_collection_for_select_with_callable_group_label_method
    label_proc = Proc.new { |c| c.continent_name }
    assert_dom_equal(
      "<optgroup label=\"&lt;Africa&gt;\"><option value=\"&lt;sa&gt;\">&lt;South Africa&gt;</option>\n<option value=\"so\">Somalia</option></optgroup><optgroup label=\"Europe\"><option value=\"dk\" selected=\"selected\">Denmark</option>\n<option value=\"ie\">Ireland</option></optgroup>",
      option_groups_from_collection_for_select(dummy_continents, "countries", label_proc, "country_id", "country_name", "dk")
    )
  end

356 357 358 359
  def test_option_groups_from_collection_for_select_returns_html_safe_string
    assert option_groups_from_collection_for_select(dummy_continents, "countries", "continent_name", "country_id", "country_name", "dk").html_safe?
  end

360 361 362 363 364
  def test_grouped_options_for_select_with_array
    assert_dom_equal(
      "<optgroup label=\"North America\"><option value=\"US\">United States</option>\n<option value=\"Canada\">Canada</option></optgroup><optgroup label=\"Europe\"><option value=\"GB\">Great Britain</option>\n<option value=\"Germany\">Germany</option></optgroup>",
      grouped_options_for_select([
         ["North America",
365
             [["United States", "US"], "Canada"]],
366
         ["Europe",
367
             [["Great Britain", "GB"], "Germany"]]
368 369
       ])
    )
370 371 372 373 374 375
  end

  def test_grouped_options_for_select_with_array_and_html_attributes
    assert_dom_equal(
      "<optgroup label=\"North America\" data-foo=\"bar\"><option value=\"US\">United States</option>\n<option value=\"Canada\">Canada</option></optgroup><optgroup label=\"Europe\" disabled=\"disabled\"><option value=\"GB\">Great Britain</option>\n<option value=\"Germany\">Germany</option></optgroup>",
      grouped_options_for_select([
376 377
         ["North America", [["United States", "US"], "Canada"], data: { foo: "bar" }],
         ["Europe", [["Great Britain", "GB"], "Germany"], disabled: "disabled"]
378 379
       ])
    )
380
  end
381

382
  def test_grouped_options_for_select_with_optional_divider
383
    assert_dom_equal(
384 385
      "<optgroup label=\"----------\"><option value=\"US\">US</option>\n<option value=\"Canada\">Canada</option></optgroup><optgroup label=\"----------\"><option value=\"GB\">GB</option>\n<option value=\"Germany\">Germany</option></optgroup>",

386
      grouped_options_for_select([["US", "Canada"] , ["GB", "Germany"]], nil, divider: "----------")
387 388 389 390 391
    )
  end

  def test_grouped_options_for_select_with_selected_and_prompt
    assert_dom_equal(
392 393
      "<option value=\"\">Choose a product...</option><optgroup label=\"Hats\"><option value=\"Baseball Cap\">Baseball Cap</option>\n<option selected=\"selected\" value=\"Cowboy Hat\">Cowboy Hat</option></optgroup>",
      grouped_options_for_select([["Hats", ["Baseball Cap", "Cowboy Hat"]]], "Cowboy Hat", prompt: "Choose a product...")
394 395
    )
  end
396

397 398
  def test_grouped_options_for_select_with_selected_and_prompt_true
    assert_dom_equal(
399 400
      "<option value=\"\">Please select</option><optgroup label=\"Hats\"><option value=\"Baseball Cap\">Baseball Cap</option>\n<option selected=\"selected\" value=\"Cowboy Hat\">Cowboy Hat</option></optgroup>",
      grouped_options_for_select([["Hats", ["Baseball Cap", "Cowboy Hat"]]], "Cowboy Hat", prompt: true)
401 402 403
    )
  end

404
  def test_grouped_options_for_select_returns_html_safe_string
405
    assert grouped_options_for_select([["Hats", ["Baseball Cap", "Cowboy Hat"]]]).html_safe?
406 407
  end

408 409 410
  def test_grouped_options_for_select_with_prompt_returns_html_escaped_string
    assert_dom_equal(
      "<option value=\"\">&lt;Choose One&gt;</option><optgroup label=\"Hats\"><option value=\"Baseball Cap\">Baseball Cap</option>\n<option value=\"Cowboy Hat\">Cowboy Hat</option></optgroup>",
411
      grouped_options_for_select([["Hats", ["Baseball Cap", "Cowboy Hat"]]], nil, prompt: "<Choose One>"))
412 413
  end

414 415
  def test_optgroups_with_with_options_with_hash
    assert_dom_equal(
416 417
      "<optgroup label=\"North America\"><option value=\"United States\">United States</option>\n<option value=\"Canada\">Canada</option></optgroup><optgroup label=\"Europe\"><option value=\"Denmark\">Denmark</option>\n<option value=\"Germany\">Germany</option></optgroup>",
      grouped_options_for_select("North America" => ["United States", "Canada"], "Europe" => ["Denmark", "Germany"])
418 419
    )
  end
420

421
  def test_time_zone_options_no_params
422
    opts = time_zone_options_for_select
423 424 425 426
    assert_dom_equal "<option value=\"A\">A</option>\n" \
                 "<option value=\"B\">B</option>\n" \
                 "<option value=\"C\">C</option>\n" \
                 "<option value=\"D\">D</option>\n" \
427 428 429
                 "<option value=\"E\">E</option>",
                 opts
  end
430

431
  def test_time_zone_options_with_selected
432
    opts = time_zone_options_for_select("D")
433 434 435 436
    assert_dom_equal "<option value=\"A\">A</option>\n" \
                 "<option value=\"B\">B</option>\n" \
                 "<option value=\"C\">C</option>\n" \
                 "<option value=\"D\" selected=\"selected\">D</option>\n" \
437 438 439
                 "<option value=\"E\">E</option>",
                 opts
  end
440

441
  def test_time_zone_options_with_unknown_selected
442
    opts = time_zone_options_for_select("K")
443 444 445 446
    assert_dom_equal "<option value=\"A\">A</option>\n" \
                 "<option value=\"B\">B</option>\n" \
                 "<option value=\"C\">C</option>\n" \
                 "<option value=\"D\">D</option>\n" \
447 448 449
                 "<option value=\"E\">E</option>",
                 opts
  end
450

451
  def test_time_zone_options_with_priority_zones
452 453
    zones = [ ActiveSupport::TimeZone.new("B"), ActiveSupport::TimeZone.new("E") ]
    opts = time_zone_options_for_select(nil, zones)
454 455 456 457 458
    assert_dom_equal "<option value=\"B\">B</option>\n" \
                 "<option value=\"E\">E</option>" \
                 "<option value=\"\" disabled=\"disabled\">-------------</option>\n" \
                 "<option value=\"A\">A</option>\n" \
                 "<option value=\"C\">C</option>\n" \
459 460 461
                 "<option value=\"D\">D</option>",
                 opts
  end
462

463
  def test_time_zone_options_with_selected_priority_zones
464 465
    zones = [ ActiveSupport::TimeZone.new("B"), ActiveSupport::TimeZone.new("E") ]
    opts = time_zone_options_for_select("E", zones)
466 467 468 469 470
    assert_dom_equal "<option value=\"B\">B</option>\n" \
                 "<option value=\"E\" selected=\"selected\">E</option>" \
                 "<option value=\"\" disabled=\"disabled\">-------------</option>\n" \
                 "<option value=\"A\">A</option>\n" \
                 "<option value=\"C\">C</option>\n" \
471 472 473
                 "<option value=\"D\">D</option>",
                 opts
  end
474

475
  def test_time_zone_options_with_unselected_priority_zones
476 477
    zones = [ ActiveSupport::TimeZone.new("B"), ActiveSupport::TimeZone.new("E") ]
    opts = time_zone_options_for_select("C", zones)
478 479 480 481 482
    assert_dom_equal "<option value=\"B\">B</option>\n" \
                 "<option value=\"E\">E</option>" \
                 "<option value=\"\" disabled=\"disabled\">-------------</option>\n" \
                 "<option value=\"A\">A</option>\n" \
                 "<option value=\"C\" selected=\"selected\">C</option>\n" \
483 484 485
                 "<option value=\"D\">D</option>",
                 opts
  end
486

487 488
  def test_time_zone_options_with_priority_zones_does_not_mutate_time_zones
    original_zones = ActiveSupport::TimeZone.all.dup
489
    zones = [ ActiveSupport::TimeZone.new("B"), ActiveSupport::TimeZone.new("E") ]
490
    time_zone_options_for_select(nil, zones)
491 492
    assert_equal original_zones, ActiveSupport::TimeZone.all
  end
D
Initial  
David Heinemeier Hansson 已提交
493

494 495 496 497
  def test_time_zone_options_returns_html_safe_string
    assert time_zone_options_for_select.html_safe?
  end

498 499 500 501 502 503 504 505
  def test_select
    @post = Post.new
    @post.category = "<mus>"
    assert_dom_equal(
      "<select id=\"post_category\" name=\"post[category]\"><option value=\"abe\">abe</option>\n<option value=\"&lt;mus&gt;\" selected=\"selected\">&lt;mus&gt;</option>\n<option value=\"hest\">hest</option></select>",
      select("post", "category", %w( abe <mus> hest))
    )
  end
506

507 508 509
  def test_select_without_multiple
    assert_dom_equal(
      "<select id=\"post_category\" name=\"post[category]\"></select>",
K
Koichi ITO 已提交
510
      select(:post, :category, "", {}, { multiple: false })
511 512 513
    )
  end

A
Andrew Radev 已提交
514 515 516 517 518 519 520 521 522 523
  def test_select_with_grouped_collection_as_nested_array
    @post = Post.new

    countries_by_continent = [
      ["<Africa>", [["<South Africa>", "<sa>"], ["Somalia", "so"]]],
      ["Europe",   [["Denmark", "dk"], ["Ireland", "ie"]]],
    ]

    assert_dom_equal(
      [
524 525 526
        '<select id="post_origin" name="post[origin]"><optgroup label="&lt;Africa&gt;"><option value="&lt;sa&gt;">&lt;South Africa&gt;</option>',
        '<option value="so">Somalia</option></optgroup><optgroup label="Europe"><option value="dk">Denmark</option>',
        '<option value="ie">Ireland</option></optgroup></select>',
A
Andrew Radev 已提交
527 528 529 530 531 532 533 534 535 536 537 538 539 540 541
      ].join("\n"),
      select("post", "origin", countries_by_continent)
    )
  end

  def test_select_with_grouped_collection_as_hash
    @post = Post.new

    countries_by_continent = {
      "<Africa>" => [["<South Africa>", "<sa>"], ["Somalia", "so"]],
      "Europe"   => [["Denmark", "dk"], ["Ireland", "ie"]],
    }

    assert_dom_equal(
      [
542 543 544
        '<select id="post_origin" name="post[origin]"><optgroup label="&lt;Africa&gt;"><option value="&lt;sa&gt;">&lt;South Africa&gt;</option>',
        '<option value="so">Somalia</option></optgroup><optgroup label="Europe"><option value="dk">Denmark</option>',
        '<option value="ie">Ireland</option></optgroup></select>',
A
Andrew Radev 已提交
545 546 547 548 549
      ].join("\n"),
      select("post", "origin", countries_by_continent)
    )
  end

550 551 552 553 554 555 556 557 558
  def test_select_with_boolean_method
    @post = Post.new
    @post.allow_comments = false
    assert_dom_equal(
      "<select id=\"post_allow_comments\" name=\"post[allow_comments]\"><option value=\"true\">true</option>\n<option value=\"false\" selected=\"selected\">false</option></select>",
      select("post", "allow_comments", %w( true false ))
    )
  end

559 560 561
  def test_select_under_fields_for
    @post = Post.new
    @post.category = "<mus>"
562

W
wycats 已提交
563
    output_buffer = fields_for :post, @post do |f|
564 565
      concat f.select(:category, %w( abe <mus> hest))
    end
566

567 568 569 570 571
    assert_dom_equal(
      "<select id=\"post_category\" name=\"post[category]\"><option value=\"abe\">abe</option>\n<option value=\"&lt;mus&gt;\" selected=\"selected\">&lt;mus&gt;</option>\n<option value=\"hest\">hest</option></select>",
      output_buffer
    )
  end
572

573 574 575 576 577 578 579 580 581 582 583 584 585
  def test_fields_for_with_record_inherited_from_hash
    map = Map.new

    output_buffer = fields_for :map, map do |f|
      concat f.select(:category, %w( abe <mus> hest))
    end

    assert_dom_equal(
      "<select id=\"map_category\" name=\"map[category]\"><option value=\"abe\">abe</option>\n<option value=\"&lt;mus&gt;\" selected=\"selected\">&lt;mus&gt;</option>\n<option value=\"hest\">hest</option></select>",
      output_buffer
    )
  end

586 587 588
  def test_select_under_fields_for_with_index
    @post = Post.new
    @post.category = "<mus>"
589

590
    output_buffer = fields_for :post, @post, index: 108 do |f|
591
      concat f.select(:category, %w( abe <mus> hest))
592 593
    end

594 595 596 597 598
    assert_dom_equal(
      "<select id=\"post_108_category\" name=\"post[108][category]\"><option value=\"abe\">abe</option>\n<option value=\"&lt;mus&gt;\" selected=\"selected\">&lt;mus&gt;</option>\n<option value=\"hest\">hest</option></select>",
      output_buffer
    )
  end
599

600 601 602 603
  def test_select_under_fields_for_with_auto_index
    @post = Post.new
    @post.category = "<mus>"
    def @post.to_param; 108; end
604

W
wycats 已提交
605
    output_buffer = fields_for "post[]", @post do |f|
606
      concat f.select(:category, %w( abe <mus> hest))
607 608
    end

609 610 611 612 613
    assert_dom_equal(
      "<select id=\"post_108_category\" name=\"post[108][category]\"><option value=\"abe\">abe</option>\n<option value=\"&lt;mus&gt;\" selected=\"selected\">&lt;mus&gt;</option>\n<option value=\"hest\">hest</option></select>",
      output_buffer
    )
  end
D
Initial  
David Heinemeier Hansson 已提交
614

615 616
  def test_select_under_fields_for_with_string_and_given_prompt
    @post = Post.new
617
    options = raw("<option value=\"abe\">abe</option><option value=\"mus\">mus</option><option value=\"hest\">hest</option>")
618

W
wycats 已提交
619
    output_buffer = fields_for :post, @post do |f|
620
      concat f.select(:category, options, prompt: "The prompt")
621 622 623 624 625 626 627 628
    end

    assert_dom_equal(
      "<select id=\"post_category\" name=\"post[category]\"><option value=\"\">The prompt</option>\n#{options}</select>",
      output_buffer
    )
  end

629 630 631 632 633 634 635 636 637 638 639 640 641 642 643
  def test_select_under_fields_for_with_block
    @post = Post.new

    output_buffer = fields_for :post, @post do |f|
      concat(f.select(:category) do
        concat content_tag(:option, "hello world")
      end)
    end

    assert_dom_equal(
      "<select id=\"post_category\" name=\"post[category]\"><option>hello world</option></select>",
      output_buffer
    )
  end

644 645 646 647 648 649 650 651 652 653 654 655 656
  def test_select_under_fields_for_with_block_without_options
    @post = Post.new

    output_buffer = fields_for :post, @post do |f|
      concat(f.select(:category) {})
    end

    assert_dom_equal(
      "<select id=\"post_category\" name=\"post[category]\"></select>",
      output_buffer
    )
  end

657
  def test_select_with_multiple_to_add_hidden_input
K
Koichi ITO 已提交
658
    output_buffer = select(:post, :category, "", {}, { multiple: true })
659 660 661 662 663 664
    assert_dom_equal(
      "<input type=\"hidden\" name=\"post[category][]\" value=\"\"/><select multiple=\"multiple\" id=\"post_category\" name=\"post[category][]\"></select>",
      output_buffer
    )
  end

665
  def test_select_with_multiple_and_without_hidden_input
K
Koichi ITO 已提交
666
    output_buffer = select(:post, :category, "", { include_hidden: false }, { multiple: true })
667 668
    assert_dom_equal(
      "<select multiple=\"multiple\" id=\"post_category\" name=\"post[category][]\"></select>",
669 670 671 672 673
      output_buffer
    )
  end

  def test_select_with_multiple_and_with_explicit_name_ending_with_brackets
K
Koichi ITO 已提交
674
    output_buffer = select(:post, :category, [], { include_hidden: false }, { multiple: true, name: "post[category][]" })
675 676
    assert_dom_equal(
      "<select multiple=\"multiple\" id=\"post_category\" name=\"post[category][]\"></select>",
677 678 679 680
      output_buffer
    )
  end

681
  def test_select_with_multiple_and_disabled_to_add_disabled_hidden_input
K
Koichi ITO 已提交
682
    output_buffer = select(:post, :category, "", {}, { multiple: true, disabled: true })
683 684 685 686 687 688
    assert_dom_equal(
      "<input disabled=\"disabled\"type=\"hidden\" name=\"post[category][]\" value=\"\"/><select multiple=\"multiple\" disabled=\"disabled\" id=\"post_category\" name=\"post[category][]\"></select>",
      output_buffer
    )
  end

689 690 691 692 693
  def test_select_with_blank
    @post = Post.new
    @post.category = "<mus>"
    assert_dom_equal(
      "<select id=\"post_category\" name=\"post[category]\"><option value=\"\"></option>\n<option value=\"abe\">abe</option>\n<option value=\"&lt;mus&gt;\" selected=\"selected\">&lt;mus&gt;</option>\n<option value=\"hest\">hest</option></select>",
694
      select("post", "category", %w( abe <mus> hest), include_blank: true)
695 696
    )
  end
697

698 699 700
  def test_select_with_include_blank_false_and_required
    @post = Post.new
    @post.category = "<mus>"
K
Koichi ITO 已提交
701
    e = assert_raises(ArgumentError) { select("post", "category", %w( abe <mus> hest), { include_blank: false }, { required: "required" }) }
702 703 704
    assert_match(/include_blank cannot be false for a required field./, e.message)
  end

705 706 707 708 709
  def test_select_with_blank_as_string
    @post = Post.new
    @post.category = "<mus>"
    assert_dom_equal(
      "<select id=\"post_category\" name=\"post[category]\"><option value=\"\">None</option>\n<option value=\"abe\">abe</option>\n<option value=\"&lt;mus&gt;\" selected=\"selected\">&lt;mus&gt;</option>\n<option value=\"hest\">hest</option></select>",
710
      select("post", "category", %w( abe <mus> hest), include_blank: "None")
711 712
    )
  end
713

714 715 716 717 718
  def test_select_with_blank_as_string_escaped
    @post = Post.new
    @post.category = "<mus>"
    assert_dom_equal(
      "<select id=\"post_category\" name=\"post[category]\"><option value=\"\">&lt;None&gt;</option>\n<option value=\"abe\">abe</option>\n<option value=\"&lt;mus&gt;\" selected=\"selected\">&lt;mus&gt;</option>\n<option value=\"hest\">hest</option></select>",
719
      select("post", "category", %w( abe <mus> hest), include_blank: "<None>")
720 721 722
    )
  end

723 724 725 726 727
  def test_select_with_default_prompt
    @post = Post.new
    @post.category = ""
    assert_dom_equal(
      "<select id=\"post_category\" name=\"post[category]\"><option value=\"\">Please select</option>\n<option value=\"abe\">abe</option>\n<option value=\"&lt;mus&gt;\">&lt;mus&gt;</option>\n<option value=\"hest\">hest</option></select>",
728
      select("post", "category", %w( abe <mus> hest), prompt: true)
729 730
    )
  end
731

732 733 734 735 736
  def test_select_no_prompt_when_select_has_value
    @post = Post.new
    @post.category = "<mus>"
    assert_dom_equal(
      "<select id=\"post_category\" name=\"post[category]\"><option value=\"abe\">abe</option>\n<option value=\"&lt;mus&gt;\" selected=\"selected\">&lt;mus&gt;</option>\n<option value=\"hest\">hest</option></select>",
737
      select("post", "category", %w( abe <mus> hest), prompt: true)
738 739
    )
  end
740

741 742 743 744 745
  def test_select_with_given_prompt
    @post = Post.new
    @post.category = ""
    assert_dom_equal(
      "<select id=\"post_category\" name=\"post[category]\"><option value=\"\">The prompt</option>\n<option value=\"abe\">abe</option>\n<option value=\"&lt;mus&gt;\">&lt;mus&gt;</option>\n<option value=\"hest\">hest</option></select>",
746
      select("post", "category", %w( abe <mus> hest), prompt: "The prompt")
747 748
    )
  end
749

750 751 752 753
  def test_select_with_given_prompt_escaped
    @post = Post.new
    assert_dom_equal(
      "<select id=\"post_category\" name=\"post[category]\"><option value=\"\">&lt;The prompt&gt;</option>\n<option value=\"abe\">abe</option>\n<option value=\"&lt;mus&gt;\">&lt;mus&gt;</option>\n<option value=\"hest\">hest</option></select>",
754
      select("post", "category", %w( abe <mus> hest), prompt: "<The prompt>")
755 756 757
    )
  end

758 759 760 761 762
  def test_select_with_prompt_and_blank
    @post = Post.new
    @post.category = ""
    assert_dom_equal(
      "<select id=\"post_category\" name=\"post[category]\"><option value=\"\">Please select</option>\n<option value=\"\"></option>\n<option value=\"abe\">abe</option>\n<option value=\"&lt;mus&gt;\">&lt;mus&gt;</option>\n<option value=\"hest\">hest</option></select>",
763
      select("post", "category", %w( abe <mus> hest), prompt: true, include_blank: true)
764 765 766
    )
  end

767
  def test_select_with_empty
768 769 770 771
    @post = Post.new
    @post.category = ""
    assert_dom_equal(
      "<select id=\"post_category\" name=\"post[category]\"><option value=\"\">Please select</option>\n<option value=\"\"></option>\n</select>",
772
      select("post", "category", [], prompt: true, include_blank: true)
773 774 775
    )
  end

776 777 778 779
  def test_select_with_html_options
    @post = Post.new
    @post.category = ""
    assert_dom_equal(
780
      "<select class=\"disabled\" disabled=\"disabled\" name=\"post[category]\" id=\"post_category\"><option value=\"\">Please select</option>\n<option value=\"\"></option>\n</select>",
K
Koichi ITO 已提交
781
      select("post", "category", [], { prompt: true, include_blank: true }, { class: "disabled", disabled: true })
782 783 784
    )
  end

785 786 787 788 789 790 791 792
  def test_select_with_nil
    @post = Post.new
    @post.category = "othervalue"
    assert_dom_equal(
      "<select id=\"post_category\" name=\"post[category]\"><option value=\"\"></option>\n<option value=\"othervalue\" selected=\"selected\">othervalue</option></select>",
      select("post", "category", [nil, "othervalue"])
    )
  end
793 794 795 796

  def test_required_select
    assert_dom_equal(
      %(<select id="post_category" name="post[category]" required="required"><option value=""></option>\n<option value="abe">abe</option>\n<option value="mus">mus</option>\n<option value="hest">hest</option></select>),
K
Koichi ITO 已提交
797
      select("post", "category", %w(abe mus hest), {}, { required: true })
798 799
    )
  end
800 801 802 803

  def test_required_select_with_include_blank_prompt
    assert_dom_equal(
      %(<select id="post_category" name="post[category]" required="required"><option value="">Select one</option>\n<option value="abe">abe</option>\n<option value="mus">mus</option>\n<option value="hest">hest</option></select>),
K
Koichi ITO 已提交
804
      select("post", "category", %w(abe mus hest), { include_blank: "Select one" }, { required: true })
805
    )
806 807
  end

808 809 810
  def test_required_select_with_prompt
    assert_dom_equal(
      %(<select id="post_category" name="post[category]" required="required"><option value="">Select one</option>\n<option value="abe">abe</option>\n<option value="mus">mus</option>\n<option value="hest">hest</option></select>),
K
Koichi ITO 已提交
811
      select("post", "category", %w(abe mus hest), { prompt: "Select one" }, { required: true })
812 813 814
    )
  end

815
  def test_required_select_display_size_equals_to_one
816
    assert_dom_equal(
817
      %(<select id="post_category" name="post[category]" required="required" size="1"><option value=""></option>\n<option value="abe">abe</option>\n<option value="mus">mus</option>\n<option value="hest">hest</option></select>),
K
Koichi ITO 已提交
818
      select("post", "category", %w(abe mus hest), {}, { required: true, size: 1 })
819 820
    )
  end
821 822 823 824

  def test_required_select_with_display_size_bigger_than_one
    assert_dom_equal(
      %(<select id="post_category" name="post[category]" required="required" size="2"><option value="abe">abe</option>\n<option value="mus">mus</option>\n<option value="hest">hest</option></select>),
K
Koichi ITO 已提交
825
      select("post", "category", %w(abe mus hest), {}, { required: true, size: 2 })
826
    )
827
  end
828

829
  def test_required_select_with_multiple_option
830
    assert_dom_equal(
831
      %(<input name="post[category][]" type="hidden" value=""/><select id="post_category" multiple="multiple" name="post[category][]" required="required"><option value="abe">abe</option>\n<option value="mus">mus</option>\n<option value="hest">hest</option></select>),
K
Koichi ITO 已提交
832
      select("post", "category", %w(abe mus hest), {}, { required: true, multiple: true })
833 834
    )
  end
835

836
  def test_select_with_integer
837 838 839 840
    @post = Post.new
    @post.category = ""
    assert_dom_equal(
      "<select id=\"post_category\" name=\"post[category]\"><option value=\"\">Please select</option>\n<option value=\"\"></option>\n<option value=\"1\">1</option></select>",
841
      select("post", "category", [1], prompt: true, include_blank: true)
842 843 844
    )
  end

845 846 847 848 849
  def test_list_of_lists
    @post = Post.new
    @post.category = ""
    assert_dom_equal(
      "<select id=\"post_category\" name=\"post[category]\"><option value=\"\">Please select</option>\n<option value=\"\"></option>\n<option value=\"number\">Number</option>\n<option value=\"text\">Text</option>\n<option value=\"boolean\">Yes/No</option></select>",
850
      select("post", "category", [["Number", "number"], ["Text", "text"], ["Yes/No", "boolean"]], prompt: true, include_blank: true)
851 852 853
    )
  end

854 855 856 857 858
  def test_select_with_selected_value
    @post = Post.new
    @post.category = "<mus>"
    assert_dom_equal(
      "<select id=\"post_category\" name=\"post[category]\"><option value=\"abe\" selected=\"selected\">abe</option>\n<option value=\"&lt;mus&gt;\">&lt;mus&gt;</option>\n<option value=\"hest\">hest</option></select>",
859
      select("post", "category", %w( abe <mus> hest ), selected: "abe")
860 861 862 863 864 865
    )
  end

  def test_select_with_index_option
    @album = Album.new
    @album.id = 1
866 867

    expected = "<select id=\"album__genre\" name=\"album[][genre]\"><option value=\"rap\">rap</option>\n<option value=\"rock\">rock</option>\n<option value=\"country\">country</option></select>"
868

869
    assert_dom_equal(
870
      expected,
K
Koichi ITO 已提交
871
      select("album[]", "genre", %w[rap rock country], {}, { index: nil })
872 873
    )
  end
874

875 876 877
  def test_select_escapes_options
    assert_dom_equal(
      '<select id="post_title" name="post[title]">&lt;script&gt;alert(1)&lt;/script&gt;</select>',
878
      select("post", "title", "<script>alert(1)</script>")
879 880 881
    )
  end

882 883 884 885 886
  def test_select_with_selected_nil
    @post = Post.new
    @post.category = "<mus>"
    assert_dom_equal(
      "<select id=\"post_category\" name=\"post[category]\"><option value=\"abe\">abe</option>\n<option value=\"&lt;mus&gt;\">&lt;mus&gt;</option>\n<option value=\"hest\">hest</option></select>",
887
      select("post", "category", %w( abe <mus> hest ), selected: nil)
888 889
    )
  end
890

891 892 893 894 895
  def test_select_with_disabled_value
    @post = Post.new
    @post.category = "<mus>"
    assert_dom_equal(
      "<select id=\"post_category\" name=\"post[category]\"><option value=\"abe\">abe</option>\n<option value=\"&lt;mus&gt;\" selected=\"selected\">&lt;mus&gt;</option>\n<option value=\"hest\" disabled=\"disabled\">hest</option></select>",
896
      select("post", "category", %w( abe <mus> hest ), disabled: "hest")
897 898 899
    )
  end

900 901 902 903
  def test_select_not_existing_method_with_selected_value
    @post = Post.new
    assert_dom_equal(
      "<select id=\"post_locale\" name=\"post[locale]\"><option value=\"en\">en</option>\n<option value=\"ru\" selected=\"selected\">ru</option></select>",
904
      select("post", "locale", %w( en ru ), selected: "ru")
905 906 907 908 909 910 911
    )
  end

  def test_select_with_prompt_and_selected_value
    @post = Post.new
    assert_dom_equal(
      "<select id=\"post_category\" name=\"post[category]\"><option value=\"one\">one</option>\n<option selected=\"selected\" value=\"two\">two</option></select>",
912
      select("post", "category", %w( one two ), selected: "two", prompt: true)
913 914
    )
  end
915

916 917 918 919 920
  def test_select_with_disabled_array
    @post = Post.new
    @post.category = "<mus>"
    assert_dom_equal(
      "<select id=\"post_category\" name=\"post[category]\"><option value=\"abe\" disabled=\"disabled\">abe</option>\n<option value=\"&lt;mus&gt;\" selected=\"selected\">&lt;mus&gt;</option>\n<option value=\"hest\" disabled=\"disabled\">hest</option></select>",
921
      select("post", "category", %w( abe <mus> hest ), disabled: ["hest", "abe"])
922 923 924
    )
  end

925 926 927 928 929 930 931 932 933
  def test_select_with_range
    @post = Post.new
    @post.category = 0
    assert_dom_equal(
      "<select id=\"post_category\" name=\"post[category]\"><option value=\"1\">1</option>\n<option value=\"2\">2</option>\n<option value=\"3\">3</option></select>",
      select("post", "category", 1..3)
    )
  end

934 935 936 937 938 939 940 941
  def test_select_with_enumerable
    @post = Post.new
    assert_dom_equal(
      "<select id=\"post_category\" name=\"post[category]\"><option value=\"one\">one</option>\n<option value=\"two\">two</option></select>",
      select("post", "category", CustomEnumerable.new)
    )
  end

942 943 944
  def test_collection_select
    @post = Post.new
    @post.author_name = "Babe"
D
Initial  
David Heinemeier Hansson 已提交
945

946 947
    assert_dom_equal(
      "<select id=\"post_author_name\" name=\"post[author_name]\"><option value=\"&lt;Abe&gt;\">&lt;Abe&gt;</option>\n<option value=\"Babe\" selected=\"selected\">Babe</option>\n<option value=\"Cabe\">Cabe</option></select>",
T
Tekin Suleyman 已提交
948
      collection_select("post", "author_name", dummy_posts, "author_name", "author_name")
949 950
    )
  end
D
Initial  
David Heinemeier Hansson 已提交
951

952 953 954
  def test_collection_select_under_fields_for
    @post = Post.new
    @post.author_name = "Babe"
955

W
wycats 已提交
956
    output_buffer = fields_for :post, @post do |f|
T
Tekin Suleyman 已提交
957
      concat f.collection_select(:author_name, dummy_posts, :author_name, :author_name)
958
    end
959

960 961 962 963 964
    assert_dom_equal(
      "<select id=\"post_author_name\" name=\"post[author_name]\"><option value=\"&lt;Abe&gt;\">&lt;Abe&gt;</option>\n<option value=\"Babe\" selected=\"selected\">Babe</option>\n<option value=\"Cabe\">Cabe</option></select>",
      output_buffer
    )
  end
965

966 967 968
  def test_collection_select_under_fields_for_with_index
    @post = Post.new
    @post.author_name = "Babe"
969

970
    output_buffer = fields_for :post, @post, index: 815 do |f|
T
Tekin Suleyman 已提交
971
      concat f.collection_select(:author_name, dummy_posts, :author_name, :author_name)
972 973
    end

974 975 976 977 978
    assert_dom_equal(
      "<select id=\"post_815_author_name\" name=\"post[815][author_name]\"><option value=\"&lt;Abe&gt;\">&lt;Abe&gt;</option>\n<option value=\"Babe\" selected=\"selected\">Babe</option>\n<option value=\"Cabe\">Cabe</option></select>",
      output_buffer
    )
  end
979

980 981 982 983
  def test_collection_select_under_fields_for_with_auto_index
    @post = Post.new
    @post.author_name = "Babe"
    def @post.to_param; 815; end
984

W
wycats 已提交
985
    output_buffer = fields_for "post[]", @post do |f|
T
Tekin Suleyman 已提交
986
      concat f.collection_select(:author_name, dummy_posts, :author_name, :author_name)
987 988
    end

989 990 991 992 993
    assert_dom_equal(
      "<select id=\"post_815_author_name\" name=\"post[815][author_name]\"><option value=\"&lt;Abe&gt;\">&lt;Abe&gt;</option>\n<option value=\"Babe\" selected=\"selected\">Babe</option>\n<option value=\"Cabe\">Cabe</option></select>",
      output_buffer
    )
  end
D
Initial  
David Heinemeier Hansson 已提交
994

995 996 997
  def test_collection_select_with_blank_and_style
    @post = Post.new
    @post.author_name = "Babe"
D
Initial  
David Heinemeier Hansson 已提交
998

999 1000
    assert_dom_equal(
      "<select id=\"post_author_name\" name=\"post[author_name]\" style=\"width: 200px\"><option value=\"\"></option>\n<option value=\"&lt;Abe&gt;\">&lt;Abe&gt;</option>\n<option value=\"Babe\" selected=\"selected\">Babe</option>\n<option value=\"Cabe\">Cabe</option></select>",
K
Koichi ITO 已提交
1001
      collection_select("post", "author_name", dummy_posts, "author_name", "author_name", { include_blank: true }, { "style" => "width: 200px" })
1002 1003
    )
  end
1004

1005 1006 1007
  def test_collection_select_with_blank_as_string_and_style
    @post = Post.new
    @post.author_name = "Babe"
1008

1009 1010
    assert_dom_equal(
      "<select id=\"post_author_name\" name=\"post[author_name]\" style=\"width: 200px\"><option value=\"\">No Selection</option>\n<option value=\"&lt;Abe&gt;\">&lt;Abe&gt;</option>\n<option value=\"Babe\" selected=\"selected\">Babe</option>\n<option value=\"Cabe\">Cabe</option></select>",
K
Koichi ITO 已提交
1011
      collection_select("post", "author_name", dummy_posts, "author_name", "author_name", { include_blank: "No Selection" }, { "style" => "width: 200px" })
1012 1013
    )
  end
1014

1015
  def test_collection_select_with_multiple_option_appends_array_brackets_and_hidden_input
1016 1017
    @post = Post.new
    @post.author_name = "Babe"
1018

1019
    expected = "<input type=\"hidden\" name=\"post[author_name][]\" value=\"\"/><select id=\"post_author_name\" name=\"post[author_name][]\" multiple=\"multiple\"><option value=\"\"></option>\n<option value=\"&lt;Abe&gt;\">&lt;Abe&gt;</option>\n<option value=\"Babe\" selected=\"selected\">Babe</option>\n<option value=\"Cabe\">Cabe</option></select>"
1020

1021
    # Should suffix default name with [].
K
Koichi ITO 已提交
1022
    assert_dom_equal expected, collection_select("post", "author_name", dummy_posts, "author_name", "author_name", { include_blank: true }, { multiple: true })
1023

1024
    # Shouldn't suffix custom name with [].
K
Koichi ITO 已提交
1025
    assert_dom_equal expected, collection_select("post", "author_name", dummy_posts, "author_name", "author_name", { include_blank: true, name: "post[author_name][]" }, { multiple: true })
1026
  end
1027

1028 1029 1030
  def test_collection_select_with_blank_and_selected
    @post = Post.new
    @post.author_name = "Babe"
1031

1032 1033
    assert_dom_equal(
      %{<select id="post_author_name" name="post[author_name]"><option value=""></option>\n<option value="&lt;Abe&gt;" selected="selected">&lt;Abe&gt;</option>\n<option value="Babe">Babe</option>\n<option value="Cabe">Cabe</option></select>},
1034
      collection_select("post", "author_name", dummy_posts, "author_name", "author_name", include_blank: true, selected: "<Abe>")
1035 1036 1037
    )
  end

1038 1039 1040 1041 1042 1043
  def test_collection_select_with_disabled
    @post = Post.new
    @post.author_name = "Babe"

    assert_dom_equal(
      "<select id=\"post_author_name\" name=\"post[author_name]\"><option value=\"&lt;Abe&gt;\">&lt;Abe&gt;</option>\n<option value=\"Babe\" selected=\"selected\">Babe</option>\n<option value=\"Cabe\" disabled=\"disabled\">Cabe</option></select>",
1044
      collection_select("post", "author_name", dummy_posts, "author_name", "author_name", disabled: "Cabe")
1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063
    )
  end

  def test_collection_select_with_proc_for_value_method
    @post = Post.new

    assert_dom_equal(
      "<select id=\"post_author_name\" name=\"post[author_name]\"><option value=\"&lt;Abe&gt;\">&lt;Abe&gt; went home</option>\n<option value=\"Babe\">Babe went home</option>\n<option value=\"Cabe\">Cabe went home</option></select>",
      collection_select("post", "author_name", dummy_posts, lambda { |p| p.author_name }, "title")
    )
  end

  def test_collection_select_with_proc_for_text_method
    @post = Post.new

    assert_dom_equal(
      "<select id=\"post_author_name\" name=\"post[author_name]\"><option value=\"&lt;Abe&gt;\">&lt;Abe&gt; went home</option>\n<option value=\"Babe\">Babe went home</option>\n<option value=\"Cabe\">Cabe went home</option></select>",
      collection_select("post", "author_name", dummy_posts, "author_name", lambda { |p| p.title })
    )
1064 1065
  end

1066 1067
  def test_time_zone_select
    @firm = Firm.new("D")
1068
    html = time_zone_select("firm", "time_zone")
1069 1070 1071 1072 1073 1074
    assert_dom_equal "<select id=\"firm_time_zone\" name=\"firm[time_zone]\">" \
                 "<option value=\"A\">A</option>\n" \
                 "<option value=\"B\">B</option>\n" \
                 "<option value=\"C\">C</option>\n" \
                 "<option value=\"D\" selected=\"selected\">D</option>\n" \
                 "<option value=\"E\">E</option>" \
1075 1076 1077 1078 1079 1080 1081
                 "</select>",
                 html
  end

  def test_time_zone_select_under_fields_for
    @firm = Firm.new("D")

W
wycats 已提交
1082
    output_buffer = fields_for :firm, @firm do |f|
1083
      concat f.time_zone_select(:time_zone)
1084
    end
1085

1086
    assert_dom_equal(
1087 1088 1089 1090 1091 1092
      "<select id=\"firm_time_zone\" name=\"firm[time_zone]\">" \
      "<option value=\"A\">A</option>\n" \
      "<option value=\"B\">B</option>\n" \
      "<option value=\"C\">C</option>\n" \
      "<option value=\"D\" selected=\"selected\">D</option>\n" \
      "<option value=\"E\">E</option>" \
1093 1094 1095 1096
      "</select>",
      output_buffer
    )
  end
1097

1098 1099
  def test_time_zone_select_under_fields_for_with_index
    @firm = Firm.new("D")
1100

1101
    output_buffer = fields_for :firm, @firm, index: 305 do |f|
1102
      concat f.time_zone_select(:time_zone)
1103 1104
    end

1105
    assert_dom_equal(
1106 1107 1108 1109 1110 1111
      "<select id=\"firm_305_time_zone\" name=\"firm[305][time_zone]\">" \
      "<option value=\"A\">A</option>\n" \
      "<option value=\"B\">B</option>\n" \
      "<option value=\"C\">C</option>\n" \
      "<option value=\"D\" selected=\"selected\">D</option>\n" \
      "<option value=\"E\">E</option>" \
1112 1113 1114 1115
      "</select>",
      output_buffer
    )
  end
1116

1117 1118 1119
  def test_time_zone_select_under_fields_for_with_auto_index
    @firm = Firm.new("D")
    def @firm.to_param; 305; end
1120

W
wycats 已提交
1121
    output_buffer = fields_for "firm[]", @firm do |f|
1122
      concat f.time_zone_select(:time_zone)
1123 1124
    end

1125
    assert_dom_equal(
1126 1127 1128 1129 1130 1131
      "<select id=\"firm_305_time_zone\" name=\"firm[305][time_zone]\">" \
      "<option value=\"A\">A</option>\n" \
      "<option value=\"B\">B</option>\n" \
      "<option value=\"C\">C</option>\n" \
      "<option value=\"D\" selected=\"selected\">D</option>\n" \
      "<option value=\"E\">E</option>" \
1132 1133 1134 1135
      "</select>",
      output_buffer
    )
  end
1136

1137 1138
  def test_time_zone_select_with_blank
    @firm = Firm.new("D")
1139
    html = time_zone_select("firm", "time_zone", nil, include_blank: true)
1140 1141 1142 1143 1144 1145 1146
    assert_dom_equal "<select id=\"firm_time_zone\" name=\"firm[time_zone]\">" \
                 "<option value=\"\"></option>\n" \
                 "<option value=\"A\">A</option>\n" \
                 "<option value=\"B\">B</option>\n" \
                 "<option value=\"C\">C</option>\n" \
                 "<option value=\"D\" selected=\"selected\">D</option>\n" \
                 "<option value=\"E\">E</option>" \
1147 1148 1149
                 "</select>",
                 html
  end
1150

1151 1152
  def test_time_zone_select_with_blank_as_string
    @firm = Firm.new("D")
1153
    html = time_zone_select("firm", "time_zone", nil, include_blank: "No Zone")
1154 1155 1156 1157 1158 1159 1160
    assert_dom_equal "<select id=\"firm_time_zone\" name=\"firm[time_zone]\">" \
                 "<option value=\"\">No Zone</option>\n" \
                 "<option value=\"A\">A</option>\n" \
                 "<option value=\"B\">B</option>\n" \
                 "<option value=\"C\">C</option>\n" \
                 "<option value=\"D\" selected=\"selected\">D</option>\n" \
                 "<option value=\"E\">E</option>" \
1161 1162 1163
                 "</select>",
                 html
  end
1164

1165 1166 1167
  def test_time_zone_select_with_style
    @firm = Firm.new("D")
    html = time_zone_select("firm", "time_zone", nil, {},
K
Koichi ITO 已提交
1168
      { "style" => "color: red" })
1169 1170 1171 1172 1173 1174
    assert_dom_equal "<select id=\"firm_time_zone\" name=\"firm[time_zone]\" style=\"color: red\">" \
                 "<option value=\"A\">A</option>\n" \
                 "<option value=\"B\">B</option>\n" \
                 "<option value=\"C\">C</option>\n" \
                 "<option value=\"D\" selected=\"selected\">D</option>\n" \
                 "<option value=\"E\">E</option>" \
1175 1176 1177
                 "</select>",
                 html
    assert_dom_equal html, time_zone_select("firm", "time_zone", nil, {},
K
Koichi ITO 已提交
1178
      { style: "color: red" })
1179
  end
1180

1181 1182 1183
  def test_time_zone_select_with_blank_and_style
    @firm = Firm.new("D")
    html = time_zone_select("firm", "time_zone", nil,
K
Koichi ITO 已提交
1184
      { include_blank: true }, { "style" => "color: red" })
1185 1186 1187 1188 1189 1190 1191
    assert_dom_equal "<select id=\"firm_time_zone\" name=\"firm[time_zone]\" style=\"color: red\">" \
                 "<option value=\"\"></option>\n" \
                 "<option value=\"A\">A</option>\n" \
                 "<option value=\"B\">B</option>\n" \
                 "<option value=\"C\">C</option>\n" \
                 "<option value=\"D\" selected=\"selected\">D</option>\n" \
                 "<option value=\"E\">E</option>" \
1192 1193 1194
                 "</select>",
                 html
    assert_dom_equal html, time_zone_select("firm", "time_zone", nil,
K
Koichi ITO 已提交
1195
      { include_blank: true }, { style: "color: red" })
1196
  end
1197

1198 1199 1200
  def test_time_zone_select_with_blank_as_string_and_style
    @firm = Firm.new("D")
    html = time_zone_select("firm", "time_zone", nil,
K
Koichi ITO 已提交
1201
      { include_blank: "No Zone" }, { "style" => "color: red" })
1202 1203 1204 1205 1206 1207 1208
    assert_dom_equal "<select id=\"firm_time_zone\" name=\"firm[time_zone]\" style=\"color: red\">" \
                 "<option value=\"\">No Zone</option>\n" \
                 "<option value=\"A\">A</option>\n" \
                 "<option value=\"B\">B</option>\n" \
                 "<option value=\"C\">C</option>\n" \
                 "<option value=\"D\" selected=\"selected\">D</option>\n" \
                 "<option value=\"E\">E</option>" \
1209 1210 1211
                 "</select>",
                 html
    assert_dom_equal html, time_zone_select("firm", "time_zone", nil,
K
Koichi ITO 已提交
1212
      { include_blank: "No Zone" }, { style: "color: red" })
1213
  end
1214

1215 1216 1217
  def test_time_zone_select_with_priority_zones
    @firm = Firm.new("D")
    zones = [ ActiveSupport::TimeZone.new("A"), ActiveSupport::TimeZone.new("D") ]
1218
    html = time_zone_select("firm", "time_zone", zones)
1219 1220 1221 1222 1223 1224 1225
    assert_dom_equal "<select id=\"firm_time_zone\" name=\"firm[time_zone]\">" \
                 "<option value=\"A\">A</option>\n" \
                 "<option value=\"D\" selected=\"selected\">D</option>" \
                 "<option value=\"\" disabled=\"disabled\">-------------</option>\n" \
                 "<option value=\"B\">B</option>\n" \
                 "<option value=\"C\">C</option>\n" \
                 "<option value=\"E\">E</option>" \
1226 1227 1228
                 "</select>",
                 html
  end
1229

1230 1231
  def test_time_zone_select_with_priority_zones_as_regexp
    @firm = Firm.new("D")
1232

1233
    @fake_timezones.each do |tz|
R
Ronak Jangir 已提交
1234
      def tz.=~(re); %(A D).include?(name) end
1235 1236
    end

1237
    html = time_zone_select("firm", "time_zone", /A|D/)
1238 1239 1240 1241 1242 1243 1244
    assert_dom_equal "<select id=\"firm_time_zone\" name=\"firm[time_zone]\">" \
                 "<option value=\"A\">A</option>\n" \
                 "<option value=\"D\" selected=\"selected\">D</option>" \
                 "<option value=\"\" disabled=\"disabled\">-------------</option>\n" \
                 "<option value=\"B\">B</option>\n" \
                 "<option value=\"C\">C</option>\n" \
                 "<option value=\"E\">E</option>" \
1245 1246 1247
                 "</select>",
                 html
  end
1248

1249
  def test_time_zone_select_with_priority_zones_is_not_implemented_with_grep
B
Brian McManus 已提交
1250
    @firm = Firm.new("D")
1251

1252 1253 1254 1255 1256 1257
    # `time_zone_select` can't be written with `grep` because Active Support
    # time zones don't support implicit string coercion with `to_str`.
    @fake_timezones.each do |tz|
      def tz.===(zone); raise Exception; end
    end

R
Ronak Jangir 已提交
1258
    html = time_zone_select("firm", "time_zone", /A|D/)
1259 1260 1261 1262 1263 1264 1265
    assert_dom_equal "<select id=\"firm_time_zone\" name=\"firm[time_zone]\">" \
                 "<option value=\"\" disabled=\"disabled\">-------------</option>\n" \
                 "<option value=\"A\">A</option>\n" \
                 "<option value=\"B\">B</option>\n" \
                 "<option value=\"C\">C</option>\n" \
                 "<option value=\"D\" selected=\"selected\">D</option>\n" \
                 "<option value=\"E\">E</option>" \
B
Brian McManus 已提交
1266 1267 1268
                 "</select>",
                 html
  end
1269

1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288
  def test_time_zone_select_with_priority_zones_and_errors
    @firm = Firm.new("D")
    @firm.extend ActiveModel::Validations
    @firm.errors[:time_zone] << "invalid"
    zones = [ ActiveSupport::TimeZone.new("A"), ActiveSupport::TimeZone.new("D") ]
    html = time_zone_select("firm", "time_zone", zones)
    assert_dom_equal "<div class=\"field_with_errors\">" \
                 "<select id=\"firm_time_zone\" name=\"firm[time_zone]\">" \
                 "<option value=\"A\">A</option>\n" \
                 "<option value=\"D\" selected=\"selected\">D</option>" \
                 "<option value=\"\" disabled=\"disabled\">-------------</option>\n" \
                 "<option value=\"B\">B</option>\n" \
                 "<option value=\"C\">C</option>\n" \
                 "<option value=\"E\">E</option>" \
                 "</select>" \
                 "</div>",
                 html
  end

1289
  def test_time_zone_select_with_default_time_zone_and_nil_value
1290 1291
    @firm = Firm.new()
    @firm.time_zone = nil
1292

1293
    html = time_zone_select("firm", "time_zone", nil, default: "B")
1294 1295 1296 1297 1298 1299
    assert_dom_equal "<select id=\"firm_time_zone\" name=\"firm[time_zone]\">" \
                  "<option value=\"A\">A</option>\n" \
                  "<option value=\"B\" selected=\"selected\">B</option>\n" \
                  "<option value=\"C\">C</option>\n" \
                  "<option value=\"D\">D</option>\n" \
                  "<option value=\"E\">E</option>" \
1300 1301
                  "</select>",
                  html
1302
  end
1303

1304
  def test_time_zone_select_with_default_time_zone_and_value
1305
    @firm = Firm.new("D")
1306

1307
    html = time_zone_select("firm", "time_zone", nil, default: "B")
1308 1309 1310 1311 1312 1313
    assert_dom_equal "<select id=\"firm_time_zone\" name=\"firm[time_zone]\">" \
                  "<option value=\"A\">A</option>\n" \
                  "<option value=\"B\">B</option>\n" \
                  "<option value=\"C\">C</option>\n" \
                  "<option value=\"D\" selected=\"selected\">D</option>\n" \
                  "<option value=\"E\">E</option>" \
1314 1315
                  "</select>",
                  html
1316
  end
1317

1318 1319
  def test_options_for_select_with_element_attributes
    assert_dom_equal(
1320
      "<option value=\"&lt;Denmark&gt;\" class=\"bold\">&lt;Denmark&gt;</option>\n<option value=\"USA\" onclick=\"alert(&#39;Hello World&#39;);\">USA</option>\n<option value=\"Sweden\">Sweden</option>\n<option value=\"Germany\">Germany</option>",
1321
      options_for_select([ [ "<Denmark>", { class: "bold" } ], [ "USA", { onclick: "alert('Hello World');" } ], [ "Sweden" ], "Germany" ])
1322 1323 1324
    )
  end

1325 1326 1327
  def test_options_for_select_with_data_element
    assert_dom_equal(
      "<option value=\"&lt;Denmark&gt;\" data-test=\"bold\">&lt;Denmark&gt;</option>",
1328
      options_for_select([ [ "<Denmark>", { data: { test: "bold" } } ] ])
1329 1330 1331
    )
  end

1332 1333 1334
  def test_options_for_select_with_data_element_with_special_characters
    assert_dom_equal(
      "<option value=\"&lt;Denmark&gt;\" data-test=\"&lt;bold&gt;\">&lt;Denmark&gt;</option>",
1335
      options_for_select([ [ "<Denmark>", { data: { test: "<bold>" } } ] ])
1336 1337 1338
    )
  end

1339 1340 1341
  def test_options_for_select_with_element_attributes_and_selection
    assert_dom_equal(
      "<option value=\"&lt;Denmark&gt;\">&lt;Denmark&gt;</option>\n<option value=\"USA\" class=\"bold\" selected=\"selected\">USA</option>\n<option value=\"Sweden\">Sweden</option>",
1342
      options_for_select([ "<Denmark>", [ "USA", { class: "bold" } ], "Sweden" ], "USA")
1343 1344 1345 1346 1347 1348
    )
  end

  def test_options_for_select_with_element_attributes_and_selection_array
    assert_dom_equal(
      "<option value=\"&lt;Denmark&gt;\">&lt;Denmark&gt;</option>\n<option value=\"USA\" class=\"bold\" selected=\"selected\">USA</option>\n<option value=\"Sweden\" selected=\"selected\">Sweden</option>",
1349
      options_for_select([ "<Denmark>", [ "USA", { class: "bold" } ], "Sweden" ], [ "USA", "Sweden" ])
1350 1351 1352
    )
  end

1353 1354 1355
  def test_options_for_select_with_special_characters
    assert_dom_equal(
      "<option value=\"&lt;Denmark&gt;\" onclick=\"alert(&quot;&lt;code&gt;&quot;)\">&lt;Denmark&gt;</option>",
1356
      options_for_select([ [ "<Denmark>", { onclick: %(alert("<code>")) } ] ])
1357 1358 1359
    )
  end

1360
  def test_option_html_attributes_with_no_array_element
1361
    assert_equal({}, option_html_attributes("foo"))
1362 1363 1364
  end

  def test_option_html_attributes_without_hash
1365
    assert_equal({}, option_html_attributes([ "foo", "bar" ]))
1366 1367 1368
  end

  def test_option_html_attributes_with_single_element_hash
V
Vasiliy Ermolovich 已提交
1369
    assert_equal(
1370
      { class: "fancy" },
1371
      option_html_attributes([ "foo", "bar", { class: "fancy" } ])
1372 1373 1374 1375
    )
  end

  def test_option_html_attributes_with_multiple_element_hash
V
Vasiliy Ermolovich 已提交
1376
    assert_equal(
1377
      { :class => "fancy", "onclick" => "alert('Hello World');" },
1378
      option_html_attributes([ "foo", "bar", { :class => "fancy", "onclick" => "alert('Hello World');" } ])
1379 1380 1381 1382
    )
  end

  def test_option_html_attributes_with_multiple_hashes
V
Vasiliy Ermolovich 已提交
1383
    assert_equal(
1384
      { :class => "fancy", "onclick" => "alert('Hello World');" },
1385
      option_html_attributes([ "foo", "bar", { class: "fancy" }, { "onclick" => "alert('Hello World');" } ])
1386 1387 1388
    )
  end

1389
  def test_option_html_attributes_with_multiple_hashes_does_not_modify_them
1390
    options1 = { class: "fancy" }
1391
    options2 = { onclick: "alert('Hello World');" }
1392
    option_html_attributes([ "foo", "bar", options1, options2 ])
1393

1394
    assert_equal({ class: "fancy" }, options1)
1395 1396 1397
    assert_equal({ onclick: "alert('Hello World');" }, options2)
  end

1398 1399
  def test_grouped_collection_select
    @post = Post.new
1400
    @post.origin = "dk"
1401 1402 1403

    assert_dom_equal(
      %Q{<select id="post_origin" name="post[origin]"><optgroup label="&lt;Africa&gt;"><option value="&lt;sa&gt;">&lt;South Africa&gt;</option>\n<option value="so">Somalia</option></optgroup><optgroup label="Europe"><option value="dk" selected="selected">Denmark</option>\n<option value="ie">Ireland</option></optgroup></select>},
1404
      grouped_collection_select("post", "origin", dummy_continents, :countries, :continent_name, :country_id, :country_name)
1405 1406 1407
    )
  end

1408 1409 1410 1411 1412
  def test_grouped_collection_select_with_selected
    @post = Post.new

    assert_dom_equal(
      %Q{<select id="post_origin" name="post[origin]"><optgroup label="&lt;Africa&gt;"><option value="&lt;sa&gt;">&lt;South Africa&gt;</option>\n<option value="so">Somalia</option></optgroup><optgroup label="Europe"><option value="dk" selected="selected">Denmark</option>\n<option value="ie">Ireland</option></optgroup></select>},
1413
      grouped_collection_select("post", "origin", dummy_continents, :countries, :continent_name, :country_id, :country_name, selected: "dk")
1414 1415 1416 1417 1418 1419 1420 1421
    )
  end

  def test_grouped_collection_select_with_disabled_value
    @post = Post.new

    assert_dom_equal(
      %Q{<select id="post_origin" name="post[origin]"><optgroup label="&lt;Africa&gt;"><option value="&lt;sa&gt;">&lt;South Africa&gt;</option>\n<option value="so">Somalia</option></optgroup><optgroup label="Europe"><option disabled="disabled" value="dk">Denmark</option>\n<option value="ie">Ireland</option></optgroup></select>},
1422
      grouped_collection_select("post", "origin", dummy_continents, :countries, :continent_name, :country_id, :country_name, disabled: "dk")
1423 1424 1425
    )
  end

1426 1427
  def test_grouped_collection_select_under_fields_for
    @post = Post.new
1428
    @post.origin = "dk"
1429

W
wycats 已提交
1430
    output_buffer = fields_for :post, @post do |f|
1431
      concat f.grouped_collection_select("origin", dummy_continents, :countries, :continent_name, :country_id, :country_name)
1432 1433 1434 1435 1436 1437 1438 1439
    end

    assert_dom_equal(
      %Q{<select id="post_origin" name="post[origin]"><optgroup label="&lt;Africa&gt;"><option value="&lt;sa&gt;">&lt;South Africa&gt;</option>\n<option value="so">Somalia</option></optgroup><optgroup label="Europe"><option value="dk" selected="selected">Denmark</option>\n<option value="ie">Ireland</option></optgroup></select>},
      output_buffer
    )
  end

T
Tekin Suleyman 已提交
1440 1441
  private

1442 1443 1444 1445 1446
    def dummy_posts
      [ Post.new("<Abe> went home", "<Abe>", "To a little house", "shh!"),
        Post.new("Babe went home", "Babe", "To a little house", "shh!"),
        Post.new("Cabe went home", "Cabe", "To a little house", "shh!") ]
    end
1447

1448 1449 1450 1451
    def dummy_continents
      [ Continent.new("<Africa>", [Country.new("<sa>", "<South Africa>"), Country.new("so", "Somalia")]),
        Continent.new("Europe", [Country.new("dk", "Denmark"), Country.new("ie", "Ireland")]) ]
    end
J
Jeremy Kemper 已提交
1452
end