active_model_serializers 0.10.0 → 0.10.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (146) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +2 -4
  3. data/.travis.yml +9 -1
  4. data/CHANGELOG.md +81 -2
  5. data/CODE_OF_CONDUCT.md +74 -0
  6. data/Gemfile +5 -2
  7. data/README.md +24 -24
  8. data/Rakefile +3 -3
  9. data/active_model_serializers.gemspec +20 -24
  10. data/docs/ARCHITECTURE.md +6 -7
  11. data/docs/README.md +2 -0
  12. data/docs/general/adapters.md +4 -2
  13. data/docs/general/caching.md +7 -1
  14. data/docs/general/configuration_options.md +70 -1
  15. data/docs/general/deserialization.md +1 -1
  16. data/docs/general/fields.md +31 -0
  17. data/docs/general/rendering.md +42 -3
  18. data/docs/general/serializers.md +97 -8
  19. data/docs/howto/add_pagination_links.md +4 -5
  20. data/docs/howto/add_relationship_links.md +137 -0
  21. data/docs/howto/add_root_key.md +4 -0
  22. data/docs/howto/grape_integration.md +42 -0
  23. data/docs/howto/outside_controller_use.md +9 -2
  24. data/docs/howto/passing_arbitrary_options.md +2 -2
  25. data/docs/howto/test.md +2 -0
  26. data/docs/howto/upgrade_from_0_8_to_0_10.md +265 -0
  27. data/docs/integrations/ember-and-json-api.md +64 -32
  28. data/docs/jsonapi/schema.md +1 -1
  29. data/lib/action_controller/serialization.rb +13 -3
  30. data/lib/active_model/serializer/adapter/base.rb +2 -0
  31. data/lib/active_model/serializer/array_serializer.rb +8 -5
  32. data/lib/active_model/serializer/association.rb +19 -4
  33. data/lib/active_model/serializer/belongs_to_reflection.rb +0 -3
  34. data/lib/active_model/serializer/collection_serializer.rb +35 -12
  35. data/lib/active_model/serializer/{associations.rb → concerns/associations.rb} +13 -11
  36. data/lib/active_model/serializer/{attributes.rb → concerns/attributes.rb} +0 -0
  37. data/lib/active_model/serializer/{caching.rb → concerns/caching.rb} +72 -113
  38. data/lib/active_model/serializer/{configuration.rb → concerns/configuration.rb} +25 -1
  39. data/lib/active_model/serializer/{links.rb → concerns/links.rb} +0 -0
  40. data/lib/active_model/serializer/{meta.rb → concerns/meta.rb} +0 -0
  41. data/lib/active_model/serializer/{type.rb → concerns/type.rb} +0 -0
  42. data/lib/active_model/serializer/error_serializer.rb +11 -7
  43. data/lib/active_model/serializer/errors_serializer.rb +25 -20
  44. data/lib/active_model/serializer/has_many_reflection.rb +0 -3
  45. data/lib/active_model/serializer/has_one_reflection.rb +0 -3
  46. data/lib/active_model/serializer/lint.rb +134 -130
  47. data/lib/active_model/serializer/reflection.rb +37 -21
  48. data/lib/active_model/serializer/version.rb +1 -1
  49. data/lib/active_model/serializer.rb +76 -37
  50. data/lib/active_model_serializers/adapter/attributes.rb +3 -66
  51. data/lib/active_model_serializers/adapter/base.rb +38 -38
  52. data/lib/active_model_serializers/adapter/json_api/link.rb +1 -1
  53. data/lib/active_model_serializers/adapter/json_api/pagination_links.rb +8 -1
  54. data/lib/active_model_serializers/adapter/json_api/relationship.rb +30 -19
  55. data/lib/active_model_serializers/adapter/json_api/resource_identifier.rb +23 -9
  56. data/lib/active_model_serializers/adapter/json_api.rb +44 -43
  57. data/lib/active_model_serializers/adapter.rb +6 -0
  58. data/lib/active_model_serializers/deprecate.rb +1 -2
  59. data/lib/active_model_serializers/deserialization.rb +2 -0
  60. data/lib/active_model_serializers/key_transform.rb +4 -0
  61. data/lib/active_model_serializers/lookup_chain.rb +80 -0
  62. data/lib/active_model_serializers/model.rb +4 -2
  63. data/lib/active_model_serializers/railtie.rb +3 -1
  64. data/lib/active_model_serializers/register_jsonapi_renderer.rb +44 -31
  65. data/lib/active_model_serializers/serializable_resource.rb +6 -5
  66. data/lib/active_model_serializers/serialization_context.rb +10 -3
  67. data/lib/active_model_serializers.rb +7 -0
  68. data/lib/generators/rails/serializer_generator.rb +4 -4
  69. data/lib/grape/active_model_serializers.rb +7 -5
  70. data/lib/grape/formatters/active_model_serializers.rb +19 -2
  71. data/lib/grape/helpers/active_model_serializers.rb +1 -0
  72. data/test/action_controller/adapter_selector_test.rb +4 -4
  73. data/test/action_controller/explicit_serializer_test.rb +5 -4
  74. data/test/action_controller/json/include_test.rb +106 -27
  75. data/test/action_controller/json_api/errors_test.rb +6 -7
  76. data/test/action_controller/json_api/fields_test.rb +57 -0
  77. data/test/action_controller/json_api/linked_test.rb +29 -24
  78. data/test/action_controller/json_api/pagination_test.rb +19 -19
  79. data/test/action_controller/json_api/transform_test.rb +3 -3
  80. data/test/action_controller/lookup_proc_test.rb +49 -0
  81. data/test/action_controller/namespace_lookup_test.rb +226 -0
  82. data/test/action_controller/serialization_test.rb +10 -7
  83. data/test/active_model_serializers/json_pointer_test.rb +15 -13
  84. data/test/active_model_serializers/key_transform_test.rb +286 -252
  85. data/test/active_model_serializers/model_test.rb +17 -4
  86. data/test/active_model_serializers/register_jsonapi_renderer_test_isolated.rb +143 -0
  87. data/test/active_model_serializers/serialization_context_test_isolated.rb +23 -10
  88. data/test/adapter/attributes_test.rb +43 -0
  89. data/test/adapter/json/collection_test.rb +14 -0
  90. data/test/adapter/json/transform_test.rb +15 -15
  91. data/test/adapter/json_api/collection_test.rb +4 -3
  92. data/test/adapter/json_api/errors_test.rb +17 -19
  93. data/test/adapter/json_api/fields_test.rb +4 -3
  94. data/test/adapter/json_api/has_many_test.rb +39 -18
  95. data/test/adapter/json_api/include_data_if_sideloaded_test.rb +166 -0
  96. data/test/adapter/json_api/json_api_test.rb +5 -7
  97. data/test/adapter/json_api/linked_test.rb +33 -12
  98. data/test/adapter/json_api/links_test.rb +4 -2
  99. data/test/adapter/json_api/pagination_links_test.rb +35 -8
  100. data/test/adapter/json_api/relationship_test.rb +309 -73
  101. data/test/adapter/json_api/resource_identifier_test.rb +27 -2
  102. data/test/adapter/json_api/resource_meta_test.rb +3 -3
  103. data/test/adapter/json_api/transform_test.rb +255 -253
  104. data/test/adapter/json_api/type_test.rb +1 -1
  105. data/test/adapter/json_test.rb +8 -7
  106. data/test/adapter/null_test.rb +1 -2
  107. data/test/adapter/polymorphic_test.rb +5 -5
  108. data/test/adapter_test.rb +1 -1
  109. data/test/benchmark/app.rb +1 -1
  110. data/test/benchmark/benchmarking_support.rb +1 -1
  111. data/test/benchmark/bm_active_record.rb +81 -0
  112. data/test/benchmark/bm_adapter.rb +38 -0
  113. data/test/benchmark/bm_caching.rb +16 -16
  114. data/test/benchmark/bm_lookup_chain.rb +83 -0
  115. data/test/benchmark/bm_transform.rb +16 -5
  116. data/test/benchmark/controllers.rb +16 -17
  117. data/test/benchmark/fixtures.rb +72 -72
  118. data/test/cache_test.rb +143 -49
  119. data/test/collection_serializer_test.rb +3 -3
  120. data/test/fixtures/poro.rb +52 -48
  121. data/test/generators/serializer_generator_test.rb +22 -5
  122. data/test/grape_test.rb +152 -56
  123. data/test/lint_test.rb +1 -1
  124. data/test/logger_test.rb +13 -11
  125. data/test/serializable_resource_test.rb +18 -22
  126. data/test/serializers/association_macros_test.rb +3 -2
  127. data/test/serializers/associations_test.rb +107 -32
  128. data/test/serializers/attribute_test.rb +2 -2
  129. data/test/serializers/attributes_test.rb +1 -1
  130. data/test/serializers/fieldset_test.rb +1 -1
  131. data/test/serializers/meta_test.rb +12 -6
  132. data/test/serializers/root_test.rb +1 -1
  133. data/test/serializers/serializer_for_test.rb +6 -4
  134. data/test/serializers/serializer_for_with_namespace_test.rb +87 -0
  135. data/test/support/isolated_unit.rb +5 -2
  136. data/test/support/rails5_shims.rb +8 -2
  137. data/test/support/rails_app.rb +0 -9
  138. data/test/support/serialization_testing.rb +23 -5
  139. data/test/test_helper.rb +1 -0
  140. metadata +85 -34
  141. data/.rubocop_todo.yml +0 -167
  142. data/lib/active_model/serializer/include_tree.rb +0 -111
  143. data/test/adapter/json_api/relationships_test.rb +0 -199
  144. data/test/include_tree/from_include_args_test.rb +0 -26
  145. data/test/include_tree/from_string_test.rb +0 -94
  146. data/test/include_tree/include_args_to_hash_test.rb +0 -64
