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,110 @@
1
+ require 'test_helper'
2
+
3
+ module ActiveModelSerializers
4
+ module Adapter
5
+ class JsonApi
6
+ class LinksTest < ActiveSupport::TestCase
7
+ class LinkAuthor < ::Model; associations :posts end
8
+ class LinkAuthorSerializer < ActiveModel::Serializer
9
+ link :self do
10
+ href "http://example.com/link_author/#{object.id}"
11
+ meta stuff: 'value'
12
+ end
13
+ link(:author) { link_author_url(object.id) }
14
+ link(:link_authors) { url_for(controller: 'link_authors', action: 'index', only_path: false) }
15
+ link(:posts) { link_author_posts_url(object.id) }
16
+ link :resource, 'http://example.com/resource'
17
+ link :yet_another do
18
+ "http://example.com/resource/#{object.id}"
19
+ end
20
+ link :conditional1, if: -> { instance_truth } do
21
+ "http://example.com/conditional1/#{object.id}"
22
+ end
23
+ link :conditional2, if: :instance_falsey do
24
+ "http://example.com/conditional2/#{object.id}"
25
+ end
26
+ link(:nil) { nil }
27
+
28
+ def instance_truth
29
+ true
30
+ end
31
+
32
+ def instance_falsey
33
+ false
34
+ end
35
+ end
36
+
37
+ def setup
38
+ Rails.application.routes.draw do
39
+ resources :link_authors do
40
+ resources :posts
41
+ end
42
+ end
43
+ @post = Post.new(id: 1337, comments: [], author: nil)
44
+ @author = LinkAuthor.new(id: 1337, posts: [@post])
45
+ end
46
+
47
+ def test_toplevel_links
48
+ hash = ActiveModelSerializers::SerializableResource.new(
49
+ @post,
50
+ adapter: :json_api,
51
+ links: {
52
+ self: {
53
+ href: 'http://example.com/posts',
54
+ meta: {
55
+ stuff: 'value'
56
+ }
57
+ }
58
+ }
59
+ ).serializable_hash
60
+ expected = {
61
+ self: {
62
+ href: 'http://example.com/posts',
63
+ meta: {
64
+ stuff: 'value'
65
+ }
66
+ }
67
+ }
68
+ assert_equal(expected, hash[:links])
69
+ end
70
+
71
+ def test_nil_toplevel_links
72
+ hash = ActiveModelSerializers::SerializableResource.new(
73
+ @post,
74
+ adapter: :json_api,
75
+ links: nil
76
+ ).serializable_hash
77
+ refute hash.key?(:links), 'No links key to be output'
78
+ end
79
+
80
+ def test_nil_toplevel_links_json_adapter
81
+ hash = ActiveModelSerializers::SerializableResource.new(
82
+ @post,
83
+ adapter: :json,
84
+ links: nil
85
+ ).serializable_hash
86
+ refute hash.key?(:links), 'No links key to be output'
87
+ end
88
+
89
+ def test_resource_links
90
+ hash = serializable(@author, adapter: :json_api).serializable_hash
91
+ expected = {
92
+ self: {
93
+ href: 'http://example.com/link_author/1337',
94
+ meta: {
95
+ stuff: 'value'
96
+ }
97
+ },
98
+ author: 'http://example.com/link_authors/1337',
99
+ :"link-authors" => 'http://example.com/link_authors',
100
+ resource: 'http://example.com/resource',
101
+ posts: 'http://example.com/link_authors/1337/posts',
102
+ :"yet-another" => 'http://example.com/resource/1337',
103
+ conditional1: 'http://example.com/conditional1/1337'
104
+ }
105
+ assert_equal(expected, hash[:data][:links])
106
+ end
107
+ end
108
+ end
109
+ end
110
+ end
@@ -0,0 +1,206 @@
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
+ {
47
+ data: [
48
+ { id: '1', type: 'profiles', attributes: { name: 'Name 1', description: 'Description 1' } },
49
+ { id: '2', type: 'profiles', attributes: { name: 'Name 2', description: 'Description 2' } },
50
+ { id: '3', type: 'profiles', attributes: { name: 'Name 3', description: 'Description 3' } },
51
+ { id: '4', type: 'profiles', attributes: { name: 'Name 4', description: 'Description 4' } },
52
+ { id: '5', type: 'profiles', attributes: { name: 'Name 5', description: 'Description 5' } }
53
+ ]
54
+ }
55
+ end
56
+
57
+ def empty_collection_links
58
+ {
59
+ self: "#{URI}?page%5Bnumber%5D=1&page%5Bsize%5D=2",
60
+ first: "#{URI}?page%5Bnumber%5D=1&page%5Bsize%5D=2",
61
+ prev: nil,
62
+ next: nil,
63
+ last: "#{URI}?page%5Bnumber%5D=1&page%5Bsize%5D=2"
64
+ }
65
+ end
66
+
67
+ def links
68
+ {
69
+ links: {
70
+ self: "#{URI}?page%5Bnumber%5D=2&page%5Bsize%5D=2",
71
+ first: "#{URI}?page%5Bnumber%5D=1&page%5Bsize%5D=2",
72
+ prev: "#{URI}?page%5Bnumber%5D=1&page%5Bsize%5D=2",
73
+ next: "#{URI}?page%5Bnumber%5D=3&page%5Bsize%5D=2",
74
+ last: "#{URI}?page%5Bnumber%5D=3&page%5Bsize%5D=2"
75
+ }
76
+ }
77
+ end
78
+
79
+ def last_page_links
80
+ {
81
+ links: {
82
+ self: "#{URI}?page%5Bnumber%5D=3&page%5Bsize%5D=2",
83
+ first: "#{URI}?page%5Bnumber%5D=1&page%5Bsize%5D=2",
84
+ prev: "#{URI}?page%5Bnumber%5D=2&page%5Bsize%5D=2",
85
+ next: nil,
86
+ last: "#{URI}?page%5Bnumber%5D=3&page%5Bsize%5D=2"
87
+ }
88
+ }
89
+ end
90
+
91
+ def expected_response_when_unpaginatable
92
+ data
93
+ end
94
+
95
+ def expected_response_with_pagination_links
96
+ {}.tap do |hash|
97
+ hash[:data] = data.values.flatten[2..3]
98
+ hash.merge! links
99
+ end
100
+ end
101
+
102
+ def expected_response_without_pagination_links
103
+ {}.tap do |hash|
104
+ hash[:data] = data.values.flatten[2..3]
105
+ end
106
+ end
107
+
108
+ def expected_response_with_pagination_links_and_additional_params
109
+ new_links = links[:links].each_with_object({}) { |(key, value), hash| hash[key] = "#{value}&test=test" }
110
+ {}.tap do |hash|
111
+ hash[:data] = data.values.flatten[2..3]
112
+ hash.merge! links: new_links
113
+ end
114
+ end
115
+
116
+ def expected_response_with_last_page_pagination_links
117
+ {}.tap do |hash|
118
+ hash[:data] = [data.values.flatten.last]
119
+ hash.merge! last_page_links
120
+ end
121
+ end
122
+
123
+ def expected_response_with_empty_collection_pagination_links
124
+ {}.tap do |hash|
125
+ hash[:data] = []
126
+ hash.merge! links: empty_collection_links
127
+ end
128
+ end
129
+
130
+ def test_pagination_links_using_kaminari
131
+ adapter = load_adapter(using_kaminari, mock_request)
132
+
133
+ assert_equal expected_response_with_pagination_links, adapter.serializable_hash
134
+ end
135
+
136
+ def test_pagination_links_using_will_paginate
137
+ adapter = load_adapter(using_will_paginate, mock_request)
138
+
139
+ assert_equal expected_response_with_pagination_links, adapter.serializable_hash
140
+ end
141
+
142
+ def test_pagination_links_with_additional_params
143
+ adapter = load_adapter(using_will_paginate, mock_request(test: 'test'))
144
+
145
+ assert_equal expected_response_with_pagination_links_and_additional_params,
146
+ adapter.serializable_hash
147
+ end
148
+
149
+ def test_pagination_links_when_zero_results_kaminari
150
+ @array = []
151
+
152
+ adapter = load_adapter(using_kaminari(1), mock_request)
153
+
154
+ assert_equal expected_response_with_empty_collection_pagination_links, adapter.serializable_hash
155
+ end
156
+
157
+ def test_pagination_links_when_zero_results_will_paginate
158
+ @array = []
159
+
160
+ adapter = load_adapter(using_will_paginate(1), mock_request)
161
+
162
+ assert_equal expected_response_with_empty_collection_pagination_links, adapter.serializable_hash
163
+ end
164
+
165
+ def test_last_page_pagination_links_using_kaminari
166
+ adapter = load_adapter(using_kaminari(3), mock_request)
167
+
168
+ assert_equal expected_response_with_last_page_pagination_links, adapter.serializable_hash
169
+ end
170
+
171
+ def test_last_page_pagination_links_using_will_paginate
172
+ adapter = load_adapter(using_will_paginate(3), mock_request)
173
+
174
+ assert_equal expected_response_with_last_page_pagination_links, adapter.serializable_hash
175
+ end
176
+
177
+ def test_not_showing_pagination_links
178
+ adapter = load_adapter(@array, mock_request)
179
+
180
+ assert_equal expected_response_when_unpaginatable, adapter.serializable_hash
181
+ end
182
+
183
+ def test_raises_descriptive_error_when_serialization_context_unset
184
+ render_options = { adapter: :json_api }
185
+ adapter = serializable(using_kaminari, render_options)
186
+ exception_class = ActiveModelSerializers::Adapter::JsonApi::PaginationLinks::MissingSerializationContextError
187
+
188
+ exception = assert_raises(exception_class) do
189
+ adapter.as_json
190
+ end
191
+ assert_equal exception_class, exception.class
192
+ assert_match(/CollectionSerializer#paginated\?/, exception.message)
193
+ end
194
+
195
+ def test_pagination_links_not_present_when_disabled
196
+ ActiveModel::Serializer.config.jsonapi_pagination_links_enabled = false
197
+ adapter = load_adapter(using_kaminari, mock_request)
198
+
199
+ assert_equal expected_response_without_pagination_links, adapter.serializable_hash
200
+ ensure
201
+ ActiveModel::Serializer.config.jsonapi_pagination_links_enabled = true
202
+ end
203
+ end
204
+ end
205
+ end
206
+ end
@@ -0,0 +1,137 @@
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: 'Person',
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