fun_with_json_api 0.0.2 → 0.0.3
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.
- checksums.yaml +4 -4
- data/Rakefile +4 -1
- data/config/locales/fun_with_json_api.en.yml +29 -2
- data/lib/fun_with_json_api.rb +30 -2
- data/lib/fun_with_json_api/action_controller_extensions/serialization.rb +18 -0
- data/lib/fun_with_json_api/attribute.rb +3 -3
- data/lib/fun_with_json_api/attributes/relationship.rb +37 -23
- data/lib/fun_with_json_api/attributes/relationship_collection.rb +55 -38
- data/lib/fun_with_json_api/attributes/string_attribute.rb +12 -1
- data/lib/fun_with_json_api/attributes/uuid_v4_attribute.rb +27 -0
- data/lib/fun_with_json_api/controller_methods.rb +1 -1
- data/lib/fun_with_json_api/deserializer.rb +61 -8
- data/lib/fun_with_json_api/deserializer_class_methods.rb +37 -7
- data/lib/fun_with_json_api/exceptions/illegal_client_generated_identifier.rb +17 -0
- data/lib/fun_with_json_api/exceptions/invalid_client_generated_identifier.rb +17 -0
- data/lib/fun_with_json_api/exceptions/invalid_document_identifier.rb +17 -0
- data/lib/fun_with_json_api/exceptions/invalid_document_type.rb +20 -0
- data/lib/fun_with_json_api/exceptions/invalid_relationship.rb +5 -3
- data/lib/fun_with_json_api/exceptions/invalid_relationship_type.rb +17 -0
- data/lib/fun_with_json_api/exceptions/missing_resource.rb +15 -0
- data/lib/fun_with_json_api/exceptions/unknown_attribute.rb +15 -0
- data/lib/fun_with_json_api/exceptions/unknown_relationship.rb +15 -0
- data/lib/fun_with_json_api/find_collection_from_document.rb +124 -0
- data/lib/fun_with_json_api/find_resource_from_document.rb +112 -0
- data/lib/fun_with_json_api/pre_deserializer.rb +1 -0
- data/lib/fun_with_json_api/railtie.rb +30 -1
- data/lib/fun_with_json_api/schema_validator.rb +47 -0
- data/lib/fun_with_json_api/schema_validators/check_attributes.rb +52 -0
- data/lib/fun_with_json_api/schema_validators/check_document_id_matches_resource.rb +96 -0
- data/lib/fun_with_json_api/schema_validators/check_document_type_matches_resource.rb +40 -0
- data/lib/fun_with_json_api/schema_validators/check_relationships.rb +127 -0
- data/lib/fun_with_json_api/version.rb +1 -1
- data/spec/dummy/log/test.log +172695 -0
- data/spec/fixtures/active_record.rb +6 -0
- data/spec/fun_with_json_api/controller_methods_spec.rb +8 -3
- data/spec/fun_with_json_api/deserializer_class_methods_spec.rb +14 -6
- data/spec/fun_with_json_api/deserializer_spec.rb +155 -40
- data/spec/fun_with_json_api/exception_spec.rb +9 -9
- data/spec/fun_with_json_api/find_collection_from_document_spec.rb +203 -0
- data/spec/fun_with_json_api/find_resource_from_document_spec.rb +100 -0
- data/spec/fun_with_json_api/pre_deserializer_spec.rb +26 -26
- data/spec/fun_with_json_api/railtie_spec.rb +88 -0
- data/spec/fun_with_json_api/schema_validator_spec.rb +94 -0
- data/spec/fun_with_json_api/schema_validators/check_attributes_spec.rb +52 -0
- data/spec/fun_with_json_api/schema_validators/check_document_id_matches_resource_spec.rb +115 -0
- data/spec/fun_with_json_api/schema_validators/check_document_type_matches_resource_spec.rb +30 -0
- data/spec/fun_with_json_api/schema_validators/check_relationships_spec.rb +150 -0
- data/spec/fun_with_json_api_spec.rb +148 -4
- metadata +49 -4
- data/spec/example_spec.rb +0 -64
@@ -54,6 +54,12 @@ module ARModels
|
|
54
54
|
belongs_to :author, -> { AuthorDeserializer }
|
55
55
|
end
|
56
56
|
|
57
|
+
class AuthorSerializer < ActiveModel::Serializer
|
58
|
+
type 'person'
|
59
|
+
attribute :name
|
60
|
+
has_many :posts
|
61
|
+
end
|
62
|
+
|
57
63
|
class AuthorDeserializer < FunWithJsonApi::Deserializer
|
58
64
|
type 'person'
|
59
65
|
resource_class Author
|
@@ -4,7 +4,9 @@ describe FunWithJsonApi::ControllerMethods, type: :controller do
|
|
4
4
|
describe '#render_fun_with_json_api_exception' do
|
5
5
|
context 'with a controller that raises an exception' do
|
6
6
|
controller do
|
7
|
+
# rubocop:disable RSpec/DescribedClass
|
7
8
|
include FunWithJsonApi::ControllerMethods
|
9
|
+
# rubocop:enable RSpec/DescribedClass
|
8
10
|
|
9
11
|
rescue_from FunWithJsonApi::Exception, with: :render_fun_with_json_api_exception
|
10
12
|
|
@@ -35,9 +37,10 @@ describe FunWithJsonApi::ControllerMethods, type: :controller do
|
|
35
37
|
it 'returns a json api error status' do
|
36
38
|
get :index
|
37
39
|
expect(response.status).to eq 403
|
40
|
+
expect(response.content_type).to eq 'application/vnd.api+json'
|
38
41
|
end
|
39
42
|
|
40
|
-
it 'renders the exception payload as a json api errors response
|
43
|
+
it 'renders the exception payload as a json api errors response' do
|
41
44
|
get :index
|
42
45
|
expect(JSON.parse(response.body)).to eq(
|
43
46
|
'errors' => [
|
@@ -74,9 +77,10 @@ describe FunWithJsonApi::ControllerMethods, type: :controller do
|
|
74
77
|
it 'returns a json api error status' do
|
75
78
|
get :index
|
76
79
|
expect(response.status).to eq 403
|
80
|
+
expect(response.content_type).to eq 'application/vnd.api+json'
|
77
81
|
end
|
78
82
|
|
79
|
-
it 'renders all exception payload items
|
83
|
+
it 'renders all exception payload items' do
|
80
84
|
get :index
|
81
85
|
expect(JSON.parse(response.body)).to eq(
|
82
86
|
'errors' => [
|
@@ -104,9 +108,10 @@ describe FunWithJsonApi::ControllerMethods, type: :controller do
|
|
104
108
|
it 'returns a json api error status' do
|
105
109
|
get :index
|
106
110
|
expect(response.status).to eq 422
|
111
|
+
expect(response.content_type).to eq 'application/vnd.api+json'
|
107
112
|
end
|
108
113
|
|
109
|
-
it 'only renders the non-nil params
|
114
|
+
it 'only renders the non-nil params' do
|
110
115
|
get :index
|
111
116
|
expect(JSON.parse(response.body)).to eq(
|
112
117
|
'errors' => [
|
@@ -2,14 +2,18 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe FunWithJsonApi::DeserializerClassMethods do
|
4
4
|
describe '.belongs_to' do
|
5
|
-
it '
|
5
|
+
it 'adds a Relationship attribute' do
|
6
6
|
foos_deserializer_class = Class.new(FunWithJsonApi::Deserializer) do
|
7
7
|
attribute :blargh
|
8
|
+
has_many :foos, -> { foos_deserializer_class }
|
8
9
|
end
|
9
10
|
deserializer_class = Class.new(FunWithJsonApi::Deserializer) do
|
10
11
|
belongs_to :foo, -> { foos_deserializer_class }
|
11
12
|
end
|
12
|
-
|
13
|
+
|
14
|
+
deserializer = deserializer_class.create
|
15
|
+
|
16
|
+
relationship = deserializer.relationships.last
|
13
17
|
expect(relationship).to be_kind_of(FunWithJsonApi::Attributes::Relationship)
|
14
18
|
|
15
19
|
expect(relationship.name).to eq :foo
|
@@ -22,14 +26,18 @@ describe FunWithJsonApi::DeserializerClassMethods do
|
|
22
26
|
end
|
23
27
|
|
24
28
|
describe '.has_many' do
|
25
|
-
it '
|
29
|
+
it 'adds a RelationshipCollection attribute' do
|
26
30
|
foos_deserializer_class = Class.new(FunWithJsonApi::Deserializer) do
|
27
31
|
attribute :blargh
|
32
|
+
has_many :foos, -> { foos_deserializer_class }
|
28
33
|
end
|
29
34
|
deserializer_class = Class.new(FunWithJsonApi::Deserializer) do
|
30
35
|
has_many :foos, -> { foos_deserializer_class }
|
31
36
|
end
|
32
|
-
|
37
|
+
|
38
|
+
deserializer = deserializer_class.create
|
39
|
+
|
40
|
+
relationship = deserializer.relationships.last
|
33
41
|
expect(relationship).to be_kind_of(FunWithJsonApi::Attributes::RelationshipCollection)
|
34
42
|
|
35
43
|
expect(relationship.name).to eq :foos
|
@@ -40,12 +48,12 @@ describe FunWithJsonApi::DeserializerClassMethods do
|
|
40
48
|
expect(relationship.deserializer.relationships).to eq []
|
41
49
|
end
|
42
50
|
|
43
|
-
it '
|
51
|
+
it 'does not allow pluralized "as" values' do
|
44
52
|
foos_deserializer_class = Class.new(FunWithJsonApi::Deserializer)
|
45
53
|
expect do
|
46
54
|
Class.new(FunWithJsonApi::Deserializer) do
|
47
55
|
has_many :foos, -> { foos_deserializer_class }, as: 'foos'
|
48
|
-
end
|
56
|
+
end.relationships
|
49
57
|
end.to raise_error(ArgumentError, 'Use a singular relationship as value: {as: :foo}')
|
50
58
|
end
|
51
59
|
end
|
@@ -37,40 +37,115 @@ def deserializer_with_attribute(attribute, attribute_options = {})
|
|
37
37
|
end
|
38
38
|
|
39
39
|
describe FunWithJsonApi::Deserializer do
|
40
|
+
describe '.id_param' do
|
41
|
+
context 'with no arguments' do
|
42
|
+
it 'sets id_param to id for all new deserializer instances' do
|
43
|
+
instance = Class.new(described_class).create
|
44
|
+
expect(instance.id_param).to eq :id
|
45
|
+
expect(instance.attributes.size).to eq 0
|
46
|
+
end
|
47
|
+
end
|
48
|
+
context 'with a name argument' do
|
49
|
+
it 'adds an aliased id attribute for all new deserializer instances' do
|
50
|
+
instance = Class.new(described_class) do
|
51
|
+
id_param :code
|
52
|
+
end.create
|
53
|
+
expect(instance.id_param).to eq :code
|
54
|
+
expect(instance.attributes.size).to eq 0
|
55
|
+
end
|
56
|
+
it 'converts the name parameter to a symbol' do
|
57
|
+
instance = Class.new(described_class) do
|
58
|
+
id_param 'code'
|
59
|
+
end.create
|
60
|
+
expect(instance.id_param).to eq :code
|
61
|
+
expect(instance.attributes.size).to eq 0
|
62
|
+
end
|
63
|
+
end
|
64
|
+
context 'with a format argument' do
|
65
|
+
it 'adds an id attribute with format to all new deserializer instances' do
|
66
|
+
instance = Class.new(described_class) do
|
67
|
+
id_param format: :integer
|
68
|
+
end.create
|
69
|
+
expect(instance.id_param).to eq :id
|
70
|
+
expect(instance.attributes.size).to eq 1
|
71
|
+
|
72
|
+
attribute = instance.attributes.first
|
73
|
+
expect(attribute).to be_kind_of(FunWithJsonApi::Attributes::IntegerAttribute)
|
74
|
+
expect(attribute.name).to eq :id
|
75
|
+
expect(attribute.as).to eq :id
|
76
|
+
end
|
77
|
+
end
|
78
|
+
context 'with a name and format argument' do
|
79
|
+
it 'adds an aliased id attribute with format to all new deserializer instances' do
|
80
|
+
instance = Class.new(described_class) do
|
81
|
+
id_param :code, format: :uuid_v4
|
82
|
+
end.create
|
83
|
+
expect(instance.id_param).to eq :code
|
84
|
+
expect(instance.attributes.size).to eq 1
|
85
|
+
|
86
|
+
attribute = instance.attributes.first
|
87
|
+
expect(attribute).to be_kind_of(FunWithJsonApi::Attributes::UuidV4Attribute)
|
88
|
+
expect(attribute.name).to eq :id
|
89
|
+
expect(attribute.as).to eq :code
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
40
94
|
describe '#parse_{attribute}' do
|
41
95
|
context 'with an alias value' do
|
42
|
-
it '
|
96
|
+
it 'defines a parse method from the alias value' do
|
43
97
|
deserializer = deserializer_with_attribute(:original_key, as: :assigned_key)
|
44
98
|
expect(deserializer.parse_assigned_key('Foo Bar')).to eq 'Foo Bar'
|
45
|
-
expect(deserializer).
|
99
|
+
expect(deserializer).not_to respond_to(:original_key)
|
46
100
|
end
|
47
101
|
end
|
48
102
|
|
49
103
|
context 'with no format argument (string)' do
|
50
|
-
it '
|
104
|
+
it 'allows a String value' do
|
51
105
|
deserializer = deserializer_with_attribute(:example)
|
52
106
|
expect(deserializer.parse_example('Foo Bar')).to eq 'Foo Bar'
|
53
107
|
end
|
54
|
-
it '
|
108
|
+
it 'allows a nil value' do
|
55
109
|
deserializer = deserializer_with_attribute(:example)
|
56
110
|
expect(deserializer.parse_example(nil)).to be nil
|
57
111
|
end
|
112
|
+
it 'raises an InvalidAttribute error an for non string value' do
|
113
|
+
deserializer = deserializer_with_attribute(:example)
|
114
|
+
[1, true, false, [], {}].each do |value|
|
115
|
+
expect do
|
116
|
+
deserializer.parse_example(value)
|
117
|
+
end.to raise_error(FunWithJsonApi::Exceptions::InvalidAttribute) do |e|
|
118
|
+
expect(e.payload.size).to eq 1
|
119
|
+
|
120
|
+
payload = e.payload.first
|
121
|
+
expect(payload.status).to eq '400'
|
122
|
+
expect(payload.code).to eq 'invalid_attribute'
|
123
|
+
expect(payload.title).to eq(
|
124
|
+
I18n.t('fun_with_json_api.exceptions.invalid_attribute')
|
125
|
+
)
|
126
|
+
expect(payload.detail).to eq(
|
127
|
+
I18n.t('fun_with_json_api.exceptions.invalid_string_attribute')
|
128
|
+
)
|
129
|
+
expect(payload.pointer).to eq '/data/attributes/example'
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
58
133
|
end
|
59
134
|
|
60
135
|
context 'with a boolean format' do
|
61
|
-
it '
|
136
|
+
it 'allows a Boolean.TRUE value' do
|
62
137
|
deserializer = deserializer_with_attribute(:example, format: :boolean)
|
63
138
|
expect(deserializer.parse_example(true)).to eq true
|
64
139
|
end
|
65
|
-
it '
|
140
|
+
it 'allows a Boolean.FALSE value' do
|
66
141
|
deserializer = deserializer_with_attribute(:example, format: :boolean)
|
67
142
|
expect(deserializer.parse_example(false)).to eq false
|
68
143
|
end
|
69
|
-
it '
|
144
|
+
it 'allows a nil value' do
|
70
145
|
deserializer = deserializer_with_attribute(:example, format: :boolean)
|
71
146
|
expect(deserializer.parse_example(nil)).to be nil
|
72
147
|
end
|
73
|
-
it '
|
148
|
+
it 'raises an InvalidAttribute error an for invalid boolean values' do
|
74
149
|
deserializer = deserializer_with_attribute(:example, format: :boolean)
|
75
150
|
['true', 'True', 'TRUE', 1, 'false', 'False', 'FALSE', 0].each do |value|
|
76
151
|
expect do
|
@@ -94,15 +169,15 @@ describe FunWithJsonApi::Deserializer do
|
|
94
169
|
end
|
95
170
|
|
96
171
|
context 'with a date format' do
|
97
|
-
it '
|
172
|
+
it 'allows a "YYYY-MM-DD" formatted date String' do
|
98
173
|
deserializer = deserializer_with_attribute(:example, format: :date)
|
99
174
|
expect(deserializer.parse_example('2016-03-12')).to eq Date.new(2016, 03, 12)
|
100
175
|
end
|
101
|
-
it '
|
176
|
+
it 'allows a nil value' do
|
102
177
|
deserializer = deserializer_with_attribute(:example, format: :date)
|
103
178
|
expect(deserializer.parse_example(nil)).to be nil
|
104
179
|
end
|
105
|
-
it '
|
180
|
+
it 'raises an InvalidAttribute error an for invalid date value' do
|
106
181
|
deserializer = deserializer_with_attribute(:example, format: :date)
|
107
182
|
['2016-12', 'Last Wednesday', 'April'].each do |value|
|
108
183
|
expect do
|
@@ -126,7 +201,7 @@ describe FunWithJsonApi::Deserializer do
|
|
126
201
|
end
|
127
202
|
|
128
203
|
context 'with a datetime format' do
|
129
|
-
it '
|
204
|
+
it 'allows a ISO 8601 formatted values' do
|
130
205
|
deserializer = deserializer_with_attribute(:example, format: :datetime)
|
131
206
|
[
|
132
207
|
'2016-03-11T03:45:40+00:00',
|
@@ -139,11 +214,11 @@ describe FunWithJsonApi::Deserializer do
|
|
139
214
|
)
|
140
215
|
end
|
141
216
|
end
|
142
|
-
it '
|
217
|
+
it 'allows a nil value' do
|
143
218
|
deserializer = deserializer_with_attribute(:example, format: :datetime)
|
144
219
|
expect(deserializer.parse_example(nil)).to be nil
|
145
220
|
end
|
146
|
-
it '
|
221
|
+
it 'raises an InvalidAttribute error an for invalid date value' do
|
147
222
|
deserializer = deserializer_with_attribute(:example, format: :datetime)
|
148
223
|
[
|
149
224
|
'Last Wednesday',
|
@@ -170,27 +245,27 @@ describe FunWithJsonApi::Deserializer do
|
|
170
245
|
end
|
171
246
|
|
172
247
|
context 'with a decimal format' do
|
173
|
-
it '
|
248
|
+
it 'allows integers' do
|
174
249
|
deserializer = deserializer_with_attribute(:example, format: :decimal)
|
175
250
|
expect(deserializer.parse_example(12)).to eq BigDecimal.new('12')
|
176
251
|
end
|
177
|
-
it '
|
252
|
+
it 'allows floats' do
|
178
253
|
deserializer = deserializer_with_attribute(:example, format: :decimal)
|
179
254
|
expect(deserializer.parse_example(12.34)).to eq BigDecimal.new('12.34')
|
180
255
|
end
|
181
|
-
it '
|
256
|
+
it 'allows integer numbers as strings' do
|
182
257
|
deserializer = deserializer_with_attribute(:example, format: :decimal)
|
183
258
|
expect(deserializer.parse_example('12')).to eq BigDecimal.new('12')
|
184
259
|
end
|
185
|
-
it '
|
260
|
+
it 'allows floating point numbers as strings' do
|
186
261
|
deserializer = deserializer_with_attribute(:example, format: :decimal)
|
187
262
|
expect(deserializer.parse_example('12.30')).to eq BigDecimal.new('12.30')
|
188
263
|
end
|
189
|
-
it '
|
264
|
+
it 'allows a nil value' do
|
190
265
|
deserializer = deserializer_with_attribute(:example, format: :decimal)
|
191
266
|
expect(deserializer.parse_example(nil)).to be nil
|
192
267
|
end
|
193
|
-
it '
|
268
|
+
it 'raises an InvalidAttribute error an for invalid decimal value' do
|
194
269
|
deserializer = deserializer_with_attribute(:example, format: :decimal)
|
195
270
|
[
|
196
271
|
'twelve',
|
@@ -218,23 +293,23 @@ describe FunWithJsonApi::Deserializer do
|
|
218
293
|
end
|
219
294
|
|
220
295
|
context 'with a float format' do
|
221
|
-
it '
|
296
|
+
it 'allows floats' do
|
222
297
|
deserializer = deserializer_with_attribute(:example, format: :float)
|
223
298
|
expect(deserializer.parse_example(12.34)).to eq 12.34
|
224
299
|
end
|
225
|
-
it '
|
300
|
+
it 'allows float numbers as strings' do
|
226
301
|
deserializer = deserializer_with_attribute(:example, format: :float)
|
227
302
|
expect(deserializer.parse_example('12.34')).to eq 12.34
|
228
303
|
end
|
229
|
-
it '
|
304
|
+
it 'allows integer numbers as strings' do
|
230
305
|
deserializer = deserializer_with_attribute(:example, format: :float)
|
231
306
|
expect(deserializer.parse_example('12')).to eq 12.0
|
232
307
|
end
|
233
|
-
it '
|
308
|
+
it 'allows a nil value' do
|
234
309
|
deserializer = deserializer_with_attribute(:example, format: :float)
|
235
310
|
expect(deserializer.parse_example(nil)).to be nil
|
236
311
|
end
|
237
|
-
it '
|
312
|
+
it 'raises an InvalidAttribute error an for invalid float value' do
|
238
313
|
deserializer = deserializer_with_attribute(:example, format: :float)
|
239
314
|
[
|
240
315
|
'twelve',
|
@@ -262,15 +337,15 @@ describe FunWithJsonApi::Deserializer do
|
|
262
337
|
end
|
263
338
|
|
264
339
|
context 'with a integer format' do
|
265
|
-
it '
|
340
|
+
it 'allows integer numbers as strings' do
|
266
341
|
deserializer = deserializer_with_attribute(:example, format: :integer)
|
267
342
|
expect(deserializer.parse_example('12')).to eq BigDecimal.new('12')
|
268
343
|
end
|
269
|
-
it '
|
344
|
+
it 'allows a nil value' do
|
270
345
|
deserializer = deserializer_with_attribute(:example, format: :integer)
|
271
346
|
expect(deserializer.parse_example(nil)).to be nil
|
272
347
|
end
|
273
|
-
it '
|
348
|
+
it 'raises an InvalidAttribute error an for invalid integer value' do
|
274
349
|
deserializer = deserializer_with_attribute(:example, format: :integer)
|
275
350
|
[
|
276
351
|
12.0,
|
@@ -299,6 +374,46 @@ describe FunWithJsonApi::Deserializer do
|
|
299
374
|
end
|
300
375
|
end
|
301
376
|
|
377
|
+
context 'with a uuid_v4 format' do
|
378
|
+
it 'allows uuid_v4 numbers as strings' do
|
379
|
+
deserializer = deserializer_with_attribute(:example, format: :uuid_v4)
|
380
|
+
expect(deserializer.parse_example('f47ac10b-58cc-4372-a567-0e02b2c3d479')).to eq(
|
381
|
+
'f47ac10b-58cc-4372-a567-0e02b2c3d479'
|
382
|
+
)
|
383
|
+
end
|
384
|
+
it 'allows a nil value' do
|
385
|
+
deserializer = deserializer_with_attribute(:example, format: :uuid_v4)
|
386
|
+
expect(deserializer.parse_example(nil)).to be nil
|
387
|
+
end
|
388
|
+
it 'raises an InvalidAttribute error an for invalid uuid_v4 value' do
|
389
|
+
deserializer = deserializer_with_attribute(:example, format: :uuid_v4)
|
390
|
+
[
|
391
|
+
'abc',
|
392
|
+
12.0,
|
393
|
+
'12.0',
|
394
|
+
'6ba7b810-9dad-11d1-80b4-00c04fd430c8', # RFC 4122 version 3
|
395
|
+
'f47ac10b58cc4372a5670e02b2c3d479' # uuid without dashes
|
396
|
+
].each do |value|
|
397
|
+
expect do
|
398
|
+
deserializer.parse_example(value)
|
399
|
+
end.to raise_error(FunWithJsonApi::Exceptions::InvalidAttribute) do |e|
|
400
|
+
expect(e.payload.size).to eq 1
|
401
|
+
|
402
|
+
payload = e.payload.first
|
403
|
+
expect(payload.status).to eq '400'
|
404
|
+
expect(payload.code).to eq 'invalid_attribute'
|
405
|
+
expect(payload.title).to eq(
|
406
|
+
I18n.t('fun_with_json_api.exceptions.invalid_attribute')
|
407
|
+
)
|
408
|
+
expect(payload.detail).to eq(
|
409
|
+
I18n.t('fun_with_json_api.exceptions.invalid_uuid_v4_attribute')
|
410
|
+
)
|
411
|
+
expect(payload.pointer).to eq '/data/attributes/example'
|
412
|
+
end
|
413
|
+
end
|
414
|
+
end
|
415
|
+
end
|
416
|
+
|
302
417
|
it 'raises an ArgumentError with an unknown format' do
|
303
418
|
expect do
|
304
419
|
deserializer_class_with_attribute(:example, format: :blarg)
|
@@ -315,14 +430,14 @@ describe FunWithJsonApi::Deserializer do
|
|
315
430
|
describe '#parse_{relationship}_id' do
|
316
431
|
context 'with a ARModels::Author relationship with a "code" id param' do
|
317
432
|
let(:deserializer) do
|
318
|
-
author_deserializer_class = Class.new(
|
433
|
+
author_deserializer_class = Class.new(described_class) do
|
319
434
|
id_param 'code'
|
320
435
|
type 'persons'
|
321
436
|
resource_class ARModels::Author
|
322
437
|
end
|
323
438
|
|
324
439
|
# Build the Deserializer
|
325
|
-
Class.new(
|
440
|
+
Class.new(described_class) do
|
326
441
|
belongs_to :example, author_deserializer_class
|
327
442
|
end.create
|
328
443
|
end
|
@@ -336,13 +451,13 @@ describe FunWithJsonApi::Deserializer do
|
|
336
451
|
expect do
|
337
452
|
deserializer.parse_example_id 'foobar'
|
338
453
|
end.to raise_error(FunWithJsonApi::Exceptions::MissingRelationship) do |e|
|
339
|
-
expect(e.message).to
|
454
|
+
expect(e.message).to eq "Couldn't find ARModels::Author where code = \"foobar\""
|
340
455
|
expect(e.payload.size).to eq 1
|
341
456
|
|
342
457
|
payload = e.payload.first
|
343
458
|
expect(payload.status).to eq '404'
|
344
459
|
expect(payload.code).to eq 'missing_relationship'
|
345
|
-
expect(payload.title).to eq
|
460
|
+
expect(payload.title).to eq 'Unable to find the requested relationship'
|
346
461
|
expect(payload.pointer).to eq '/data/relationships/example/id'
|
347
462
|
expect(payload.detail).to eq "Unable to find 'persons' with matching id: \"foobar\""
|
348
463
|
end
|
@@ -368,14 +483,14 @@ describe FunWithJsonApi::Deserializer do
|
|
368
483
|
describe '#parse_{relationship}_ids' do
|
369
484
|
context 'with a ARModels::Author relationship with a "code" id param' do
|
370
485
|
let(:deserializer) do
|
371
|
-
author_deserializer_class = Class.new(
|
486
|
+
author_deserializer_class = Class.new(described_class) do
|
372
487
|
id_param 'code'
|
373
488
|
type 'persons'
|
374
489
|
resource_class ARModels::Author
|
375
490
|
end
|
376
491
|
|
377
492
|
# Build the Deserializer
|
378
|
-
Class.new(
|
493
|
+
Class.new(described_class) do
|
379
494
|
has_many :examples, author_deserializer_class
|
380
495
|
end.create
|
381
496
|
end
|
@@ -400,8 +515,8 @@ describe FunWithJsonApi::Deserializer do
|
|
400
515
|
payload = e.payload.first
|
401
516
|
expect(payload.status).to eq '404'
|
402
517
|
expect(payload.code).to eq 'missing_relationship'
|
403
|
-
expect(payload.title).to eq
|
404
|
-
expect(payload.pointer).to eq '/data/relationships/examples/id'
|
518
|
+
expect(payload.title).to eq 'Unable to find the requested relationship'
|
519
|
+
expect(payload.pointer).to eq '/data/relationships/examples/1/id'
|
405
520
|
expect(payload.detail).to eq "Unable to find 'persons' with matching id: \"blargh\""
|
406
521
|
end
|
407
522
|
end
|
@@ -418,15 +533,15 @@ describe FunWithJsonApi::Deserializer do
|
|
418
533
|
payload_a = e.payload.first
|
419
534
|
expect(payload_a.status).to eq '404'
|
420
535
|
expect(payload_a.code).to eq 'missing_relationship'
|
421
|
-
expect(payload_a.title).to eq
|
422
|
-
expect(payload_a.pointer).to eq '/data/relationships/examples/id'
|
536
|
+
expect(payload_a.title).to eq 'Unable to find the requested relationship'
|
537
|
+
expect(payload_a.pointer).to eq '/data/relationships/examples/0/id'
|
423
538
|
expect(payload_a.detail).to eq "Unable to find 'persons' with matching id: \"foobar\""
|
424
539
|
|
425
540
|
payload_b = e.payload.last
|
426
541
|
expect(payload_b.status).to eq '404'
|
427
542
|
expect(payload_b.code).to eq 'missing_relationship'
|
428
|
-
expect(payload_b.title).to eq
|
429
|
-
expect(payload_b.pointer).to eq '/data/relationships/examples/id'
|
543
|
+
expect(payload_b.title).to eq 'Unable to find the requested relationship'
|
544
|
+
expect(payload_b.pointer).to eq '/data/relationships/examples/1/id'
|
430
545
|
expect(payload_b.detail).to eq "Unable to find 'persons' with matching id: \"blargh\""
|
431
546
|
end
|
432
547
|
end
|