active_model_serializers 0.10.0 → 0.10.13

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 +5 -5
  2. data/CHANGELOG.md +239 -2
  3. data/README.md +171 -34
  4. data/lib/action_controller/serialization.rb +23 -3
  5. data/lib/active_model/serializable_resource.rb +2 -0
  6. data/lib/active_model/serializer/adapter/attributes.rb +2 -0
  7. data/lib/active_model/serializer/adapter/base.rb +4 -0
  8. data/lib/active_model/serializer/adapter/json.rb +2 -0
  9. data/lib/active_model/serializer/adapter/json_api.rb +2 -0
  10. data/lib/active_model/serializer/adapter/null.rb +2 -0
  11. data/lib/active_model/serializer/adapter.rb +2 -0
  12. data/lib/active_model/serializer/array_serializer.rb +10 -5
  13. data/lib/active_model/serializer/association.rb +64 -10
  14. data/lib/active_model/serializer/attribute.rb +2 -0
  15. data/lib/active_model/serializer/belongs_to_reflection.rb +6 -3
  16. data/lib/active_model/serializer/collection_serializer.rb +48 -13
  17. data/lib/active_model/serializer/{caching.rb → concerns/caching.rb} +89 -117
  18. data/lib/active_model/serializer/error_serializer.rb +13 -7
  19. data/lib/active_model/serializer/errors_serializer.rb +27 -20
  20. data/lib/active_model/serializer/field.rb +2 -0
  21. data/lib/active_model/serializer/fieldset.rb +3 -1
  22. data/lib/active_model/serializer/has_many_reflection.rb +5 -3
  23. data/lib/active_model/serializer/has_one_reflection.rb +3 -4
  24. data/lib/active_model/serializer/lazy_association.rb +99 -0
  25. data/lib/active_model/serializer/link.rb +23 -0
  26. data/lib/active_model/serializer/lint.rb +136 -130
  27. data/lib/active_model/serializer/null.rb +2 -0
  28. data/lib/active_model/serializer/reflection.rb +130 -65
  29. data/lib/active_model/serializer/version.rb +3 -1
  30. data/lib/active_model/serializer.rb +321 -86
  31. data/lib/active_model_serializers/adapter/attributes.rb +17 -57
  32. data/lib/active_model_serializers/adapter/base.rb +41 -39
  33. data/lib/active_model_serializers/adapter/json.rb +2 -0
  34. data/lib/active_model_serializers/adapter/json_api/deserialization.rb +4 -2
  35. data/lib/active_model_serializers/adapter/json_api/error.rb +2 -0
  36. data/lib/active_model_serializers/adapter/json_api/jsonapi.rb +2 -0
  37. data/lib/active_model_serializers/adapter/json_api/link.rb +3 -1
  38. data/lib/active_model_serializers/adapter/json_api/meta.rb +2 -0
  39. data/lib/active_model_serializers/adapter/json_api/pagination_links.rb +52 -20
  40. data/lib/active_model_serializers/adapter/json_api/relationship.rb +77 -23
  41. data/lib/active_model_serializers/adapter/json_api/resource_identifier.rb +41 -10
  42. data/lib/active_model_serializers/adapter/json_api.rb +84 -65
  43. data/lib/active_model_serializers/adapter/null.rb +2 -0
  44. data/lib/active_model_serializers/adapter.rb +9 -1
  45. data/lib/active_model_serializers/callbacks.rb +2 -0
  46. data/lib/active_model_serializers/deprecate.rb +3 -2
  47. data/lib/active_model_serializers/deserialization.rb +4 -0
  48. data/lib/active_model_serializers/json_pointer.rb +2 -0
  49. data/lib/active_model_serializers/logging.rb +2 -0
  50. data/lib/active_model_serializers/lookup_chain.rb +82 -0
  51. data/lib/active_model_serializers/model/caching.rb +26 -0
  52. data/lib/active_model_serializers/model.rb +111 -28
  53. data/lib/active_model_serializers/railtie.rb +7 -1
  54. data/lib/active_model_serializers/register_jsonapi_renderer.rb +46 -31
  55. data/lib/active_model_serializers/serializable_resource.rb +10 -7
  56. data/lib/active_model_serializers/serialization_context.rb +12 -3
  57. data/lib/active_model_serializers/test/schema.rb +4 -2
  58. data/lib/active_model_serializers/test/serializer.rb +2 -0
  59. data/lib/active_model_serializers/test.rb +2 -0
  60. data/lib/active_model_serializers.rb +35 -10
  61. data/lib/generators/rails/resource_override.rb +3 -1
  62. data/lib/generators/rails/serializer_generator.rb +6 -4
  63. data/lib/grape/active_model_serializers.rb +9 -5
  64. data/lib/grape/formatters/active_model_serializers.rb +21 -2
  65. data/lib/grape/helpers/active_model_serializers.rb +3 -0
  66. data/lib/tasks/rubocop.rake +55 -0
  67. metadata +104 -296
  68. data/.github/ISSUE_TEMPLATE.md +0 -29
  69. data/.github/PULL_REQUEST_TEMPLATE.md +0 -15
  70. data/.gitignore +0 -35
  71. data/.rubocop.yml +0 -104
  72. data/.rubocop_todo.yml +0 -167
  73. data/.simplecov +0 -110
  74. data/.travis.yml +0 -43
  75. data/CONTRIBUTING.md +0 -105
  76. data/Gemfile +0 -53
  77. data/Rakefile +0 -103
  78. data/active_model_serializers.gemspec +0 -66
  79. data/appveyor.yml +0 -24
  80. data/bin/bench +0 -171
  81. data/bin/bench_regression +0 -316
  82. data/bin/serve_benchmark +0 -39
  83. data/docs/ARCHITECTURE.md +0 -126
  84. data/docs/README.md +0 -40
  85. data/docs/STYLE.md +0 -58
  86. data/docs/general/adapters.md +0 -245
  87. data/docs/general/caching.md +0 -52
  88. data/docs/general/configuration_options.md +0 -100
  89. data/docs/general/deserialization.md +0 -100
  90. data/docs/general/getting_started.md +0 -133
  91. data/docs/general/instrumentation.md +0 -40
  92. data/docs/general/key_transforms.md +0 -40
  93. data/docs/general/logging.md +0 -14
  94. data/docs/general/rendering.md +0 -255
  95. data/docs/general/serializers.md +0 -372
  96. data/docs/how-open-source-maintained.jpg +0 -0
  97. data/docs/howto/add_pagination_links.md +0 -139
  98. data/docs/howto/add_root_key.md +0 -51
  99. data/docs/howto/outside_controller_use.md +0 -58
  100. data/docs/howto/passing_arbitrary_options.md +0 -27
  101. data/docs/howto/serialize_poro.md +0 -32
  102. data/docs/howto/test.md +0 -152
  103. data/docs/integrations/ember-and-json-api.md +0 -112
  104. data/docs/integrations/grape.md +0 -19
  105. data/docs/jsonapi/errors.md +0 -56
  106. data/docs/jsonapi/schema/schema.json +0 -366
  107. data/docs/jsonapi/schema.md +0 -151
  108. data/docs/rfcs/0000-namespace.md +0 -106
  109. data/docs/rfcs/template.md +0 -15
  110. data/lib/active_model/serializer/associations.rb +0 -100
  111. data/lib/active_model/serializer/attributes.rb +0 -82
  112. data/lib/active_model/serializer/collection_reflection.rb +0 -7
  113. data/lib/active_model/serializer/configuration.rb +0 -35
  114. data/lib/active_model/serializer/include_tree.rb +0 -111
  115. data/lib/active_model/serializer/links.rb +0 -35
  116. data/lib/active_model/serializer/meta.rb +0 -29
  117. data/lib/active_model/serializer/singular_reflection.rb +0 -7
  118. data/lib/active_model/serializer/type.rb +0 -25
  119. data/lib/active_model_serializers/key_transform.rb +0 -70
  120. data/test/action_controller/adapter_selector_test.rb +0 -53
  121. data/test/action_controller/explicit_serializer_test.rb +0 -134
  122. data/test/action_controller/json/include_test.rb +0 -167
  123. data/test/action_controller/json_api/deserialization_test.rb +0 -112
  124. data/test/action_controller/json_api/errors_test.rb +0 -41
  125. data/test/action_controller/json_api/linked_test.rb +0 -197
  126. data/test/action_controller/json_api/pagination_test.rb +0 -116
  127. data/test/action_controller/json_api/transform_test.rb +0 -181
  128. data/test/action_controller/serialization_scope_name_test.rb +0 -229
  129. data/test/action_controller/serialization_test.rb +0 -469
  130. data/test/active_model_serializers/adapter_for_test.rb +0 -208
  131. data/test/active_model_serializers/json_pointer_test.rb +0 -20
  132. data/test/active_model_serializers/key_transform_test.rb +0 -263
  133. data/test/active_model_serializers/logging_test.rb +0 -77
  134. data/test/active_model_serializers/model_test.rb +0 -9
  135. data/test/active_model_serializers/railtie_test_isolated.rb +0 -63
  136. data/test/active_model_serializers/serialization_context_test_isolated.rb +0 -58
  137. data/test/active_model_serializers/test/schema_test.rb +0 -130
  138. data/test/active_model_serializers/test/serializer_test.rb +0 -62
  139. data/test/active_record_test.rb +0 -9
  140. data/test/adapter/deprecation_test.rb +0 -100
  141. data/test/adapter/json/belongs_to_test.rb +0 -45
  142. data/test/adapter/json/collection_test.rb +0 -90
  143. data/test/adapter/json/has_many_test.rb +0 -45
  144. data/test/adapter/json/transform_test.rb +0 -93
  145. data/test/adapter/json_api/belongs_to_test.rb +0 -155
  146. data/test/adapter/json_api/collection_test.rb +0 -95
  147. data/test/adapter/json_api/errors_test.rb +0 -78
  148. data/test/adapter/json_api/fields_test.rb +0 -87
  149. data/test/adapter/json_api/has_many_embed_ids_test.rb +0 -43
  150. data/test/adapter/json_api/has_many_explicit_serializer_test.rb +0 -96
  151. data/test/adapter/json_api/has_many_test.rb +0 -144
  152. data/test/adapter/json_api/has_one_test.rb +0 -80
  153. data/test/adapter/json_api/json_api_test.rb +0 -35
  154. data/test/adapter/json_api/linked_test.rb +0 -392
  155. data/test/adapter/json_api/links_test.rb +0 -93
  156. data/test/adapter/json_api/pagination_links_test.rb +0 -166
  157. data/test/adapter/json_api/parse_test.rb +0 -137
  158. data/test/adapter/json_api/relationship_test.rb +0 -161
  159. data/test/adapter/json_api/relationships_test.rb +0 -199
  160. data/test/adapter/json_api/resource_identifier_test.rb +0 -85
  161. data/test/adapter/json_api/resource_meta_test.rb +0 -100
  162. data/test/adapter/json_api/toplevel_jsonapi_test.rb +0 -82
  163. data/test/adapter/json_api/transform_test.rb +0 -502
  164. data/test/adapter/json_api/type_test.rb +0 -61
  165. data/test/adapter/json_test.rb +0 -45
  166. data/test/adapter/null_test.rb +0 -23
  167. data/test/adapter/polymorphic_test.rb +0 -171
  168. data/test/adapter_test.rb +0 -67
  169. data/test/array_serializer_test.rb +0 -22
  170. data/test/benchmark/app.rb +0 -65
  171. data/test/benchmark/benchmarking_support.rb +0 -67
  172. data/test/benchmark/bm_caching.rb +0 -119
  173. data/test/benchmark/bm_transform.rb +0 -34
  174. data/test/benchmark/config.ru +0 -3
  175. data/test/benchmark/controllers.rb +0 -84
  176. data/test/benchmark/fixtures.rb +0 -219
  177. data/test/cache_test.rb +0 -485
  178. data/test/collection_serializer_test.rb +0 -110
  179. data/test/fixtures/active_record.rb +0 -78
  180. data/test/fixtures/poro.rb +0 -282
  181. data/test/generators/scaffold_controller_generator_test.rb +0 -24
  182. data/test/generators/serializer_generator_test.rb +0 -57
  183. data/test/grape_test.rb +0 -82
  184. data/test/include_tree/from_include_args_test.rb +0 -26
  185. data/test/include_tree/from_string_test.rb +0 -94
  186. data/test/include_tree/include_args_to_hash_test.rb +0 -64
  187. data/test/lint_test.rb +0 -49
  188. data/test/logger_test.rb +0 -18
  189. data/test/poro_test.rb +0 -9
  190. data/test/serializable_resource_test.rb +0 -83
  191. data/test/serializers/association_macros_test.rb +0 -36
  192. data/test/serializers/associations_test.rb +0 -295
  193. data/test/serializers/attribute_test.rb +0 -151
  194. data/test/serializers/attributes_test.rb +0 -52
  195. data/test/serializers/caching_configuration_test_isolated.rb +0 -170
  196. data/test/serializers/configuration_test.rb +0 -32
  197. data/test/serializers/fieldset_test.rb +0 -14
  198. data/test/serializers/meta_test.rb +0 -196
  199. data/test/serializers/options_test.rb +0 -21
  200. data/test/serializers/read_attribute_for_serialization_test.rb +0 -79
  201. data/test/serializers/root_test.rb +0 -21
  202. data/test/serializers/serialization_test.rb +0 -55
  203. data/test/serializers/serializer_for_test.rb +0 -134
  204. data/test/support/custom_schemas/active_model_serializers/test/schema_test/my/index.json +0 -6
  205. data/test/support/isolated_unit.rb +0 -79
  206. data/test/support/rails5_shims.rb +0 -47
  207. data/test/support/rails_app.rb +0 -45
  208. data/test/support/schemas/active_model_serializers/test/schema_test/my/index.json +0 -6
  209. data/test/support/schemas/active_model_serializers/test/schema_test/my/show.json +0 -6
  210. data/test/support/schemas/custom/show.json +0 -7
  211. data/test/support/schemas/hyper_schema.json +0 -93
  212. data/test/support/schemas/render_using_json_api.json +0 -43
  213. data/test/support/schemas/simple_json_pointers.json +0 -10
  214. data/test/support/serialization_testing.rb +0 -53
  215. data/test/test_helper.rb +0 -57
