active_model_serializers 0.10.3 → 0.10.12

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 (224) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +154 -2
  3. data/README.md +153 -15
  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.rb +275 -81
  7. data/lib/active_model/serializer/adapter.rb +2 -0
  8. data/lib/active_model/serializer/adapter/attributes.rb +2 -0
  9. data/lib/active_model/serializer/adapter/base.rb +2 -0
  10. data/lib/active_model/serializer/adapter/json.rb +2 -0
  11. data/lib/active_model/serializer/adapter/json_api.rb +2 -0
  12. data/lib/active_model/serializer/adapter/null.rb +2 -0
  13. data/lib/active_model/serializer/array_serializer.rb +2 -0
  14. data/lib/active_model/serializer/association.rb +53 -14
  15. data/lib/active_model/serializer/attribute.rb +2 -0
  16. data/lib/active_model/serializer/belongs_to_reflection.rb +7 -1
  17. data/lib/active_model/serializer/collection_serializer.rb +8 -5
  18. data/lib/active_model/serializer/concerns/caching.rb +36 -23
  19. data/lib/active_model/serializer/error_serializer.rb +2 -0
  20. data/lib/active_model/serializer/errors_serializer.rb +2 -0
  21. data/lib/active_model/serializer/field.rb +2 -0
  22. data/lib/active_model/serializer/fieldset.rb +3 -1
  23. data/lib/active_model/serializer/has_many_reflection.rb +6 -1
  24. data/lib/active_model/serializer/has_one_reflection.rb +3 -1
  25. data/lib/active_model/serializer/lazy_association.rb +99 -0
  26. data/lib/active_model/serializer/link.rb +23 -0
  27. data/lib/active_model/serializer/lint.rb +2 -0
  28. data/lib/active_model/serializer/null.rb +2 -0
  29. data/lib/active_model/serializer/reflection.rb +122 -73
  30. data/lib/active_model/serializer/version.rb +3 -1
  31. data/lib/active_model_serializers.rb +29 -11
  32. data/lib/active_model_serializers/adapter.rb +3 -1
  33. data/lib/active_model_serializers/adapter/attributes.rb +23 -0
  34. data/lib/active_model_serializers/adapter/base.rb +4 -2
  35. data/lib/active_model_serializers/adapter/json.rb +2 -0
  36. data/lib/active_model_serializers/adapter/json_api.rb +44 -26
  37. data/lib/active_model_serializers/adapter/json_api/deserialization.rb +4 -2
  38. data/lib/active_model_serializers/adapter/json_api/error.rb +2 -0
  39. data/lib/active_model_serializers/adapter/json_api/jsonapi.rb +2 -0
  40. data/lib/active_model_serializers/adapter/json_api/link.rb +2 -0
  41. data/lib/active_model_serializers/adapter/json_api/meta.rb +2 -0
  42. data/lib/active_model_serializers/adapter/json_api/pagination_links.rb +42 -21
  43. data/lib/active_model_serializers/adapter/json_api/relationship.rb +52 -9
  44. data/lib/active_model_serializers/adapter/json_api/resource_identifier.rb +35 -18
  45. data/lib/active_model_serializers/adapter/null.rb +2 -0
  46. data/lib/active_model_serializers/callbacks.rb +2 -0
  47. data/lib/active_model_serializers/deprecate.rb +2 -0
  48. data/lib/active_model_serializers/deserialization.rb +2 -0
  49. data/lib/active_model_serializers/json_pointer.rb +2 -0
  50. data/lib/active_model_serializers/logging.rb +2 -0
  51. data/lib/active_model_serializers/lookup_chain.rb +2 -0
  52. data/lib/active_model_serializers/model.rb +111 -30
  53. data/lib/active_model_serializers/model/caching.rb +25 -0
  54. data/lib/active_model_serializers/railtie.rb +4 -0
  55. data/lib/active_model_serializers/register_jsonapi_renderer.rb +2 -0
  56. data/lib/active_model_serializers/serializable_resource.rb +4 -2
  57. data/lib/active_model_serializers/serialization_context.rb +2 -0
  58. data/lib/active_model_serializers/test.rb +2 -0
  59. data/lib/active_model_serializers/test/schema.rb +4 -2
  60. data/lib/active_model_serializers/test/serializer.rb +2 -0
  61. data/lib/generators/rails/resource_override.rb +3 -1
  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 +55 -0
  67. metadata +74 -291
  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 -102
  72. data/.simplecov +0 -110
  73. data/.travis.yml +0 -51
  74. data/CODE_OF_CONDUCT.md +0 -74
  75. data/CONTRIBUTING.md +0 -105
  76. data/Gemfile +0 -56
  77. data/Rakefile +0 -103
  78. data/active_model_serializers.gemspec +0 -62
  79. data/appveyor.yml +0 -24
  80. data/bin/bench +0 -171
  81. data/bin/bench_regression +0 -316
  82. data/bin/serve_benchmark +0 -39
  83. data/docs/ARCHITECTURE.md +0 -125
  84. data/docs/README.md +0 -42
  85. data/docs/STYLE.md +0 -58
  86. data/docs/general/adapters.md +0 -247
  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 -14
  95. data/docs/general/rendering.md +0 -294
  96. data/docs/general/serializers.md +0 -461
  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 -137
  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 -65
  103. data/docs/howto/passing_arbitrary_options.md +0 -27
  104. data/docs/howto/serialize_poro.md +0 -32
  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 -144
  108. data/docs/integrations/grape.md +0 -19
  109. data/docs/jsonapi/errors.md +0 -56
  110. data/docs/jsonapi/schema.md +0 -151
  111. data/docs/jsonapi/schema/schema.json +0 -366
  112. data/docs/rfcs/0000-namespace.md +0 -106
  113. data/docs/rfcs/template.md +0 -15
  114. data/lib/active_model/serializer/collection_reflection.rb +0 -7
  115. data/lib/active_model/serializer/concerns/associations.rb +0 -102
  116. data/lib/active_model/serializer/concerns/attributes.rb +0 -82
  117. data/lib/active_model/serializer/concerns/configuration.rb +0 -59
  118. data/lib/active_model/serializer/concerns/links.rb +0 -35
  119. data/lib/active_model/serializer/concerns/meta.rb +0 -29
  120. data/lib/active_model/serializer/concerns/type.rb +0 -25
  121. data/lib/active_model/serializer/singular_reflection.rb +0 -7
  122. data/lib/active_model_serializers/key_transform.rb +0 -74
  123. data/test/action_controller/adapter_selector_test.rb +0 -53
  124. data/test/action_controller/explicit_serializer_test.rb +0 -135
  125. data/test/action_controller/json/include_test.rb +0 -246
  126. data/test/action_controller/json_api/deserialization_test.rb +0 -112
  127. data/test/action_controller/json_api/errors_test.rb +0 -40
  128. data/test/action_controller/json_api/fields_test.rb +0 -57
  129. data/test/action_controller/json_api/linked_test.rb +0 -202
  130. data/test/action_controller/json_api/pagination_test.rb +0 -116
  131. data/test/action_controller/json_api/transform_test.rb +0 -181
  132. data/test/action_controller/lookup_proc_test.rb +0 -49
  133. data/test/action_controller/namespace_lookup_test.rb +0 -226
  134. data/test/action_controller/serialization_scope_name_test.rb +0 -229
  135. data/test/action_controller/serialization_test.rb +0 -472
  136. data/test/active_model_serializers/adapter_for_test.rb +0 -208
  137. data/test/active_model_serializers/json_pointer_test.rb +0 -22
  138. data/test/active_model_serializers/key_transform_test.rb +0 -297
  139. data/test/active_model_serializers/logging_test.rb +0 -77
  140. data/test/active_model_serializers/model_test.rb +0 -22
  141. data/test/active_model_serializers/railtie_test_isolated.rb +0 -63
  142. data/test/active_model_serializers/register_jsonapi_renderer_test_isolated.rb +0 -143
  143. data/test/active_model_serializers/serialization_context_test_isolated.rb +0 -71
  144. data/test/active_model_serializers/test/schema_test.rb +0 -130
  145. data/test/active_model_serializers/test/serializer_test.rb +0 -62
  146. data/test/active_record_test.rb +0 -9
  147. data/test/adapter/attributes_test.rb +0 -43
  148. data/test/adapter/deprecation_test.rb +0 -100
  149. data/test/adapter/json/belongs_to_test.rb +0 -45
  150. data/test/adapter/json/collection_test.rb +0 -104
  151. data/test/adapter/json/has_many_test.rb +0 -45
  152. data/test/adapter/json/transform_test.rb +0 -93
  153. data/test/adapter/json_api/belongs_to_test.rb +0 -155
  154. data/test/adapter/json_api/collection_test.rb +0 -96
  155. data/test/adapter/json_api/errors_test.rb +0 -76
  156. data/test/adapter/json_api/fields_test.rb +0 -88
  157. data/test/adapter/json_api/has_many_embed_ids_test.rb +0 -43
  158. data/test/adapter/json_api/has_many_explicit_serializer_test.rb +0 -96
  159. data/test/adapter/json_api/has_many_test.rb +0 -165
  160. data/test/adapter/json_api/has_one_test.rb +0 -80
  161. data/test/adapter/json_api/include_data_if_sideloaded_test.rb +0 -166
  162. data/test/adapter/json_api/json_api_test.rb +0 -33
  163. data/test/adapter/json_api/linked_test.rb +0 -413
  164. data/test/adapter/json_api/links_test.rb +0 -95
  165. data/test/adapter/json_api/pagination_links_test.rb +0 -193
  166. data/test/adapter/json_api/parse_test.rb +0 -137
  167. data/test/adapter/json_api/relationship_test.rb +0 -397
  168. data/test/adapter/json_api/resource_identifier_test.rb +0 -110
  169. data/test/adapter/json_api/resource_meta_test.rb +0 -100
  170. data/test/adapter/json_api/toplevel_jsonapi_test.rb +0 -82
  171. data/test/adapter/json_api/transform_test.rb +0 -504
  172. data/test/adapter/json_api/type_test.rb +0 -61
  173. data/test/adapter/json_test.rb +0 -46
  174. data/test/adapter/null_test.rb +0 -22
  175. data/test/adapter/polymorphic_test.rb +0 -171
  176. data/test/adapter_test.rb +0 -67
  177. data/test/array_serializer_test.rb +0 -22
  178. data/test/benchmark/app.rb +0 -65
  179. data/test/benchmark/benchmarking_support.rb +0 -67
  180. data/test/benchmark/bm_active_record.rb +0 -81
  181. data/test/benchmark/bm_adapter.rb +0 -38
  182. data/test/benchmark/bm_caching.rb +0 -119
  183. data/test/benchmark/bm_lookup_chain.rb +0 -83
  184. data/test/benchmark/bm_transform.rb +0 -45
  185. data/test/benchmark/config.ru +0 -3
  186. data/test/benchmark/controllers.rb +0 -83
  187. data/test/benchmark/fixtures.rb +0 -219
  188. data/test/cache_test.rb +0 -579
  189. data/test/collection_serializer_test.rb +0 -110
  190. data/test/fixtures/active_record.rb +0 -78
  191. data/test/fixtures/poro.rb +0 -286
  192. data/test/generators/scaffold_controller_generator_test.rb +0 -24
  193. data/test/generators/serializer_generator_test.rb +0 -74
  194. data/test/grape_test.rb +0 -178
  195. data/test/lint_test.rb +0 -49
  196. data/test/logger_test.rb +0 -20
  197. data/test/poro_test.rb +0 -9
  198. data/test/serializable_resource_test.rb +0 -79
  199. data/test/serializers/association_macros_test.rb +0 -37
  200. data/test/serializers/associations_test.rb +0 -370
  201. data/test/serializers/attribute_test.rb +0 -151
  202. data/test/serializers/attributes_test.rb +0 -52
  203. data/test/serializers/caching_configuration_test_isolated.rb +0 -170
  204. data/test/serializers/configuration_test.rb +0 -32
  205. data/test/serializers/fieldset_test.rb +0 -14
  206. data/test/serializers/meta_test.rb +0 -202
  207. data/test/serializers/options_test.rb +0 -21
  208. data/test/serializers/read_attribute_for_serialization_test.rb +0 -79
  209. data/test/serializers/root_test.rb +0 -21
  210. data/test/serializers/serialization_test.rb +0 -55
  211. data/test/serializers/serializer_for_test.rb +0 -136
  212. data/test/serializers/serializer_for_with_namespace_test.rb +0 -87
  213. data/test/support/custom_schemas/active_model_serializers/test/schema_test/my/index.json +0 -6
  214. data/test/support/isolated_unit.rb +0 -82
  215. data/test/support/rails5_shims.rb +0 -53
  216. data/test/support/rails_app.rb +0 -36
  217. data/test/support/schemas/active_model_serializers/test/schema_test/my/index.json +0 -6
  218. data/test/support/schemas/active_model_serializers/test/schema_test/my/show.json +0 -6
  219. data/test/support/schemas/custom/show.json +0 -7
  220. data/test/support/schemas/hyper_schema.json +0 -93
  221. data/test/support/schemas/render_using_json_api.json +0 -43
  222. data/test/support/schemas/simple_json_pointers.json +0 -10
  223. data/test/support/serialization_testing.rb +0 -71
  224. data/test/test_helper.rb +0 -58
