sync with upstream

This commit is contained in:
Theodore Konukhov
2014-08-29 06:28:13 +02:00
10 changed files with 584 additions and 65 deletions

39
test/fixtures/poro.rb vendored
View File

@@ -38,6 +38,25 @@ end
class WebLog < Model
end
class Interview < Model
def attachment
@attachment ||= Image.new(url: 'U1')
end
end
class Mail < Model
def attachments
@attachments ||= [Image.new(url: 'U1'),
Video.new(html: 'H1')]
end
end
class Image < Model
end
class Video < Model
end
###
## Serializers
###
@@ -74,6 +93,26 @@ class WebLogLowerCamelSerializer < WebLogSerializer
format_keys :lower_camel
end
class InterviewSerializer < ActiveModel::Serializer
attributes :text
has_one :attachment, polymorphic: true
end
class MailSerializer < ActiveModel::Serializer
attributes :body
has_many :attachments, polymorphic: true
end
class ImageSerializer < ActiveModel::Serializer
attributes :url
end
class VideoSerializer < ActiveModel::Serializer
attributes :html
end
class ShortProfileSerializer < ::ProfileSerializer; end
module TestNamespace

View File

@@ -0,0 +1,189 @@
require 'test_helper'
module ActiveModel
class Serializer
class HasManyPolymorphicTest < ActiveModel::TestCase
def setup
@association = MailSerializer._associations[:attachments]
@old_association = @association.dup
@mail = Mail.new({ body: 'Body 1' })
@mail_serializer = MailSerializer.new(@mail)
end
def teardown
MailSerializer._associations[:attachments] = @old_association
end
def model_name(object)
object.class.to_s.demodulize.underscore.to_sym
end
def test_associations_definition
assert_equal 1, MailSerializer._associations.length
assert_kind_of Association::HasMany, @association
assert_equal true, @association.polymorphic
assert_equal 'attachments', @association.name
end
def test_associations_embedding_ids_serialization_using_serializable_hash
@association.embed = :ids
assert_equal({
body: 'Body 1',
'attachment_ids' => @mail.attachments.map do |c|
{ id: c.object_id, type: model_name(c) }
end
}, @mail_serializer.serializable_hash)
end
def test_associations_embedding_ids_serialization_using_as_json
@association.embed = :ids
assert_equal({
'mail' => {
:body => 'Body 1',
'attachment_ids' => @mail.attachments.map do |c|
{ id: c.object_id, type: model_name(c) }
end
}
}, @mail_serializer.as_json)
end
def test_associations_embedding_ids_serialization_using_serializable_hash_and_key_from_options
@association.embed = :ids
@association.key = 'key'
assert_equal({
body: 'Body 1',
'key' => @mail.attachments.map do |c|
{ id: c.object_id, type: model_name(c) }
end
}, @mail_serializer.serializable_hash)
end
def test_associations_embedding_objects_serialization_using_serializable_hash
@association.embed = :objects
assert_equal({
body: 'Body 1',
:attachments => [
{ type: :image, image: { url: 'U1' }},
{ type: :video, video: { html: 'H1' }}
]
}, @mail_serializer.serializable_hash)
end
def test_associations_embedding_objects_serialization_using_as_json
@association.embed = :objects
assert_equal({
'mail' => {
body: 'Body 1',
attachments: [
{ type: :image, image: { url: 'U1' }},
{ type: :video, video: { html: 'H1' }}
]
}
}, @mail_serializer.as_json)
end
def test_associations_embedding_nil_objects_serialization_using_as_json
@association.embed = :objects
@mail.instance_eval do
def attachments
[nil]
end
end
assert_equal({
'mail' => {
:body => 'Body 1',
:attachments => [nil]
}
}, @mail_serializer.as_json)
end
def test_associations_embedding_objects_serialization_using_serializable_hash_and_root_from_options
@association.embed = :objects
@association.embedded_key = 'root'
assert_equal({
body: 'Body 1',
'root' => [
{ type: :image, image: { url: 'U1' }},
{ type: :video, video: { html: 'H1' }}
]
}, @mail_serializer.serializable_hash)
end
def test_associations_embedding_ids_including_objects_serialization_using_serializable_hash
@association.embed = :ids
@association.embed_in_root = true
assert_equal({
body: 'Body 1',
'attachment_ids' => @mail.attachments.map do |c|
{ id: c.object_id, type: model_name(c) }
end
}, @mail_serializer.serializable_hash)
end
def test_associations_embedding_ids_including_objects_serialization_using_as_json
@association.embed = :ids
@association.embed_in_root = true
assert_equal({
'mail' => {
body: 'Body 1',
'attachment_ids' => @mail.attachments.map do |c|
{ id: c.object_id, type: model_name(c) }
end,
},
attachments: [
{ type: :image, image: { url: 'U1' }},
{ type: :video, video: { html: 'H1' }}
]
}, @mail_serializer.as_json)
end
def test_associations_embedding_nothing_including_objects_serialization_using_as_json
@association.embed = nil
@association.embed_in_root = true
assert_equal({
'mail' => { body: 'Body 1' },
attachments: [
{ type: :image, image: { url: 'U1' }},
{ type: :video, video: { html: 'H1' }}
]
}, @mail_serializer.as_json)
end
def test_associations_using_a_given_serializer
@association.embed = :ids
@association.embed_in_root = true
@association.serializer_from_options = Class.new(ActiveModel::Serializer) do
def fake
'fake'
end
attributes :fake
end
assert_equal({
'mail' => {
body: 'Body 1',
'attachment_ids' => @mail.attachments.map do |c|
{ id: c.object_id, type: model_name(c) }
end
},
attachments: [
{ type: :image, image: { fake: 'fake' }},
{ type: :video, video: { fake: 'fake' }}
]
}, @mail_serializer.as_json)
end
end
end
end

