active_model_serializers 0.10.0 → 0.10.3

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.
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
@@ -4,13 +4,6 @@ module ActiveModelSerializers
4
4
  module Adapter
5
5
  class JsonApi
6
6
  class RelationshipTest < ActiveSupport::TestCase
7
- setup do
8
- @blog = Blog.new(id: 1)
9
- @author = Author.new(id: 1, name: 'Steve K.', blog: @blog)
10
- @serializer = BlogSerializer.new(@blog)
11
- ActionController::Base.cache_store.clear
12
- end
13
-
14
7
  def test_relationship_with_data
15
8
  expected = {
16
9
  data: {
@@ -18,26 +11,29 @@ module ActiveModelSerializers
18
11
  type: 'blogs'
19
12
  }
20
13
  }
21
- test_relationship(expected, options: { include_data: true })
14
+
15
+ model_attributes = { blog: Blog.new(id: 1) }
16
+ relationship_name = :blog
17
+ model = new_model(model_attributes)
18
+ actual = build_serializer_and_serialize_relationship(model, relationship_name) do
19
+ has_one :blog
20
+ end
21
+ assert_equal(expected, actual)
22
22
  end
23
23
 
24
24
  def test_relationship_with_nil_model
25
- @serializer = BlogSerializer.new(nil)
26
25
  expected = { data: nil }
27
- test_relationship(expected, options: { include_data: true })
28
- end
29
26
 
30
- def test_relationship_with_nil_serializer
31
- @serializer = nil
32
- expected = { data: nil }
33
- test_relationship(expected, options: { include_data: true })
27
+ model_attributes = { blog: nil }
28
+ relationship_name = :blog
29
+ model = new_model(model_attributes)
30
+ actual = build_serializer_and_serialize_relationship(model, relationship_name) do
31
+ has_one :blog
32
+ end
33
+ assert_equal(expected, actual)
34
34
  end
35
35
 
36
36
  def test_relationship_with_data_array
37
- posts = [Post.new(id: 1), Post.new(id: 2)]
38
- @serializer = ActiveModel::Serializer::CollectionSerializer.new(posts)
39
- @author.posts = posts
40
- @author.blog = nil
41
37
  expected = {
42
38
  data: [
43
39
  {
@@ -50,110 +46,350 @@ module ActiveModelSerializers
50
46
  }
51
47
  ]
52
48
  }
53
- test_relationship(expected, options: { include_data: true })
49
+
50
+ model_attributes = { posts: [Post.new(id: 1), Post.new(id: 2)] }
51
+ relationship_name = :posts
52
+ model = new_model(model_attributes)
53
+ actual = build_serializer_and_serialize_relationship(model, relationship_name) do
54
+ has_many :posts
55
+ end
56
+ assert_equal(expected, actual)
54
57
  end
55
58
 
56
59
  def test_relationship_data_not_included
57
- test_relationship({}, options: { include_data: false })
58
- end
60
+ expected = { meta: {} }
59
61
 
60
- def test_relationship_simple_link
61
- links = { self: 'a link' }
62
- test_relationship({ links: { self: 'a link' } }, links: links)
62
+ model_attributes = { blog: :does_not_matter }
63
+ relationship_name = :blog
64
+ model = new_model(model_attributes)
65
+ actual = build_serializer_and_serialize_relationship(model, relationship_name) do
66
+ has_one :blog do
67
+ include_data false
68
+ end
69
+ end
70
+ assert_equal(expected, actual)
63
71
  end
64
72
 
65
73
  def test_relationship_many_links
66
- links = {
67
- self: 'a link',
68
- related: 'another link'
69
- }
70
74
  expected = {
71
75
  links: {
72
76
  self: 'a link',
73
77
  related: 'another link'
74
78
  }
75
79
  }
76
- test_relationship(expected, links: links)
77
- end
78
80
 
79
- def test_relationship_block_link
80
- links = { self: proc { object.id.to_s } }
81
- expected = { links: { self: @blog.id.to_s } }
82
- test_relationship(expected, links: links)
81
+ model_attributes = { blog: :does_not_matter }
82
+ relationship_name = :blog
83
+ model = new_model(model_attributes)
84
+ actual = build_serializer_and_serialize_relationship(model, relationship_name) do
85
+ has_one :blog do
86
+ include_data false
87
+ link :self, 'a link'
88
+ link :related, 'another link'
89
+ end
90
+ end
91
+ assert_equal(expected, actual)
83
92
  end
84
93
 
85
94
  def test_relationship_block_link_with_meta
