active_model_serializers 0.10.0 → 0.10.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (72) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +31 -2
  3. data/Gemfile +1 -1
  4. data/README.md +21 -24
  5. data/active_model_serializers.gemspec +4 -8
  6. data/docs/general/adapters.md +4 -2
  7. data/docs/general/configuration_options.md +6 -1
  8. data/docs/general/deserialization.md +1 -1
  9. data/docs/general/serializers.md +30 -3
  10. data/docs/jsonapi/schema.md +1 -1
  11. data/lib/active_model/serializer.rb +54 -11
  12. data/lib/active_model/serializer/adapter/base.rb +2 -0
  13. data/lib/active_model/serializer/associations.rb +4 -5
  14. data/lib/active_model/serializer/belongs_to_reflection.rb +0 -3
  15. data/lib/active_model/serializer/caching.rb +62 -110
  16. data/lib/active_model/serializer/collection_serializer.rb +30 -10
  17. data/lib/active_model/serializer/configuration.rb +1 -0
  18. data/lib/active_model/serializer/has_many_reflection.rb +0 -3
  19. data/lib/active_model/serializer/has_one_reflection.rb +0 -3
  20. data/lib/active_model/serializer/reflection.rb +3 -3
  21. data/lib/active_model/serializer/version.rb +1 -1
  22. data/lib/active_model_serializers.rb +6 -0
  23. data/lib/active_model_serializers/adapter.rb +6 -0
  24. data/lib/active_model_serializers/adapter/attributes.rb +2 -67
  25. data/lib/active_model_serializers/adapter/base.rb +38 -38
  26. data/lib/active_model_serializers/adapter/json_api.rb +36 -28
  27. data/lib/active_model_serializers/adapter/json_api/link.rb +1 -1
  28. data/lib/active_model_serializers/adapter/json_api/pagination_links.rb +8 -1
  29. data/lib/active_model_serializers/deprecate.rb +1 -2
  30. data/lib/active_model_serializers/deserialization.rb +2 -0
  31. data/lib/active_model_serializers/model.rb +2 -0
  32. data/lib/active_model_serializers/railtie.rb +2 -0
  33. data/lib/active_model_serializers/register_jsonapi_renderer.rb +34 -23
  34. data/lib/active_model_serializers/serialization_context.rb +10 -3
  35. data/lib/grape/formatters/active_model_serializers.rb +19 -2
  36. data/lib/grape/helpers/active_model_serializers.rb +1 -0
  37. data/test/action_controller/adapter_selector_test.rb +1 -1
  38. data/test/action_controller/explicit_serializer_test.rb +5 -4
  39. data/test/action_controller/json/include_test.rb +106 -27
  40. data/test/action_controller/json_api/errors_test.rb +2 -2
  41. data/test/action_controller/json_api/linked_test.rb +26 -21
  42. data/test/action_controller/serialization_test.rb +9 -6
  43. data/test/active_model_serializers/register_jsonapi_renderer_test_isolated.rb +143 -0
  44. data/test/active_model_serializers/serialization_context_test_isolated.rb +23 -10
  45. data/test/adapter/json/collection_test.rb +14 -0
  46. data/test/adapter/json_api/collection_test.rb +4 -3
  47. data/test/adapter/json_api/errors_test.rb +13 -15
  48. data/test/adapter/json_api/linked_test.rb +8 -5
  49. data/test/adapter/json_api/links_test.rb +3 -1
  50. data/test/adapter/json_api/pagination_links_test.rb +13 -1
  51. data/test/adapter/json_api/relationships_test.rb +9 -4
  52. data/test/adapter/json_api/resource_identifier_test.rb +7 -2
  53. data/test/adapter/json_api/transform_test.rb +76 -75
  54. data/test/adapter/json_test.rb +4 -3
  55. data/test/benchmark/app.rb +1 -1
  56. data/test/benchmark/bm_caching.rb +14 -14
  57. data/test/benchmark/bm_transform.rb +16 -5
  58. data/test/benchmark/controllers.rb +16 -17
  59. data/test/benchmark/fixtures.rb +72 -72
  60. data/test/cache_test.rb +73 -45
  61. data/test/fixtures/poro.rb +6 -5
  62. data/test/grape_test.rb +96 -2
  63. data/test/serializable_resource_test.rb +12 -12
  64. data/test/serializers/meta_test.rb +12 -6
  65. data/test/support/isolated_unit.rb +1 -0
  66. data/test/support/rails5_shims.rb +8 -2
  67. data/test/support/rails_app.rb +0 -9
  68. metadata +53 -23
  69. data/lib/active_model/serializer/include_tree.rb +0 -111
  70. data/test/include_tree/from_include_args_test.rb +0 -26
  71. data/test/include_tree/from_string_test.rb +0 -94
  72. data/test/include_tree/include_args_to_hash_test.rb +0 -64
