cheap_ams 0.10.0.rc2

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 (97) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +22 -0
  3. data/.travis.yml +26 -0
  4. data/CHANGELOG.md +13 -0
  5. data/CONTRIBUTING.md +31 -0
  6. data/Gemfile +35 -0
  7. data/LICENSE.txt +22 -0
  8. data/README.md +348 -0
  9. data/Rakefile +12 -0
  10. data/appveyor.yml +25 -0
  11. data/cheap_ams.gemspec +49 -0
  12. data/docs/README.md +27 -0
  13. data/docs/general/adapters.md +51 -0
  14. data/docs/general/getting_started.md +73 -0
  15. data/docs/howto/add_pagination_links.md +112 -0
  16. data/docs/howto/add_root_key.md +51 -0
  17. data/lib/action_controller/serialization.rb +62 -0
  18. data/lib/active_model/serializable_resource.rb +84 -0
  19. data/lib/active_model/serializer/adapter/flatten_json.rb +19 -0
  20. data/lib/active_model/serializer/adapter/fragment_cache.rb +82 -0
  21. data/lib/active_model/serializer/adapter/json/fragment_cache.rb +16 -0
  22. data/lib/active_model/serializer/adapter/json.rb +53 -0
  23. data/lib/active_model/serializer/adapter/json_api/fragment_cache.rb +24 -0
  24. data/lib/active_model/serializer/adapter/json_api/pagination_links.rb +58 -0
  25. data/lib/active_model/serializer/adapter/json_api.rb +183 -0
  26. data/lib/active_model/serializer/adapter/null.rb +11 -0
  27. data/lib/active_model/serializer/adapter.rb +98 -0
  28. data/lib/active_model/serializer/array_serializer.rb +35 -0
  29. data/lib/active_model/serializer/association.rb +21 -0
  30. data/lib/active_model/serializer/associations.rb +97 -0
  31. data/lib/active_model/serializer/belongs_to_reflection.rb +10 -0
  32. data/lib/active_model/serializer/collection_reflection.rb +7 -0
  33. data/lib/active_model/serializer/configuration.rb +14 -0
  34. data/lib/active_model/serializer/fieldset.rb +42 -0
  35. data/lib/active_model/serializer/has_many_reflection.rb +10 -0
  36. data/lib/active_model/serializer/has_one_reflection.rb +10 -0
  37. data/lib/active_model/serializer/lint.rb +131 -0
  38. data/lib/active_model/serializer/railtie.rb +9 -0
  39. data/lib/active_model/serializer/reflection.rb +74 -0
  40. data/lib/active_model/serializer/singular_reflection.rb +7 -0
  41. data/lib/active_model/serializer/version.rb +5 -0
  42. data/lib/active_model/serializer.rb +205 -0
  43. data/lib/active_model_serializers.rb +29 -0
  44. data/lib/generators/serializer/USAGE +6 -0
  45. data/lib/generators/serializer/resource_override.rb +12 -0
  46. data/lib/generators/serializer/serializer_generator.rb +37 -0
  47. data/lib/generators/serializer/templates/serializer.rb +8 -0
  48. data/test/action_controller/adapter_selector_test.rb +53 -0
  49. data/test/action_controller/explicit_serializer_test.rb +134 -0
  50. data/test/action_controller/json_api/linked_test.rb +180 -0
  51. data/test/action_controller/json_api/pagination_test.rb +116 -0
  52. data/test/action_controller/serialization_scope_name_test.rb +67 -0
  53. data/test/action_controller/serialization_test.rb +426 -0
  54. data/test/adapter/fragment_cache_test.rb +37 -0
  55. data/test/adapter/json/belongs_to_test.rb +47 -0
  56. data/test/adapter/json/collection_test.rb +82 -0
  57. data/test/adapter/json/has_many_test.rb +47 -0
  58. data/test/adapter/json_api/belongs_to_test.rb +157 -0
  59. data/test/adapter/json_api/collection_test.rb +96 -0
  60. data/test/adapter/json_api/has_many_embed_ids_test.rb +45 -0
  61. data/test/adapter/json_api/has_many_explicit_serializer_test.rb +98 -0
  62. data/test/adapter/json_api/has_many_test.rb +145 -0
  63. data/test/adapter/json_api/has_one_test.rb +81 -0
  64. data/test/adapter/json_api/json_api_test.rb +38 -0
  65. data/test/adapter/json_api/linked_test.rb +283 -0
  66. data/test/adapter/json_api/pagination_links_test.rb +115 -0
  67. data/test/adapter/json_api/resource_type_config_test.rb +59 -0
  68. data/test/adapter/json_test.rb +47 -0
  69. data/test/adapter/null_test.rb +25 -0
  70. data/test/adapter_test.rb +52 -0
  71. data/test/array_serializer_test.rb +97 -0
  72. data/test/capture_warnings.rb +57 -0
  73. data/test/fixtures/active_record.rb +57 -0
  74. data/test/fixtures/poro.rb +266 -0
  75. data/test/generators/scaffold_controller_generator_test.rb +24 -0
  76. data/test/generators/serializer_generator_test.rb +56 -0
  77. data/test/lint_test.rb +44 -0
  78. data/test/poro_test.rb +9 -0
  79. data/test/serializable_resource_test.rb +27 -0
  80. data/test/serializers/adapter_for_test.rb +50 -0
  81. data/test/serializers/association_macros_test.rb +36 -0
  82. data/test/serializers/associations_test.rb +150 -0
  83. data/test/serializers/attribute_test.rb +62 -0
  84. data/test/serializers/attributes_test.rb +63 -0
  85. data/test/serializers/cache_test.rb +164 -0
  86. data/test/serializers/configuration_test.rb +15 -0
  87. data/test/serializers/fieldset_test.rb +26 -0
  88. data/test/serializers/meta_test.rb +121 -0
  89. data/test/serializers/options_test.rb +21 -0
  90. data/test/serializers/root_test.rb +23 -0
  91. data/test/serializers/serializer_for_test.rb +65 -0
  92. data/test/serializers/urls_test.rb +26 -0
  93. data/test/support/rails_app.rb +21 -0
  94. data/test/support/stream_capture.rb +49 -0
  95. data/test/support/test_case.rb +5 -0
  96. data/test/test_helper.rb +41 -0
  97. metadata +287 -0
