active_model_serializers 0.10.7 → 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 (213) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +62 -1
  3. data/README.md +20 -20
  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 +33 -18
  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 +2 -0
  15. data/lib/active_model/serializer/attribute.rb +2 -0
  16. data/lib/active_model/serializer/belongs_to_reflection.rb +2 -0
  17. data/lib/active_model/serializer/collection_serializer.rb +6 -6
  18. data/lib/active_model/serializer/concerns/caching.rb +7 -2
  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 +2 -0
  24. data/lib/active_model/serializer/has_one_reflection.rb +2 -0
  25. data/lib/active_model/serializer/lazy_association.rb +6 -2
  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 +9 -4
  30. data/lib/active_model/serializer/version.rb +3 -1
  31. data/lib/active_model_serializers.rb +20 -10
  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 +2 -0
  35. data/lib/active_model_serializers/adapter/json.rb +2 -0
  36. data/lib/active_model_serializers/adapter/json_api.rb +14 -9
  37. data/lib/active_model_serializers/adapter/json_api/deserialization.rb +2 -0
  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 +2 -0
  43. data/lib/active_model_serializers/adapter/json_api/relationship.rb +2 -0
  44. data/lib/active_model_serializers/adapter/json_api/resource_identifier.rb +3 -1
  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 +2 -0
  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 +2 -0
  60. data/lib/active_model_serializers/test/serializer.rb +2 -0
  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 +70 -295
  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 -52
  74. data/CODE_OF_CONDUCT.md +0 -74
  75. data/CONTRIBUTING.md +0 -105
  76. data/Gemfile +0 -72
  77. data/Rakefile +0 -74
  78. data/active_model_serializers.gemspec +0 -63
  79. data/appveyor.yml +0 -28
  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 -269
  87. data/docs/general/caching.md +0 -58
  88. data/docs/general/configuration_options.md +0 -185
  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 -483
  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 -62
  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.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/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 -124
  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_explicit_serializer_test.rb +0 -96
  148. data/test/adapter/json_api/has_many_test.rb +0 -173
  149. data/test/adapter/json_api/has_one_test.rb +0 -80
  150. data/test/adapter/json_api/include_data_if_sideloaded_test.rb +0 -213
  151. data/test/adapter/json_api/json_api_test.rb +0 -33
  152. data/test/adapter/json_api/linked_test.rb +0 -413
  153. data/test/adapter/json_api/links_test.rb +0 -95
  154. data/test/adapter/json_api/pagination_links_test.rb +0 -206
  155. data/test/adapter/json_api/parse_test.rb +0 -137
  156. data/test/adapter/json_api/relationship_test.rb +0 -397
  157. data/test/adapter/json_api/resource_meta_test.rb +0 -100
  158. data/test/adapter/json_api/toplevel_jsonapi_test.rb +0 -82
  159. data/test/adapter/json_api/transform_test.rb +0 -512
  160. data/test/adapter/json_api/type_test.rb +0 -193
  161. data/test/adapter/json_test.rb +0 -46
  162. data/test/adapter/null_test.rb +0 -22
  163. data/test/adapter/polymorphic_test.rb +0 -218
  164. data/test/adapter_test.rb +0 -67
  165. data/test/array_serializer_test.rb +0 -22
  166. data/test/benchmark/app.rb +0 -65
  167. data/test/benchmark/benchmarking_support.rb +0 -67
  168. data/test/benchmark/bm_active_record.rb +0 -81
  169. data/test/benchmark/bm_adapter.rb +0 -38
  170. data/test/benchmark/bm_caching.rb +0 -119
  171. data/test/benchmark/bm_lookup_chain.rb +0 -83
  172. data/test/benchmark/bm_transform.rb +0 -45
  173. data/test/benchmark/config.ru +0 -3
  174. data/test/benchmark/controllers.rb +0 -83
  175. data/test/benchmark/fixtures.rb +0 -219
  176. data/test/cache_test.rb +0 -651
  177. data/test/collection_serializer_test.rb +0 -127
  178. data/test/fixtures/active_record.rb +0 -113
  179. data/test/fixtures/poro.rb +0 -225
  180. data/test/generators/scaffold_controller_generator_test.rb +0 -24
  181. data/test/generators/serializer_generator_test.rb +0 -75
  182. data/test/grape_test.rb +0 -196
  183. data/test/lint_test.rb +0 -49
  184. data/test/logger_test.rb +0 -20
  185. data/test/poro_test.rb +0 -9
  186. data/test/serializable_resource_test.rb +0 -79
  187. data/test/serializers/association_macros_test.rb +0 -37
  188. data/test/serializers/associations_test.rb +0 -468
  189. data/test/serializers/attribute_test.rb +0 -153
  190. data/test/serializers/attributes_test.rb +0 -52
  191. data/test/serializers/caching_configuration_test_isolated.rb +0 -170
  192. data/test/serializers/configuration_test.rb +0 -32
  193. data/test/serializers/fieldset_test.rb +0 -14
  194. data/test/serializers/meta_test.rb +0 -202
  195. data/test/serializers/options_test.rb +0 -32
  196. data/test/serializers/read_attribute_for_serialization_test.rb +0 -79
  197. data/test/serializers/reflection_test.rb +0 -427
  198. data/test/serializers/root_test.rb +0 -21
  199. data/test/serializers/serialization_test.rb +0 -55
  200. data/test/serializers/serializer_for_test.rb +0 -136
  201. data/test/serializers/serializer_for_with_namespace_test.rb +0 -88
  202. data/test/support/custom_schemas/active_model_serializers/test/schema_test/my/index.json +0 -6
  203. data/test/support/isolated_unit.rb +0 -84
  204. data/test/support/rails5_shims.rb +0 -53
  205. data/test/support/rails_app.rb +0 -38
  206. data/test/support/schemas/active_model_serializers/test/schema_test/my/index.json +0 -6
  207. data/test/support/schemas/active_model_serializers/test/schema_test/my/show.json +0 -6
  208. data/test/support/schemas/custom/show.json +0 -7
  209. data/test/support/schemas/hyper_schema.json +0 -93
  210. data/test/support/schemas/render_using_json_api.json +0 -43
  211. data/test/support/schemas/simple_json_pointers.json +0 -10
  212. data/test/support/serialization_testing.rb +0 -79
  213. data/test/test_helper.rb +0 -70
