active_model_serializers_custom 0.10.90

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 +7 -0
  2. data/.github/ISSUE_TEMPLATE.md +29 -0
  3. data/.github/PULL_REQUEST_TEMPLATE.md +15 -0
  4. data/.gitignore +35 -0
  5. data/.rubocop.yml +109 -0
  6. data/.simplecov +110 -0
  7. data/.travis.yml +63 -0
  8. data/CHANGELOG.md +727 -0
  9. data/CODE_OF_CONDUCT.md +74 -0
  10. data/CONTRIBUTING.md +105 -0
  11. data/Gemfile +74 -0
  12. data/MIT-LICENSE +22 -0
  13. data/README.md +305 -0
  14. data/Rakefile +76 -0
  15. data/active_model_serializers.gemspec +64 -0
  16. data/appveyor.yml +28 -0
  17. data/bin/bench +171 -0
  18. data/bin/bench_regression +316 -0
  19. data/bin/rubocop +38 -0
  20. data/bin/serve_benchmark +39 -0
  21. data/docs/README.md +41 -0
  22. data/docs/STYLE.md +58 -0
  23. data/docs/general/adapters.md +269 -0
  24. data/docs/general/caching.md +58 -0
  25. data/docs/general/configuration_options.md +185 -0
  26. data/docs/general/deserialization.md +100 -0
  27. data/docs/general/fields.md +31 -0
  28. data/docs/general/getting_started.md +133 -0
  29. data/docs/general/instrumentation.md +40 -0
  30. data/docs/general/key_transforms.md +40 -0
  31. data/docs/general/logging.md +21 -0
  32. data/docs/general/rendering.md +293 -0
  33. data/docs/general/serializers.md +495 -0
  34. data/docs/how-open-source-maintained.jpg +0 -0
  35. data/docs/howto/add_pagination_links.md +138 -0
  36. data/docs/howto/add_relationship_links.md +140 -0
  37. data/docs/howto/add_root_key.md +62 -0
  38. data/docs/howto/grape_integration.md +42 -0
  39. data/docs/howto/outside_controller_use.md +66 -0
  40. data/docs/howto/passing_arbitrary_options.md +27 -0
  41. data/docs/howto/serialize_poro.md +73 -0
  42. data/docs/howto/test.md +154 -0
  43. data/docs/howto/upgrade_from_0_8_to_0_10.md +265 -0
  44. data/docs/integrations/ember-and-json-api.md +147 -0
  45. data/docs/integrations/grape.md +19 -0
  46. data/docs/jsonapi/errors.md +56 -0
  47. data/docs/jsonapi/schema.md +151 -0
  48. data/docs/jsonapi/schema/schema.json +366 -0
  49. data/docs/rfcs/0000-namespace.md +106 -0
  50. data/docs/rfcs/template.md +15 -0
  51. data/lib/action_controller/serialization.rb +76 -0
  52. data/lib/active_model/serializable_resource.rb +13 -0
  53. data/lib/active_model/serializer.rb +418 -0
  54. data/lib/active_model/serializer/adapter.rb +26 -0
  55. data/lib/active_model/serializer/adapter/attributes.rb +17 -0
  56. data/lib/active_model/serializer/adapter/base.rb +20 -0
  57. data/lib/active_model/serializer/adapter/json.rb +17 -0
  58. data/lib/active_model/serializer/adapter/json_api.rb +17 -0
  59. data/lib/active_model/serializer/adapter/null.rb +17 -0
  60. data/lib/active_model/serializer/array_serializer.rb +14 -0
  61. data/lib/active_model/serializer/association.rb +91 -0
  62. data/lib/active_model/serializer/attribute.rb +27 -0
  63. data/lib/active_model/serializer/belongs_to_reflection.rb +13 -0
  64. data/lib/active_model/serializer/collection_serializer.rb +90 -0
  65. data/lib/active_model/serializer/concerns/caching.rb +304 -0
  66. data/lib/active_model/serializer/error_serializer.rb +16 -0
  67. data/lib/active_model/serializer/errors_serializer.rb +34 -0
  68. data/lib/active_model/serializer/field.rb +92 -0
  69. data/lib/active_model/serializer/fieldset.rb +33 -0
  70. data/lib/active_model/serializer/has_many_reflection.rb +12 -0
  71. data/lib/active_model/serializer/has_one_reflection.rb +9 -0
  72. data/lib/active_model/serializer/lazy_association.rb +99 -0
  73. data/lib/active_model/serializer/link.rb +23 -0
  74. data/lib/active_model/serializer/lint.rb +152 -0
  75. data/lib/active_model/serializer/null.rb +19 -0
  76. data/lib/active_model/serializer/reflection.rb +212 -0
  77. data/lib/active_model/serializer/version.rb +7 -0
  78. data/lib/active_model_serializers.rb +63 -0
  79. data/lib/active_model_serializers/adapter.rb +100 -0
  80. data/lib/active_model_serializers/adapter/attributes.rb +15 -0
  81. data/lib/active_model_serializers/adapter/base.rb +85 -0
  82. data/lib/active_model_serializers/adapter/json.rb +23 -0
  83. data/lib/active_model_serializers/adapter/json_api.rb +535 -0
  84. data/lib/active_model_serializers/adapter/json_api/deserialization.rb +215 -0
  85. data/lib/active_model_serializers/adapter/json_api/error.rb +98 -0
  86. data/lib/active_model_serializers/adapter/json_api/jsonapi.rb +51 -0
  87. data/lib/active_model_serializers/adapter/json_api/link.rb +85 -0
  88. data/lib/active_model_serializers/adapter/json_api/meta.rb +39 -0
  89. data/lib/active_model_serializers/adapter/json_api/pagination_links.rb +90 -0
  90. data/lib/active_model_serializers/adapter/json_api/relationship.rb +106 -0
  91. data/lib/active_model_serializers/adapter/json_api/resource_identifier.rb +68 -0
  92. data/lib/active_model_serializers/adapter/null.rb +11 -0
  93. data/lib/active_model_serializers/callbacks.rb +57 -0
  94. data/lib/active_model_serializers/deprecate.rb +56 -0
  95. data/lib/active_model_serializers/deserialization.rb +17 -0
  96. data/lib/active_model_serializers/json_pointer.rb +16 -0
  97. data/lib/active_model_serializers/logging.rb +124 -0
  98. data/lib/active_model_serializers/lookup_chain.rb +82 -0
  99. data/lib/active_model_serializers/model.rb +132 -0
  100. data/lib/active_model_serializers/railtie.rb +52 -0
  101. data/lib/active_model_serializers/register_jsonapi_renderer.rb +80 -0
  102. data/lib/active_model_serializers/serializable_resource.rb +84 -0
  103. data/lib/active_model_serializers/serialization_context.rb +41 -0
  104. data/lib/active_model_serializers/test.rb +9 -0
  105. data/lib/active_model_serializers/test/schema.rb +140 -0
  106. data/lib/active_model_serializers/test/serializer.rb +127 -0
  107. data/lib/generators/rails/USAGE +6 -0
  108. data/lib/generators/rails/resource_override.rb +12 -0
  109. data/lib/generators/rails/serializer_generator.rb +38 -0
  110. data/lib/generators/rails/templates/serializer.rb.erb +8 -0
  111. data/lib/grape/active_model_serializers.rb +18 -0
  112. data/lib/grape/formatters/active_model_serializers.rb +34 -0
  113. data/lib/grape/helpers/active_model_serializers.rb +19 -0
  114. data/lib/tasks/rubocop.rake +55 -0
  115. data/test/action_controller/adapter_selector_test.rb +64 -0
  116. data/test/action_controller/explicit_serializer_test.rb +137 -0
  117. data/test/action_controller/json/include_test.rb +248 -0
  118. data/test/action_controller/json_api/deserialization_test.rb +114 -0
  119. data/test/action_controller/json_api/errors_test.rb +42 -0
  120. data/test/action_controller/json_api/fields_test.rb +68 -0
  121. data/test/action_controller/json_api/linked_test.rb +204 -0
  122. data/test/action_controller/json_api/pagination_test.rb +126 -0
  123. data/test/action_controller/json_api/transform_test.rb +191 -0
  124. data/test/action_controller/lookup_proc_test.rb +51 -0
  125. data/test/action_controller/namespace_lookup_test.rb +239 -0
  126. data/test/action_controller/serialization_scope_name_test.rb +237 -0
  127. data/test/action_controller/serialization_test.rb +480 -0
  128. data/test/active_model_serializers/adapter_for_test.rb +210 -0
  129. data/test/active_model_serializers/json_pointer_test.rb +24 -0
  130. data/test/active_model_serializers/logging_test.rb +79 -0
  131. data/test/active_model_serializers/model_test.rb +144 -0
  132. data/test/active_model_serializers/railtie_test_isolated.rb +70 -0
  133. data/test/active_model_serializers/register_jsonapi_renderer_test_isolated.rb +163 -0
  134. data/test/active_model_serializers/serialization_context_test_isolated.rb +73 -0
  135. data/test/active_model_serializers/test/schema_test.rb +133 -0
  136. data/test/active_model_serializers/test/serializer_test.rb +64 -0
  137. data/test/active_record_test.rb +11 -0
  138. data/test/adapter/attributes_test.rb +42 -0
  139. data/test/adapter/deprecation_test.rb +102 -0
  140. data/test/adapter/json/belongs_to_test.rb +47 -0
  141. data/test/adapter/json/collection_test.rb +106 -0
  142. data/test/adapter/json/has_many_test.rb +55 -0
  143. data/test/adapter/json/transform_test.rb +95 -0
  144. data/test/adapter/json_api/belongs_to_test.rb +157 -0
  145. data/test/adapter/json_api/collection_test.rb +98 -0
  146. data/test/adapter/json_api/errors_test.rb +78 -0
  147. data/test/adapter/json_api/fields_test.rb +98 -0
  148. data/test/adapter/json_api/has_many_explicit_serializer_test.rb +98 -0
  149. data/test/adapter/json_api/has_many_test.rb +175 -0
  150. data/test/adapter/json_api/has_one_test.rb +82 -0
  151. data/test/adapter/json_api/include_data_if_sideloaded_test.rb +215 -0
  152. data/test/adapter/json_api/json_api_test.rb +35 -0
  153. data/test/adapter/json_api/linked_test.rb +415 -0
  154. data/test/adapter/json_api/links_test.rb +112 -0
  155. data/test/adapter/json_api/pagination_links_test.rb +208 -0
  156. data/test/adapter/json_api/parse_test.rb +139 -0
  157. data/test/adapter/json_api/relationship_test.rb +399 -0
  158. data/test/adapter/json_api/resource_meta_test.rb +102 -0
  159. data/test/adapter/json_api/toplevel_jsonapi_test.rb +84 -0
  160. data/test/adapter/json_api/transform_test.rb +514 -0
  161. data/test/adapter/json_api/type_test.rb +195 -0
  162. data/test/adapter/json_test.rb +48 -0
  163. data/test/adapter/null_test.rb +24 -0
  164. data/test/adapter/polymorphic_test.rb +220 -0
  165. data/test/adapter_test.rb +69 -0
  166. data/test/array_serializer_test.rb +24 -0
  167. data/test/benchmark/app.rb +67 -0
  168. data/test/benchmark/benchmarking_support.rb +69 -0
  169. data/test/benchmark/bm_active_record.rb +83 -0
  170. data/test/benchmark/bm_adapter.rb +40 -0
  171. data/test/benchmark/bm_caching.rb +121 -0
  172. data/test/benchmark/bm_lookup_chain.rb +85 -0
  173. data/test/benchmark/bm_transform.rb +47 -0
  174. data/test/benchmark/config.ru +3 -0
  175. data/test/benchmark/controllers.rb +85 -0
  176. data/test/benchmark/fixtures.rb +221 -0
  177. data/test/cache_test.rb +717 -0
  178. data/test/collection_serializer_test.rb +129 -0
  179. data/test/fixtures/active_record.rb +115 -0
  180. data/test/fixtures/poro.rb +227 -0
  181. data/test/generators/scaffold_controller_generator_test.rb +26 -0
  182. data/test/generators/serializer_generator_test.rb +77 -0
  183. data/test/grape_test.rb +198 -0
  184. data/test/lint_test.rb +51 -0
  185. data/test/logger_test.rb +22 -0
  186. data/test/poro_test.rb +11 -0
  187. data/test/serializable_resource_test.rb +81 -0
  188. data/test/serializers/association_macros_test.rb +39 -0
  189. data/test/serializers/associations_test.rb +520 -0
  190. data/test/serializers/attribute_test.rb +155 -0
  191. data/test/serializers/attributes_test.rb +54 -0
  192. data/test/serializers/caching_configuration_test_isolated.rb +172 -0
  193. data/test/serializers/configuration_test.rb +34 -0
  194. data/test/serializers/fieldset_test.rb +16 -0
  195. data/test/serializers/meta_test.rb +204 -0
  196. data/test/serializers/options_test.rb +34 -0
  197. data/test/serializers/read_attribute_for_serialization_test.rb +81 -0
  198. data/test/serializers/reflection_test.rb +481 -0
  199. data/test/serializers/root_test.rb +23 -0
  200. data/test/serializers/serialization_test.rb +57 -0
  201. data/test/serializers/serializer_for_test.rb +138 -0
  202. data/test/serializers/serializer_for_with_namespace_test.rb +90 -0
  203. data/test/support/custom_schemas/active_model_serializers/test/schema_test/my/index.json +6 -0
  204. data/test/support/isolated_unit.rb +86 -0
  205. data/test/support/rails5_shims.rb +55 -0
  206. data/test/support/rails_app.rb +40 -0
  207. data/test/support/schemas/active_model_serializers/test/schema_test/my/index.json +6 -0
  208. data/test/support/schemas/active_model_serializers/test/schema_test/my/show.json +6 -0
  209. data/test/support/schemas/custom/show.json +7 -0
  210. data/test/support/schemas/hyper_schema.json +93 -0
  211. data/test/support/schemas/render_using_json_api.json +43 -0
  212. data/test/support/schemas/simple_json_pointers.json +10 -0
  213. data/test/support/serialization_testing.rb +81 -0
  214. data/test/test_helper.rb +72 -0
  215. metadata +622 -0