@@ -0,0 +1,283 @@
1
+ require 'test_helper'
2
+ module ActiveModel
3
+ class Serializer
4
+ class Adapter
5
+ class JsonApi
6
+ class LinkedTest < Minitest::Test
7
+ def setup
8
+ ActionController::Base.cache_store.clear
9
+ @author1 = Author.new(id: 1, name: 'Steve K.')
10
+ @author2 = Author.new(id: 2, name: 'Tenderlove')
11
+ @bio1 = Bio.new(id: 1, content: 'AMS Contributor')
12
+ @bio2 = Bio.new(id: 2, content: 'Rails Contributor')
13
+ @first_post = Post.new(id: 10, title: 'Hello!!', body: 'Hello, world!!')
14
+ @second_post = Post.new(id: 20, title: 'New Post', body: 'Body')
15
+ @third_post = Post.new(id: 30, title: 'Yet Another Post', body: 'Body')
16
+ @blog = Blog.new({ name: 'AMS Blog' })
17
+ @first_comment = Comment.new(id: 1, body: 'ZOMG A COMMENT')
18
+ @second_comment = Comment.new(id: 2, body: 'ZOMG ANOTHER COMMENT')
19
+ @first_post.blog = @blog
20
+ @second_post.blog = @blog
21
+ @third_post.blog = nil
22
+ @first_post.comments = [@first_comment, @second_comment]
23
+ @second_post.comments = []
24
+ @third_post.comments = []
25
+ @first_post.author = @author1
26
+ @second_post.author = @author2
27
+ @third_post.author = @author1
28
+ @first_comment.post = @first_post
29
+ @first_comment.author = nil
30
+ @second_comment.post = @first_post
31
+ @second_comment.author = nil
32
+ @author1.posts = [@first_post, @third_post]
33
+ @author1.bio = @bio1
34
+ @author1.roles = []
35
+ @author2.posts = [@second_post]
36
+ @author2.bio = @bio2
37
+ @author2.roles = []
38
+ @bio1.author = @author1
39
+ @bio2.author = @author2
40
+ end
41
+
42
+ def test_include_multiple_posts_and_linked_array
43
+ serializer = ArraySerializer.new([@first_post, @second_post])
44
+ adapter = ActiveModel::Serializer::Adapter::JsonApi.new(
45
+ serializer,
46
+ include: ['author', 'author.bio', 'comments']
47
+ )
48
+ alt_adapter = ActiveModel::Serializer::Adapter::JsonApi.new(
49
+ serializer,
50
+ include: 'author,author.bio,comments'
51
+ )
52
+
53
+ expected = {
54
+ data: [
55
+ {
56
+ id: "10",
57
+ type: "posts",
58
+ attributes: {
59
+ title: "Hello!!",
60
+ body: "Hello, world!!"
61
+ },
62
+ relationships: {
63
+ comments: { data: [ { type: "comments", id: '1' }, { type: "comments", id: '2' } ] },
64
+ blog: { data: { type: "blogs", id: "999" } },
65
+ author: { data: { type: "authors", id: "1" } }
66
+ }
67
+ },
68
+ {
69
+ id: "20",
70
+ type: "posts",
71
+ attributes: {
72
+ title: "New Post",
73
+ body: "Body"
74
+ },
75
+ relationships: {
76
+ comments: { data: [] },
77
+ blog: { data: { type: "blogs", id: "999" } },
78
+ author: { data: { type: "authors", id: "2" } }
79
+ }
80
+ }
81
+ ],
82
+ included: [
83
+ {
84
+ id: "1",
85
+ type: "comments",
86
+ attributes: {
87
+ body: "ZOMG A COMMENT"
88
+ },
89
+ relationships: {
90
+ post: { data: { type: "posts", id: "10" } },
91
+ author: { data: nil }
92
+ }
93
+ }, {
94
+ id: "2",
95
+ type: "comments",
96
+ attributes: {
97
+ body: "ZOMG ANOTHER COMMENT",
98
+ },
99
+ relationships: {
100
+ post: { data: { type: "posts", id: "10" } },
101
+ author: { data: nil }
102
+ }
103
+ }, {
104
+ id: "1",
105
+ type: "authors",
106
+ attributes: {
107
+ name: "Steve K."
108
+ },
109
+ relationships: {
110
+ posts: { data: [ { type: "posts", id: "10" }, { type: "posts", id: "30" } ] },
111
+ roles: { data: [] },
112
+ bio: { data: { type: "bios", id: "1" } }
113
+ }
114
+ }, {
115
+ id: "1",
116
+ type: "bios",
117
+ attributes: {
118
+ content: "AMS Contributor",
119
+ rating: nil
120
+ },
121
+ relationships: {
122
+ author: { data: { type: "authors", id: "1" } }
123
+ }
124
+ }, {
125
+ id: "2",
126
+ type: "authors",
127
+ attributes: {
128
+ name: "Tenderlove"
129
+ },
130
+ relationships: {
131
+ posts: { data: [ { type: "posts", id:"20" } ] },
132
+ roles: { data: [] },
133
+ bio: { data: { type: "bios", id: "2" } }
134
+ }
135
+ }, {
136
+ id: "2",
137
+ type: "bios",
138
+ attributes: {
139
+ rating: nil,
140
+ content: "Rails Contributor",
141
+ },
142
+ relationships: {
143
+ author: { data: { type: "authors", id: "2" } }
144
+ }
145
+ }
146
+ ]
147
+ }
148
+ assert_equal expected, adapter.serializable_hash
149
+ assert_equal expected, alt_adapter.serializable_hash
150
+ end
151
+
152
+ def test_include_multiple_posts_and_linked
153
+ serializer = BioSerializer.new @bio1
154
+ adapter = ActiveModel::Serializer::Adapter::JsonApi.new(
155
+ serializer,
156
+ include: ['author', 'author.posts']
157
+ )
158
+ alt_adapter = ActiveModel::Serializer::Adapter::JsonApi.new(
159
+ serializer,
160
+ include: 'author,author.posts'
161
+ )
162
+
163
+ expected = [
164
+ {
165
+ id: "1",
166
+ type: "authors",
167
+ attributes: {
168
+ name: "Steve K."
169
+ },
170
+ relationships: {
171
+ posts: { data: [ { type: "posts", id: "10"}, { type: "posts", id: "30" }] },
172
+ roles: { data: [] },
173
+ bio: { data: { type: "bios", id: "1" }}
174
+ }
175
+ }, {
176
+ id: "10",
177
+ type: "posts",
178
+ attributes: {
179
+ title: "Hello!!",
180
+ body: "Hello, world!!"
181
+ },
182
+ relationships: {
183
+ comments: { data: [ { type: "comments", id: "1"}, { type: "comments", id: "2" }] },
184
+ blog: { data: { type: "blogs", id: "999" } },
185
+ author: { data: { type: "authors", id: "1" } }
186
+ }
187
+ }, {
188
+ id: "30",
189
+ type: "posts",
190
+ attributes: {
191
+ title: "Yet Another Post",
192
+ body: "Body"
193
+ },
194
+ relationships: {
195
+ comments: { data: [] },
196
+ blog: { data: { type: "blogs", id: "999" } },
197
+ author: { data: { type: "authors", id: "1" } }
198
+ }
199
+ }
200
+ ]
201
+
202
+ assert_equal expected, adapter.serializable_hash[:included]
203
+ assert_equal expected, alt_adapter.serializable_hash[:included]
204
+ end
205
+
206
+ def test_underscore_model_namespace_for_linked_resource_type
207
+ spammy_post = Post.new(id: 123)
208
+ spammy_post.related = [Spam::UnrelatedLink.new(id: 456)]
209
+ serializer = SpammyPostSerializer.new(spammy_post)
210
+ adapter = ActiveModel::Serializer::Adapter::JsonApi.new(serializer)
211
+ relationships = adapter.serializable_hash[:data][:relationships]
212
+ expected = {
213
+ related: {
214
+ data: [{
215
+ type: 'spam_unrelated_links',
216
+ id: '456'
217
+ }]
218
+ }
219
+ }
220
+ assert_equal expected, relationships
221
+ end
222
+
223
+ def test_multiple_references_to_same_resource
224
+ serializer = ArraySerializer.new([@first_comment, @second_comment])
225
+ adapter = ActiveModel::Serializer::Adapter::JsonApi.new(
226
+ serializer,
227
+ include: ['post']
228
+ )
229
+
230
+ expected = [
231
+ {
232
+ id: "10",
233
+ type: "posts",
234
+ attributes: {
235
+ title: "Hello!!",
236
+ body: "Hello, world!!"
237
+ },
238
+ relationships: {
239
+ comments: {
240
+ data: [{type: "comments", id: "1"}, {type: "comments", id: "2"}]
241
+ },
242
+ blog: {
243
+ data: {type: "blogs", id: "999"}
244
+ },
245
+ author: {
246
+ data: {type: "authors", id: "1"}
247
+ }
248
+ }
249
+ }
250
+ ]
251
+
252
+ assert_equal expected, adapter.serializable_hash[:included]
253
+ end
254
+
255
+ def test_nil_link_with_specified_serializer
256
+ @first_post.author = nil
257
+ serializer = PostPreviewSerializer.new(@first_post)
258
+ adapter = ActiveModel::Serializer::Adapter::JsonApi.new(
259
+ serializer,
260
+ include: ['author']
261
+ )
262
+
263
+ expected = {
264
+ data: {
265
+ id: "10",
266
+ type: "posts",
267
+ attributes: {
268
+ title: "Hello!!",
269
+ body: "Hello, world!!"
270
+ },
271
+ relationships: {
272
+ comments: { data: [ { type: "comments", id: '1' }, { type: "comments", id: '2' } ] },
273
+ author: { data: nil }
274
+ }
275
+ }
276
+ }
277
+ assert_equal expected, adapter.serializable_hash
278
+ end
279
+ end
280
+ end
281
+ end
282
+ end
283
+ end
@@ -0,0 +1,115 @@
1
+ require 'test_helper'
2
+ require 'will_paginate/array'
3
+ require 'kaminari'
4
+ require 'kaminari/hooks'
5
+ ::Kaminari::Hooks.init
6
+
7
+ module ActiveModel
8
+ class Serializer
9
+ class Adapter
10
+ class JsonApi
11
+ class PaginationLinksTest < Minitest::Test
12
+ URI = 'http://example.com'
13
+
14
+ def setup
15
+ ActionController::Base.cache_store.clear
16
+ @array = [
17
+ Profile.new({ id: 1, name: 'Name 1', description: 'Description 1', comments: 'Comments 1' }),
18
+ Profile.new({ id: 2, name: 'Name 2', description: 'Description 2', comments: 'Comments 2' }),
19
+ Profile.new({ id: 3, name: 'Name 3', description: 'Description 3', comments: 'Comments 3' })
20
+ ]
21
+ end
22
+
23
+ def mock_request(query_parameters={}, original_url=URI)
24
+ context = Minitest::Mock.new
25
+ context.expect(:original_url, original_url )
26
+ context.expect(:query_parameters, query_parameters)
27
+ @options = {}
28
+ @options[:context] = context
29
+ end
30
+
31
+ def load_adapter(paginated_collection, options = {})
32
+ options = options.merge(adapter: :json_api)
33
+ ActiveModel::SerializableResource.new(paginated_collection, options)
34
+ end
35
+
36
+ def using_kaminari
37
+ Kaminari.paginate_array(@array).page(2).per(1)
38
+ end
39
+
40
+ def using_will_paginate
41
+ @array.paginate(page: 2, per_page: 1)
42
+ end
43
+
44
+ def data
45
+ { data:[
46
+ { id:"1", type:"profiles", attributes:{name:"Name 1", description:"Description 1" } },
47
+ { id:"2", type:"profiles", attributes:{name:"Name 2", description:"Description 2" } },
48
+ { id:"3", type:"profiles", attributes:{name:"Name 3", description:"Description 3" } }
49
+ ]
50
+ }
51
+ end
52
+
53
+ def links
54
+ {
55
+ links:{
56
+ self: "#{URI}?page%5Bnumber%5D=2&page%5Bsize%5D=1",
57
+ first: "#{URI}?page%5Bnumber%5D=1&page%5Bsize%5D=1",
58
+ prev: "#{URI}?page%5Bnumber%5D=1&page%5Bsize%5D=1",
59
+ next: "#{URI}?page%5Bnumber%5D=3&page%5Bsize%5D=1",
60
+ last: "#{URI}?page%5Bnumber%5D=3&page%5Bsize%5D=1"
61
+ }
62
+ }
63
+ end
64
+
65
+ def expected_response_without_pagination_links
66
+ data
67
+ end
68
+
69
+ def expected_response_with_pagination_links
70
+ {}.tap do |hash|
71
+ hash[:data] = [data.values.flatten.second]
72
+ hash.merge! links
73
+ end
74
+ end
75
+
76
+ def expected_response_with_pagination_links_and_additional_params
77
+ new_links = links[:links].each_with_object({}) {|(key, value), hash| hash[key] = "#{value}&test=test" }
78
+ {}.tap do |hash|
79
+ hash[:data] = [data.values.flatten.second]
80
+ hash.merge! links: new_links
81
+ end
82
+ end
83
+
84
+ def test_pagination_links_using_kaminari
85
+ adapter = load_adapter(using_kaminari)
86
+
87
+ mock_request
88
+ assert_equal expected_response_with_pagination_links, adapter.serializable_hash(@options)
89
+ end
90
+
91
+ def test_pagination_links_using_will_paginate
92
+ adapter = load_adapter(using_will_paginate)
93
+
94
+ mock_request
95
+ assert_equal expected_response_with_pagination_links, adapter.serializable_hash(@options)
96
+ end
97
+
98
+ def test_pagination_links_with_additional_params
99
+ adapter = load_adapter(using_will_paginate)
100
+
101
+ mock_request({ test: 'test' })
102
+ assert_equal expected_response_with_pagination_links_and_additional_params,
103
+ adapter.serializable_hash(@options)
104
+ end
105
+
106
+ def test_not_showing_pagination_links
107
+ adapter = load_adapter(@array)
108
+
109
+ assert_equal expected_response_without_pagination_links, adapter.serializable_hash
110
+ end
111
+ end
112
+ end
113
+ end
114
+ end
115
+ end
@@ -0,0 +1,59 @@
1
+ require 'test_helper'
2
+
3
+ module ActiveModel
4
+ class Serializer
5
+ class Adapter
6
+ class JsonApi
7
+ class ResourceTypeConfigTest < Minitest::Test
8
+ def setup
9
+ @author = Author.new(id: 1, name: 'Steve K.')
10
+ @author.bio = nil
11
+ @author.roles = []
12
+ @blog = Blog.new(id: 23, name: 'AMS Blog')
13
+ @post = Post.new(id: 42, title: 'New Post', body: 'Body')
14
+ @anonymous_post = Post.new(id: 43, title: 'Hello!!', body: 'Hello, world!!')
15
+ @comment = Comment.new(id: 1, body: 'ZOMG A COMMENT')
16
+ @post.comments = [@comment]
17
+ @post.blog = @blog
18
+ @anonymous_post.comments = []
19
+ @anonymous_post.blog = nil
20
+ @comment.post = @post
21
+ @comment.author = nil
22
+ @post.author = @author
23
+ @anonymous_post.author = nil
24
+ @blog = Blog.new(id: 1, name: "My Blog!!")
25
+ @blog.writer = @author
26
+ @blog.articles = [@post, @anonymous_post]
27
+ @author.posts = []
28
+ end
29
+
30
+ def with_jsonapi_resource_type type
31
+ old_type = ActiveModel::Serializer.config[:jsonapi_resource_type]
32
+ ActiveModel::Serializer.config[:jsonapi_resource_type] = type
33
+ yield
34
+ ensure
35
+ ActiveModel::Serializer.config[:jsonapi_resource_type] = old_type
36
+ end
37
+
38
+ def test_config_plural
39
+ with_jsonapi_resource_type :plural do
40
+ serializer = CommentSerializer.new(@comment)
41
+ adapter = ActiveModel::Serializer::Adapter::JsonApi.new(serializer)
42
+ ActionController::Base.cache_store.clear
43
+ assert_equal('comments', adapter.serializable_hash[:data][:type])
44
+ end
45
+ end
46
+
47
+ def test_config_singular
48
+ with_jsonapi_resource_type :singular do
49
+ serializer = CommentSerializer.new(@comment)
50
+ adapter = ActiveModel::Serializer::Adapter::JsonApi.new(serializer)
51
+ ActionController::Base.cache_store.clear
52
+ assert_equal('comment', adapter.serializable_hash[:data][:type])
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,47 @@
1
+ require 'test_helper'
2
+
3
+ module ActiveModel
4
+ class Serializer
5
+ class Adapter
6
+ class JsonTest < Minitest::Test
7
+ def setup
8
+ ActionController::Base.cache_store.clear
9
+ @author = Author.new(id: 1, name: 'Steve K.')
10
+ @post = Post.new(id: 1, title: 'New Post', body: 'Body')
11
+ @first_comment = Comment.new(id: 1, body: 'ZOMG A COMMENT')
12
+ @second_comment = Comment.new(id: 2, body: 'ZOMG ANOTHER COMMENT')
13
+ @post.comments = [@first_comment, @second_comment]
14
+ @first_comment.post = @post
15
+ @second_comment.post = @post
16
+ @post.author = @author
17
+ @blog = Blog.new(id: 1, name: "My Blog!!")
18
+ @post.blog = @blog
19
+
20
+ @serializer = PostSerializer.new(@post)
21
+ @adapter = ActiveModel::Serializer::Adapter::Json.new(@serializer)
22
+ end
23
+
24
+ def test_has_many
25
+ assert_equal([
26
+ {id: 1, body: 'ZOMG A COMMENT'},
27
+ {id: 2, body: 'ZOMG ANOTHER COMMENT'}
28
+ ], @adapter.serializable_hash[:post][:comments])
29
+ end
30
+
31
+ def test_custom_keys
32
+ serializer = PostWithCustomKeysSerializer.new(@post)
33
+ adapter = ActiveModel::Serializer::Adapter::Json.new(serializer)
34
+
35
+ assert_equal({
36
+ id: 1,
37
+ reviews: [{id: 1, body: "ZOMG A COMMENT"},
38
+ {id: 2, body: "ZOMG ANOTHER COMMENT"}
39
+ ],
40
+ writer: {id: 1, name: "Steve K."},
41
+ site: {id: 1, name: "My Blog!!"}
42
+ }, adapter.serializable_hash[:post])
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,25 @@
1
+ require 'test_helper'
2
+
3
+ module ActiveModel
4
+ class Serializer
5
+ class Adapter
6
+ class NullTest < Minitest::Test
7
+ def setup
8
+ profile = Profile.new({ name: 'Name 1', description: 'Description 1', comments: 'Comments 1' })
9
+ serializer = ProfileSerializer.new(profile)
10
+
11
+ @adapter = Null.new(serializer)
12
+ end
13
+
14
+ def test_serializable_hash
15
+ assert_equal({}, @adapter.serializable_hash)
16
+ end
17
+
18
+ def test_it_returns_empty_json
19
+ assert_equal('{}', @adapter.to_json)
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+
@@ -0,0 +1,52 @@
1
+ require 'test_helper'
2
+
3
+ module ActiveModel
4
+ class Serializer
5
+ class AdapterTest < Minitest::Test
6
+ def setup
7
+ profile = Profile.new
8
+ @serializer = ProfileSerializer.new(profile)
9
+ @adapter = ActiveModel::Serializer::Adapter.new(@serializer)
10
+ end
11
+
12
+ def test_serializable_hash_is_abstract_method
13
+ assert_raises(NotImplementedError) do
14
+ @adapter.serializable_hash(only: [:name])
15
+ end
16
+ end
17
+
18
+ def test_serializer
19
+ assert_equal @serializer, @adapter.serializer
20
+ end
21
+
22
+ def test_adapter_class_for_known_adapter
23
+ klass = ActiveModel::Serializer::Adapter.adapter_class(:json_api)
24
+ assert_equal ActiveModel::Serializer::Adapter::JsonApi, klass
25
+ end
26
+
27
+ def test_adapter_class_for_unknown_adapter
28
+ klass = ActiveModel::Serializer::Adapter.adapter_class(:json_simple)
29
+ assert_nil klass
30
+ end
31
+
32
+ def test_create_adapter
33
+ adapter = ActiveModel::Serializer::Adapter.create(@serializer)
34
+ assert_equal ActiveModel::Serializer::Adapter::FlattenJson, adapter.class
35
+ end
36
+
37
+ def test_create_adapter_with_override
38
+ adapter = ActiveModel::Serializer::Adapter.create(@serializer, { adapter: :json_api})
39
+ assert_equal ActiveModel::Serializer::Adapter::JsonApi, adapter.class
40
+ end
41
+
42
+ def test_inflected_adapter_class_for_known_adapter
43
+ ActiveSupport::Inflector.inflections(:en){|inflect| inflect.acronym 'API' }
44
+ klass = ActiveModel::Serializer::Adapter.adapter_class(:json_api)
45
+
46
+ ActiveSupport::Inflector.inflections.acronyms.clear
47
+
48
+ assert_equal ActiveModel::Serializer::Adapter::JsonApi, klass
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,97 @@
1
+ require 'test_helper'
2
+
3
+ module ActiveModel
4
+ class Serializer
5
+ class ArraySerializerTest < Minitest::Test
6
+ def setup
7
+ @comment = Comment.new
8
+ @post = Post.new
9
+ @resource = build_named_collection @comment, @post
10
+ @serializer = ArraySerializer.new(@resource, {some: :options})
11
+ end
12
+
13
+ def build_named_collection(*resource)
14
+ resource.define_singleton_method(:name){ 'MeResource' }
15
+ resource
16
+ end
17
+
18
+ def test_respond_to_each
19
+ assert_respond_to @serializer, :each
20
+ end
21
+
22
+ def test_each_object_should_be_serialized_with_appropriate_serializer
23
+ serializers = @serializer.to_a
24
+
25
+ assert_kind_of CommentSerializer, serializers.first
26
+ assert_kind_of Comment, serializers.first.object
27
+
28
+ assert_kind_of PostSerializer, serializers.last
29
+ assert_kind_of Post, serializers.last.object
30
+
31
+ assert_equal serializers.last.custom_options[:some], :options
32
+ end
33
+
34
+ def test_serializer_option_not_passed_to_each_serializer
35
+ serializers = ArraySerializer.new([@post], {serializer: PostSerializer}).to_a
36
+
37
+ refute serializers.first.custom_options.key?(:serializer)
38
+ end
39
+
40
+ def test_meta_and_meta_key_attr_readers
41
+ meta_content = {meta: "the meta", meta_key: "the meta key"}
42
+ @serializer = ArraySerializer.new([@comment, @post], meta_content)
43
+
44
+ assert_equal @serializer.meta, "the meta"
45
+ assert_equal @serializer.meta_key, "the meta key"
46
+ end
47
+
48
+ def test_root_default
49
+ @serializer = ArraySerializer.new([@comment, @post])
50
+ assert_equal @serializer.root, nil
51
+ end
52
+
53
+ def test_root
54
+ expected = 'custom_root'
55
+ @serializer = ArraySerializer.new([@comment, @post], root: expected)
56
+ assert_equal @serializer.root, expected
57
+ end
58
+
59
+ def test_root_with_no_serializers
60
+ expected = 'custom_root'
61
+ @serializer = ArraySerializer.new([], root: expected)
62
+ assert_equal @serializer.root, expected
63
+ end
64
+
65
+ def test_json_key
66
+ assert_equal @serializer.json_key, 'comments'
67
+ end
68
+
69
+ def test_json_key_with_resource_with_name_and_no_serializers
70
+ serializer = ArraySerializer.new(build_named_collection)
71
+ assert_equal serializer.json_key, 'me_resources'
72
+ end
73
+
74
+ def test_json_key_with_resource_with_nil_name_and_no_serializers
75
+ resource = []
76
+ resource.define_singleton_method(:name){ nil }
77
+ serializer = ArraySerializer.new(resource)
78
+ assert_equal serializer.json_key, nil
79
+ end
80
+
81
+ def test_json_key_with_resource_without_name_and_no_serializers
82
+ serializer = ArraySerializer.new([])
83
+ assert_equal serializer.json_key, nil
84
+ end
85
+
86
+ def test_json_key_with_root
87
+ serializer = ArraySerializer.new(@resource, root: 'custom_root')
88
+ assert_equal serializer.json_key, 'custom_roots'
89
+ end
90
+
91
+ def test_json_key_with_root_and_no_serializers
92
+ serializer = ArraySerializer.new(build_named_collection, root: 'custom_root')
93
+ assert_equal serializer.json_key, 'custom_roots'
94
+ end
95
+ end
96
+ end
97
+ end