提交 c5be90e8 编写于 作者: R Rafael Mendonça França

Merge pull request #9467 from senny/9459_include_json_root_out_of_sync

`ActiveRecord::Base.include_root_in_json` is `false` by default.
......@@ -5,7 +5,7 @@ module Serialization
include ActiveModel::Serializers::JSON
included do
self.include_root_in_json = true
self.include_root_in_json = false
end
def serializable_hash(options = nil)
......
......@@ -6,7 +6,21 @@
require 'models/tag'
require 'models/comment'
module JsonSerializationHelpers
private
def set_include_root_in_json(value)
original_root_in_json = ActiveRecord::Base.include_root_in_json
ActiveRecord::Base.include_root_in_json = value
yield
ensure
ActiveRecord::Base.include_root_in_json = original_root_in_json
end
end
class JsonSerializationTest < ActiveRecord::TestCase
include JsonSerializationHelpers
class NamespacedContact < Contact
column :name, :string
end
......@@ -23,20 +37,24 @@ def setup
end
def test_should_demodulize_root_in_json
@contact = NamespacedContact.new :name => 'whatever'
json = @contact.to_json
assert_match %r{^\{"namespaced_contact":\{}, json
set_include_root_in_json(true) do
@contact = NamespacedContact.new name: 'whatever'
json = @contact.to_json
assert_match %r{^\{"namespaced_contact":\{}, json
end
end
def test_should_include_root_in_json
json = @contact.to_json
assert_match %r{^\{"contact":\{}, json
assert_match %r{"name":"Konata Izumi"}, json
assert_match %r{"age":16}, json
assert json.include?(%("created_at":#{ActiveSupport::JSON.encode(Time.utc(2006, 8, 1))}))
assert_match %r{"awesome":true}, json
assert_match %r{"preferences":\{"shows":"anime"\}}, json
set_include_root_in_json(true) do
json = @contact.to_json
assert_match %r{^\{"contact":\{}, json
assert_match %r{"name":"Konata Izumi"}, json
assert_match %r{"age":16}, json
assert json.include?(%("created_at":#{ActiveSupport::JSON.encode(Time.utc(2006, 8, 1))}))
assert_match %r{"awesome":true}, json
assert_match %r{"preferences":\{"shows":"anime"\}}, json
end
end
def test_should_encode_all_encodable_attributes
......@@ -141,6 +159,8 @@ def test_serializable_hash_should_not_modify_options_in_argument
class DatabaseConnectedJsonEncodingTest < ActiveRecord::TestCase
fixtures :authors, :posts, :comments, :tags, :taggings
include JsonSerializationHelpers
def setup
@david = authors(:david)
@mary = authors(:mary)
......@@ -227,23 +247,21 @@ def @david.favorite_quote; "Constraints are liberating"; end
end
def test_should_allow_only_option_for_list_of_authors
ActiveRecord::Base.include_root_in_json = false
authors = [@david, @mary]
assert_equal %([{"name":"David"},{"name":"Mary"}]), ActiveSupport::JSON.encode(authors, :only => :name)
ensure
ActiveRecord::Base.include_root_in_json = true
set_include_root_in_json(false) do
authors = [@david, @mary]
assert_equal %([{"name":"David"},{"name":"Mary"}]), ActiveSupport::JSON.encode(authors, only: :name)
end
end
def test_should_allow_except_option_for_list_of_authors
ActiveRecord::Base.include_root_in_json = false
authors = [@david, @mary]
encoded = ActiveSupport::JSON.encode(authors, :except => [
:name, :author_address_id, :author_address_extra_id,
:organization_id, :owned_essay_id
])
assert_equal %([{"id":1},{"id":2}]), encoded
ensure
ActiveRecord::Base.include_root_in_json = true
set_include_root_in_json(false) do
authors = [@david, @mary]
encoded = ActiveSupport::JSON.encode(authors, except: [
:name, :author_address_id, :author_address_extra_id,
:organization_id, :owned_essay_id
])
assert_equal %([{"id":1},{"id":2}]), encoded
end
end
def test_should_allow_includes_for_list_of_authors
......@@ -262,17 +280,21 @@ def test_should_allow_includes_for_list_of_authors
end
def test_should_allow_options_for_hash_of_authors
authors_hash = {
1 => @david,
2 => @mary
}
assert_equal %({"1":{"author":{"name":"David"}}}), ActiveSupport::JSON.encode(authors_hash, :only => [1, :name])
set_include_root_in_json(true) do
authors_hash = {
1 => @david,
2 => @mary
}
assert_equal %({"1":{"author":{"name":"David"}}}), ActiveSupport::JSON.encode(authors_hash, only: [1, :name])
end
end
def test_should_be_able_to_encode_relation
authors_relation = Author.where(:id => [@david.id, @mary.id])
set_include_root_in_json(true) do
authors_relation = Author.where(id: [@david.id, @mary.id])
json = ActiveSupport::JSON.encode authors_relation, :only => :name
assert_equal '[{"author":{"name":"David"}},{"author":{"name":"Mary"}}]', json
json = ActiveSupport::JSON.encode authors_relation, only: :name
assert_equal '[{"author":{"name":"David"}},{"author":{"name":"Mary"}}]', json
end
end
end
......@@ -18,6 +18,10 @@ def setup
}
end
def test_include_root_in_json_is_false_by_default
assert_equal false, ActiveRecord::Base.include_root_in_json, "include_root_in_json should be false by default but was not"
end
def test_serialize_should_be_reversible
FORMATS.each do |format|
@serialized = Contact.new.send("to_#{format}")
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册