From 045fa9bc072a04f5a94d23f3d955e49bdaba74a1 Mon Sep 17 00:00:00 2001 From: Marc Garreau Date: Tue, 15 Mar 2016 12:20:00 -0600 Subject: [PATCH] Adds polymorphic tests and documentation --- CHANGELOG.md | 1 + docs/general/serializers.md | 12 ++++++ test/adapter/polymorphic_test.rb | 72 ++++++++++++++++++++++++++++++++ test/fixtures/active_record.rb | 11 +++++ test/fixtures/poro.rb | 18 ++++++++ 5 files changed, 114 insertions(+) create mode 100644 test/adapter/polymorphic_test.rb diff --git a/CHANGELOG.md b/CHANGELOG.md index 1a46a83f4..0c06e4ef0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -47,6 +47,7 @@ Misc: - [#1535](https://github.com/rails-api/active_model_serializers/pull/1535) Move the adapter and adapter folder to active_model_serializers folder and changes the module namespace. (@domitian @bf4) - [#1497](https://github.com/rails-api/active_model_serializers/pull/1497) Add JRuby-9000 to appveyor.yml(@corainchicago) +- [#1420](https://github.com/rails-api/active_model_serializers/pull/1420) Adds tests and documentation for polymorphism(@marcgarreau) ### v0.10.0.rc4 (2016/01/27 11:00 +00:00) Breaking changes: diff --git a/docs/general/serializers.md b/docs/general/serializers.md index 85da77c03..23f707206 100644 --- a/docs/general/serializers.md +++ b/docs/general/serializers.md @@ -76,6 +76,18 @@ def blog end ``` +### Polymorphic Relationships + +Polymorphic relationships are serialized by specifying the relationship, like any other association. For example: + +```ruby +class PictureSerializer < ActiveModel::Serializer + has_one :imageable +end +``` + +For more context, see the [tests](../../test/adapter/polymorphic_test.rb) for each adapter. + ### Caching #### ::cache diff --git a/test/adapter/polymorphic_test.rb b/test/adapter/polymorphic_test.rb new file mode 100644 index 000000000..1375322c2 --- /dev/null +++ b/test/adapter/polymorphic_test.rb @@ -0,0 +1,72 @@ +require 'test_helper' + +module ActiveModel + class Serializer + module Adapter + class PolymorphicTest < ActiveSupport::TestCase + setup do + @employee = Employee.new(id: 42, name: 'Zoop Zoopler', email: 'zoop@example.com') + @picture = @employee.pictures.new(id: 1, title: 'headshot-1.jpg') + @picture.imageable = @employee + + @attributes_serialization = serializable(@picture, serializer: PolymorphicBelongsToSerializer) # uses default adapter: attributes + @json_serialization = serializable(@picture, adapter: :json, serializer: PolymorphicBelongsToSerializer) + @json_api_serialization = serializable(@picture, adapter: :json_api, serializer: PolymorphicBelongsToSerializer) + end + + def test_attributes_serialization + expected = + { + id: 1, + title: 'headshot-1.jpg', + imageable: { + id: 42, + name: 'Zoop Zoopler' + } + } + + assert_equal(expected, @attributes_serialization.as_json) + end + + def test_json_serializer + expected = + { + picture: { + id: 1, + title: 'headshot-1.jpg', + imageable: { + id: 42, + name: 'Zoop Zoopler' + } + } + } + + assert_equal(expected, @json_serialization.as_json) + end + + def test_json_api_serializer + expected = + { + data: { + id: '1', + type: 'pictures', + attributes: { + title: 'headshot-1.jpg' + }, + relationships: { + imageable: { + data: { + id: '42', + type: 'employees' + } + } + } + } + } + + assert_equal(expected, @json_api_serialization.as_json) + end + end + end + end +end diff --git a/test/fixtures/active_record.rb b/test/fixtures/active_record.rb index 9509411bb..26b7d3907 100644 --- a/test/fixtures/active_record.rb +++ b/test/fixtures/active_record.rb @@ -18,6 +18,17 @@ t.references :post t.timestamp null: false end + create_table :employees, force: true do |t| + t.string :name + t.string :email + t.timestamp null: false + end + create_table :pictures, force: true do |t| + t.string :title + t.string :imageable_type + t.string :imageable_id + t.timestamp null: false + end end module ARModels diff --git a/test/fixtures/poro.rb b/test/fixtures/poro.rb index c40b1ca61..c7fb831c8 100644 --- a/test/fixtures/poro.rb +++ b/test/fixtures/poro.rb @@ -72,6 +72,14 @@ def cache_key end end +class Employee < ActiveRecord::Base + has_many :pictures, as: :imageable +end + +class Picture < ActiveRecord::Base + belongs_to :imageable, polymorphic: true +end + module Spam; end Spam::UnrelatedLink = Class.new(Model) @@ -233,6 +241,16 @@ def maker end end +PolymorphicHasManySerializer = Class.new(ActiveModel::Serializer) do + attributes :id, :name +end + +PolymorphicBelongsToSerializer = Class.new(ActiveModel::Serializer) do + attributes :id, :title + + has_one :imageable, serializer: PolymorphicHasManySerializer +end + Spam::UnrelatedLinkSerializer = Class.new(ActiveModel::Serializer) do cache only: [:id] attributes :id