From 3a272cef4e7c99e8912fd2425d803c045b1e4622 Mon Sep 17 00:00:00 2001 From: Kamal Fariz Mahyuddin Date: Wed, 19 Mar 2008 21:36:21 +0800 Subject: [PATCH] Really fix merging of input collection * Don't union the arrays * Don't sort the arrays (in particular, HashWithIndifferentAccess has no <=>) * Merge deeply nested collections --- lib/webrat/session.rb | 16 +++++++++++----- test/clicks_button_test.rb | 10 +++++++++- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/lib/webrat/session.rb b/lib/webrat/session.rb index ae93209..9654380 100644 --- a/lib/webrat/session.rb +++ b/lib/webrat/session.rb @@ -302,8 +302,8 @@ module ActionController data.each do |key, value| case form_data[form_number][key] - when Hash; then merge(form_data[form_number][key], value) - when Array; then form_data[form_number][key] = (form_data[form_number][key] | value).sort + when Hash, HashWithIndifferentAccess; then merge(form_data[form_number][key], value) + when Array; then form_data[form_number][key] += value else form_data[form_number][key] = value end end @@ -311,9 +311,15 @@ module ActionController def merge(a, b) # :nodoc: a.keys.each do |k| - if b.has_key?(k) and Hash === a[k] and Hash === b[k] - a[k] = merge(a[k], b[k]) - b.delete(k) + if b.has_key?(k) + case [a[k], b[k]].map(&:class) + when [Hash, Hash] + a[k] = merge(a[k], b[k]) + b.delete(k) + when [Array, Array] + a[k] += b[k] + b.delete(k) + end end end a.merge!(b) diff --git a/test/clicks_button_test.rb b/test/clicks_button_test.rb index c8d5274..ab8588b 100644 --- a/test/clicks_button_test.rb +++ b/test/clicks_button_test.rb @@ -203,11 +203,19 @@ class ClicksButtonTest < Test::Unit::TestCase + + + + + + EOS - @session.expects(:post_via_redirect).with("/login", "options" => ["burger", "dessert", "fries", "soda"]) + @session.expects(:post_via_redirect).with("/login", + "options" => ["soda", "soda", "dessert", "burger", "fries"], + "response" => { "choices" => [{"selected" => "one"}, {"selected" => "two"}, {"selected" => "two"}]}) @session.clicks_button end