agi_active_model_serializers 0.10.7

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 (220) 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 +102 -0
  6. data/.simplecov +110 -0
  7. data/.travis.yml +51 -0
  8. data/CHANGELOG.md +612 -0
  9. data/CODE_OF_CONDUCT.md +74 -0
  10. data/CONTRIBUTING.md +105 -0
  11. data/Gemfile +56 -0
  12. data/MIT-LICENSE +22 -0
  13. data/README.md +307 -0
  14. data/Rakefile +103 -0
  15. data/active_model_serializers.gemspec +63 -0
  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/README.md +41 -0
  21. data/docs/STYLE.md +58 -0
  22. data/docs/general/adapters.md +247 -0
  23. data/docs/general/caching.md +58 -0
  24. data/docs/general/configuration_options.md +169 -0
  25. data/docs/general/deserialization.md +100 -0
  26. data/docs/general/fields.md +31 -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 +279 -0
  32. data/docs/general/serializers.md +461 -0
  33. data/docs/how-open-source-maintained.jpg +0 -0
  34. data/docs/howto/add_pagination_links.md +138 -0
  35. data/docs/howto/add_relationship_links.md +137 -0
  36. data/docs/howto/add_root_key.md +55 -0
  37. data/docs/howto/grape_integration.md +42 -0
  38. data/docs/howto/outside_controller_use.md +65 -0
  39. data/docs/howto/passing_arbitrary_options.md +27 -0
  40. data/docs/howto/serialize_poro.md +32 -0
  41. data/docs/howto/test.md +154 -0
  42. data/docs/howto/upgrade_from_0_8_to_0_10.md +265 -0
  43. data/docs/integrations/ember-and-json-api.md +144 -0
  44. data/docs/integrations/grape.md +19 -0
  45. data/docs/jsonapi/errors.md +56 -0
  46. data/docs/jsonapi/schema.md +151 -0
  47. data/docs/jsonapi/schema/schema.json +366 -0
  48. data/docs/rfcs/0000-namespace.md +106 -0
  49. data/docs/rfcs/template.md +15 -0
  50. data/lib/action_controller/serialization.rb +66 -0
  51. data/lib/active_model/serializable_resource.rb +11 -0
  52. data/lib/active_model/serializer.rb +231 -0
  53. data/lib/active_model/serializer/adapter.rb +24 -0
  54. data/lib/active_model/serializer/adapter/attributes.rb +15 -0
  55. data/lib/active_model/serializer/adapter/base.rb +18 -0
  56. data/lib/active_model/serializer/adapter/json.rb +15 -0
  57. data/lib/active_model/serializer/adapter/json_api.rb +15 -0
  58. data/lib/active_model/serializer/adapter/null.rb +15 -0
  59. data/lib/active_model/serializer/array_serializer.rb +12 -0
  60. data/lib/active_model/serializer/association.rb +34 -0
  61. data/lib/active_model/serializer/attribute.rb +25 -0
  62. data/lib/active_model/serializer/belongs_to_reflection.rb +7 -0
  63. data/lib/active_model/serializer/collection_reflection.rb +7 -0
  64. data/lib/active_model/serializer/collection_serializer.rb +87 -0
  65. data/lib/active_model/serializer/concerns/associations.rb +102 -0
  66. data/lib/active_model/serializer/concerns/attributes.rb +82 -0
  67. data/lib/active_model/serializer/concerns/caching.rb +292 -0
  68. data/lib/active_model/serializer/concerns/configuration.rb +59 -0
  69. data/lib/active_model/serializer/concerns/links.rb +35 -0
  70. data/lib/active_model/serializer/concerns/meta.rb +29 -0
  71. data/lib/active_model/serializer/concerns/type.rb +25 -0
  72. data/lib/active_model/serializer/error_serializer.rb +14 -0
  73. data/lib/active_model/serializer/errors_serializer.rb +32 -0
  74. data/lib/active_model/serializer/field.rb +90 -0
  75. data/lib/active_model/serializer/fieldset.rb +31 -0
  76. data/lib/active_model/serializer/has_many_reflection.rb +7 -0
  77. data/lib/active_model/serializer/has_one_reflection.rb +7 -0
  78. data/lib/active_model/serializer/lint.rb +150 -0
  79. data/lib/active_model/serializer/null.rb +17 -0
  80. data/lib/active_model/serializer/reflection.rb +163 -0
  81. data/lib/active_model/serializer/singular_reflection.rb +7 -0
  82. data/lib/active_model/serializer/version.rb +5 -0
  83. data/lib/active_model_serializers.rb +53 -0
  84. data/lib/active_model_serializers/adapter.rb +98 -0
  85. data/lib/active_model_serializers/adapter/attributes.rb +13 -0
  86. data/lib/active_model_serializers/adapter/base.rb +83 -0
  87. data/lib/active_model_serializers/adapter/json.rb +21 -0
  88. data/lib/active_model_serializers/adapter/json_api.rb +517 -0
  89. data/lib/active_model_serializers/adapter/json_api/deserialization.rb +213 -0
  90. data/lib/active_model_serializers/adapter/json_api/error.rb +96 -0
  91. data/lib/active_model_serializers/adapter/json_api/jsonapi.rb +49 -0
  92. data/lib/active_model_serializers/adapter/json_api/link.rb +83 -0
  93. data/lib/active_model_serializers/adapter/json_api/meta.rb +37 -0
  94. data/lib/active_model_serializers/adapter/json_api/pagination_links.rb +69 -0
  95. data/lib/active_model_serializers/adapter/json_api/relationship.rb +63 -0
  96. data/lib/active_model_serializers/adapter/json_api/resource_identifier.rb +51 -0
  97. data/lib/active_model_serializers/adapter/null.rb +9 -0
  98. data/lib/active_model_serializers/callbacks.rb +55 -0
  99. data/lib/active_model_serializers/deprecate.rb +54 -0
  100. data/lib/active_model_serializers/deserialization.rb +15 -0
  101. data/lib/active_model_serializers/json_pointer.rb +14 -0
  102. data/lib/active_model_serializers/logging.rb +122 -0
  103. data/lib/active_model_serializers/lookup_chain.rb +80 -0
  104. data/lib/active_model_serializers/model.rb +71 -0
  105. data/lib/active_model_serializers/railtie.rb +48 -0
  106. data/lib/active_model_serializers/register_jsonapi_renderer.rb +78 -0
  107. data/lib/active_model_serializers/serializable_resource.rb +82 -0
  108. data/lib/active_model_serializers/serialization_context.rb +39 -0
  109. data/lib/active_model_serializers/test.rb +7 -0
  110. data/lib/active_model_serializers/test/schema.rb +138 -0
  111. data/lib/active_model_serializers/test/serializer.rb +125 -0
  112. data/lib/generators/rails/USAGE +6 -0
  113. data/lib/generators/rails/resource_override.rb +10 -0
  114. data/lib/generators/rails/serializer_generator.rb +36 -0
  115. data/lib/generators/rails/templates/serializer.rb.erb +15 -0
  116. data/lib/grape/active_model_serializers.rb +16 -0
  117. data/lib/grape/formatters/active_model_serializers.rb +32 -0
  118. data/lib/grape/helpers/active_model_serializers.rb +17 -0
  119. data/test/action_controller/adapter_selector_test.rb +53 -0
  120. data/test/action_controller/explicit_serializer_test.rb +135 -0
  121. data/test/action_controller/json/include_test.rb +246 -0
  122. data/test/action_controller/json_api/deserialization_test.rb +112 -0
  123. data/test/action_controller/json_api/errors_test.rb +40 -0
  124. data/test/action_controller/json_api/fields_test.rb +66 -0
  125. data/test/action_controller/json_api/linked_test.rb +202 -0
  126. data/test/action_controller/json_api/pagination_test.rb +116 -0
  127. data/test/action_controller/json_api/transform_test.rb +189 -0
  128. data/test/action_controller/lookup_proc_test.rb +49 -0
  129. data/test/action_controller/namespace_lookup_test.rb +232 -0
  130. data/test/action_controller/serialization_scope_name_test.rb +229 -0
  131. data/test/action_controller/serialization_test.rb +472 -0
  132. data/test/active_model_serializers/adapter_for_test.rb +208 -0
  133. data/test/active_model_serializers/json_pointer_test.rb +22 -0
  134. data/test/active_model_serializers/logging_test.rb +77 -0
  135. data/test/active_model_serializers/model_test.rb +69 -0
  136. data/test/active_model_serializers/railtie_test_isolated.rb +63 -0
  137. data/test/active_model_serializers/register_jsonapi_renderer_test_isolated.rb +161 -0
  138. data/test/active_model_serializers/serialization_context_test_isolated.rb +71 -0
  139. data/test/active_model_serializers/test/schema_test.rb +131 -0
  140. data/test/active_model_serializers/test/serializer_test.rb +62 -0
  141. data/test/active_record_test.rb +9 -0
  142. data/test/adapter/attributes_test.rb +43 -0
  143. data/test/adapter/deprecation_test.rb +100 -0
  144. data/test/adapter/json/belongs_to_test.rb +45 -0
  145. data/test/adapter/json/collection_test.rb +104 -0
  146. data/test/adapter/json/has_many_test.rb +45 -0
  147. data/test/adapter/json/transform_test.rb +93 -0
  148. data/test/adapter/json_api/belongs_to_test.rb +155 -0
  149. data/test/adapter/json_api/collection_test.rb +96 -0
  150. data/test/adapter/json_api/errors_test.rb +76 -0
  151. data/test/adapter/json_api/fields_test.rb +96 -0
  152. data/test/adapter/json_api/has_many_embed_ids_test.rb +43 -0
  153. data/test/adapter/json_api/has_many_explicit_serializer_test.rb +96 -0
  154. data/test/adapter/json_api/has_many_test.rb +165 -0
  155. data/test/adapter/json_api/has_one_test.rb +80 -0
  156. data/test/adapter/json_api/include_data_if_sideloaded_test.rb +168 -0
  157. data/test/adapter/json_api/json_api_test.rb +33 -0
  158. data/test/adapter/json_api/linked_test.rb +413 -0
  159. data/test/adapter/json_api/links_test.rb +95 -0
  160. data/test/adapter/json_api/pagination_links_test.rb +193 -0
  161. data/test/adapter/json_api/parse_test.rb +137 -0
  162. data/test/adapter/json_api/relationship_test.rb +397 -0
  163. data/test/adapter/json_api/resource_identifier_test.rb +110 -0
  164. data/test/adapter/json_api/resource_meta_test.rb +100 -0
  165. data/test/adapter/json_api/toplevel_jsonapi_test.rb +82 -0
  166. data/test/adapter/json_api/transform_test.rb +512 -0
  167. data/test/adapter/json_api/type_test.rb +61 -0
  168. data/test/adapter/json_test.rb +46 -0
  169. data/test/adapter/null_test.rb +22 -0
  170. data/test/adapter/polymorphic_test.rb +171 -0
  171. data/test/adapter_test.rb +67 -0
  172. data/test/array_serializer_test.rb +22 -0
  173. data/test/benchmark/app.rb +65 -0
  174. data/test/benchmark/benchmarking_support.rb +67 -0
  175. data/test/benchmark/bm_active_record.rb +81 -0
  176. data/test/benchmark/bm_adapter.rb +38 -0
  177. data/test/benchmark/bm_caching.rb +119 -0
  178. data/test/benchmark/bm_lookup_chain.rb +83 -0
  179. data/test/benchmark/bm_transform.rb +45 -0
  180. data/test/benchmark/config.ru +3 -0
  181. data/test/benchmark/controllers.rb +83 -0
  182. data/test/benchmark/fixtures.rb +219 -0
  183. data/test/cache_test.rb +595 -0
  184. data/test/collection_serializer_test.rb +123 -0
  185. data/test/fixtures/active_record.rb +113 -0
  186. data/test/fixtures/poro.rb +232 -0
  187. data/test/generators/scaffold_controller_generator_test.rb +24 -0
  188. data/test/generators/serializer_generator_test.rb +74 -0
  189. data/test/grape_test.rb +178 -0
  190. data/test/lint_test.rb +49 -0
  191. data/test/logger_test.rb +20 -0
  192. data/test/poro_test.rb +9 -0
  193. data/test/serializable_resource_test.rb +79 -0
  194. data/test/serializers/association_macros_test.rb +37 -0
  195. data/test/serializers/associations_test.rb +383 -0
  196. data/test/serializers/attribute_test.rb +153 -0
  197. data/test/serializers/attributes_test.rb +52 -0
  198. data/test/serializers/caching_configuration_test_isolated.rb +170 -0
  199. data/test/serializers/configuration_test.rb +32 -0
  200. data/test/serializers/fieldset_test.rb +14 -0
  201. data/test/serializers/meta_test.rb +202 -0
  202. data/test/serializers/options_test.rb +32 -0
  203. data/test/serializers/read_attribute_for_serialization_test.rb +79 -0
  204. data/test/serializers/root_test.rb +21 -0
  205. data/test/serializers/serialization_test.rb +55 -0
  206. data/test/serializers/serializer_for_test.rb +136 -0
  207. data/test/serializers/serializer_for_with_namespace_test.rb +88 -0
  208. data/test/support/custom_schemas/active_model_serializers/test/schema_test/my/index.json +6 -0
  209. data/test/support/isolated_unit.rb +82 -0
  210. data/test/support/rails5_shims.rb +53 -0
  211. data/test/support/rails_app.rb +36 -0
  212. data/test/support/schemas/active_model_serializers/test/schema_test/my/index.json +6 -0
  213. data/test/support/schemas/active_model_serializers/test/schema_test/my/show.json +6 -0
  214. data/test/support/schemas/custom/show.json +7 -0
  215. data/test/support/schemas/hyper_schema.json +93 -0
  216. data/test/support/schemas/render_using_json_api.json +43 -0
  217. data/test/support/schemas/simple_json_pointers.json +10 -0
  218. data/test/support/serialization_testing.rb +71 -0
  219. data/test/test_helper.rb +58 -0
  220. metadata +602 -0