@@ -5,13 +5,19 @@ require 'minitest/mock'
5
5
  class SerializationContextTest < ActiveSupport::TestCase
6
6
  include ActiveSupport::Testing::Isolation
7
7
 
8
- def create_request
9
- request = Minitest::Mock.new
10
- request.expect(:original_url, 'original_url')
11
- request.expect(:query_parameters, 'query_parameters')
12
- end
13
-
14
8
  class WithRails < SerializationContextTest
9
+ def create_request
10
+ request = ActionDispatch::Request.new({})
11
+ def request.original_url
12
+ 'http://example.com/articles?page=2'
13
+ end
14
+
15
+ def request.query_parameters
16
+ { 'page' => 2 }
17
+ end
18
+ request
19
+ end
20
+
15
21
  setup do
16
22
  require 'rails'
17
23
  require 'active_model_serializers'
@@ -20,8 +26,8 @@ class SerializationContextTest < ActiveSupport::TestCase
20
26
  end
21
27
 
22
28
  test 'create context with request url and query parameters' do
23
- assert_equal @context.request_url, 'original_url'
24
- assert_equal @context.query_parameters, 'query_parameters'
29
+ assert_equal @context.request_url, 'http://example.com/articles'
30
+ assert_equal @context.query_parameters, 'page' => 2
25
31
  end
26
32
 
27
33
  test 'url_helpers is set up for Rails url_helpers' do
@@ -36,14 +42,21 @@ class SerializationContextTest < ActiveSupport::TestCase
36
42
  end
37
43
 
38
44
  class WithoutRails < SerializationContextTest
45
+ def create_request
46
+ {
47
+ request_url: 'http://example.com/articles',
48
+ query_parameters: { 'page' => 2 }
49
+ }
50
+ end
51
+
39
52
  setup do
40
53
  require 'active_model_serializers/serialization_context'
41
54
  @context = ActiveModelSerializers::SerializationContext.new(create_request)
42
55
  end
43
56
 
44
57
  test 'create context with request url and query parameters' do
45
- assert_equal @context.request_url, 'original_url'
46
- assert_equal @context.query_parameters, 'query_parameters'
58
+ assert_equal @context.request_url, 'http://example.com/articles'
59
+ assert_equal @context.query_parameters, 'page' => 2
47
60
  end
48
61
 
49
62
  test 'url_helpers is a module when Rails is not present' do
@@ -84,6 +84,20 @@ module ActiveModelSerializers
84
84
 
85
85
  assert_equal(expected, actual)
86
86
  end
87
+
88
+ def test_fields_with_no_associations_include_option
89
+ actual = ActiveModelSerializers::SerializableResource.new(
90
+ [@first_post, @second_post], adapter: :json, fields: [:id], include: []
91
+ ).as_json
92
+
93
+ expected = { posts: [{
94
+ id: 1
95
+ }, {
96
+ id: 2
97
+ }] }
98
+
99
+ assert_equal(expected, actual)
100
+ end
87
101
  end
88
102
  end
89
103
  end
@@ -58,9 +58,10 @@ module ActiveModelSerializers
58
58
 
59
59
  def test_limiting_fields
