active_model_serializers 0.10.6 → 0.10.13

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 (215) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +114 -1
  3. data/README.md +21 -24
  4. data/lib/action_controller/serialization.rb +11 -1
  5. data/lib/active_model/serializable_resource.rb +2 -0
  6. data/lib/active_model/serializer/adapter/attributes.rb +2 -0
  7. data/lib/active_model/serializer/adapter/base.rb +2 -0
  8. data/lib/active_model/serializer/adapter/json.rb +2 -0
  9. data/lib/active_model/serializer/adapter/json_api.rb +2 -0
  10. data/lib/active_model/serializer/adapter/null.rb +2 -0
  11. data/lib/active_model/serializer/adapter.rb +2 -0
  12. data/lib/active_model/serializer/array_serializer.rb +2 -0
  13. data/lib/active_model/serializer/association.rb +2 -0
  14. data/lib/active_model/serializer/attribute.rb +2 -0
  15. data/lib/active_model/serializer/belongs_to_reflection.rb +2 -0
  16. data/lib/active_model/serializer/collection_serializer.rb +17 -5
  17. data/lib/active_model/serializer/concerns/caching.rb +7 -2
  18. data/lib/active_model/serializer/error_serializer.rb +2 -0
  19. data/lib/active_model/serializer/errors_serializer.rb +2 -0
  20. data/lib/active_model/serializer/field.rb +2 -0
  21. data/lib/active_model/serializer/fieldset.rb +3 -1
  22. data/lib/active_model/serializer/has_many_reflection.rb +2 -0
  23. data/lib/active_model/serializer/has_one_reflection.rb +2 -0
  24. data/lib/active_model/serializer/lazy_association.rb +6 -2
  25. data/lib/active_model/serializer/link.rb +23 -0
  26. data/lib/active_model/serializer/lint.rb +2 -0
  27. data/lib/active_model/serializer/null.rb +2 -0
  28. data/lib/active_model/serializer/reflection.rb +10 -5
  29. data/lib/active_model/serializer/version.rb +3 -1
  30. data/lib/active_model/serializer.rb +37 -19
  31. data/lib/active_model_serializers/adapter/attributes.rb +23 -0
  32. data/lib/active_model_serializers/adapter/base.rb +2 -0
  33. data/lib/active_model_serializers/adapter/json.rb +2 -0
  34. data/lib/active_model_serializers/adapter/json_api/deserialization.rb +3 -1
  35. data/lib/active_model_serializers/adapter/json_api/error.rb +2 -0
  36. data/lib/active_model_serializers/adapter/json_api/jsonapi.rb +2 -0
  37. data/lib/active_model_serializers/adapter/json_api/link.rb +2 -0
  38. data/lib/active_model_serializers/adapter/json_api/meta.rb +2 -0
  39. data/lib/active_model_serializers/adapter/json_api/pagination_links.rb +45 -20
  40. data/lib/active_model_serializers/adapter/json_api/relationship.rb +18 -4
  41. data/lib/active_model_serializers/adapter/json_api/resource_identifier.rb +33 -25
  42. data/lib/active_model_serializers/adapter/json_api.rb +14 -9
  43. data/lib/active_model_serializers/adapter/null.rb +2 -0
  44. data/lib/active_model_serializers/adapter.rb +3 -1
  45. data/lib/active_model_serializers/callbacks.rb +2 -0
  46. data/lib/active_model_serializers/deprecate.rb +2 -0
  47. data/lib/active_model_serializers/deserialization.rb +2 -0
  48. data/lib/active_model_serializers/json_pointer.rb +2 -0
  49. data/lib/active_model_serializers/logging.rb +2 -0
  50. data/lib/active_model_serializers/lookup_chain.rb +2 -0
  51. data/lib/active_model_serializers/model/caching.rb +26 -0
  52. data/lib/active_model_serializers/model.rb +2 -0
  53. data/lib/active_model_serializers/railtie.rb +4 -0
  54. data/lib/active_model_serializers/register_jsonapi_renderer.rb +2 -0
  55. data/lib/active_model_serializers/serializable_resource.rb +4 -2
  56. data/lib/active_model_serializers/serialization_context.rb +2 -0
  57. data/lib/active_model_serializers/test/schema.rb +2 -0
  58. data/lib/active_model_serializers/test/serializer.rb +2 -0
  59. data/lib/active_model_serializers/test.rb +2 -0
  60. data/lib/active_model_serializers.rb +21 -11
  61. data/lib/generators/rails/resource_override.rb +2 -0
  62. data/lib/generators/rails/serializer_generator.rb +2 -0
  63. data/lib/grape/active_model_serializers.rb +2 -0
  64. data/lib/grape/formatters/active_model_serializers.rb +2 -0
  65. data/lib/grape/helpers/active_model_serializers.rb +2 -0
  66. data/lib/tasks/rubocop.rake +2 -0
  67. metadata +43 -298
  68. data/.github/ISSUE_TEMPLATE.md +0 -29
  69. data/.github/PULL_REQUEST_TEMPLATE.md +0 -15
  70. data/.gitignore +0 -35
  71. data/.rubocop.yml +0 -105
  72. data/.simplecov +0 -110
  73. data/.travis.yml +0 -55
  74. data/CODE_OF_CONDUCT.md +0 -74
  75. data/CONTRIBUTING.md +0 -105
  76. data/Gemfile +0 -56
  77. data/Rakefile +0 -74
  78. data/active_model_serializers.gemspec +0 -63
  79. data/appveyor.yml +0 -30
  80. data/bin/bench +0 -171
  81. data/bin/bench_regression +0 -316
  82. data/bin/rubocop +0 -38
  83. data/bin/serve_benchmark +0 -39
  84. data/docs/README.md +0 -41
  85. data/docs/STYLE.md +0 -58
  86. data/docs/general/adapters.md +0 -263
  87. data/docs/general/caching.md +0 -58
  88. data/docs/general/configuration_options.md +0 -169
  89. data/docs/general/deserialization.md +0 -100
  90. data/docs/general/fields.md +0 -31
  91. data/docs/general/getting_started.md +0 -133
  92. data/docs/general/instrumentation.md +0 -40
  93. data/docs/general/key_transforms.md +0 -40
  94. data/docs/general/logging.md +0 -21
  95. data/docs/general/rendering.md +0 -293
  96. data/docs/general/serializers.md +0 -480
  97. data/docs/how-open-source-maintained.jpg +0 -0
  98. data/docs/howto/add_pagination_links.md +0 -138
  99. data/docs/howto/add_relationship_links.md +0 -140
  100. data/docs/howto/add_root_key.md +0 -55
  101. data/docs/howto/grape_integration.md +0 -42
  102. data/docs/howto/outside_controller_use.md +0 -66
  103. data/docs/howto/passing_arbitrary_options.md +0 -27
  104. data/docs/howto/serialize_poro.md +0 -73
  105. data/docs/howto/test.md +0 -154
  106. data/docs/howto/upgrade_from_0_8_to_0_10.md +0 -265
  107. data/docs/integrations/ember-and-json-api.md +0 -147
  108. data/docs/integrations/grape.md +0 -19
  109. data/docs/jsonapi/errors.md +0 -56
  110. data/docs/jsonapi/schema/schema.json +0 -366
  111. data/docs/jsonapi/schema.md +0 -151
  112. data/docs/rfcs/0000-namespace.md +0 -106
  113. data/docs/rfcs/template.md +0 -15
  114. data/test/action_controller/adapter_selector_test.rb +0 -62
  115. data/test/action_controller/explicit_serializer_test.rb +0 -135
  116. data/test/action_controller/json/include_test.rb +0 -246
  117. data/test/action_controller/json_api/deserialization_test.rb +0 -112
  118. data/test/action_controller/json_api/errors_test.rb +0 -40
  119. data/test/action_controller/json_api/fields_test.rb +0 -66
  120. data/test/action_controller/json_api/linked_test.rb +0 -202
  121. data/test/action_controller/json_api/pagination_test.rb +0 -116
  122. data/test/action_controller/json_api/transform_test.rb +0 -189
  123. data/test/action_controller/lookup_proc_test.rb +0 -49
  124. data/test/action_controller/namespace_lookup_test.rb +0 -232
  125. data/test/action_controller/serialization_scope_name_test.rb +0 -235
  126. data/test/action_controller/serialization_test.rb +0 -472
  127. data/test/active_model_serializers/adapter_for_test.rb +0 -208
  128. data/test/active_model_serializers/json_pointer_test.rb +0 -22
  129. data/test/active_model_serializers/logging_test.rb +0 -77
  130. data/test/active_model_serializers/model_test.rb +0 -142
  131. data/test/active_model_serializers/railtie_test_isolated.rb +0 -68
  132. data/test/active_model_serializers/register_jsonapi_renderer_test_isolated.rb +0 -161
  133. data/test/active_model_serializers/serialization_context_test_isolated.rb +0 -71
  134. data/test/active_model_serializers/test/schema_test.rb +0 -131
  135. data/test/active_model_serializers/test/serializer_test.rb +0 -62
  136. data/test/active_record_test.rb +0 -9
  137. data/test/adapter/attributes_test.rb +0 -40
  138. data/test/adapter/deprecation_test.rb +0 -100
  139. data/test/adapter/json/belongs_to_test.rb +0 -45
  140. data/test/adapter/json/collection_test.rb +0 -104
  141. data/test/adapter/json/has_many_test.rb +0 -53
  142. data/test/adapter/json/transform_test.rb +0 -93
  143. data/test/adapter/json_api/belongs_to_test.rb +0 -155
  144. data/test/adapter/json_api/collection_test.rb +0 -96
  145. data/test/adapter/json_api/errors_test.rb +0 -76
  146. data/test/adapter/json_api/fields_test.rb +0 -96
  147. data/test/adapter/json_api/has_many_embed_ids_test.rb +0 -43
  148. data/test/adapter/json_api/has_many_explicit_serializer_test.rb +0 -96
  149. data/test/adapter/json_api/has_many_test.rb +0 -173
  150. data/test/adapter/json_api/has_one_test.rb +0 -80
  151. data/test/adapter/json_api/include_data_if_sideloaded_test.rb +0 -183
  152. data/test/adapter/json_api/json_api_test.rb +0 -33
  153. data/test/adapter/json_api/linked_test.rb +0 -413
  154. data/test/adapter/json_api/links_test.rb +0 -95
  155. data/test/adapter/json_api/pagination_links_test.rb +0 -193
  156. data/test/adapter/json_api/parse_test.rb +0 -137
  157. data/test/adapter/json_api/relationship_test.rb +0 -397
  158. data/test/adapter/json_api/resource_identifier_test.rb +0 -110
  159. data/test/adapter/json_api/resource_meta_test.rb +0 -100
  160. data/test/adapter/json_api/toplevel_jsonapi_test.rb +0 -82
  161. data/test/adapter/json_api/transform_test.rb +0 -512
  162. data/test/adapter/json_api/type_test.rb +0 -61
  163. data/test/adapter/json_test.rb +0 -46
  164. data/test/adapter/null_test.rb +0 -22
  165. data/test/adapter/polymorphic_test.rb +0 -171
  166. data/test/adapter_test.rb +0 -67
  167. data/test/array_serializer_test.rb +0 -22
  168. data/test/benchmark/app.rb +0 -65
  169. data/test/benchmark/benchmarking_support.rb +0 -67
  170. data/test/benchmark/bm_active_record.rb +0 -81
  171. data/test/benchmark/bm_adapter.rb +0 -38
  172. data/test/benchmark/bm_caching.rb +0 -119
  173. data/test/benchmark/bm_lookup_chain.rb +0 -83
  174. data/test/benchmark/bm_transform.rb +0 -45
  175. data/test/benchmark/config.ru +0 -3
  176. data/test/benchmark/controllers.rb +0 -83
  177. data/test/benchmark/fixtures.rb +0 -219
  178. data/test/cache_test.rb +0 -651
  179. data/test/collection_serializer_test.rb +0 -123
  180. data/test/fixtures/active_record.rb +0 -113
  181. data/test/fixtures/poro.rb +0 -225
  182. data/test/generators/scaffold_controller_generator_test.rb +0 -24
  183. data/test/generators/serializer_generator_test.rb +0 -75
  184. data/test/grape_test.rb +0 -196
  185. data/test/lint_test.rb +0 -49
  186. data/test/logger_test.rb +0 -20
  187. data/test/poro_test.rb +0 -9
  188. data/test/serializable_resource_test.rb +0 -79
  189. data/test/serializers/association_macros_test.rb +0 -37
  190. data/test/serializers/associations_test.rb +0 -424
  191. data/test/serializers/attribute_test.rb +0 -153
  192. data/test/serializers/attributes_test.rb +0 -52
  193. data/test/serializers/caching_configuration_test_isolated.rb +0 -170
  194. data/test/serializers/configuration_test.rb +0 -32
  195. data/test/serializers/fieldset_test.rb +0 -14
  196. data/test/serializers/meta_test.rb +0 -202
  197. data/test/serializers/options_test.rb +0 -32
  198. data/test/serializers/read_attribute_for_serialization_test.rb +0 -79
  199. data/test/serializers/reflection_test.rb +0 -427
  200. data/test/serializers/root_test.rb +0 -21
  201. data/test/serializers/serialization_test.rb +0 -55
  202. data/test/serializers/serializer_for_test.rb +0 -136
  203. data/test/serializers/serializer_for_with_namespace_test.rb +0 -88
  204. data/test/support/custom_schemas/active_model_serializers/test/schema_test/my/index.json +0 -6
  205. data/test/support/isolated_unit.rb +0 -82
  206. data/test/support/rails5_shims.rb +0 -53
  207. data/test/support/rails_app.rb +0 -38
  208. data/test/support/schemas/active_model_serializers/test/schema_test/my/index.json +0 -6
  209. data/test/support/schemas/active_model_serializers/test/schema_test/my/show.json +0 -6
  210. data/test/support/schemas/custom/show.json +0 -7
  211. data/test/support/schemas/hyper_schema.json +0 -93
  212. data/test/support/schemas/render_using_json_api.json +0 -43
  213. data/test/support/schemas/simple_json_pointers.json +0 -10
  214. data/test/support/serialization_testing.rb +0 -71
  215. data/test/test_helper.rb +0 -70