@@ -1,166 +0,0 @@
1
- require 'test_helper'
2
- require 'will_paginate/array'
3
- require 'kaminari'
4
- require 'kaminari/hooks'
5
- ::Kaminari::Hooks.init
6
-
7
- module ActiveModelSerializers
8
- module Adapter
9
- class JsonApi
10
- class PaginationLinksTest < ActiveSupport::TestCase
11
- URI = 'http://example.com'.freeze
12
-
13
- def setup
14
- ActionController::Base.cache_store.clear
15
- @array = [
16
- Profile.new({ id: 1, name: 'Name 1', description: 'Description 1', comments: 'Comments 1' }),
17
- Profile.new({ id: 2, name: 'Name 2', description: 'Description 2', comments: 'Comments 2' }),
18
- Profile.new({ id: 3, name: 'Name 3', description: 'Description 3', comments: 'Comments 3' }),
19
- Profile.new({ id: 4, name: 'Name 4', description: 'Description 4', comments: 'Comments 4' }),
20
- Profile.new({ id: 5, name: 'Name 5', description: 'Description 5', comments: 'Comments 5' })
21
- ]
22
- end
23
-
24
- def mock_request(query_parameters = {}, original_url = URI)
25
- context = Minitest::Mock.new
26
- context.expect(:request_url, original_url)
27
- context.expect(:query_parameters, query_parameters)
28
- context.expect(:key_transform, nil)
29
- end
30
-
31
- def load_adapter(paginated_collection, mock_request = nil)
32
- render_options = { adapter: :json_api }
33
- render_options[:serialization_context] = mock_request if mock_request
34
- serializable(paginated_collection, render_options)
35
- end
36
-
37
- def using_kaminari(page = 2)
38
- Kaminari.paginate_array(@array).page(page).per(2)
39
- end
40
-
41
- def using_will_paginate(page = 2)
42
- @array.paginate(page: page, per_page: 2)
43
- end
44
-
45
- def data
46
- { data: [
47
- { id: '1', type: 'profiles', attributes: { name: 'Name 1', description: 'Description 1' } },
48
- { id: '2', type: 'profiles', attributes: { name: 'Name 2', description: 'Description 2' } },
49
- { id: '3', type: 'profiles', attributes: { name: 'Name 3', description: 'Description 3' } },
50
- { id: '4', type: 'profiles', attributes: { name: 'Name 4', description: 'Description 4' } },
51
- { id: '5', type: 'profiles', attributes: { name: 'Name 5', description: 'Description 5' } }
52
- ]
53
- }
54
- end
55
-
56
- def links
57
- {
58
- links: {
59
- self: "#{URI}?page%5Bnumber%5D=2&page%5Bsize%5D=2",
60
- first: "#{URI}?page%5Bnumber%5D=1&page%5Bsize%5D=2",
61
- prev: "#{URI}?page%5Bnumber%5D=1&page%5Bsize%5D=2",
62
- next: "#{URI}?page%5Bnumber%5D=3&page%5Bsize%5D=2",
63
- last: "#{URI}?page%5Bnumber%5D=3&page%5Bsize%5D=2"
64
- }
65
- }
66
- end
67
-
68
- def last_page_links
69
- {
70
- links: {
71
- self: "#{URI}?page%5Bnumber%5D=3&page%5Bsize%5D=2",
72
- first: "#{URI}?page%5Bnumber%5D=1&page%5Bsize%5D=2",
73
- prev: "#{URI}?page%5Bnumber%5D=2&page%5Bsize%5D=2"
74
- }
75
- }
76
- end
77
-
78
- def expected_response_without_pagination_links
79
- data
80
- end
81
-
82
- def expected_response_with_pagination_links
83
- {}.tap do |hash|
84
- hash[:data] = data.values.flatten[2..3]
85
- hash.merge! links
86
- end
87
- end
88
-
89
- def expected_response_with_pagination_links_and_additional_params
90
- new_links = links[:links].each_with_object({}) { |(key, value), hash| hash[key] = "#{value}&test=test" }
91
- {}.tap do |hash|
92
- hash[:data] = data.values.flatten[2..3]
93
- hash.merge! links: new_links
94
- end
95
- end
96
-
97
- def expected_response_with_last_page_pagination_links
98
- {}.tap do |hash|
99
- hash[:data] = [data.values.flatten.last]
100
- hash.merge! last_page_links
101
- end
102
- end
103
-
104
- def expected_response_with_no_data_pagination_links
105
- {}.tap do |hash|
106
- hash[:data] = []
107
- hash[:links] = {}
108
- end
109
- end
110
-
111
- def test_pagination_links_using_kaminari
112
- adapter = load_adapter(using_kaminari, mock_request)
113
-
114
- assert_equal expected_response_with_pagination_links, adapter.serializable_hash
115
- end
116
-
117
- def test_pagination_links_using_will_paginate
118
- adapter = load_adapter(using_will_paginate, mock_request)
119
-
120
- assert_equal expected_response_with_pagination_links, adapter.serializable_hash
121
- end
122
-
123
- def test_pagination_links_with_additional_params
124
- adapter = load_adapter(using_will_paginate, mock_request({ test: 'test' }))
125
-
126
- assert_equal expected_response_with_pagination_links_and_additional_params,
127
- adapter.serializable_hash
128
- end
129
-
130
- def test_pagination_links_when_zero_results_kaminari
131
- @array = []
132
-
133
- adapter = load_adapter(using_kaminari(1), mock_request)
134
-
135
- assert_equal expected_response_with_no_data_pagination_links, adapter.serializable_hash
136
- end
137
-
138
- def test_pagination_links_when_zero_results_will_paginate
139
- @array = []
140
-
141
- adapter = load_adapter(using_will_paginate(1), mock_request)
142
-
143
- assert_equal expected_response_with_no_data_pagination_links, adapter.serializable_hash
144
- end
145
-
146
- def test_last_page_pagination_links_using_kaminari
147
- adapter = load_adapter(using_kaminari(3), mock_request)
148
-
149
- assert_equal expected_response_with_last_page_pagination_links, adapter.serializable_hash
150
- end
151
-
152
- def test_last_page_pagination_links_using_will_paginate
153
- adapter = load_adapter(using_will_paginate(3), mock_request)
154
-
155
- assert_equal expected_response_with_last_page_pagination_links, adapter.serializable_hash
156
- end
157
-
158
- def test_not_showing_pagination_links
159
- adapter = load_adapter(@array, mock_request)
160
-
161
- assert_equal expected_response_without_pagination_links, adapter.serializable_hash
162
- end
163
- end
164
- end
165
- end
166
- end
@@ -1,137 +0,0 @@
1
- require 'test_helper'
2
- module ActiveModelSerializers
3
- module Adapter
4
- class JsonApi
5
- module Deserialization
6
- class ParseTest < Minitest::Test
7
- def setup
8
- @hash = {
9
- 'data' => {
10
- 'type' => 'photos',
11
- 'id' => 'zorglub',
12
- 'attributes' => {
13
- 'title' => 'Ember Hamster',
14
- 'src' => 'http://example.com/images/productivity.png'
15
- },
16
- 'relationships' => {
17
- 'author' => {
18
- 'data' => nil
19
- },
20
- 'photographer' => {
21
- 'data' => { 'type' => 'people', 'id' => '9' }
22
- },
23
- 'comments' => {
24
- 'data' => [
25
- { 'type' => 'comments', 'id' => '1' },
26
- { 'type' => 'comments', 'id' => '2' }
27
- ]
28
- }
29
- }
30
- }
31
- }
32
- @params = ActionController::Parameters.new(@hash)
33
- @expected = {
34
- id: 'zorglub',
35
- title: 'Ember Hamster',
36
- src: 'http://example.com/images/productivity.png',
37
- author_id: nil,
38
- photographer_id: '9',
39
- comment_ids: %w(1 2)
40
- }
41
-
42
- @illformed_payloads = [nil,
43
- {},
44
- {
45
- 'data' => nil
46
- }, {
47
- 'data' => { 'attributes' => [] }
48
- }, {
49
- 'data' => { 'relationships' => [] }
50
- }, {
51
- 'data' => {
52
- 'relationships' => { 'rel' => nil }
53
- }
54
- }, {
55
- 'data' => {
56
- 'relationships' => { 'rel' => {} }
57
- }
58
- }]
59
- end
60
-
61
- def test_hash
62
- parsed_hash = ActiveModelSerializers::Adapter::JsonApi::Deserialization.parse!(@hash)
63
- assert_equal(@expected, parsed_hash)
64
- end
65
-
66
- def test_actioncontroller_parameters
67
- assert_equal(false, @params.permitted?)
68
- parsed_hash = ActiveModelSerializers::Adapter::JsonApi::Deserialization.parse!(@params)
69
- assert_equal(@expected, parsed_hash)
70
- end
71
-
72
- def test_illformed_payloads_safe
73
- @illformed_payloads.each do |p|
74
- parsed_hash = ActiveModelSerializers::Adapter::JsonApi::Deserialization.parse(p)
75
- assert_equal({}, parsed_hash)
76
- end
77
- end
78
-
79
- def test_illformed_payloads_unsafe
80
- @illformed_payloads.each do |p|
81
- assert_raises(InvalidDocument) do
82
- ActiveModelSerializers::Adapter::JsonApi::Deserialization.parse!(p)
83
- end
84
- end
85
- end
86
-
87
- def test_filter_fields_only
88
- parsed_hash = ActiveModelSerializers::Adapter::JsonApi::Deserialization.parse!(@hash, only: [:id, :title, :author])
89
- expected = {
90
- id: 'zorglub',
91
- title: 'Ember Hamster',
92
- author_id: nil
93
- }
94
- assert_equal(expected, parsed_hash)
95
- end
96
-
97
- def test_filter_fields_except
98
- parsed_hash = ActiveModelSerializers::Adapter::JsonApi::Deserialization.parse!(@hash, except: [:id, :title, :author])
99
- expected = {
100
- src: 'http://example.com/images/productivity.png',
101
- photographer_id: '9',
102
- comment_ids: %w(1 2)
103
- }
104
- assert_equal(expected, parsed_hash)
105
- end
106
-
107
- def test_keys
108
- parsed_hash = ActiveModelSerializers::Adapter::JsonApi::Deserialization.parse!(@hash, keys: { author: :user, title: :post_title })
109
- expected = {
110
- id: 'zorglub',
111
- post_title: 'Ember Hamster',
112
- src: 'http://example.com/images/productivity.png',
113
- user_id: nil,
114
- photographer_id: '9',
115
- comment_ids: %w(1 2)
116
- }
117
- assert_equal(expected, parsed_hash)
118
- end
119
-
120
- def test_polymorphic
121
- parsed_hash = ActiveModelSerializers::Adapter::JsonApi::Deserialization.parse!(@hash, polymorphic: [:photographer])
122
- expected = {
123
- id: 'zorglub',
124
- title: 'Ember Hamster',
125
- src: 'http://example.com/images/productivity.png',
126
- author_id: nil,
127
- photographer_id: '9',
128
- photographer_type: 'people',
129
- comment_ids: %w(1 2)
130
- }
131
- assert_equal(expected, parsed_hash)
132
- end
133
- end
134
- end
135
- end
136
- end
137
- end
@@ -1,161 +0,0 @@
1
- require 'test_helper'
2
-
3
- module ActiveModelSerializers
4
- module Adapter
5
- class JsonApi
6
- class RelationshipTest < ActiveSupport::TestCase
7
- setup do
8
- @blog = Blog.new(id: 1)
9
- @author = Author.new(id: 1, name: 'Steve K.', blog: @blog)
10
- @serializer = BlogSerializer.new(@blog)
11
- ActionController::Base.cache_store.clear
12
- end
13
-
14
- def test_relationship_with_data
15
- expected = {
16
- data: {
17
- id: '1',
18
- type: 'blogs'
19
- }
20
- }
21
- test_relationship(expected, options: { include_data: true })
22
- end
23
-
24
- def test_relationship_with_nil_model
25
- @serializer = BlogSerializer.new(nil)
26
- expected = { data: nil }
27
- test_relationship(expected, options: { include_data: true })
28
- end
29
-
30
- def test_relationship_with_nil_serializer
31
- @serializer = nil
32
- expected = { data: nil }
33
- test_relationship(expected, options: { include_data: true })
34
- end
35
-
36
- def test_relationship_with_data_array
37
- posts = [Post.new(id: 1), Post.new(id: 2)]
38
- @serializer = ActiveModel::Serializer::CollectionSerializer.new(posts)
39
- @author.posts = posts
40
- @author.blog = nil
41
- expected = {
42
- data: [
43
- {
44
- id: '1',
45
- type: 'posts'
46
- },
47
- {
48
- id: '2',
49
- type: 'posts'
50
- }
51
- ]
52
- }
53
- test_relationship(expected, options: { include_data: true })
54
- end
55
-
56
- def test_relationship_data_not_included
57
- test_relationship({}, options: { include_data: false })
58
- end
59
-
60
- def test_relationship_simple_link
61
- links = { self: 'a link' }
62
- test_relationship({ links: { self: 'a link' } }, links: links)
63
- end
64
-
65
- def test_relationship_many_links
66
- links = {
67
- self: 'a link',
68
- related: 'another link'
69
- }
70
- expected = {
71
- links: {
72
- self: 'a link',
73
- related: 'another link'
74
- }
75
- }
76
- test_relationship(expected, links: links)
77
- end
78
-
79
- def test_relationship_block_link
80
- links = { self: proc { object.id.to_s } }
81
- expected = { links: { self: @blog.id.to_s } }
82
- test_relationship(expected, links: links)
83
- end
84
-
85
- def test_relationship_block_link_with_meta
86
- links = {
87
- self: proc do
88
- href object.id.to_s
89
- meta(id: object.id)
90
- end
91
- }
92
- expected = {
93
- links: {
94
- self: {
95
- href: @blog.id.to_s,
96
- meta: { id: @blog.id }
97
- }
98
- }
99
- }
100
- test_relationship(expected, links: links)
101
- end
102
-
103
- def test_relationship_simple_meta
104
- meta = { id: '1' }
105
- expected = { meta: meta }
106
- test_relationship(expected, meta: meta)
107
- end
108
-
109
- def test_relationship_block_meta
110
- meta = proc do
111
- { id: object.id }
112
- end
113
- expected = {
114
- meta: {
115
- id: @blog.id
116
- }
117
- }
118
- test_relationship(expected, meta: meta)
119
- end
120
-
121
- def test_relationship_with_everything
122
- links = {
123
- self: 'a link',
124
- related: proc do
125
- href object.id.to_s
126
- meta object.id
127
- end
128
-
129
- }
130
- meta = proc do
131
- { id: object.id }
132
- end
133
- expected = {
134
- data: {
135
- id: '1',
136
- type: 'blogs'
137
- },
138
- links: {
139
- self: 'a link',
140
- related: {
141
- href: '1', meta: 1
142
- }
143
- },
144
- meta: {
145
- id: @blog.id
146
- }
147
- }
148
- test_relationship(expected, meta: meta, options: { include_data: true }, links: links)
149
- end
150
-
151
- private
152
-
153
- def test_relationship(expected, params = {})
154
- parent_serializer = AuthorSerializer.new(@author)
155
- relationship = Relationship.new(parent_serializer, @serializer, nil, params)
156
- assert_equal(expected, relationship.as_json)
157
- end
158
- end
159
- end
160
- end
161
- end
@@ -1,199 +0,0 @@
1
- require 'test_helper'
2
-
3
- module ActiveModel
4
- class Serializer
5
- module Adapter
6
- class JsonApi
7
- class RelationshipTest < ActiveSupport::TestCase
8
- RelationshipAuthor = Class.new(::Model)
9
- class RelationshipAuthorSerializer < ActiveModel::Serializer
10
- has_one :bio do
11
- link :self, '//example.com/link_author/relationships/bio'
12
- end
13
-
14
- has_one :profile do
15
- link :related do
16
- "//example.com/profiles/#{object.profile.id}"
17
- end
18
- end
19
-
20
- has_many :locations do
21
- link :related do
22
- ids = object.locations.map(&:id).join(',')
23
- href "//example.com/locations/#{ids}"
24
- end
25
- end
26
-
27
- has_many :posts do
28
- link :related do
29
- ids = object.posts.map(&:id).join(',')
30
- href "//example.com/posts/#{ids}"
31
- meta ids: ids
32
- end
33
- end
34
-
35
- has_many :comments do
36
- link :self do
37
- meta ids: [1]
38
- end
39
- end
40
-
41
- has_many :roles do |serializer|
42
- meta count: object.posts.count
43
- serializer.cached_roles
44
- end
45
-
46
- has_one :blog do
47
- link :self, '//example.com/link_author/relationships/blog'
48
- include_data false
49
- end
50
-
51
- belongs_to :reviewer do
52
- meta name: 'Dan Brown'
53
- include_data true
54
- end
55
-
56
- has_many :likes do
57
- link :related do
58
- ids = object.likes.map(&:id).join(',')
59
- href "//example.com/likes/#{ids}"
60
- meta ids: ids
61
- end
62
- meta liked: object.likes.any?
63
- end
64
-
65
- def cached_roles
66
- [
67
- Role.new(id: 'from-serializer-method')
68
- ]
69
- end
70
- end
71
-
72
- def setup
73
- @post = Post.new(id: 1337, comments: [], author: nil)
74
- @blog = Blog.new(id: 1337, name: 'extra')
75
- @bio = Bio.new(id: 1337)
76
- @like = Like.new(id: 1337)
77
- @role = Role.new(id: 'from-record')
78
- @profile = Profile.new(id: 1337)
79
- @location = Location.new(id: 1337)
80
- @reviewer = Author.new(id: 1337)
81
- @comment = Comment.new(id: 1337)
82
- @author = RelationshipAuthor.new(
83
- id: 1337,
84
- posts: [@post],
85
- blog: @blog,
86
- reviewer: @reviewer,
87
- bio: @bio,
88
- likes: [@like],
89
- roles: [@role],
90
- locations: [@location],
91
- profile: @profile,
92
- comments: [@comment]
93
- )
94
- end
95
-
96
- def test_relationship_simple_link
97
- expected = {
98
- data: {
99
- id: '1337',
100
- type: 'bios'
101
- },
102
- links: {
103
- self: '//example.com/link_author/relationships/bio'
104
- }
105
- }
106
- assert_relationship(:bio, expected)
107
- end
108
-
109
- def test_relationship_block_link
110
- expected = {
111
- data: { id: '1337', type: 'profiles' },
112
- links: { related: '//example.com/profiles/1337' }
113
- }
114
- assert_relationship(:profile, expected)
115
- end
116
-
117
- def test_relationship_block_link_href
118
- expected = {
119
- data: [{ id: '1337', type: 'locations' }],
120
- links: {
121
- related: { href: '//example.com/locations/1337' }
122
- }
123
- }
124
- assert_relationship(:locations, expected)
125
- end
126
-
127
- def test_relationship_block_link_href_and_meta
128
- expected = {
129
- data: [{ id: '1337', type: 'posts' }],
130
- links: {
131
- related: {
132
- href: '//example.com/posts/1337',
133
- meta: { ids: '1337' }
134
- }
135
- }
136
- }
137
- assert_relationship(:posts, expected)
138
- end
139
-
140
- def test_relationship_block_link_meta
141
- expected = {
142
- data: [{ id: '1337', type: 'comments' }],
143
- links: {
144
- self: {
145
- meta: { ids: [1] }
146
- }
147
- }
148
- }
149
- assert_relationship(:comments, expected)
150
- end
151
-
152
- def test_relationship_meta
153
- expected = {
154
- data: [{ id: 'from-serializer-method', type: 'roles' }],
155
- meta: { count: 1 }
156
- }
157
- assert_relationship(:roles, expected)
158
- end
159
-
160
- def test_relationship_not_including_data
161
- expected = {
162
- links: { self: '//example.com/link_author/relationships/blog' }
163
- }
164
- assert_relationship(:blog, expected)
165
- end
166
-
167
- def test_relationship_including_data_explicit
168
- expected = {
169
- data: { id: '1337', type: 'authors' },
170
- meta: { name: 'Dan Brown' }
171
- }
172
- assert_relationship(:reviewer, expected)
173
- end
174
-
175
- def test_relationship_with_everything
176
- expected = {
177
- data: [{ id: '1337', type: 'likes' }],
178
- links: {
179
- related: {
180
- href: '//example.com/likes/1337',
181
- meta: { ids: '1337' }
182
- }
183
- },
184
- meta: { liked: true }
185
- }
186
- assert_relationship(:likes, expected)
187
- end
188
-
189
- private
190
-
191
- def assert_relationship(relationship_name, expected)
192
- hash = serializable(@author, adapter: :json_api).serializable_hash
193
- assert_equal(expected, hash[:data][:relationships][relationship_name])
194
- end
195
- end
196
- end
197
- end
198
- end
199
- end