@@ -1,106 +0,0 @@
1
- - Start Date: (2015-10-29)
2
- - RFC PR: https://github.com/rails-api/active_model_serializers/pull/1310
3
- - ActiveModelSerializers Issue: https://github.com/rails-api/active_model_serializers/issues/1298
4
-
5
- # Summary
6
-
7
- Provide a consistent API for the user of the AMS.
8
-
9
- # Motivation
10
-
11
- The actual public API is defined under `ActiveModelSerializers`,
12
- `ActiveModel::Serializer` and `ActiveModel`.
13
-
14
- At the `ActiveModel::Serializer` we have:
15
-
16
- - `ActiveModel::Serializer.config`
17
- - `ActiveModel::Serializer`
18
-
19
- At the `ActiveModelSerializers` we have:
20
-
21
- - `ActiveModelSerializers::Model`
22
- - `ActiveModelSerializers.logger`
23
-
24
- At `ActiveModel` we have:
25
-
26
- - `ActiveModel::SerializableResource`
27
-
28
- The idea here is to provide a single namespace `ActiveModelSerializers` to the user.
29
- Following the same idea we have on other gems like
30
- [Devise](https://github.com/plataformatec/devise/blob/e9c82472ffe7c43a448945f77e034a0e47dde0bb/lib/devise.rb),
31
- [Refile](https://github.com/refile/refile/blob/6b24c293d044862dafbf1bfa4606672a64903aa2/lib/refile.rb) and
32
- [Active Job](https://github.com/rails/rails/blob/30bacc26f8f258b39e12f63fe52389a968d9c1ea/activejob/lib/active_job.rb)
33
- for example.
34
-
35
- This way we are clarifing the boundaries of
36
- [ActiveModelSerializers and Rails](https://github.com/rails-api/active_model_serializers/blob/master/CHANGELOG.md#prehistory)
37
- and make clear that the `ActiveModel::Serializer` class is no longer the primary
38
- behavior of the ActiveModelSerializers.
39
-
40
- # Detailed design
41
-
42
- ## New classes and modules organization
43
-
44
- Since this will be a big change we can do this on baby steps, read small pull requests. A
45
- possible approach is:
46
-
47
- - All new code will be in `lib/active_model_serializers/` using
48
- the module namespace `ActiveModelSerializers`.
49
- - Move all content under `ActiveModel::Serializer` to be under
50
- `ActiveModelSerializers`, the adapter is on this steps;
51
- - Move all content under `ActiveModel` to be under `ActiveModelSerializers`,
52
- the `SerializableResource` is on this step;
53
- - Change all public API that doesn't make sense, keeping in mind only to keep
54
- this in the same namespace
55
- - Update the README;
56
- - Update the docs;
57
-
58
- The following table represents the current and the desired classes and modules
59
- at the first moment.
60
-
61
- | Current | Desired | Notes |
62
- |--------------------------------------------------------|--------------------------------------------------|--------------------|
63
- | `ActiveModelSerializers` and `ActiveModel::Serializer` | `ActiveModelSerializers` | The main namespace |
64
- | `ActiveModelSerializers.logger` | `ActiveModelSerializers.logger` ||
65
- | `ActiveModelSerializers::Model` | `ActiveModelSerializers::Model` ||
66
- | `ActiveModel::SerializableResource` | `ActiveModelSerializers::SerializableResource` ||
67
- | `ActiveModel::Serializer` | `ActiveModelSerializers::Serializer` | The name can be discussed in a future pull request. For example, we can rename this to `Resource` [following this idea](https://github.com/rails-api/active_model_serializers/pull/1301/files#r42963185) more info about naming in the next section|
68
- | `ActiveModel::Serializer.config` | `ActiveModelSerializers.config` ||
69
-
70
- ## Renaming of class and modules
71
-
72
- When moving some content to the new namespace we can find some names that does
73
- not make much sense like `ActiveModel::Serializer::Adapter::JsonApi`.
74
- Discussion of renaming existing classes / modules and JsonApi objects will
75
- happen in separate pull requests, and issues, and in the google doc
76
- https://docs.google.com/document/d/1rcrJr0sVcazY2Opd_6Kmv1iIwuHbI84s1P_NzFn-05c/edit?usp=sharing
77
-
78
- Some of names already have a definition.
79
-
80
- - Adapters get their own namespace under ActiveModelSerializers. E.g
81
- `ActiveModelSerializers::Adapter`
82
- - Serializers get their own namespace under ActiveModelSerializers. E.g
83
- `ActiveModelSerializers::Serializer`
84
-
85
- ## Keeping compatibility
86
-
87
- All moved classes or modules be aliased to their old name and location with
88
- deprecation warnings, such as
89
- [was done for CollectionSerializer](https://github.com/rails-api/active_model_serializers/pull/1251).
90
-
91
- # Drawbacks
92
-
93
- This will be a breaking change, so all users serializers will be broken after a
94
- major bump.
95
- All pull requests will need to rebase since the architeture will change a lot.
96
-
97
- # Alternatives
98
-
99
- We can keep the way it is, and keep in mind to not add another namespace as a
100
- public API.
101
-
102
- # Unresolved questions
103
-
104
- What is the better class name to be used to the class that will be inherited at
105
- the creation of a serializer. This can be discussed in other RFC or directly via
106
- pull request.
@@ -1,15 +0,0 @@
1
- - Start Date: (YYYY-MM-DD)
2
- - RFC PR: https://github.com/rails-api/active_model_serializers/pull/dddd
3
- - ActiveModelSerializers Issue: https://github.com/rails-api/active_model_serializers/issues/dddd
4
-
5
- # Summary
6
-
7
- # Motivation
8
-
9
- # Detailed design
10
-
11
- # Drawbacks
12
-
13
- # Alternatives
14
-
15
- # Unresolved questions
@@ -1,62 +0,0 @@
1
- require 'test_helper'
2
-
3
- module ActionController
4
- module Serialization
5
- class AdapterSelectorTest < ActionController::TestCase
6
- class Profile < Model
7
- attributes :id, :name, :description
8
- associations :comments
9
- end
10
- class ProfileSerializer < ActiveModel::Serializer
11
- type 'profiles'
12
- attributes :name, :description
13
- end
14
-
15
- class AdapterSelectorTestController < ActionController::Base
16
- def render_using_default_adapter
17
- @profile = Profile.new(name: 'Name 1', description: 'Description 1', comments: 'Comments 1')
18
- render json: @profile
19
- end
20
-
21
- def render_using_adapter_override
22
- @profile = Profile.new(id: 'render_using_adapter_override', name: 'Name 1', description: 'Description 1', comments: 'Comments 1')
23
- render json: @profile, adapter: :json_api
24
- end
25
-
26
- def render_skipping_adapter
27
- @profile = Profile.new(id: 'render_skipping_adapter_id', name: 'Name 1', description: 'Description 1', comments: 'Comments 1')
28
- render json: @profile, adapter: false
29
- end
30
- end
31
-
32
- tests AdapterSelectorTestController
33
-
34
- def test_render_using_default_adapter
35
- get :render_using_default_adapter
36
- assert_equal '{"name":"Name 1","description":"Description 1"}', response.body
37
- end
38
-
39
- def test_render_using_adapter_override
40
- get :render_using_adapter_override
41
-
42
- expected = {
43
- data: {
44
- id: 'render_using_adapter_override',
45
- type: 'profiles',
46
- attributes: {
47
- name: 'Name 1',
48
- description: 'Description 1'
49
- }
50
- }
51
- }
52
-
53
- assert_equal expected.to_json, response.body
54
- end
55
-
56
- def test_render_skipping_adapter
57
- get :render_skipping_adapter
58
- assert_equal '{"id":"render_skipping_adapter_id","name":"Name 1","description":"Description 1"}', response.body
59
- end
60
- end
61
- end
62
- end
@@ -1,135 +0,0 @@
1
- require 'test_helper'
2
-
3
- module ActionController
4
- module Serialization
5
- class ExplicitSerializerTest < ActionController::TestCase
6
- class ExplicitSerializerTestController < ActionController::Base
7
- def render_using_explicit_serializer
8
- @profile = Profile.new(name: 'Name 1',
9
- description: 'Description 1',
10
- comments: 'Comments 1')
11
- render json: @profile, serializer: ProfilePreviewSerializer
12
- end
13
-
14
- def render_array_using_explicit_serializer
15
- array = [
16
- Profile.new(name: 'Name 1',
17
- description: 'Description 1',
18
- comments: 'Comments 1'),
19
- Profile.new(name: 'Name 2',
20
- description: 'Description 2',
21
- comments: 'Comments 2')
22
- ]
23
- render json: array,
24
- serializer: PaginatedSerializer,
25
- each_serializer: ProfilePreviewSerializer
26
- end
27
-
28
- def render_array_using_implicit_serializer
29
- array = [
30
- Profile.new(name: 'Name 1',
31
- description: 'Description 1',
32
- comments: 'Comments 1'),
33
- Profile.new(name: 'Name 2',
34
- description: 'Description 2',
35
- comments: 'Comments 2')
36
- ]
37
- render json: array,
38
- each_serializer: ProfilePreviewSerializer
39
- end
40
-
41
- def render_array_using_explicit_serializer_and_custom_serializers
42
- @post = Post.new(title: 'New Post', body: 'Body')
43
- @author = Author.new(name: 'Jane Blogger')
44
- @author.posts = [@post]
45
- @post.author = @author
46
- @first_comment = Comment.new(id: 1, body: 'ZOMG A COMMENT')
47
- @second_comment = Comment.new(id: 2, body: 'ZOMG ANOTHER COMMENT')
48
- @post.comments = [@first_comment, @second_comment]
49
- @first_comment.post = @post
50
- @first_comment.author = nil
51
- @second_comment.post = @post
52
- @second_comment.author = nil
53
- @blog = Blog.new(id: 23, name: 'AMS Blog')
54
- @post.blog = @blog
55
-
56
- render json: [@post], each_serializer: PostPreviewSerializer
57
- end
58
-
59
- def render_using_explicit_each_serializer
60
- location = Location.new(id: 42, lat: '-23.550520', lng: '-46.633309')
61
- place = Place.new(id: 1337, name: 'Amazing Place', locations: [location])
62
-
63
- render json: place, each_serializer: PlaceSerializer
64
- end
65
- end
66
-
67
- tests ExplicitSerializerTestController
68
-
69
- def test_render_using_explicit_serializer
70
- get :render_using_explicit_serializer
71
-
72
- assert_equal 'application/json', @response.content_type
73
- assert_equal '{"name":"Name 1"}', @response.body
74
- end
75
-
76
- def test_render_array_using_explicit_serializer
77
- get :render_array_using_explicit_serializer
78
- assert_equal 'application/json', @response.content_type
79
-
80
- expected = [
81
- { 'name' => 'Name 1' },
82
- { 'name' => 'Name 2' }
83
- ]
84
-
85
- assert_equal expected.to_json, @response.body
86
- end
87
-
88
- def test_render_array_using_implicit_serializer
89
- get :render_array_using_implicit_serializer
90
- assert_equal 'application/json', @response.content_type
91
-
92
- expected = [
93
- { 'name' => 'Name 1' },
94
- { 'name' => 'Name 2' }
95
- ]
96
- assert_equal expected.to_json, @response.body
97
- end
98
-
99
- def test_render_array_using_explicit_serializer_and_custom_serializers
100
- get :render_array_using_explicit_serializer_and_custom_serializers
101
-
102
- expected = [
103
- {
104
- 'title' => 'New Post',
105
- 'body' => 'Body',
106
- 'id' => @controller.instance_variable_get(:@post).id,
107
- 'comments' => [{ 'id' => 1 }, { 'id' => 2 }],
108
- 'author' => { 'id' => @controller.instance_variable_get(:@author).id }
109
- }
110
- ]
111
-
112
- assert_equal expected.to_json, @response.body
113
- end
114
-
115
- def test_render_using_explicit_each_serializer
116
- get :render_using_explicit_each_serializer
117
-
118
- expected = {
119
- id: 1337,
120
- name: 'Amazing Place',
121
- locations: [
122
- {
123
- id: 42,
124
- lat: '-23.550520',
125
- lng: '-46.633309',
126
- address: 'Nowhere' # is a virtual attribute on LocationSerializer
127
- }
128
- ]
129
- }
130
-
131
- assert_equal expected.to_json, response.body
132
- end
133
- end
134
- end
135
- end
@@ -1,246 +0,0 @@
1
- require 'test_helper'
2
-
3
- module ActionController
4
- module Serialization
5
- class Json
6
- class IncludeTest < ActionController::TestCase
7
- INCLUDE_STRING = 'posts.comments'.freeze
8
- INCLUDE_HASH = { posts: :comments }.freeze
9
- DEEP_INCLUDE = 'posts.comments.author'.freeze
10
-
11
- class IncludeTestController < ActionController::Base
12
- def setup_data
13
- ActionController::Base.cache_store.clear
14
-
15
- @author = Author.new(id: 1, name: 'Steve K.')
16
-
17
- @post = Post.new(id: 42, title: 'New Post', body: 'Body')
18
- @first_comment = Comment.new(id: 1, body: 'ZOMG A COMMENT')
19
- @second_comment = Comment.new(id: 2, body: 'ZOMG ANOTHER COMMENT')
20
-
21
- @post.comments = [@first_comment, @second_comment]
22
- @post.author = @author
23
-
24
- @first_comment.post = @post
25
- @second_comment.post = @post
26
-
27
- @blog = Blog.new(id: 1, name: 'My Blog!!')
28
- @post.blog = @blog
29
- @author.posts = [@post]
30
-
31
- @first_comment.author = @author
32
- @second_comment.author = @author
33
- @author.comments = [@first_comment, @second_comment]
34
- @author.roles = []
35
- @author.bio = {}
36
- end
37
-
38
- def render_without_include
39
- setup_data
40
- render json: @author, adapter: :json
41
- end
42
-
43
- def render_resource_with_include_hash
44
- setup_data
45
- render json: @author, include: INCLUDE_HASH, adapter: :json
46
- end
47
-
48
- def render_resource_with_include_string
49
- setup_data
50
- render json: @author, include: INCLUDE_STRING, adapter: :json
51
- end
52
-
53
- def render_resource_with_deep_include
54
- setup_data
55
- render json: @author, include: DEEP_INCLUDE, adapter: :json
56
- end
57
-
58
- def render_without_recursive_relationships
59
- # testing recursive includes ('**') can't have any cycles in the
60
- # relationships, or we enter an infinite loop.
61
- author = Author.new(id: 11, name: 'Jane Doe')
62
- post = Post.new(id: 12, title: 'Hello World', body: 'My first post')
63
- comment = Comment.new(id: 13, body: 'Commentary')
64
- author.posts = [post]
65
- post.comments = [comment]
66
- render json: author
67
- end
68
- end
69
-
70
- tests IncludeTestController
71
-
72
- def test_render_without_include
73
- get :render_without_include
74
- response = JSON.parse(@response.body)
75
- expected = {
76
- 'author' => {
77
- 'id' => 1,
78
- 'name' => 'Steve K.',
79
- 'posts' => [
80
- {
81
- 'id' => 42, 'title' => 'New Post', 'body' => 'Body'
82
- }
83
- ],
84
- 'roles' => [],
85
- 'bio' => {}
86
- }
87
- }
88
-
89
- assert_equal(expected, response)
90
- end
91
-
92
- def test_render_resource_with_include_hash
93
- get :render_resource_with_include_hash
94
- response = JSON.parse(@response.body)
95
-
96
- assert_equal(expected_include_response, response)
97
- end
98
-
99
- def test_render_resource_with_include_string
100
- get :render_resource_with_include_string
101
-
102
- response = JSON.parse(@response.body)
103
-
104
- assert_equal(expected_include_response, response)
105
- end
106
-
107
- def test_render_resource_with_deep_include
108
- get :render_resource_with_deep_include
109
-
110
- response = JSON.parse(@response.body)
111
-
112
- assert_equal(expected_deep_include_response, response)
113
- end
114
-
115
- def test_render_with_empty_default_includes
116
- with_default_includes '' do
117
- get :render_without_include
118
- response = JSON.parse(@response.body)
119
- expected = {
120
- 'author' => {
121
- 'id' => 1,
122
- 'name' => 'Steve K.'
123
- }
124
- }
125
- assert_equal(expected, response)
126
- end
127
- end
128
-
129
- def test_render_with_recursive_default_includes
130
- with_default_includes '**' do
131
- get :render_without_recursive_relationships
132
- response = JSON.parse(@response.body)
133
-
134
- expected = {
135
- 'id' => 11,
136
- 'name' => 'Jane Doe',
137
- 'roles' => nil,
138
- 'bio' => nil,
139
- 'posts' => [
140
- {
141
- 'id' => 12,
142
- 'title' => 'Hello World',
143
- 'body' => 'My first post',
144
- 'comments' => [
145
- {
146
- 'id' => 13,
147
- 'body' => 'Commentary',
148
- 'post' => nil, # not set to avoid infinite recursion
149
- 'author' => nil, # not set to avoid infinite recursion
150
- }
151
- ],
152
- 'blog' => {
153
- 'id' => 999,
154
- 'name' => 'Custom blog',
155
- 'writer' => nil,
156
- 'articles' => nil
157
- },
158
- 'author' => nil # not set to avoid infinite recursion
159
- }
160
- ]
161
- }
162
- assert_equal(expected, response)
163
- end
164
- end
165
-
166
- def test_render_with_includes_overrides_default_includes
167
- with_default_includes '' do
168
- get :render_resource_with_include_hash
169
- response = JSON.parse(@response.body)
170
-
171
- assert_equal(expected_include_response, response)
172
- end
173
- end
174
-
175
- private
176
-
177
- def expected_include_response
178
- {
179
- 'author' => {
180
- 'id' => 1,
181
- 'name' => 'Steve K.',
182
- 'posts' => [
183
- {
184
- 'id' => 42, 'title' => 'New Post', 'body' => 'Body',
185
- 'comments' => [
186
- {
187
- 'id' => 1, 'body' => 'ZOMG A COMMENT'
188
- },
189
- {
190
- 'id' => 2, 'body' => 'ZOMG ANOTHER COMMENT'
191
- }
192
- ]
193
- }
194
- ]
195
- }
196
- }
197
- end
198
-
199
- def expected_deep_include_response
200
- {
201
- 'author' => {
202
- 'id' => 1,
203
- 'name' => 'Steve K.',
204
- 'posts' => [
205
- {
206
- 'id' => 42, 'title' => 'New Post', 'body' => 'Body',
207
- 'comments' => [
208
- {
209
- 'id' => 1, 'body' => 'ZOMG A COMMENT',
210
- 'author' => {
211
- 'id' => 1,
212
- 'name' => 'Steve K.'
213
- }
214
- },
215
- {
216
- 'id' => 2, 'body' => 'ZOMG ANOTHER COMMENT',
217
- 'author' => {
218
- 'id' => 1,
219
- 'name' => 'Steve K.'
220
- }
221
- }
222
- ]
223
- }
224
- ]
225
- }
226
- }
227
- end
228
-
229
- def with_default_includes(include_directive)
230
- original = ActiveModelSerializers.config.default_includes
231
- ActiveModelSerializers.config.default_includes = include_directive
232
- clear_include_directive_cache
233
- yield
234
- ensure
235
- ActiveModelSerializers.config.default_includes = original
236
- clear_include_directive_cache
237
- end
238
-
239
- def clear_include_directive_cache
240
- ActiveModelSerializers
241
- .instance_variable_set(:@default_include_directive, nil)
242
- end
243
- end
244
- end
245
- end
246
- end