active_model_serializers 0.8.3 → 0.10.0

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 (232) hide show
  1. checksums.yaml +4 -4
  2. data/.github/ISSUE_TEMPLATE.md +29 -0
  3. data/.github/PULL_REQUEST_TEMPLATE.md +15 -0
  4. data/.gitignore +17 -0
  5. data/.rubocop.yml +104 -0
  6. data/.rubocop_todo.yml +167 -0
  7. data/.simplecov +110 -0
  8. data/.travis.yml +39 -24
  9. data/CHANGELOG.md +465 -6
  10. data/CONTRIBUTING.md +105 -0
  11. data/Gemfile +50 -1
  12. data/{MIT-LICENSE.txt → MIT-LICENSE} +3 -2
  13. data/README.md +102 -590
  14. data/Rakefile +93 -8
  15. data/active_model_serializers.gemspec +65 -23
  16. data/appveyor.yml +24 -0
  17. data/bin/bench +171 -0
  18. data/bin/bench_regression +316 -0
  19. data/bin/serve_benchmark +39 -0
  20. data/docs/ARCHITECTURE.md +126 -0
  21. data/docs/README.md +40 -0
  22. data/docs/STYLE.md +58 -0
  23. data/docs/general/adapters.md +245 -0
  24. data/docs/general/caching.md +52 -0
  25. data/docs/general/configuration_options.md +100 -0
  26. data/docs/general/deserialization.md +100 -0
  27. data/docs/general/getting_started.md +133 -0
  28. data/docs/general/instrumentation.md +40 -0
  29. data/docs/general/key_transforms.md +40 -0
  30. data/docs/general/logging.md +14 -0
  31. data/docs/general/rendering.md +255 -0
  32. data/docs/general/serializers.md +372 -0
  33. data/docs/how-open-source-maintained.jpg +0 -0
  34. data/docs/howto/add_pagination_links.md +139 -0
  35. data/docs/howto/add_root_key.md +51 -0
  36. data/docs/howto/outside_controller_use.md +58 -0
  37. data/docs/howto/passing_arbitrary_options.md +27 -0
  38. data/docs/howto/serialize_poro.md +32 -0
  39. data/docs/howto/test.md +152 -0
  40. data/docs/integrations/ember-and-json-api.md +112 -0
  41. data/docs/integrations/grape.md +19 -0
  42. data/docs/jsonapi/errors.md +56 -0
  43. data/docs/jsonapi/schema/schema.json +366 -0
  44. data/docs/jsonapi/schema.md +151 -0
  45. data/docs/rfcs/0000-namespace.md +106 -0
  46. data/docs/rfcs/template.md +15 -0
  47. data/lib/action_controller/serialization.rb +31 -36
  48. data/lib/active_model/serializable_resource.rb +11 -0
  49. data/lib/active_model/serializer/adapter/attributes.rb +15 -0
  50. data/lib/active_model/serializer/adapter/base.rb +16 -0
  51. data/lib/active_model/serializer/adapter/json.rb +15 -0
  52. data/lib/active_model/serializer/adapter/json_api.rb +15 -0
  53. data/lib/active_model/serializer/adapter/null.rb +15 -0
  54. data/lib/active_model/serializer/adapter.rb +24 -0
  55. data/lib/active_model/serializer/array_serializer.rb +9 -0
  56. data/lib/active_model/serializer/association.rb +19 -0
  57. data/lib/active_model/serializer/associations.rb +87 -220
  58. data/lib/active_model/serializer/attribute.rb +25 -0
  59. data/lib/active_model/serializer/attributes.rb +82 -0
  60. data/lib/active_model/serializer/belongs_to_reflection.rb +10 -0
  61. data/lib/active_model/serializer/caching.rb +333 -0
  62. data/lib/active_model/serializer/collection_reflection.rb +7 -0
  63. data/lib/active_model/serializer/collection_serializer.rb +64 -0
  64. data/lib/active_model/serializer/configuration.rb +35 -0
  65. data/lib/active_model/serializer/error_serializer.rb +10 -0
  66. data/lib/active_model/serializer/errors_serializer.rb +27 -0
  67. data/lib/active_model/serializer/field.rb +90 -0
  68. data/lib/active_model/serializer/fieldset.rb +31 -0
  69. data/lib/active_model/serializer/has_many_reflection.rb +10 -0
  70. data/lib/active_model/serializer/has_one_reflection.rb +10 -0
  71. data/lib/active_model/serializer/include_tree.rb +111 -0
  72. data/lib/active_model/serializer/links.rb +35 -0
  73. data/lib/active_model/serializer/lint.rb +146 -0
  74. data/lib/active_model/serializer/meta.rb +29 -0
  75. data/lib/active_model/serializer/null.rb +17 -0
  76. data/lib/active_model/serializer/reflection.rb +147 -0
  77. data/lib/active_model/serializer/singular_reflection.rb +7 -0
  78. data/lib/active_model/serializer/type.rb +25 -0
  79. data/lib/active_model/{serializers → serializer}/version.rb +1 -1
  80. data/lib/active_model/serializer.rb +158 -481
  81. data/lib/active_model_serializers/adapter/attributes.rb +76 -0
  82. data/lib/active_model_serializers/adapter/base.rb +83 -0
  83. data/lib/active_model_serializers/adapter/json.rb +21 -0
  84. data/lib/active_model_serializers/adapter/json_api/deserialization.rb +213 -0
  85. data/lib/active_model_serializers/adapter/json_api/error.rb +96 -0
  86. data/lib/active_model_serializers/adapter/json_api/jsonapi.rb +49 -0
  87. data/lib/active_model_serializers/adapter/json_api/link.rb +83 -0
  88. data/lib/active_model_serializers/adapter/json_api/meta.rb +37 -0
  89. data/lib/active_model_serializers/adapter/json_api/pagination_links.rb +62 -0
  90. data/lib/active_model_serializers/adapter/json_api/relationship.rb +52 -0
  91. data/lib/active_model_serializers/adapter/json_api/resource_identifier.rb +37 -0
  92. data/lib/active_model_serializers/adapter/json_api.rb +516 -0
  93. data/lib/active_model_serializers/adapter/null.rb +9 -0
  94. data/lib/active_model_serializers/adapter.rb +92 -0
  95. data/lib/active_model_serializers/callbacks.rb +55 -0
  96. data/lib/active_model_serializers/deprecate.rb +55 -0
  97. data/lib/active_model_serializers/deserialization.rb +13 -0
  98. data/lib/active_model_serializers/json_pointer.rb +14 -0
  99. data/lib/active_model_serializers/key_transform.rb +70 -0
  100. data/lib/active_model_serializers/logging.rb +122 -0
  101. data/lib/active_model_serializers/model.rb +49 -0
  102. data/lib/active_model_serializers/railtie.rb +46 -0
  103. data/lib/active_model_serializers/register_jsonapi_renderer.rb +65 -0
  104. data/lib/active_model_serializers/serializable_resource.rb +81 -0
  105. data/lib/active_model_serializers/serialization_context.rb +32 -0
  106. data/lib/active_model_serializers/test/schema.rb +138 -0
  107. data/lib/active_model_serializers/test/serializer.rb +125 -0
  108. data/lib/active_model_serializers/test.rb +7 -0
  109. data/lib/active_model_serializers.rb +32 -89
  110. data/lib/generators/rails/USAGE +6 -0
  111. data/lib/generators/rails/resource_override.rb +10 -0
  112. data/lib/generators/rails/serializer_generator.rb +36 -0
  113. data/lib/generators/rails/templates/serializer.rb.erb +8 -0
  114. data/lib/grape/active_model_serializers.rb +14 -0
  115. data/lib/grape/formatters/active_model_serializers.rb +15 -0
  116. data/lib/grape/helpers/active_model_serializers.rb +16 -0
  117. data/test/action_controller/adapter_selector_test.rb +53 -0
  118. data/test/action_controller/explicit_serializer_test.rb +134 -0
  119. data/test/action_controller/json/include_test.rb +167 -0
  120. data/test/action_controller/json_api/deserialization_test.rb +112 -0
  121. data/test/action_controller/json_api/errors_test.rb +41 -0
  122. data/test/action_controller/json_api/linked_test.rb +197 -0
  123. data/test/action_controller/json_api/pagination_test.rb +116 -0
  124. data/test/action_controller/json_api/transform_test.rb +181 -0
  125. data/test/action_controller/serialization_scope_name_test.rb +229 -0
  126. data/test/action_controller/serialization_test.rb +469 -0
  127. data/test/active_model_serializers/adapter_for_test.rb +208 -0
  128. data/test/active_model_serializers/json_pointer_test.rb +20 -0
  129. data/test/active_model_serializers/key_transform_test.rb +263 -0
  130. data/test/active_model_serializers/logging_test.rb +77 -0
  131. data/test/active_model_serializers/model_test.rb +9 -0
  132. data/test/active_model_serializers/railtie_test_isolated.rb +63 -0
  133. data/test/active_model_serializers/serialization_context_test_isolated.rb +58 -0
  134. data/test/active_model_serializers/test/schema_test.rb +130 -0
  135. data/test/active_model_serializers/test/serializer_test.rb +62 -0
  136. data/test/active_record_test.rb +9 -0
  137. data/test/adapter/deprecation_test.rb +100 -0
  138. data/test/adapter/json/belongs_to_test.rb +45 -0
  139. data/test/adapter/json/collection_test.rb +90 -0
  140. data/test/adapter/json/has_many_test.rb +45 -0
  141. data/test/adapter/json/transform_test.rb +93 -0
  142. data/test/adapter/json_api/belongs_to_test.rb +155 -0
  143. data/test/adapter/json_api/collection_test.rb +95 -0
  144. data/test/adapter/json_api/errors_test.rb +78 -0
  145. data/test/adapter/json_api/fields_test.rb +87 -0
  146. data/test/adapter/json_api/has_many_embed_ids_test.rb +43 -0
  147. data/test/adapter/json_api/has_many_explicit_serializer_test.rb +96 -0
  148. data/test/adapter/json_api/has_many_test.rb +144 -0
  149. data/test/adapter/json_api/has_one_test.rb +80 -0
  150. data/test/adapter/json_api/json_api_test.rb +35 -0
  151. data/test/adapter/json_api/linked_test.rb +392 -0
  152. data/test/adapter/json_api/links_test.rb +93 -0
  153. data/test/adapter/json_api/pagination_links_test.rb +166 -0
  154. data/test/adapter/json_api/parse_test.rb +137 -0
  155. data/test/adapter/json_api/relationship_test.rb +161 -0
  156. data/test/adapter/json_api/relationships_test.rb +199 -0
  157. data/test/adapter/json_api/resource_identifier_test.rb +85 -0
  158. data/test/adapter/json_api/resource_meta_test.rb +100 -0
  159. data/test/adapter/json_api/toplevel_jsonapi_test.rb +82 -0
  160. data/test/adapter/json_api/transform_test.rb +502 -0
  161. data/test/adapter/json_api/type_test.rb +61 -0
  162. data/test/adapter/json_test.rb +45 -0
  163. data/test/adapter/null_test.rb +23 -0
  164. data/test/adapter/polymorphic_test.rb +171 -0
  165. data/test/adapter_test.rb +67 -0
  166. data/test/array_serializer_test.rb +20 -73
  167. data/test/benchmark/app.rb +65 -0
  168. data/test/benchmark/benchmarking_support.rb +67 -0
  169. data/test/benchmark/bm_caching.rb +119 -0
  170. data/test/benchmark/bm_transform.rb +34 -0
  171. data/test/benchmark/config.ru +3 -0
  172. data/test/benchmark/controllers.rb +84 -0
  173. data/test/benchmark/fixtures.rb +219 -0
  174. data/test/cache_test.rb +485 -0
  175. data/test/collection_serializer_test.rb +110 -0
  176. data/test/fixtures/active_record.rb +78 -0
  177. data/test/fixtures/poro.rb +282 -0
  178. data/test/generators/scaffold_controller_generator_test.rb +24 -0
  179. data/test/generators/serializer_generator_test.rb +57 -0
  180. data/test/grape_test.rb +82 -0
  181. data/test/include_tree/from_include_args_test.rb +26 -0
  182. data/test/include_tree/from_string_test.rb +94 -0
  183. data/test/include_tree/include_args_to_hash_test.rb +64 -0
  184. data/test/lint_test.rb +49 -0
  185. data/test/logger_test.rb +18 -0
  186. data/test/poro_test.rb +9 -0
  187. data/test/serializable_resource_test.rb +83 -0
  188. data/test/serializers/association_macros_test.rb +36 -0
  189. data/test/serializers/associations_test.rb +295 -0
  190. data/test/serializers/attribute_test.rb +151 -0
  191. data/test/serializers/attributes_test.rb +52 -0
  192. data/test/serializers/caching_configuration_test_isolated.rb +170 -0
  193. data/test/serializers/configuration_test.rb +32 -0
  194. data/test/serializers/fieldset_test.rb +14 -0
  195. data/test/serializers/meta_test.rb +196 -0
  196. data/test/serializers/options_test.rb +21 -0
  197. data/test/serializers/read_attribute_for_serialization_test.rb +79 -0
  198. data/test/serializers/root_test.rb +21 -0
  199. data/test/serializers/serialization_test.rb +55 -0
  200. data/test/serializers/serializer_for_test.rb +134 -0
  201. data/test/support/custom_schemas/active_model_serializers/test/schema_test/my/index.json +6 -0
  202. data/test/support/isolated_unit.rb +79 -0
  203. data/test/support/rails5_shims.rb +47 -0
  204. data/test/support/rails_app.rb +45 -0
  205. data/test/support/schemas/active_model_serializers/test/schema_test/my/index.json +6 -0
  206. data/test/support/schemas/active_model_serializers/test/schema_test/my/show.json +6 -0
  207. data/test/support/schemas/custom/show.json +7 -0
  208. data/test/support/schemas/hyper_schema.json +93 -0
  209. data/test/support/schemas/render_using_json_api.json +43 -0
  210. data/test/support/schemas/simple_json_pointers.json +10 -0
  211. data/test/support/serialization_testing.rb +53 -0
  212. data/test/test_helper.rb +48 -23
  213. metadata +449 -43
  214. data/DESIGN.textile +0 -586
  215. data/Gemfile.edge +0 -9
  216. data/bench/perf.rb +0 -43
  217. data/cruft.md +0 -19
  218. data/lib/active_model/array_serializer.rb +0 -104
  219. data/lib/active_record/serializer_override.rb +0 -16
  220. data/lib/generators/resource_override.rb +0 -13
  221. data/lib/generators/serializer/USAGE +0 -9
  222. data/lib/generators/serializer/serializer_generator.rb +0 -42
  223. data/lib/generators/serializer/templates/serializer.rb +0 -19
  224. data/test/association_test.rb +0 -592
  225. data/test/caching_test.rb +0 -96
  226. data/test/generators_test.rb +0 -85
  227. data/test/no_serialization_scope_test.rb +0 -34
  228. data/test/serialization_scope_name_test.rb +0 -67
  229. data/test/serialization_test.rb +0 -392
  230. data/test/serializer_support_test.rb +0 -51
  231. data/test/serializer_test.rb +0 -1465
  232. data/test/test_fakes.rb +0 -217
