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