@@ -0,0 +1,71 @@
1
+ # Execute this test in isolation
2
+ require 'support/isolated_unit'
3
+ require 'minitest/mock'
4
+
5
+ class SerializationContextTest < ActiveSupport::TestCase
6
+ include ActiveSupport::Testing::Isolation
7
+
8
+ class WithRails < SerializationContextTest
9
+ def create_request
10
+ request = ActionDispatch::Request.new({})
11
+ def request.original_url
12
+ 'http://example.com/articles?page=2'
13
+ end
14
+
15
+ def request.query_parameters
16
+ { 'page' => 2 }
17
+ end
18
+ request
19
+ end
20
+
21
+ setup do
22
+ require 'rails'
23
+ require 'active_model_serializers'
24
+ make_basic_app
25
+ @context = ActiveModelSerializers::SerializationContext.new(create_request)
26
+ end
27
+
28
+ test 'create context with request url and query parameters' do
29
+ assert_equal @context.request_url, 'http://example.com/articles'
30
+ assert_equal @context.query_parameters, 'page' => 2
31
+ end
32
+
33
+ test 'url_helpers is set up for Rails url_helpers' do
34
+ assert_equal Module, ActiveModelSerializers::SerializationContext.url_helpers.class
35
+ assert ActiveModelSerializers::SerializationContext.url_helpers.respond_to? :url_for
36
+ end
37
+
38
+ test 'default_url_options returns Rails.application.routes.default_url_options' do
39
+ assert_equal Rails.application.routes.default_url_options,
40
+ ActiveModelSerializers::SerializationContext.default_url_options
41
+ end
42
+ end
43
+
44
+ class WithoutRails < SerializationContextTest
45
+ def create_request
46
+ {
47
+ request_url: 'http://example.com/articles',
48
+ query_parameters: { 'page' => 2 }
49
+ }
50
+ end
51
+
52
+ setup do
53
+ require 'active_model_serializers/serialization_context'
54
+ @context = ActiveModelSerializers::SerializationContext.new(create_request)
55
+ end
56
+
57
+ test 'create context with request url and query parameters' do
58
+ assert_equal @context.request_url, 'http://example.com/articles'
59
+ assert_equal @context.query_parameters, 'page' => 2
60
+ end
61
+
62
+ test 'url_helpers is a module when Rails is not present' do
63
+ assert_equal Module, ActiveModelSerializers::SerializationContext.url_helpers.class
64
+ refute ActiveModelSerializers::SerializationContext.url_helpers.respond_to? :url_for
65
+ end
66
+
67
+ test 'default_url_options return a Hash' do
68
+ assert Hash, ActiveModelSerializers::SerializationContext.default_url_options.class
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,131 @@
1
+ require 'test_helper'
2
+
3
+ module ActiveModelSerializers
4
+ module Test
5
+ class SchemaTest < ActionController::TestCase
6
+ include ActiveModelSerializers::Test::Schema
7
+
8
+ class MyController < ActionController::Base
9
+ def index
10
+ render json: profile
11
+ end
12
+
13
+ def show
14
+ index
15
+ end
16
+
17
+ def name_as_a_integer
18
+ profile.name = 1
19
+ index
20
+ end
21
+
22
+ def render_using_json_api
23
+ render json: profile, adapter: :json_api
24
+ end
25
+
26
+ def invalid_json_body
27
+ render json: ''
28
+ end
29
+
30
+ private
31
+
32
+ def profile
33
+ @profile ||= Profile.new(name: 'Name 1', description: 'Description 1', comments: 'Comments 1')
34
+ end
35
+ end
36
+
37
+ tests MyController
38
+
39
+ def test_that_assert_with_a_valid_schema
40
+ get :index
41
+ assert_response_schema
42
+ end
43
+
44
+ def test_that_raises_a_minitest_error_with_a_invalid_schema
45
+ message = "#/name: failed schema #/properties/name: For 'properties/name', \"Name 1\" is not an integer. and #/description: failed schema #/properties/description: For 'properties/description', \"Description 1\" is not a boolean."
46
+
47
+ get :show
48
+
49
+ error = assert_raises Minitest::Assertion do
50
+ assert_response_schema
51
+ end
52
+ assert_equal(message, error.message)
53
+ end
54
+
55
+ def test_that_raises_error_with_a_custom_message_with_a_invalid_schema
56
+ message = 'oh boy the show is broken'
57
+ exception_message = "#/name: failed schema #/properties/name: For 'properties/name', \"Name 1\" is not an integer. and #/description: failed schema #/properties/description: For 'properties/description', \"Description 1\" is not a boolean."
58
+ expected_message = "#{message}: #{exception_message}"
59
+
60
+ get :show
61
+
62
+ error = assert_raises Minitest::Assertion do
63
+ assert_response_schema(nil, message)
64
+ end
65
+ assert_equal(expected_message, error.message)
66
+ end
67
+
68
+ def test_that_assert_with_a_custom_schema
69
+ get :show
70
+ assert_response_schema('custom/show.json')
71
+ end
72
+
73
+ def test_that_assert_with_a_hyper_schema
74
+ get :show
75
+ assert_response_schema('hyper_schema.json')
76
+ end
77
+
78
+ def test_simple_json_pointers
79
+ get :show
80
+ assert_response_schema('simple_json_pointers.json')
81
+ end
82
+
83
+ def test_simple_json_pointers_that_doesnt_match
84
+ get :name_as_a_integer
85
+
86
+ assert_raises Minitest::Assertion do
87
+ assert_response_schema('simple_json_pointers.json')
88
+ end
89
+ end
90
+
91
+ def test_json_api_schema
92
+ get :render_using_json_api
93
+ assert_response_schema('render_using_json_api.json')
94
+ end
95
+
96
+ def test_that_assert_with_a_custom_schema_directory
97
+ original_schema_path = ActiveModelSerializers.config.schema_path
98
+ ActiveModelSerializers.config.schema_path = 'test/support/custom_schemas'
99
+
100
+ get :index
101
+ assert_response_schema
102
+
103
+ ActiveModelSerializers.config.schema_path = original_schema_path
104
+ end
105
+
106
+ def test_with_a_non_existent_file
107
+ message = 'No Schema file at test/support/schemas/non-existent.json'
108
+
109
+ get :show
110
+
111
+ error = assert_raises ActiveModelSerializers::Test::Schema::MissingSchema do
112
+ assert_response_schema('non-existent.json')
113
+ end
114
+ assert_equal(message, error.message)
115
+ end
116
+
117
+ def test_that_raises_with_a_invalid_json_body
118
+ # message changes from JSON gem 2.0.2 to 2.2.0
119
+ message = /A JSON text must at least contain two octets!|unexpected token at ''/
120
+
121
+ get :invalid_json_body
122
+
123
+ error = assert_raises ActiveModelSerializers::Test::Schema::InvalidSchemaError do
124
+ assert_response_schema('custom/show.json')
125
+ end
126
+
127
+ assert_match(message, error.message)
128
+ end
129
+ end
130
+ end
131
+ end
@@ -0,0 +1,62 @@
1
+ require 'test_helper'
2
+
3
+ module ActiveModelSerializers
4
+ module Test
5
+ class SerializerTest < ActionController::TestCase
6
+ include ActiveModelSerializers::Test::Serializer
7
+
8
+ class MyController < ActionController::Base
9
+ def render_using_serializer
10
+ render json: Profile.new(name: 'Name 1', description: 'Description 1', comments: 'Comments 1')
11
+ end
12
+
13
+ def render_some_text
14
+ render(plain: 'ok')
15
+ end
16
+ end
17
+
18
+ tests MyController
19
+
20
+ def test_supports_specifying_serializers_with_a_serializer_class
21
+ get :render_using_serializer
22
+ assert_serializer ProfileSerializer
23
+ end
24
+
25
+ def test_supports_specifying_serializers_with_a_regexp
26
+ get :render_using_serializer
27
+ assert_serializer(/\AProfile.+\Z/)
28
+ end
29
+
30
+ def test_supports_specifying_serializers_with_a_string
31
+ get :render_using_serializer
32
+ assert_serializer 'ProfileSerializer'
33
+ end
34
+
35
+ def test_supports_specifying_serializers_with_a_symbol
36
+ get :render_using_serializer
37
+ assert_serializer :profile_serializer
38
+ end
39
+
40
+ def test_supports_specifying_serializers_with_a_nil
41
+ get :render_some_text
42
+ assert_serializer nil
43
+ end
44
+
45
+ def test_raises_descriptive_error_message_when_serializer_was_not_rendered
46
+ get :render_using_serializer
47
+ e = assert_raise ActiveSupport::TestCase::Assertion do
48
+ assert_serializer 'PostSerializer'
49
+ end
50
+ assert_match 'expecting <"PostSerializer"> but rendering with <["ProfileSerializer"]>', e.message
51
+ end
52
+
53
+ def test_raises_argument_error_when_asserting_with_invalid_object
54
+ get :render_using_serializer
55
+ e = assert_raise ArgumentError do
56
+ assert_serializer Hash
57
+ end
58
+ assert_match 'assert_serializer only accepts a String, Symbol, Regexp, ActiveModel::Serializer, or nil', e.message
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,9 @@
1
+ require 'test_helper'
2
+
3
+ class ActiveRecordTest < ActiveSupport::TestCase
4
+ include ActiveModel::Serializer::Lint::Tests
5
+
6
+ def setup
7
+ @resource = ARModels::Post.new
8
+ end
9
+ end
@@ -0,0 +1,43 @@
1
+ require 'test_helper'
2
+
3
+ module ActiveModelSerializers
4
+ module Adapter
5
+ class AttributesTest < ActiveSupport::TestCase
6
+ class Person
7
+ include ActiveModel::Model
8
+ include ActiveModel::Serialization
9
+
10
+ attr_accessor :first_name, :last_name
11
+ end
12
+
13
+ class PersonSerializer < ActiveModel::Serializer
14
+ attributes :first_name, :last_name
15
+ end
16
+
17
+ def setup
18
+ ActionController::Base.cache_store.clear
19
+ end
20
+
21
+ def test_serializable_hash
22
+ person = Person.new(first_name: 'Arthur', last_name: 'Dent')
23
+ serializer = PersonSerializer.new(person)
24
+ adapter = ActiveModelSerializers::Adapter::Attributes.new(serializer)
25
+
26
+ assert_equal({ first_name: 'Arthur', last_name: 'Dent' },
27
+ adapter.serializable_hash)
28
+ end
29
+
30
+ def test_serializable_hash_with_transform_key_casing
31
+ person = Person.new(first_name: 'Arthur', last_name: 'Dent')
32
+ serializer = PersonSerializer.new(person)
33
+ adapter = ActiveModelSerializers::Adapter::Attributes.new(
34
+ serializer,
35
+ key_transform: :camel_lower
36
+ )
37
+
38
+ assert_equal({ firstName: 'Arthur', lastName: 'Dent' },
39
+ adapter.serializable_hash)
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,100 @@
1
+ require 'test_helper'
2
+ module ActiveModel
3
+ class Serializer
4
+ module Adapter
5
+ class DeprecationTest < ActiveSupport::TestCase
6
+ class PostSerializer < ActiveModel::Serializer
7
+ attribute :body
8
+ end
9
+ setup do
10
+ post = Post.new(id: 1, body: 'Hello')
11
+ @serializer = PostSerializer.new(post)
12
+ end
13
+
14
+ def test_null_adapter_serialization_deprecation
15
+ expected = {}
16
+ assert_deprecated do
17
+ assert_equal(expected, Null.new(@serializer).as_json)
18
+ end
19
+ end
20
+
21
+ def test_json_adapter_serialization_deprecation
22
+ expected = { post: { body: 'Hello' } }
23
+ assert_deprecated do
24
+ assert_equal(expected, Json.new(@serializer).as_json)
25
+ end
26
+ end
27
+
28
+ def test_jsonapi_adapter_serialization_deprecation
29
+ expected = {
30
+ data: {
31
+ id: '1',
32
+ type: 'posts',
33
+ attributes: {
34
+ body: 'Hello'
35
+ }
36
+ }
37
+ }
38
+ assert_deprecated do
39
+ assert_equal(expected, JsonApi.new(@serializer).as_json)
40
+ end
41
+ end
42
+
43
+ def test_attributes_adapter_serialization_deprecation
44
+ expected = { body: 'Hello' }
45
+ assert_deprecated do
46
+ assert_equal(expected, Attributes.new(@serializer).as_json)
47
+ end
48
+ end
49
+
50
+ def test_adapter_create_deprecation
51
+ assert_deprecated do
52
+ Adapter.create(@serializer)
53
+ end
54
+ end
55
+
56
+ def test_adapter_adapter_map_deprecation
57
+ assert_deprecated do
58
+ Adapter.adapter_map
59
+ end
60
+ end
61
+
62
+ def test_adapter_adapters_deprecation
63
+ assert_deprecated do
64
+ Adapter.adapters
65
+ end
66
+ end
67
+
68
+ def test_adapter_adapter_class_deprecation
69
+ assert_deprecated do
70
+ Adapter.adapter_class(:json_api)
71
+ end
72
+ end
73
+
74
+ def test_adapter_register_deprecation
75
+ assert_deprecated do
76
+ begin
77
+ Adapter.register(:test, Class.new)
78
+ ensure
79
+ Adapter.adapter_map.delete('test')
80
+ end
81
+ end
82
+ end
83
+
84
+ def test_adapter_lookup_deprecation
85
+ assert_deprecated do
86
+ Adapter.lookup(:json_api)
87
+ end
88
+ end
89
+
90
+ private
91
+
92
+ def assert_deprecated
93
+ assert_output(nil, /deprecated/) do
94
+ yield
95
+ end
96
+ end
97
+ end
98
+ end
99
+ end
100
+ end
@@ -0,0 +1,45 @@
1
+ require 'test_helper'
2
+
3
+ module ActiveModelSerializers
4
+ module Adapter
5
+ class Json
6
+ class BelongsToTest < ActiveSupport::TestCase
7
+ def setup
8
+ @post = Post.new(id: 42, title: 'New Post', body: 'Body')
9
+ @anonymous_post = Post.new(id: 43, title: 'Hello!!', body: 'Hello, world!!')
10
+ @comment = Comment.new(id: 1, body: 'ZOMG A COMMENT')
11
+ @post.comments = [@comment]
12
+ @anonymous_post.comments = []
13
+ @comment.post = @post
14
+ @comment.author = nil
15
+ @anonymous_post.author = nil
16
+ @blog = Blog.new(id: 1, name: 'My Blog!!')
17
+ @post.blog = @blog
18
+ @anonymous_post.blog = nil
19
+
20
+ @serializer = CommentSerializer.new(@comment)
21
+ @adapter = ActiveModelSerializers::Adapter::Json.new(@serializer)
22
+ ActionController::Base.cache_store.clear
23
+ end
24
+
25
+ def test_includes_post
26
+ assert_equal({ id: 42, title: 'New Post', body: 'Body' }, @adapter.serializable_hash[:comment][:post])
27
+ end
28
+
29
+ def test_include_nil_author
30
+ serializer = PostSerializer.new(@anonymous_post)
31
+ adapter = ActiveModelSerializers::Adapter::Json.new(serializer)
32
+
33
+ assert_equal({ post: { title: 'Hello!!', body: 'Hello, world!!', id: 43, comments: [], blog: { id: 999, name: 'Custom blog' }, author: nil } }, adapter.serializable_hash)
34
+ end
35
+
36
+ def test_include_nil_author_with_specified_serializer
37
+ serializer = PostPreviewSerializer.new(@anonymous_post)
38
+ adapter = ActiveModelSerializers::Adapter::Json.new(serializer)
39
+
40
+ assert_equal({ post: { title: 'Hello!!', body: 'Hello, world!!', id: 43, comments: [], author: nil } }, adapter.serializable_hash)
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end