active_model_serializers 0.10.6 → 0.10.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (36) hide show
  1. checksums.yaml +5 -5
  2. data/.travis.yml +28 -31
  3. data/CHANGELOG.md +47 -1
  4. data/Gemfile +20 -4
  5. data/README.md +1 -3
  6. data/active_model_serializers.gemspec +1 -1
  7. data/appveyor.yml +4 -6
  8. data/docs/general/adapters.md +6 -0
  9. data/docs/general/configuration_options.md +16 -0
  10. data/docs/general/rendering.md +1 -1
  11. data/docs/general/serializers.md +4 -1
  12. data/docs/howto/add_root_key.md +7 -0
  13. data/lib/active_model/serializer.rb +2 -1
  14. data/lib/active_model/serializer/collection_serializer.rb +4 -1
  15. data/lib/active_model/serializer/reflection.rb +1 -1
  16. data/lib/active_model/serializer/version.rb +1 -1
  17. data/lib/active_model_serializers.rb +1 -1
  18. data/lib/active_model_serializers/adapter/json_api/deserialization.rb +1 -1
  19. data/lib/active_model_serializers/adapter/json_api/pagination_links.rb +40 -21
  20. data/lib/active_model_serializers/adapter/json_api/relationship.rb +16 -4
  21. data/lib/active_model_serializers/adapter/json_api/resource_identifier.rb +31 -25
  22. data/test/action_controller/json_api/deserialization_test.rb +1 -1
  23. data/test/action_controller/json_api/pagination_test.rb +14 -6
  24. data/test/adapter/json_api/include_data_if_sideloaded_test.rb +32 -2
  25. data/test/adapter/json_api/pagination_links_test.rb +20 -7
  26. data/test/adapter/json_api/parse_test.rb +1 -1
  27. data/test/adapter/json_api/type_test.rb +168 -36
  28. data/test/adapter/polymorphic_test.rb +47 -0
  29. data/test/collection_serializer_test.rb +6 -2
  30. data/test/fixtures/active_record.rb +2 -2
  31. data/test/serializers/associations_test.rb +45 -1
  32. data/test/support/isolated_unit.rb +4 -2
  33. data/test/support/serialization_testing.rb +8 -0
  34. metadata +37 -41
  35. data/test/adapter/json_api/has_many_embed_ids_test.rb +0 -43
  36. data/test/adapter/json_api/resource_identifier_test.rb +0 -110
@@ -43,10 +43,16 @@ module ActiveModelSerializers
43
43
  end
44
44
 
45
45
  def data_for_one(association)
46
- if association.belongs_to? &&
47
- parent_serializer.object.respond_to?(association.reflection.foreign_key)
48
- id = parent_serializer.object.send(association.reflection.foreign_key)
49
- type = association.reflection.type.to_s
46
+ if belongs_to_id_on_self?(association)
47
+ id = parent_serializer.read_attribute_for_serialization(association.reflection.foreign_key)
48
+ type =
49
+ if association.polymorphic?
50
+ # We can't infer resource type for polymorphic relationships from the serializer.
51
+ # We can ONLY know a polymorphic resource type by inspecting each resource.
52
+ association.lazy_association.serializer.json_key
53
+ else
54
+ association.reflection.type.to_s
55
+ end
50
56
  ResourceIdentifier.for_type_with_id(type, id, serializable_resource_options)
51
57
  else
52
58
  # TODO(BF): Process relationship without evaluating lazy_association
@@ -86,6 +92,12 @@ module ActiveModelSerializers
86
92
  meta = association.meta
87
93
  meta.respond_to?(:call) ? parent_serializer.instance_eval(&meta) : meta
88
94
  end
95
+
96
+ def belongs_to_id_on_self?(association)
97
+ parent_serializer.config.jsonapi_use_foreign_key_on_belongs_to_relationship &&
98
+ association.belongs_to? &&
99
+ parent_serializer.object.respond_to?(association.reflection.foreign_key)
100
+ end
89
101
  end
90
102
  end
91
103
  end
@@ -2,32 +2,34 @@ module ActiveModelSerializers
2
2
  module Adapter
3
3
  class JsonApi
4
4
  class ResourceIdentifier
