mirror of
https://github.com/ditkrg/active_model_serializers.git
synced 2026-01-24 14:56:50 +00:00
Added tests.
This commit is contained in:
parent
c6eee6457f
commit
5a230e8e66
9
Rakefile
9
Rakefile
@ -1,2 +1,11 @@
|
|||||||
#!/usr/bin/env rake
|
#!/usr/bin/env rake
|
||||||
require "bundler/gem_tasks"
|
require "bundler/gem_tasks"
|
||||||
|
require "rake/testtask"
|
||||||
|
|
||||||
|
desc 'Run tests'
|
||||||
|
Rake::TestTask.new(:test) do |t|
|
||||||
|
t.libs << 'lib'
|
||||||
|
t.libs << 'test'
|
||||||
|
t.pattern = 'test/**/*_test.rb'
|
||||||
|
t.verbose = true
|
||||||
|
end
|
||||||
|
|||||||
@ -7,7 +7,13 @@ ActiveModel::Serialization.class_eval do
|
|||||||
module ClassMethods #:nodoc:
|
module ClassMethods #:nodoc:
|
||||||
def active_model_serializer
|
def active_model_serializer
|
||||||
return @active_model_serializer if defined?(@active_model_serializer)
|
return @active_model_serializer if defined?(@active_model_serializer)
|
||||||
@active_model_serializer = "#{self.name}Serializer".safe_constantize
|
|
||||||
|
# Use safe constantize when Rails 3.2 is out
|
||||||
|
begin
|
||||||
|
@active_model_serializer = "#{self.name}Serializer".constantize
|
||||||
|
rescue NameError => e
|
||||||
|
raise unless e.message =~ /uninitialized constant$/ && e.name.to_s == "#{self.name}Serializer"
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@ -1,6 +1,7 @@
|
|||||||
module Rails
|
module Rails
|
||||||
module Generators
|
module Generators
|
||||||
class SerializerGenerator < NamedBase
|
class SerializerGenerator < NamedBase
|
||||||
|
source_root File.expand_path("../templates", __FILE__)
|
||||||
check_class_collision :suffix => "Serializer"
|
check_class_collision :suffix => "Serializer"
|
||||||
|
|
||||||
argument :attributes, :type => :array, :default => [], :banner => "field:type field:type"
|
argument :attributes, :type => :array, :default => [], :banner => "field:type field:type"
|
||||||
@ -26,8 +27,9 @@ module Rails
|
|||||||
def parent_class_name
|
def parent_class_name
|
||||||
if options[:parent]
|
if options[:parent]
|
||||||
options[:parent]
|
options[:parent]
|
||||||
elsif (n = Rails::Generators.namespace) && n.const_defined?(:ApplicationSerializer)
|
# Only works on 3.2
|
||||||
"ApplicationSerializer"
|
# elsif (n = Rails::Generators.namespace) && n.const_defined?(:ApplicationSerializer)
|
||||||
|
# "ApplicationSerializer"
|
||||||
elsif Object.const_defined?(:ApplicationSerializer)
|
elsif Object.const_defined?(:ApplicationSerializer)
|
||||||
"ApplicationSerializer"
|
"ApplicationSerializer"
|
||||||
else
|
else
|
||||||
@ -1,13 +0,0 @@
|
|||||||
require 'rails/generators/test_unit'
|
|
||||||
|
|
||||||
module TestUnit
|
|
||||||
module Generators
|
|
||||||
class SerializerGenerator < Base
|
|
||||||
check_class_collision :suffix => "SerializerTest"
|
|
||||||
|
|
||||||
def create_test_files
|
|
||||||
template 'unit_test.rb', File.join('test/unit', class_path, "#{file_name}_serializer_test.rb")
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
@ -1,9 +0,0 @@
|
|||||||
require 'test_helper'
|
|
||||||
|
|
||||||
<% module_namespacing do -%>
|
|
||||||
class <%= class_name %>SerializerTest < ActiveSupport::TestCase
|
|
||||||
# test "the truth" do
|
|
||||||
# assert true
|
|
||||||
# end
|
|
||||||
end
|
|
||||||
<% end -%>
|
|
||||||
67
test/generators_test.rb
Normal file
67
test/generators_test.rb
Normal file
@ -0,0 +1,67 @@
|
|||||||
|
require 'rails'
|
||||||
|
|
||||||
|
class Foo < Rails::Application
|
||||||
|
end
|
||||||
|
|
||||||
|
Rails.application.load_generators
|
||||||
|
|
||||||
|
require 'generators/serializer/serializer_generator'
|
||||||
|
|
||||||
|
class SerializerGeneratorTest < Rails::Generators::TestCase
|
||||||
|
destination File.expand_path("../tmp", __FILE__)
|
||||||
|
setup :prepare_destination
|
||||||
|
|
||||||
|
tests Rails::Generators::SerializerGenerator
|
||||||
|
arguments %w(account name:string description:text business:references)
|
||||||
|
|
||||||
|
def test_generates_a_serializer
|
||||||
|
run_generator
|
||||||
|
assert_file "app/serializers/account_serializer.rb", /class AccountSerializer < ActiveModel::Serializer/
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_generates_a_namespaced_serializer
|
||||||
|
run_generator ["admin/account"]
|
||||||
|
assert_file "app/serializers/admin/account_serializer.rb", /class Admin::AccountSerializer < ActiveModel::Serializer/
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_uses_application_serializer_if_one_exists
|
||||||
|
Object.const_set(:ApplicationSerializer, Class.new)
|
||||||
|
run_generator
|
||||||
|
assert_file "app/serializers/account_serializer.rb", /class AccountSerializer < ApplicationSerializer/
|
||||||
|
ensure
|
||||||
|
Object.send :remove_const, :ApplicationSerializer
|
||||||
|
end
|
||||||
|
|
||||||
|
# def test_uses_namespace_application_serializer_if_one_exists
|
||||||
|
# Object.const_set(:SerializerNamespace, Module.new)
|
||||||
|
# SerializerNamespace.const_set(:ApplicationSerializer, Class.new)
|
||||||
|
# Rails::Generators.namespace = SerializerNamespace
|
||||||
|
# run_generator
|
||||||
|
# assert_file "app/serializers/serializer_namespace/account_serializer.rb",
|
||||||
|
# /module SerializerNamespace\n class AccountSerializer < ApplicationSerializer/
|
||||||
|
# ensure
|
||||||
|
# Object.send :remove_const, :SerializerNamespace
|
||||||
|
# Rails::Generators.namespace = nil
|
||||||
|
# end
|
||||||
|
|
||||||
|
def test_uses_given_parent
|
||||||
|
Object.const_set(:ApplicationSerializer, Class.new)
|
||||||
|
run_generator ["Account", "--parent=MySerializer"]
|
||||||
|
assert_file "app/serializers/account_serializer.rb", /class AccountSerializer < MySerializer/
|
||||||
|
ensure
|
||||||
|
Object.send :remove_const, :ApplicationSerializer
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_generates_attributes_and_associations
|
||||||
|
run_generator
|
||||||
|
assert_file "app/serializers/account_serializer.rb" do |serializer|
|
||||||
|
assert_match(/^ attributes :name, :description$/, serializer)
|
||||||
|
assert_match(/^ has_one :business$/, serializer)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_with_no_attributes_does_not_add_extra_space
|
||||||
|
run_generator ["account"]
|
||||||
|
assert_file "app/serializers/account_serializer.rb", /class AccountSerializer < ActiveModel::Serializer\nend/
|
||||||
|
end
|
||||||
|
end
|
||||||
172
test/serialization_test.rb
Normal file
172
test/serialization_test.rb
Normal file
@ -0,0 +1,172 @@
|
|||||||
|
require 'test_helper'
|
||||||
|
require 'pathname'
|
||||||
|
|
||||||
|
class RenderJsonTest < ActionController::TestCase
|
||||||
|
class JsonRenderable
|
||||||
|
def as_json(options={})
|
||||||
|
hash = { :a => :b, :c => :d, :e => :f }
|
||||||
|
hash.except!(*options[:except]) if options[:except]
|
||||||
|
hash
|
||||||
|
end
|
||||||
|
|
||||||
|
def to_json(options = {})
|
||||||
|
super :except => [:c, :e]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
class JsonSerializer
|
||||||
|
def initialize(object, scope)
|
||||||
|
@object, @scope = object, scope
|
||||||
|
end
|
||||||
|
|
||||||
|
def as_json(*)
|
||||||
|
{ :object => @object.as_json, :scope => @scope.as_json }
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
class JsonSerializable
|
||||||
|
def initialize(skip=false)
|
||||||
|
@skip = skip
|
||||||
|
end
|
||||||
|
|
||||||
|
def active_model_serializer
|
||||||
|
JsonSerializer unless @skip
|
||||||
|
end
|
||||||
|
|
||||||
|
def as_json(*)
|
||||||
|
{ :serializable_object => true }
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
class TestController < ActionController::Base
|
||||||
|
protect_from_forgery
|
||||||
|
|
||||||
|
serialization_scope :current_user
|
||||||
|
attr_reader :current_user
|
||||||
|
|
||||||
|
def self.controller_path
|
||||||
|
'test'
|
||||||
|
end
|
||||||
|
|
||||||
|
def render_json_nil
|
||||||
|
render :json => nil
|
||||||
|
end
|
||||||
|
|
||||||
|
def render_json_render_to_string
|
||||||
|
render :text => render_to_string(:json => '[]')
|
||||||
|
end
|
||||||
|
|
||||||
|
def render_json_hello_world
|
||||||
|
render :json => ActiveSupport::JSON.encode(:hello => 'world')
|
||||||
|
end
|
||||||
|
|
||||||
|
def render_json_hello_world_with_status
|
||||||
|
render :json => ActiveSupport::JSON.encode(:hello => 'world'), :status => 401
|
||||||
|
end
|
||||||
|
|
||||||
|
def render_json_hello_world_with_callback
|
||||||
|
render :json => ActiveSupport::JSON.encode(:hello => 'world'), :callback => 'alert'
|
||||||
|
end
|
||||||
|
|
||||||
|
def render_json_with_custom_content_type
|
||||||
|
render :json => ActiveSupport::JSON.encode(:hello => 'world'), :content_type => 'text/javascript'
|
||||||
|
end
|
||||||
|
|
||||||
|
def render_symbol_json
|
||||||
|
render :json => ActiveSupport::JSON.encode(:hello => 'world')
|
||||||
|
end
|
||||||
|
|
||||||
|
def render_json_with_extra_options
|
||||||
|
render :json => JsonRenderable.new, :except => [:c, :e]
|
||||||
|
end
|
||||||
|
|
||||||
|
def render_json_without_options
|
||||||
|
render :json => JsonRenderable.new
|
||||||
|
end
|
||||||
|
|
||||||
|
def render_json_with_serializer
|
||||||
|
@current_user = Struct.new(:as_json).new(:current_user => true)
|
||||||
|
render :json => JsonSerializable.new
|
||||||
|
end
|
||||||
|
|
||||||
|
def render_json_with_serializer_api_but_without_serializer
|
||||||
|
@current_user = Struct.new(:as_json).new(:current_user => true)
|
||||||
|
render :json => JsonSerializable.new(true)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
tests TestController
|
||||||
|
|
||||||
|
def setup
|
||||||
|
# enable a logger so that (e.g.) the benchmarking stuff runs, so we can get
|
||||||
|
# a more accurate simulation of what happens in "real life".
|
||||||
|
super
|
||||||
|
@controller.logger = Logger.new(nil)
|
||||||
|
|
||||||
|
@request.host = "www.nextangle.com"
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_render_json_nil
|
||||||
|
get :render_json_nil
|
||||||
|
assert_equal 'null', @response.body
|
||||||
|
assert_equal 'application/json', @response.content_type
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_render_json_render_to_string
|
||||||
|
get :render_json_render_to_string
|
||||||
|
assert_equal '[]', @response.body
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
def test_render_json
|
||||||
|
get :render_json_hello_world
|
||||||
|
assert_equal '{"hello":"world"}', @response.body
|
||||||
|
assert_equal 'application/json', @response.content_type
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_render_json_with_status
|
||||||
|
get :render_json_hello_world_with_status
|
||||||
|
assert_equal '{"hello":"world"}', @response.body
|
||||||
|
assert_equal 401, @response.status
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_render_json_with_callback
|
||||||
|
get :render_json_hello_world_with_callback
|
||||||
|
assert_equal 'alert({"hello":"world"})', @response.body
|
||||||
|
assert_equal 'application/json', @response.content_type
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_render_json_with_custom_content_type
|
||||||
|
get :render_json_with_custom_content_type
|
||||||
|
assert_equal '{"hello":"world"}', @response.body
|
||||||
|
assert_equal 'text/javascript', @response.content_type
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_render_symbol_json
|
||||||
|
get :render_symbol_json
|
||||||
|
assert_equal '{"hello":"world"}', @response.body
|
||||||
|
assert_equal 'application/json', @response.content_type
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_render_json_forwards_extra_options
|
||||||
|
get :render_json_with_extra_options
|
||||||
|
assert_equal '{"a":"b"}', @response.body
|
||||||
|
assert_equal 'application/json', @response.content_type
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_render_json_calls_to_json_from_object
|
||||||
|
get :render_json_without_options
|
||||||
|
assert_equal '{"a":"b"}', @response.body
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_render_json_with_serializer
|
||||||
|
get :render_json_with_serializer
|
||||||
|
assert_match '"scope":{"current_user":true}', @response.body
|
||||||
|
assert_match '"object":{"serializable_object":true}', @response.body
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_render_json_with_serializer_api_but_without_serializer
|
||||||
|
get :render_json_with_serializer_api_but_without_serializer
|
||||||
|
assert_match '{"serializable_object":true}', @response.body
|
||||||
|
end
|
||||||
|
end
|
||||||
432
test/serializer_test.rb
Normal file
432
test/serializer_test.rb
Normal file
@ -0,0 +1,432 @@
|
|||||||
|
require "test_helper"
|
||||||
|
|
||||||
|
class SerializerTest < ActiveModel::TestCase
|
||||||
|
class Model
|
||||||
|
def initialize(hash={})
|
||||||
|
@attributes = hash
|
||||||
|
end
|
||||||
|
|
||||||
|
def read_attribute_for_serialization(name)
|
||||||
|
@attributes[name]
|
||||||
|
end
|
||||||
|
|
||||||
|
def as_json(*)
|
||||||
|
{ :model => "Model" }
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
class User
|
||||||
|
include ActiveModel::Serialization
|
||||||
|
|
||||||
|
attr_accessor :superuser
|
||||||
|
|
||||||
|
def initialize(hash={})
|
||||||
|
@attributes = hash.merge(:first_name => "Jose", :last_name => "Valim", :password => "oh noes yugive my password")
|
||||||
|
end
|
||||||
|
|
||||||
|
def read_attribute_for_serialization(name)
|
||||||
|
@attributes[name]
|
||||||
|
end
|
||||||
|
|
||||||
|
def super_user?
|
||||||
|
@superuser
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
class Post < Model
|
||||||
|
attr_accessor :comments
|
||||||
|
def active_model_serializer; PostSerializer; end
|
||||||
|
end
|
||||||
|
|
||||||
|
class Comment < Model
|
||||||
|
def active_model_serializer; CommentSerializer; end
|
||||||
|
end
|
||||||
|
|
||||||
|
class UserSerializer < ActiveModel::Serializer
|
||||||
|
attributes :first_name, :last_name
|
||||||
|
|
||||||
|
def serializable_hash
|
||||||
|
attributes.merge(:ok => true).merge(scope)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
class DefaultUserSerializer < ActiveModel::Serializer
|
||||||
|
attributes :first_name, :last_name
|
||||||
|
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 = DefaultUserSerializer.new(user, {})
|
||||||
|
|
||||||
|
hash = user_serializer.as_json
|
||||||
|
|
||||||
|
assert_equal({
|
||||||
|
:default_user => { :first_name => "Jose", :last_name => "Valim" }
|
||||||
|
}, hash)
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_attributes_method
|
||||||
|
user = User.new
|
||||||
|
user_serializer = UserSerializer.new(user, {})
|
||||||
|
|
||||||
|
hash = user_serializer.as_json
|
||||||
|
|
||||||
|
assert_equal({
|
||||||
|
:user => { :first_name => "Jose", :last_name => "Valim", :ok => true }
|
||||||
|
}, hash)
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_serializer_receives_scope
|
||||||
|
user = User.new
|
||||||
|
user_serializer = UserSerializer.new(user, {:scope => true})
|
||||||
|
|
||||||
|
hash = user_serializer.as_json
|
||||||
|
|
||||||
|
assert_equal({
|
||||||
|
:user => {
|
||||||
|
: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({
|
||||||
|
:my_user => {
|
||||||
|
: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({
|
||||||
|
:post => {
|
||||||
|
: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({
|
||||||
|
:blog => {
|
||||||
|
: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)
|
||||||
|
|
||||||
|
def person
|
||||||
|
object.author
|
||||||
|
end
|
||||||
|
|
||||||
|
has_one :person
|
||||||
|
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
|
||||||
|
|
||||||
|
def post_serializer(type)
|
||||||
|
Class.new(ActiveModel::Serializer) do
|
||||||
|
attributes :title, :body
|
||||||
|
has_many :comments, :serializer => CommentSerializer
|
||||||
|
|
||||||
|
if type != :super
|
||||||
|
define_method :serializable_hash do
|
||||||
|
post_hash = attributes
|
||||||
|
post_hash.merge!(send(type))
|
||||||
|
post_hash
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_associations
|
||||||
|
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
|
||||||
|
|
||||||
|
serializer = post_serializer(:associations).new(post, nil)
|
||||||
|
|
||||||
|
assert_equal({
|
||||||
|
:title => "New Post",
|
||||||
|
:body => "Body of new post",
|
||||||
|
:comments => [
|
||||||
|
{ :title => "Comment1" },
|
||||||
|
{ :title => "Comment2" }
|
||||||
|
]
|
||||||
|
}, serializer.as_json)
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_association_ids
|
||||||
|
serializer = post_serializer(:association_ids)
|
||||||
|
|
||||||
|
serializer.class_eval do
|
||||||
|
def as_json(*)
|
||||||
|
{ :post => serializable_hash }.merge(associations)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
post = Post.new(:title => "New Post", :body => "Body of new post", :email => "tenderlove@tenderlove.com")
|
||||||
|
comments = [Comment.new(:title => "Comment1", :id => 1), Comment.new(:title => "Comment2", :id => 2)]
|
||||||
|
post.comments = comments
|
||||||
|
|
||||||
|
serializer = serializer.new(post, nil)
|
||||||
|
|
||||||
|
assert_equal({
|
||||||
|
:post => {
|
||||||
|
:title => "New Post",
|
||||||
|
:body => "Body of new post",
|
||||||
|
:comments => [1, 2]
|
||||||
|
},
|
||||||
|
:comments => [
|
||||||
|
{ :title => "Comment1" },
|
||||||
|
{ :title => "Comment2" }
|
||||||
|
]
|
||||||
|
}, serializer.as_json)
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_associations_with_nil_association
|
||||||
|
user = User.new
|
||||||
|
blog = Blog.new
|
||||||
|
|
||||||
|
json = BlogSerializer.new(blog, user).as_json
|
||||||
|
assert_equal({
|
||||||
|
:blog => { :author => nil }
|
||||||
|
}, json)
|
||||||
|
|
||||||
|
serializer = Class.new(BlogSerializer) do
|
||||||
|
root :blog
|
||||||
|
|
||||||
|
def serializable_hash
|
||||||
|
attributes.merge(association_ids)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
json = serializer.new(blog, user).as_json
|
||||||
|
assert_equal({ :blog => { :author => nil } }, json)
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_custom_root
|
||||||
|
user = User.new
|
||||||
|
blog = Blog.new
|
||||||
|
|
||||||
|
serializer = Class.new(BlogSerializer) do
|
||||||
|
root :my_blog
|
||||||
|
end
|
||||||
|
|
||||||
|
assert_equal({ :my_blog => { :author => nil } }, serializer.new(blog, user).as_json)
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_false_root
|
||||||
|
user = User.new
|
||||||
|
blog = Blog.new
|
||||||
|
|
||||||
|
serializer = Class.new(BlogSerializer) do
|
||||||
|
root false
|
||||||
|
end
|
||||||
|
|
||||||
|
assert_equal({ :author => nil }, serializer.new(blog, user).as_json)
|
||||||
|
|
||||||
|
# test inherited false root
|
||||||
|
serializer = Class.new(serializer)
|
||||||
|
assert_equal({ :author => nil }, serializer.new(blog, user).as_json)
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_embed_ids
|
||||||
|
serializer = post_serializer(:super)
|
||||||
|
|
||||||
|
serializer.class_eval do
|
||||||
|
root :post
|
||||||
|
embed :ids
|
||||||
|
end
|
||||||
|
|
||||||
|
post = Post.new(:title => "New Post", :body => "Body of new post", :email => "tenderlove@tenderlove.com")
|
||||||
|
comments = [Comment.new(:title => "Comment1", :id => 1), Comment.new(:title => "Comment2", :id => 2)]
|
||||||
|
post.comments = comments
|
||||||
|
|
||||||
|
serializer = serializer.new(post, nil)
|
||||||
|
|
||||||
|
assert_equal({
|
||||||
|
:post => {
|
||||||
|
:title => "New Post",
|
||||||
|
:body => "Body of new post",
|
||||||
|
:comments => [1, 2]
|
||||||
|
}
|
||||||
|
}, serializer.as_json)
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_embed_ids_include_true
|
||||||
|
serializer = post_serializer(:super)
|
||||||
|
|
||||||
|
serializer.class_eval do
|
||||||
|
root :post
|
||||||
|
embed :ids, :include => true
|
||||||
|
end
|
||||||
|
|
||||||
|
post = Post.new(:title => "New Post", :body => "Body of new post", :email => "tenderlove@tenderlove.com")
|
||||||
|
comments = [Comment.new(:title => "Comment1", :id => 1), Comment.new(:title => "Comment2", :id => 2)]
|
||||||
|
post.comments = comments
|
||||||
|
|
||||||
|
serializer = serializer.new(post, nil)
|
||||||
|
|
||||||
|
assert_equal({
|
||||||
|
:post => {
|
||||||
|
:title => "New Post",
|
||||||
|
:body => "Body of new post",
|
||||||
|
:comments => [1, 2]
|
||||||
|
},
|
||||||
|
:comments => [
|
||||||
|
{ :title => "Comment1" },
|
||||||
|
{ :title => "Comment2" }
|
||||||
|
]
|
||||||
|
}, serializer.as_json)
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_embed_objects
|
||||||
|
serializer = post_serializer(:super)
|
||||||
|
|
||||||
|
serializer.class_eval do
|
||||||
|
root :post
|
||||||
|
embed :objects
|
||||||
|
end
|
||||||
|
|
||||||
|
post = Post.new(:title => "New Post", :body => "Body of new post", :email => "tenderlove@tenderlove.com")
|
||||||
|
comments = [Comment.new(:title => "Comment1", :id => 1), Comment.new(:title => "Comment2", :id => 2)]
|
||||||
|
post.comments = comments
|
||||||
|
|
||||||
|
serializer = serializer.new(post, nil)
|
||||||
|
|
||||||
|
assert_equal({
|
||||||
|
:post => {
|
||||||
|
:title => "New Post",
|
||||||
|
:body => "Body of new post",
|
||||||
|
:comments => [
|
||||||
|
{ :title => "Comment1" },
|
||||||
|
{ :title => "Comment2" }
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}, serializer.as_json)
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_array_serializer
|
||||||
|
model = Model.new
|
||||||
|
user = User.new
|
||||||
|
comments = Comment.new(:title => "Comment1", :id => 1)
|
||||||
|
|
||||||
|
array = [model, user, comments]
|
||||||
|
serializer = array.active_model_serializer.new(array, {:scope => true})
|
||||||
|
assert_equal([
|
||||||
|
{ :model => "Model" },
|
||||||
|
{ :user => { :last_name=>"Valim", :ok=>true, :first_name=>"Jose", :scope => true } },
|
||||||
|
{ :comment => { :title => "Comment1" } }
|
||||||
|
], serializer.as_json)
|
||||||
|
end
|
||||||
|
end
|
||||||
24
test/test_helper.rb
Normal file
24
test/test_helper.rb
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
require "rubygems"
|
||||||
|
require "bundler"
|
||||||
|
|
||||||
|
Bundler.setup
|
||||||
|
|
||||||
|
require "active_model_serializers"
|
||||||
|
require "active_support/json"
|
||||||
|
require "test/unit"
|
||||||
|
|
||||||
|
module TestHelper
|
||||||
|
Routes = ActionDispatch::Routing::RouteSet.new
|
||||||
|
Routes.draw do
|
||||||
|
match ':controller(/:action(/:id))'
|
||||||
|
match ':controller(/:action)'
|
||||||
|
end
|
||||||
|
|
||||||
|
ActionController::Base.send :include, Routes.url_helpers
|
||||||
|
end
|
||||||
|
|
||||||
|
ActiveSupport::TestCase.class_eval do
|
||||||
|
setup do
|
||||||
|
@routes = ::TestHelper::Routes
|
||||||
|
end
|
||||||
|
end
|
||||||
Loading…
Reference in New Issue
Block a user