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,96 +0,0 @@
1
- require 'test_helper'
2
-
3
- module ActiveModelSerializers
4
- module Adapter
5
- class JsonApi
6
- # Test 'has_many :assocs, serializer: AssocXSerializer'
7
- class HasManyExplicitSerializerTest < ActiveSupport::TestCase
8
- def setup
9
- @post = Post.new(title: 'New Post', body: 'Body')
10
- @author = Author.new(name: 'Jane Blogger')
11
- @author.posts = [@post]
12
- @post.author = @author
13
- @first_comment = Comment.new(id: 1, body: 'ZOMG A COMMENT')
14
- @second_comment = Comment.new(id: 2, body: 'ZOMG ANOTHER COMMENT')
15
- @post.comments = [@first_comment, @second_comment]
16
- @first_comment.post = @post
17
- @first_comment.author = nil
18
- @second_comment.post = @post
19
- @second_comment.author = nil
20
- @blog = Blog.new(id: 23, name: 'AMS Blog')
21
- @post.blog = @blog
22
-
23
- @serializer = PostPreviewSerializer.new(@post)
24
- @adapter = ActiveModelSerializers::Adapter::JsonApi.new(
25
- @serializer,
26
- include: [:comments, :author]
27
- )
28
- end
29
-
30
- def test_includes_comment_ids
31
- expected = {
32
- data: [
33
- { type: 'comments', id: '1' },
34
- { type: 'comments', id: '2' }
35
- ]
36
- }
37
-
38
- assert_equal(expected, @adapter.serializable_hash[:data][:relationships][:comments])
39
- end
40
-
41
- def test_includes_linked_data
42
- # If CommentPreviewSerializer is applied correctly the body text will not be present in the output
43
- expected = [
44
- {
45
- id: '1',
46
- type: 'comments',
47
- relationships: {
48
- post: { data: { type: 'posts', id: @post.id.to_s } }
49
- }
50
- },
51
- {
52
- id: '2',
53
- type: 'comments',
54
- relationships: {
55
- post: { data: { type: 'posts', id: @post.id.to_s } }
56
- }
57
- },
58
- {
59
- id: @author.id.to_s,
60
- type: 'authors',
61
- relationships: {
62
- posts: { data: [{ type: 'posts', id: @post.id.to_s }] }
63
- }
64
- }
65
- ]
66
-
67
- assert_equal(expected, @adapter.serializable_hash[:included])
68
- end
69
-
70
- def test_includes_author_id
71
- expected = {
72
- data: { type: 'authors', id: @author.id.to_s }
73
- }
74
-
75
- assert_equal(expected, @adapter.serializable_hash[:data][:relationships][:author])
76
- end
77
-
78
- def test_explicit_serializer_with_null_resource
79
- @post.author = nil
80
-
81
- expected = { data: nil }
82
-
83
- assert_equal(expected, @adapter.serializable_hash[:data][:relationships][:author])
84
- end
85
-
86
- def test_explicit_serializer_with_null_collection
87
- @post.comments = []
88
-
89
- expected = { data: [] }
90
-
91
- assert_equal(expected, @adapter.serializable_hash[:data][:relationships][:comments])
92
- end
93
- end
94
- end
95
- end
96
- end
@@ -1,165 +0,0 @@
1
- require 'test_helper'
2
-
3
- module ActiveModelSerializers
4
- module Adapter
5
- class JsonApi
6
- class HasManyTest < ActiveSupport::TestCase
7
- def setup
8
- ActionController::Base.cache_store.clear
9
- @author = Author.new(id: 1, name: 'Steve K.')
10
- @author.posts = []
11
- @author.bio = nil
12
- @post = Post.new(id: 1, title: 'New Post', body: 'Body')
13
- @post_without_comments = Post.new(id: 2, title: 'Second Post', body: 'Second')
14
- @first_comment = Comment.new(id: 1, body: 'ZOMG A COMMENT')
15
- @first_comment.author = nil
16
- @second_comment = Comment.new(id: 2, body: 'ZOMG ANOTHER COMMENT')
17
- @second_comment.author = nil
18
- @post.comments = [@first_comment, @second_comment]
19
- @post_without_comments.comments = []
20
- @first_comment.post = @post
21
- @second_comment.post = @post
22
- @post.author = @author
23
- @post_without_comments.author = nil
24
- @blog = Blog.new(id: 1, name: 'My Blog!!')
25
- @blog.writer = @author
26
- @blog.articles = [@post]
27
- @post.blog = @blog
28
- @post_without_comments.blog = nil
29
- @tag = Tag.new(id: 1, name: '#hash_tag')
30
- @post.tags = [@tag]
31
- @serializer = PostSerializer.new(@post)
32
- @adapter = ActiveModelSerializers::Adapter::JsonApi.new(@serializer)
33
-
34
- @virtual_value = VirtualValue.new(id: 1)
35
- end
36
-
37
- def test_includes_comment_ids
38
- expected = { data: [{ type: 'comments', id: '1' }, { type: 'comments', id: '2' }] }
39
-
40
- assert_equal(expected, @adapter.serializable_hash[:data][:relationships][:comments])
41
- end
42
-
43
- test 'relationships can be whitelisted via fields' do
44
- @adapter = ActiveModelSerializers::Adapter::JsonApi.new(@serializer, fields: { posts: [:author] })
45
- result = @adapter.serializable_hash
46
- expected = {
47
- data: {
48
- id: '1',
49
- type: 'posts',
50
- relationships: {
51
- author: {
52
- data: {
53
- id: '1',
54
- type: 'authors'
55
- }
56
- }
57
- }
58
- }
59
- }
60
-
61
- assert_equal expected, result
62
- end
63
-
64
- def test_includes_linked_comments
65
- @adapter = ActiveModelSerializers::Adapter::JsonApi.new(@serializer, include: [:comments])
66
- expected = [{
67
- id: '1',
68
- type: 'comments',
69
- attributes: {
70
- body: 'ZOMG A COMMENT'
71
- },
72
- relationships: {
73
- post: { data: { type: 'posts', id: '1' } },
74
- author: { data: nil }
75
- }
76
- }, {
77
- id: '2',
78
- type: 'comments',
79
- attributes: {
80
- body: 'ZOMG ANOTHER COMMENT'
81
- },
82
- relationships: {
83
- post: { data: { type: 'posts', id: '1' } },
84
- author: { data: nil }
85
- }
86
- }]
87
- assert_equal expected, @adapter.serializable_hash[:included]
88
- end
89
-
90
- def test_limit_fields_of_linked_comments
91
- @adapter = ActiveModelSerializers::Adapter::JsonApi.new(@serializer, include: [:comments], fields: { comment: [:id, :post, :author] })
92
- expected = [{
93
- id: '1',
94
- type: 'comments',
95
- relationships: {
96
- post: { data: { type: 'posts', id: '1' } },
97
- author: { data: nil }
98
- }
99
- }, {
100
- id: '2',
101
- type: 'comments',
102
- relationships: {
103
- post: { data: { type: 'posts', id: '1' } },
104
- author: { data: nil }
105
- }
106
- }]
107
- assert_equal expected, @adapter.serializable_hash[:included]
108
- end
109
-
110
- def test_no_include_linked_if_comments_is_empty
111
- serializer = PostSerializer.new(@post_without_comments)
112
- adapter = ActiveModelSerializers::Adapter::JsonApi.new(serializer)
113
-
114
- assert_nil adapter.serializable_hash[:linked]
115
- end
116
-
117
- def test_include_type_for_association_when_different_than_name
118
- serializer = BlogSerializer.new(@blog)
119
- adapter = ActiveModelSerializers::Adapter::JsonApi.new(serializer)
120
- actual = adapter.serializable_hash[:data][:relationships][:articles]
121
-
122
- expected = {
123
- data: [{
124
- type: 'posts',
125
- id: '1'
126
- }]
127
- }
128
- assert_equal expected, actual
129
- end
130
-
131
- def test_has_many_with_no_serializer
132
- serializer = PostWithTagsSerializer.new(@post)
133
- adapter = ActiveModelSerializers::Adapter::JsonApi.new(serializer)
134
-
135
- assert_equal({
136
- data: {
137
- id: '1',
138
- type: 'posts',
139
- relationships: {
140
- tags: { data: [@tag.as_json] }
141
- }
142
- }
143
- }, adapter.serializable_hash)
144
- end
145
-
146
- def test_has_many_with_virtual_value
147
- serializer = VirtualValueSerializer.new(@virtual_value)
148
- adapter = ActiveModelSerializers::Adapter::JsonApi.new(serializer)
149
-
150
- assert_equal({
151
- data: {
152
- id: '1',
153
- type: 'virtual-values',
154
- relationships: {
155
- maker: { data: { type: 'makers', id: '1' } },
156
- reviews: { data: [{ type: 'reviews', id: '1' },
157
- { type: 'reviews', id: '2' }] }
158
- }
159
- }
160
- }, adapter.serializable_hash)
161
- end
162
- end
163
- end
164
- end
165
- end
@@ -1,80 +0,0 @@
1
- require 'test_helper'
2
-
3
- module ActiveModelSerializers
4
- module Adapter
5
- class JsonApi
6
- class HasOneTest < ActiveSupport::TestCase
7
- def setup
8
- @author = Author.new(id: 1, name: 'Steve K.')
9
- @bio = Bio.new(id: 43, content: 'AMS Contributor')
10
- @author.bio = @bio
11
- @bio.author = @author
12
- @post = Post.new(id: 42, title: 'New Post', body: 'Body')
13
- @anonymous_post = Post.new(id: 43, title: 'Hello!!', body: 'Hello, world!!')
14
- @comment = Comment.new(id: 1, body: 'ZOMG A COMMENT')
15
- @post.comments = [@comment]
16
- @anonymous_post.comments = []
17
- @comment.post = @post
18
- @comment.author = nil
19
- @post.author = @author
20
- @anonymous_post.author = nil
21
- @blog = Blog.new(id: 1, name: 'My Blog!!')
22
- @blog.writer = @author
23
- @blog.articles = [@post, @anonymous_post]
24
- @author.posts = []
25
- @author.roles = []
26
-
27
- @virtual_value = VirtualValue.new(id: 1)
28
-
29
- @serializer = AuthorSerializer.new(@author)
30
- @adapter = ActiveModelSerializers::Adapter::JsonApi.new(@serializer, include: [:bio, :posts])
31
- end
32
-
33
- def test_includes_bio_id
34
- expected = { data: { type: 'bios', id: '43' } }
35
-
36
- assert_equal(expected, @adapter.serializable_hash[:data][:relationships][:bio])
37
- end
38
-
39
- def test_includes_linked_bio
40
- @adapter = ActiveModelSerializers::Adapter::JsonApi.new(@serializer, include: [:bio])
41
-
42
- expected = [
43
- {
44
- id: '43',
45
- type: 'bios',
46
- attributes: {
47
- content: 'AMS Contributor',
48
- rating: nil
49
- },
50
- relationships: {
51
- author: { data: { type: 'authors', id: '1' } }
52
- }
53
- }
54
- ]
55
-
56
- assert_equal(expected, @adapter.serializable_hash[:included])
57
- end
58
-
59
- def test_has_one_with_virtual_value
60
- serializer = VirtualValueSerializer.new(@virtual_value)
61
- adapter = ActiveModelSerializers::Adapter::JsonApi.new(serializer)
62
-
63
- expected = {
64
- data: {
65
- id: '1',
66
- type: 'virtual-values',
67
- relationships: {
68
- maker: { data: { type: 'makers', id: '1' } },
69
- reviews: { data: [{ type: 'reviews', id: '1' },
70
- { type: 'reviews', id: '2' }] }
71
- }
72
- }
73
- }
74
-
75
- assert_equal(expected, adapter.serializable_hash)
76
- end
77
- end
78
- end
79
- end
80
- end
@@ -1,166 +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)
9
-
10
- class CustomCommentLoader
11
- def all
12
- [{ foo: 'bar' }]
13
- end
14
- end
15
-
16
- class TagSerializer < ActiveModel::Serializer
17
- attributes :id, :name
18
- end
19
-
20
- class IncludeParamAuthorSerializer < ActiveModel::Serializer
21
- class_attribute :comment_loader
22
-
23
- has_many :tags, serializer: TagSerializer do
24
- link :self, '//example.com/link_author/relationships/tags'
25
- include_data :if_sideloaded
26
- end
27
-
28
- has_many :unlinked_tags, serializer: TagSerializer do
29
- include_data :if_sideloaded
30
- end
31
-
32
- has_many :posts, serializer: PostWithTagsSerializer do
33
- include_data :if_sideloaded
34
- end
35
- has_many :locations do
36
- include_data :if_sideloaded
37
- end
38
- has_many :comments do
39
- include_data :if_sideloaded
40
- IncludeParamAuthorSerializer.comment_loader.all
41
- end
42
- end
43
-
44
- def setup
45
- IncludeParamAuthorSerializer.comment_loader = Class.new(CustomCommentLoader).new
46
- @tag = Tag.new(id: 1337, name: 'mytag')
47
- @author = IncludeParamAuthor.new(
48
- id: 1337,
49
- tags: [@tag]
50
- )
51
- end
52
-
53
- def test_relationship_not_loaded_when_not_included
54
- expected = {
55
- links: {
56
- self: '//example.com/link_author/relationships/tags'
57
- }
58
- }
59
-
60
- @author.define_singleton_method(:read_attribute_for_serialization) do |attr|
61
- fail 'should not be called' if attr == :tags
62
- super(attr)
63
- end
64
-
65
- assert_relationship(:tags, expected)
66
- end
67
-
68
- def test_relationship_included
69
- expected = {
70
- data: [
71
- {
72
- id: '1337',
73
- type: 'tags'
74
- }
75
- ],
76
- links: {
77
- self: '//example.com/link_author/relationships/tags'
78
- }
79
- }
80
-
81
- assert_relationship(:tags, expected, include: :tags)
82
- end
83
-
84
- def test_sideloads_included
85
- expected = [
86
- {
87
- id: '1337',
88
- type: 'tags',
89
- attributes: { name: 'mytag' }
90
- }
91
- ]
92
- hash = result(include: :tags)
93
- assert_equal(expected, hash[:included])
94
- end
95
-
96
- def test_nested_relationship
97
- expected = {
98
- data: [
99
- {
100
- id: '1337',
101
- type: 'tags'
102
- }
103
- ],
104
- links: {
105
- self: '//example.com/link_author/relationships/tags'
106
- }
107
- }
108
-
109
- expected_no_data = {
110
- links: {
111
- self: '//example.com/link_author/relationships/tags'
112
- }
113
- }
114
-
115
- assert_relationship(:tags, expected, include: [:tags, { posts: :tags }])
116
-
117
- @author.define_singleton_method(:read_attribute_for_serialization) do |attr|
118
- fail 'should not be called' if attr == :tags
119
- super(attr)
120
- end
121
-
122
- assert_relationship(:tags, expected_no_data, include: { posts: :tags })
123
- end
124
-
125
- def test_include_params_with_no_block
126
- @author.define_singleton_method(:read_attribute_for_serialization) do |attr|
127
- fail 'should not be called' if attr == :locations
128
- super(attr)
129
- end
130
-
131
- expected = { meta: {} }
132
-
133
- assert_relationship(:locations, expected)
134
- end
135
-
136
- def test_block_relationship
137
- expected = {
138
- data: [
139
- { 'foo' => 'bar' }
140
- ]
141
- }
142
-
143
- assert_relationship(:comments, expected, include: [:comments])
144
- end
145
-
146
- def test_node_not_included_when_no_link
147
- expected = nil
148
- assert_relationship(:unlinked_tags, expected)
149
- end
150
-
151
- private
152
-
153
- def result(opts)
154
- opts = { adapter: :json_api }.merge(opts)
155
- serializable(@author, opts).serializable_hash
156
- end
157
-
158
- def assert_relationship(relationship_name, expected, opts = {})
159
- hash = result(opts)
160
- assert_equal(expected, hash[:data][:relationships][relationship_name])
161
- end
162
- end
163
- end
164
- end
165
- end
166
- end