@@ -1,5 +1,4 @@
1
1
  require 'test_helper'
2
-
3
2
  module ActiveModel
4
3
  class Serializer
5
4
  class AssociationsTest < ActiveSupport::TestCase
@@ -7,10 +6,10 @@ module ActiveModel
7
6
  @author = Author.new(name: 'Steve K.')
8
7
  @author.bio = nil
9
8
  @author.roles = []
10
- @blog = Blog.new({ name: 'AMS Blog' })
11
- @post = Post.new({ title: 'New Post', body: 'Body' })
12
- @tag = Tag.new({ name: '#hashtagged' })
13
- @comment = Comment.new({ id: 1, body: 'ZOMG A COMMENT' })
9
+ @blog = Blog.new(name: 'AMS Blog')
10
+ @post = Post.new(title: 'New Post', body: 'Body')
11
+ @tag = Tag.new(name: '#hashtagged')
12
+ @comment = Comment.new(id: 1, body: 'ZOMG A COMMENT')
14
13
  @post.comments = [@comment]
15
14
  @post.tags = [@tag]
16
15
  @post.blog = @blog
@@ -19,7 +18,7 @@ module ActiveModel
19
18
  @post.author = @author
20
19
  @author.posts = [@post]
21
20
 
22
- @post_serializer = PostSerializer.new(@post, { custom_options: true })
21
+ @post_serializer = PostSerializer.new(@post, custom_options: true)
23
22
  @author_serializer = AuthorSerializer.new(@author)