@@ -0,0 +1,134 @@
1
+ require 'test_helper'
2
+
3
+ module ActiveModel
4
+ class Serializer
5
+ class SerializerForTest < ActiveSupport::TestCase
6
+ class CollectionSerializerTest < ActiveSupport::TestCase
7
+ def setup
8
+ @array = [1, 2, 3]
9
+ @previous_collection_serializer = ActiveModelSerializers.config.collection_serializer
10
+ end
11
+
12
+ def teardown
13
+ ActiveModelSerializers.config.collection_serializer = @previous_collection_serializer
14
+ end
15
+
16
+ def test_serializer_for_array
17
+ serializer = ActiveModel::Serializer.serializer_for(@array)
18
+ assert_equal ActiveModelSerializers.config.collection_serializer, serializer
19
+ end
20
+
21
+ def test_overwritten_serializer_for_array
22
+ new_collection_serializer = Class.new
23
+ ActiveModelSerializers.config.collection_serializer = new_collection_serializer
24
+ serializer = ActiveModel::Serializer.serializer_for(@array)
25
+ assert_equal new_collection_serializer, serializer
26
+ end
27
+ end
28
+
29
+ class SerializerTest < ActiveSupport::TestCase
30
+ module ResourceNamespace
31
+ Post = Class.new(::Model)
32
+ Comment = Class.new(::Model)
33
+
34
+ class PostSerializer < ActiveModel::Serializer
35
+ class CommentSerializer < ActiveModel::Serializer
36
+ end
37
+ end
38
+ end
39
+
40
+ class MyProfile < Profile
41
+ end
42
+
43
+ class CustomProfile
44
+ def serializer_class; ProfileSerializer; end
45
+ end
46
+
47
+ Tweet = Class.new(::Model)
48
+ TweetSerializer = Class.new
49
+
50
+ def setup
51
+ @profile = Profile.new
52
+ @my_profile = MyProfile.new
53
+ @custom_profile = CustomProfile.new
54
+ @model = ::Model.new
55
+ @tweet = Tweet.new
56
+ end
57
+
58
+ def test_serializer_for_non_ams_serializer
59
+ serializer = ActiveModel::Serializer.serializer_for(@tweet)
60
+ assert_equal nil, serializer
61
+ end
62
+
63
+ def test_serializer_for_existing_serializer
64
+ serializer = ActiveModel::Serializer.serializer_for(@profile)
65
+ assert_equal ProfileSerializer, serializer
66
+ end
67
+
68
+ def test_serializer_for_existing_serializer_with_lookup_disabled
69
+ serializer = with_serializer_lookup_disabled do
70
+ ActiveModel::Serializer.serializer_for(@profile)
71
+ end
72
+ assert_equal nil, serializer
73
+ end
74
+
75
+ def test_serializer_for_not_existing_serializer
76
+ serializer = ActiveModel::Serializer.serializer_for(@model)
77
+ assert_equal nil, serializer
78
+ end
79
+
80
+ def test_serializer_inherited_serializer
81
+ serializer = ActiveModel::Serializer.serializer_for(@my_profile)
82
+ assert_equal ProfileSerializer, serializer
83
+ end
84
+
85
+ def test_serializer_inherited_serializer_with_lookup_disabled
86
+ serializer = with_serializer_lookup_disabled do
87
+ ActiveModel::Serializer.serializer_for(@my_profile)
88
+ end
89
+ assert_equal nil, serializer
90
+ end
91
+
92
+ def test_serializer_custom_serializer
93
+ serializer = ActiveModel::Serializer.serializer_for(@custom_profile)
94
+ assert_equal ProfileSerializer, serializer
95
+ end
96
+
97
+ def test_serializer_custom_serializer_with_lookup_disabled
98
+ serializer = with_serializer_lookup_disabled do
99
+ ActiveModel::Serializer.serializer_for(@custom_profile)
100
+ end
101
+ assert_equal ProfileSerializer, serializer
102
+ end
103
+
104
+ def test_serializer_for_namespaced_resource
105
+ post = ResourceNamespace::Post.new
106
+ serializer = ActiveModel::Serializer.serializer_for(post)
107
+ assert_equal ResourceNamespace::PostSerializer, serializer
108
+ end
109
+
110
+ def test_serializer_for_namespaced_resource_with_lookup_disabled
111
+ post = ResourceNamespace::Post.new
112
+ serializer = with_serializer_lookup_disabled do
113
+ ActiveModel::Serializer.serializer_for(post)
114
+ end
115
+ assert_equal nil, serializer
116
+ end
117
+
118
+ def test_serializer_for_nested_resource
119
+ comment = ResourceNamespace::Comment.new
120
+ serializer = ResourceNamespace::PostSerializer.serializer_for(comment)
121
+ assert_equal ResourceNamespace::PostSerializer::CommentSerializer, serializer
122
+ end
123
+
124
+ def test_serializer_for_nested_resource_with_lookup_disabled
125
+ comment = ResourceNamespace::Comment.new
126
+ serializer = with_serializer_lookup_disabled do
127
+ ResourceNamespace::PostSerializer.serializer_for(comment)
128
+ end
129
+ assert_equal nil, serializer
130
+ end
131
+ end
132
+ end
133
+ end
134
+ end
@@ -0,0 +1,6 @@
1
+ {
2
+ "properties": {
3
+ "name" : { "type" : "string" },
4
+ "description" : { "type" : "string" }
5
+ }
6
+ }
@@ -0,0 +1,79 @@
1
+ # https://github.com/rails/rails/blob/v5.0.0.beta1/railties/test/isolation/abstract_unit.rb
2
+
3
+ # Usage Example:
4
+ #
5
+ # require 'support/isolated_unit'
6
+ #
7
+ # class RailtieTest < ActiveSupport::TestCase
8
+ # include ActiveSupport::Testing::Isolation
9
+ #
10
+ # class WithRailsDefinedOnLoad < RailtieTest
11
+ # setup do
12
+ # require 'rails'
13
+ # require 'active_model_serializers'
14
+ # make_basic_app
15
+ # end
16
+ #
17
+ # # some tests
18
+ # end
19
+ #
20
+ # class WithoutRailsDefinedOnLoad < RailtieTest
21
+ # setup do
22
+ # require 'active_model_serializers'
23
+ # make_basic_app
24
+ # end
25
+ #
26
+ # # some tests
27
+ # end
28
+ # end
29
+ #
30
+ # Note:
31
+ # It is important to keep this file as light as possible
32
+ # the goal for tests that require this is to test booting up
33
+ # rails from an empty state, so anything added here could
34
+ # hide potential failures
35
+ #
36
+ # It is also good to know what is the bare minimum to get
37
+ # Rails booted up.
38
+ require 'bundler/setup' unless defined?(Bundler)
39
+ require 'active_support'
40
+ require 'active_support/core_ext/string/access'
41
+
42
+ # These files do not require any others and are needed
43
+ # to run the tests
44
+ require 'active_support/testing/isolation'
45
+
46
+ module TestHelpers
47
+ module Generation
48
+ module_function
49
+
50
+ # Make a very basic app, without creating the whole directory structure.
51
+ # Is faster and simpler than generating a Rails app in a temp directory
52
+ def make_basic_app
53
+ require 'rails'
54
+ require 'action_controller/railtie'
55
+
56
+ @app = Class.new(Rails::Application) do
57
+ config.eager_load = false
58
+ config.session_store :cookie_store, key: '_myapp_session'
59
+ config.active_support.deprecation = :log
60
+ config.active_support.test_order = :parallel
61
+ ActiveSupport::TestCase.respond_to?(:test_order=) && ActiveSupport::TestCase.test_order = :parallel
62
+ config.root = File.dirname(__FILE__)
63
+ config.log_level = :info
64
+ # Set a fake logger to avoid creating the log directory automatically
65
+ fake_logger = Logger.new(nil)
66
+ config.logger = fake_logger
67
+ Rails.application.routes.default_url_options = { host: 'example.com' }
68
+ end
69
+ @app.respond_to?(:secrets) && @app.secrets.secret_key_base = '3b7cd727ee24e8444053437c36cc66c4'
70
+
71
+ yield @app if block_given?
72
+ @app.initialize!
73
+ end
74
+ end
75
+ end
76
+
77
+ class ActiveSupport::TestCase
78
+ include TestHelpers::Generation
79
+ end
@@ -0,0 +1,47 @@
1
+ module Rails5Shims
2
+ module ControllerTests
3
+ # https://github.com/rails/rails/blob/b217354/actionpack/lib/action_controller/test_case.rb
4
+ REQUEST_KWARGS = [:params, :session, :flash, :method, :body, :xhr].freeze
5
+
6
+ def get(path, *args)
7
+ fold_kwargs!(args)
8
+ super
9
+ end
10
+
11
+ def post(path, *args)
12
+ fold_kwargs!(args)
13
+ super
14
+ end
15
+
16
+ def patch(path, *args)
17
+ fold_kwargs!(args)
18
+ super
19
+ end
20
+
21
+ def put(path, *args)
22
+ fold_kwargs!(args)
23
+ super
24
+ end
25
+
26
+ # Fold kwargs from test request into args
27
+ # Band-aid for DEPRECATION WARNING
28
+ def fold_kwargs!(args)
29
+ hash = args && args[0]
30
+ return unless hash.respond_to?(:key)
31
+ Rails5Shims::ControllerTests::REQUEST_KWARGS.each do |kwarg|
32
+ next unless hash.key?(kwarg)
33
+ hash.merge! hash.delete(kwarg)
34
+ end
35
+ end
36
+
37
+ # Uncomment for debugging where the kwargs warnings come from
38
+ # def non_kwarg_request_warning
39
+ # super.tap do
40
+ # STDOUT.puts caller[2..3]
41
+ # end
42
+ # end
43
+ end
44
+ end
45
+ if Rails::VERSION::MAJOR < 5
46
+ ActionController::TestCase.send :include, Rails5Shims::ControllerTests
47
+ end
@@ -0,0 +1,45 @@
1
+ require 'support/isolated_unit'
2
+ module ActiveModelSerializers
3
+ RailsApplication = TestHelpers::Generation.make_basic_app do |app|
4
+ app.configure do
5
+ config.secret_key_base = 'abc123'
6
+ config.active_support.test_order = :random
7
+ config.action_controller.perform_caching = true
8
+ config.action_controller.cache_store = :memory_store
9
+ end
10
+
11
+ app.routes.default_url_options = { host: 'example.com' }
12
+ end
13
+ end
14
+
15
+ Routes = ActionDispatch::Routing::RouteSet.new
16
+ Routes.draw do
17
+ get ':controller(/:action(/:id))'
18
+ get ':controller(/:action)'
19
+ end
20
+ ActionController::Base.send :include, Routes.url_helpers
21
+ ActionController::TestCase.class_eval do
22
+ def setup
23
+ @routes = Routes
24
+ end
25
+
26
+ # For Rails5
27
+ # https://github.com/rails/rails/commit/ca83436d1b3b6cedd1eca2259f65661e69b01909#diff-b9bbf56e85d3fe1999f16317f2751e76L17
28
+ def assigns(key = nil)
29
+ warn "DEPRECATION: Calling 'assigns(#{key})' from #{caller[0]}"
30
+ assigns = {}.with_indifferent_access
31
+ @controller.view_assigns.each { |k, v| assigns.regular_writer(k, v) }
32
+ key.nil? ? assigns : assigns[key]
33
+ end
34
+ end
35
+
36
+ # ActiveRecord::Migrator.migrations_paths = [File.expand_path("../../test/dummy/db/migrate", __FILE__)]
37
+ # ActiveRecord::Migrator.migrations_paths << File.expand_path('../../db/migrate', __FILE__)
38
+ #
39
+ # Load fixtures from the engine
40
+ # if ActiveSupport::TestCase.respond_to?(:fixture_path=)
41
+ # ActiveSupport::TestCase.fixture_path = File.expand_path("../fixtures", __FILE__)
42
+ # ActionDispatch::IntegrationTest.fixture_path = ActiveSupport::TestCase.fixture_path
43
+ # ActiveSupport::TestCase.file_fixture_path = ActiveSupport::TestCase.fixture_path + "/files"
44
+ # ActiveSupport::TestCase.fixtures :all
45
+ # end
@@ -0,0 +1,6 @@
1
+ {
2
+ "properties": {
3
+ "name" : { "type" : "string" },
4
+ "description" : { "type" : "string" }
5
+ }
6
+ }
@@ -0,0 +1,6 @@
1
+ {
2
+ "properties": {
3
+ "name" : { "type" : "integer" },
4
+ "description" : { "type" : "boolean" }
5
+ }
6
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "id": "file://custom/show.json#",
3
+ "properties": {
4
+ "name" : { "type" : "string" },
5
+ "description" : { "type" : "string" }
6
+ }
7
+ }
@@ -0,0 +1,93 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-04/hyper-schema",
3
+ "title": "Profile",
4
+ "description": "Profile schema",
5
+ "stability": "prototype",
6
+ "strictProperties": true,
7
+ "type": [
8
+ "object"
9
+ ],
10
+ "definitions": {
11
+ "name": {
12
+ "description": "unique name of profile",
13
+ "readOnly": true,
14
+ "type": [
15
+ "string"
16
+ ]
17
+ },
18
+ "description": {
19
+ "description": "description of profile",
20
+ "readOnly": true,
21
+ "type": [
22
+ "string"
23
+ ]
24
+ },
25
+ "identity": {
26
+ "anyOf": [
27
+ {
28
+ "$ref": "/schemata/profile#/definitions/name"
29
+ }
30
+ ]
31
+ }
32
+ },
33
+ "links": [
34
+ {
35
+ "description": "Create a new profile.",
36
+ "href": "/profiles",
37
+ "method": "POST",
38
+ "rel": "create",
39
+ "schema": {
40
+ "properties": {
41
+ },
42
+ "type": [
43
+ "object"
44
+ ]
45
+ },
46
+ "title": "Create"
47
+ },
48
+ {
49
+ "description": "Delete an existing profile.",
50
+ "href": "/profiles/{(%2Fschemata%2Fprofile%23%2Fdefinitions%2Fidentity)}",
51
+ "method": "DELETE",
52
+ "rel": "destroy",
53
+ "title": "Delete"
54
+ },
55
+ {
56
+ "description": "Info for existing profile.",
57
+ "href": "/profiles/{(%2Fschemata%2Fprofile%23%2Fdefinitions%2Fidentity)}",
58
+ "method": "GET",
59
+ "rel": "self",
60
+ "title": "Info"
61
+ },
62
+ {
63
+ "description": "List existing profiles.",
64
+ "href": "/profiles",
65
+ "method": "GET",
66
+ "rel": "instances",
67
+ "title": "List"
68
+ },
69
+ {
70
+ "description": "Update an existing profile.",
71
+ "href": "/profiles/{(%2Fschemata%2Fprofile%23%2Fdefinitions%2Fidentity)}",
72
+ "method": "PATCH",
73
+ "rel": "update",
74
+ "schema": {
75
+ "properties": {
76
+ },
77
+ "type": [
78
+ "object"
79
+ ]
80
+ },
81
+ "title": "Update"
82
+ }
83
+ ],
84
+ "properties": {
85
+ "name": {
86
+ "$ref": "/schemata/profile#/definitions/name"
87
+ },
88
+ "description": {
89
+ "$ref": "/schemata/profile#/definitions/description"
90
+ }
91
+ },
92
+ "id": "/schemata/profile"
93
+ }
@@ -0,0 +1,43 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-04/schema#",
3
+ "id": "",
4
+ "type": "object",
5
+ "properties": {
6
+ "data": {
7
+ "id": "/data",
8
+ "type": "object",
9
+ "properties": {
10
+ "id": {
11
+ "id": "/data/id",
12
+ "type": "string"
13
+ },
14
+ "type": {
15
+ "id": "/data/type",
16
+ "type": "string"
17
+ },
18
+ "attributes": {
19
+ "id": "/data/attributes",
20
+ "type": "object",
21
+ "properties": {
22
+ "name": {
23
+ "id": "/data/attributes/name",
24
+ "type": "string"
25
+ },
26
+ "description": {
27
+ "id": "/data/attributes/description",
28
+ "type": "string"
29
+ }
30
+ }
31
+ }
32
+ },
33
+ "required": [
34
+ "id",
35
+ "type",
36
+ "attributes"
37
+ ]
38
+ }
39
+ },
40
+ "required": [
41
+ "data"
42
+ ]
43
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "properties": {
3
+ "name": {
4
+ "$ref": "file://custom/show.json#/properties/name"
5
+ },
6
+ "description": {
7
+ "$ref": "file://custom/show.json#/properties/description"
8
+ }
9
+ }
10
+ }
@@ -0,0 +1,53 @@
1
+ module SerializationTesting
2
+ def config
3
+ ActiveModelSerializers.config
4
+ end
5
+
6
+ private
7
+
8
+ def generate_cached_serializer(obj)
9
+ ActiveModelSerializers::SerializableResource.new(obj).to_json
10
+ end
11
+
12
+ # Aliased as :with_configured_adapter to clarify that
13
+ # this method tests the configured adapter.
14
+ # When not testing configuration, it may be preferable
15
+ # to pass in the +adapter+ option to <tt>ActiveModelSerializers::SerializableResource</tt>.
16
+ # e.g ActiveModelSerializers::SerializableResource.new(resource, adapter: :json_api)
17
+ def with_adapter(adapter)
18
+ old_adapter = ActiveModelSerializers.config.adapter
19
+ ActiveModelSerializers.config.adapter = adapter
20
+ yield
21
+ ensure
22
+ ActiveModelSerializers.config.adapter = old_adapter
23
+ end
24
+ alias with_configured_adapter with_adapter
25
+
26
+ def with_config(hash)
27
+ old_config = config.dup
28
+ ActiveModelSerializers.config.update(hash)
29
+ yield
30
+ ensure
31
+ ActiveModelSerializers.config.replace(old_config)
32
+ end
33
+
34
+ def with_serializer_lookup_disabled
35
+ original_serializer_lookup = ActiveModelSerializers.config.serializer_lookup_enabled
36
+ ActiveModelSerializers.config.serializer_lookup_enabled = false
37
+ yield
38
+ ensure
39
+ ActiveModelSerializers.config.serializer_lookup_enabled = original_serializer_lookup
40
+ end
41
+
42
+ def serializable(resource, options = {})
43
+ ActiveModelSerializers::SerializableResource.new(resource, options)
44
+ end
45
+ end
46
+
47
+ class Minitest::Test
48
+ def before_setup
49
+ ActionController::Base.cache_store.clear
50
+ end
51
+
52
+ include SerializationTesting
53
+ end
data/test/test_helper.rb CHANGED
@@ -1,32 +1,57 @@
1
- require "rubygems"
2
- require "bundler/setup"
1
+ # Configure Rails Environment
2
+ ENV['RAILS_ENV'] = 'test'
3
+ require 'bundler/setup'
3
4
 
