active_model_serializers 0.8.3 → 0.10.8

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 (235) hide show
  1. checksums.yaml +5 -5
  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 +105 -0
  6. data/.simplecov +110 -0
  7. data/.travis.yml +50 -24
  8. data/CHANGELOG.md +650 -6
  9. data/CODE_OF_CONDUCT.md +74 -0
  10. data/CONTRIBUTING.md +105 -0
  11. data/Gemfile +69 -1
  12. data/{MIT-LICENSE.txt → MIT-LICENSE} +3 -2
  13. data/README.md +195 -545
  14. data/Rakefile +64 -8
  15. data/active_model_serializers.gemspec +62 -23
  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/schema.json +366 -0
  48. data/docs/jsonapi/schema.md +151 -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 +43 -38
  52. data/lib/active_model/serializable_resource.rb +11 -0
  53. data/lib/active_model/serializer/adapter/attributes.rb +15 -0
  54. data/lib/active_model/serializer/adapter/base.rb +18 -0
  55. data/lib/active_model/serializer/adapter/json.rb +15 -0
  56. data/lib/active_model/serializer/adapter/json_api.rb +15 -0
  57. data/lib/active_model/serializer/adapter/null.rb +15 -0
  58. data/lib/active_model/serializer/adapter.rb +24 -0
  59. data/lib/active_model/serializer/array_serializer.rb +12 -0
  60. data/lib/active_model/serializer/association.rb +71 -0
  61. data/lib/active_model/serializer/attribute.rb +25 -0
  62. data/lib/active_model/serializer/belongs_to_reflection.rb +11 -0
  63. data/lib/active_model/serializer/collection_serializer.rb +88 -0
  64. data/lib/active_model/serializer/concerns/caching.rb +300 -0
  65. data/lib/active_model/serializer/error_serializer.rb +14 -0
  66. data/lib/active_model/serializer/errors_serializer.rb +32 -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 +7 -0
  71. data/lib/active_model/serializer/lazy_association.rb +96 -0
  72. data/lib/active_model/serializer/link.rb +21 -0
  73. data/lib/active_model/serializer/lint.rb +150 -0
  74. data/lib/active_model/serializer/null.rb +17 -0
  75. data/lib/active_model/serializer/reflection.rb +210 -0
  76. data/lib/active_model/{serializers → serializer}/version.rb +1 -1
  77. data/lib/active_model/serializer.rb +343 -442
  78. data/lib/active_model_serializers/adapter/attributes.rb +13 -0
  79. data/lib/active_model_serializers/adapter/base.rb +83 -0
  80. data/lib/active_model_serializers/adapter/json.rb +21 -0
  81. data/lib/active_model_serializers/adapter/json_api/deserialization.rb +213 -0
  82. data/lib/active_model_serializers/adapter/json_api/error.rb +96 -0
  83. data/lib/active_model_serializers/adapter/json_api/jsonapi.rb +49 -0
  84. data/lib/active_model_serializers/adapter/json_api/link.rb +83 -0
  85. data/lib/active_model_serializers/adapter/json_api/meta.rb +37 -0
  86. data/lib/active_model_serializers/adapter/json_api/pagination_links.rb +88 -0
  87. data/lib/active_model_serializers/adapter/json_api/relationship.rb +104 -0
  88. data/lib/active_model_serializers/adapter/json_api/resource_identifier.rb +66 -0
  89. data/lib/active_model_serializers/adapter/json_api.rb +533 -0
  90. data/lib/active_model_serializers/adapter/null.rb +9 -0
  91. data/lib/active_model_serializers/adapter.rb +98 -0
  92. data/lib/active_model_serializers/callbacks.rb +55 -0
  93. data/lib/active_model_serializers/deprecate.rb +54 -0
  94. data/lib/active_model_serializers/deserialization.rb +15 -0
  95. data/lib/active_model_serializers/json_pointer.rb +14 -0
  96. data/lib/active_model_serializers/logging.rb +122 -0
  97. data/lib/active_model_serializers/lookup_chain.rb +80 -0
  98. data/lib/active_model_serializers/model.rb +130 -0
  99. data/lib/active_model_serializers/railtie.rb +50 -0
  100. data/lib/active_model_serializers/register_jsonapi_renderer.rb +78 -0
  101. data/lib/active_model_serializers/serializable_resource.rb +82 -0
  102. data/lib/active_model_serializers/serialization_context.rb +39 -0
  103. data/lib/active_model_serializers/test/schema.rb +138 -0
  104. data/lib/active_model_serializers/test/serializer.rb +125 -0
  105. data/lib/active_model_serializers/test.rb +7 -0
  106. data/lib/active_model_serializers.rb +47 -81
  107. data/lib/generators/rails/USAGE +6 -0
  108. data/lib/generators/rails/resource_override.rb +10 -0
  109. data/lib/generators/rails/serializer_generator.rb +36 -0
  110. data/lib/generators/rails/templates/serializer.rb.erb +8 -0
  111. data/lib/grape/active_model_serializers.rb +16 -0
  112. data/lib/grape/formatters/active_model_serializers.rb +32 -0
  113. data/lib/grape/helpers/active_model_serializers.rb +17 -0
  114. data/lib/tasks/rubocop.rake +53 -0
  115. data/test/action_controller/adapter_selector_test.rb +62 -0
  116. data/test/action_controller/explicit_serializer_test.rb +135 -0
  117. data/test/action_controller/json/include_test.rb +246 -0
  118. data/test/action_controller/json_api/deserialization_test.rb +112 -0
  119. data/test/action_controller/json_api/errors_test.rb +40 -0
  120. data/test/action_controller/json_api/fields_test.rb +66 -0
  121. data/test/action_controller/json_api/linked_test.rb +202 -0
  122. data/test/action_controller/json_api/pagination_test.rb +124 -0
  123. data/test/action_controller/json_api/transform_test.rb +189 -0
  124. data/test/action_controller/lookup_proc_test.rb +49 -0
  125. data/test/action_controller/namespace_lookup_test.rb +232 -0
  126. data/test/action_controller/serialization_scope_name_test.rb +235 -0
  127. data/test/action_controller/serialization_test.rb +478 -0
  128. data/test/active_model_serializers/adapter_for_test.rb +208 -0
  129. data/test/active_model_serializers/json_pointer_test.rb +22 -0
  130. data/test/active_model_serializers/logging_test.rb +77 -0
  131. data/test/active_model_serializers/model_test.rb +142 -0
  132. data/test/active_model_serializers/railtie_test_isolated.rb +68 -0
  133. data/test/active_model_serializers/register_jsonapi_renderer_test_isolated.rb +161 -0
  134. data/test/active_model_serializers/serialization_context_test_isolated.rb +71 -0
  135. data/test/active_model_serializers/test/schema_test.rb +131 -0
  136. data/test/active_model_serializers/test/serializer_test.rb +62 -0
  137. data/test/active_record_test.rb +9 -0
  138. data/test/adapter/attributes_test.rb +40 -0
  139. data/test/adapter/deprecation_test.rb +100 -0
  140. data/test/adapter/json/belongs_to_test.rb +45 -0
  141. data/test/adapter/json/collection_test.rb +104 -0
  142. data/test/adapter/json/has_many_test.rb +53 -0
  143. data/test/adapter/json/transform_test.rb +93 -0
  144. data/test/adapter/json_api/belongs_to_test.rb +155 -0
  145. data/test/adapter/json_api/collection_test.rb +96 -0
  146. data/test/adapter/json_api/errors_test.rb +76 -0
  147. data/test/adapter/json_api/fields_test.rb +96 -0
  148. data/test/adapter/json_api/has_many_explicit_serializer_test.rb +96 -0
  149. data/test/adapter/json_api/has_many_test.rb +173 -0
  150. data/test/adapter/json_api/has_one_test.rb +80 -0
  151. data/test/adapter/json_api/include_data_if_sideloaded_test.rb +213 -0
  152. data/test/adapter/json_api/json_api_test.rb +33 -0
  153. data/test/adapter/json_api/linked_test.rb +413 -0
  154. data/test/adapter/json_api/links_test.rb +110 -0
  155. data/test/adapter/json_api/pagination_links_test.rb +206 -0
  156. data/test/adapter/json_api/parse_test.rb +137 -0
  157. data/test/adapter/json_api/relationship_test.rb +397 -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 +512 -0
  161. data/test/adapter/json_api/type_test.rb +193 -0
  162. data/test/adapter/json_test.rb +46 -0
  163. data/test/adapter/null_test.rb +22 -0
  164. data/test/adapter/polymorphic_test.rb +218 -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_active_record.rb +81 -0
  170. data/test/benchmark/bm_adapter.rb +38 -0
  171. data/test/benchmark/bm_caching.rb +119 -0
  172. data/test/benchmark/bm_lookup_chain.rb +83 -0
  173. data/test/benchmark/bm_transform.rb +45 -0
  174. data/test/benchmark/config.ru +3 -0
  175. data/test/benchmark/controllers.rb +83 -0
  176. data/test/benchmark/fixtures.rb +219 -0
  177. data/test/cache_test.rb +651 -0
  178. data/test/collection_serializer_test.rb +127 -0
  179. data/test/fixtures/active_record.rb +113 -0
  180. data/test/fixtures/poro.rb +225 -0
  181. data/test/generators/scaffold_controller_generator_test.rb +24 -0
  182. data/test/generators/serializer_generator_test.rb +75 -0
  183. data/test/grape_test.rb +196 -0
  184. data/test/lint_test.rb +49 -0
  185. data/test/logger_test.rb +20 -0
  186. data/test/poro_test.rb +9 -0
  187. data/test/serializable_resource_test.rb +79 -0
  188. data/test/serializers/association_macros_test.rb +37 -0
  189. data/test/serializers/associations_test.rb +518 -0
  190. data/test/serializers/attribute_test.rb +153 -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 +202 -0
  196. data/test/serializers/options_test.rb +32 -0
  197. data/test/serializers/read_attribute_for_serialization_test.rb +79 -0
  198. data/test/serializers/reflection_test.rb +479 -0
  199. data/test/serializers/root_test.rb +21 -0
  200. data/test/serializers/serialization_test.rb +55 -0
  201. data/test/serializers/serializer_for_test.rb +136 -0
  202. data/test/serializers/serializer_for_with_namespace_test.rb +88 -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 +84 -0
  205. data/test/support/rails5_shims.rb +53 -0
  206. data/test/support/rails_app.rb +38 -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 +79 -0
  214. data/test/test_helper.rb +59 -21
  215. metadata +529 -43
  216. data/DESIGN.textile +0 -586
  217. data/Gemfile.edge +0 -9
  218. data/bench/perf.rb +0 -43
  219. data/cruft.md +0 -19
  220. data/lib/active_model/array_serializer.rb +0 -104
  221. data/lib/active_model/serializer/associations.rb +0 -233
  222. data/lib/active_record/serializer_override.rb +0 -16
  223. data/lib/generators/resource_override.rb +0 -13
  224. data/lib/generators/serializer/USAGE +0 -9
  225. data/lib/generators/serializer/serializer_generator.rb +0 -42
  226. data/lib/generators/serializer/templates/serializer.rb +0 -19
  227. data/test/association_test.rb +0 -592
  228. data/test/caching_test.rb +0 -96
  229. data/test/generators_test.rb +0 -85
  230. data/test/no_serialization_scope_test.rb +0 -34
  231. data/test/serialization_scope_name_test.rb +0 -67
  232. data/test/serialization_test.rb +0 -392
  233. data/test/serializer_support_test.rb +0 -51
  234. data/test/serializer_test.rb +0 -1465
  235. data/test/test_fakes.rb +0 -217
