active_model_serializers 0.10.6 → 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 +114 -1
  3. data/README.md +21 -24
  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/adapter/attributes.rb +2 -0
  7. data/lib/active_model/serializer/adapter/base.rb +2 -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 +2 -0
  13. data/lib/active_model/serializer/association.rb +2 -0
  14. data/lib/active_model/serializer/attribute.rb +2 -0
  15. data/lib/active_model/serializer/belongs_to_reflection.rb +2 -0
  16. data/lib/active_model/serializer/collection_serializer.rb +17 -5
  17. data/lib/active_model/serializer/concerns/caching.rb +7 -2
  18. data/lib/active_model/serializer/error_serializer.rb +2 -0
  19. data/lib/active_model/serializer/errors_serializer.rb +2 -0
  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 +2 -0
  23. data/lib/active_model/serializer/has_one_reflection.rb +2 -0
  24. data/lib/active_model/serializer/lazy_association.rb +6 -2
  25. data/lib/active_model/serializer/link.rb +23 -0
  26. data/lib/active_model/serializer/lint.rb +2 -0
  27. data/lib/active_model/serializer/null.rb +2 -0
  28. data/lib/active_model/serializer/reflection.rb +10 -5
  29. data/lib/active_model/serializer/version.rb +3 -1
  30. data/lib/active_model/serializer.rb +37 -19
  31. data/lib/active_model_serializers/adapter/attributes.rb +23 -0
  32. data/lib/active_model_serializers/adapter/base.rb +2 -0
  33. data/lib/active_model_serializers/adapter/json.rb +2 -0
  34. data/lib/active_model_serializers/adapter/json_api/deserialization.rb +3 -1
  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 +2 -0
  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 +45 -20
  40. data/lib/active_model_serializers/adapter/json_api/relationship.rb +18 -4
  41. data/lib/active_model_serializers/adapter/json_api/resource_identifier.rb +33 -25
  42. data/lib/active_model_serializers/adapter/json_api.rb +14 -9
  43. data/lib/active_model_serializers/adapter/null.rb +2 -0
  44. data/lib/active_model_serializers/adapter.rb +3 -1
  45. data/lib/active_model_serializers/callbacks.rb +2 -0
  46. data/lib/active_model_serializers/deprecate.rb +2 -0
  47. data/lib/active_model_serializers/deserialization.rb +2 -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 +2 -0
  51. data/lib/active_model_serializers/model/caching.rb +26 -0
  52. data/lib/active_model_serializers/model.rb +2 -0
  53. data/lib/active_model_serializers/railtie.rb +4 -0
  54. data/lib/active_model_serializers/register_jsonapi_renderer.rb +2 -0
  55. data/lib/active_model_serializers/serializable_resource.rb +4 -2
  56. data/lib/active_model_serializers/serialization_context.rb +2 -0
  57. data/lib/active_model_serializers/test/schema.rb +2 -0
  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 +21 -11
  61. data/lib/generators/rails/resource_override.rb +2 -0
  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 +2 -0
  67. metadata +43 -298
  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 -105
  72. data/.simplecov +0 -110
  73. data/.travis.yml +0 -55
  74. data/CODE_OF_CONDUCT.md +0 -74
  75. data/CONTRIBUTING.md +0 -105
  76. data/Gemfile +0 -56
  77. data/Rakefile +0 -74
  78. data/active_model_serializers.gemspec +0 -63
  79. data/appveyor.yml +0 -30
  80. data/bin/bench +0 -171
  81. data/bin/bench_regression +0 -316
  82. data/bin/rubocop +0 -38
  83. data/bin/serve_benchmark +0 -39
  84. data/docs/README.md +0 -41
  85. data/docs/STYLE.md +0 -58
  86. data/docs/general/adapters.md +0 -263
  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 -21
  95. data/docs/general/rendering.md +0 -293
  96. data/docs/general/serializers.md +0 -480
  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 -140
  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 -66
  103. data/docs/howto/passing_arbitrary_options.md +0 -27
  104. data/docs/howto/serialize_poro.md +0 -73
  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 -147
  108. data/docs/integrations/grape.md +0 -19
  109. data/docs/jsonapi/errors.md +0 -56
  110. data/docs/jsonapi/schema/schema.json +0 -366
  111. data/docs/jsonapi/schema.md +0 -151
  112. data/docs/rfcs/0000-namespace.md +0 -106
  113. data/docs/rfcs/template.md +0 -15
  114. data/test/action_controller/adapter_selector_test.rb +0 -62
  115. data/test/action_controller/explicit_serializer_test.rb +0 -135
  116. data/test/action_controller/json/include_test.rb +0 -246
  117. data/test/action_controller/json_api/deserialization_test.rb +0 -112
  118. data/test/action_controller/json_api/errors_test.rb +0 -40
  119. data/test/action_controller/json_api/fields_test.rb +0 -66
  120. data/test/action_controller/json_api/linked_test.rb +0 -202
  121. data/test/action_controller/json_api/pagination_test.rb +0 -116
  122. data/test/action_controller/json_api/transform_test.rb +0 -189
  123. data/test/action_controller/lookup_proc_test.rb +0 -49
  124. data/test/action_controller/namespace_lookup_test.rb +0 -232
  125. data/test/action_controller/serialization_scope_name_test.rb +0 -235
  126. data/test/action_controller/serialization_test.rb +0 -472
  127. data/test/active_model_serializers/adapter_for_test.rb +0 -208
  128. data/test/active_model_serializers/json_pointer_test.rb +0 -22
  129. data/test/active_model_serializers/logging_test.rb +0 -77
  130. data/test/active_model_serializers/model_test.rb +0 -142
  131. data/test/active_model_serializers/railtie_test_isolated.rb +0 -68
  132. data/test/active_model_serializers/register_jsonapi_renderer_test_isolated.rb +0 -161
  133. data/test/active_model_serializers/serialization_context_test_isolated.rb +0 -71
  134. data/test/active_model_serializers/test/schema_test.rb +0 -131
  135. data/test/active_model_serializers/test/serializer_test.rb +0 -62
  136. data/test/active_record_test.rb +0 -9
  137. data/test/adapter/attributes_test.rb +0 -40
  138. data/test/adapter/deprecation_test.rb +0 -100
  139. data/test/adapter/json/belongs_to_test.rb +0 -45
  140. data/test/adapter/json/collection_test.rb +0 -104
  141. data/test/adapter/json/has_many_test.rb +0 -53
  142. data/test/adapter/json/transform_test.rb +0 -93
  143. data/test/adapter/json_api/belongs_to_test.rb +0 -155
  144. data/test/adapter/json_api/collection_test.rb +0 -96
  145. data/test/adapter/json_api/errors_test.rb +0 -76
  146. data/test/adapter/json_api/fields_test.rb +0 -96
  147. data/test/adapter/json_api/has_many_embed_ids_test.rb +0 -43
  148. data/test/adapter/json_api/has_many_explicit_serializer_test.rb +0 -96
  149. data/test/adapter/json_api/has_many_test.rb +0 -173
  150. data/test/adapter/json_api/has_one_test.rb +0 -80
  151. data/test/adapter/json_api/include_data_if_sideloaded_test.rb +0 -183
  152. data/test/adapter/json_api/json_api_test.rb +0 -33
  153. data/test/adapter/json_api/linked_test.rb +0 -413
  154. data/test/adapter/json_api/links_test.rb +0 -95
  155. data/test/adapter/json_api/pagination_links_test.rb +0 -193
  156. data/test/adapter/json_api/parse_test.rb +0 -137
  157. data/test/adapter/json_api/relationship_test.rb +0 -397
  158. data/test/adapter/json_api/resource_identifier_test.rb +0 -110
  159. data/test/adapter/json_api/resource_meta_test.rb +0 -100
  160. data/test/adapter/json_api/toplevel_jsonapi_test.rb +0 -82
  161. data/test/adapter/json_api/transform_test.rb +0 -512
  162. data/test/adapter/json_api/type_test.rb +0 -61
  163. data/test/adapter/json_test.rb +0 -46
  164. data/test/adapter/null_test.rb +0 -22
  165. data/test/adapter/polymorphic_test.rb +0 -171
  166. data/test/adapter_test.rb +0 -67
  167. data/test/array_serializer_test.rb +0 -22
  168. data/test/benchmark/app.rb +0 -65
  169. data/test/benchmark/benchmarking_support.rb +0 -67
  170. data/test/benchmark/bm_active_record.rb +0 -81
  171. data/test/benchmark/bm_adapter.rb +0 -38
  172. data/test/benchmark/bm_caching.rb +0 -119
  173. data/test/benchmark/bm_lookup_chain.rb +0 -83
  174. data/test/benchmark/bm_transform.rb +0 -45
  175. data/test/benchmark/config.ru +0 -3
  176. data/test/benchmark/controllers.rb +0 -83
  177. data/test/benchmark/fixtures.rb +0 -219
  178. data/test/cache_test.rb +0 -651
  179. data/test/collection_serializer_test.rb +0 -123
  180. data/test/fixtures/active_record.rb +0 -113
  181. data/test/fixtures/poro.rb +0 -225
  182. data/test/generators/scaffold_controller_generator_test.rb +0 -24
  183. data/test/generators/serializer_generator_test.rb +0 -75
  184. data/test/grape_test.rb +0 -196
  185. data/test/lint_test.rb +0 -49
  186. data/test/logger_test.rb +0 -20
  187. data/test/poro_test.rb +0 -9
  188. data/test/serializable_resource_test.rb +0 -79
  189. data/test/serializers/association_macros_test.rb +0 -37
  190. data/test/serializers/associations_test.rb +0 -424
  191. data/test/serializers/attribute_test.rb +0 -153
  192. data/test/serializers/attributes_test.rb +0 -52
  193. data/test/serializers/caching_configuration_test_isolated.rb +0 -170
  194. data/test/serializers/configuration_test.rb +0 -32
  195. data/test/serializers/fieldset_test.rb +0 -14
  196. data/test/serializers/meta_test.rb +0 -202
  197. data/test/serializers/options_test.rb +0 -32
  198. data/test/serializers/read_attribute_for_serialization_test.rb +0 -79
  199. data/test/serializers/reflection_test.rb +0 -427
  200. data/test/serializers/root_test.rb +0 -21
  201. data/test/serializers/serialization_test.rb +0 -55
  202. data/test/serializers/serializer_for_test.rb +0 -136
  203. data/test/serializers/serializer_for_with_namespace_test.rb +0 -88
  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 -82
  206. data/test/support/rails5_shims.rb +0 -53
  207. data/test/support/rails_app.rb +0 -38
  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 -71
  215. data/test/test_helper.rb +0 -70
