From bb18fc62250b899253ad00117be7ff1ef3fce033 Mon Sep 17 00:00:00 2001 From: Pol Miro Date: Thu, 24 Oct 2013 23:50:00 -0800 Subject: [PATCH] Add tests for has_one polymorphic --- test/fixtures/poro.rb | 12 ++ .../serializer/has_one_polymorphic_test.rb | 196 ++++++++++++++++++ 2 files changed, 208 insertions(+) create mode 100644 test/unit/active_model/serializer/has_one_polymorphic_test.rb diff --git a/test/fixtures/poro.rb b/test/fixtures/poro.rb index 2dd98642..0ed2dafe 100644 --- a/test/fixtures/poro.rb +++ b/test/fixtures/poro.rb @@ -38,6 +38,12 @@ 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'), @@ -87,6 +93,12 @@ 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 diff --git a/test/unit/active_model/serializer/has_one_polymorphic_test.rb b/test/unit/active_model/serializer/has_one_polymorphic_test.rb new file mode 100644 index 00000000..cf5f8e7c --- /dev/null +++ b/test/unit/active_model/serializer/has_one_polymorphic_test.rb @@ -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