@@ -0,0 +1,88 @@
1
+ require 'test_helper'
2
+
3
+ module ActiveModel
4
+ class Serializer
5
+ class SerializerForWithNamespaceTest < ActiveSupport::TestCase
6
+ class Book < ::Model
7
+ attributes :title, :author_name
8
+ associations :publisher, :pages
9
+ end
10
+ class Page < ::Model; attributes :number, :text end
11
+ class Publisher < ::Model; attributes :name end
12
+
13
+ module Api
14
+ module V3
15
+ class BookSerializer < ActiveModel::Serializer
16
+ attributes :title, :author_name
17
+
18
+ has_many :pages
19
+ belongs_to :publisher
20
+ end
21
+
22
+ class PageSerializer < ActiveModel::Serializer
23
+ attributes :number, :text
24
+ end
25
+
26
+ class PublisherSerializer < ActiveModel::Serializer
27
+ attributes :name
28
+ end
29
+ end
30
+ end
31
+
32
+ class BookSerializer < ActiveModel::Serializer
33
+ attributes :title, :author_name
34
+ end
35
+ test 'resource without a namespace' do
36
+ book = Book.new(title: 'A Post', author_name: 'hello')
37
+
38
+ # TODO: this should be able to pull up this serializer without explicitly specifying the serializer
39
+ # currently, with no options, it still uses the Api::V3 serializer
40
+ result = ActiveModelSerializers::SerializableResource.new(book, serializer: BookSerializer).serializable_hash
41
+
42
+ expected = { title: 'A Post', author_name: 'hello' }
43
+ assert_equal expected, result
44
+ end
45
+
46
+ test 'resource with namespace' do
47
+ book = Book.new(title: 'A Post', author_name: 'hi')
48
+
49
+ result = ActiveModelSerializers::SerializableResource.new(book, namespace: Api::V3).serializable_hash
50
+
51
+ expected = { title: 'A Post', author_name: 'hi', pages: nil, publisher: nil }
52
+ assert_equal expected, result
53
+ end
54
+
55
+ test 'has_many with nested serializer under the namespace' do
56
+ page = Page.new(number: 1, text: 'hello')
57
+ book = Book.new(title: 'A Post', author_name: 'hi', pages: [page])
58
+
59
+ result = ActiveModelSerializers::SerializableResource.new(book, namespace: Api::V3).serializable_hash
60
+
61
+ expected = {
62
+ title: 'A Post', author_name: 'hi',
63
+ publisher: nil,
64
+ pages: [{
65
+ number: 1, text: 'hello'
66
+ }]
67
+ }
68
+ assert_equal expected, result
69
+ end
70
+
71
+ test 'belongs_to with nested serializer under the namespace' do
72
+ publisher = Publisher.new(name: 'Disney')
73
+ book = Book.new(title: 'A Post', author_name: 'hi', publisher: publisher)
74
+
75
+ result = ActiveModelSerializers::SerializableResource.new(book, namespace: Api::V3).serializable_hash
76
+
77
+ expected = {
78
+ title: 'A Post', author_name: 'hi',
79
+ pages: nil,
80
+ publisher: {
81
+ name: 'Disney'
82
+ }
83
+ }
84
+ assert_equal expected, result
85
+ end
86
+ end
87
+ end
88
+ end
@@ -0,0 +1,6 @@
1
+ {
2
+ "properties": {
3
+ "name" : { "type" : "string" },
4
+ "description" : { "type" : "string" }
5
+ }
6
+ }
@@ -0,0 +1,84 @@
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/autorun'
45
+ require 'active_support/testing/isolation'
46
+
47
+ module TestHelpers
48
+ module Generation
49
+ module_function
50
+
51
+ # Make a very basic app, without creating the whole directory structure.
52
+ # Is faster and simpler than generating a Rails app in a temp directory
53
+ def make_basic_app
54
+ require 'rails'
55
+ require 'action_controller/railtie'
56
+
57
+ app = Class.new(Rails::Application) do
58
+ config.eager_load = false
59
+ config.session_store :cookie_store, key: '_myapp_session'
60
+ config.active_support.deprecation = :log
61
+ config.active_support.test_order = :parallel
62
+ ActiveSupport::TestCase.respond_to?(:test_order=) && ActiveSupport::TestCase.test_order = :parallel
63
+ config.root = File.dirname(__FILE__)
64
+ config.log_level = :info
65
+ # Set a fake logger to avoid creating the log directory automatically
66
+ fake_logger = Logger.new(nil)
67
+ config.logger = fake_logger
68
+ Rails.application.routes.default_url_options = { host: 'example.com' }
69
+ end
70
+ def app.name; 'IsolatedRailsApp'; end # rubocop:disable Style/SingleLineMethods
71
+ app.respond_to?(:secrets) && app.secrets.secret_key_base = '3b7cd727ee24e8444053437c36cc66c4'
72
+
73
+ @app = app
74
+ yield @app if block_given?
75
+ @app.initialize!
76
+ end
77
+ end
78
+ end
79
+
80
+ module ActiveSupport
81
+ class TestCase
82
+ include TestHelpers::Generation
83
+ end
84
+ end
@@ -0,0 +1,53 @@
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, :headers, :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
+ value = hash.delete(kwarg)
34
+ if value.is_a? String
35
+ args.insert(0, value)
36
+ else
37
+ hash.merge! value
38
+ end
39
+ end
40
+ end
41
+
42
+ # Uncomment for debugging where the kwargs warnings come from
43
+ # def non_kwarg_request_warning
44
+ # super.tap do
45
+ # STDOUT.puts caller[2..3]
46
+ # end
47
+ # end
48
+ end
49
+ end
50
+ if Rails::VERSION::MAJOR < 5
51
+ ActionController::TestCase.send :include, Rails5Shims::ControllerTests
52
+ ActionDispatch::IntegrationTest.send :include, Rails5Shims::ControllerTests
53
+ end
@@ -0,0 +1,38 @@
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
+
10
+ config.filter_parameters += [:password]
11
+ end
12
+
13
+ app.routes.default_url_options = { host: 'example.com' }
14
+ end
15
+ end
16
+
17
+ Routes = ActionDispatch::Routing::RouteSet.new
18
+ Routes.draw do
19
+ get ':controller(/:action(/:id))'
20
+ get ':controller(/:action)'
21
+ end
22
+ ActionController::Base.send :include, Routes.url_helpers
23
+ ActionController::TestCase.class_eval do
24
+ def setup
25
+ @routes = Routes
26
+ end
27
+ end
28
+
29
+ # ActiveRecord::Migrator.migrations_paths = [File.expand_path("../../test/dummy/db/migrate", __FILE__)]
30
+ # ActiveRecord::Migrator.migrations_paths << File.expand_path('../../db/migrate', __FILE__)
31
+ #
32
+ # Load fixtures from the engine
33
+ # if ActiveSupport::TestCase.respond_to?(:fixture_path=)
34
+ # ActiveSupport::TestCase.fixture_path = File.expand_path("../fixtures", __FILE__)
35
+ # ActionDispatch::IntegrationTest.fixture_path = ActiveSupport::TestCase.fixture_path
36
+ # ActiveSupport::TestCase.file_fixture_path = ActiveSupport::TestCase.fixture_path + "/files"
37
+ # ActiveSupport::TestCase.fixtures :all
38
+ # 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,79 @@
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
+ def with_namespace_separator(separator)
13
+ original_separator = ActiveModelSerializers.config.jsonapi_namespace_separator
14
+ ActiveModelSerializers.config.jsonapi_namespace_separator = separator
15
+ yield
16
+ ensure
17
+ ActiveModelSerializers.config.jsonapi_namespace_separator = original_separator
18
+ end
19
+
20
+ def with_prepended_lookup(lookup_proc)
21
+ original_lookup = ActiveModelSerializers.config.serializer_lookup_cahin
22
+ ActiveModelSerializers.config.serializer_lookup_chain.unshift lookup_proc
23
+ yield
24
+ ensure
25
+ ActiveModelSerializers.config.serializer_lookup_cahin = original_lookup
26
+ end
27
+
28
+ # Aliased as :with_configured_adapter to clarify that
29
+ # this method tests the configured adapter.
30
+ # When not testing configuration, it may be preferable
31
+ # to pass in the +adapter+ option to <tt>ActiveModelSerializers::SerializableResource</tt>.
32
+ # e.g ActiveModelSerializers::SerializableResource.new(resource, adapter: :json_api)
33
+ def with_adapter(adapter)
34
+ old_adapter = ActiveModelSerializers.config.adapter
35
+ ActiveModelSerializers.config.adapter = adapter
36
+ yield
37
+ ensure
38
+ ActiveModelSerializers.config.adapter = old_adapter
39
+ end
40
+ alias with_configured_adapter with_adapter
41
+
42
+ def with_config(hash)
43
+ old_config = config.dup
44
+ ActiveModelSerializers.config.update(hash)
45
+ yield
46
+ ensure
47
+ ActiveModelSerializers.config.replace(old_config)
48
+ end
49
+
50
+ def with_jsonapi_inflection(inflection)
51
+ original_inflection = ActiveModelSerializers.config.jsonapi_resource_type
52
+ ActiveModelSerializers.config.jsonapi_resource_type = inflection
53
+ yield
54
+ ensure
55
+ ActiveModelSerializers.config.jsonapi_resource_type = original_inflection
56
+ end
57
+
58
+ def with_serializer_lookup_disabled
59
+ original_serializer_lookup = ActiveModelSerializers.config.serializer_lookup_enabled
60
+ ActiveModelSerializers.config.serializer_lookup_enabled = false
61
+ yield
62
+ ensure
63
+ ActiveModelSerializers.config.serializer_lookup_enabled = original_serializer_lookup
64
+ end
65
+
66
+ def serializable(resource, options = {})
67
+ ActiveModelSerializers::SerializableResource.new(resource, options)
68
+ end
69
+ end
70
+
71
+ module Minitest
72
+ class Test
73
+ def before_setup
74
+ ActionController::Base.cache_store.clear
75
+ end
76
+
77
+ include SerializationTesting
78
+ end
79
+ end
data/test/test_helper.rb CHANGED
@@ -1,32 +1,70 @@
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 'pry'
13
+ require 'timecop'
10
14
  require 'rails'