@@ -0,0 +1,157 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'test_helper'
4
+
5
+ module ActiveModelSerializers
6
+ module Adapter
7
+ class JsonApi
8
+ class BelongsToTest < ActiveSupport::TestCase
9
+ def setup
10
+ @author = Author.new(id: 1, name: 'Steve K.')
11
+ @author.bio = nil
12
+ @author.roles = []
13
+ @blog = Blog.new(id: 23, name: 'AMS Blog')
14
+ @post = Post.new(id: 42, title: 'New Post', body: 'Body')
15
+ @anonymous_post = Post.new(id: 43, title: 'Hello!!', body: 'Hello, world!!')
16
+ @comment = Comment.new(id: 1, body: 'ZOMG A COMMENT')
17
+ @post.comments = [@comment]
18
+ @post.blog = @blog
19
+ @anonymous_post.comments = []
20
+ @anonymous_post.blog = nil
21
+ @comment.post = @post
22
+ @comment.author = nil
23
+ @post.author = @author
24
+ @anonymous_post.author = nil
25
+ @blog = Blog.new(id: 1, name: 'My Blog!!')
26
+ @blog.writer = @author
27
+ @blog.articles = [@post, @anonymous_post]
28
+ @author.posts = []
29
+
30
+ @serializer = CommentSerializer.new(@comment)
31
+ @adapter = ActiveModelSerializers::Adapter::JsonApi.new(@serializer)
32
+ ActionController::Base.cache_store.clear
33
+ end
34
+
35
+ def test_includes_post_id
36
+ expected = { data: { type: 'posts', id: '42' } }
37
+
38
+ assert_equal(expected, @adapter.serializable_hash[:data][:relationships][:post])
39
+ end
40
+
41
+ def test_includes_linked_post
42
+ @adapter = ActiveModelSerializers::Adapter::JsonApi.new(@serializer, include: [:post])
43
+ expected = [{
44
+ id: '42',
45
+ type: 'posts',
46
+ attributes: {
47
+ title: 'New Post',
48
+ body: 'Body'
49
+ },
50
+ relationships: {
51
+ comments: { data: [{ type: 'comments', id: '1' }] },
52
+ blog: { data: { type: 'blogs', id: '999' } },
53
+ author: { data: { type: 'authors', id: '1' } }
54
+ }
55
+ }]
56
+ assert_equal expected, @adapter.serializable_hash[:included]
57
+ end
58
+
59
+ def test_limiting_linked_post_fields
60
+ @adapter = ActiveModelSerializers::Adapter::JsonApi.new(@serializer, include: [:post], fields: { post: [:title, :comments, :blog, :author] })
61
+ expected = [{
62
+ id: '42',
63
+ type: 'posts',
64
+ attributes: {
65
+ title: 'New Post'
66
+ },
67
+ relationships: {
68
+ comments: { data: [{ type: 'comments', id: '1' }] },
69
+ blog: { data: { type: 'blogs', id: '999' } },
70
+ author: { data: { type: 'authors', id: '1' } }
71
+ }
72
+ }]
73
+ assert_equal expected, @adapter.serializable_hash[:included]
74
+ end
75
+
76
+ def test_include_nil_author
77
+ serializer = PostSerializer.new(@anonymous_post)
78
+ adapter = ActiveModelSerializers::Adapter::JsonApi.new(serializer)
79
+
80
+ assert_equal({ comments: { data: [] }, blog: { data: { type: 'blogs', id: '999' } }, author: { data: nil } }, adapter.serializable_hash[:data][:relationships])
81
+ end
82
+
83
+ def test_include_type_for_association_when_different_than_name
84
+ serializer = BlogSerializer.new(@blog)
85
+ adapter = ActiveModelSerializers::Adapter::JsonApi.new(serializer)
86
+ relationships = adapter.serializable_hash[:data][:relationships]
87
+ expected = {
88
+ writer: {
89
+ data: {
90
+ type: 'authors',
91
+ id: '1'
92
+ }
93
+ },
94
+ articles: {
95
+ data: [
96
+ {
97
+ type: 'posts',
98
+ id: '42'
99
+ },
100
+ {
101
+ type: 'posts',
102
+ id: '43'
103
+ }
104
+ ]
105
+ }
106
+ }
107
+ assert_equal expected, relationships
108
+ end
109
+
110
+ def test_include_linked_resources_with_type_name
111
+ serializer = BlogSerializer.new(@blog)
112
+ adapter = ActiveModelSerializers::Adapter::JsonApi.new(serializer, include: [:writer, :articles])
113
+ linked = adapter.serializable_hash[:included]
114
+ expected = [
115
+ {
116
+ id: '1',
117
+ type: 'authors',
118
+ attributes: {
119
+ name: 'Steve K.'
120
+ },
121
+ relationships: {
122
+ posts: { data: [] },
123
+ roles: { data: [] },
124
+ bio: { data: nil }
125
+ }
126
+ }, {
127
+ id: '42',
128
+ type: 'posts',
129
+ attributes: {
130
+ title: 'New Post',
131
+ body: 'Body'
132
+ },
133
+ relationships: {
134
+ comments: { data: [{ type: 'comments', id: '1' }] },
135
+ blog: { data: { type: 'blogs', id: '999' } },
136
+ author: { data: { type: 'authors', id: '1' } }
137
+ }
138
+ }, {
139
+ id: '43',
140
+ type: 'posts',
141
+ attributes: {
142
+ title: 'Hello!!',
143
+ body: 'Hello, world!!'
144
+ },
145
+ relationships: {
146
+ comments: { data: [] },
147
+ blog: { data: { type: 'blogs', id: '999' } },
148
+ author: { data: nil }
149
+ }
150
+ }
151
+ ]
152
+ assert_equal expected, linked
153
+ end
154
+ end
155
+ end
156
+ end
157
+ end
@@ -0,0 +1,98 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'test_helper'
4
+
5
+ module ActiveModelSerializers
6
+ module Adapter
7
+ class JsonApi
8
+ class CollectionTest < ActiveSupport::TestCase
9
+ def setup
10
+ @author = Author.new(id: 1, name: 'Steve K.')
11
+ @author.bio = nil
12
+ @blog = Blog.new(id: 23, name: 'AMS Blog')
13
+ @first_post = Post.new(id: 1, title: 'Hello!!', body: 'Hello, world!!')
14
+ @second_post = Post.new(id: 2, title: 'New Post', body: 'Body')
15
+ @first_post.comments = []
16
+ @second_post.comments = []
17
+ @first_post.blog = @blog
18
+ @second_post.blog = nil
19
+ @first_post.author = @author
20
+ @second_post.author = @author
21
+ @author.posts = [@first_post, @second_post]
22
+
23
+ @serializer = ActiveModel::Serializer::CollectionSerializer.new([@first_post, @second_post])
24
+ @adapter = ActiveModelSerializers::Adapter::JsonApi.new(@serializer)
25
+ ActionController::Base.cache_store.clear
26
+ end
27
+
28
+ def test_include_multiple_posts
29
+ expected = [
30
+ {
31
+ id: '1',
32
+ type: 'posts',
33
+ attributes: {
34
+ title: 'Hello!!',
35
+ body: 'Hello, world!!'
36
+ },
37
+ relationships: {
38
+ comments: { data: [] },
39
+ blog: { data: { type: 'blogs', id: '999' } },
40
+ author: { data: { type: 'authors', id: '1' } }
41
+ }
42
+ },
43
+ {
44
+ id: '2',
45
+ type: 'posts',
46
+ attributes: {
47
+ title: 'New Post',
48
+ body: 'Body'
49
+ },
50
+ relationships: {
51
+ comments: { data: [] },
52
+ blog: { data: { type: 'blogs', id: '999' } },
53
+ author: { data: { type: 'authors', id: '1' } }
54
+ }
55
+ }
56
+ ]
57
+
58
+ assert_equal(expected, @adapter.serializable_hash[:data])
59
+ end
60
+
61
+ def test_limiting_fields
62
+ actual = ActiveModelSerializers::SerializableResource.new(
63
+ [@first_post, @second_post],
64
+ adapter: :json_api,
65
+ fields: { posts: %w(title comments blog author) }
66
+ ).serializable_hash
67
+ expected = [
68
+ {
69
+ id: '1',
70
+ type: 'posts',
71
+ attributes: {
72
+ title: 'Hello!!'
73
+ },
74
+ relationships: {
75
+ comments: { data: [] },
76
+ blog: { data: { type: 'blogs', id: '999' } },
77
+ author: { data: { type: 'authors', id: '1' } }
78
+ }
79
+ },
80
+ {
81
+ id: '2',
82
+ type: 'posts',
83
+ attributes: {
84
+ title: 'New Post'
85
+ },
86
+ relationships: {
87
+ comments: { data: [] },
88
+ blog: { data: { type: 'blogs', id: '999' } },
89
+ author: { data: { type: 'authors', id: '1' } }
90
+ }
91
+ }
92
+ ]
93
+ assert_equal(expected, actual[:data])
94
+ end
95
+ end
96
+ end
97
+ end
98
+ end
@@ -0,0 +1,78 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'test_helper'
4
+
5
+ module ActiveModelSerializers
6
+ module Adapter
7
+ class JsonApi < Base
8
+ class ErrorsTest < Minitest::Test
9
+ include ActiveModel::Serializer::Lint::Tests
10
+
11
+ def setup
12
+ @resource = ModelWithErrors.new
13
+ end
14
+
15
+ def test_active_model_with_error
16
+ options = {
17
+ serializer: ActiveModel::Serializer::ErrorSerializer,
18
+ adapter: :json_api
19
+ }
20
+
21
+ @resource.errors.add(:name, 'cannot be nil')
22
+
23
+ serializable_resource = ActiveModelSerializers::SerializableResource.new(@resource, options)
24
+ assert_equal serializable_resource.serializer_instance.attributes, {}
25
+ assert_equal serializable_resource.serializer_instance.object, @resource
26
+
27
+ expected_errors_object = {
28
+ errors: [
29
+ {
30
+ source: { pointer: '/data/attributes/name' },
31
+ detail: 'cannot be nil'
32
+ }
33
+ ]
34
+ }
35
+ assert_equal serializable_resource.as_json, expected_errors_object
36
+ end
37
+
38
+ def test_active_model_with_multiple_errors
39
+ options = {
40
+ serializer: ActiveModel::Serializer::ErrorSerializer,
41
+ adapter: :json_api
42
+ }
43
+
44
+ @resource.errors.add(:name, 'cannot be nil')
45
+ @resource.errors.add(:name, 'must be longer')
46
+ @resource.errors.add(:id, 'must be a uuid')
47
+
48
+ serializable_resource = ActiveModelSerializers::SerializableResource.new(@resource, options)
49
+ assert_equal serializable_resource.serializer_instance.attributes, {}
50
+ assert_equal serializable_resource.serializer_instance.object, @resource
51
+
52
+ expected_errors_object = {
53
+ errors: [
54
+ { source: { pointer: '/data/attributes/name' }, detail: 'cannot be nil' },
55
+ { source: { pointer: '/data/attributes/name' }, detail: 'must be longer' },
56
+ { source: { pointer: '/data/attributes/id' }, detail: 'must be a uuid' }
57
+ ]
58
+ }
59
+ assert_equal serializable_resource.as_json, expected_errors_object
60
+ end
61
+
62
+ # see http://jsonapi.org/examples/
63
+ def test_parameter_source_type_error
64
+ parameter = 'auther'
65
+ error_source = ActiveModelSerializers::Adapter::JsonApi::Error.error_source(:parameter, parameter)
66
+ assert_equal({ parameter: parameter }, error_source)
67
+ end
68
+
69
+ def test_unknown_source_type_error
70
+ value = 'auther'
71
+ assert_raises(ActiveModelSerializers::Adapter::JsonApi::Error::UnknownSourceTypeError) do
72
+ ActiveModelSerializers::Adapter::JsonApi::Error.error_source(:hyper, value)
73
+ end
74
+ end
75
+ end
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,98 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'test_helper'
4
+
5
+ module ActiveModelSerializers
6
+ module Adapter
7
+ class JsonApi
8
+ class FieldsTest < ActiveSupport::TestCase
9
+ class Post < ::Model
10
+ attributes :title, :body
11
+ associations :author, :comments
12
+ end
13
+ class Author < ::Model
14
+ attributes :name, :birthday
15
+ end
16
+ class Comment < ::Model
17
+ attributes :body
18
+ associations :author, :post
19
+ end
20
+
21
+ class PostSerializer < ActiveModel::Serializer
22
+ type 'posts'
23
+ attributes :title, :body
24
+ belongs_to :author
25
+ has_many :comments
26
+ end
27
+
28
+ class AuthorSerializer < ActiveModel::Serializer
29
+ type 'authors'
30
+ attributes :name, :birthday
31
+ end
32
+
33
+ class CommentSerializer < ActiveModel::Serializer
34
+ type 'comments'
35
+ attributes :body
36
+ belongs_to :author
37
+ end
38
+
39
+ def setup
40
+ @author = Author.new(id: 1, name: 'Lucas', birthday: '10.01.1990')
41
+ @comment1 = Comment.new(id: 7, body: 'cool', author: @author)
42
+ @comment2 = Comment.new(id: 12, body: 'awesome', author: @author)
43
+ @post = Post.new(id: 1337, title: 'Title 1', body: 'Body 1',
44
+ author: @author, comments: [@comment1, @comment2])
45
+ @comment1.post = @post
46
+ @comment2.post = @post
47
+ end
48
+
49
+ def test_fields_attributes
50
+ fields = { posts: [:title] }
51
+ hash = serializable(@post, adapter: :json_api, fields: fields).serializable_hash
52
+ expected = {
53
+ title: 'Title 1'
54
+ }
55
+
56
+ assert_equal(expected, hash[:data][:attributes])
57
+ end
58
+
59
+ def test_fields_relationships
60
+ fields = { posts: [:author] }
61
+ hash = serializable(@post, adapter: :json_api, fields: fields).serializable_hash
62
+ expected = {
63
+ author: {
64
+ data: {
65
+ type: 'authors',
66
+ id: '1'
67
+ }
68
+ }
69
+ }
70
+
71
+ assert_equal(expected, hash[:data][:relationships])
72
+ end
73
+
74
+ def test_fields_included
75
+ fields = { posts: [:author], comments: [:body] }
76
+ hash = serializable(@post, adapter: :json_api, fields: fields, include: 'comments').serializable_hash
77
+ expected = [
78
+ {
79
+ type: 'comments',
80
+ id: '7',
81
+ attributes: {
82
+ body: 'cool'
83
+ }
84
+ }, {
85
+ type: 'comments',
86
+ id: '12',
87
+ attributes: {
88
+ body: 'awesome'
89
+ }
90
+ }
91
+ ]
92
+
93
+ assert_equal(expected, hash[:included])
94
+ end
95
+ end
96
+ end
97
+ end
98
+ end
@@ -0,0 +1,98 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'test_helper'
4
+
5
+ module ActiveModelSerializers
6
+ module Adapter
7
+ class JsonApi
8
+ # Test 'has_many :assocs, serializer: AssocXSerializer'
9
+ class HasManyExplicitSerializerTest < ActiveSupport::TestCase
10
+ def setup
11
+ @post = Post.new(title: 'New Post', body: 'Body')
12
+ @author = Author.new(name: 'Jane Blogger')
13
+ @author.posts = [@post]
14
+ @post.author = @author
15
+ @first_comment = Comment.new(id: 1, body: 'ZOMG A COMMENT')
16
+ @second_comment = Comment.new(id: 2, body: 'ZOMG ANOTHER COMMENT')
17
+ @post.comments = [@first_comment, @second_comment]
18
+ @first_comment.post = @post
19
+ @first_comment.author = nil
20
+ @second_comment.post = @post
21
+ @second_comment.author = nil
22
+ @blog = Blog.new(id: 23, name: 'AMS Blog')
23
+ @post.blog = @blog
24
+
25
+ @serializer = PostPreviewSerializer.new(@post)
26
+ @adapter = ActiveModelSerializers::Adapter::JsonApi.new(
27
+ @serializer,
28
+ include: [:comments, :author]
29
+ )
30
+ end
31
+
32
+ def test_includes_comment_ids
33
+ expected = {
34
+ data: [
35
+ { type: 'comments', id: '1' },
36
+ { type: 'comments', id: '2' }
37
+ ]
38
+ }
39
+
40
+ assert_equal(expected, @adapter.serializable_hash[:data][:relationships][:comments])
41
+ end
42
+
43
+ def test_includes_linked_data
44
+ # If CommentPreviewSerializer is applied correctly the body text will not be present in the output
45
+ expected = [
46
+ {
47
+ id: '1',
48
+ type: 'comments',
49
+ relationships: {
50
+ post: { data: { type: 'posts', id: @post.id.to_s } }
51
+ }
52
+ },
53
+ {
54
+ id: '2',
55
+ type: 'comments',
56
+ relationships: {
57
+ post: { data: { type: 'posts', id: @post.id.to_s } }
58
+ }
59
+ },
60
+ {
61
+ id: @author.id.to_s,
62
+ type: 'authors',
63
+ relationships: {
64
+ posts: { data: [{ type: 'posts', id: @post.id.to_s }] }
65
+ }
66
+ }
67
+ ]
68
+
69
+ assert_equal(expected, @adapter.serializable_hash[:included])
70
+ end
71
+
72
+ def test_includes_author_id
73
+ expected = {
74
+ data: { type: 'authors', id: @author.id.to_s }
75
+ }
76
+
77
+ assert_equal(expected, @adapter.serializable_hash[:data][:relationships][:author])
78
+ end
79
+
80
+ def test_explicit_serializer_with_null_resource
81
+ @post.author = nil
82
+
83
+ expected = { data: nil }
84
+
85
+ assert_equal(expected, @adapter.serializable_hash[:data][:relationships][:author])
86
+ end
87
+
88
+ def test_explicit_serializer_with_null_collection
89
+ @post.comments = []
90
+
91
+ expected = { data: [] }
92
+
93
+ assert_equal(expected, @adapter.serializable_hash[:data][:relationships][:comments])
94
+ end
95
+ end
96
+ end
97
+ end
98
+ end