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,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'test_helper'
4
+
5
+ module ActiveModel
6
+ class Serializer
7
+ class RootTest < ActiveSupport::TestCase
8
+ def setup
9
+ @virtual_value = VirtualValue.new(id: 1)
10
+ end
11
+
12
+ def test_overwrite_root
13
+ serializer = VirtualValueSerializer.new(@virtual_value, root: 'smth')
14
+ assert_equal('smth', serializer.json_key)
15
+ end
16
+
17
+ def test_underscore_in_root
18
+ serializer = VirtualValueSerializer.new(@virtual_value)
19
+ assert_equal('virtual_value', serializer.json_key)
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,57 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ActiveModel
4
+ class Serializer
5
+ class SerializationTest < ActiveSupport::TestCase
6
+ class Blog < ActiveModelSerializers::Model
7
+ attributes :id, :name, :authors
8
+ end
9
+ class Author < ActiveModelSerializers::Model
10
+ attributes :id, :name
11
+ end
12
+ class BlogSerializer < ActiveModel::Serializer
13
+ attributes :id
14
+ attribute :name, key: :title
15
+
16
+ has_many :authors
17
+ end
18
+ class AuthorSerializer < ActiveModel::Serializer
19
+ attributes :id, :name
20
+ end
21
+
22
+ setup do
23
+ @authors = [Author.new(id: 1, name: 'Blog Author')]
24
+ @blog = Blog.new(id: 2, name: 'The Blog', authors: @authors)
25
+ @serializer_instance = BlogSerializer.new(@blog)
26
+ @serializable = ActiveModelSerializers::SerializableResource.new(@blog, serializer: BlogSerializer, adapter: :attributes)
27
+ @expected_hash = { id: 2, title: 'The Blog', authors: [{ id: 1, name: 'Blog Author' }] }
28
+ @expected_json = '{"id":2,"title":"The Blog","authors":[{"id":1,"name":"Blog Author"}]}'
29
+ end
30
+
31
+ test '#serializable_hash is the same as generated by the attributes adapter' do
32
+ assert_equal @serializable.serializable_hash, @serializer_instance.serializable_hash
33
+ assert_equal @expected_hash, @serializer_instance.serializable_hash
34
+ end
35
+
36
+ test '#as_json is the same as generated by the attributes adapter' do
37
+ assert_equal @serializable.as_json, @serializer_instance.as_json
38
+ assert_equal @expected_hash, @serializer_instance.as_json
39
+ end
40
+
41
+ test '#to_json is the same as generated by the attributes adapter' do
42
+ assert_equal @serializable.to_json, @serializer_instance.to_json
43
+ assert_equal @expected_json, @serializer_instance.to_json
44
+ end
45
+
46
+ test '#to_h is an alias for #serializable_hash' do
47
+ assert_equal @serializable.serializable_hash, @serializer_instance.to_h
48
+ assert_equal @expected_hash, @serializer_instance.to_h
49
+ end
50
+
51
+ test '#to_hash is an alias for #serializable_hash' do
52
+ assert_equal @serializable.serializable_hash, @serializer_instance.to_hash
53
+ assert_equal @expected_hash, @serializer_instance.to_hash
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,138 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'test_helper'
4
+
5
+ module ActiveModel
6
+ class Serializer
7
+ class SerializerForTest < ActiveSupport::TestCase
8
+ class CollectionSerializerTest < ActiveSupport::TestCase
9
+ def setup
10
+ @array = [1, 2, 3]
11
+ @previous_collection_serializer = ActiveModelSerializers.config.collection_serializer
12
+ end
13
+
14
+ def teardown
15
+ ActiveModelSerializers.config.collection_serializer = @previous_collection_serializer
16
+ end
17
+
18
+ def test_serializer_for_array
19
+ serializer = ActiveModel::Serializer.serializer_for(@array)
20
+ assert_equal ActiveModelSerializers.config.collection_serializer, serializer
21
+ end
22
+
23
+ def test_overwritten_serializer_for_array
24
+ new_collection_serializer = Class.new
25
+ ActiveModelSerializers.config.collection_serializer = new_collection_serializer
26
+ serializer = ActiveModel::Serializer.serializer_for(@array)
27
+ assert_equal new_collection_serializer, serializer
28
+ end
29
+ end
30
+
31
+ class SerializerTest < ActiveSupport::TestCase
32
+ module ResourceNamespace
33
+ class Post < ::Model; end
34
+ class Comment < ::Model; end
35
+
36
+ class PostSerializer < ActiveModel::Serializer
37
+ class CommentSerializer < ActiveModel::Serializer
38
+ end
39
+ end
40
+ end
41
+
42
+ class MyProfile < Profile
43
+ end
44
+
45
+ class CustomProfile
46
+ def serializer_class
47
+ ProfileSerializer
48
+ end
49
+ end
50
+
51
+ class Tweet < ::Model; end
52
+ TweetSerializer = Class.new
53
+
54
+ def setup
55
+ @profile = Profile.new
56
+ @my_profile = MyProfile.new
57
+ @custom_profile = CustomProfile.new
58
+ @model = ::Model.new
59
+ @tweet = Tweet.new
60
+ end
61
+
62
+ def test_serializer_for_non_ams_serializer
63
+ serializer = ActiveModel::Serializer.serializer_for(@tweet)
64
+ assert_nil serializer
65
+ end
66
+
67
+ def test_serializer_for_existing_serializer
68
+ serializer = ActiveModel::Serializer.serializer_for(@profile)
69
+ assert_equal ProfileSerializer, serializer
70
+ end
71
+
72
+ def test_serializer_for_existing_serializer_with_lookup_disabled
73
+ serializer = with_serializer_lookup_disabled do
74
+ ActiveModel::Serializer.serializer_for(@profile)
75
+ end
76
+ assert_nil serializer
77
+ end
78
+
79
+ def test_serializer_for_not_existing_serializer
80
+ serializer = ActiveModel::Serializer.serializer_for(@model)
81
+ assert_nil serializer
82
+ end
83
+
84
+ def test_serializer_inherited_serializer
85
+ serializer = ActiveModel::Serializer.serializer_for(@my_profile)
86
+ assert_equal ProfileSerializer, serializer
87
+ end
88
+
89
+ def test_serializer_inherited_serializer_with_lookup_disabled
90
+ serializer = with_serializer_lookup_disabled do
91
+ ActiveModel::Serializer.serializer_for(@my_profile)
92
+ end
93
+ assert_nil serializer
94
+ end
95
+
96
+ def test_serializer_custom_serializer
97
+ serializer = ActiveModel::Serializer.serializer_for(@custom_profile)
98
+ assert_equal ProfileSerializer, serializer
99
+ end
100
+
101
+ def test_serializer_custom_serializer_with_lookup_disabled
102
+ serializer = with_serializer_lookup_disabled do
103
+ ActiveModel::Serializer.serializer_for(@custom_profile)
104
+ end
105
+ assert_equal ProfileSerializer, serializer
106
+ end
107
+
108
+ def test_serializer_for_namespaced_resource
109
+ post = ResourceNamespace::Post.new
110
+ serializer = ActiveModel::Serializer.serializer_for(post)
111
+ assert_equal ResourceNamespace::PostSerializer, serializer
112
+ end
113
+
114
+ def test_serializer_for_namespaced_resource_with_lookup_disabled
115
+ post = ResourceNamespace::Post.new
116
+ serializer = with_serializer_lookup_disabled do
117
+ ActiveModel::Serializer.serializer_for(post)
118
+ end
119
+ assert_nil serializer
120
+ end
121
+
122
+ def test_serializer_for_nested_resource
123
+ comment = ResourceNamespace::Comment.new
124
+ serializer = ResourceNamespace::PostSerializer.serializer_for(comment)
125
+ assert_equal ResourceNamespace::PostSerializer::CommentSerializer, serializer
126
+ end
127
+
128
+ def test_serializer_for_nested_resource_with_lookup_disabled
129
+ comment = ResourceNamespace::Comment.new
130
+ serializer = with_serializer_lookup_disabled do
131
+ ResourceNamespace::PostSerializer.serializer_for(comment)
132
+ end
133
+ assert_nil serializer
134
+ end
135
+ end
136
+ end
137
+ end
138
+ end
@@ -0,0 +1,90 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'test_helper'
4
+
5
+ module ActiveModel
6
+ class Serializer
7
+ class SerializerForWithNamespaceTest < ActiveSupport::TestCase
8
+ class Book < ::Model
9
+ attributes :title, :author_name
10
+ associations :publisher, :pages
11
+ end
12
+ class Page < ::Model; attributes :number, :text end
13
+ class Publisher < ::Model; attributes :name end
14
+
15
+ module Api
16
+ module V3
17
+ class BookSerializer < ActiveModel::Serializer
18
+ attributes :title, :author_name
19
+
20
+ has_many :pages
21
+ belongs_to :publisher
22
+ end
23
+
24
+ class PageSerializer < ActiveModel::Serializer
25
+ attributes :number, :text
26
+ end
27
+
28
+ class PublisherSerializer < ActiveModel::Serializer
29
+ attributes :name
30
+ end
31
+ end
32
+ end
33
+
34
+ class BookSerializer < ActiveModel::Serializer
35
+ attributes :title, :author_name
36
+ end
37
+ test 'resource without a namespace' do
38
+ book = Book.new(title: 'A Post', author_name: 'hello')
39
+
40
+ # TODO: this should be able to pull up this serializer without explicitly specifying the serializer
41
+ # currently, with no options, it still uses the Api::V3 serializer
42
+ result = ActiveModelSerializers::SerializableResource.new(book, serializer: BookSerializer).serializable_hash
43
+
44
+ expected = { title: 'A Post', author_name: 'hello' }
45
+ assert_equal expected, result
46
+ end
47
+
48
+ test 'resource with namespace' do
49
+ book = Book.new(title: 'A Post', author_name: 'hi')
50
+
51
+ result = ActiveModelSerializers::SerializableResource.new(book, namespace: Api::V3).serializable_hash
52
+
53
+ expected = { title: 'A Post', author_name: 'hi', pages: nil, publisher: nil }
54
+ assert_equal expected, result
55
+ end
56
+
57
+ test 'has_many with nested serializer under the namespace' do
58
+ page = Page.new(number: 1, text: 'hello')
59
+ book = Book.new(title: 'A Post', author_name: 'hi', pages: [page])
60
+
61
+ result = ActiveModelSerializers::SerializableResource.new(book, namespace: Api::V3).serializable_hash
62
+
63
+ expected = {
64
+ title: 'A Post', author_name: 'hi',
65
+ publisher: nil,
66
+ pages: [{
67
+ number: 1, text: 'hello'
68
+ }]
69
+ }
70
+ assert_equal expected, result
71
+ end
72
+
73
+ test 'belongs_to with nested serializer under the namespace' do
74
+ publisher = Publisher.new(name: 'Disney')
75
+ book = Book.new(title: 'A Post', author_name: 'hi', publisher: publisher)
76
+
77
+ result = ActiveModelSerializers::SerializableResource.new(book, namespace: Api::V3).serializable_hash
78
+
79
+ expected = {
80
+ title: 'A Post', author_name: 'hi',
81
+ pages: nil,
82
+ publisher: {
83
+ name: 'Disney'
84
+ }
85
+ }
86
+ assert_equal expected, result
87
+ end
88
+ end
89
+ end
90
+ end
@@ -0,0 +1,6 @@
1
+ {
2
+ "properties": {
3
+ "name" : { "type" : "string" },
4
+ "description" : { "type" : "string" }
5
+ }
6
+ }
@@ -0,0 +1,86 @@
1
+ # frozen_string_literal: true
2
+
3
+ # https://github.com/rails/rails/blob/v5.0.0.beta1/railties/test/isolation/abstract_unit.rb
4
+
5
+ # Usage Example:
6
+ #
7
+ # require 'support/isolated_unit'
8
+ #
9
+ # class RailtieTest < ActiveSupport::TestCase
10
+ # include ActiveSupport::Testing::Isolation
11
+ #
12
+ # class WithRailsDefinedOnLoad < RailtieTest
13
+ # setup do
14
+ # require 'rails'
15
+ # require 'active_model_serializers'
16
+ # make_basic_app
17
+ # end
18
+ #
19
+ # # some tests
20
+ # end
21
+ #
22
+ # class WithoutRailsDefinedOnLoad < RailtieTest
23
+ # setup do
24
+ # require 'active_model_serializers'
25
+ # make_basic_app
26
+ # end
27
+ #
28
+ # # some tests
29
+ # end
30
+ # end
31
+ #
32
+ # Note:
33
+ # It is important to keep this file as light as possible
34
+ # the goal for tests that require this is to test booting up
35
+ # rails from an empty state, so anything added here could
36
+ # hide potential failures
37
+ #
38
+ # It is also good to know what is the bare minimum to get
39
+ # Rails booted up.
40
+ require 'bundler/setup' unless defined?(Bundler)
41
+ require 'active_support'
42
+ require 'active_support/core_ext/string/access'
43
+
44
+ # These files do not require any others and are needed
45
+ # to run the tests
46
+ require 'active_support/testing/autorun'
47
+ require 'active_support/testing/isolation'
48
+
49
+ module TestHelpers
50
+ module Generation
51
+ module_function
52
+
53
+ # Make a very basic app, without creating the whole directory structure.
54
+ # Is faster and simpler than generating a Rails app in a temp directory
55
+ def make_basic_app
56
+ require 'rails'
57
+ require 'action_controller/railtie'
58
+
59
+ app = Class.new(Rails::Application) do
60
+ config.eager_load = false
61
+ config.session_store :cookie_store, key: '_myapp_session'
62
+ config.active_support.deprecation = :log
63
+ config.active_support.test_order = :parallel
64
+ ActiveSupport::TestCase.respond_to?(:test_order=) && ActiveSupport::TestCase.test_order = :parallel
65
+ config.root = File.dirname(__FILE__)
66
+ config.log_level = :info
67
+ # Set a fake logger to avoid creating the log directory automatically
68
+ fake_logger = Logger.new(nil)
69
+ config.logger = fake_logger
70
+ Rails.application.routes.default_url_options = { host: 'example.com' }
71
+ end
72
+ def app.name; 'IsolatedRailsApp'; end # rubocop:disable Style/SingleLineMethods
73
+ app.respond_to?(:secrets) && app.secrets.secret_key_base = '3b7cd727ee24e8444053437c36cc66c4'
74
+
75
+ @app = app
76
+ yield @app if block_given?
77
+ @app.initialize!
78
+ end
79
+ end
80
+ end
81
+
82
+ module ActiveSupport
83
+ class TestCase
84
+ include TestHelpers::Generation
85
+ end
86
+ end
@@ -0,0 +1,55 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Rails5Shims
4
+ module ControllerTests
5
+ # https://github.com/rails/rails/blob/b217354/actionpack/lib/action_controller/test_case.rb
6
+ REQUEST_KWARGS = [:params, :headers, :session, :flash, :method, :body, :xhr].freeze
7
+
8
+ def get(path, *args)
9
+ fold_kwargs!(args)
10
+ super
11
+ end
12
+
13
+ def post(path, *args)
14
+ fold_kwargs!(args)
15
+ super
16
+ end
17
+
18
+ def patch(path, *args)
19
+ fold_kwargs!(args)
20
+ super
21
+ end
22
+
23
+ def put(path, *args)
24
+ fold_kwargs!(args)
25
+ super
26
+ end
27
+
28
+ # Fold kwargs from test request into args
29
+ # Band-aid for DEPRECATION WARNING
30
+ def fold_kwargs!(args)
31
+ hash = args && args[0]
32
+ return unless hash.respond_to?(:key)
33
+ Rails5Shims::ControllerTests::REQUEST_KWARGS.each do |kwarg|
34
+ next unless hash.key?(kwarg)
35
+ value = hash.delete(kwarg)
36
+ if value.is_a? String
37
+ args.insert(0, value)
38
+ else
39
+ hash.merge! value
40
+ end
41
+ end
42
+ end
43
+
44
+ # Uncomment for debugging where the kwargs warnings come from
45
+ # def non_kwarg_request_warning
46
+ # super.tap do
47
+ # STDOUT.puts caller[2..3]
48
+ # end
49
+ # end
50
+ end
51
+ end
52
+ if Rails::VERSION::MAJOR < 5
53
+ ActionController::TestCase.send :include, Rails5Shims::ControllerTests
54
+ ActionDispatch::IntegrationTest.send :include, Rails5Shims::ControllerTests
55
+ end