fun_with_json_api 0.0.7 → 0.0.8

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.
@@ -0,0 +1,177 @@
1
+ require 'spec_helper'
2
+
3
+ describe FunWithJsonApi::CollectionManager do
4
+ subject(:instance) { described_class.new(collection, deserializer_class, deserializer_options) }
5
+ let(:collection) { double('collection') }
6
+ let(:deserializer_class) { class_double('FunWithJsonApi::Deserializer', type: 'examples') }
7
+ let(:deserializer_options) { double('deserializer_options') }
8
+
9
+ describe '#load_collection' do
10
+ it 'calls FunWithJsonApi.load_collection with the document and the deserializers' do
11
+ document = double('document')
12
+
13
+ parsed_collection = double('parsed_collection')
14
+ expect(FunWithJsonApi).to receive(:find_collection)
15
+ .with(document, deserializer_class, deserializer_options)
16
+ .and_return(parsed_collection)
17
+
18
+ expect(instance.load_collection(document)).to eq parsed_collection
19
+ end
20
+ end
21
+
22
+ describe '#report_invalid_resources_at_index!' do
23
+ context 'with a resource index' do
24
+ let(:resource_index) { 42 }
25
+
26
+ context 'with a reason message as a string' do
27
+ let(:reason_message) { Faker::Lorem.sentence }
28
+
29
+ it 'raises a InvalidResource exception with the reason message as a detail' do
30
+ expect do
31
+ instance.report_invalid_resources_at_index! resource_index, reason_message
32
+ end.to raise_error(FunWithJsonApi::Exceptions::InvalidResource) do |e|
33
+ expect(e.payload.size).to eq 1
34
+
35
+ payload = e.payload.first
36
+ expect(payload.code).to eq 'invalid_resource'
37
+ expect(payload.title).to eq 'Unable to update the relationship with this resource'
38
+ expect(payload.detail).to eq reason_message
39
+ expect(payload.pointer).to eq '/data/42/id'
40
+ expect(payload.status).to eq '422'
41
+ end
42
+ end
43
+ end
44
+
45
+ context 'with a reason message as a callable' do
46
+ let(:reason_message) { Faker::Lorem.sentence }
47
+
48
+ it 'raises a InvalidResource exception by invoking call with the resource index' do
49
+ expect do
50
+ instance.report_invalid_resources_at_index!(
51
+ resource_index, ->(index) { "#{index}-#{reason_message}" }
52
+ )
53
+ end.to raise_error(FunWithJsonApi::Exceptions::InvalidResource) do |e|
54
+ expect(e.payload.size).to eq 1
55
+
56
+ payload = e.payload.first
57
+ expect(payload.code).to eq 'invalid_resource'
58
+ expect(payload.title).to eq 'Unable to update the relationship with this resource'
59
+ expect(payload.detail).to eq "42-#{reason_message}"
60
+ expect(payload.pointer).to eq '/data/42/id'
61
+ expect(payload.status).to eq '422'
62
+ end
63
+ end
64
+ end
65
+
66
+ context 'with a reason message not included' do
67
+ it 'raises a InvalidResource exception with a default reason message' do
68
+ expect do
69
+ instance.report_invalid_resources_at_index! resource_index
70
+ end.to raise_error(FunWithJsonApi::Exceptions::InvalidResource) do |e|
71
+ expect(e.payload.size).to eq 1
72
+
73
+ payload = e.payload.first
74
+ expect(payload.code).to eq 'invalid_resource'
75
+ expect(payload.title).to eq 'Unable to update the relationship with this resource'
76
+ expect(payload.detail).to eq "Unable to update the relationship with this 'examples'"
77
+ expect(payload.pointer).to eq '/data/42/id'
78
+ expect(payload.status).to eq '422'
79
+ end
80
+ end
81
+ end
82
+ end
83
+
84
+ context 'with multiple resource indexes' do
85
+ let(:resource_index) { [1, 3] }
86
+
87
+ context 'with a reason message as a string' do
88
+ let(:reason_message) { Faker::Lorem.sentence }
89
+
90
+ it 'raises a InvalidResource exception with a payload for each index' do
91
+ expect do
92
+ instance.report_invalid_resources_at_index! resource_index, reason_message
93
+ end.to raise_error(FunWithJsonApi::Exceptions::InvalidResource) do |e|
94
+ expect(e.payload.size).to eq 2
95
+
96
+ payload = e.payload.first
97
+ expect(payload.code).to eq 'invalid_resource'
98
+ expect(payload.title).to eq 'Unable to update the relationship with this resource'
99
+ expect(payload.detail).to eq reason_message
100
+ expect(payload.pointer).to eq '/data/1/id'
101
+ expect(payload.status).to eq '422'
102
+
103
+ payload = e.payload.second
104
+ expect(payload.code).to eq 'invalid_resource'
105
+ expect(payload.title).to eq 'Unable to update the relationship with this resource'
106
+ expect(payload.detail).to eq reason_message
107
+ expect(payload.pointer).to eq '/data/3/id'
108
+ expect(payload.status).to eq '422'
109
+ end
110
+ end
111
+ end
112
+ end
113
+ end
114
+
115
+ describe '#insert_records' do
116
+ it 'raises a RelationshipNotSupported exception' do
117
+ document = double('document')
118
+ expect do
119
+ instance.insert_records(document)
120
+ end.to raise_error(FunWithJsonApi::Exceptions::RelationshipMethodNotSupported) do |e|
121
+ expect(e.message).to eq(
122
+ 'Override FunWithJsonApi::CollectionManager#insert_records to implement insert'
123
+ )
124
+ expect(e.payload.size).to eq 1
125
+
126
+ payload = e.payload.first
127
+ expect(payload.code).to eq 'collection_method_not_supported'
128
+ expect(payload.title).to eq 'The current relationship does not support this action'
129
+ expect(payload.detail).to eq "Unable to insert 'examples' items from this endpoint"
130
+ expect(payload.pointer).to eq nil
131
+ expect(payload.status).to eq '403'
132
+ end
133
+ end
134
+ end
135
+
136
+ describe '#remove_records' do
137
+ it 'raises a RelationshipNotSupported exception' do
138
+ document = double('document')
139
+ expect do
140
+ instance.remove_records(document)
141
+ end.to raise_error(FunWithJsonApi::Exceptions::RelationshipMethodNotSupported) do |e|
142
+ expect(e.message).to eq(
143
+ 'Override FunWithJsonApi::CollectionManager#remove_records to implement remove'
144
+ )
145
+ expect(e.payload.size).to eq 1
146
+
147
+ payload = e.payload.first
148
+ expect(payload.code).to eq 'collection_method_not_supported'
149
+ expect(payload.title).to eq 'The current relationship does not support this action'
150
+ expect(payload.detail).to eq "Unable to remove 'examples' items from this endpoint"
151
+ expect(payload.pointer).to eq nil
152
+ expect(payload.status).to eq '403'
153
+ end
154
+ end
155
+ end
156
+
157
+ describe '#replace_all_records' do
158
+ it 'raises a RelationshipNotSupported exception' do
159
+ document = double('document')
160
+ expect do
161
+ instance.replace_all_records(document)
162
+ end.to raise_error(FunWithJsonApi::Exceptions::RelationshipMethodNotSupported) do |e|
163
+ expect(e.message).to eq(
164
+ 'Override FunWithJsonApi::CollectionManager#replace_all_records to implement replace all'
165
+ )
166
+ expect(e.payload.size).to eq 1
167
+
168
+ payload = e.payload.first
169
+ expect(payload.code).to eq 'collection_method_not_supported'
170
+ expect(payload.title).to eq 'The current relationship does not support this action'
171
+ expect(payload.detail).to eq "Unable to replace all 'examples' items from this endpoint"
172
+ expect(payload.pointer).to eq nil
173
+ expect(payload.status).to eq '403'
174
+ end
175
+ end
176
+ end
177
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fun_with_json_api
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.7
4
+ version: 0.0.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ben Morrall
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-03-31 00:00:00.000000000 Z
11
+ date: 2016-04-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -160,6 +160,7 @@ files:
160
160
  - lib/fun_with_json_api/attributes/relationship_collection.rb