86
- links = {
87
- self: proc do
88
- href object.id.to_s
89
- meta(id: object.id)
90
- end
91
- }
92
95
  expected = {
93
96
  links: {
94
97
  self: {
95
- href: @blog.id.to_s,
96
- meta: { id: @blog.id }
98
+ href: '1',
99
+ meta: { id: 1 }
97
100
  }
98
101
  }
99
102
  }
100
- test_relationship(expected, links: links)
103
+
104
+ model_attributes = { blog: Blog.new(id: 1) }
105
+ relationship_name = :blog
106
+ model = new_model(model_attributes)
107
+ actual = build_serializer_and_serialize_relationship(model, relationship_name) do
108
+ has_one :blog do
109
+ include_data false
110
+ link :self do
111
+ href object.blog.id.to_s
112
+ meta(id: object.blog.id)
113
+ end
114
+ end
115
+ end
116
+ assert_equal(expected, actual)
101
117
  end
102
118
 
103
119
  def test_relationship_simple_meta
104
- meta = { id: '1' }
105
- expected = { meta: meta }
106
- test_relationship(expected, meta: meta)
120
+ expected = { meta: { id: '1' } }
121
+
122
+ model_attributes = { blog: Blog.new(id: 1) }
123
+ relationship_name = :blog
124
+ model = new_model(model_attributes)
125
+ actual = build_serializer_and_serialize_relationship(model, relationship_name) do
126
+ has_one :blog do
127
+ include_data false
128
+ meta(id: object.blog.id.to_s)
129
+ end
130
+ end
131
+ assert_equal(expected, actual)
107
132
  end
108
133
 
109
134
  def test_relationship_block_meta
110
- meta = proc do
111
- { id: object.id }
112
- end
113
135
  expected = {
114
136
  meta: {
115
- id: @blog.id
137
+ id: 1
116
138
  }
117
139
  }
118
- test_relationship(expected, meta: meta)
140
+
141
+ model_attributes = { blog: Blog.new(id: 1) }
142
+ relationship_name = :blog
143
+ model = new_model(model_attributes)
144
+ actual = build_serializer_and_serialize_relationship(model, relationship_name) do
145
+ has_one :blog do
146
+ include_data false
147
+ meta(id: object.blog.id)
148
+ end
149
+ end
150
+ assert_equal(expected, actual)
119
151
  end
120
152
 