5
- def self.type_for(class_name, serializer_type = nil, transform_options = {})
6
- if serializer_type
7
- raw_type = serializer_type
8
- else
9
- inflection =
10
- if ActiveModelSerializers.config.jsonapi_resource_type == :singular
11
- :singularize
12
- else
13
- :pluralize
14
- end
15
-
16
- raw_type = class_name.underscore
17
- raw_type = ActiveSupport::Inflector.public_send(inflection, raw_type)
18
- raw_type
19
- .gsub!('/'.freeze, ActiveModelSerializers.config.jsonapi_namespace_separator)
20
- raw_type
21
- end
5
+ def self.type_for(serializer, serializer_type = nil, transform_options = {})
6
+ raw_type = serializer_type ? serializer_type : raw_type_from_serializer_object(serializer.object)
22
7
  JsonApi.send(:transform_key_casing!, raw_type, transform_options)
23
8
  end
24
9
 
25
10
  def self.for_type_with_id(type, id, options)
26
- return nil if id.blank?
27
- {
28
- id: id.to_s,
29
- type: type_for(:no_class_needed, type, options)
30
- }
11
+ type = inflect_type(type)
12
+ type = type_for(:no_class_needed, type, options)
13
+ if id.blank?
14
+ { type: type }
15
+ else
16
+ { id: id.to_s, type: type }
17
+ end
18
+ end
19
+
20
+ def self.raw_type_from_serializer_object(object)
21
+ class_name = object.class.name # should use model_name
22
+ raw_type = class_name.underscore
23
+ raw_type = inflect_type(raw_type)
24
+ raw_type
25
+ .gsub!('/'.freeze, ActiveModelSerializers.config.jsonapi_namespace_separator)
26
+ raw_type
27
+ end
28
+
29
+ def self.inflect_type(type)
30
+ singularize = ActiveModelSerializers.config.jsonapi_resource_type == :singular
31
+ inflection = singularize ? :singularize : :pluralize
32
+ ActiveSupport::Inflector.public_send(inflection, type)
31
33
  end
32
34
 
33
35
  # {http://jsonapi.org/format/#document-resource-identifier-objects Resource Identifier Objects}
@@ -37,8 +39,11 @@ module ActiveModelSerializers
37
39
  end
38
40
 
39
41
  def as_json
40
- return nil if id.blank?
41
- { id: id, type: type }
42
+ if id.blank?
43
+ { type: type }
44
+ else
45
+ { id: id.to_s, type: type }
46
+ end
42
47
  end
43
48
 
44
49
  protected
@@ -48,7 +53,8 @@ module ActiveModelSerializers
48
53
  private
49
54
 
50
55
  def type_for(serializer, transform_options)
51
- self.class.type_for(serializer.object.class.name, serializer._type, transform_options)
56
+ serializer_type = serializer._type
57
+ self.class.type_for(serializer, serializer_type, transform_options)
52
58
  end
53
59
 
54
60
  def id_for(serializer)
@@ -45,7 +45,7 @@ module ActionController
45
45
  response = JSON.parse(@response.body)
46
46
  expected = {
47
47
  'restriction_for_id' => '67',
48
- 'restriction_for_type' => 'discounts',
48
+ 'restriction_for_type' => 'Discount',
49
49
  'restricted_to_id' => nil,
50
50
  'restricted_to_type' => nil
51
51
  }
@@ -58,8 +58,10 @@ module ActionController
58
58
  assert_equal expected_links, response['links']
59
59
  end
60
60
 
61
- def test_render_only_last_and_next_pagination_links
61
+ def test_render_only_first_last_and_next_pagination_links
62
62
  expected_links = { 'self' => "#{WILL_PAGINATE_URI}?page%5Bnumber%5D=1&page%5Bsize%5D=2",
63
+ 'first' => "#{WILL_PAGINATE_URI}?page%5Bnumber%5D=1&page%5Bsize%5D=2",
64
+ 'prev' => nil,
63
65
  'next' => "#{WILL_PAGINATE_URI}?page%5Bnumber%5D=2&page%5Bsize%5D=2",
64
66
  'last' => "#{WILL_PAGINATE_URI}?page%5Bnumber%5D=2&page%5Bsize%5D=2" }
65
67
  get :render_pagination_using_will_paginate, params: { page: { number: 1, size: 2 } }
