Skip to content

Commit 5a230e8

Browse files
committed
Added tests.
1 parent c6eee64 commit 5a230e8

File tree

11 files changed

+715
-25
lines changed

11 files changed

+715
-25
lines changed

Rakefile

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,11 @@
11
#!/usr/bin/env rake
22
require "bundler/gem_tasks"
3+
require "rake/testtask"
4+
5+
desc 'Run tests'
6+
Rake::TestTask.new(:test) do |t|
7+
t.libs << 'lib'
8+
t.libs << 'test'
9+
t.pattern = 'test/**/*_test.rb'
10+
t.verbose = true
11+
end

lib/active_model_serializers.rb

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,13 @@
77
module ClassMethods #:nodoc:
88
def active_model_serializer
99
return @active_model_serializer if defined?(@active_model_serializer)
10-
@active_model_serializer = "#{self.name}Serializer".safe_constantize
10+
11+
# Use safe constantize when Rails 3.2 is out
12+
begin
13+
@active_model_serializer = "#{self.name}Serializer".constantize
14+
rescue NameError => e
15+
raise unless e.message =~ /uninitialized constant$/ && e.name.to_s == "#{self.name}Serializer"
16+
end
1117
end
1218
end
1319

lib/rails/generators/rails/serializer/serializer_generator.rb renamed to lib/generators/serializer/serializer_generator.rb

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
module Rails
22
module Generators
33
class SerializerGenerator < NamedBase
4+
source_root File.expand_path("../templates", __FILE__)
45
check_class_collision :suffix => "Serializer"
56

67
argument :attributes, :type => :array, :default => [], :banner => "field:type field:type"
@@ -26,8 +27,9 @@ def association_names
2627
def parent_class_name
2728
if options[:parent]
2829
options[:parent]
29-
elsif (n = Rails::Generators.namespace) && n.const_defined?(:ApplicationSerializer)
30-
"ApplicationSerializer"
30+
# Only works on 3.2
31+
# elsif (n = Rails::Generators.namespace) && n.const_defined?(:ApplicationSerializer)
32+
# "ApplicationSerializer"
3133
elsif Object.const_defined?(:ApplicationSerializer)
3234
"ApplicationSerializer"
3335
else

lib/rails/generators/test_unit/serializer/serializer_generator.rb

Lines changed: 0 additions & 13 deletions
This file was deleted.

lib/rails/generators/test_unit/serializer/templates/unit_test.rb

Lines changed: 0 additions & 9 deletions
This file was deleted.

test/generators_test.rb

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
require 'rails'
2+
3+
class Foo < Rails::Application
4+
end
5+
6+
Rails.application.load_generators
7+
8+
require 'generators/serializer/serializer_generator'
9+
10+
class SerializerGeneratorTest < Rails::Generators::TestCase
11+
destination File.expand_path("../tmp", __FILE__)
12+
setup :prepare_destination
13+
14+
tests Rails::Generators::SerializerGenerator
15+
arguments %w(account name:string description:text business:references)
16+
17+
def test_generates_a_serializer
18+
run_generator
19+
assert_file "app/serializers/account_serializer.rb", /class AccountSerializer < ActiveModel::Serializer/
20+
end
21+
22+
def test_generates_a_namespaced_serializer
23+
run_generator ["admin/account"]
24+
assert_file "app/serializers/admin/account_serializer.rb", /class Admin::AccountSerializer < ActiveModel::Serializer/
25+
end
26+
27+
def test_uses_application_serializer_if_one_exists
28+
Object.const_set(:ApplicationSerializer, Class.new)
29+
run_generator
30+
assert_file "app/serializers/account_serializer.rb", /class AccountSerializer < ApplicationSerializer/
31+
ensure
32+
Object.send :remove_const, :ApplicationSerializer
33+
end
34+
35+
# def test_uses_namespace_application_serializer_if_one_exists
36+
# Object.const_set(:SerializerNamespace, Module.new)
37+
# SerializerNamespace.const_set(:ApplicationSerializer, Class.new)
38+
# Rails::Generators.namespace = SerializerNamespace
39+
# run_generator
40+
# assert_file "app/serializers/serializer_namespace/account_serializer.rb",
41+
# /module SerializerNamespace\n class AccountSerializer < ApplicationSerializer/
42+
# ensure
43+
# Object.send :remove_const, :SerializerNamespace
44+
# Rails::Generators.namespace = nil
45+
# end
46+
47+
def test_uses_given_parent
48+
Object.const_set(:ApplicationSerializer, Class.new)
49+
run_generator ["Account", "--parent=MySerializer"]
50+
assert_file "app/serializers/account_serializer.rb", /class AccountSerializer < MySerializer/
51+
ensure
52+
Object.send :remove_const, :ApplicationSerializer
53+
end
54+
55+
def test_generates_attributes_and_associations
56+
run_generator
57+
assert_file "app/serializers/account_serializer.rb" do |serializer|
58+
assert_match(/^ attributes :name, :description$/, serializer)
59+
assert_match(/^ has_one :business$/, serializer)
60+
end
61+
end
62+
63+
def test_with_no_attributes_does_not_add_extra_space
64+
run_generator ["account"]
65+
assert_file "app/serializers/account_serializer.rb", /class AccountSerializer < ActiveModel::Serializer\nend/
66+
end
67+
end

test/serialization_test.rb