@@ -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; 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; end
305
- class Author < ::Model; 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
@@ -1,95 +0,0 @@
1
- require 'test_helper'
2
-
3
- module ActiveModelSerializers
4
- module Adapter
5
- class JsonApi
6
- class LinksTest < ActiveSupport::TestCase
7
- class LinkAuthor < ::Model; end
8
- class LinkAuthorSerializer < ActiveModel::Serializer
9
- link :self do
10
- href "http://example.com/link_author/#{object.id}"
11
- meta stuff: 'value'
12
- end
13
- link(:author) { link_author_url(object.id) }
14
- link(:link_authors) { url_for(controller: 'link_authors', action: 'index', only_path: false) }
15
- link(:posts) { link_author_posts_url(object.id) }
16
- link :resource, 'http://example.com/resource'
17
- link :yet_another do
18
- "http://example.com/resource/#{object.id}"
19
- end
20
- link(:nil) { nil }
21
- end
22
-
23
- def setup
24
- Rails.application.routes.draw do
25
- resources :link_authors do
26
- resources :posts
27
- end
28
- end
29
- @post = Post.new(id: 1337, comments: [], author: nil)
30
- @author = LinkAuthor.new(id: 1337, posts: [@post])
31
- end
32
-
33
- def test_toplevel_links
34
- hash = ActiveModelSerializers::SerializableResource.new(
35
- @post,
36
- adapter: :json_api,
37
- links: {
38
- self: {
39
- href: 'http://example.com/posts',
40
- meta: {
41
- stuff: 'value'
42
- }
43
- }
44
- }
45
- ).serializable_hash
46
- expected = {
47
- self: {
48
- href: 'http://example.com/posts',
49
- meta: {
50
- stuff: 'value'
51
- }
52
- }
53
- }
54
- assert_equal(expected, hash[:links])
55
- end
56
-
57
- def test_nil_toplevel_links
58
- hash = ActiveModelSerializers::SerializableResource.new(
59
- @post,
60
- adapter: :json_api,
61
- links: nil
62
- ).serializable_hash
63
- refute hash.key?(:links), 'No links key to be output'
64
- end
65
-
66
- def test_nil_toplevel_links_json_adapter
67
- hash = ActiveModelSerializers::SerializableResource.new(
68
- @post,
69
- adapter: :json,
70
- links: nil
71
- ).serializable_hash
72
- refute hash.key?(:links), 'No links key to be output'
73
- end
74
-
75
- def test_resource_links
76
- hash = serializable(@author, adapter: :json_api).serializable_hash
77
- expected = {
78
- self: {
79
- href: 'http://example.com/link_author/1337',
80
- meta: {
81
- stuff: 'value'
82
- }
83
- },
84
- author: 'http://example.com/link_authors/1337',
85
- :"link-authors" => 'http://example.com/link_authors',
86
- resource: 'http://example.com/resource',
87
- posts: 'http://example.com/link_authors/1337/posts',
88
- :"yet-another" => 'http://example.com/resource/1337'
89
- }
90
- assert_equal(expected, hash[:data][:links])
91
- end
92
- end
93
- end
94
- end
95
- end