@@ -78,17 +80,21 @@ module ActionController
78
80
  assert_equal expected_links, response['links']
79
81
  end
80
82
 
81
- def test_render_only_prev_and_first_pagination_links
83
+ def test_render_only_prev_first_and_last_pagination_links
82
84
  expected_links = { 'self' => "#{KAMINARI_URI}?page%5Bnumber%5D=3&page%5Bsize%5D=1",
83
85
  'first' => "#{KAMINARI_URI}?page%5Bnumber%5D=1&page%5Bsize%5D=1",
84
- 'prev' => "#{KAMINARI_URI}?page%5Bnumber%5D=2&page%5Bsize%5D=1" }
86
+ 'prev' => "#{KAMINARI_URI}?page%5Bnumber%5D=2&page%5Bsize%5D=1",
87
+ 'next' => nil,
88
+ 'last' => "#{KAMINARI_URI}?page%5Bnumber%5D=3&page%5Bsize%5D=1" }
85
89
  get :render_pagination_using_kaminari, params: { page: { number: 3, size: 1 } }
86
90
  response = JSON.parse(@response.body)
87
91
  assert_equal expected_links, response['links']
88
92
  end
89
93
 
90
- def test_render_only_last_and_next_pagination_links_with_additional_params
94
+ def test_render_only_first_last_and_next_pagination_links_with_additional_params
91
95
  expected_links = { 'self' => "#{WILL_PAGINATE_URI}?page%5Bnumber%5D=1&page%5Bsize%5D=2&teste=additional",
96
+ 'first' => "#{WILL_PAGINATE_URI}?page%5Bnumber%5D=1&page%5Bsize%5D=2&teste=additional",
97
+ 'prev' => nil,
92
98
  'next' => "#{WILL_PAGINATE_URI}?page%5Bnumber%5D=2&page%5Bsize%5D=2&teste=additional",
93
99
  'last' => "#{WILL_PAGINATE_URI}?page%5Bnumber%5D=2&page%5Bsize%5D=2&teste=additional" }
94
100
  get :render_pagination_using_will_paginate, params: { page: { number: 1, size: 2 }, teste: 'additional' }
@@ -96,10 +102,12 @@ module ActionController
96
102
  assert_equal expected_links, response['links']
97
103
  end
98
104
 
99
- def test_render_only_prev_and_first_pagination_links_with_additional_params
105
+ def test_render_only_prev_first_and_last_pagination_links_with_additional_params
100
106
  expected_links = { 'self' => "#{KAMINARI_URI}?page%5Bnumber%5D=3&page%5Bsize%5D=1&teste=additional",
101
107
  'first' => "#{KAMINARI_URI}?page%5Bnumber%5D=1&page%5Bsize%5D=1&teste=additional",
102
- 'prev' => "#{KAMINARI_URI}?page%5Bnumber%5D=2&page%5Bsize%5D=1&teste=additional" }
108
+ 'prev' => "#{KAMINARI_URI}?page%5Bnumber%5D=2&page%5Bsize%5D=1&teste=additional",
109
+ 'next' => nil,
110
+ 'last' => "#{KAMINARI_URI}?page%5Bnumber%5D=3&page%5Bsize%5D=1&teste=additional" }
103
111
  get :render_pagination_using_kaminari, params: { page: { number: 3, size: 1 }, teste: 'additional' }
104
112
  response = JSON.parse(@response.body)
105
113
  assert_equal expected_links, response['links']
@@ -6,7 +6,7 @@ module ActiveModel
6
6
  class JsonApi
7
7
  class IncludeParamTest < ActiveSupport::TestCase
8
8
  IncludeParamAuthor = Class.new(::Model) do
9
- associations :tags, :posts
9
+ associations :tags, :posts, :roles
10
10
  end
11
11
 
12
12
  class CustomCommentLoader
@@ -51,14 +51,19 @@ module ActiveModel
51
51
  include_data :if_sideloaded
52
52
  IncludeParamAuthorSerializer.comment_loader.all
53
53
  end
54
+ has_many :roles, key: :granted_roles do
55
+ include_data :if_sideloaded
56
+ end
54
57
  end
55
58
 
56
59
  def setup