60
60
  actual = ActiveModelSerializers::SerializableResource.new(
61
- [@first_post, @second_post], adapter: :json_api,
62
- fields: { posts: %w(title comments blog author) })
63
- .serializable_hash
61
+ [@first_post, @second_post],
62
+ adapter: :json_api,
63
+ fields: { posts: %w(title comments blog author) }
64
+ ).serializable_hash
64
65
  expected = [
65
66
  {
66
67
  id: '1',
@@ -22,14 +22,13 @@ module ActiveModelSerializers
22
22
  assert_equal serializable_resource.serializer_instance.attributes, {}
23
23
  assert_equal serializable_resource.serializer_instance.object, @resource
24
24
 
25
- expected_errors_object =
26
- { :errors =>
27
- [
28
- {
29
- source: { pointer: '/data/attributes/name' },
30
- detail: 'cannot be nil'
31
- }
32
- ]
25
+ expected_errors_object = {
26
+ :errors => [
27
+ {
28
+ source: { pointer: '/data/attributes/name' },
29
+ detail: 'cannot be nil'
30
+ }
31
+ ]
33
32
  }
34
33
  assert_equal serializable_resource.as_json, expected_errors_object
35
34
  end
@@ -48,13 +47,12 @@ module ActiveModelSerializers
48
47
  assert_equal serializable_resource.serializer_instance.attributes, {}
49
48
  assert_equal serializable_resource.serializer_instance.object, @resource
50
49
 
51
- expected_errors_object =
52
- { :errors =>
53
- [
54
- { :source => { :pointer => '/data/attributes/name' }, :detail => 'cannot be nil' },
55
- { :source => { :pointer => '/data/attributes/name' }, :detail => 'must be longer' },
56
- { :source => { :pointer => '/data/attributes/id' }, :detail => 'must be a uuid' }
57
- ]
50
+ expected_errors_object = {
51
+ :errors => [
52
+ { :source => { :pointer => '/data/attributes/name' }, :detail => 'cannot be nil' },
53
+ { :source => { :pointer => '/data/attributes/name' }, :detail => 'must be longer' },
54
+ { :source => { :pointer => '/data/attributes/id' }, :detail => 'must be a uuid' }
55
+ ]
58
56
  }
59
57
  assert_equal serializable_resource.as_json, expected_errors_object
60
58
  end
@@ -341,9 +341,10 @@ module ActiveModelSerializers
341
341
 
342
342
  def test_no_duplicates_collection
343
343
  hash = ActiveModelSerializers::SerializableResource.new(
344
- [@post1, @post2], adapter: :json_api,
345
- include: '*.*')
346
- .serializable_hash
344
+ [@post1, @post2],
345
+ adapter: :json_api,
346
+ include: '*.*'
347
+ ).serializable_hash
347
348
  expected = [
348
349
  {
349
350
  type: 'authors', id: '1',
@@ -364,7 +365,8 @@ module ActiveModelSerializers
364
365
  hash = ActiveModelSerializers::SerializableResource.new(
365
366
  @nestedpost1,
366
367
  adapter: :json_api,
367
- include: '*').serializable_hash
368
+ include: '*'
369
+ ).serializable_hash
368
370
  expected = [
369
371
  type: 'nested-posts', id: '2',
370
372
  relationships: {
@@ -383,7 +385,8 @@ module ActiveModelSerializers
383
385
  hash = ActiveModelSerializers::SerializableResource.new(
384
386
  [@nestedpost1, @nestedpost2],
385
387
  adapter: :json_api,
386
- include: '*').serializable_hash
388
+ include: '*'
389
+ ).serializable_hash
387
390
  assert_nil(hash[:included])
388
391
  end
389
392
  end
@@ -17,6 +17,7 @@ module ActiveModelSerializers
17
17
  link :yet_another do
18
18
  "http://example.com/resource/#{object.id}"
19
19
  end
20
+ link(:nil) { nil }
20
21
  end
21
22
 
22
23
  def setup
@@ -40,7 +41,8 @@ module ActiveModelSerializers
40
41
  stuff: 'value'
41
42
  }
42
43
  }
43
- }).serializable_hash
44
+ }
45
+ ).serializable_hash
44
46
  expected = {
45
47
  self: {
46
48
  href: 'http://example.com/posts',
@@ -43,7 +43,8 @@ module ActiveModelSerializers
43
43
  end
44
44
 
45
45
  def data
46
- { data: [
46
+ {
47
+ data: [
47
48
  { id: '1', type: 'profiles', attributes: { name: 'Name 1', description: 'Description 1' } },
48
49
  { id: '2', type: 'profiles', attributes: { name: 'Name 2', description: 'Description 2' } },
49
50
  { id: '3', type: 'profiles', attributes: { name: 'Name 3', description: 'Description 3' } },
@@ -160,6 +161,17 @@ module ActiveModelSerializers
160
161
 
161
162
  assert_equal expected_response_without_pagination_links, adapter.serializable_hash
162
163
  end
164
+
165
+ def test_raises_descriptive_error_when_serialization_context_unset
166
+ render_options = { adapter: :json_api }
167
+ adapter = serializable(using_kaminari, render_options)
168
+ exception = assert_raises do
169
+ adapter.as_json
170
+ end
171
+ exception_class = ActiveModelSerializers::Adapter::JsonApi::PaginationLinks::MissingSerializationContextError
172
+ assert_equal exception_class, exception.class
173
+ assert_match(/CollectionSerializer#paginated\?/, exception.message)
174
+ end
163
175
  end
164
176
  end
165
177
  end
@@ -5,7 +5,8 @@ module ActiveModel
5
5
  module Adapter
6
6
  class JsonApi
7
7
  class RelationshipTest < ActiveSupport::TestCase
8
- RelationshipAuthor = Class.new(::Model)
8
+ class RelationshipAuthor < ::Model; end
9
+
9
10
  class RelationshipAuthorSerializer < ActiveModel::Serializer
10
11
  has_one :bio do
11
12
  link :self, '//example.com/link_author/relationships/bio'
@@ -71,7 +72,6 @@ module ActiveModel
71
72
 
72
73
  def setup
73
74
  @post = Post.new(id: 1337, comments: [], author: nil)
74
- @blog = Blog.new(id: 1337, name: 'extra')
75
75
  @bio = Bio.new(id: 1337)
76
76
  @like = Like.new(id: 1337)
77
77
  @role = Role.new(id: 'from-record')
@@ -82,7 +82,6 @@ module ActiveModel
82
82
  @author = RelationshipAuthor.new(
83
83
  id: 1337,
84
84
  posts: [@post],
85
- blog: @blog,
86
85
  reviewer: @reviewer,
87
86
  bio: @bio,
88
87
  likes: [@like],
@@ -158,10 +157,16 @@ module ActiveModel
158
157
  end
159
158
 
160
159
  def test_relationship_not_including_data
160
+ @author.define_singleton_method(:read_attribute_for_serialization) do |attr|
161
+ fail 'should not be called' if attr == :blog
162
+ super(attr)
163
+ end
161
164
  expected = {
162
165
  links: { self: '//example.com/link_author/relationships/blog' }
163
166
  }
164
- assert_relationship(:blog, expected)
167
+ assert_nothing_raised do
168
+ assert_relationship(:blog, expected)
169
+ end
165
170
  end
166
171
 
167
172
  def test_relationship_including_data_explicit
@@ -14,7 +14,13 @@ module ActiveModelSerializers
14
14
  end
15
15
  end
16
16
 
17
- class FragmentedSerializer < ActiveModel::Serializer; end
17
+ class FragmentedSerializer < ActiveModel::Serializer
18
+ cache only: :id
19
+
20
+ def id
21
+ 'special_id'
22
+ end
23
+ end
18
24
 
19
25
  setup do
20
26
  @model = Author.new(id: 1, name: 'Steve K.')
@@ -42,7 +48,6 @@ module ActiveModelSerializers
42
48
  end
43
49
 
44
50
  def test_id_defined_on_fragmented
45
- FragmentedSerializer.fragmented(WithDefinedIdSerializer.new(@model))
46
51
  test_id(FragmentedSerializer, 'special_id')
47
52
  end
48
53
 
@@ -86,7 +86,8 @@ module ActiveModelSerializers
86
86
  data: [
87
87
  { id: '7', type: 'comments' },
88
88
  { id: '12', type: 'comments' }
89
- ] }
89
+ ]
90
+ }
90
91
  },
91
92
  links: {
92
93
  self: 'http://example.com/posts/1337',
@@ -122,7 +123,8 @@ module ActiveModelSerializers
122
123
  data: [
123
124
  { id: '7', type: 'comments' },
124
125
  { id: '12', type: 'comments' }
125
- ] }
126
+ ]
127
+ }
126
128
  },
127
129
  links: {
128
130
  self: 'http://example.com/posts/1337',
@@ -158,7 +160,8 @@ module ActiveModelSerializers
158
160
  Data: [
159
161
  { Id: '7', Type: 'Comments' },
160
162
  { Id: '12', Type: 'Comments' }
161
- ] }
163
+ ]
164
+ }
162
165
  },