15
+ require 'action_controller'
16
+ require 'action_controller/test_case'
17
+ require 'action_controller/railtie'
18
+ require 'active_model_serializers'
19
+ # For now, we only restrict the options to serializable_hash/as_json/to_json
20
+ # in tests, to ensure developers don't add any unsupported options.
21
+ # There's no known benefit, at this time, to having the filtering run in
22
+ # production when the excluded options would simply not be used.
23
+ #
24
+ # However, for documentation purposes, the constant
25
+ # ActiveModel::Serializer::SERIALIZABLE_HASH_VALID_KEYS is defined
26
+ # in the Serializer.
27
+ ActiveModelSerializers::Adapter::Base.class_eval do
28
+ alias_method :original_serialization_options, :serialization_options
11
29
 
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)'
30
+ def serialization_options(options)
31
+ original_serialization_options(options)
32
+ .slice(*ActiveModel::Serializer::SERIALIZABLE_HASH_VALID_KEYS)
18
33
  end
19
-
20
- ActionController::Base.send :include, Routes.url_helpers
21
- ActiveModel::Serializer.send :include, Routes.url_helpers
22
34
  end
35
+ require 'fileutils'
36
+ FileUtils.mkdir_p(File.expand_path('../../tmp/cache', __FILE__))
37
+
38
+ gem 'minitest'
39
+ require 'minitest'
40
+ require 'minitest/autorun'
41
+ Minitest.backtrace_filter = Minitest::BacktraceFilter.new
42
+
43
+ module TestHelper
44
+ module_function
23
45
 
24
- ActiveSupport::TestCase.class_eval do
25
- setup do
26
- @routes = ::TestHelper::Routes
46
+ def silence_warnings
47
+ original_verbose = $VERBOSE
48
+ $VERBOSE = nil
49
+ yield
50
+ ensure
51
+ $VERBOSE = original_verbose
27
52
  end
28
53
  end
29
54
 
30
- class Object
31
- undef_method :id if respond_to?(:id)
55
+ require 'support/rails_app'
56
+
57
+ # require "rails/test_help"
58
+
59
+ require 'support/serialization_testing'
60
+
61
+ require 'support/rails5_shims'
62
+
63
+ require 'fixtures/active_record'
64
+
65
+ require 'fixtures/poro'
66
+
67
+ ActiveSupport.on_load(:action_controller) do
68
+ $action_controller_logger = ActiveModelSerializers.logger
69
+ ActiveModelSerializers.logger = Logger.new(IO::NULL)
32
70
  end