121
- def test_relationship_with_everything
122
- links = {
123
- self: 'a link',
124
- related: proc do
125
- href object.id.to_s
126
- meta object.id
153
+ def test_relationship_simple_link
154
+ expected = {
155
+ data: {
156
+ id: '1337',
157
+ type: 'bios'
158
+ },
159
+ links: {
160
+ self: '//example.com/link_author/relationships/bio'
161
+ }
162
+ }
163
+
164
+ model_attributes = { bio: Bio.new(id: 1337) }
165
+ relationship_name = :bio
166
+ model = new_model(model_attributes)
167
+ actual = build_serializer_and_serialize_relationship(model, relationship_name) do
168
+ has_one :bio do
169
+ link :self, '//example.com/link_author/relationships/bio'
127
170
  end
171
+ end
172
+ assert_equal(expected, actual)
173
+ end
128
174
 
175
+ def test_relationship_block_link
176
+ expected = {
177
+ data: { id: '1337', type: 'profiles' },
178
+ links: { related: '//example.com/profiles/1337' }
129
179
  }
130
- meta = proc do
131
- { id: object.id }
180
+
181
+ model_attributes = { profile: Profile.new(id: 1337) }
182
+ relationship_name = :profile
183
+ model = new_model(model_attributes)
184
+ actual = build_serializer_and_serialize_relationship(model, relationship_name) do
185
+ has_one :profile do
186
+ id = object.profile.id
187
+ link :related do
188
+ "//example.com/profiles/#{id}" if id != 123
189
+ end
190
+ end
132
191
  end
192
+ assert_equal(expected, actual)
193
+ end
194
+
195
+ def test_relationship_with_everything
133
196
  expected = {
134
- data: {
135
- id: '1',
136
- type: 'blogs'
137
- },
197
+ data: [{ id: '1337', type: 'likes' }],
138
198
  links: {
139
- self: 'a link',
140
199
  related: {
141
- href: '1', meta: 1
200
+ href: '//example.com/likes/1337',
201
+ meta: { ids: '1337' }
142
202
  }
143
203
  },
144
- meta: {
145
- id: @blog.id
204
+ meta: { liked: true }
205
+ }
206
+
207
+ model_attributes = { likes: [Like.new(id: 1337)] }
208
+ relationship_name = :likes
209
+ model = new_model(model_attributes)
210
+ actual = build_serializer_and_serialize_relationship(model, relationship_name) do
211
+ has_many :likes do
212
+ link :related do
213
+ ids = object.likes.map(&:id).join(',')
214
+ href "//example.com/likes/#{ids}"
215
+ meta ids: ids
216
+ end
217
+ meta liked: object.likes.any?
218
+ end
219
+ end
220
+ assert_equal(expected, actual)
221
+ end
222
+
223
+ def test_relationship_nil_link
224
+ expected = {
225
+ data: { id: '123', type: 'profiles' }
226
+ }
227
+
228
+ model_attributes = { profile: Profile.new(id: 123) }
229
+ relationship_name = :profile
230
+ model = new_model(model_attributes)
231
+ actual = build_serializer_and_serialize_relationship(model, relationship_name) do
232
+ has_one :profile do
233
+ id = object.profile.id
234
+ link :related do
235
+ "//example.com/profiles/#{id}" if id != 123
236
+ end
237
+ end
238
+ end
239
+ assert_equal(expected, actual)
240
+ end
241
+
242
+ def test_relationship_block_link_href
243
+ expected = {
244
+ data: [{ id: '1337', type: 'locations' }],
245
+ links: {
246
+ related: { href: '//example.com/locations/1337' }
247
+ }
248
+ }
249
+
250
+ model_attributes = { locations: [Location.new(id: 1337)] }
251
+ relationship_name = :locations
252
+ model = new_model(model_attributes)
253
+ actual = build_serializer_and_serialize_relationship(model, relationship_name) do
254
+ has_many :locations do
255
+ link :related do
256
+ ids = object.locations.map(&:id).join(',')
257
+ href "//example.com/locations/#{ids}"
258
+ end
259
+ end
260
+ end
261
+ assert_equal(expected, actual)
262
+ end
263
+
264
+ def test_relationship_block_link_href_and_meta
265
+ expected = {
266
+ data: [{ id: '1337', type: 'posts' }],
267
+ links: {
268
+ related: {
269
+ href: '//example.com/posts/1337',
270
+ meta: { ids: '1337' }
271
+ }
272
+ }
273
+ }
274
+
275
+ model_attributes = { posts: [Post.new(id: 1337, comments: [], author: nil)] }
276
+ relationship_name = :posts
277
+ model = new_model(model_attributes)
278
+ actual = build_serializer_and_serialize_relationship(model, relationship_name) do
279
+ has_many :posts do
280
+ link :related do
281
+ ids = object.posts.map(&:id).join(',')
282
+ href "//example.com/posts/#{ids}"
283
+ meta ids: ids
284
+ end
285
+ end
286
+ end
287
+ assert_equal(expected, actual)
288
+ end
289
+
290
+ def test_relationship_block_link_meta
291
+ expected = {
292
+ data: [{ id: '1337', type: 'comments' }],
293
+ links: {
294
+ self: {
295
+ meta: { ids: [1] }
296
+ }
146
297
  }
147
298
  }
148
- test_relationship(expected, meta: meta, options: { include_data: true }, links: links)
299
+
300
+ model_attributes = { comments: [Comment.new(id: 1337)] }
301
+ relationship_name = :comments
302
+ model = new_model(model_attributes)
303
+ actual = build_serializer_and_serialize_relationship(model, relationship_name) do
304
+ has_many :comments do
305
+ link :self do
306
+ meta ids: [1]
307
+ end
308
+ end
309
+ end
310
+ assert_equal(expected, actual)
311
+ end
312
+
313
+ def test_relationship_meta
314
+ expected = {
315
+ data: [{ id: 'from-serializer-method', type: 'roles' }],
316
+ meta: { count: 1 }
317
+ }
318
+
319
+ model_attributes = { roles: [Role.new(id: 'from-record')] }
320
+ relationship_name = :roles
321
+ model = new_model(model_attributes)
322
+ actual = build_serializer_and_serialize_relationship(model, relationship_name) do
323
+ has_many :roles do |serializer|
324
+ meta count: object.roles.count
325
+ serializer.cached_roles
326
+ end
327
+ def cached_roles
328
+ [
329
+ Role.new(id: 'from-serializer-method')
330
+ ]
331
+ end
332
+ end
333
+ assert_equal(expected, actual)
334
+ end
335
+
336
+ def test_relationship_not_including_data
337
+ expected = {
338
+ links: { self: '//example.com/link_author/relationships/blog' }
339
+ }
340
+
341
+ model_attributes = { blog: Object }
342
+ relationship_name = :blog
343
+ model = new_model(model_attributes)
344
+ model.define_singleton_method(:read_attribute_for_serialization) do |attr|
345
+ fail 'should not be called' if attr == :blog
346
+ super(attr)
347
+ end
348
+ assert_nothing_raised do
349
+ actual = build_serializer_and_serialize_relationship(model, relationship_name) do
350
+ has_one :blog do
351
+ link :self, '//example.com/link_author/relationships/blog'
352
+ include_data false
353
+ end
354
+ end
355
+ assert_equal(expected, actual)
356
+ end
357
+ end
358
+
359
+ def test_relationship_including_data_explicit
360
+ expected = {
361
+ data: { id: '1337', type: 'authors' },
362
+ meta: { name: 'Dan Brown' }
363
+ }
364
+
365
+ model_attributes = { reviewer: Author.new(id: 1337) }
366
+ relationship_name = :reviewer
367
+ model = new_model(model_attributes)
368
+ actual = build_serializer_and_serialize_relationship(model, relationship_name) do
369
+ belongs_to :reviewer do
370
+ meta name: 'Dan Brown'
371
+ include_data true
372
+ end
373
+ end
374
+ assert_equal(expected, actual)
149
375
  end
150
376
 
151
377
  private
152
378
 
153
- def test_relationship(expected, params = {})
154
- parent_serializer = AuthorSerializer.new(@author)
155
- relationship = Relationship.new(parent_serializer, @serializer, nil, params)
156
- assert_equal(expected, relationship.as_json)
379
+ def build_serializer_and_serialize_relationship(model, relationship_name, &block)
380
+ serializer_class = Class.new(ActiveModel::Serializer, &block)
381
+ hash = serializable(model, serializer: serializer_class, adapter: :json_api).serializable_hash
382
+ hash[:data][:relationships][relationship_name]
383
+ end
384
+
385
+ def new_model(model_attributes)
386
+ Class.new(ActiveModelSerializers::Model) do
387
+ attr_accessor(*model_attributes.keys)
388
+
389
+ def self.name
390
+ 'TestModel'
391
+ end
392
+ end.new(model_attributes)
157
393
  end
158
394
  end
159
395
  end
@@ -14,7 +14,13 @@ module ActiveModelSerializers
14
14
  end
15
15
  end
16
16
 
17
- class FragmentedSerializer < ActiveModel::Serializer; end
17
+ class FragmentedSerializer < ActiveModel::Serializer
18
+ cache only: :id
19
+
20
+ def id
21
+ 'special_id'
22
+ end
23
+ end
18
24
 
19
25
  setup do
20
26
  @model = Author.new(id: 1, name: 'Steve K.')
@@ -33,6 +39,26 @@ module ActiveModelSerializers
33
39
  test_type_inflection(AuthorSerializer, 'authors', :plural)
34
40
  end
35
41
 
42
+ def test_type_with_namespace
43
+ Object.const_set(:Admin, Module.new)
44
+ model = Class.new(::Model)
45
+ Admin.const_set(:PowerUser, model)
46
+ serializer = Class.new(ActiveModel::Serializer)
47
+ Admin.const_set(:PowerUserSerializer, serializer)
48
+ with_namespace_separator '--' do
49
+ admin_user = Admin::PowerUser.new
50
+ serializer = Admin::PowerUserSerializer.new(admin_user)
51
+ expected = {
52
+ id: admin_user.id,
53
+ type: 'admin--power-users'
54
+ }
55
+
56
+ identifier = ResourceIdentifier.new(serializer, {})
57
+ actual = identifier.as_json
58
+ assert_equal(expected, actual)
59
+ end
60
+ end
61
+
36
62
  def test_id_defined_on_object
37
63
  test_id(AuthorSerializer, @model.id.to_s)
38
64
  end
@@ -42,7 +68,6 @@ module ActiveModelSerializers
42
68
  end
43
69
 
44
70
  def test_id_defined_on_fragmented
45
- FragmentedSerializer.fragmented(WithDefinedIdSerializer.new(@model))
46
71
  test_id(FragmentedSerializer, 'special_id')
47
72
  end
48
73
 
@@ -68,9 +68,9 @@ module ActiveModel
68
68
  adapter: :json_api
69
69
  ).serializable_hash
70
70
  expected = {
71
- :data => [
72
- { :id => '1337', :type => 'posts', :meta => { :"comments-count" => 0 } },
73
- { :id => '1339', :type => 'posts', :meta => { :"comments-count" => 1 } }
71
+ data: [
72
+ { id: '1337', type: 'posts', meta: { :"comments-count" => 0 } },
73
+ { id: '1339', type: 'posts', meta: { :"comments-count" => 1 } }
74
74
  ]
75
75
  }
76
76
  assert_equal(expected, hash)