163
166
  Links: {
164
167
  Self: 'http://example.com/posts/1337',
@@ -192,7 +195,8 @@ module ActiveModelSerializers
192
195
  data: [
193
196
  { id: '7', type: 'comments' },
194
197
  { id: '12', type: 'comments' }
195
- ] }
198
+ ]
199
+ }
196
200
  },
197
201
  links: {
198
202
  self: 'http://example.com/posts/1337',
@@ -226,7 +230,8 @@ module ActiveModelSerializers
226
230
  data: [
227
231
  { id: '7', type: 'comments' },
228
232
  { id: '12', type: 'comments' }
229
- ] }
233
+ ]
234
+ }
230
235
  },
231
236
  links: {
232
237
  self: 'http://example.com/posts/1337',
@@ -270,7 +275,8 @@ module ActiveModelSerializers
270
275
  Data: [
271
276
  { Id: '7', Type: 'Comments' },
272
277
  { Id: '12', Type: 'Comments' }
273
- ] }
278
+ ]
279
+ }
274
280
  },
275
281
  Links: {
276
282
  Self: 'http://example.com/posts/1337',
@@ -304,7 +310,8 @@ module ActiveModelSerializers
304
310
  data: [
305
311
  { id: '7', type: 'comments' },
306
312
  { id: '12', type: 'comments' }
307
- ] }
313
+ ]
314
+ }
308
315
  },