57
60
  IncludeParamAuthorSerializer.comment_loader = Class.new(CustomCommentLoader).new
58
61
  @tag = Tag.new(id: 1337, name: 'mytag')
62
+ @role = Role.new(id: 1337, name: 'myrole')
59
63
  @author = IncludeParamAuthor.new(
60
64
  id: 1337,
61
- tags: [@tag]
65
+ tags: [@tag],
66
+ roles: [@role]
62
67
  )
63
68
  end
64
69
 
@@ -105,6 +110,31 @@ module ActiveModel
105
110
  assert_equal(expected, hash[:included])
106
111
  end
107
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
+
108
138
  def test_nested_relationship
109
139
  expected = {
110
140
  data: [
@@ -54,6 +54,16 @@ module ActiveModelSerializers
54
54
  }
55
55
  end
56
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
+
57
67
  def links
58
68
  {
59
69
  links: {
@@ -71,7 +81,9 @@ module ActiveModelSerializers
71
81
  links: {
72
82
  self: "#{URI}?page%5Bnumber%5D=3&page%5Bsize%5D=2",
73
83
  first: "#{URI}?page%5Bnumber%5D=1&page%5Bsize%5D=2",
74
- prev: "#{URI}?page%5Bnumber%5D=2&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"
75
87
  }
76
88
  }
77
89
  end
@@ -108,10 +120,10 @@ module ActiveModelSerializers
108
120
  end
109
121
  end
110
122
 
111
- def expected_response_with_no_data_pagination_links
123
+ def expected_response_with_empty_collection_pagination_links
112
124
  {}.tap do |hash|
113
125
  hash[:data] = []
114
- hash[:links] = {}
126
+ hash.merge! links: empty_collection_links
115
127
  end
116
128
  end
117
129
 
@@ -139,7 +151,7 @@ module ActiveModelSerializers
139
151
 
140
152
  adapter = load_adapter(using_kaminari(1), mock_request)
141
153
 
142
- assert_equal expected_response_with_no_data_pagination_links, adapter.serializable_hash
154
+ assert_equal expected_response_with_empty_collection_pagination_links, adapter.serializable_hash
143
155
  end
144
156
 
145
157
  def test_pagination_links_when_zero_results_will_paginate
@@ -147,7 +159,7 @@ module ActiveModelSerializers
147
159
 
148
160
  adapter = load_adapter(using_will_paginate(1), mock_request)
149
161
 
150
- assert_equal expected_response_with_no_data_pagination_links, adapter.serializable_hash
162
+ assert_equal expected_response_with_empty_collection_pagination_links, adapter.serializable_hash
151
163
  end
152
164
 
153
165
  def test_last_page_pagination_links_using_kaminari
@@ -171,10 +183,11 @@ module ActiveModelSerializers
171
183
  def test_raises_descriptive_error_when_serialization_context_unset
172
184
  render_options = { adapter: :json_api }
173
185
  adapter = serializable(using_kaminari, render_options)
174
- exception = assert_raises do
186
+ exception_class = ActiveModelSerializers::Adapter::JsonApi::PaginationLinks::MissingSerializationContextError
187
+
188
+ exception = assert_raises(exception_class) do
175
189
  adapter.as_json
176
190
  end
177
- exception_class = ActiveModelSerializers::Adapter::JsonApi::PaginationLinks::MissingSerializationContextError
178
191
  assert_equal exception_class, exception.class
179
192
  assert_match(/CollectionSerializer#paginated\?/, exception.message)
180
193
  end
@@ -125,7 +125,7 @@ module ActiveModelSerializers
125
125
  src: 'http://example.com/images/productivity.png',
126
126
  author_id: nil,
127
127
  photographer_id: '9',
128
- photographer_type: 'people',
128
+ photographer_type: 'Person',
129
129
  comment_ids: %w(1 2)
130
130
  }
131
131
  assert_equal(expected, parsed_hash)
@@ -1,60 +1,192 @@
1
1
  require 'test_helper'
2
2
 
3
- module ActiveModel
4
- class Serializer
5
- module Adapter
6
- class JsonApi
7
- class TypeTest < ActiveSupport::TestCase
8
- class StringTypeSerializer < ActiveModel::Serializer
9
- attribute :name
10
- type 'profile'
3
+ module ActiveModelSerializers
4
+ module Adapter
5
+ class JsonApi
6
+ class TypeTest < ActiveSupport::TestCase
7
+ class StringTypeSerializer < ActiveModel::Serializer
8
+ attribute :name
9
+ type 'profile'
10
+ end
11
+
12
+ class SymbolTypeSerializer < ActiveModel::Serializer
13
+ attribute :name
14
+ type :profile
15
+ end
16
+
17
+ setup do
18
+ @author = Author.new(id: 1, name: 'Steve K.')
19
+ end
20
+
21
+ def test_config_plural
22
+ with_jsonapi_inflection :plural do
23
+ assert_type(@author, 'authors')
11
24
  end
25
+ end
12
26
 
13
- class SymbolTypeSerializer < ActiveModel::Serializer
14
- attribute :name
15
- type :profile
27
+ def test_config_singular
28
+ with_jsonapi_inflection :singular do
29
+ assert_type(@author, 'author')
16
30
  end
31
+ end
32
+
33
+ def test_explicit_string_type_value
34
+ assert_type(@author, 'profile', serializer: StringTypeSerializer)
35
+ end
36
+
37
+ def test_explicit_symbol_type_value
38
+ assert_type(@author, 'profile', serializer: SymbolTypeSerializer)
39
+ end
40
+
41
+ private
17
42
 
18
- setup do
19
- @author = Author.new(id: 1, name: 'Steve K.')
43
+ def assert_type(resource, expected_type, opts = {})
44
+ opts = opts.reverse_merge(adapter: :json_api)
45
+ hash = serializable(resource, opts).serializable_hash
46
+ assert_equal(expected_type, hash.fetch(:data).fetch(:type))
47
+ end
48
+ end
49
+ class ResourceIdentifierTest < ActiveSupport::TestCase
50
+ class WithDefinedTypeSerializer < ActiveModel::Serializer
51
+ type 'with_defined_types'
52
+ end
53
+
54
+ class WithDefinedIdSerializer < ActiveModel::Serializer
55
+ def id
56
+ 'special_id'
20
57
  end
58
+ end
59
+
60
+ class FragmentedSerializer < ActiveModel::Serializer
61
+ cache only: :id
21
62
 
22
- def test_config_plural
23
- with_jsonapi_resource_type :plural do
24
- assert_type(@author, 'authors')
25
- end
63
+ def id
64
+ 'special_id'
26
65
  end
66
+ end
67
+
68
+ setup do
69
+ @model = Author.new(id: 1, name: 'Steve K.')
70
+ ActionController::Base.cache_store.clear
71
+ end
27
72
 
28
- def test_config_singular
29
- with_jsonapi_resource_type :singular do
30
- assert_type(@author, 'author')
31
- end
73
+ def test_defined_type
74
+ actual = with_jsonapi_inflection :plural do
75
+ actual_resource_identifier_object(WithDefinedTypeSerializer, @model)
32
76
  end
77
+ expected = { id: expected_model_id(@model), type: 'with-defined-types' }
78
+ assert_equal actual, expected
79
+ end
33
80
 
34
- def test_explicit_string_type_value
35
- assert_type(@author, 'profile', serializer: StringTypeSerializer)
81
+ def test_defined_type_not_inflected
82
+ actual = with_jsonapi_inflection :singular do
83
+ actual_resource_identifier_object(WithDefinedTypeSerializer, @model)
36
84
  end
85
+ expected = { id: expected_model_id(@model), type: 'with-defined-types' }
86
+ assert_equal actual, expected
87
+ end
37
88
 
38
- def test_explicit_symbol_type_value
39
- assert_type(@author, 'profile', serializer: SymbolTypeSerializer)
89
+ def test_singular_type
90
+ actual = with_jsonapi_inflection :singular do
91
+ actual_resource_identifier_object(AuthorSerializer, @model)
40
92
  end
93
+ expected = { id: expected_model_id(@model), type: 'author' }
94
+ assert_equal actual, expected
95
+ end
41
96
 
42
- private
97
+ def test_plural_type
98
+ actual = with_jsonapi_inflection :plural do
99
+ actual_resource_identifier_object(AuthorSerializer, @model)
100
+ end
101
+ expected = { id: expected_model_id(@model), type: 'authors' }
102
+ assert_equal actual, expected
103
+ end
104
+
105
+ def test_type_with_namespace
106
+ Object.const_set(:Admin, Module.new)
107
+ model = Class.new(::Model)
108
+ Admin.const_set(:PowerUser, model)
109
+ serializer = Class.new(ActiveModel::Serializer)
110
+ Admin.const_set(:PowerUserSerializer, serializer)
111
+ with_namespace_separator '--' do
112
+ admin_user = Admin::PowerUser.new
113
+ serializer = Admin::PowerUserSerializer.new(admin_user)
114
+ expected = {
115
+ id: admin_user.id,
116
+ type: 'admin--power-users'
117
+ }
118
+
119
+ identifier = ResourceIdentifier.new(serializer, {})
120
+ actual = identifier.as_json
121
+ assert_equal(expected, actual)
122
+ end
123
+ end
124
+
125
+ def test_id_defined_on_object
126
+ actual = actual_resource_identifier_object(AuthorSerializer, @model)
127
+ expected = { id: @model.id.to_s, type: expected_model_type(@model) }
128
+ assert_equal actual, expected
129
+ end
130
+
131
+ def test_blank_id
132
+ model = Author.new(id: nil, name: 'Steve K.')
133
+ actual = actual_resource_identifier_object(AuthorSerializer, model)
134
+ expected = { type: expected_model_type(model) }
135
+ assert_equal actual, expected
136
+ end
137
+
138
+ def test_for_type_with_id
139
+ id = 1
140
+ actual = ResourceIdentifier.for_type_with_id('admin_user', id, {})
141
+ expected = { id: '1', type: 'admin-users' }
142
+ assert_equal actual, expected
143
+ end
43
144
 
44
- def assert_type(resource, expected_type, opts = {})
45
- opts = opts.reverse_merge(adapter: :json_api)
46
- hash = serializable(resource, opts).serializable_hash
47
- assert_equal(expected_type, hash.fetch(:data).fetch(:type))
145
+ def test_for_type_with_id_given_blank_id
146
+ id = ''
147
+ actual = ResourceIdentifier.for_type_with_id('admin_user', id, {})
148
+ expected = { type: 'admin-users' }
149
+ assert_equal actual, expected
150
+ end
151
+
152
+ def test_for_type_with_id_inflected
153
+ id = 2
154
+ actual = with_jsonapi_inflection :singular do
155
+ ResourceIdentifier.for_type_with_id('admin_users', id, {})
48
156
  end
157
+ expected = { id: '2', type: 'admin-user' }
158
+ assert_equal actual, expected
159
+ end
160
+
161
+ def test_id_defined_on_serializer
162
+ actual = actual_resource_identifier_object(WithDefinedIdSerializer, @model)
163
+ expected = { id: 'special_id', type: expected_model_type(@model) }
164
+ assert_equal actual, expected
165
+ end
166
+
167
+ def test_id_defined_on_fragmented
168
+ actual = actual_resource_identifier_object(FragmentedSerializer, @model)
169
+ expected = { id: 'special_id', type: expected_model_type(@model) }
170
+ assert_equal actual, expected
171
+ end
172
+
173
+ private
174
+
175
+ def actual_resource_identifier_object(serializer_class, model)
176
+ serializer = serializer_class.new(model)
177
+ resource_identifier = ResourceIdentifier.new(serializer, nil)
178
+ resource_identifier.as_json
179
+ end
49
180
 
50
- def with_jsonapi_resource_type(inflection)
51
- old_inflection = ActiveModelSerializers.config.jsonapi_resource_type
52
- ActiveModelSerializers.config.jsonapi_resource_type = inflection
53
- yield
54
- ensure
55
- ActiveModelSerializers.config.jsonapi_resource_type = old_inflection
181
+ def expected_model_type(model, inflection = ActiveModelSerializers.config.jsonapi_resource_type)
182
+ with_jsonapi_inflection inflection do
183
+ model.class.model_name.send(inflection)
56
184
  end
57
185
  end
186
+
187
+ def expected_model_id(model)
188
+ model.id.to_s
189
+ end
58
190
  end
59
191
  end
60
192
  end