4
- require "pry"
5
-
6
- require "active_model_serializers"
7
- require "active_support/json"
8
- require "minitest/autorun"
5
+ begin
6
+ require 'simplecov'
7
+ AppCoverage.start
8
+ rescue LoadError
9
+ STDERR.puts 'Running without SimpleCov'
10
+ end
9
11
 
12
+ require 'timecop'
10
13
  require 'rails'
14
+ require 'action_controller'
15
+ require 'action_controller/test_case'
16
+ require 'action_controller/railtie'
17
+ require 'active_model_serializers'
18
+ # For now, we only restrict the options to serializable_hash/as_json/to_json
19
+ # in tests, to ensure developers don't add any unsupported options.
20
+ # There's no known benefit, at this time, to having the filtering run in
21
+ # production when the excluded options would simply not be used.
22
+ #
23
+ # However, for documentation purposes, the constant
24
+ # ActiveModel::Serializer::SERIALIZABLE_HASH_VALID_KEYS is defined
25
+ # in the Serializer.
26
+ ActiveModelSerializers::Adapter::Base.class_eval do
27
+ alias_method :original_serialization_options, :serialization_options
11
28
 
12
- module TestHelper
13
- Routes = ActionDispatch::Routing::RouteSet.new
14
- Routes.draw do
15
- resource :hypermedia
16
- get ':controller(/:action(/:id))'
17
- get ':controller(/:action)'
29
+ def serialization_options(options)
30
+ original_serialization_options(options)
31
+ .slice(*ActiveModel::Serializer::SERIALIZABLE_HASH_VALID_KEYS)
18
32
  end
19
-
20
- ActionController::Base.send :include, Routes.url_helpers
21
- ActiveModel::Serializer.send :include, Routes.url_helpers
22
33
  end
34
+ require 'fileutils'
35
+ FileUtils.mkdir_p(File.expand_path('../../tmp/cache', __FILE__))
23
36
 
24
- ActiveSupport::TestCase.class_eval do
25
- setup do
26
- @routes = ::TestHelper::Routes
27
- end
28
- end
37
+ gem 'minitest'
38
+ require 'minitest'
39
+ require 'minitest/autorun'
40
+ Minitest.backtrace_filter = Minitest::BacktraceFilter.new
41
+
42
+ require 'support/rails_app'
43
+
44
+ # require "rails/test_help"
45
+
46
+ require 'support/serialization_testing'
47
+
48
+ require 'support/rails5_shims'
49
+
50
+ require 'fixtures/active_record'
51
+
52
+ require 'fixtures/poro'
29
53
 
30
- class Object
31
- undef_method :id if respond_to?(:id)
54
+ ActiveSupport.on_load(:action_controller) do
55
+ $action_controller_logger = ActiveModelSerializers.logger
56
+ ActiveModelSerializers.logger = Logger.new(IO::NULL)
32
57
  end