309
316
  links: {
310
317
  self: 'http://example.com/posts/1337',
@@ -324,18 +331,18 @@ module ActiveModelSerializers
324
331
  serializer = ActiveModel::Serializer::ErrorSerializer.new(resource)
325
332
  adapter = ActiveModelSerializers::Adapter::JsonApi.new(serializer, @options)
326
333
  result = adapter.serializable_hash
327
- expected_errors_object =
328
- { :errors =>
329
- [
330
- {
331
- :source => { :pointer => '/data/attributes/published-at' },
332
- :detail => 'must be in the future' },
333
- {
334
- :source => { :pointer => '/data/attributes/title' },
335
- :detail => 'must be longer'
336
- }
337
- ]
338
- }
334
+ expected_errors_object = {
335
+ :errors => [
336
+ {
337
+ :source => { :pointer => '/data/attributes/published-at' },
338
+ :detail => 'must be in the future'
339
+ },
340
+ {
341
+ :source => { :pointer => '/data/attributes/title' },
342
+ :detail => 'must be longer'
343
+ }
344
+ ]
345
+ }
339
346
  assert_equal expected_errors_object, result
340
347
  end
341
348
 
@@ -349,19 +356,18 @@ module ActiveModelSerializers
349
356
  adapter = ActiveModelSerializers::Adapter::JsonApi.new(serializer, @options)
350
357
  adapter.serializable_hash
351
358
  end
352
- expected_errors_object =
353
- { :Errors =>
354
- [
355
- {
356
- :Source => { :Pointer => '/data/attributes/PublishedAt' },
357
- :Detail => 'must be in the future'
358
- },
359
- {
360
- :Source => { :Pointer => '/data/attributes/Title' },
361
- :Detail => 'must be longer'
362
- }
363
- ]
364
- }
359
+ expected_errors_object = {
360
+ :Errors => [
361
+ {
362
+ :Source => { :Pointer => '/data/attributes/PublishedAt' },
363
+ :Detail => 'must be in the future'
364
+ },
365
+ {
366
+ :Source => { :Pointer => '/data/attributes/Title' },
367
+ :Detail => 'must be longer'
368
+ }
369
+ ]
370
+ }
365
371
  assert_equal expected_errors_object, result
366
372
  end
367
373
 
@@ -375,19 +381,18 @@ module ActiveModelSerializers
375
381
  adapter = ActiveModelSerializers::Adapter::JsonApi.new(serializer, @options)
376
382
  adapter.serializable_hash
377
383
  end
378
- expected_errors_object =
379
- { :Errors =>
380
- [
381
- {
382
- :Source => { :Pointer => '/data/attributes/PublishedAt' },
383
- :Detail => 'must be in the future'
384
- },
385
- {
386
- :Source => { :Pointer => '/data/attributes/Title' },
387
- :Detail => 'must be longer'
388
- }
389
- ]
390
- }
384
+ expected_errors_object = {
385
+ :Errors => [
386
+ {
387
+ :Source => { :Pointer => '/data/attributes/PublishedAt' },
388
+ :Detail => 'must be in the future'
389
+ },
390
+ {
391
+ :Source => { :Pointer => '/data/attributes/Title' },
392
+ :Detail => 'must be longer'
393
+ }
394
+ ]
395
+ }
391
396
  assert_equal expected_errors_object, result
392
397
  end
393
398
 
@@ -402,18 +407,17 @@ module ActiveModelSerializers
402
407
  adapter = ActiveModelSerializers::Adapter::JsonApi.new(serializer, @options)
403
408
  result = adapter.serializable_hash
404
409
 
405
- expected_errors_object =
406
- { :errors =>
407
- [
408
- {
409
- :source => { :pointer => '/data/attributes/published-at' },
410
- :detail => 'must be in the future'
411
- },
412
- {
413
- :source => { :pointer => '/data/attributes/title' },
414
- :detail => 'must be longer'
415
- }
416
- ]
410
+ expected_errors_object = {
411
+ :errors => [
412
+ {
413
+ :source => { :pointer => '/data/attributes/published-at' },
414
+ :detail => 'must be in the future'
415
+ },
416
+ {
417
+ :source => { :pointer => '/data/attributes/title' },
418
+ :detail => 'must be longer'
419
+ }
420
+ ]
417
421
  }
418
422
  assert_equal expected_errors_object, result
419
423
  end
@@ -429,12 +433,11 @@ module ActiveModelSerializers
429
433
  adapter = ActiveModelSerializers::Adapter::JsonApi.new(serializer, @options)
430
434
  result = adapter.serializable_hash
431
435
 
432
- expected_errors_object =
433
- { :errors =>
434
- [
435
- { :source => { :pointer => '/data/attributes/published_at' }, :detail => 'must be in the future' },
436
- { :source => { :pointer => '/data/attributes/title' }, :detail => 'must be longer' }
437
- ]
436
+ expected_errors_object = {
437
+ :errors => [
438
+ { :source => { :pointer => '/data/attributes/published_at' }, :detail => 'must be in the future' },
439
+ { :source => { :pointer => '/data/attributes/title' }, :detail => 'must be longer' }
440
+ ]
438
441
  }
439
442
  assert_equal expected_errors_object, result
440
443
  end
@@ -466,12 +469,11 @@ module ActiveModelSerializers
466
469
  adapter = ActiveModelSerializers::Adapter::JsonApi.new(serializer, @options)
467
470
  result = adapter.serializable_hash
468
471
 
469
- expected_errors_object =
470
- { :Errors =>
471
- [
472
- { :Source => { :Pointer => '/data/attributes/PublishedAt' }, :Detail => 'must be in the future' },
473
- { :Source => { :Pointer => '/data/attributes/Title' }, :Detail => 'must be longer' }
474
- ]
472
+ expected_errors_object = {
473
+ :Errors => [
474
+ { :Source => { :Pointer => '/data/attributes/PublishedAt' }, :Detail => 'must be in the future' },
475
+ { :Source => { :Pointer => '/data/attributes/Title' }, :Detail => 'must be longer' }
476
+ ]
475
477
  }
476
478
  assert_equal expected_errors_object, result
477
479
  end
@@ -487,12 +489,11 @@ module ActiveModelSerializers
487
489
  adapter = ActiveModelSerializers::Adapter::JsonApi.new(serializer, @options)
488
490
  result = adapter.serializable_hash
489
491
 
490
- expected_errors_object =
491
- { :errors =>
492
- [
493
- { :source => { :pointer => '/data/attributes/publishedAt' }, :detail => 'must be in the future' },
494
- { :source => { :pointer => '/data/attributes/title' }, :detail => 'must be longer' }
495
- ]
492
+ expected_errors_object = {
493
+ :errors => [
494
+ { :source => { :pointer => '/data/attributes/publishedAt' }, :detail => 'must be in the future' },
495
+ { :source => { :pointer => '/data/attributes/title' }, :detail => 'must be longer' }
496
+ ]
496
497
  }
497
498
  assert_equal expected_errors_object, result
498
499
  end