active_model_serializers 0.10.3 → 0.10.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (224) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +154 -2
  3. data/README.md +153 -15
  4. data/lib/action_controller/serialization.rb +11 -1
  5. data/lib/active_model/serializable_resource.rb +2 -0
  6. data/lib/active_model/serializer.rb +275 -81
  7. data/lib/active_model/serializer/adapter.rb +2 -0
  8. data/lib/active_model/serializer/adapter/attributes.rb +2 -0
  9. data/lib/active_model/serializer/adapter/base.rb +2 -0
  10. data/lib/active_model/serializer/adapter/json.rb +2 -0
  11. data/lib/active_model/serializer/adapter/json_api.rb +2 -0
  12. data/lib/active_model/serializer/adapter/null.rb +2 -0
  13. data/lib/active_model/serializer/array_serializer.rb +2 -0
  14. data/lib/active_model/serializer/association.rb +53 -14
  15. data/lib/active_model/serializer/attribute.rb +2 -0
  16. data/lib/active_model/serializer/belongs_to_reflection.rb +7 -1
  17. data/lib/active_model/serializer/collection_serializer.rb +8 -5
  18. data/lib/active_model/serializer/concerns/caching.rb +36 -23
  19. data/lib/active_model/serializer/error_serializer.rb +2 -0
  20. data/lib/active_model/serializer/errors_serializer.rb +2 -0
  21. data/lib/active_model/serializer/field.rb +2 -0
  22. data/lib/active_model/serializer/fieldset.rb +3 -1
  23. data/lib/active_model/serializer/has_many_reflection.rb +6 -1
  24. data/lib/active_model/serializer/has_one_reflection.rb +3 -1
  25. data/lib/active_model/serializer/lazy_association.rb +99 -0
  26. data/lib/active_model/serializer/link.rb +23 -0
  27. data/lib/active_model/serializer/lint.rb +2 -0
  28. data/lib/active_model/serializer/null.rb +2 -0
  29. data/lib/active_model/serializer/reflection.rb +122 -73
  30. data/lib/active_model/serializer/version.rb +3 -1
  31. data/lib/active_model_serializers.rb +29 -11
  32. data/lib/active_model_serializers/adapter.rb +3 -1
  33. data/lib/active_model_serializers/adapter/attributes.rb +23 -0
  34. data/lib/active_model_serializers/adapter/base.rb +4 -2
  35. data/lib/active_model_serializers/adapter/json.rb +2 -0
  36. data/lib/active_model_serializers/adapter/json_api.rb +44 -26
  37. data/lib/active_model_serializers/adapter/json_api/deserialization.rb +4 -2
  38. data/lib/active_model_serializers/adapter/json_api/error.rb +2 -0
  39. data/lib/active_model_serializers/adapter/json_api/jsonapi.rb +2 -0
  40. data/lib/active_model_serializers/adapter/json_api/link.rb +2 -0
  41. data/lib/active_model_serializers/adapter/json_api/meta.rb +2 -0
  42. data/lib/active_model_serializers/adapter/json_api/pagination_links.rb +42 -21
  43. data/lib/active_model_serializers/adapter/json_api/relationship.rb +52 -9
  44. data/lib/active_model_serializers/adapter/json_api/resource_identifier.rb +35 -18
  45. data/lib/active_model_serializers/adapter/null.rb +2 -0
  46. data/lib/active_model_serializers/callbacks.rb +2 -0
  47. data/lib/active_model_serializers/deprecate.rb +2 -0
  48. data/lib/active_model_serializers/deserialization.rb +2 -0
  49. data/lib/active_model_serializers/json_pointer.rb +2 -0
  50. data/lib/active_model_serializers/logging.rb +2 -0
  51. data/lib/active_model_serializers/lookup_chain.rb +2 -0
  52. data/lib/active_model_serializers/model.rb +111 -30
  53. data/lib/active_model_serializers/model/caching.rb +25 -0
  54. data/lib/active_model_serializers/railtie.rb +4 -0
  55. data/lib/active_model_serializers/register_jsonapi_renderer.rb +2 -0
  56. data/lib/active_model_serializers/serializable_resource.rb +4 -2
  57. data/lib/active_model_serializers/serialization_context.rb +2 -0
  58. data/lib/active_model_serializers/test.rb +2 -0
  59. data/lib/active_model_serializers/test/schema.rb +4 -2
  60. data/lib/active_model_serializers/test/serializer.rb +2 -0
  61. data/lib/generators/rails/resource_override.rb +3 -1
  62. data/lib/generators/rails/serializer_generator.rb +2 -0
  63. data/lib/grape/active_model_serializers.rb +2 -0
  64. data/lib/grape/formatters/active_model_serializers.rb +2 -0
  65. data/lib/grape/helpers/active_model_serializers.rb +2 -0
  66. data/lib/tasks/rubocop.rake +55 -0
  67. metadata +74 -291
  68. data/.github/ISSUE_TEMPLATE.md +0 -29
  69. data/.github/PULL_REQUEST_TEMPLATE.md +0 -15
  70. data/.gitignore +0 -35
  71. data/.rubocop.yml +0 -102
  72. data/.simplecov +0 -110
  73. data/.travis.yml +0 -51
  74. data/CODE_OF_CONDUCT.md +0 -74
  75. data/CONTRIBUTING.md +0 -105
  76. data/Gemfile +0 -56
  77. data/Rakefile +0 -103
  78. data/active_model_serializers.gemspec +0 -62
  79. data/appveyor.yml +0 -24
  80. data/bin/bench +0 -171
  81. data/bin/bench_regression +0 -316
  82. data/bin/serve_benchmark +0 -39
  83. data/docs/ARCHITECTURE.md +0 -125
  84. data/docs/README.md +0 -42
  85. data/docs/STYLE.md +0 -58
  86. data/docs/general/adapters.md +0 -247
  87. data/docs/general/caching.md +0 -58
  88. data/docs/general/configuration_options.md +0 -169
  89. data/docs/general/deserialization.md +0 -100
  90. data/docs/general/fields.md +0 -31
  91. data/docs/general/getting_started.md +0 -133
  92. data/docs/general/instrumentation.md +0 -40
  93. data/docs/general/key_transforms.md +0 -40
  94. data/docs/general/logging.md +0 -14
  95. data/docs/general/rendering.md +0 -294
  96. data/docs/general/serializers.md +0 -461
  97. data/docs/how-open-source-maintained.jpg +0 -0
  98. data/docs/howto/add_pagination_links.md +0 -138
  99. data/docs/howto/add_relationship_links.md +0 -137
  100. data/docs/howto/add_root_key.md +0 -55
  101. data/docs/howto/grape_integration.md +0 -42
  102. data/docs/howto/outside_controller_use.md +0 -65
  103. data/docs/howto/passing_arbitrary_options.md +0 -27
  104. data/docs/howto/serialize_poro.md +0 -32
  105. data/docs/howto/test.md +0 -154
  106. data/docs/howto/upgrade_from_0_8_to_0_10.md +0 -265
  107. data/docs/integrations/ember-and-json-api.md +0 -144
  108. data/docs/integrations/grape.md +0 -19
  109. data/docs/jsonapi/errors.md +0 -56
  110. data/docs/jsonapi/schema.md +0 -151
  111. data/docs/jsonapi/schema/schema.json +0 -366
  112. data/docs/rfcs/0000-namespace.md +0 -106
  113. data/docs/rfcs/template.md +0 -15
  114. data/lib/active_model/serializer/collection_reflection.rb +0 -7
  115. data/lib/active_model/serializer/concerns/associations.rb +0 -102
  116. data/lib/active_model/serializer/concerns/attributes.rb +0 -82
  117. data/lib/active_model/serializer/concerns/configuration.rb +0 -59
  118. data/lib/active_model/serializer/concerns/links.rb +0 -35
  119. data/lib/active_model/serializer/concerns/meta.rb +0 -29
  120. data/lib/active_model/serializer/concerns/type.rb +0 -25
  121. data/lib/active_model/serializer/singular_reflection.rb +0 -7
  122. data/lib/active_model_serializers/key_transform.rb +0 -74
  123. data/test/action_controller/adapter_selector_test.rb +0 -53
  124. data/test/action_controller/explicit_serializer_test.rb +0 -135
  125. data/test/action_controller/json/include_test.rb +0 -246
  126. data/test/action_controller/json_api/deserialization_test.rb +0 -112
  127. data/test/action_controller/json_api/errors_test.rb +0 -40
  128. data/test/action_controller/json_api/fields_test.rb +0 -57
  129. data/test/action_controller/json_api/linked_test.rb +0 -202
  130. data/test/action_controller/json_api/pagination_test.rb +0 -116
  131. data/test/action_controller/json_api/transform_test.rb +0 -181
  132. data/test/action_controller/lookup_proc_test.rb +0 -49
  133. data/test/action_controller/namespace_lookup_test.rb +0 -226
  134. data/test/action_controller/serialization_scope_name_test.rb +0 -229
  135. data/test/action_controller/serialization_test.rb +0 -472
  136. data/test/active_model_serializers/adapter_for_test.rb +0 -208
  137. data/test/active_model_serializers/json_pointer_test.rb +0 -22
  138. data/test/active_model_serializers/key_transform_test.rb +0 -297
  139. data/test/active_model_serializers/logging_test.rb +0 -77
  140. data/test/active_model_serializers/model_test.rb +0 -22
  141. data/test/active_model_serializers/railtie_test_isolated.rb +0 -63
  142. data/test/active_model_serializers/register_jsonapi_renderer_test_isolated.rb +0 -143
  143. data/test/active_model_serializers/serialization_context_test_isolated.rb +0 -71
  144. data/test/active_model_serializers/test/schema_test.rb +0 -130
  145. data/test/active_model_serializers/test/serializer_test.rb +0 -62
  146. data/test/active_record_test.rb +0 -9
  147. data/test/adapter/attributes_test.rb +0 -43
  148. data/test/adapter/deprecation_test.rb +0 -100
  149. data/test/adapter/json/belongs_to_test.rb +0 -45
  150. data/test/adapter/json/collection_test.rb +0 -104
  151. data/test/adapter/json/has_many_test.rb +0 -45
  152. data/test/adapter/json/transform_test.rb +0 -93
  153. data/test/adapter/json_api/belongs_to_test.rb +0 -155
  154. data/test/adapter/json_api/collection_test.rb +0 -96
  155. data/test/adapter/json_api/errors_test.rb +0 -76
  156. data/test/adapter/json_api/fields_test.rb +0 -88
  157. data/test/adapter/json_api/has_many_embed_ids_test.rb +0 -43
  158. data/test/adapter/json_api/has_many_explicit_serializer_test.rb +0 -96
  159. data/test/adapter/json_api/has_many_test.rb +0 -165
  160. data/test/adapter/json_api/has_one_test.rb +0 -80
  161. data/test/adapter/json_api/include_data_if_sideloaded_test.rb +0 -166
  162. data/test/adapter/json_api/json_api_test.rb +0 -33
  163. data/test/adapter/json_api/linked_test.rb +0 -413
  164. data/test/adapter/json_api/links_test.rb +0 -95
  165. data/test/adapter/json_api/pagination_links_test.rb +0 -193
  166. data/test/adapter/json_api/parse_test.rb +0 -137
  167. data/test/adapter/json_api/relationship_test.rb +0 -397
  168. data/test/adapter/json_api/resource_identifier_test.rb +0 -110
  169. data/test/adapter/json_api/resource_meta_test.rb +0 -100
  170. data/test/adapter/json_api/toplevel_jsonapi_test.rb +0 -82
  171. data/test/adapter/json_api/transform_test.rb +0 -504
  172. data/test/adapter/json_api/type_test.rb +0 -61
  173. data/test/adapter/json_test.rb +0 -46
  174. data/test/adapter/null_test.rb +0 -22
  175. data/test/adapter/polymorphic_test.rb +0 -171
  176. data/test/adapter_test.rb +0 -67
  177. data/test/array_serializer_test.rb +0 -22
  178. data/test/benchmark/app.rb +0 -65
  179. data/test/benchmark/benchmarking_support.rb +0 -67
  180. data/test/benchmark/bm_active_record.rb +0 -81
  181. data/test/benchmark/bm_adapter.rb +0 -38
  182. data/test/benchmark/bm_caching.rb +0 -119
  183. data/test/benchmark/bm_lookup_chain.rb +0 -83
  184. data/test/benchmark/bm_transform.rb +0 -45
  185. data/test/benchmark/config.ru +0 -3
  186. data/test/benchmark/controllers.rb +0 -83
  187. data/test/benchmark/fixtures.rb +0 -219
  188. data/test/cache_test.rb +0 -579
  189. data/test/collection_serializer_test.rb +0 -110
  190. data/test/fixtures/active_record.rb +0 -78
  191. data/test/fixtures/poro.rb +0 -286
  192. data/test/generators/scaffold_controller_generator_test.rb +0 -24
  193. data/test/generators/serializer_generator_test.rb +0 -74
  194. data/test/grape_test.rb +0 -178
  195. data/test/lint_test.rb +0 -49
  196. data/test/logger_test.rb +0 -20
  197. data/test/poro_test.rb +0 -9
  198. data/test/serializable_resource_test.rb +0 -79
  199. data/test/serializers/association_macros_test.rb +0 -37
  200. data/test/serializers/associations_test.rb +0 -370
  201. data/test/serializers/attribute_test.rb +0 -151
  202. data/test/serializers/attributes_test.rb +0 -52
  203. data/test/serializers/caching_configuration_test_isolated.rb +0 -170
  204. data/test/serializers/configuration_test.rb +0 -32
  205. data/test/serializers/fieldset_test.rb +0 -14
  206. data/test/serializers/meta_test.rb +0 -202
  207. data/test/serializers/options_test.rb +0 -21
  208. data/test/serializers/read_attribute_for_serialization_test.rb +0 -79
  209. data/test/serializers/root_test.rb +0 -21
  210. data/test/serializers/serialization_test.rb +0 -55
  211. data/test/serializers/serializer_for_test.rb +0 -136
  212. data/test/serializers/serializer_for_with_namespace_test.rb +0 -87
  213. data/test/support/custom_schemas/active_model_serializers/test/schema_test/my/index.json +0 -6
  214. data/test/support/isolated_unit.rb +0 -82
  215. data/test/support/rails5_shims.rb +0 -53
  216. data/test/support/rails_app.rb +0 -36
  217. data/test/support/schemas/active_model_serializers/test/schema_test/my/index.json +0 -6
  218. data/test/support/schemas/active_model_serializers/test/schema_test/my/show.json +0 -6
  219. data/test/support/schemas/custom/show.json +0 -7
  220. data/test/support/schemas/hyper_schema.json +0 -93
  221. data/test/support/schemas/render_using_json_api.json +0 -43
  222. data/test/support/schemas/simple_json_pointers.json +0 -10
  223. data/test/support/serialization_testing.rb +0 -71
  224. data/test/test_helper.rb +0 -58
