active_model_serializers 0.10.6 → 0.10.7

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 (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