require "cases/helper" class SerializerTest < ActiveModel::TestCase class Model def initialize(hash={}) @attributes = hash end def read_attribute_for_serialization(name) @attributes[name] end end class User < Model attr_accessor :superuser def initialize(hash={}) super hash.merge(:first_name => "Jose", :last_name => "Valim", :password => "oh noes yugive my password") end def super_user? @superuser end end class Post < Model attr_accessor :comments end class Comment < Model end class UserSerializer < ActiveModel::Serializer attributes :first_name, :last_name end class User2Serializer < ActiveModel::Serializer attributes :first_name, :last_name def serializable_hash attributes.merge(:ok => true).merge(scope) end end class MyUserSerializer < ActiveModel::Serializer attributes :first_name, :last_name def serializable_hash hash = attributes hash = hash.merge(:super_user => true) if my_user.super_user? hash end end class CommentSerializer def initialize(comment, scope) @comment, @scope = comment, scope end def serializable_hash { title: @comment.read_attribute_for_serialization(:title) } end def as_json { comment: serializable_hash } end end class PostSerializer < ActiveModel::Serializer attributes :title, :body has_many :comments, :serializer => CommentSerializer end def test_attributes user = User.new user_serializer = UserSerializer.new(user, nil) hash = user_serializer.as_json assert_equal({ :first_name => "Jose", :last_name => "Valim" }, hash) end def test_attributes_method user = User.new user_serializer = User2Serializer.new(user, {}) hash = user_serializer.as_json assert_equal({ :first_name => "Jose", :last_name => "Valim", :ok => true }, hash) end def test_serializer_receives_scope user = User.new user_serializer = User2Serializer.new(user, {:scope => true}) hash = user_serializer.as_json assert_equal({ :first_name => "Jose", :last_name => "Valim", :ok => true, :scope => true }, hash) end def test_pretty_accessors user = User.new user.superuser = true user_serializer = MyUserSerializer.new(user, nil) hash = user_serializer.as_json assert_equal({ :first_name => "Jose", :last_name => "Valim", :super_user => true }, hash) end def test_has_many user = User.new post = Post.new(:title => "New Post", :body => "Body of new post", :email => "tenderlove@tenderlove.com") comments = [Comment.new(:title => "Comment1"), Comment.new(:title => "Comment2")] post.comments = comments post_serializer = PostSerializer.new(post, user) assert_equal({ :title => "New Post", :body => "Body of new post", :comments => [ { :title => "Comment1" }, { :title => "Comment2" } ] }, post_serializer.as_json) end class Blog < Model attr_accessor :author end class AuthorSerializer < ActiveModel::Serializer attributes :first_name, :last_name end class BlogSerializer < ActiveModel::Serializer has_one :author, :serializer => AuthorSerializer end def test_has_one user = User.new blog = Blog.new blog.author = user json = BlogSerializer.new(blog, user).as_json assert_equal({ :author => { :first_name => "Jose", :last_name => "Valim" } }, json) end def test_implicit_serializer author_serializer = Class.new(ActiveModel::Serializer) do attributes :first_name end blog_serializer = Class.new(ActiveModel::Serializer) do const_set(:AuthorSerializer, author_serializer) has_one :author end user = User.new blog = Blog.new blog.author = user json = blog_serializer.new(blog, user).as_json assert_equal({ :author => { :first_name => "Jose" } }, json) end def test_overridden_associations author_serializer = Class.new(ActiveModel::Serializer) do attributes :first_name end blog_serializer = Class.new(ActiveModel::Serializer) do const_set(:PersonSerializer, author_serializer) has_one :person def person object.author end end user = User.new blog = Blog.new blog.author = user json = blog_serializer.new(blog, user).as_json assert_equal({ :person => { :first_name => "Jose" } }, json) end end