@@ -1,25 +0,0 @@
1
- module ActiveModel
2
- class Serializer
3
- module Type
4
- extend ActiveSupport::Concern
5
-
6
- included do
7
- with_options instance_writer: false, instance_reader: true do |serializer|
8
- serializer.class_attribute :_type # @api private
9
- end
10
-
11
- extend ActiveSupport::Autoload
12
- end
13
-
14
- module ClassMethods
15
- # Set the JSON API type of a serializer.
16
- # @example
17
- # class AdminAuthorSerializer < ActiveModel::Serializer
18
- # type 'authors'
19
- def type(type)
20
- self._type = type && type.to_s
21
- end
22
- end
23
- end
24
- end
25
- end
@@ -1,7 +0,0 @@
1
- module ActiveModel
2
- class Serializer
3
- # @api private
4
- class SingularReflection < Reflection
5
- end
6
- end
7
- end
@@ -1,74 +0,0 @@
1
- require 'active_support/core_ext/hash/keys'
2
-
3
- module ActiveModelSerializers
4
- module KeyTransform
5
- module_function
6
-
7
- # Transforms values to UpperCamelCase or PascalCase.
8
- #
9
- # @example:
10
- # "some_key" => "SomeKey",
11
- # @see {https://github.com/rails/rails/blob/master/activesupport/lib/active_support/inflector/methods.rb#L66-L76 ActiveSupport::Inflector.camelize}
12
- def camel(value)
13
- case value
14
- when Array then value.map { |item| camel(item) }
15
- when Hash then value.deep_transform_keys! { |key| camel(key) }
16
- when Symbol then camel(value.to_s).to_sym
17
- when String then value.underscore.camelize
18
- else value
19
- end
20
- end
21
-
22
- # Transforms values to camelCase.
23
- #
24
- # @example:
25
- # "some_key" => "someKey",
26
- # @see {https://github.com/rails/rails/blob/master/activesupport/lib/active_support/inflector/methods.rb#L66-L76 ActiveSupport::Inflector.camelize}
27
- def camel_lower(value)
28
- case value
29
- when Array then value.map { |item| camel_lower(item) }
30
- when Hash then value.deep_transform_keys! { |key| camel_lower(key) }
31
- when Symbol then camel_lower(value.to_s).to_sym
32
- when String then value.underscore.camelize(:lower)
33
- else value
34
- end
35
- end
36
-
37
- # Transforms values to dashed-case.
38
- # This is the default case for the JsonApi adapter.
39
- #
40
- # @example:
41
- # "some_key" => "some-key",
42
- # @see {https://github.com/rails/rails/blob/master/activesupport/lib/active_support/inflector/methods.rb#L185-L187 ActiveSupport::Inflector.dasherize}
43
- def dash(value)
44
- case value
45
- when Array then value.map { |item| dash(item) }
46
- when Hash then value.deep_transform_keys! { |key| dash(key) }
47
- when Symbol then dash(value.to_s).to_sym
48
- when String then value.underscore.dasherize
49
- else value
50
- end
51
- end
52
-
53
- # Transforms values to underscore_case.
54
- # This is the default case for deserialization in the JsonApi adapter.
55
- #
56
- # @example:
57
- # "some-key" => "some_key",
58
- # @see {https://github.com/rails/rails/blob/master/activesupport/lib/active_support/inflector/methods.rb#L89-L98 ActiveSupport::Inflector.underscore}
59
- def underscore(value)
60
- case value
61
- when Array then value.map { |item| underscore(item) }
62
- when Hash then value.deep_transform_keys! { |key| underscore(key) }
63
- when Symbol then underscore(value.to_s).to_sym
64
- when String then value.underscore
65
- else value
66
- end
67
- end
68
-
69
- # Returns the value unaltered
70
- def unaltered(value)
71
- value
72
- end
73
- end
74
- end
@@ -1,53 +0,0 @@
1
- require 'test_helper'
2
-
3
- module ActionController
4
- module Serialization
5
- class AdapterSelectorTest < ActionController::TestCase
6
- class AdapterSelectorTestController < ActionController::Base
7
- def render_using_default_adapter
8
- @profile = Profile.new(name: 'Name 1', description: 'Description 1', comments: 'Comments 1')
9
- render json: @profile
10
- end
11
-
12
- def render_using_adapter_override
13
- @profile = Profile.new(name: 'Name 1', description: 'Description 1', comments: 'Comments 1')
14
- render json: @profile, adapter: :json_api
15
- end
16
-
17
- def render_skipping_adapter
18
- @profile = Profile.new(name: 'Name 1', description: 'Description 1', comments: 'Comments 1')
19
- render json: @profile, adapter: false
20
- end
21
- end
22
-
23
- tests AdapterSelectorTestController
24
-
25
- def test_render_using_default_adapter
26
- get :render_using_default_adapter
27
- assert_equal '{"name":"Name 1","description":"Description 1"}', response.body
28
- end
29
-
30
- def test_render_using_adapter_override
31
- get :render_using_adapter_override
32
-
33
- expected = {
34
- data: {
35
- id: @controller.instance_variable_get(:@profile).id.to_s,
36
- type: 'profiles',
37
- attributes: {
38
- name: 'Name 1',
39
- description: 'Description 1'
40
- }
41
- }
42
- }
43
-
44
- assert_equal expected.to_json, response.body
45
- end
46
-
47
- def test_render_skipping_adapter
48
- get :render_skipping_adapter
49
- assert_equal '{"name":"Name 1","description":"Description 1","comments":"Comments 1"}', response.body
50
- end
51
- end
52
- end
53
- 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