active_model_serializers 0.10.7 → 0.10.12

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 (213) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +62 -1
  3. data/README.md +20 -20
  4. data/lib/action_controller/serialization.rb +11 -1
  5. data/lib/active_model/serializable_resource.rb +2 -0
  6. data/lib/active_model/serializer.rb +33 -18
  7. data/lib/active_model/serializer/adapter.rb +2 -0
  8. data/lib/active_model/serializer/adapter/attributes.rb +2 -0
  9. data/lib/active_model/serializer/adapter/base.rb +2 -0
  10. data/lib/active_model/serializer/adapter/json.rb +2 -0
  11. data/lib/active_model/serializer/adapter/json_api.rb +2 -0
  12. data/lib/active_model/serializer/adapter/null.rb +2 -0
  13. data/lib/active_model/serializer/array_serializer.rb +2 -0
  14. data/lib/active_model/serializer/association.rb +2 -0
  15. data/lib/active_model/serializer/attribute.rb +2 -0
  16. data/lib/active_model/serializer/belongs_to_reflection.rb +2 -0
  17. data/lib/active_model/serializer/collection_serializer.rb +6 -6
  18. data/lib/active_model/serializer/concerns/caching.rb +7 -2
  19. data/lib/active_model/serializer/error_serializer.rb +2 -0
  20. data/lib/active_model/serializer/errors_serializer.rb +2 -0
  21. data/lib/active_model/serializer/field.rb +2 -0
  22. data/lib/active_model/serializer/fieldset.rb +3 -1
  23. data/lib/active_model/serializer/has_many_reflection.rb +2 -0
  24. data/lib/active_model/serializer/has_one_reflection.rb +2 -0
  25. data/lib/active_model/serializer/lazy_association.rb +6 -2
  26. data/lib/active_model/serializer/link.rb +23 -0
  27. data/lib/active_model/serializer/lint.rb +2 -0
  28. data/lib/active_model/serializer/null.rb +2 -0
  29. data/lib/active_model/serializer/reflection.rb +9 -4
  30. data/lib/active_model/serializer/version.rb +3 -1
  31. data/lib/active_model_serializers.rb +20 -10
  32. data/lib/active_model_serializers/adapter.rb +3 -1
  33. data/lib/active_model_serializers/adapter/attributes.rb +23 -0
  34. data/lib/active_model_serializers/adapter/base.rb +2 -0
  35. data/lib/active_model_serializers/adapter/json.rb +2 -0
  36. data/lib/active_model_serializers/adapter/json_api.rb +14 -9
  37. data/lib/active_model_serializers/adapter/json_api/deserialization.rb +2 -0
  38. data/lib/active_model_serializers/adapter/json_api/error.rb +2 -0
  39. data/lib/active_model_serializers/adapter/json_api/jsonapi.rb +2 -0
  40. data/lib/active_model_serializers/adapter/json_api/link.rb +2 -0
  41. data/lib/active_model_serializers/adapter/json_api/meta.rb +2 -0
  42. data/lib/active_model_serializers/adapter/json_api/pagination_links.rb +2 -0
  43. data/lib/active_model_serializers/adapter/json_api/relationship.rb +2 -0
  44. data/lib/active_model_serializers/adapter/json_api/resource_identifier.rb +3 -1
  45. data/lib/active_model_serializers/adapter/null.rb +2 -0
  46. data/lib/active_model_serializers/callbacks.rb +2 -0
  47. data/lib/active_model_serializers/deprecate.rb +2 -0
  48. data/lib/active_model_serializers/deserialization.rb +2 -0
  49. data/lib/active_model_serializers/json_pointer.rb +2 -0
  50. data/lib/active_model_serializers/logging.rb +2 -0
  51. data/lib/active_model_serializers/lookup_chain.rb +2 -0
  52. data/lib/active_model_serializers/model.rb +2 -0
  53. data/lib/active_model_serializers/model/caching.rb +25 -0
  54. data/lib/active_model_serializers/railtie.rb +4 -0
  55. data/lib/active_model_serializers/register_jsonapi_renderer.rb +2 -0
  56. data/lib/active_model_serializers/serializable_resource.rb +4 -2
  57. data/lib/active_model_serializers/serialization_context.rb +2 -0
  58. data/lib/active_model_serializers/test.rb +2 -0
  59. data/lib/active_model_serializers/test/schema.rb +2 -0
  60. data/lib/active_model_serializers/test/serializer.rb +2 -0
  61. data/lib/generators/rails/resource_override.rb +2 -0
  62. data/lib/generators/rails/serializer_generator.rb +2 -0
  63. data/lib/grape/active_model_serializers.rb +2 -0
  64. data/lib/grape/formatters/active_model_serializers.rb +2 -0
  65. data/lib/grape/helpers/active_model_serializers.rb +2 -0
  66. data/lib/tasks/rubocop.rake +2 -0
  67. metadata +70 -295
  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 -105
  72. data/.simplecov +0 -110
  73. data/.travis.yml +0 -52
  74. data/CODE_OF_CONDUCT.md +0 -74
  75. data/CONTRIBUTING.md +0 -105
  76. data/Gemfile +0 -72
  77. data/Rakefile +0 -74
  78. data/active_model_serializers.gemspec +0 -63
  79. data/appveyor.yml +0 -28
  80. data/bin/bench +0 -171
  81. data/bin/bench_regression +0 -316
  82. data/bin/rubocop +0 -38
  83. data/bin/serve_benchmark +0 -39
  84. data/docs/README.md +0 -41
  85. data/docs/STYLE.md +0 -58
  86. data/docs/general/adapters.md +0 -269
  87. data/docs/general/caching.md +0 -58
  88. data/docs/general/configuration_options.md +0 -185
  89. data/docs/general/deserialization.md +0 -100
  90. data/docs/general/fields.md +0 -31
  91. data/docs/general/getting_started.md +0 -133
  92. data/docs/general/instrumentation.md +0 -40
  93. data/docs/general/key_transforms.md +0 -40
  94. data/docs/general/logging.md +0 -21
  95. data/docs/general/rendering.md +0 -293
  96. data/docs/general/serializers.md +0 -483
  97. data/docs/how-open-source-maintained.jpg +0 -0
  98. data/docs/howto/add_pagination_links.md +0 -138
  99. data/docs/howto/add_relationship_links.md +0 -140
  100. data/docs/howto/add_root_key.md +0 -62
  101. data/docs/howto/grape_integration.md +0 -42
  102. data/docs/howto/outside_controller_use.md +0 -66
  103. data/docs/howto/passing_arbitrary_options.md +0 -27
  104. data/docs/howto/serialize_poro.md +0 -73
  105. data/docs/howto/test.md +0 -154
  106. data/docs/howto/upgrade_from_0_8_to_0_10.md +0 -265
  107. data/docs/integrations/ember-and-json-api.md +0 -147
  108. data/docs/integrations/grape.md +0 -19
  109. data/docs/jsonapi/errors.md +0 -56
  110. data/docs/jsonapi/schema.md +0 -151
  111. data/docs/jsonapi/schema/schema.json +0 -366
  112. data/docs/rfcs/0000-namespace.md +0 -106
  113. data/docs/rfcs/template.md +0 -15
  114. data/test/action_controller/adapter_selector_test.rb +0 -62
  115. data/test/action_controller/explicit_serializer_test.rb +0 -135
  116. data/test/action_controller/json/include_test.rb +0 -246
  117. data/test/action_controller/json_api/deserialization_test.rb +0 -112
  118. data/test/action_controller/json_api/errors_test.rb +0 -40
  119. data/test/action_controller/json_api/fields_test.rb +0 -66
  120. data/test/action_controller/json_api/linked_test.rb +0 -202
  121. data/test/action_controller/json_api/pagination_test.rb +0 -124
  122. data/test/action_controller/json_api/transform_test.rb +0 -189
  123. data/test/action_controller/lookup_proc_test.rb +0 -49
  124. data/test/action_controller/namespace_lookup_test.rb +0 -232
  125. data/test/action_controller/serialization_scope_name_test.rb +0 -235
  126. data/test/action_controller/serialization_test.rb +0 -472
  127. data/test/active_model_serializers/adapter_for_test.rb +0 -208
  128. data/test/active_model_serializers/json_pointer_test.rb +0 -22
  129. data/test/active_model_serializers/logging_test.rb +0 -77
  130. data/test/active_model_serializers/model_test.rb +0 -142
  131. data/test/active_model_serializers/railtie_test_isolated.rb +0 -68
  132. data/test/active_model_serializers/register_jsonapi_renderer_test_isolated.rb +0 -161
  133. data/test/active_model_serializers/serialization_context_test_isolated.rb +0 -71
  134. data/test/active_model_serializers/test/schema_test.rb +0 -131
  135. data/test/active_model_serializers/test/serializer_test.rb +0 -62
  136. data/test/active_record_test.rb +0 -9
  137. data/test/adapter/attributes_test.rb +0 -40
  138. data/test/adapter/deprecation_test.rb +0 -100
  139. data/test/adapter/json/belongs_to_test.rb +0 -45
  140. data/test/adapter/json/collection_test.rb +0 -104
  141. data/test/adapter/json/has_many_test.rb +0 -53
  142. data/test/adapter/json/transform_test.rb +0 -93
  143. data/test/adapter/json_api/belongs_to_test.rb +0 -155
  144. data/test/adapter/json_api/collection_test.rb +0 -96
  145. data/test/adapter/json_api/errors_test.rb +0 -76
  146. data/test/adapter/json_api/fields_test.rb +0 -96
  147. data/test/adapter/json_api/has_many_explicit_serializer_test.rb +0 -96
  148. data/test/adapter/json_api/has_many_test.rb +0 -173
  149. data/test/adapter/json_api/has_one_test.rb +0 -80
  150. data/test/adapter/json_api/include_data_if_sideloaded_test.rb +0 -213
  151. data/test/adapter/json_api/json_api_test.rb +0 -33
  152. data/test/adapter/json_api/linked_test.rb +0 -413
  153. data/test/adapter/json_api/links_test.rb +0 -95
  154. data/test/adapter/json_api/pagination_links_test.rb +0 -206
  155. data/test/adapter/json_api/parse_test.rb +0 -137
  156. data/test/adapter/json_api/relationship_test.rb +0 -397
  157. data/test/adapter/json_api/resource_meta_test.rb +0 -100
  158. data/test/adapter/json_api/toplevel_jsonapi_test.rb +0 -82
  159. data/test/adapter/json_api/transform_test.rb +0 -512
  160. data/test/adapter/json_api/type_test.rb +0 -193
  161. data/test/adapter/json_test.rb +0 -46
  162. data/test/adapter/null_test.rb +0 -22
  163. data/test/adapter/polymorphic_test.rb +0 -218
  164. data/test/adapter_test.rb +0 -67
  165. data/test/array_serializer_test.rb +0 -22
  166. data/test/benchmark/app.rb +0 -65
  167. data/test/benchmark/benchmarking_support.rb +0 -67
  168. data/test/benchmark/bm_active_record.rb +0 -81
  169. data/test/benchmark/bm_adapter.rb +0 -38
  170. data/test/benchmark/bm_caching.rb +0 -119
  171. data/test/benchmark/bm_lookup_chain.rb +0 -83
  172. data/test/benchmark/bm_transform.rb +0 -45
  173. data/test/benchmark/config.ru +0 -3
  174. data/test/benchmark/controllers.rb +0 -83
  175. data/test/benchmark/fixtures.rb +0 -219
  176. data/test/cache_test.rb +0 -651
  177. data/test/collection_serializer_test.rb +0 -127
  178. data/test/fixtures/active_record.rb +0 -113
  179. data/test/fixtures/poro.rb +0 -225
  180. data/test/generators/scaffold_controller_generator_test.rb +0 -24
  181. data/test/generators/serializer_generator_test.rb +0 -75
  182. data/test/grape_test.rb +0 -196
  183. data/test/lint_test.rb +0 -49
  184. data/test/logger_test.rb +0 -20
  185. data/test/poro_test.rb +0 -9
  186. data/test/serializable_resource_test.rb +0 -79
  187. data/test/serializers/association_macros_test.rb +0 -37
  188. data/test/serializers/associations_test.rb +0 -468
  189. data/test/serializers/attribute_test.rb +0 -153
  190. data/test/serializers/attributes_test.rb +0 -52
  191. data/test/serializers/caching_configuration_test_isolated.rb +0 -170
  192. data/test/serializers/configuration_test.rb +0 -32
  193. data/test/serializers/fieldset_test.rb +0 -14
  194. data/test/serializers/meta_test.rb +0 -202
  195. data/test/serializers/options_test.rb +0 -32
  196. data/test/serializers/read_attribute_for_serialization_test.rb +0 -79
  197. data/test/serializers/reflection_test.rb +0 -427
  198. data/test/serializers/root_test.rb +0 -21
  199. data/test/serializers/serialization_test.rb +0 -55
  200. data/test/serializers/serializer_for_test.rb +0 -136
  201. data/test/serializers/serializer_for_with_namespace_test.rb +0 -88
  202. data/test/support/custom_schemas/active_model_serializers/test/schema_test/my/index.json +0 -6
  203. data/test/support/isolated_unit.rb +0 -84
  204. data/test/support/rails5_shims.rb +0 -53
  205. data/test/support/rails_app.rb +0 -38
  206. data/test/support/schemas/active_model_serializers/test/schema_test/my/index.json +0 -6
  207. data/test/support/schemas/active_model_serializers/test/schema_test/my/show.json +0 -6
  208. data/test/support/schemas/custom/show.json +0 -7
  209. data/test/support/schemas/hyper_schema.json +0 -93
  210. data/test/support/schemas/render_using_json_api.json +0 -43
  211. data/test/support/schemas/simple_json_pointers.json +0 -10
  212. data/test/support/serialization_testing.rb +0 -79
  213. data/test/test_helper.rb +0 -70