@@ -1,512 +0,0 @@
1
- require 'test_helper'
2
-
3
- module ActiveModelSerializers
4
- module Adapter
5
- class JsonApi
6
- class KeyCaseTest < ActiveSupport::TestCase
7
- class Post < ::Model
8
- attributes :title, :body, :publish_at
9
- associations :author, :comments
10
- end
11
- class Author < ::Model
12
- attributes :first_name, :last_name
13
- end
14
- class Comment < ::Model
15
- attributes :body
16
- associations :author, :post
17
- end
18
-
19
- class PostSerializer < ActiveModel::Serializer
20
- type 'posts'
21
- attributes :title, :body, :publish_at
22
- belongs_to :author
23
- has_many :comments
24
-
25
- link(:self) { post_url(object.id) }
26
- link(:post_authors) { post_authors_url(object.id) }
27
- link(:subscriber_comments) { post_comments_url(object.id) }
28
-
29
- meta do
30
- {
31
- rating: 5,
32
- favorite_count: 10
33
- }
34
- end
35
- end
36
-
37
- class AuthorSerializer < ActiveModel::Serializer
38
- type 'authors'
39
- attributes :first_name, :last_name
40
- end
41
-
42
- class CommentSerializer < ActiveModel::Serializer
43
- type 'comments'
44
- attributes :body
45
- belongs_to :author
46
- end
47
-
48
- def mock_request(transform = nil)
49
- context = Minitest::Mock.new
50
- context.expect(:request_url, URI)
51
- context.expect(:query_parameters, {})
52
- context.expect(:url_helpers, Rails.application.routes.url_helpers)
53
- @options = {}
54
- @options[:key_transform] = transform if transform
55
- @options[:serialization_context] = context
56
- end
57
-
58
- def setup
59
- Rails.application.routes.draw do
60
- resources :posts do
61
- resources :authors
62
- resources :comments
63
- end
64
- end
65
- @publish_at = 1.day.from_now
66
- @author = Author.new(id: 1, first_name: 'Bob', last_name: 'Jones')
67
- @comment1 = Comment.new(id: 7, body: 'cool', author: @author)
68
- @comment2 = Comment.new(id: 12, body: 'awesome', author: @author)
69
- @post = Post.new(id: 1337, title: 'Title 1', body: 'Body 1',
70
- author: @author, comments: [@comment1, @comment2],
71
- publish_at: @publish_at)
72
- @comment1.post = @post
73
- @comment2.post = @post
74
- end
75
-
76
- def test_success_document_transform_default
77
- mock_request
78
- serializer = PostSerializer.new(@post)
79
- adapter = ActiveModelSerializers::Adapter::JsonApi.new(serializer, @options)
80
- result = adapter.serializable_hash
81
- assert_equal({
82
- data: {
83
- id: '1337',
84
- type: 'posts',
85
- attributes: {
86
- title: 'Title 1',
87
- body: 'Body 1',
88
- :"publish-at" => @publish_at
89
- },
90
- relationships: {
91
- author: {
92
- data: { id: '1', type: 'authors' }
93
- },
94
- comments: {
95
- data: [
96
- { id: '7', type: 'comments' },
97
- { id: '12', type: 'comments' }
98
- ]
99
- }
100
- },
101
- links: {
102
- self: 'http://example.com/posts/1337',
103
- :"post-authors" => 'http://example.com/posts/1337/authors',
104
- :"subscriber-comments" => 'http://example.com/posts/1337/comments'
105
- },
106
- meta: { rating: 5, :"favorite-count" => 10 }
107
- }
108
- }, result)
109
- end
110
-
111
- def test_success_document_transform_global_config
112
- mock_request
113
- result = with_config(key_transform: :camel_lower) do
114
- serializer = PostSerializer.new(@post)
115
- adapter = ActiveModelSerializers::Adapter::JsonApi.new(serializer, @options)
116
- adapter.serializable_hash
117
- end
118
- assert_equal({
119
- data: {
120
- id: '1337',
121
- type: 'posts',
122
- attributes: {
123
- title: 'Title 1',
124
- body: 'Body 1',
125
- publishAt: @publish_at
126
- },
127
- relationships: {
128
- author: {
129
- data: { id: '1', type: 'authors' }
130
- },
131
- comments: {
132
- data: [
133
- { id: '7', type: 'comments' },
134
- { id: '12', type: 'comments' }
135
- ]
136
- }
137
- },
138
- links: {
139
- self: 'http://example.com/posts/1337',
140
- postAuthors: 'http://example.com/posts/1337/authors',
141
- subscriberComments: 'http://example.com/posts/1337/comments'
142
- },
143
- meta: { rating: 5, favoriteCount: 10 }
144
- }
145
- }, result)
146
- end
147
-
148
- def test_success_doc_transform_serialization_ctx_overrides_global
149
- mock_request(:camel)
150
- result = with_config(key_transform: :camel_lower) do
151
- serializer = PostSerializer.new(@post)
152
- adapter = ActiveModelSerializers::Adapter::JsonApi.new(serializer, @options)
153
- adapter.serializable_hash
154
- end
155
- assert_equal({
156
- Data: {
157
- Id: '1337',
158
- Type: 'Posts',
159
- Attributes: {
160
- Title: 'Title 1',
161
- Body: 'Body 1',
162
- PublishAt: @publish_at
163
- },
164
- Relationships: {
165
- Author: {
166
- Data: { Id: '1', Type: 'Authors' }
167
- },
168
- Comments: {
169
- Data: [
170
- { Id: '7', Type: 'Comments' },
171
- { Id: '12', Type: 'Comments' }
172
- ]
173
- }
174
- },
175
- Links: {
176
- Self: 'http://example.com/posts/1337',
177
- PostAuthors: 'http://example.com/posts/1337/authors',
178
- SubscriberComments: 'http://example.com/posts/1337/comments'
179
- },
180
- Meta: { Rating: 5, FavoriteCount: 10 }
181
- }
182
- }, result)
183
- end
184
-
185
- def test_success_document_transform_dash
186
- mock_request(:dash)
187
- serializer = PostSerializer.new(@post)
188
- adapter = ActiveModelSerializers::Adapter::JsonApi.new(serializer, @options)
189
- result = adapter.serializable_hash
190
- assert_equal({
191
- data: {
192
- id: '1337',
193
- type: 'posts',
194
- attributes: {
195
- title: 'Title 1',
196
- body: 'Body 1',
197
- :"publish-at" => @publish_at
198
- },
199
- relationships: {
200
- author: {
201
- data: { id: '1', type: 'authors' }
202
- },
203
- comments: {
204
- data: [
205
- { id: '7', type: 'comments' },
206
- { id: '12', type: 'comments' }
207
- ]
208
- }
209
- },
210
- links: {
211
- self: 'http://example.com/posts/1337',
212
- :"post-authors" => 'http://example.com/posts/1337/authors',
213
- :"subscriber-comments" => 'http://example.com/posts/1337/comments'
214
- },
215
- meta: { rating: 5, :"favorite-count" => 10 }
216
- }
217
- }, result)
218
- end
219
-
220
- def test_success_document_transform_unaltered
221
- mock_request(:unaltered)
222
- serializer = PostSerializer.new(@post)
223
- adapter = ActiveModelSerializers::Adapter::JsonApi.new(serializer, @options)
224
- result = adapter.serializable_hash
225
- assert_equal({
226
- data: {
227
- id: '1337',
228
- type: 'posts',
229
- attributes: {
230
- title: 'Title 1',
231
- body: 'Body 1',
232
- publish_at: @publish_at
233
- },
234
- relationships: {
235
- author: {
236
- data: { id: '1', type: 'authors' }
237
- },
238
- comments: {
239
- data: [
240
- { id: '7', type: 'comments' },
241
- { id: '12', type: 'comments' }
242
- ]
243
- }
244
- },
245
- links: {
246
- self: 'http://example.com/posts/1337',
247
- post_authors: 'http://example.com/posts/1337/authors',
248
- subscriber_comments: 'http://example.com/posts/1337/comments'
249
- },
250
- meta: { rating: 5, favorite_count: 10 }
251
- }
252
- }, result)
253
- end
254
-
255
- def test_success_document_transform_undefined
256
- mock_request(:zoot)
257
- serializer = PostSerializer.new(@post)
258
- adapter = ActiveModelSerializers::Adapter::JsonApi.new(serializer, @options)
259
- exception = assert_raises NoMethodError do
260
- adapter.serializable_hash
261
- end
262
- assert_match(/undefined method.*zoot/, exception.message)
263
- end
264
-
265
- def test_success_document_transform_camel
266
- mock_request(:camel)
267
- serializer = PostSerializer.new(@post)
268
- adapter = ActiveModelSerializers::Adapter::JsonApi.new(serializer, @options)
269
- result = adapter.serializable_hash
270
- assert_equal({
271
- Data: {
272
- Id: '1337',
273
- Type: 'Posts',
274
- Attributes: {
275
- Title: 'Title 1',
276
- Body: 'Body 1',
277
- PublishAt: @publish_at
278
- },
279
- Relationships: {
280
- Author: {
281
- Data: { Id: '1', Type: 'Authors' }
282
- },
283
- Comments: {
284
- Data: [
285
- { Id: '7', Type: 'Comments' },
286
- { Id: '12', Type: 'Comments' }
287
- ]
288
- }
289
- },
290
- Links: {
291
- Self: 'http://example.com/posts/1337',
292
- PostAuthors: 'http://example.com/posts/1337/authors',
293
- SubscriberComments: 'http://example.com/posts/1337/comments'
294
- },
295
- Meta: { Rating: 5, FavoriteCount: 10 }
296
- }
297
- }, result)
298
- end
299
-
300
- def test_success_document_transform_camel_lower
301
- mock_request(:camel_lower)
302
- serializer = PostSerializer.new(@post)
303
- adapter = ActiveModelSerializers::Adapter::JsonApi.new(serializer, @options)
304
- result = adapter.serializable_hash
305
- assert_equal({
306
- data: {
307
- id: '1337',
308
- type: 'posts',
309
- attributes: {
310
- title: 'Title 1',
311
- body: 'Body 1',
312
- publishAt: @publish_at
313
- },
314
- relationships: {
315
- author: {
316
- data: { id: '1', type: 'authors' }
317
- },
318
- comments: {
319
- data: [
320
- { id: '7', type: 'comments' },
321
- { id: '12', type: 'comments' }
322
- ]
323
- }
324
- },
325
- links: {
326
- self: 'http://example.com/posts/1337',
327
- postAuthors: 'http://example.com/posts/1337/authors',
328
- subscriberComments: 'http://example.com/posts/1337/comments'
329
- },
330
- meta: { rating: 5, favoriteCount: 10 }
331
- }
332
- }, result)
333
- end
334
-
335
- def test_error_document_transform_default
336
- mock_request
337
- resource = ModelWithErrors.new
338
- resource.errors.add(:published_at, 'must be in the future')
339
- resource.errors.add(:title, 'must be longer')
340
- serializer = ActiveModel::Serializer::ErrorSerializer.new(resource)
341
- adapter = ActiveModelSerializers::Adapter::JsonApi.new(serializer, @options)
342
- result = adapter.serializable_hash
343
- expected_errors_object = {
344
- errors: [
345
- {
346
- source: { pointer: '/data/attributes/published-at' },
347
- detail: 'must be in the future'
348
- },
349
- {
350
- source: { pointer: '/data/attributes/title' },
351
- detail: 'must be longer'
352
- }
353
- ]
354
- }
355
- assert_equal expected_errors_object, result
356
- end
357
-
358
- def test_error_document_transform_global_config
359
- mock_request
360
- result = with_config(key_transform: :camel) do
361
- resource = ModelWithErrors.new
362
- resource.errors.add(:published_at, 'must be in the future')
363
- resource.errors.add(:title, 'must be longer')
364
- serializer = ActiveModel::Serializer::ErrorSerializer.new(resource)
365
- adapter = ActiveModelSerializers::Adapter::JsonApi.new(serializer, @options)
366
- adapter.serializable_hash
367
- end
368
- expected_errors_object = {
369
- Errors: [
370
- {
371
- Source: { Pointer: '/data/attributes/PublishedAt' },
372
- Detail: 'must be in the future'
373
- },
374
- {
375
- Source: { Pointer: '/data/attributes/Title' },
376
- Detail: 'must be longer'
377
- }
378
- ]
379
- }
380
- assert_equal expected_errors_object, result
381
- end
382
-
383
- def test_error_document_transform_serialization_ctx_overrides_global
384
- mock_request(:camel)
385
- result = with_config(key_transform: :camel_lower) do
386
- resource = ModelWithErrors.new
387
- resource.errors.add(:published_at, 'must be in the future')
388
- resource.errors.add(:title, 'must be longer')
389
- serializer = ActiveModel::Serializer::ErrorSerializer.new(resource)
390
- adapter = ActiveModelSerializers::Adapter::JsonApi.new(serializer, @options)
391
- adapter.serializable_hash
392
- end
393
- expected_errors_object = {
394
- Errors: [
395
- {
396
- Source: { Pointer: '/data/attributes/PublishedAt' },
397
- Detail: 'must be in the future'
398
- },
399
- {
400
- Source: { Pointer: '/data/attributes/Title' },
401
- Detail: 'must be longer'
402
- }
403
- ]
404
- }
405
- assert_equal expected_errors_object, result
406
- end
407
-
408
- def test_error_document_transform_dash
409
- mock_request(:dash)
410
-
411
- resource = ModelWithErrors.new
412
- resource.errors.add(:published_at, 'must be in the future')
413
- resource.errors.add(:title, 'must be longer')
414
-
415
- serializer = ActiveModel::Serializer::ErrorSerializer.new(resource)
416
- adapter = ActiveModelSerializers::Adapter::JsonApi.new(serializer, @options)
417
- result = adapter.serializable_hash
418
-
419
- expected_errors_object = {
420
- errors: [
421
- {
422
- source: { pointer: '/data/attributes/published-at' },
423
- detail: 'must be in the future'
424
- },
425
- {
426
- source: { pointer: '/data/attributes/title' },
427
- detail: 'must be longer'
428
- }
429
- ]
430
- }
431
- assert_equal expected_errors_object, result
432
- end
433
-
434
- def test_error_document_transform_unaltered
435
- mock_request(:unaltered)
436
-
437
- resource = ModelWithErrors.new
438
- resource.errors.add(:published_at, 'must be in the future')
439
- resource.errors.add(:title, 'must be longer')
440
-
441
- serializer = ActiveModel::Serializer::ErrorSerializer.new(resource)
442
- adapter = ActiveModelSerializers::Adapter::JsonApi.new(serializer, @options)
443
- result = adapter.serializable_hash
444
-
445
- expected_errors_object = {
446
- errors: [
447
- { source: { pointer: '/data/attributes/published_at' }, detail: 'must be in the future' },
448
- { source: { pointer: '/data/attributes/title' }, detail: 'must be longer' }
449
- ]
450
- }
451
- assert_equal expected_errors_object, result
452
- end
453
-
454
- def test_error_document_transform_undefined
455
- mock_request(:krazy)
456
-
457
- resource = ModelWithErrors.new
458
- resource.errors.add(:published_at, 'must be in the future')
459
- resource.errors.add(:title, 'must be longer')
460
-
461
- serializer = ActiveModel::Serializer::ErrorSerializer.new(resource)
462
- adapter = ActiveModelSerializers::Adapter::JsonApi.new(serializer, @options)
463
-
464
- exception = assert_raises NoMethodError do
465
- adapter.serializable_hash
466
- end
467
- assert_match(/undefined method.*krazy/, exception.message)
468
- end
469
-
470
- def test_error_document_transform_camel
471
- mock_request(:camel)
472
-
473
- resource = ModelWithErrors.new
474
- resource.errors.add(:published_at, 'must be in the future')
475
- resource.errors.add(:title, 'must be longer')
476
-
477
- serializer = ActiveModel::Serializer::ErrorSerializer.new(resource)
478
- adapter = ActiveModelSerializers::Adapter::JsonApi.new(serializer, @options)
479
- result = adapter.serializable_hash
480
-
481
- expected_errors_object = {
482
- Errors: [
483
- { Source: { Pointer: '/data/attributes/PublishedAt' }, Detail: 'must be in the future' },
484
- { Source: { Pointer: '/data/attributes/Title' }, Detail: 'must be longer' }
485
- ]
486
- }
487
- assert_equal expected_errors_object, result
488
- end
489
-
490
- def test_error_document_transform_camel_lower
491
- mock_request(:camel_lower)
492
-
493
- resource = ModelWithErrors.new
494
- resource.errors.add(:published_at, 'must be in the future')
495
- resource.errors.add(:title, 'must be longer')
496
-
497
- serializer = ActiveModel::Serializer::ErrorSerializer.new(resource)
498
- adapter = ActiveModelSerializers::Adapter::JsonApi.new(serializer, @options)
499
- result = adapter.serializable_hash
500
-
501
- expected_errors_object = {
502
- errors: [
503
- { source: { pointer: '/data/attributes/publishedAt' }, detail: 'must be in the future' },
504
- { source: { pointer: '/data/attributes/title' }, detail: 'must be longer' }
505
- ]
506
- }
507
- assert_equal expected_errors_object, result
508
- end
509
- end
510
- end
511
- end
512
- end
@@ -1,61 +0,0 @@
1
- require 'test_helper'
2
-
3
- module ActiveModel
4
- class Serializer
5
- module Adapter
6
- class JsonApi
7
- class TypeTest < ActiveSupport::TestCase
8
- class StringTypeSerializer < ActiveModel::Serializer
9
- attribute :name
10
- type 'profile'
11
- end
12
-
13
- class SymbolTypeSerializer < ActiveModel::Serializer
14
- attribute :name
15
- type :profile
16
- end
17
-
18
- setup do
19
- @author = Author.new(id: 1, name: 'Steve K.')
20
- end
21
-
22
- def test_config_plural
23
- with_jsonapi_resource_type :plural do
24
- assert_type(@author, 'authors')
25
- end
26
- end
27
-
28
- def test_config_singular
29
- with_jsonapi_resource_type :singular do
30
- assert_type(@author, 'author')
31
- end
32
- end
33
-
34
- def test_explicit_string_type_value
35
- assert_type(@author, 'profile', serializer: StringTypeSerializer)
36
- end
37
-
38
- def test_explicit_symbol_type_value
39
- assert_type(@author, 'profile', serializer: SymbolTypeSerializer)
40
- end
41
-
42
- private
43
-
44
- def assert_type(resource, expected_type, opts = {})
45
- opts = opts.reverse_merge(adapter: :json_api)
46
- hash = serializable(resource, opts).serializable_hash
47
- assert_equal(expected_type, hash.fetch(:data).fetch(:type))
48
- end
49
-
50
- def with_jsonapi_resource_type(inflection)
51
- old_inflection = ActiveModelSerializers.config.jsonapi_resource_type
52
- ActiveModelSerializers.config.jsonapi_resource_type = inflection
53
- yield
54
- ensure
55
- ActiveModelSerializers.config.jsonapi_resource_type = old_inflection
56
- end
57
- end
58
- end
59
- end
60
- end
61
- end
@@ -1,46 +0,0 @@
1
- require 'test_helper'
2
-
3
- module ActiveModelSerializers
4
- module Adapter
5
- class JsonTest < 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
-
19
- @serializer = PostSerializer.new(@post)
20
- @adapter = ActiveModelSerializers::Adapter::Json.new(@serializer)
21
- end
22
-
23
- def test_has_many
24
- assert_equal([
25
- { id: 1, body: 'ZOMG A COMMENT' },
26
- { id: 2, body: 'ZOMG ANOTHER COMMENT' }
27
- ], @adapter.serializable_hash[:post][:comments])
28
- end
29
-
30
- def test_custom_keys
31
- serializer = PostWithCustomKeysSerializer.new(@post)
32
- adapter = ActiveModelSerializers::Adapter::Json.new(serializer)
33
-
34
- assert_equal({
35
- id: 1,
36
- reviews: [
37
- { id: 1, body: 'ZOMG A COMMENT' },
38
- { id: 2, body: 'ZOMG ANOTHER COMMENT' }
39
- ],
40
- writer: { id: 1, name: 'Steve K.' },
41
- site: { id: 1, name: 'My Blog!!' }
42
- }, adapter.serializable_hash[:post])
43
- end
44
- end
45
- end
46
- end
@@ -1,22 +0,0 @@
1
- require 'test_helper'
2
-
3
- module ActiveModelSerializers
4
- module Adapter
5
- class NullTest < ActiveSupport::TestCase
6
- def setup
7
- profile = Profile.new(name: 'Name 1', description: 'Description 1', comments: 'Comments 1')
8
- serializer = ProfileSerializer.new(profile)
9
-
10
- @adapter = Null.new(serializer)
11
- end
12
-
13
- def test_serializable_hash
14
- assert_equal({}, @adapter.serializable_hash)
15
- end
16
-
17
- def test_it_returns_empty_json
18
- assert_equal('{}', @adapter.to_json)
19
- end
20
- end
21
- end
22
- end