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