@@ -1,183 +0,0 @@
1
- require 'test_helper'
2
-
3
- module ActiveModel
4
- class Serializer
5
- module Adapter
6
- class JsonApi
7
- class IncludeParamTest < ActiveSupport::TestCase
8
- IncludeParamAuthor = Class.new(::Model) do
9
- associations :tags, :posts
10
- end
11
-
12
- class CustomCommentLoader
13
- def all
14
- [{ foo: 'bar' }]
15
- end
16
- end
17
- class Tag < ::Model
18
- attributes :id, :name
19
- end
20
-
21
- class TagSerializer < ActiveModel::Serializer
22
- type 'tags'
23
- attributes :id, :name
24
- end
25
-
26
- class PostWithTagsSerializer < ActiveModel::Serializer
27
- type 'posts'
28
- attributes :id
29
- has_many :tags
30
- end
31
-
32
- class IncludeParamAuthorSerializer < ActiveModel::Serializer
33
- class_attribute :comment_loader
34
-
35
- has_many :tags, serializer: TagSerializer do
36
- link :self, '//example.com/link_author/relationships/tags'
37
- include_data :if_sideloaded
38
- end
39
-
40
- has_many :unlinked_tags, serializer: TagSerializer do
41
- include_data :if_sideloaded
42
- end
43
-
44
- has_many :posts, serializer: PostWithTagsSerializer do
45
- include_data :if_sideloaded
46
- end
47
- has_many :locations do
48
- include_data :if_sideloaded
49
- end
50
- has_many :comments do
51
- include_data :if_sideloaded
52
- IncludeParamAuthorSerializer.comment_loader.all
53
- end
54
- end
55
-
56
- def setup
57
- IncludeParamAuthorSerializer.comment_loader = Class.new(CustomCommentLoader).new
58
- @tag = Tag.new(id: 1337, name: 'mytag')
59
- @author = IncludeParamAuthor.new(
60
- id: 1337,
61
- tags: [@tag]
62
- )
63
- end
64
-
65
- def test_relationship_not_loaded_when_not_included
66
- expected = {
67
- links: {
68
- self: '//example.com/link_author/relationships/tags'
69
- }
70
- }
71
-
72
- @author.define_singleton_method(:read_attribute_for_serialization) do |attr|
73
- fail 'should not be called' if attr == :tags
74
- super(attr)
75
- end
76
-
77
- assert_relationship(:tags, expected)
78
- end
79
-
80
- def test_relationship_included
81
- expected = {
82
- data: [
83
- {
84
- id: '1337',
85
- type: 'tags'
86
- }
87
- ],
88
- links: {
89
- self: '//example.com/link_author/relationships/tags'
90
- }
91
- }
92
-
93
- assert_relationship(:tags, expected, include: :tags)
94
- end
95
-
96
- def test_sideloads_included
97
- expected = [
98
- {
99
- id: '1337',
100
- type: 'tags',
101
- attributes: { name: 'mytag' }
102
- }
103
- ]
104
- hash = result(include: :tags)
105
- assert_equal(expected, hash[:included])
106
- end
107
-
108
- def test_nested_relationship
109
- expected = {
110
- data: [
111
- {
112
- id: '1337',
113
- type: 'tags'
114
- }
115
- ],
116
- links: {
117
- self: '//example.com/link_author/relationships/tags'
118
- }
119
- }
120
-
121
- expected_no_data = {
122
- links: {
123
- self: '//example.com/link_author/relationships/tags'
124
- }
125
- }
126
-
127
- assert_relationship(:tags, expected, include: [:tags, { posts: :tags }])
128
-
129
- @author.define_singleton_method(:read_attribute_for_serialization) do |attr|
130
- fail 'should not be called' if attr == :tags
131
- super(attr)
132
- end
133
-
134
- assert_relationship(:tags, expected_no_data, include: { posts: :tags })
135
- end
136
-
137
- def test_include_params_with_no_block
138
- @author.define_singleton_method(:read_attribute_for_serialization) do |attr|
139
- fail 'should not be called' if attr == :locations
140
- super(attr)
141
- end
142
-
143
- expected = { meta: {} }
144
-
145
- assert_relationship(:locations, expected)
146
- end
147
-
148
- def test_block_relationship
149
- expected = {
150
- data: [
151
- { 'foo' => 'bar' }
152
- ]
153
- }
154
-
155
- assert_relationship(:comments, expected, include: [:comments])
156
- end
157
-
158
- def test_node_not_included_when_no_link
159
- expected = { meta: {} }
160
- assert_relationship(:unlinked_tags, expected, key_transform: :unaltered)
161
- end
162
-
163
- private
164
-
165
- def assert_relationship(relationship_name, expected, opts = {})
166
- actual = relationship_data(relationship_name, opts)
167
- assert_equal(expected, actual)
168
- end
169
-
170
- def result(opts)
171
- opts = { adapter: :json_api }.merge(opts)
172
- serializable(@author, opts).serializable_hash
173
- end
174
-
175
- def relationship_data(relationship_name, opts = {})
176
- hash = result(opts)
177
- hash[:data][:relationships][relationship_name]
178
- end
179
- end
180
- end
181
- end
182
- end
183
- end
@@ -1,33 +0,0 @@
1
- require 'test_helper'
2
-
3
- module ActiveModelSerializers
4
- module Adapter
5
- class JsonApiTest < ActiveSupport::TestCase
6
- def setup
7
- ActionController::Base.cache_store.clear
8
- @author = Author.new(id: 1, name: 'Steve K.')
9
- @post = Post.new(id: 1, title: 'New Post', body: 'Body')
10
- @first_comment = Comment.new(id: 1, body: 'ZOMG A COMMENT')
11
- @second_comment = Comment.new(id: 2, body: 'ZOMG ANOTHER COMMENT')
12
- @post.comments = [@first_comment, @second_comment]
13
- @first_comment.post = @post
14
- @second_comment.post = @post
15
- @post.author = @author
16
- @blog = Blog.new(id: 1, name: 'My Blog!!')
17
- @post.blog = @blog
18
- end
19
-
20
- def test_custom_keys
21
- serializer = PostWithCustomKeysSerializer.new(@post)
22
- adapter = ActiveModelSerializers::Adapter::JsonApi.new(serializer)
23
-
24
- assert_equal({
25
- reviews: { data: [{ type: 'comments', id: '1' },
26
- { type: 'comments', id: '2' }] },
27
- writer: { data: { type: 'authors', id: '1' } },
28
- site: { data: { type: 'blogs', id: '1' } }
29
- }, adapter.serializable_hash[:data][:relationships])
30
- end
31
- end
32
- end
33
- end
@@ -1,413 +0,0 @@
1
- require 'test_helper'
2
-
3
- class NestedPost < ::Model; associations :nested_posts end
4
- class NestedPostSerializer < ActiveModel::Serializer
5
- has_many :nested_posts
6
- end
7
- module ActiveModelSerializers
8
- module Adapter
9
- class JsonApi
10
- class LinkedTest < ActiveSupport::TestCase
11
- def setup
12
- @author1 = Author.new(id: 1, name: 'Steve K.')
13
- @author2 = Author.new(id: 2, name: 'Tenderlove')
14
- @bio1 = Bio.new(id: 1, content: 'AMS Contributor')
15
- @bio2 = Bio.new(id: 2, content: 'Rails Contributor')
16
- @first_post = Post.new(id: 10, title: 'Hello!!', body: 'Hello, world!!')
17
- @second_post = Post.new(id: 20, title: 'New Post', body: 'Body')
18
- @third_post = Post.new(id: 30, title: 'Yet Another Post', body: 'Body')
19
- @blog = Blog.new(name: 'AMS Blog')
20
- @first_comment = Comment.new(id: 1, body: 'ZOMG A COMMENT')
21
- @second_comment = Comment.new(id: 2, body: 'ZOMG ANOTHER COMMENT')
22
- @first_post.blog = @blog
23
- @second_post.blog = @blog
24
- @third_post.blog = nil
25
- @first_post.comments = [@first_comment, @second_comment]
26
- @second_post.comments = []
27
- @third_post.comments = []
28
- @first_post.author = @author1
29
- @second_post.author = @author2
30
- @third_post.author = @author1
31
- @first_comment.post = @first_post
32
- @first_comment.author = nil
33
- @second_comment.post = @first_post
34
- @second_comment.author = nil
35
- @author1.posts = [@first_post, @third_post]
36
- @author1.bio = @bio1
37
- @author1.roles = []
38
- @author2.posts = [@second_post]
39
- @author2.bio = @bio2
40
- @author2.roles = []
41
- @bio1.author = @author1
42
- @bio2.author = @author2
43
- end
44
-
45
- def test_include_multiple_posts_and_linked_array
46
- serializer = ActiveModel::Serializer::CollectionSerializer.new([@first_post, @second_post])
47
- adapter = ActiveModelSerializers::Adapter::JsonApi.new(
48
- serializer,
49
- include: [:comments, author: [:bio]]
50
- )
51
- alt_adapter = ActiveModelSerializers::Adapter::JsonApi.new(
52
- serializer,
53
- include: [:comments, author: [:bio]]
54
- )
55
-
56
- expected = {
57
- data: [
58
- {
59
- id: '10',
60
- type: 'posts',
61
- attributes: {
62
- title: 'Hello!!',
63
- body: 'Hello, world!!'
64
- },
65
- relationships: {
66
- comments: { data: [{ type: 'comments', id: '1' }, { type: 'comments', id: '2' }] },
67
- blog: { data: { type: 'blogs', id: '999' } },
68
- author: { data: { type: 'authors', id: '1' } }
69
- }
70
- },
71
- {
72
- id: '20',
73
- type: 'posts',
74
- attributes: {
75
- title: 'New Post',
76
- body: 'Body'
77
- },
78
- relationships: {
79
- comments: { data: [] },
80
- blog: { data: { type: 'blogs', id: '999' } },
81
- author: { data: { type: 'authors', id: '2' } }
82
- }
83
- }
84
- ],
85
- included: [
86
- {
87
- id: '1',
88
- type: 'comments',
89
- attributes: {
90
- body: 'ZOMG A COMMENT'
91
- },
92
- relationships: {
93
- post: { data: { type: 'posts', id: '10' } },
94
- author: { data: nil }
95
- }
96
- }, {
97
- id: '2',
98
- type: 'comments',
99
- attributes: {
100
- body: 'ZOMG ANOTHER COMMENT'
101
- },
102
- relationships: {
103
- post: { data: { type: 'posts', id: '10' } },
104
- author: { data: nil }
105
- }
106
- }, {
107
- id: '1',
108
- type: 'authors',
109
- attributes: {
110
- name: 'Steve K.'
111
- },
112
- relationships: {
113
- posts: { data: [{ type: 'posts', id: '10' }, { type: 'posts', id: '30' }] },
114
- roles: { data: [] },
115
- bio: { data: { type: 'bios', id: '1' } }
116
- }
117
- }, {
118
- id: '1',
119
- type: 'bios',
120
- attributes: {
121
- content: 'AMS Contributor',
122
- rating: nil
123
- },
124
- relationships: {
125
- author: { data: { type: 'authors', id: '1' } }
126
- }
127
- }, {
128
- id: '2',
129
- type: 'authors',
130
- attributes: {
131
- name: 'Tenderlove'
132
- },
133
- relationships: {
134
- posts: { data: [{ type: 'posts', id: '20' }] },
135
- roles: { data: [] },
136
- bio: { data: { type: 'bios', id: '2' } }
137
- }
138
- }, {
139
- id: '2',
140
- type: 'bios',
141
- attributes: {
142
- rating: nil,
143
- content: 'Rails Contributor'
144
- },
145
- relationships: {
146
- author: { data: { type: 'authors', id: '2' } }
147
- }
148
- }
149
- ]
150
- }
151
- assert_equal expected, adapter.serializable_hash
152
- assert_equal expected, alt_adapter.serializable_hash
153
- end
154
-
155
- def test_include_multiple_posts_and_linked
156
- serializer = BioSerializer.new @bio1
157
- adapter = ActiveModelSerializers::Adapter::JsonApi.new(
158
- serializer,
159
- include: [author: [:posts]]
160
- )
161
- alt_adapter = ActiveModelSerializers::Adapter::JsonApi.new(
162
- serializer,
163
- include: [author: [:posts]]
164
- )
165
-
166
- expected = [
167
- {
168
- id: '1',
169
- type: 'authors',
170
- attributes: {
171
- name: 'Steve K.'
172
- },
173
- relationships: {
174
- posts: { data: [{ type: 'posts', id: '10' }, { type: 'posts', id: '30' }] },
175
- roles: { data: [] },
176
- bio: { data: { type: 'bios', id: '1' } }
177
- }
178
- }, {
179
- id: '10',
180
- type: 'posts',
181
- attributes: {
182
- title: 'Hello!!',
183
- body: 'Hello, world!!'
184
- },
185
- relationships: {
186
- comments: { data: [{ type: 'comments', id: '1' }, { type: 'comments', id: '2' }] },
187
- blog: { data: { type: 'blogs', id: '999' } },
188
- author: { data: { type: 'authors', id: '1' } }
189
- }
190
- }, {
191
- id: '30',
192
- type: 'posts',
193
- attributes: {
194
- title: 'Yet Another Post',
195
- body: 'Body'
196
- },
197
- relationships: {
198
- comments: { data: [] },
199
- blog: { data: { type: 'blogs', id: '999' } },
200
- author: { data: { type: 'authors', id: '1' } }
201
- }
202
- }
203
- ]
204
-
205
- assert_equal expected, adapter.serializable_hash[:included]
206
- assert_equal expected, alt_adapter.serializable_hash[:included]
207
- end
208
-
209
- def test_underscore_model_namespace_for_linked_resource_type
210
- spammy_post = Post.new(id: 123)
211
- spammy_post.related = [Spam::UnrelatedLink.new(id: 456)]
212
- serializer = SpammyPostSerializer.new(spammy_post)
213
- adapter = ActiveModelSerializers::Adapter::JsonApi.new(serializer)
214
- relationships = adapter.serializable_hash[:data][:relationships]
215
- expected = {
216
- related: {
217
- data: [{
218
- type: 'spam-unrelated-links',
219
- id: '456'
220
- }]
221
- }
222
- }
223
- assert_equal expected, relationships
224
- end
225
-
226
- def test_underscore_model_namespace_with_namespace_separator_for_linked_resource_type
227
- spammy_post = Post.new(id: 123)
228
- spammy_post.related = [Spam::UnrelatedLink.new(id: 456)]
229
- serializer = SpammyPostSerializer.new(spammy_post)
230
- adapter = ActiveModelSerializers::Adapter::JsonApi.new(serializer)
231
- relationships = with_namespace_separator '--' do
232
- adapter.serializable_hash[:data][:relationships]
233
- end
234
- expected = {
235
- related: {
236
- data: [{
237
- type: 'spam--unrelated-links',
238
- id: '456'
239
- }]
240
- }
241
- }
242
- assert_equal expected, relationships
243
- end
244
-
245
- def test_multiple_references_to_same_resource
246
- serializer = ActiveModel::Serializer::CollectionSerializer.new([@first_comment, @second_comment])
247
- adapter = ActiveModelSerializers::Adapter::JsonApi.new(
248
- serializer,
249
- include: [:post]
250
- )
251
-
252
- expected = [
253
- {
254
- id: '10',
255
- type: 'posts',
256
- attributes: {
257
- title: 'Hello!!',
258
- body: 'Hello, world!!'
259
- },
260
- relationships: {
261
- comments: {
262
- data: [{ type: 'comments', id: '1' }, { type: 'comments', id: '2' }]
263
- },
264
- blog: {
265
- data: { type: 'blogs', id: '999' }
266
- },
267
- author: {
268
- data: { type: 'authors', id: '1' }
269
- }
270
- }
271
- }
272
- ]
273
-
274
- assert_equal expected, adapter.serializable_hash[:included]
275
- end
276
-
277
- def test_nil_link_with_specified_serializer
278
- @first_post.author = nil
279
- serializer = PostPreviewSerializer.new(@first_post)
280
- adapter = ActiveModelSerializers::Adapter::JsonApi.new(
281
- serializer,
282
- include: [:author]
283
- )
284
-
285
- expected = {
286
- data: {
287
- id: '10',
288
- type: 'posts',
289
- attributes: {
290
- title: 'Hello!!',
291
- body: 'Hello, world!!'
292
- },
293
- relationships: {
294
- comments: { data: [{ type: 'comments', id: '1' }, { type: 'comments', id: '2' }] },
295
- author: { data: nil }
296
- }
297
- }
298
- }
299
- assert_equal expected, adapter.serializable_hash
300
- end
301
- end
302
-
303
- class NoDuplicatesTest < ActiveSupport::TestCase
304
- class Post < ::Model; associations :author end
305
- class Author < ::Model; associations :posts, :roles, :bio end
306
-
307
- class PostSerializer < ActiveModel::Serializer
308
- type 'posts'
309
- belongs_to :author
310
- end
311
-
312
- class AuthorSerializer < ActiveModel::Serializer
313
- type 'authors'
314
- has_many :posts
315
- end
316
-
317
- def setup
318
- @author = Author.new(id: 1, posts: [], roles: [], bio: nil)
319
- @post1 = Post.new(id: 1, author: @author)
320
- @post2 = Post.new(id: 2, author: @author)
321
- @author.posts << @post1
322
- @author.posts << @post2
323
-
324
- @nestedpost1 = NestedPost.new(id: 1, nested_posts: [])
325
- @nestedpost2 = NestedPost.new(id: 2, nested_posts: [])
326
- @nestedpost1.nested_posts << @nestedpost1
327
- @nestedpost1.nested_posts << @nestedpost2
328
- @nestedpost2.nested_posts << @nestedpost1
329
- @nestedpost2.nested_posts << @nestedpost2
330
- end
331
-
332
- def test_no_duplicates
333
- hash = ActiveModelSerializers::SerializableResource.new(@post1, adapter: :json_api,
334
- include: '*.*')
335
- .serializable_hash
336
- expected = [
337
- {
338
- type: 'authors', id: '1',
339
- relationships: {
340
- posts: {
341
- data: [
342
- { type: 'posts', id: '1' },
343
- { type: 'posts', id: '2' }
344
- ]
345
- }
346
- }
347
- },
348
- {
349
- type: 'posts', id: '2',
350
- relationships: {
351
- author: {
352
- data: { type: 'authors', id: '1' }
353
- }
354
- }
355
- }
356
- ]
357
- assert_equal(expected, hash[:included])
358
- end
359
-
360
- def test_no_duplicates_collection
361
- hash = ActiveModelSerializers::SerializableResource.new(
362
- [@post1, @post2],
363
- adapter: :json_api,
364
- include: '*.*'
365
- ).serializable_hash
366
- expected = [
367
- {
368
- type: 'authors', id: '1',
369
- relationships: {
370
- posts: {
371
- data: [
372
- { type: 'posts', id: '1' },
373
- { type: 'posts', id: '2' }
374
- ]
375
- }
376
- }
377
- }
378
- ]
379
- assert_equal(expected, hash[:included])
380
- end
381
-
382
- def test_no_duplicates_global
383
- hash = ActiveModelSerializers::SerializableResource.new(
384
- @nestedpost1,
385
- adapter: :json_api,
386
- include: '*'
387
- ).serializable_hash
388
- expected = [
389
- type: 'nested-posts', id: '2',
390
- relationships: {
391
- :"nested-posts" => {
392
- data: [
393
- { type: 'nested-posts', id: '1' },
394
- { type: 'nested-posts', id: '2' }
395
- ]
396
- }
397
- }
398
- ]
399
- assert_equal(expected, hash[:included])
400
- end
401
-
402
- def test_no_duplicates_collection_global
403
- hash = ActiveModelSerializers::SerializableResource.new(
404
- [@nestedpost1, @nestedpost2],
405
- adapter: :json_api,
406
- include: '*'
407
- ).serializable_hash
408
- assert_nil(hash[:included])
409
- end
410
- end
411
- end
412
- end
413
- end