aboutsummaryrefslogtreecommitdiffstats
path: root/activesupport/test
diff options
context:
space:
mode:
authorYves Senn <yves.senn@garaio.com>2012-11-12 14:33:20 +0100
committerYves Senn <yves.senn@garaio.com>2012-11-13 08:44:47 +0100
commitbe79632b96d6fe6b844c99561ce96f540e98cae0 (patch)
tree8cb4f4c7cb47541dcbe683c5e986dd0c0fdbdc08 /activesupport/test
parent618923280048928aff50eed4fe9a9b08f9ebad72 (diff)
downloadrails-be79632b96d6fe6b844c99561ce96f540e98cae0.tar.gz
rails-be79632b96d6fe6b844c99561ce96f540e98cae0.tar.bz2
rails-be79632b96d6fe6b844c99561ce96f540e98cae0.zip
backport #8185, `#as_json` isolates options when encoding a hash.
Setting options in a custom `#as_json` method had side effects. Modifications of the `options` hash leaked outside and influenced the conversion of other objects contained in the hash. Conflicts: activesupport/CHANGELOG.md
Diffstat (limited to 'activesupport/test')
-rw-r--r--activesupport/test/json/encoding_test.rb18
1 files changed, 18 insertions, 0 deletions
diff --git a/activesupport/test/json/encoding_test.rb b/activesupport/test/json/encoding_test.rb
index a9590f164f..6cbf956be2 100644
--- a/activesupport/test/json/encoding_test.rb
+++ b/activesupport/test/json/encoding_test.rb
@@ -22,6 +22,15 @@ class TestJSONEncoding < Test::Unit::TestCase
end
end
+ class CustomWithOptions
+ attr_accessor :foo, :bar
+
+ def as_json(options={})
+ options[:only] = %w(foo bar)
+ super(options)
+ end
+ end
+
TrueTests = [[ true, %(true) ]]
FalseTests = [[ false, %(false) ]]
NilTests = [[ nil, %(null) ]]
@@ -239,6 +248,15 @@ class TestJSONEncoding < Test::Unit::TestCase
assert_equal(%([{"address":{"city":"London"}},{"address":{"city":"Paris"}}]), json)
end
+ def test_to_json_should_not_keep_options_around
+ f = CustomWithOptions.new
+ f.foo = "hello"
+ f.bar = "world"
+
+ hash = {"foo" => f, "other_hash" => {"foo" => "other_foo", "test" => "other_test"}}
+ assert_equal(%({"foo":{"foo":"hello","bar":"world"},"other_hash":{"foo":"other_foo","test":"other_test"}}), hash.to_json)
+ end
+
def test_struct_encoding
Struct.new('UserNameAndEmail', :name, :email)
Struct.new('UserNameAndDate', :name, :date)