Lines changed: 172 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,172 @@
1+
require 'test_helper'
2+
require 'pathname'
3+
4+
class RenderJsonTest < ActionController::TestCase
5+
class JsonRenderable
6+
def as_json(options={})
7+
hash = { :a => :b, :c => :d, :e => :f }
8+
hash.except!(*options[:except]) if options[:except]
9+
hash
10+
end
11+
12+
def to_json(options = {})
13+
super :except => [:c, :e]
14+
end
15+
end
16+
17+
class JsonSerializer
18+
def initialize(object, scope)
19+
@object, @scope = object, scope
20+
end
21+
22+
def as_json(*)
23+
{ :object => @object.as_json, :scope => @scope.as_json }
24+
end
25+
end
26+
27+
class JsonSerializable
28+
def initialize(skip=false)
29+
@skip = skip
30+
end
31+
32+
def active_model_serializer
33+
JsonSerializer unless @skip
34+
end
35+
36+
def as_json(*)
37+
{ :serializable_object => true }
38+
end
39+
end
40+
41+
class TestController < ActionController::Base
42+
protect_from_forgery
43+
44+
serialization_scope :current_user
45+
attr_reader :current_user
46+
47+
def self.controller_path
48+
'test'
49+
end
50+
51+
def render_json_nil
52+
render :json => nil
53+
end
54+
55+
def render_json_render_to_string
56+
render :text => render_to_string(:json => '[]')
57+
end
58+
59+
def render_json_hello_world
60+
render :json => ActiveSupport::JSON.encode(:hello => 'world')
61+
end
62+
63+
def render_json_hello_world_with_status
64+
render :json => ActiveSupport::JSON.encode(:hello => 'world'), :status => 401
65+
end
66+
67+
def render_json_hello_world_with_callback
68+
render :json => ActiveSupport::JSON.encode(:hello => 'world'), :callback => 'alert'
69+
end
70+
71+
def render_json_with_custom_content_type
72+
render :json => ActiveSupport::JSON.encode(:hello => 'world'), :content_type => 'text/javascript'
73+
end
74+
75+
def render_symbol_json
76+
render :json => ActiveSupport::JSON.encode(:hello => 'world')
77+
end
78+
79+
def render_json_with_extra_options
80+
render :json => JsonRenderable.new, :except => [:c, :e]
81+
end
82+
83+
def render_json_without_options
84+
render :json => JsonRenderable.new
85+
end
86+
87+
def render_json_with_serializer
88+
@current_user = Struct.new(:as_json).new(:current_user => true)
89+
render :json => JsonSerializable.new
90+
end
91+
92+
def render_json_with_serializer_api_but_without_serializer
93+
@current_user = Struct.new(:as_json).new(:current_user => true)
94+
render :json => JsonSerializable.new(true)
95+
end
96+
end
97+
98+
tests TestController
99+
100+
def setup
101+
# enable a logger so that (e.g.) the benchmarking stuff runs, so we can get
102+
# a more accurate simulation of what happens in "real life".
103+
super
104+
@controller.logger = Logger.new(nil)
105+
106+
@request.host = "www.nextangle.com"
107+
end
108+
109+
def test_render_json_nil
110+
get :render_json_nil
111+
assert_equal 'null', @response.body
112+
assert_equal 'application/json', @response.content_type
113+
end
114+
115+
def test_render_json_render_to_string
116+
get :render_json_render_to_string
117+
assert_equal '[]', @response.body
118+
end
119+
120+
121+
def test_render_json
122+
get :render_json_hello_world
123+
assert_equal '{"hello":"world"}', @response.body
124+
assert_equal 'application/json', @response.content_type
125+
end
126+
127+
def test_render_json_with_status
128+
get :render_json_hello_world_with_status
129+
assert_equal '{"hello":"world"}', @response.body
130+
assert_equal 401, @response.status
131+
end
132+
133+
def test_render_json_with_callback
134+
get :render_json_hello_world_with_callback
135+
assert_equal 'alert({"hello":"world"})', @response.body
136+
assert_equal 'application/json', @response.content_type
137+
end
138+
139+
def test_render_json_with_custom_content_type
140+
get :render_json_with_custom_content_type
141+
assert_equal '{"hello":"world"}', @response.body
142+
assert_equal 'text/javascript', @response.content_type
143+
end
144+
145+
def test_render_symbol_json
146+
get :render_symbol_json
147+
assert_equal '{"hello":"world"}', @response.body
148+
assert_equal 'application/json', @response.content_type
149+
end
150+
151+
def test_render_json_forwards_extra_options
152+
get :render_json_with_extra_options
153+
assert_equal '{"a":"b"}', @response.body
154+
assert_equal 'application/json', @response.content_type
155+
end
156+
157+
def test_render_json_calls_to_json_from_object
158+
get :render_json_without_options
159+
assert_equal '{"a":"b"}', @response.body
160+
end
161+
162+
def test_render_json_with_serializer
163+
get :render_json_with_serializer
164+
assert_match '"scope":{"current_user":true}', @response.body
165+
assert_match '"object":{"serializable_object":true}', @response.body
166+
end
167+
168+
def test_render_json_with_serializer_api_but_without_serializer
169+
get :render_json_with_serializer_api_but_without_serializer
170+
assert_match '{"serializable_object":true}', @response.body
171+
end
172+
end

0 commit comments

Comments
 (0)