Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Adds tests and documentation for polymorphism #1420

Merged
merged 1 commit into from
Mar 15, 2016
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
12 changes: 12 additions & 0 deletions docs/general/serializers.md
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,18 @@ def blog
end
```

### Polymorphic Relationships

Polymorphic relationships are serialized by specifying the relationship, like any other association. For example:
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If we merge #1453, this will have to change (to mention the polymorphic option).

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Understood. Will wait for the word then and update docs/tests if necessary.


```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
Expand Down
72 changes: 72 additions & 0 deletions test/adapter/polymorphic_test.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
require 'test_helper'

module ActiveModel
class Serializer
module Adapter
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

IMHO we should split this into different files under the adapters namespace for that sake of organization

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the feedback @joaomdmoura. My first implementation was split out like you suggested, but I followed @bf4's suggestion to combine these, which has a benefit of being able to compare the payloads side by side. If you'd like, I'll revert the changes. Let me know the final verdict.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

np, you can keep it as it is, it a non blocking comment for sure, I can talk with @bf4 later to know if there any other reason to keep it this way, but it's just a minor detail

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I hope to work with @remear to do some of these in cucumber so they're easier to compare, in general. I suggested one file since yhe differences are subtle '. I'd be for separate files if we were more consistent in test file organization

B mobile phone

On Jan 20, 2016, at 11:00 AM, João Moura notifications@github.com wrote:

In test/adapter/polymorphic_test.rb:

@@ -0,0 +1,72 @@
+require 'test_helper'
+
+module ActiveModel

  • class Serializer
  • module Adapter
    IMHO we should split this into different files under the adapters namespace for that sake of organization


Reply to this email directly or view it on GitHub.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, the tests are currently a bloody mess. We really need to do something about it.

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
11 changes: 11 additions & 0 deletions test/fixtures/active_record.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
18 changes: 18 additions & 0 deletions test/fixtures/poro.rb
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,14 @@ def cache_key
end
end

class Employee < ActiveRecord::Base
has_many :pictures, as: :imageable
end
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe seializer name can describe what it's for testing? Polymorhipichasmany polymorphic belongsto


class Picture < ActiveRecord::Base
belongs_to :imageable, polymorphic: true
end

module Spam; end
Spam::UnrelatedLink = Class.new(Model)

Expand Down Expand Up @@ -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
Expand Down