161
161
  - lib/fun_with_json_api/attributes/string_attribute.rb
162
162
  - lib/fun_with_json_api/attributes/uuid_v4_attribute.rb
163
+ - lib/fun_with_json_api/collection_manager.rb
163
164
  - lib/fun_with_json_api/controller_methods.rb
164
165
  - lib/fun_with_json_api/deserializer.rb
165
166
  - lib/fun_with_json_api/deserializer_class_methods.rb
@@ -176,8 +177,10 @@ files:
176
177
  - lib/fun_with_json_api/exceptions/invalid_document_type.rb
177
178
  - lib/fun_with_json_api/exceptions/invalid_relationship.rb
178
179
  - lib/fun_with_json_api/exceptions/invalid_relationship_type.rb
180
+ - lib/fun_with_json_api/exceptions/invalid_resource.rb
179
181
  - lib/fun_with_json_api/exceptions/missing_relationship.rb
180
182
  - lib/fun_with_json_api/exceptions/missing_resource.rb
183
+ - lib/fun_with_json_api/exceptions/relationship_method_not_supported.rb
181
184
  - lib/fun_with_json_api/exceptions/unauthorized_resource.rb
182
185
  - lib/fun_with_json_api/exceptions/unknown_attribute.rb
183
186
  - lib/fun_with_json_api/exceptions/unknown_relationship.rb
@@ -231,6 +234,7 @@ files:
231
234
  - spec/dummy/public/500.html
232
235
  - spec/dummy/public/favicon.ico
233
236
  - spec/fixtures/active_record.rb
237
+ - spec/fun_with_json_api/collection_manager_spec.rb
234
238
  - spec/fun_with_json_api/controller_methods_spec.rb
235
239
  - spec/fun_with_json_api/deserializer_class_methods_spec.rb
236
240
  - spec/fun_with_json_api/deserializer_spec.rb
@@ -307,6 +311,7 @@ test_files:
307
311
  - spec/dummy/Rakefile
308
312
  - spec/dummy/README.rdoc
309
313
  - spec/fixtures/active_record.rb
314
+ - spec/fun_with_json_api/collection_manager_spec.rb
310
315
  - spec/fun_with_json_api/controller_methods_spec.rb
311
316
  - spec/fun_with_json_api/deserializer_class_methods_spec.rb
312
317
  - spec/fun_with_json_api/deserializer_spec.rb