24
23
  @comment_serializer = CommentSerializer.new(@comment)
25
24
  end
@@ -32,13 +31,13 @@ module ActiveModel
32
31
 
33
32
  case key
34
33
  when :posts
35
- assert_equal({ include_data: true }, options)
34
+ assert_equal true, options.fetch(:include_data)
36
35
  assert_kind_of(ActiveModelSerializers.config.collection_serializer, serializer)
37
36
  when :bio
38
- assert_equal({ include_data: true }, options)
37
+ assert_equal true, options.fetch(:include_data)
39
38
  assert_nil serializer
40
39
  when :roles
41
- assert_equal({ include_data: true }, options)
40
+ assert_equal true, options.fetch(:include_data)
42
41
  assert_kind_of(ActiveModelSerializers.config.collection_serializer, serializer)
43
42
  else
44
43
  flunk "Unknown association: #{key}"
@@ -80,7 +79,7 @@ module ActiveModel
80
79
  flunk "Unknown association: #{key}"
81
80
  end
82
81
 
83
- assert_equal({ include_data: true }, association.options)
82
+ assert_equal true, association.options.fetch(:include_data)
84
83
  end
85
84
  end
86
85
 
@@ -104,13 +103,13 @@ module ActiveModel
104
103
  end
105
104
 