@@ -1,173 +0,0 @@
1
- require 'test_helper'
2
-
3
- module ActiveModelSerializers
4
- module Adapter
5
- class JsonApi
6
- class HasManyTest < ActiveSupport::TestCase
7
- class ModelWithoutSerializer < ::Model
8
- attributes :id, :name
9
- end
10
-
11
- def setup
12
- ActionController::Base.cache_store.clear
13
- @author = Author.new(id: 1, name: 'Steve K.')
14
- @author.posts = []
15
- @author.bio = nil
16
- @post = Post.new(id: 1, title: 'New Post', body: 'Body')
17
- @post_without_comments = Post.new(id: 2, title: 'Second Post', body: 'Second')
18
- @first_comment = Comment.new(id: 1, body: 'ZOMG A COMMENT')
19
- @first_comment.author = nil
20
- @second_comment = Comment.new(id: 2, body: 'ZOMG ANOTHER COMMENT')
21
- @second_comment.author = nil
22
- @post.comments = [@first_comment, @second_comment]
23
- @post_without_comments.comments = []
24
- @first_comment.post = @post
25
- @second_comment.post = @post
26
- @post.author = @author
27
- @post_without_comments.author = nil
28
- @blog = Blog.new(id: 1, name: 'My Blog!!')
29
- @blog.writer = @author
30
- @blog.articles = [@post]
31
- @post.blog = @blog
32
- @post_without_comments.blog = nil
33
- @tag = ModelWithoutSerializer.new(id: 1, name: '#hash_tag')
34
- @post.tags = [@tag]
35
- @serializer = PostSerializer.new(@post)
36
- @adapter = ActiveModelSerializers::Adapter::JsonApi.new(@serializer)
37
-
38
- @virtual_value = VirtualValue.new(id: 1)
39
- end
40
-
41
- def test_includes_comment_ids
42
- expected = { data: [{ type: 'comments', id: '1' }, { type: 'comments', id: '2' }] }
43
-
44
- assert_equal(expected, @adapter.serializable_hash[:data][:relationships][:comments])
45
- end
46
-
47
- test 'relationships can be whitelisted via fields' do
48
- @adapter = ActiveModelSerializers::Adapter::JsonApi.new(@serializer, fields: { posts: [:author] })
49
- result = @adapter.serializable_hash
50
- expected = {
51
- data: {
52
- id: '1',
53
- type: 'posts',
54
- relationships: {
55
- author: {
56
- data: {
57
- id: '1',
58
- type: 'authors'
59
- }
60
- }
61
- }
62
- }
63
- }
64
-
65
- assert_equal expected, result
66
- end
67
-
68
- def test_includes_linked_comments
69
- @adapter = ActiveModelSerializers::Adapter::JsonApi.new(@serializer, include: [:comments])
70
- expected = [{
71
- id: '1',
72
- type: 'comments',
73
- attributes: {
74
- body: 'ZOMG A COMMENT'
75
- },
76
- relationships: {
77
- post: { data: { type: 'posts', id: '1' } },
78
- author: { data: nil }
79
- }
80
- }, {
81
- id: '2',
82
- type: 'comments',
83
- attributes: {
84
- body: 'ZOMG ANOTHER COMMENT'
85
- },
86
- relationships: {
87
- post: { data: { type: 'posts', id: '1' } },
88
- author: { data: nil }
89
- }
90
- }]
91
- assert_equal expected, @adapter.serializable_hash[:included]
92
- end
93
-
94
- def test_limit_fields_of_linked_comments
95
- @adapter = ActiveModelSerializers::Adapter::JsonApi.new(@serializer, include: [:comments], fields: { comment: [:id, :post, :author] })
96
- expected = [{
97
- id: '1',
98
- type: 'comments',
99
- relationships: {
100
- post: { data: { type: 'posts', id: '1' } },
101
- author: { data: nil }
102
- }
103
- }, {
104
- id: '2',
105
- type: 'comments',
106
- relationships: {
107
- post: { data: { type: 'posts', id: '1' } },
108
- author: { data: nil }
109
- }
110
- }]
111
- assert_equal expected, @adapter.serializable_hash[:included]
112
- end
113
-
114
- def test_no_include_linked_if_comments_is_empty
115
- serializer = PostSerializer.new(@post_without_comments)
116
- adapter = ActiveModelSerializers::Adapter::JsonApi.new(serializer)
117
-
118
- assert_nil adapter.serializable_hash[:linked]
119
- end
120
-
121
- def test_include_type_for_association_when_different_than_name
122
- serializer = BlogSerializer.new(@blog)
123
- adapter = ActiveModelSerializers::Adapter::JsonApi.new(serializer)
124
- actual = adapter.serializable_hash[:data][:relationships][:articles]
125
-
126
- expected = {
127
- data: [{
128
- type: 'posts',
129
- id: '1'
130
- }]
131
- }
132
- assert_equal expected, actual
133
- end
134
-
135
- def test_has_many_with_no_serializer
136
- post_serializer_class = Class.new(ActiveModel::Serializer) do
137
- attributes :id
138
- has_many :tags
139
- end
140
- serializer = post_serializer_class.new(@post)
141
- adapter = ActiveModelSerializers::Adapter::JsonApi.new(serializer)
142
-
143
- assert_equal({
144
- data: {
145
- id: '1',
146
- type: 'posts',
147
- relationships: {
148
- tags: { data: [@tag.as_json] }
149
- }
150
- }
151
- }, adapter.serializable_hash)
152
- end
153
-
154
- def test_has_many_with_virtual_value
155
- serializer = VirtualValueSerializer.new(@virtual_value)
156
- adapter = ActiveModelSerializers::Adapter::JsonApi.new(serializer)
157
-
158
- assert_equal({
159
- data: {
160
- id: '1',
161
- type: 'virtual-values',
162
- relationships: {
163
- maker: { data: { type: 'makers', id: '1' } },
164
- reviews: { data: [{ type: 'reviews', id: '1' },
165
- { type: 'reviews', id: '2' }] }
166
- }
167
- }
168
- }, adapter.serializable_hash)
169
- end
170
- end
171
- end
172
- end
173
- end
@@ -1,80 +0,0 @@
1
- require 'test_helper'
2
-
3
- module ActiveModelSerializers
4
- module Adapter
5
- class JsonApi
6
- class HasOneTest < ActiveSupport::TestCase
7
- def setup
8
- @author = Author.new(id: 1, name: 'Steve K.')
9
- @bio = Bio.new(id: 43, content: 'AMS Contributor')
10
- @author.bio = @bio
11
- @bio.author = @author
12
- @post = Post.new(id: 42, title: 'New Post', body: 'Body')
13
- @anonymous_post = Post.new(id: 43, title: 'Hello!!', body: 'Hello, world!!')
14
- @comment = Comment.new(id: 1, body: 'ZOMG A COMMENT')
15
- @post.comments = [@comment]
16
- @anonymous_post.comments = []
17
- @comment.post = @post
18
- @comment.author = nil
19
- @post.author = @author
20
- @anonymous_post.author = nil
21
- @blog = Blog.new(id: 1, name: 'My Blog!!')
22
- @blog.writer = @author
23
- @blog.articles = [@post, @anonymous_post]
24
- @author.posts = []
25
- @author.roles = []
26
-
27
- @virtual_value = VirtualValue.new(id: 1)
28
-
29
- @serializer = AuthorSerializer.new(@author)
30
- @adapter = ActiveModelSerializers::Adapter::JsonApi.new(@serializer, include: [:bio, :posts])
31
- end
32
-
33
- def test_includes_bio_id
34
- expected = { data: { type: 'bios', id: '43' } }
35
-
36
- assert_equal(expected, @adapter.serializable_hash[:data][:relationships][:bio])
37
- end
38
-
39
- def test_includes_linked_bio
40
- @adapter = ActiveModelSerializers::Adapter::JsonApi.new(@serializer, include: [:bio])
41
-
42
- expected = [
43
- {
44
- id: '43',
45
- type: 'bios',
46
- attributes: {
47
- content: 'AMS Contributor',
48
- rating: nil
49
- },
50
- relationships: {
51
- author: { data: { type: 'authors', id: '1' } }
52
- }
53
- }
54
- ]
55
-
56
- assert_equal(expected, @adapter.serializable_hash[:included])
57
- end
58
-
59
- def test_has_one_with_virtual_value
60
- serializer = VirtualValueSerializer.new(@virtual_value)
61
- adapter = ActiveModelSerializers::Adapter::JsonApi.new(serializer)
62
-
63
- expected = {
64
- data: {
65
- id: '1',
66
- type: 'virtual-values',
67
- relationships: {
68
- maker: { data: { type: 'makers', id: '1' } },
69
- reviews: { data: [{ type: 'reviews', id: '1' },
70
- { type: 'reviews', id: '2' }] }
71
- }
72
- }
73
- }
74
-
75
- assert_equal(expected, adapter.serializable_hash)
76
- end
77
- end
78
- end
79
- end
80
- end
@@ -1,213 +0,0 @@
1
- require 'test_helper'
2
-
3
- module ActiveModel
4
- class Serializer
5
- module Adapter
6
- class JsonApi
7
- class IncludeParamTest < ActiveSupport::TestCase
8
- IncludeParamAuthor = Class.new(::Model) do
9
- associations :tags, :posts, :roles
10
- end
11
-
12
- class CustomCommentLoader
13
- def all
14
- [{ foo: 'bar' }]
15
- end
16
- end
17
- class Tag < ::Model
18
- attributes :id, :name
19
- end
20
-
21
- class TagSerializer < ActiveModel::Serializer
22
- type 'tags'
23
- attributes :id, :name
24
- end
25
-
26
- class PostWithTagsSerializer < ActiveModel::Serializer
27
- type 'posts'
28
- attributes :id
29
- has_many :tags
30
- end
31
-
32
- class IncludeParamAuthorSerializer < ActiveModel::Serializer
33
- class_attribute :comment_loader
34
-
35
- has_many :tags, serializer: TagSerializer do
36
- link :self, '//example.com/link_author/relationships/tags'
37
- include_data :if_sideloaded
38
- end
39
-
40
- has_many :unlinked_tags, serializer: TagSerializer do
41
- include_data :if_sideloaded
42
- end
43
-
44
- has_many :posts, serializer: PostWithTagsSerializer do
45
- include_data :if_sideloaded
46
- end
47
- has_many :locations do
48
- include_data :if_sideloaded
49
- end
50
- has_many :comments do
51
- include_data :if_sideloaded
52
- IncludeParamAuthorSerializer.comment_loader.all
53
- end
54
- has_many :roles, key: :granted_roles do
55
- include_data :if_sideloaded
56
- end
57
- end
58
-
59
- def setup
60
- IncludeParamAuthorSerializer.comment_loader = Class.new(CustomCommentLoader).new
61
- @tag = Tag.new(id: 1337, name: 'mytag')
62
- @role = Role.new(id: 1337, name: 'myrole')
63
- @author = IncludeParamAuthor.new(
64
- id: 1337,
65
- tags: [@tag],
66
- roles: [@role]
67
- )
68
- end
69
-
70
- def test_relationship_not_loaded_when_not_included
71
- expected = {
72
- links: {
73
- self: '//example.com/link_author/relationships/tags'
74
- }
75
- }
76
-
77
- @author.define_singleton_method(:read_attribute_for_serialization) do |attr|
78
- fail 'should not be called' if attr == :tags
79
- super(attr)
80
- end
81
-
82
- assert_relationship(:tags, expected)
83
- end
84
-
85
- def test_relationship_included
86
- expected = {
87
- data: [
88
- {
89
- id: '1337',
90
- type: 'tags'
91
- }
92
- ],
93
- links: {
94
- self: '//example.com/link_author/relationships/tags'
95
- }
96
- }
97
-
98
- assert_relationship(:tags, expected, include: :tags)
99
- end
100
-
101
- def test_sideloads_included
102
- expected = [
103
- {
104
- id: '1337',
105
- type: 'tags',
106
- attributes: { name: 'mytag' }
107
- }
108
- ]
109
- hash = result(include: :tags)
110
- assert_equal(expected, hash[:included])
111
- end
112
-
113
- def test_sideloads_included_when_using_key
114
- expected = [
115
- {
116
- id: '1337',
117
- type: 'roles',
118
- attributes: {
119
- name: 'myrole',
120
- description: nil,
121
- slug: 'myrole-1337'
122
- },
123
- relationships: {
124
- author: { data: nil }
125
- }
126
- }
127
- ]
128
-
129
- hash = result(include: :granted_roles)
130
- assert_equal(expected, hash[:included])
131
- end
132
-
133
- def test_sideloads_not_included_when_using_name_when_key_defined
134
- hash = result(include: :roles)
135
- assert_nil(hash[:included])
136
- end
137
-
138
- def test_nested_relationship
139
- expected = {
140
- data: [
141
- {
142
- id: '1337',
143
- type: 'tags'
144
- }
145
- ],
146
- links: {
147
- self: '//example.com/link_author/relationships/tags'
148
- }
149
- }
150
-
151
- expected_no_data = {
152
- links: {
153
- self: '//example.com/link_author/relationships/tags'
154
- }
155
- }
156
-
157
- assert_relationship(:tags, expected, include: [:tags, { posts: :tags }])
158
-
159
- @author.define_singleton_method(:read_attribute_for_serialization) do |attr|
160
- fail 'should not be called' if attr == :tags
161
- super(attr)
162
- end
163
-
164
- assert_relationship(:tags, expected_no_data, include: { posts: :tags })
165
- end
166
-
167
- def test_include_params_with_no_block
168
- @author.define_singleton_method(:read_attribute_for_serialization) do |attr|
169
- fail 'should not be called' if attr == :locations
170
- super(attr)
171
- end
172
-
173
- expected = { meta: {} }
174
-
175
- assert_relationship(:locations, expected)
176
- end
177
-
178
- def test_block_relationship
179
- expected = {
180
- data: [
181
- { 'foo' => 'bar' }
182
- ]
183
- }
184
-
185
- assert_relationship(:comments, expected, include: [:comments])
186
- end
187
-
188
- def test_node_not_included_when_no_link
189
- expected = { meta: {} }
190
- assert_relationship(:unlinked_tags, expected, key_transform: :unaltered)
191
- end
192
-
193
- private
194
-
195
- def assert_relationship(relationship_name, expected, opts = {})
196
- actual = relationship_data(relationship_name, opts)
197
- assert_equal(expected, actual)
198
- end
199
-
200
- def result(opts)
201
- opts = { adapter: :json_api }.merge(opts)
202
- serializable(@author, opts).serializable_hash
203
- end
204
-
205
- def relationship_data(relationship_name, opts = {})
206
- hash = result(opts)
207
- hash[:data][:relationships][relationship_name]
208
- end
209
- end
210
- end
211
- end
212
- end
213
- end