View File

@@ -0,0 +1,196 @@
require 'test_helper'
module ActiveModel
class Serializer
class HasOnePolymorphicTest < ActiveModel::TestCase
def setup
@association = InterviewSerializer._associations[:attachment]
@old_association = @association.dup
@interview = Interview.new({ text: 'Text 1' })
@interview_serializer = InterviewSerializer.new(@interview)
end
def teardown
InterviewSerializer._associations[:attachment] = @old_association
end
def model_name(object)
object.class.to_s.demodulize.underscore.to_sym
end
def test_associations_definition
assert_equal 1, InterviewSerializer._associations.length
assert_kind_of Association::HasOne, @association
assert_equal true, @association.polymorphic
assert_equal 'attachment', @association.name
end
def test_associations_embedding_ids_serialization_using_serializable_hash
@association.embed = :ids
assert_equal({
text: 'Text 1',
'attachment_id' => {
type: model_name(@interview.attachment),
id: @interview.attachment.object_id
}
}, @interview_serializer.serializable_hash)
end
def test_associations_embedding_ids_serialization_using_as_json
@association.embed = :ids
assert_equal({
'interview' => {
text: 'Text 1',
'attachment_id' => {
type: model_name(@interview.attachment),
id: @interview.attachment.object_id
}
}
}, @interview_serializer.as_json)
end
def test_associations_embedding_ids_serialization_using_serializable_hash_and_key_from_options
@association.embed = :ids
@association.key = 'key'
assert_equal({
text: 'Text 1',
'key' => {
type: model_name(@interview.attachment),
id: @interview.attachment.object_id
}
}, @interview_serializer.serializable_hash)
end
def test_associations_embedding_objects_serialization_using_serializable_hash
@association.embed = :objects
assert_equal({
text: 'Text 1',
attachment: {
type: model_name(@interview.attachment),
model_name(@interview.attachment) => { url: 'U1'}
}
}, @interview_serializer.serializable_hash)
end
def test_associations_embedding_objects_serialization_using_as_json
@association.embed = :objects
assert_equal({
'interview' => {
text: 'Text 1',
attachment: {
type: model_name(@interview.attachment),
model_name(@interview.attachment) => { url: 'U1'}
}
}
}, @interview_serializer.as_json)
end
def test_associations_embedding_nil_ids_serialization_using_as_json
@association.embed = :ids
@interview.instance_eval do
def attachment
nil
end
end
assert_equal({
'interview' => { text: 'Text 1', 'attachment_id' => nil }
}, @interview_serializer.as_json)
end
def test_associations_embedding_nil_objects_serialization_using_as_json
@association.embed = :objects
@interview.instance_eval do
def attachment
nil
end
end
assert_equal({
'interview' => { text: 'Text 1', attachment: nil }
}, @interview_serializer.as_json)
end
def test_associations_embedding_objects_serialization_using_serializable_hash_and_root_from_options
@association.embed = :objects
@association.embedded_key = 'root'
assert_equal({
text: 'Text 1',
'root' => {
type: model_name(@interview.attachment),
model_name(@interview.attachment) => { url: 'U1'}
}
}, @interview_serializer.serializable_hash)
end
def test_associations_embedding_ids_including_objects_serialization_using_serializable_hash
@association.embed = :ids
@association.embed_in_root = true
assert_equal({
text: 'Text 1',
'attachment_id' => {
type: model_name(@interview.attachment),
id: @interview.attachment.object_id
}
}, @interview_serializer.serializable_hash)
end
def test_associations_embedding_ids_including_objects_serialization_using_as_json
@association.embed = :ids
@association.embed_in_root = true
assert_equal({
'interview' => {
text: 'Text 1',
'attachment_id' => {
type: model_name(@interview.attachment),
id: @interview.attachment.object_id
}
},
"attachments" => [{
type: model_name(@interview.attachment),
model_name(@interview.attachment) => {
url: 'U1'
}
}]
}, @interview_serializer.as_json)
end
def test_associations_using_a_given_serializer
@association.embed = :ids
@association.embed_in_root = true
@association.serializer_from_options = Class.new(ActiveModel::Serializer) do
def name
'fake'
end
attributes :name
end
assert_equal({
'interview' => {
text: 'Text 1',
'attachment_id' => {
type: model_name(@interview.attachment),
id: @interview.attachment.object_id
}
},
"attachments" => [{
type: model_name(@interview.attachment),
model_name(@interview.attachment) => {
name: 'fake'
}
}]
}, @interview_serializer.as_json)
end
end
end
end