106
105
  assert(
107
- PostSerializer._reflections.all? do |reflection|
108
- inherited_klass._reflections.include?(reflection)
106
+ PostSerializer._reflections.values.all? do |reflection|
107
+ inherited_klass._reflections.values.include?(reflection)
109
108
  end
110
109
  )
111
110
 
112
111
  assert(
113
- inherited_klass._reflections.any? do |reflection|
112
+ inherited_klass._reflections.values.any? do |reflection|
114
113
  reflection.name == :top_comments
115
114
  end
116
115
  )
@@ -143,12 +142,12 @@ module ActiveModel
143
142
  )
144
143
  actual = serializable(post, adapter: :attributes, serializer: InlineAssociationTestPostSerializer).as_json
145
144
  expected = {
146
- :comments => [
147
- { :id => 1, :contents => 'first comment' },
148
- { :id => 2, :contents => 'last comment' }
145
+ comments: [
146
+ { id: 1, contents: 'first comment' },
147
+ { id: 2, contents: 'last comment' }
149
148
  ],
150
- :last_comments => [
151
- { :id => 2, :contents => 'last comment' }
149
+ last_comments: [
150
+ { id: 2, contents: 'last comment' }
152
151
  ]
153
152
  }
154
153
 
@@ -160,18 +159,18 @@ module ActiveModel
160
159
 
161
160
  class NamespacedResourcesTest < ActiveSupport::TestCase
162
161
  class ResourceNamespace
163
- Post = Class.new(::Model)
164
- Comment = Class.new(::Model)
165
- Author = Class.new(::Model)
166
- Description = Class.new(::Model)
162
+ class Post < ::Model; end
163
+ class Comment < ::Model; end
164
+ class Author < ::Model; end
165
+ class Description < ::Model; end
167
166
  class PostSerializer < ActiveModel::Serializer
168
167
  has_many :comments
169
168
  belongs_to :author
170
169
  has_one :description
171
170
  end
172
- CommentSerializer = Class.new(ActiveModel::Serializer)
173
- AuthorSerializer = Class.new(ActiveModel::Serializer)
174
- DescriptionSerializer = Class.new(ActiveModel::Serializer)
171
+ class CommentSerializer < ActiveModel::Serializer; end
172
+ class AuthorSerializer < ActiveModel::Serializer; end
173
+ class DescriptionSerializer < ActiveModel::Serializer; end
175
174
  end
176
175
 
177
176
  def setup
@@ -201,17 +200,17 @@ module ActiveModel
201
200
  end
202
201
 
203
202
  class NestedSerializersTest < ActiveSupport::TestCase
204
- Post = Class.new(::Model)
205
- Comment = Class.new(::Model)
206
- Author = Class.new(::Model)
207
- Description = Class.new(::Model)
203
+ class Post < ::Model; end
204
+ class Comment < ::Model; end
205
+ class Author < ::Model; end
206
+ class Description < ::Model; end
208
207
  class PostSerializer < ActiveModel::Serializer
209
208
  has_many :comments
210
- CommentSerializer = Class.new(ActiveModel::Serializer)
209
+ class CommentSerializer < ActiveModel::Serializer; end
211
210
  belongs_to :author
212
- AuthorSerializer = Class.new(ActiveModel::Serializer)
211
+ class AuthorSerializer < ActiveModel::Serializer; end
213
212
  has_one :description
214
- DescriptionSerializer = Class.new(ActiveModel::Serializer)
213
+ class DescriptionSerializer < ActiveModel::Serializer; end
215
214
  end
216
215
 
217
216
  def setup
@@ -290,6 +289,82 @@ module ActiveModel
290
289
  assert_match(/:if should be a Symbol, String or Proc/, exception.message)
291
290
  end
292
291
  end
292
+
293
+ class InheritedSerializerTest < ActiveSupport::TestCase
294
+ class PostSerializer < ActiveModel::Serializer
295
+ belongs_to :author
296
+ has_many :comments
297
+ belongs_to :blog
298
+ end
299
+
300
+ class InheritedPostSerializer < PostSerializer
301
+ belongs_to :author, polymorphic: true
302
+ has_many :comments, key: :reviews
303
+ end
304
+
305
+ class AuthorSerializer < ActiveModel::Serializer
306
+ has_many :posts
307
+ has_many :roles
308
+ has_one :bio
309
+ end
310
+
311
+ class InheritedAuthorSerializer < AuthorSerializer
312
+ has_many :roles, polymorphic: true
313
+ has_one :bio, polymorphic: true
314
+ end
315
+
316
+ def setup
317
+ @author = Author.new(name: 'Steve K.')
318
+ @post = Post.new(title: 'New Post', body: 'Body')
319
+ @post_serializer = PostSerializer.new(@post)
320
+ @author_serializer = AuthorSerializer.new(@author)
321
+ @inherited_post_serializer = InheritedPostSerializer.new(@post)
322
+ @inherited_author_serializer = InheritedAuthorSerializer.new(@author)
323
+ @author_associations = @author_serializer.associations.to_a
324
+ @inherited_author_associations = @inherited_author_serializer.associations.to_a
325
+ @post_associations = @post_serializer.associations.to_a
326
+ @inherited_post_associations = @inherited_post_serializer.associations.to_a
327
+ end
328
+
329
+ test 'an author serializer must have [posts,roles,bio] associations' do
330
+ expected = [:posts, :roles, :bio].sort
331
+ result = @author_serializer.associations.map(&:name).sort
332
+ assert_equal(result, expected)
333
+ end
334
+
335
+ test 'a post serializer must have [author,comments,blog] associations' do
336
+ expected = [:author, :comments, :blog].sort
337
+ result = @post_serializer.associations.map(&:name).sort
338
+ assert_equal(result, expected)
339
+ end
340
+
341
+ test 'a serializer inheriting from another serializer can redefine has_many and has_one associations' do
342
+ expected = [:roles, :bio].sort
343
+ result = (@inherited_author_associations - @author_associations).map(&:name).sort
344
+ assert_equal(result, expected)
345
+ end
346
+
347
+ test 'a serializer inheriting from another serializer can redefine belongs_to associations' do
348
+ assert_equal [:author, :comments, :blog], @post_associations.map(&:name)
349
+ assert_equal [:author, :comments, :blog, :comments], @inherited_post_associations.map(&:name)
350
+
351
+ refute @post_associations.detect { |assoc| assoc.name == :author }.options.key?(:polymorphic)
352
+ assert_equal true, @inherited_post_associations.detect { |assoc| assoc.name == :author }.options.fetch(:polymorphic)
353
+
354
+ refute @post_associations.detect { |assoc| assoc.name == :comments }.options.key?(:key)
355
+ original_comment_assoc, new_comments_assoc = @inherited_post_associations.select { |assoc| assoc.name == :comments }
356
+ refute original_comment_assoc.options.key?(:key)
357
+ assert_equal :reviews, new_comments_assoc.options.fetch(:key)
358
+
359
+ assert_equal @post_associations.detect { |assoc| assoc.name == :blog }, @inherited_post_associations.detect { |assoc| assoc.name == :blog }
360
+ end
361
+
362
+ test 'a serializer inheriting from another serializer can have an additional association with the same name but with different key' do
363
+ expected = [:author, :comments, :blog, :reviews].sort
364
+ result = @inherited_post_serializer.associations.map { |a| a.options.fetch(:key, a.name) }.sort
365
+ assert_equal(result, expected)
366
+ end
367
+ end
293
368
  end
294
369
  end
295
370
  end
@@ -22,7 +22,7 @@ module ActiveModel
22
22
  inherited_klass = Class.new(AlternateBlogSerializer)
23
23
  blog_serializer = inherited_klass.new(@blog)
24
24
  adapter = ActiveModelSerializers::Adapter::Attributes.new(blog_serializer)
25
- assert_equal({ :id => 1, :title => 'AMS Hints' }, adapter.serializable_hash)
25
+ assert_equal({ id: 1, title: 'AMS Hints' }, adapter.serializable_hash)
26
26
  end
27
27
 
28
28
  def test_multiple_calls_with_the_same_attribute
@@ -81,7 +81,7 @@ module ActiveModel
81
81
  assert_equal('custom', hash[:blog][:id])
82
82
  end
83
83
 
84
- PostWithVirtualAttribute = Class.new(::Model)
84
+ class PostWithVirtualAttribute < ::Model; end
85
85
  class PostWithVirtualAttributeSerializer < ActiveModel::Serializer
86
86
  attribute :name do
87
87
  "#{object.first_name} #{object.last_name}"
@@ -4,7 +4,7 @@ module ActiveModel
4
4
  class Serializer
5
5
  class AttributesTest < ActiveSupport::TestCase
6
6
  def setup
7
- @profile = Profile.new({ name: 'Name 1', description: 'Description 1', comments: 'Comments 1' })
7
+ @profile = Profile.new(name: 'Name 1', description: 'Description 1', comments: 'Comments 1')
8
8
  @profile_serializer = ProfileSerializer.new(@profile)
9
9
  @comment = Comment.new(id: 1, body: 'ZOMG!!', date: '2015')
10
10
  @serializer_klass = Class.new(CommentSerializer)
@@ -5,7 +5,7 @@ module ActiveModel
5
5
  class FieldsetTest < ActiveSupport::TestCase
6
6
  def test_fieldset_with_hash
7
7
  fieldset = ActiveModel::Serializer::Fieldset.new('post' => %w(id title), 'comment' => ['body'])
8
- expected = { :post => [:id, :title], :comment => [:body] }
8
+ expected = { post: [:id, :title], comment: [:body] }
9
9
 
10
10
  assert_equal(expected, fieldset.fields)
11
11
  end
@@ -15,7 +15,8 @@ module ActiveModel
15
15
  @blog,
16
16
  adapter: :json,
17
17
  serializer: AlternateBlogSerializer,
18
- meta: { total: 10 }).as_json
18
+ meta: { total: 10 }
19
+ ).as_json
19
20
  expected = {
20
21
  blog: {
21
22
  id: 1,
@@ -65,7 +66,8 @@ module ActiveModel
65
66
  @blog,
66
67
  adapter: :attributes,
67
68
  serializer: AlternateBlogSerializer,
68
- meta: { total: 10 }).as_json
69
+ meta: { total: 10 }
70
+ ).as_json
69
71
  expected = {
70
72
  id: 1,
71
73
  title: 'AMS Hints'
@@ -79,7 +81,8 @@ module ActiveModel
79
81
  adapter: :json,
80
82
  serializer: AlternateBlogSerializer,
81
83
  meta: { total: 10 },
82
- meta_key: 'haha_meta').as_json
84
+ meta_key: 'haha_meta'
85
+ ).as_json
83
86
  expected = {
84
87
  blog: {
85
88
  id: 1,
@@ -98,7 +101,8 @@ module ActiveModel
98
101
  adapter: :json_api,
99
102
  serializer: AlternateBlogSerializer,
100
103
  meta: { total: 10 },
101
- meta_key: 'haha_meta').as_json
104
+ meta_key: 'haha_meta'
105
+ ).as_json
102
106
  expected = {
103
107
  data: {
104
108
  id: '1',
@@ -148,7 +152,8 @@ module ActiveModel
148
152
  actual = ActiveModelSerializers::SerializableResource.new(
149
153
  [@blog],
150
154
  adapter: :attributes,
151
- meta: { total: 10 }).as_json
155
+ meta: { total: 10 }
156
+ ).as_json
152
157
  expected = [{
153
158
  id: 1,
154
159
  name: 'AMS Hints',
@@ -170,7 +175,8 @@ module ActiveModel
170
175
  [@blog],
171
176
  adapter: :json,
172
177
  meta: { total: 10 },
173
- meta_key: 'haha_meta').as_json
178
+ meta_key: 'haha_meta'
179
+ ).as_json
174
180
  expected = {
175
181
  blogs: [{
176
182
  id: 1,
@@ -8,7 +8,7 @@ module ActiveModel
8
8
  end
9
9
 
10
10
  def test_overwrite_root
11
- serializer = VirtualValueSerializer.new(@virtual_value, { root: 'smth' })
11
+ serializer = VirtualValueSerializer.new(@virtual_value, root: 'smth')
12
12
  assert_equal('smth', serializer.json_key)
13
13
  end
14
14
 
@@ -28,8 +28,8 @@ module ActiveModel
28
28
 
29
29
  class SerializerTest < ActiveSupport::TestCase
30
30
  module ResourceNamespace
31
- Post = Class.new(::Model)
32
- Comment = Class.new(::Model)
31
+ class Post < ::Model; end
32
+ class Comment < ::Model; end
33
33
 
34
34
  class PostSerializer < ActiveModel::Serializer
35
35
  class CommentSerializer < ActiveModel::Serializer
@@ -41,10 +41,12 @@ module ActiveModel
41
41
  end
42
42
 
43
43
  class CustomProfile
44
- def serializer_class; ProfileSerializer; end
44
+ def serializer_class
45
+ ProfileSerializer
46
+ end
45
47
  end
46
48
 
47
- Tweet = Class.new(::Model)
49
+ class Tweet < ::Model; end
48
50
  TweetSerializer = Class.new
49
51
 
50
52
  def setup
@@ -0,0 +1,87 @@
1
+ require 'test_helper'
2
+
3
+ module ActiveModel
4
+ class Serializer
5
+ class SerializerForWithNamespaceTest < ActiveSupport::TestCase
6
+ class Book < ::Model; end
7
+ class Page < ::Model; end
8
+ class Publisher < ::Model; end
9
+
10
+ module Api
11
+ module V3
12
+ class BookSerializer < ActiveModel::Serializer
13
+ attributes :title, :author_name
14
+
15
+ has_many :pages
16
+ belongs_to :publisher
17
+ end
18
+
19
+ class PageSerializer < ActiveModel::Serializer
20
+ attributes :number, :text
21
+
22
+ belongs_to :book
23
+ end
24
+
25
+ class PublisherSerializer < ActiveModel::Serializer
26
+ attributes :name
27
+ end
28
+ end
29
+ end
30
+
31
+ class BookSerializer < ActiveModel::Serializer
32
+ attributes :title, :author_name
33
+ end
34
+ test 'resource without a namespace' do
35
+ book = Book.new(title: 'A Post', author_name: 'hello')
36
+
37
+ # TODO: this should be able to pull up this serializer without explicitly specifying the serializer
38
+ # currently, with no options, it still uses the Api::V3 serializer
39
+ result = ActiveModelSerializers::SerializableResource.new(book, serializer: BookSerializer).serializable_hash
40
+
41
+ expected = { title: 'A Post', author_name: 'hello' }
42
+ assert_equal expected, result
43
+ end
44
+
45
+ test 'resource with namespace' do
46
+ book = Book.new(title: 'A Post', author_name: 'hi')
47
+
48
+ result = ActiveModelSerializers::SerializableResource.new(book, namespace: Api::V3).serializable_hash
49
+
50
+ expected = { title: 'A Post', author_name: 'hi', pages: nil, publisher: nil }
51
+ assert_equal expected, result
52
+ end
53
+
54
+ test 'has_many with nested serializer under the namespace' do
55
+ page = Page.new(number: 1, text: 'hello')
56
+ book = Book.new(title: 'A Post', author_name: 'hi', pages: [page])
57
+
58
+ result = ActiveModelSerializers::SerializableResource.new(book, namespace: Api::V3).serializable_hash
59
+
60
+ expected = {
61
+ title: 'A Post', author_name: 'hi',
62
+ publisher: nil,
63
+ pages: [{
64
+ number: 1, text: 'hello'
65
+ }]
66
+ }
67
+ assert_equal expected, result
68
+ end
69
+
70
+ test 'belongs_to with nested serializer under the namespace' do
71
+ publisher = Publisher.new(name: 'Disney')
72
+ book = Book.new(title: 'A Post', author_name: 'hi', publisher: publisher)
73
+
74
+ result = ActiveModelSerializers::SerializableResource.new(book, namespace: Api::V3).serializable_hash
75
+
76
+ expected = {
77
+ title: 'A Post', author_name: 'hi',
78
+ pages: nil,
79
+ publisher: {
80
+ name: 'Disney'
81
+ }
82
+ }
83
+ assert_equal expected, result
84
+ end
85
+ end
86
+ end
87
+ end
@@ -41,6 +41,7 @@ require 'active_support/core_ext/string/access'
41
41
 
42
42
  # These files do not require any others and are needed
43
43
  # to run the tests
44
+ require 'active_support/testing/autorun'
44
45
  require 'active_support/testing/isolation'
45
46
 
46
47
  module TestHelpers
@@ -74,6 +75,8 @@ module TestHelpers
74
75
  end
75
76
  end
76
77
 
77
- class ActiveSupport::TestCase
78
- include TestHelpers::Generation
78
+ module ActiveSupport
79
+ class TestCase
80
+ include TestHelpers::Generation
81
+ end
79
82
  end
@@ -1,7 +1,7 @@
1
1
  module Rails5Shims
2
2
  module ControllerTests
3
3
  # https://github.com/rails/rails/blob/b217354/actionpack/lib/action_controller/test_case.rb
4
- REQUEST_KWARGS = [:params, :session, :flash, :method, :body, :xhr].freeze
4
+ REQUEST_KWARGS = [:params, :headers, :session, :flash, :method, :body, :xhr].freeze
5
5
 
6
6
  def get(path, *args)
7
7
  fold_kwargs!(args)
@@ -30,7 +30,12 @@ module Rails5Shims
30
30
  return unless hash.respond_to?(:key)
31
31
  Rails5Shims::ControllerTests::REQUEST_KWARGS.each do |kwarg|
32
32
  next unless hash.key?(kwarg)
33
- hash.merge! hash.delete(kwarg)
33
+ value = hash.delete(kwarg)
34
+ if value.is_a? String
35
+ args.insert(0, value)
36
+ else
37
+ hash.merge! value
38
+ end
34
39
  end
35
40
  end
36
41
 
@@ -44,4 +49,5 @@ module Rails5Shims
44
49
  end
45
50
  if Rails::VERSION::MAJOR < 5
46
51
  ActionController::TestCase.send :include, Rails5Shims::ControllerTests
52
+ ActionDispatch::IntegrationTest.send :include, Rails5Shims::ControllerTests
47
53
  end
@@ -22,15 +22,6 @@ ActionController::TestCase.class_eval do
22
22
  def setup
23
23
  @routes = Routes
24
24
  end
25
-
26
- # For Rails5
27
- # https://github.com/rails/rails/commit/ca83436d1b3b6cedd1eca2259f65661e69b01909#diff-b9bbf56e85d3fe1999f16317f2751e76L17
28
- def assigns(key = nil)
29
- warn "DEPRECATION: Calling 'assigns(#{key})' from #{caller[0]}"
30
- assigns = {}.with_indifferent_access
31
- @controller.view_assigns.each { |k, v| assigns.regular_writer(k, v) }
32
- key.nil? ? assigns : assigns[key]
33
- end
34
25
  end
35
26
 
36
27
  # ActiveRecord::Migrator.migrations_paths = [File.expand_path("../../test/dummy/db/migrate", __FILE__)]
@@ -9,6 +9,22 @@ module SerializationTesting
9
9
  ActiveModelSerializers::SerializableResource.new(obj).to_json
10
10
  end
11
11
 
12
+ def with_namespace_separator(separator)
13
+ original_separator = ActiveModelSerializers.config.jsonapi_namespace_separator
14
+ ActiveModelSerializers.config.jsonapi_namespace_separator = separator
15
+ yield
16
+ ensure
17
+ ActiveModelSerializers.config.jsonapi_namespace_separator = original_separator
18
+ end
19
+
20
+ def with_prepended_lookup(lookup_proc)
21
+ original_lookup = ActiveModelSerializers.config.serializer_lookup_cahin
22
+ ActiveModelSerializers.config.serializer_lookup_chain.unshift lookup_proc
23
+ yield
24
+ ensure
25
+ ActiveModelSerializers.config.serializer_lookup_cahin = original_lookup
26
+ end
27
+
12
28
  # Aliased as :with_configured_adapter to clarify that
13
29
  # this method tests the configured adapter.
14
30
  # When not testing configuration, it may be preferable
@@ -44,10 +60,12 @@ module SerializationTesting
44
60
  end
45
61
  end
46
62
 
47
- class Minitest::Test
48
- def before_setup
49
- ActionController::Base.cache_store.clear
50
- end
63
+ module Minitest
64
+ class Test
65
+ def before_setup
66
+ ActionController::Base.cache_store.clear
67
+ end
51
68
 
52
- include SerializationTesting
69
+ include SerializationTesting
70
+ end
53
71
  end
data/test/test_helper.rb CHANGED
@@ -9,6 +9,7 @@ rescue LoadError
9
9
  STDERR.puts 'Running without SimpleCov'
10
10
  end
11
11
 
12
+ require 'pry'
12
13
  require 'timecop'
13
14
  require 'rails'
14
15
  require 'action_controller'