active_model_serializers 0.6.0 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.travis.yml +13 -13
- data/{gemfiles/Gemfile.edge-rails → Gemfile.edge} +1 -1
- data/README.md +141 -16
- data/RELEASE_NOTES.md +1 -1
- data/lib/action_controller/serialization.rb +8 -1
- data/lib/active_model/array_serializer.rb +21 -13
- data/lib/active_model/serializer.rb +60 -199
- data/lib/active_model/serializer/associations.rb +226 -0
- data/lib/active_model/serializers/version.rb +1 -1
- data/lib/active_model_serializers.rb +3 -5
- data/test/array_serializer_test.rb +55 -0
- data/test/association_test.rb +151 -36
- data/test/generators_test.rb +4 -0
- data/test/serialization_test.rb +80 -3
- data/test/serializer_support_test.rb +11 -0
- data/test/serializer_test.rb +153 -231
- data/test/test_fakes.rb +182 -0
- metadata +41 -28
- data/lib/active_model/ordered_set.rb +0 -25
data/test/generators_test.rb
CHANGED
data/test/serialization_test.rb
CHANGED
@@ -54,6 +54,19 @@ class RenderJsonTest < ActionController::TestCase
|
|
54
54
|
end
|
55
55
|
end
|
56
56
|
|
57
|
+
class AnotherCustomSerializer
|
58
|
+
def initialize(*)
|
59
|
+
end
|
60
|
+
|
61
|
+
def as_json(*)
|
62
|
+
{ :rails => 'rocks' }
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
class DummyCustomSerializer < ActiveModel::Serializer
|
67
|
+
attributes :id
|
68
|
+
end
|
69
|
+
|
57
70
|
class HypermediaSerializable
|
58
71
|
def active_model_serializer
|
59
72
|
HypermediaSerializer
|
@@ -108,6 +121,11 @@ class RenderJsonTest < ActionController::TestCase
|
|
108
121
|
render :json => ActiveSupport::JSON.encode(:hello => 'world')
|
109
122
|
end
|
110
123
|
|
124
|
+
def render_json_nil_with_custom_serializer
|
125
|
+
render :json => nil, :serializer => DummyCustomSerializer
|
126
|
+
end
|
127
|
+
|
128
|
+
|
111
129
|
def render_json_with_extra_options
|
112
130
|
render :json => JsonRenderable.new, :except => [:c, :e]
|
113
131
|
end
|
@@ -152,6 +170,10 @@ class RenderJsonTest < ActionController::TestCase
|
|
152
170
|
render :json => [Object.new], :each_serializer => CustomSerializer
|
153
171
|
end
|
154
172
|
|
173
|
+
def render_json_array_with_wrong_option
|
174
|
+
render :json => [Object.new], :serializer => CustomSerializer
|
175
|
+
end
|
176
|
+
|
155
177
|
def render_json_with_links
|
156
178
|
render :json => HypermediaSerializable.new
|
157
179
|
end
|
@@ -171,9 +193,13 @@ class RenderJsonTest < ActionController::TestCase
|
|
171
193
|
|
172
194
|
private
|
173
195
|
def default_serializer_options
|
174
|
-
|
175
|
-
|
176
|
-
|
196
|
+
defaults = {}
|
197
|
+
defaults.merge!(:check_defaults => true) if params[:check_defaults]
|
198
|
+
defaults.merge!(:root => :awesome) if params[:check_default_root]
|
199
|
+
defaults.merge!(:scope => :current_admin) if params[:check_default_scope]
|
200
|
+
defaults.merge!(:serializer => AnotherCustomSerializer) if params[:check_default_serializer]
|
201
|
+
defaults.merge!(:each_serializer => AnotherCustomSerializer) if params[:check_default_each_serializer]
|
202
|
+
defaults
|
177
203
|
end
|
178
204
|
end
|
179
205
|
|
@@ -199,6 +225,11 @@ class RenderJsonTest < ActionController::TestCase
|
|
199
225
|
assert_equal '[]', @response.body
|
200
226
|
end
|
201
227
|
|
228
|
+
def test_render_json_nil_with_custom_serializer
|
229
|
+
get :render_json_nil_with_custom_serializer
|
230
|
+
assert_equal "{\"dummy_custom\":null}", @response.body
|
231
|
+
end
|
232
|
+
|
202
233
|
def test_render_json
|
203
234
|
get :render_json_hello_world
|
204
235
|
assert_equal '{"hello":"world"}', @response.body
|
@@ -254,11 +285,26 @@ class RenderJsonTest < ActionController::TestCase
|
|
254
285
|
assert_match '"check_defaults":true', @response.body
|
255
286
|
end
|
256
287
|
|
288
|
+
def test_render_json_with_serializer_checking_default_serailizer
|
289
|
+
get :render_json_with_serializer, :check_default_serializer => true
|
290
|
+
assert_match '{"rails":"rocks"}', @response.body
|
291
|
+
end
|
292
|
+
|
293
|
+
def test_render_json_with_serializer_checking_default_scope
|
294
|
+
get :render_json_with_serializer, :check_default_scope => true
|
295
|
+
assert_match '"scope":"current_admin"', @response.body
|
296
|
+
end
|
297
|
+
|
257
298
|
def test_render_json_with_serializer_and_implicit_root
|
258
299
|
get :render_json_with_serializer_and_implicit_root
|
259
300
|
assert_match '"test":[{"serializable_object":true}]', @response.body
|
260
301
|
end
|
261
302
|
|
303
|
+
def test_render_json_with_serializer_and_implicit_root_checking_default_each_serailizer
|
304
|
+
get :render_json_with_serializer_and_implicit_root, :check_default_each_serializer => true
|
305
|
+
assert_match '"test":[{"rails":"rocks"}]', @response.body
|
306
|
+
end
|
307
|
+
|
262
308
|
def test_render_json_with_serializer_and_options
|
263
309
|
get :render_json_with_serializer_and_options
|
264
310
|
assert_match '"scope":{"current_user":true}', @response.body
|
@@ -271,6 +317,11 @@ class RenderJsonTest < ActionController::TestCase
|
|
271
317
|
assert_match '"scope":{"current_user":false}', @response.body
|
272
318
|
end
|
273
319
|
|
320
|
+
def test_render_json_with_serializer_and_scope_option_checking_default_scope
|
321
|
+
get :render_json_with_serializer_and_scope_option, :check_default_scope => true
|
322
|
+
assert_match '"scope":{"current_user":false}', @response.body
|
323
|
+
end
|
324
|
+
|
274
325
|
def test_render_json_with_serializer_api_but_without_serializer
|
275
326
|
get :render_json_with_serializer_api_but_without_serializer
|
276
327
|
assert_match '{"serializable_object":true}', @response.body
|
@@ -281,11 +332,27 @@ class RenderJsonTest < ActionController::TestCase
|
|
281
332
|
assert_match '{"hello":true}', @response.body
|
282
333
|
end
|
283
334
|
|
335
|
+
def test_render_json_with_custom_serializer_checking_default_serailizer
|
336
|
+
get :render_json_with_custom_serializer, :check_default_serializer => true
|
337
|
+
assert_match '{"hello":true}', @response.body
|
338
|
+
end
|
339
|
+
|
284
340
|
def test_render_json_array_with_custom_serializer
|
285
341
|
get :render_json_array_with_custom_serializer
|
286
342
|
assert_match '{"test":[{"hello":true}]}', @response.body
|
287
343
|
end
|
288
344
|
|
345
|
+
def test_render_json_array_with_wrong_option
|
346
|
+
assert_raise ArgumentError do
|
347
|
+
get :render_json_array_with_wrong_option
|
348
|
+
end
|
349
|
+
end
|
350
|
+
|
351
|
+
def test_render_json_array_with_custom_serializer_checking_default_each_serailizer
|
352
|
+
get :render_json_array_with_custom_serializer, :check_default_each_serializer => true
|
353
|
+
assert_match '{"test":[{"hello":true}]}', @response.body
|
354
|
+
end
|
355
|
+
|
289
356
|
def test_render_json_with_links
|
290
357
|
get :render_json_with_links
|
291
358
|
assert_match '{"link":"http://www.nextangle.com/hypermedia"}', @response.body
|
@@ -296,11 +363,21 @@ class RenderJsonTest < ActionController::TestCase
|
|
296
363
|
assert_equal '[]', @response.body
|
297
364
|
end
|
298
365
|
|
366
|
+
def test_render_json_array_with_no_root_checking_default_root
|
367
|
+
get :render_json_array_with_no_root, :check_default_root => true
|
368
|
+
assert_equal '[]', @response.body
|
369
|
+
end
|
370
|
+
|
299
371
|
def test_render_json_empty_array
|
300
372
|
get :render_json_empty_array
|
301
373
|
assert_equal '{"test":[]}', @response.body
|
302
374
|
end
|
303
375
|
|
376
|
+
def test_render_json_empty_array_checking_default_root
|
377
|
+
get :render_json_empty_array, :check_default_root => true
|
378
|
+
assert_equal '{"awesome":[]}', @response.body
|
379
|
+
end
|
380
|
+
|
304
381
|
def test_render_json_empty_arry_with_array_serializer_root_false
|
305
382
|
ActiveModel::ArraySerializer.root = false
|
306
383
|
get :render_json_empty_array
|
@@ -4,6 +4,13 @@ class RandomModel
|
|
4
4
|
include ActiveModel::SerializerSupport
|
5
5
|
end
|
6
6
|
|
7
|
+
class OtherRandomModel
|
8
|
+
include ActiveModel::SerializerSupport
|
9
|
+
end
|
10
|
+
|
11
|
+
class OtherRandomModelSerializer
|
12
|
+
end
|
13
|
+
|
7
14
|
class RandomModelCollection
|
8
15
|
include ActiveModel::ArraySerializerSupport
|
9
16
|
end
|
@@ -18,6 +25,10 @@ class SerializerSupportTest < ActiveModel::TestCase
|
|
18
25
|
assert_equal nil, RandomModel.new.active_model_serializer
|
19
26
|
end
|
20
27
|
|
28
|
+
test "it returns a deducted serializer if it exists exists" do
|
29
|
+
assert_equal OtherRandomModelSerializer, OtherRandomModel.new.active_model_serializer
|
30
|
+
end
|
31
|
+
|
21
32
|
test "it returns ArraySerializer for a collection" do
|
22
33
|
assert_equal ActiveModel::ArraySerializer, RandomModelCollection.new.active_model_serializer
|
23
34
|
end
|
data/test/serializer_test.rb
CHANGED
@@ -1,119 +1,64 @@
|
|
1
1
|
require "test_helper"
|
2
|
+
require "test_fakes"
|
2
3
|
|
3
4
|
class SerializerTest < ActiveModel::TestCase
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
end
|
8
|
-
|
9
|
-
def read_attribute_for_serialization(name)
|
10
|
-
@attributes[name]
|
11
|
-
end
|
12
|
-
|
13
|
-
def as_json(*)
|
14
|
-
{ :model => "Model" }
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
class User
|
19
|
-
include ActiveModel::SerializerSupport
|
20
|
-
|
21
|
-
attr_accessor :superuser
|
22
|
-
|
23
|
-
def initialize(hash={})
|
24
|
-
@attributes = hash.merge(:first_name => "Jose", :last_name => "Valim", :password => "oh noes yugive my password")
|
25
|
-
end
|
26
|
-
|
27
|
-
def read_attribute_for_serialization(name)
|
28
|
-
@attributes[name]
|
29
|
-
end
|
30
|
-
|
31
|
-
def super_user?
|
32
|
-
@superuser
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
class Post < Model
|
37
|
-
def initialize(attributes)
|
38
|
-
super(attributes)
|
39
|
-
self.comments ||= []
|
40
|
-
self.comments_disabled = false
|
41
|
-
self.author = nil
|
42
|
-
end
|
43
|
-
|
44
|
-
attr_accessor :comments, :comments_disabled, :author
|
45
|
-
def active_model_serializer; PostSerializer; end
|
5
|
+
def test_scope_works_correct
|
6
|
+
serializer = ActiveModel::Serializer.new :foo, :scope => :bar
|
7
|
+
assert_equal serializer.scope, :bar
|
46
8
|
end
|
47
9
|
|
48
|
-
|
49
|
-
|
50
|
-
|
10
|
+
def test_attributes
|
11
|
+
user = User.new
|
12
|
+
user_serializer = DefaultUserSerializer.new(user, {})
|
51
13
|
|
52
|
-
|
53
|
-
attributes :first_name, :last_name
|
14
|
+
hash = user_serializer.as_json
|
54
15
|
|
55
|
-
|
56
|
-
|
57
|
-
|
16
|
+
assert_equal({
|
17
|
+
:default_user => { :first_name => "Jose", :last_name => "Valim" }
|
18
|
+
}, hash)
|
58
19
|
end
|
59
20
|
|
60
|
-
|
61
|
-
|
62
|
-
|
21
|
+
def test_attributes_method
|
22
|
+
user = User.new
|
23
|
+
user_serializer = UserSerializer.new(user, :scope => {})
|
63
24
|
|
64
|
-
|
65
|
-
attributes :first_name, :last_name
|
25
|
+
hash = user_serializer.as_json
|
66
26
|
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
hash
|
71
|
-
end
|
27
|
+
assert_equal({
|
28
|
+
:user => { :first_name => "Jose", :last_name => "Valim", :ok => true }
|
29
|
+
}, hash)
|
72
30
|
end
|
73
31
|
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
end
|
78
|
-
|
79
|
-
def serializable_hash
|
80
|
-
{ :title => @comment.read_attribute_for_serialization(:title) }
|
81
|
-
end
|
32
|
+
def test_attributes_method_specifying_keys
|
33
|
+
user = User.new
|
34
|
+
user_serializer = UserAttributesWithKeySerializer.new(user, :scope => {})
|
82
35
|
|
83
|
-
|
84
|
-
options ||= {}
|
85
|
-
if options[:root] == false
|
86
|
-
serializable_hash
|
87
|
-
else
|
88
|
-
{ :comment => serializable_hash }
|
89
|
-
end
|
90
|
-
end
|
91
|
-
end
|
36
|
+
hash = user_serializer.as_json
|
92
37
|
|
93
|
-
|
94
|
-
|
95
|
-
|
38
|
+
assert_equal({
|
39
|
+
:user_attributes_with_key => { :f_name => "Jose", :l_name => "Valim", :ok => true }
|
40
|
+
}, hash)
|
96
41
|
end
|
97
42
|
|
98
|
-
def
|
43
|
+
def test_attributes_method_specifying_some_keys
|
99
44
|
user = User.new
|
100
|
-
user_serializer =
|
45
|
+
user_serializer = UserAttributesWithSomeKeySerializer.new(user, :scope => {})
|
101
46
|
|
102
47
|
hash = user_serializer.as_json
|
103
48
|
|
104
49
|
assert_equal({
|
105
|
-
:
|
50
|
+
:user_attributes_with_some_key => { :first_name => "Jose", :l_name => "Valim", :ok => true }
|
106
51
|
}, hash)
|
107
52
|
end
|
108
53
|
|
109
|
-
def
|
110
|
-
|
111
|
-
|
54
|
+
def test_attribute_method_with_name_as_serializer_prefix
|
55
|
+
object = SomeObject.new("something")
|
56
|
+
object_serializer = SomeSerializer.new(object, {})
|
112
57
|
|
113
|
-
hash =
|
58
|
+
hash = object_serializer.as_json
|
114
59
|
|
115
60
|
assert_equal({
|
116
|
-
:
|
61
|
+
:some => { :some => "something" }
|
117
62
|
}, hash)
|
118
63
|
end
|
119
64
|
|
@@ -159,11 +104,6 @@ class SerializerTest < ActiveModel::TestCase
|
|
159
104
|
}, hash)
|
160
105
|
end
|
161
106
|
|
162
|
-
class PostSerializer < ActiveModel::Serializer
|
163
|
-
attributes :title, :body
|
164
|
-
has_many :comments, :serializer => CommentSerializer
|
165
|
-
end
|
166
|
-
|
167
107
|
def test_has_many
|
168
108
|
user = User.new
|
169
109
|
|
@@ -185,16 +125,6 @@ class SerializerTest < ActiveModel::TestCase
|
|
185
125
|
}, post_serializer.as_json)
|
186
126
|
end
|
187
127
|
|
188
|
-
class PostWithConditionalCommentsSerializer < ActiveModel::Serializer
|
189
|
-
root :post
|
190
|
-
attributes :title, :body
|
191
|
-
has_many :comments, :serializer => CommentSerializer
|
192
|
-
|
193
|
-
def include_associations!
|
194
|
-
include! :comments unless object.comments_disabled
|
195
|
-
end
|
196
|
-
end
|
197
|
-
|
198
128
|
def test_conditionally_included_associations
|
199
129
|
user = User.new
|
200
130
|
|
@@ -227,20 +157,6 @@ class SerializerTest < ActiveModel::TestCase
|
|
227
157
|
}, post_serializer.as_json)
|
228
158
|
end
|
229
159
|
|
230
|
-
class PostWithMultipleConditionalsSerializer < ActiveModel::Serializer
|
231
|
-
root :post
|
232
|
-
attributes :title, :body, :author
|
233
|
-
has_many :comments, :serializer => CommentSerializer
|
234
|
-
|
235
|
-
def include_comments?
|
236
|
-
!object.comments_disabled
|
237
|
-
end
|
238
|
-
|
239
|
-
def include_author?
|
240
|
-
scope.super_user?
|
241
|
-
end
|
242
|
-
end
|
243
|
-
|
244
160
|
def test_conditionally_included_associations_and_attributes
|
245
161
|
user = User.new
|
246
162
|
|
@@ -283,18 +199,6 @@ class SerializerTest < ActiveModel::TestCase
|
|
283
199
|
}, post_serializer.as_json)
|
284
200
|
end
|
285
201
|
|
286
|
-
class Blog < Model
|
287
|
-
attr_accessor :author
|
288
|
-
end
|
289
|
-
|
290
|
-
class AuthorSerializer < ActiveModel::Serializer
|
291
|
-
attributes :first_name, :last_name
|
292
|
-
end
|
293
|
-
|
294
|
-
class BlogSerializer < ActiveModel::Serializer
|
295
|
-
has_one :author, :serializer => AuthorSerializer
|
296
|
-
end
|
297
|
-
|
298
202
|
def test_has_one
|
299
203
|
user = User.new
|
300
204
|
blog = Blog.new
|
@@ -372,6 +276,28 @@ class SerializerTest < ActiveModel::TestCase
|
|
372
276
|
assert_equal({ :my_blog => { :author => nil } }, serializer.new(blog, :scope => user).as_json)
|
373
277
|
end
|
374
278
|
|
279
|
+
def test_nil_root_object
|
280
|
+
user = User.new
|
281
|
+
blog = nil
|
282
|
+
|
283
|
+
serializer = Class.new(BlogSerializer) do
|
284
|
+
root false
|
285
|
+
end
|
286
|
+
|
287
|
+
assert_equal(nil, serializer.new(blog, :scope => user).as_json)
|
288
|
+
end
|
289
|
+
|
290
|
+
def test_custom_root_with_nil_root_object
|
291
|
+
user = User.new
|
292
|
+
blog = nil
|
293
|
+
|
294
|
+
serializer = Class.new(BlogSerializer) do
|
295
|
+
root :my_blog
|
296
|
+
end
|
297
|
+
|
298
|
+
assert_equal({ :my_blog => nil }, serializer.new(blog, :scope => user).as_json)
|
299
|
+
end
|
300
|
+
|
375
301
|
def test_false_root
|
376
302
|
user = User.new
|
377
303
|
blog = Blog.new
|
@@ -380,13 +306,35 @@ class SerializerTest < ActiveModel::TestCase
|
|
380
306
|
root false
|
381
307
|
end
|
382
308
|
|
309
|
+
another_serializer = Class.new(BlogSerializer) do
|
310
|
+
self.root = false
|
311
|
+
end
|
312
|
+
|
383
313
|
assert_equal({ :author => nil }, serializer.new(blog, :scope => user).as_json)
|
314
|
+
assert_equal({ :author => nil }, another_serializer.new(blog, :scope => user).as_json)
|
384
315
|
|
385
316
|
# test inherited false root
|
386
317
|
serializer = Class.new(serializer)
|
387
318
|
assert_equal({ :author => nil }, serializer.new(blog, :scope => user).as_json)
|
388
319
|
end
|
389
320
|
|
321
|
+
def test_root_false_on_load_active_model_serializers
|
322
|
+
begin
|
323
|
+
ActiveSupport.on_load(:active_model_serializers) do
|
324
|
+
self.root = false
|
325
|
+
end
|
326
|
+
|
327
|
+
blog = Blog.new
|
328
|
+
serializer = BlogSerializer.new(blog)
|
329
|
+
|
330
|
+
assert_equal({ :author => nil }, serializer.as_json)
|
331
|
+
ensure
|
332
|
+
ActiveSupport.on_load(:active_model_serializers) do
|
333
|
+
self.root = nil
|
334
|
+
end
|
335
|
+
end
|
336
|
+
end
|
337
|
+
|
390
338
|
def test_embed_ids
|
391
339
|
serializer = post_serializer
|
392
340
|
|
@@ -405,8 +353,8 @@ class SerializerTest < ActiveModel::TestCase
|
|
405
353
|
:post => {
|
406
354
|
:title => "New Post",
|
407
355
|
:body => "Body of new post",
|
408
|
-
:
|
409
|
-
:
|
356
|
+
:comment_ids => [1, 2],
|
357
|
+
:author_id => nil
|
410
358
|
}
|
411
359
|
}, serializer.as_json)
|
412
360
|
end
|
@@ -429,8 +377,8 @@ class SerializerTest < ActiveModel::TestCase
|
|
429
377
|
:post => {
|
430
378
|
:title => "New Post",
|
431
379
|
:body => "Body of new post",
|
432
|
-
:
|
433
|
-
:
|
380
|
+
:comment_ids => [1, 2],
|
381
|
+
:author_id => nil
|
434
382
|
},
|
435
383
|
:comments => [
|
436
384
|
{ :title => "Comment1" },
|
@@ -447,8 +395,8 @@ class SerializerTest < ActiveModel::TestCase
|
|
447
395
|
:post => {
|
448
396
|
:title => "New Post",
|
449
397
|
:body => "Body of new post",
|
450
|
-
:
|
451
|
-
:
|
398
|
+
:comment_ids => [1, 2],
|
399
|
+
:author_id => 1
|
452
400
|
},
|
453
401
|
:comments => [
|
454
402
|
{ :title => "Comment1" },
|
@@ -485,60 +433,6 @@ class SerializerTest < ActiveModel::TestCase
|
|
485
433
|
}, serializer.as_json)
|
486
434
|
end
|
487
435
|
|
488
|
-
# serialize different typed objects
|
489
|
-
def test_array_serializer
|
490
|
-
model = Model.new
|
491
|
-
user = User.new
|
492
|
-
comments = Comment.new(:title => "Comment1", :id => 1)
|
493
|
-
|
494
|
-
array = [model, user, comments]
|
495
|
-
serializer = array.active_model_serializer.new(array, :scope => {:scope => true})
|
496
|
-
assert_equal([
|
497
|
-
{ :model => "Model" },
|
498
|
-
{ :last_name => "Valim", :ok => true, :first_name => "Jose", :scope => true },
|
499
|
-
{ :title => "Comment1" }
|
500
|
-
], serializer.as_json)
|
501
|
-
end
|
502
|
-
|
503
|
-
def test_array_serializer_with_root
|
504
|
-
comment1 = Comment.new(:title => "Comment1", :id => 1)
|
505
|
-
comment2 = Comment.new(:title => "Comment2", :id => 2)
|
506
|
-
|
507
|
-
array = [ comment1, comment2 ]
|
508
|
-
|
509
|
-
serializer = array.active_model_serializer.new(array, :root => :comments)
|
510
|
-
|
511
|
-
assert_equal({ :comments => [
|
512
|
-
{ :title => "Comment1" },
|
513
|
-
{ :title => "Comment2" }
|
514
|
-
]}, serializer.as_json)
|
515
|
-
end
|
516
|
-
|
517
|
-
def test_array_serializer_with_hash
|
518
|
-
hash = {:value => "something"}
|
519
|
-
array = [hash]
|
520
|
-
serializer = array.active_model_serializer.new(array, :root => :items)
|
521
|
-
assert_equal({ :items => [ hash.as_json ]}, serializer.as_json)
|
522
|
-
end
|
523
|
-
|
524
|
-
class CustomPostSerializer < ActiveModel::Serializer
|
525
|
-
attributes :title
|
526
|
-
end
|
527
|
-
|
528
|
-
def test_array_serializer_with_specified_seriailizer
|
529
|
-
post1 = Post.new(:title => "Post1", :author => "Author1", :id => 1)
|
530
|
-
post2 = Post.new(:title => "Post2", :author => "Author2", :id => 2)
|
531
|
-
|
532
|
-
array = [ post1, post2 ]
|
533
|
-
|
534
|
-
serializer = array.active_model_serializer.new array, :each_serializer => CustomPostSerializer
|
535
|
-
|
536
|
-
assert_equal([
|
537
|
-
{ :title => "Post1" },
|
538
|
-
{ :title => "Post2" }
|
539
|
-
], serializer.as_json)
|
540
|
-
end
|
541
|
-
|
542
436
|
def test_sets_can_be_serialized
|
543
437
|
post1 = Post.new(:title => "Post1", :author => "Author1", :id => 1)
|
544
438
|
post2 = Post.new(:title => "Post2", :author => "Author2", :id => 2)
|
@@ -555,18 +449,9 @@ class SerializerTest < ActiveModel::TestCase
|
|
555
449
|
assert as_json.include?({ :title => "Post2" })
|
556
450
|
end
|
557
451
|
|
558
|
-
class CustomBlog < Blog
|
559
|
-
attr_accessor :public_posts, :public_user
|
560
|
-
end
|
561
|
-
|
562
|
-
class CustomBlogSerializer < ActiveModel::Serializer
|
563
|
-
has_many :public_posts, :key => :posts, :serializer => PostSerializer
|
564
|
-
has_one :public_user, :key => :user, :serializer => UserSerializer
|
565
|
-
end
|
566
|
-
|
567
452
|
def test_associations_with_as
|
568
453
|
posts = [
|
569
|
-
Post.new(:title => 'First Post', :body => 'text'),
|
454
|
+
Post.new(:title => 'First Post', :body => 'text'),
|
570
455
|
Post.new(:title => 'Second Post', :body => 'text')
|
571
456
|
]
|
572
457
|
user = User.new
|
@@ -584,15 +469,15 @@ class SerializerTest < ActiveModel::TestCase
|
|
584
469
|
{:title => 'Second Post', :body => 'text', :comments => []}
|
585
470
|
],
|
586
471
|
:user => {
|
587
|
-
:first_name => "Jose",
|
588
|
-
:last_name => "Valim", :ok => true,
|
472
|
+
:first_name => "Jose",
|
473
|
+
:last_name => "Valim", :ok => true,
|
589
474
|
:scope => true
|
590
475
|
}
|
591
476
|
}
|
592
477
|
}, serializer.as_json)
|
593
478
|
end
|
594
479
|
|
595
|
-
def test_implicity_detection_for_association_serializers
|
480
|
+
def test_implicity_detection_for_association_serializers
|
596
481
|
implicit_serializer = Class.new(ActiveModel::Serializer) do
|
597
482
|
root :custom_blog
|
598
483
|
const_set(:UserSerializer, UserSerializer)
|
@@ -603,7 +488,7 @@ class SerializerTest < ActiveModel::TestCase
|
|
603
488
|
end
|
604
489
|
|
605
490
|
posts = [
|
606
|
-
Post.new(:title => 'First Post', :body => 'text', :comments => []),
|
491
|
+
Post.new(:title => 'First Post', :body => 'text', :comments => []),
|
607
492
|
Post.new(:title => 'Second Post', :body => 'text', :comments => [])
|
608
493
|
]
|
609
494
|
user = User.new
|
@@ -621,8 +506,8 @@ class SerializerTest < ActiveModel::TestCase
|
|
621
506
|
{:title => 'Second Post', :body => 'text', :comments => []}
|
622
507
|
],
|
623
508
|
:user => {
|
624
|
-
:first_name => "Jose",
|
625
|
-
:last_name => "Valim", :ok => true,
|
509
|
+
:first_name => "Jose",
|
510
|
+
:last_name => "Valim", :ok => true,
|
626
511
|
:scope => true
|
627
512
|
}
|
628
513
|
}
|
@@ -676,15 +561,21 @@ class SerializerTest < ActiveModel::TestCase
|
|
676
561
|
define_method(:model_class) do model end
|
677
562
|
end
|
678
563
|
|
679
|
-
attributes
|
564
|
+
# Computed attributes (not real columns or associations).
|
565
|
+
def can_edit; end
|
566
|
+
def drafts; end
|
567
|
+
|
568
|
+
attributes :name, :age, :can_edit
|
680
569
|
has_many :posts, :serializer => Class.new
|
570
|
+
has_many :drafts, :serializer => Class.new
|
681
571
|
has_one :parent, :serializer => Class.new
|
682
572
|
end
|
683
573
|
|
684
574
|
assert_equal serializer.schema, {
|
685
|
-
:attributes => { :name => :string, :age => :integer },
|
575
|
+
:attributes => { :name => :string, :age => :integer, :can_edit => nil },
|
686
576
|
:associations => {
|
687
577
|
:posts => { :has_many => :posts },
|
578
|
+
:drafts => nil,
|
688
579
|
:parent => { :belongs_to => :parent }
|
689
580
|
}
|
690
581
|
}
|
@@ -739,7 +630,7 @@ class SerializerTest < ActiveModel::TestCase
|
|
739
630
|
:post => {
|
740
631
|
:title => "New Post",
|
741
632
|
:body => "It's a new post!",
|
742
|
-
:
|
633
|
+
:author_id => 5
|
743
634
|
}
|
744
635
|
}, hash.as_json)
|
745
636
|
end
|
@@ -860,7 +751,7 @@ class SerializerTest < ActiveModel::TestCase
|
|
860
751
|
expected = serializer_class.new(post).as_json
|
861
752
|
assert_equal expected, hash_object
|
862
753
|
end
|
863
|
-
|
754
|
+
|
864
755
|
def test_embed_ids_include_true_with_root
|
865
756
|
serializer_class = post_serializer
|
866
757
|
|
@@ -909,7 +800,7 @@ class SerializerTest < ActiveModel::TestCase
|
|
909
800
|
:author => [{ :first_name => "Jose", :last_name => "Valim" }]
|
910
801
|
}, serializer.as_json)
|
911
802
|
end
|
912
|
-
|
803
|
+
|
913
804
|
# the point of this test is to illustrate that deeply nested serializers
|
914
805
|
# still side-load at the root.
|
915
806
|
def test_embed_with_include_inserts_at_root
|
@@ -957,12 +848,12 @@ class SerializerTest < ActiveModel::TestCase
|
|
957
848
|
actual = ActiveModel::ArraySerializer.new([post], :root => :posts).as_json
|
958
849
|
assert_equal({
|
959
850
|
:posts => [
|
960
|
-
{ :title => "New Post", :body => "NEW POST", :id => 1, :
|
851
|
+
{ :title => "New Post", :body => "NEW POST", :id => 1, :comment_ids => [1,2] }
|
961
852
|
],
|
962
853
|
|
963
854
|
:comments => [
|
964
|
-
{ :body => "EWOT", :id => 1, :
|
965
|
-
{ :body => "YARLY", :id => 2, :
|
855
|
+
{ :body => "EWOT", :id => 1, :tag_ids => [1,3] },
|
856
|
+
{ :body => "YARLY", :id => 2, :tag_ids => [1,2] }
|
966
857
|
],
|
967
858
|
|
968
859
|
:tags => [
|
@@ -1079,21 +970,6 @@ class SerializerTest < ActiveModel::TestCase
|
|
1079
970
|
}, actual)
|
1080
971
|
end
|
1081
972
|
|
1082
|
-
# Set up some classes for polymorphic testing
|
1083
|
-
class Attachment < Model
|
1084
|
-
def attachable
|
1085
|
-
@attributes[:attachable]
|
1086
|
-
end
|
1087
|
-
|
1088
|
-
def readable
|
1089
|
-
@attributes[:readable]
|
1090
|
-
end
|
1091
|
-
|
1092
|
-
def edible
|
1093
|
-
@attributes[:edible]
|
1094
|
-
end
|
1095
|
-
end
|
1096
|
-
|
1097
973
|
def tests_can_handle_polymorphism
|
1098
974
|
email_serializer = Class.new(ActiveModel::Serializer) do
|
1099
975
|
attributes :subject, :body
|
@@ -1121,7 +997,7 @@ class SerializerTest < ActiveModel::TestCase
|
|
1121
997
|
actual = attachment_serializer.new(attachment, {}).as_json
|
1122
998
|
|
1123
999
|
assert_equal({
|
1124
|
-
:name => 'logo.png',
|
1000
|
+
:name => 'logo.png',
|
1125
1001
|
:url => 'http://example.com/logo.png',
|
1126
1002
|
:attachable => {
|
1127
1003
|
:type => :email,
|
@@ -1158,7 +1034,7 @@ class SerializerTest < ActiveModel::TestCase
|
|
1158
1034
|
actual = attachment_serializer.new(attachment, {}).as_json
|
1159
1035
|
|
1160
1036
|
assert_equal({
|
1161
|
-
:name => 'logo.png',
|
1037
|
+
:name => 'logo.png',
|
1162
1038
|
:url => 'http://example.com/logo.png',
|
1163
1039
|
:attachable => {
|
1164
1040
|
:type => :email,
|
@@ -1197,7 +1073,7 @@ class SerializerTest < ActiveModel::TestCase
|
|
1197
1073
|
|
1198
1074
|
assert_equal({
|
1199
1075
|
:attachment => {
|
1200
|
-
:name => 'logo.png',
|
1076
|
+
:name => 'logo.png',
|
1201
1077
|
:url => 'http://example.com/logo.png',
|
1202
1078
|
:attachable => {
|
1203
1079
|
:type => :email,
|
@@ -1388,4 +1264,50 @@ class SerializerTest < ActiveModel::TestCase
|
|
1388
1264
|
}
|
1389
1265
|
}, actual)
|
1390
1266
|
end
|
1267
|
+
|
1268
|
+
def test_meta_key_serialization
|
1269
|
+
tag_serializer = Class.new(ActiveModel::Serializer) do
|
1270
|
+
attributes :name
|
1271
|
+
end
|
1272
|
+
|
1273
|
+
tag_class = Class.new(Model) do
|
1274
|
+
def name
|
1275
|
+
@attributes[:name]
|
1276
|
+
end
|
1277
|
+
|
1278
|
+
define_method :active_model_serializer do
|
1279
|
+
tag_serializer
|
1280
|
+
end
|
1281
|
+
end
|
1282
|
+
|
1283
|
+
serializable_array = Class.new(Array)
|
1284
|
+
|
1285
|
+
array = serializable_array.new
|
1286
|
+
array << tag_class.new(:name => 'Rails')
|
1287
|
+
array << tag_class.new(:name => 'Sinatra')
|
1288
|
+
|
1289
|
+
actual = array.active_model_serializer.new(array, :root => :tags, :meta => {:total => 10}).as_json
|
1290
|
+
|
1291
|
+
assert_equal({
|
1292
|
+
:meta => {
|
1293
|
+
:total => 10,
|
1294
|
+
},
|
1295
|
+
:tags => [
|
1296
|
+
{ :name => "Rails" },
|
1297
|
+
{ :name => "Sinatra" },
|
1298
|
+
]
|
1299
|
+
}, actual)
|
1300
|
+
|
1301
|
+
actual = array.active_model_serializer.new(array, :root => :tags, :meta => {:total => 10}, :meta_key => 'meta_object').as_json
|
1302
|
+
|
1303
|
+
assert_equal({
|
1304
|
+
:meta_object => {
|
1305
|
+
:total => 10,
|
1306
|
+
},
|
1307
|
+
:tags => [
|
1308
|
+
{ :name => "Rails" },
|
1309
|
+
{ :name => "Sinatra" },
|
1310
|
+
]
|
1311
|
+
}, actual)
|
1312
|
+
end
|
1391
1313
|
end
|