acfs 1.4.0 → 1.7.0
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/CHANGELOG.md +26 -0
- data/README.md +22 -39
- data/acfs.gemspec +8 -14
- data/lib/acfs/adapter/base.rb +2 -0
- data/lib/acfs/adapter/typhoeus.rb +16 -11
- data/lib/acfs/collections/paginatable.rb +1 -1
- data/lib/acfs/configuration.rb +13 -3
- data/lib/acfs/errors.rb +41 -21
- data/lib/acfs/global.rb +2 -2
- data/lib/acfs/location.rb +26 -32
- data/lib/acfs/middleware/base.rb +2 -2
- data/lib/acfs/middleware/json.rb +4 -2
- data/lib/acfs/middleware/logger.rb +4 -6
- data/lib/acfs/middleware/serializer.rb +1 -1
- data/lib/acfs/operation.rb +21 -8
- data/lib/acfs/request/callbacks.rb +4 -4
- data/lib/acfs/request.rb +4 -11
- data/lib/acfs/resource/attributes/date_time.rb +1 -1
- data/lib/acfs/resource/attributes/uuid.rb +1 -1
- data/lib/acfs/resource/attributes.rb +16 -15
- data/lib/acfs/resource/dirty.rb +2 -2
- data/lib/acfs/resource/initialization.rb +5 -5
- data/lib/acfs/resource/locatable.rb +11 -8
- data/lib/acfs/resource/operational.rb +6 -3
- data/lib/acfs/resource/persistence.rb +13 -15
- data/lib/acfs/resource/query_methods.rb +10 -10
- data/lib/acfs/resource/service.rb +2 -2
- data/lib/acfs/resource/validation.rb +17 -7
- data/lib/acfs/response.rb +5 -5
- data/lib/acfs/runner.rb +15 -15
- data/lib/acfs/service.rb +16 -19
- data/lib/acfs/singleton_resource.rb +2 -2
- data/lib/acfs/stub.rb +41 -31
- data/lib/acfs/version.rb +2 -2
- data/spec/acfs/adapter/typhoeus_spec.rb +2 -2
- data/spec/acfs/collection_spec.rb +66 -41
- data/spec/acfs/configuration_spec.rb +22 -12
- data/spec/acfs/global_spec.rb +11 -9
- data/spec/acfs/location_spec.rb +2 -2
- data/spec/acfs/middleware/json_spec.rb +22 -8
- data/spec/acfs/middleware/{msgpack_spec.rb → message_pack_spec.rb} +6 -6
- data/spec/acfs/operation_spec.rb +3 -2
- data/spec/acfs/request/callbacks_spec.rb +19 -10
- data/spec/acfs/request_spec.rb +16 -20
- data/spec/acfs/resource/attributes/boolean_spec.rb +32 -32
- data/spec/acfs/resource/attributes/date_time_spec.rb +16 -8
- data/spec/acfs/resource/attributes/dict_spec.rb +15 -9
- data/spec/acfs/resource/attributes/float_spec.rb +20 -10
- data/spec/acfs/resource/attributes/integer_spec.rb +10 -5
- data/spec/acfs/resource/attributes/list_spec.rb +13 -8
- data/spec/acfs/resource/attributes/uuid_spec.rb +12 -6
- data/spec/acfs/resource/attributes_spec.rb +37 -38
- data/spec/acfs/resource/dirty_spec.rb +6 -3
- data/spec/acfs/resource/initialization_spec.rb +4 -5
- data/spec/acfs/resource/loadable_spec.rb +3 -1
- data/spec/acfs/resource/locatable_spec.rb +24 -18
- data/spec/acfs/resource/{persistance_spec.rb → persistence_spec.rb} +122 -90
- data/spec/acfs/resource/query_methods_spec.rb +143 -110
- data/spec/acfs/resource/validation_spec.rb +34 -27
- data/spec/acfs/response/formats_spec.rb +8 -8
- data/spec/acfs/response/status_spec.rb +16 -9
- data/spec/acfs/runner_spec.rb +10 -8
- data/spec/acfs/service/middleware_spec.rb +3 -3
- data/spec/acfs/service_spec.rb +6 -5
- data/spec/acfs/singleton_resource_spec.rb +2 -1
- data/spec/acfs/stub_spec.rb +57 -53
- data/spec/acfs_spec.rb +111 -93
- data/spec/spec_helper.rb +1 -2
- data/spec/support/response.rb +2 -2
- data/spec/support/service.rb +1 -1
- data/spec/support/shared/find_callbacks.rb +14 -10
- metadata +30 -29
data/spec/acfs/stub_spec.rb
CHANGED
@@ -7,8 +7,9 @@ class SpecialCustomError < StandardError; end
|
|
7
7
|
describe Acfs::Stub do
|
8
8
|
let(:stub) { Class.new(Acfs::Stub) }
|
9
9
|
|
10
|
-
before(:all) { Acfs::Stub.enable }
|
11
|
-
|
10
|
+
before(:all) { Acfs::Stub.enable } # rubocop:disable RSpec/BeforeAfterAll
|
11
|
+
|
12
|
+
after(:all) { Acfs::Stub.disable } # rubocop:disable RSpec/BeforeAfterAll
|
12
13
|
|
13
14
|
before do
|
14
15
|
Acfs::Stub.allow_requests = false
|
@@ -16,16 +17,18 @@ describe Acfs::Stub do
|
|
16
17
|
|
17
18
|
describe '#called?' do
|
18
19
|
context 'without specified number' do
|
19
|
-
let!(:operation)
|
20
|
+
let!(:operation) do
|
21
|
+
Acfs::Stub.resource MyUser, :read, with: {id: 1}, return: {id: 1, name: 'John Smith', age: 32}
|
22
|
+
end
|
20
23
|
|
21
|
-
it '
|
24
|
+
it 'allows to test if stub was called' do
|
22
25
|
MyUser.find 1
|
23
26
|
Acfs.run
|
24
27
|
|
25
28
|
expect(operation).to be_called
|
26
29
|
end
|
27
30
|
|
28
|
-
it '
|
31
|
+
it 'allows to test if stub was called a specific number of times' do
|
29
32
|
MyUser.find 1
|
30
33
|
Acfs.run
|
31
34
|
|
@@ -44,7 +47,7 @@ describe Acfs::Stub do
|
|
44
47
|
Acfs::Stub.resource MyUser, :read, with: {id: 1}, raise: :not_found
|
45
48
|
end
|
46
49
|
|
47
|
-
it '
|
50
|
+
it 'raises error' do
|
48
51
|
MyUser.find 1
|
49
52
|
|
50
53
|
expect { Acfs.run }.to raise_error(Acfs::AmbiguousStubError)
|
@@ -58,23 +61,23 @@ describe Acfs::Stub do
|
|
58
61
|
Acfs::Stub.resource MyUser, :read, with: {id: 3}, raise: :not_found
|
59
62
|
end
|
60
63
|
|
61
|
-
it '
|
64
|
+
it 'allows to stub resource reads' do
|
62
65
|
user = MyUser.find 1
|
63
66
|
Acfs.run
|
64
67
|
|
65
|
-
expect(user.id).to
|
66
|
-
expect(user.name).to
|
67
|
-
expect(user.age).to
|
68
|
+
expect(user.id).to eq 1
|
69
|
+
expect(user.name).to eq 'John Smith'
|
70
|
+
expect(user.age).to eq 32
|
68
71
|
end
|
69
72
|
|
70
73
|
context 'with error' do
|
71
|
-
it '
|
74
|
+
it 'allows to raise errors' do
|
72
75
|
MyUser.find 2
|
73
76
|
|
74
77
|
expect { Acfs.run }.to raise_error(SpecialCustomError)
|
75
78
|
end
|
76
79
|
|
77
|
-
it '
|
80
|
+
it 'allows to raise symbolic errors' do
|
78
81
|
MyUser.find 3
|
79
82
|
|
80
83
|
expect { Acfs.run }.to raise_error(Acfs::ResourceNotFound)
|
@@ -87,7 +90,7 @@ describe Acfs::Stub do
|
|
87
90
|
Acfs::Stub.resource Computer, :read, with: {id: 2}, return: {id: 2, type: 'Mac'}
|
88
91
|
end
|
89
92
|
|
90
|
-
it '
|
93
|
+
it 'creates inherited type' do
|
91
94
|
pc = Computer.find 1
|
92
95
|
mac = Computer.find 2
|
93
96
|
|
@@ -101,18 +104,26 @@ describe Acfs::Stub do
|
|
101
104
|
|
102
105
|
context 'with create action' do
|
103
106
|
before do
|
104
|
-
|
105
|
-
|
107
|
+
lmbd = lambda {|op|
|
108
|
+
op.data[:ident] == 'john@exmaple.org' && op.data[:password] == 'wrong'
|
109
|
+
}
|
110
|
+
|
111
|
+
Acfs::Stub.resource Session, :create,
|
112
|
+
with: {ident: 'john@exmaple.org', password: 's3cr3t'},
|
113
|
+
return: {id: 'longhash', user: 1}
|
114
|
+
Acfs::Stub.resource Session, :create,
|
115
|
+
with: lmbd,
|
116
|
+
raise: 422
|
106
117
|
end
|
107
118
|
|
108
|
-
it '
|
119
|
+
it 'allows stub resource creation' do
|
109
120
|
session = Session.create! ident: 'john@exmaple.org', password: 's3cr3t'
|
110
121
|
|
111
|
-
expect(session.id).to
|
112
|
-
expect(session.user).to
|
122
|
+
expect(session.id).to eq 'longhash'
|
123
|
+
expect(session.user).to eq 1
|
113
124
|
end
|
114
125
|
|
115
|
-
it '
|
126
|
+
it 'allows to raise error' do
|
116
127
|
expect do
|
117
128
|
Session.create! ident: 'john@exmaple.org', password: 'wrong'
|
118
129
|
end.to raise_error(::Acfs::InvalidResource)
|
@@ -125,14 +136,14 @@ describe Acfs::Stub do
|
|
125
136
|
return: [{id: 1, name: 'John Smith', age: 32}, {id: 2, name: 'Anon', age: 12}]
|
126
137
|
end
|
127
138
|
|
128
|
-
it '
|
139
|
+
it 'returns collection' do
|
129
140
|
users = MyUser.all
|
130
141
|
Acfs.run
|
131
142
|
|
132
143
|
expect(users).to have(2).items
|
133
144
|
end
|
134
145
|
|
135
|
-
it '
|
146
|
+
it 'returns defined resources' do
|
136
147
|
users = MyUser.all
|
137
148
|
Acfs.run
|
138
149
|
|
@@ -148,7 +159,7 @@ describe Acfs::Stub do
|
|
148
159
|
return: [{id: 1, type: 'PC'}, {id: 2, type: 'Mac'}]
|
149
160
|
end
|
150
161
|
|
151
|
-
it '
|
162
|
+
it 'creates inherited type' do
|
152
163
|
computers = Computer.all
|
153
164
|
Acfs.run
|
154
165
|
|
@@ -158,6 +169,11 @@ describe Acfs::Stub do
|
|
158
169
|
end
|
159
170
|
|
160
171
|
context 'with header' do
|
172
|
+
subject do
|
173
|
+
Acfs.run
|
174
|
+
comments
|
175
|
+
end
|
176
|
+
|
161
177
|
before do
|
162
178
|
Acfs::Stub.resource Comment, :list,
|
163
179
|
return: [{id: 1, text: 'Foo'}, {id: 2, text: 'Bar'}],
|
@@ -168,40 +184,40 @@ describe Acfs::Stub do
|
|
168
184
|
let(:headers) do
|
169
185
|
{
|
170
186
|
'X-Total-Pages' => '2',
|
171
|
-
'X-Total-Count' => '10'
|
187
|
+
'X-Total-Count' => '10',
|
172
188
|
}
|
173
189
|
end
|
174
|
-
subject { Acfs.run; comments }
|
175
190
|
|
176
|
-
its(:total_pages) {
|
177
|
-
its(:total_count) {
|
191
|
+
its(:total_pages) { is_expected.to eq 2 }
|
192
|
+
its(:total_count) { is_expected.to eq 10 }
|
178
193
|
end
|
179
194
|
end
|
180
195
|
|
181
196
|
context 'with update action' do
|
182
197
|
before do
|
183
198
|
Acfs::Stub.resource MyUser, :read, with: {id: 1}, return: {id: 1, name: 'John Smith', age: 32}
|
184
|
-
Acfs::Stub.resource MyUser, :update, with: {id: 1, name: 'John Smith', age: 22},
|
199
|
+
Acfs::Stub.resource MyUser, :update, with: {id: 1, name: 'John Smith', age: 22},
|
200
|
+
return: {id: 1, name: 'John Smith', age: 23}
|
185
201
|
Acfs::Stub.resource MyUser, :update, with: {id: 1, name: 'John Smith', age: 0}, raise: 422
|
186
202
|
end
|
187
203
|
|
188
204
|
let!(:update_stub) do
|
189
205
|
Acfs::Stub.resource MyUser, :update,
|
190
206
|
with: {id: 1, name: 'Jane Smith'},
|
191
|
-
return: ->(op) {
|
207
|
+
return: ->(op) { op.data.map {|k, v| [k, v.to_s.upcase] }.to_h }
|
192
208
|
end
|
193
209
|
|
194
|
-
it '
|
210
|
+
it 'allows stub resource update' do
|
195
211
|
user = MyUser.find 1
|
196
212
|
Acfs.run
|
197
213
|
|
198
214
|
user.age = 22
|
199
215
|
user.save!
|
200
216
|
|
201
|
-
expect(user.age).to
|
217
|
+
expect(user.age).to eq 23
|
202
218
|
end
|
203
219
|
|
204
|
-
it '
|
220
|
+
it 'allows to raise error' do
|
205
221
|
user = MyUser.find 1
|
206
222
|
Acfs.run
|
207
223
|
|
@@ -213,7 +229,7 @@ describe Acfs::Stub do
|
|
213
229
|
end.to raise_error(::Acfs::InvalidResource)
|
214
230
|
end
|
215
231
|
|
216
|
-
it '
|
232
|
+
it 'matches partial :with' do
|
217
233
|
user = MyUser.find 1
|
218
234
|
Acfs.run
|
219
235
|
|
@@ -224,7 +240,7 @@ describe Acfs::Stub do
|
|
224
240
|
expect(update_stub).to be_called
|
225
241
|
end
|
226
242
|
|
227
|
-
it '
|
243
|
+
it 'processes response body' do
|
228
244
|
user = MyUser.find 1
|
229
245
|
Acfs.run
|
230
246
|
|
@@ -235,18 +251,6 @@ describe Acfs::Stub do
|
|
235
251
|
expect(user.name).to eq 'JANE SMITH'
|
236
252
|
end
|
237
253
|
end
|
238
|
-
|
239
|
-
context 'with create action' do
|
240
|
-
before do
|
241
|
-
Acfs::Stub.resource MyUser, :create, with: {name: 'John Smith', age: 0}, raise: 422
|
242
|
-
end
|
243
|
-
|
244
|
-
it 'should allow to raise error' do
|
245
|
-
expect do
|
246
|
-
MyUser.create! name: 'John Smith', age: 0
|
247
|
-
end.to raise_error(::Acfs::InvalidResource)
|
248
|
-
end
|
249
|
-
end
|
250
254
|
end
|
251
255
|
|
252
256
|
describe '.allow_requests=' do
|
@@ -256,9 +260,9 @@ describe Acfs::Stub do
|
|
256
260
|
stub_request(:get, 'http://users.example.org/users/2').to_return response(id: 2, name: 'John', age: 26)
|
257
261
|
end
|
258
262
|
|
259
|
-
it '
|
263
|
+
it 'allows real requests' do
|
260
264
|
@user = MyUser.find 2
|
261
|
-
expect { Acfs.run }.
|
265
|
+
expect { Acfs.run }.not_to raise_error
|
262
266
|
end
|
263
267
|
end
|
264
268
|
|
@@ -267,7 +271,7 @@ describe Acfs::Stub do
|
|
267
271
|
Acfs::Stub.allow_requests = false
|
268
272
|
end
|
269
273
|
|
270
|
-
it '
|
274
|
+
it 'does not allow real requests' do
|
271
275
|
@user = MyUser.find 2
|
272
276
|
expect { Acfs.run }.to raise_error(Acfs::RealRequestsNotAllowedError)
|
273
277
|
end
|
@@ -279,7 +283,7 @@ describe Acfs::Stub do
|
|
279
283
|
|
280
284
|
context 'with a match in params' do
|
281
285
|
let(:op) do
|
282
|
-
|
286
|
+
instance_double('Acfs::Operation').tap do |op|
|
283
287
|
allow(op).to receive(:full_params).and_return(id: 1337, blub: 'abc')
|
284
288
|
allow(op).to receive(:data).and_return({})
|
285
289
|
end
|
@@ -292,7 +296,7 @@ describe Acfs::Stub do
|
|
292
296
|
|
293
297
|
context 'with a match in data' do
|
294
298
|
let(:op) do
|
295
|
-
|
299
|
+
instance_double('Acfs::Operation').tap do |op|
|
296
300
|
allow(op).to receive(:full_params).and_return({})
|
297
301
|
allow(op).to receive(:data).and_return(id: 1337, blub: 'abc')
|
298
302
|
end
|
@@ -305,7 +309,7 @@ describe Acfs::Stub do
|
|
305
309
|
|
306
310
|
context 'with no match in params nor data' do
|
307
311
|
let(:op) do
|
308
|
-
|
312
|
+
instance_double('Acfs::Operation').tap do |op|
|
309
313
|
allow(op).to receive(:full_params).and_return(id: 1337)
|
310
314
|
allow(op).to receive(:data).and_return({})
|
311
315
|
end
|
@@ -318,7 +322,7 @@ describe Acfs::Stub do
|
|
318
322
|
|
319
323
|
context 'with a wrong match' do
|
320
324
|
let(:op) do
|
321
|
-
|
325
|
+
instance_double('Acfs::Operation').tap do |op|
|
322
326
|
allow(op).to receive(:full_params).and_return(id: 1337, blub: 'abc')
|
323
327
|
allow(op).to receive(:data).and_return({})
|
324
328
|
end
|
@@ -331,7 +335,7 @@ describe Acfs::Stub do
|
|
331
335
|
|
332
336
|
context 'with a missing match' do
|
333
337
|
let(:op) do
|
334
|
-
|
338
|
+
instance_double('Acfs::Operation').tap do |op|
|
335
339
|
allow(op).to receive(:full_params).and_return(id: 1337, blub: 'abc')
|
336
340
|
allow(op).to receive(:data).and_return({})
|
337
341
|
end
|
data/spec/acfs_spec.rb
CHANGED
@@ -4,57 +4,68 @@ require 'spec_helper'
|
|
4
4
|
|
5
5
|
describe 'Acfs' do
|
6
6
|
before do
|
7
|
-
stub_request(:get, 'http://users.example.org/users')
|
8
|
-
|
9
|
-
|
10
|
-
stub_request(:get, 'http://users.example.org/users/
|
11
|
-
|
12
|
-
|
7
|
+
stub_request(:get, 'http://users.example.org/users')
|
8
|
+
.to_return response([{id: 1, name: 'Anon', age: 12}, {id: 2, name: 'John', age: 26}])
|
9
|
+
|
10
|
+
stub_request(:get, 'http://users.example.org/users/2')
|
11
|
+
.to_return response(id: 2, name: 'John', age: 26)
|
12
|
+
|
13
|
+
stub_request(:get, 'http://users.example.org/users/3')
|
14
|
+
.to_return response(id: 3, name: 'Miraculix', age: 122)
|
15
|
+
|
16
|
+
stub_request(:get, 'http://users.example.org/users/100')
|
17
|
+
.to_return response(id: 100, name: 'Jimmy', age: 45)
|
18
|
+
|
19
|
+
stub_request(:get, 'http://users.example.org/users/2/friends')
|
20
|
+
.to_return response([{id: 1, name: 'Anon', age: 12}])
|
21
|
+
|
22
|
+
stub_request(:get, 'http://comments.example.org/comments?user=2')
|
23
|
+
.to_return response([{id: 1, text: 'Comment #1'}, {id: 2, text: 'Comment #2'}])
|
13
24
|
end
|
14
25
|
|
15
|
-
it '
|
26
|
+
it 'updates single resource synchronously' do
|
16
27
|
stub = stub_request(:put, 'http://users.example.org/users/2')
|
17
|
-
|
28
|
+
.to_return {|request| {body: request.body, headers: {'Content-Type' => request.headers['Content-Type']}} }
|
18
29
|
|
19
|
-
|
30
|
+
user = MyUser.find 2
|
20
31
|
Acfs.run
|
21
32
|
|
22
|
-
expect(
|
23
|
-
expect(
|
33
|
+
expect(user).not_to be_changed
|
34
|
+
expect(user).to be_persisted
|
24
35
|
|
25
|
-
|
36
|
+
user.name = 'Johnny'
|
26
37
|
|
27
|
-
expect(
|
28
|
-
expect(
|
38
|
+
expect(user).to be_changed
|
39
|
+
expect(user).to be_persisted
|
29
40
|
|
30
|
-
|
41
|
+
user.save
|
31
42
|
|
32
43
|
expect(stub).to have_been_requested
|
33
|
-
expect(
|
34
|
-
expect(
|
44
|
+
expect(user).not_to be_changed
|
45
|
+
expect(user).to be_persisted
|
35
46
|
end
|
36
47
|
|
37
|
-
it '
|
48
|
+
it 'creates a single resource synchronously' do
|
38
49
|
stub = stub_request(:post, 'http://users.example.org/sessions').to_return response(id: 'sessionhash', user: 1)
|
39
50
|
|
40
51
|
session = Session.create ident: 'Anon'
|
41
52
|
|
42
53
|
expect(stub).to have_been_requested
|
43
|
-
expect(session.id).to
|
44
|
-
expect(session.user).to
|
54
|
+
expect(session.id).to eq 'sessionhash'
|
55
|
+
expect(session.user).to eq 1
|
45
56
|
end
|
46
57
|
|
47
|
-
it '
|
48
|
-
|
58
|
+
it 'loads single resource' do
|
59
|
+
user = MyUser.find(2)
|
49
60
|
|
50
|
-
expect(
|
61
|
+
expect(user).not_to be_loaded
|
51
62
|
|
52
63
|
Acfs.run
|
53
64
|
|
54
|
-
expect(
|
55
|
-
expect(
|
56
|
-
expect(
|
57
|
-
expect(
|
65
|
+
expect(user).to be_loaded
|
66
|
+
expect(user.id).to eq 2
|
67
|
+
expect(user.name).to eq 'John'
|
68
|
+
expect(user.age).to eq 26
|
58
69
|
end
|
59
70
|
|
60
71
|
describe 'singleton' do
|
@@ -62,144 +73,151 @@ describe 'Acfs' do
|
|
62
73
|
stub_request(:get, 'http://users.example.org/singles?user_id=5').to_return response(score: 250, user_id: 5)
|
63
74
|
end
|
64
75
|
|
65
|
-
it '
|
76
|
+
it 'creates a singleton resource' do
|
66
77
|
stub = stub_request(:post, 'http://users.example.org/singles').to_return response(score: 250, user_id: 5)
|
67
78
|
|
68
|
-
|
69
|
-
expect(
|
79
|
+
single = Single.new user_id: 5, score: 250
|
80
|
+
expect(single.new?).to eq true
|
70
81
|
|
71
|
-
|
82
|
+
single.save
|
72
83
|
expect(stub).to have_been_requested
|
73
84
|
|
74
|
-
expect(
|
75
|
-
expect(
|
76
|
-
expect(
|
85
|
+
expect(single.new?).to eq false
|
86
|
+
expect(single.user_id).to eq 5
|
87
|
+
expect(single.score).to eq 250
|
77
88
|
end
|
78
89
|
|
79
|
-
it '
|
80
|
-
|
90
|
+
it 'loads singleton resource' do
|
91
|
+
single = Single.find user_id: 5
|
81
92
|
Acfs.run
|
82
93
|
|
83
|
-
expect(
|
94
|
+
expect(single.score).to eq 250
|
84
95
|
end
|
85
96
|
|
86
|
-
it '
|
97
|
+
it 'updates singleton resource' do
|
87
98
|
stub = stub_request(:put, 'http://users.example.org/singles').to_return do |request|
|
88
99
|
{
|
89
100
|
body: request.body,
|
90
|
-
headers: {'Content-Type' => request.headers['Content-Type']}
|
101
|
+
headers: {'Content-Type' => request.headers['Content-Type']},
|
91
102
|
}
|
92
103
|
end
|
93
104
|
|
94
|
-
|
105
|
+
single = Single.find user_id: 5
|
95
106
|
Acfs.run
|
96
107
|
|
97
|
-
expect(
|
108
|
+
expect(single.score).to eq 250
|
98
109
|
|
99
|
-
|
100
|
-
|
110
|
+
single.score = 300
|
111
|
+
single.save
|
101
112
|
|
102
113
|
expect(stub).to have_been_requested
|
103
114
|
|
104
|
-
expect(
|
115
|
+
expect(single.score).to eq 300
|
105
116
|
end
|
106
117
|
|
107
|
-
it '
|
118
|
+
it 'deletes singleton resource' do
|
108
119
|
stub = stub_request(:delete, 'http://users.example.org/singles').to_return do |request|
|
109
120
|
{
|
110
121
|
body: request.body,
|
111
|
-
headers: {'Content-Type' => request.headers['Content-Type']}
|
122
|
+
headers: {'Content-Type' => request.headers['Content-Type']},
|
112
123
|
}
|
113
124
|
end
|
114
125
|
|
115
|
-
|
126
|
+
single = Single.find user_id: 5
|
116
127
|
Acfs.run
|
117
128
|
|
118
|
-
expect(
|
129
|
+
expect(single.new?).to eq false
|
119
130
|
|
120
|
-
|
131
|
+
single.delete
|
121
132
|
|
122
133
|
expect(stub).to have_been_requested
|
123
134
|
end
|
124
135
|
|
125
|
-
it '
|
136
|
+
it 'raises error when calling .all' do
|
126
137
|
expect { Single.all }.to raise_error ::Acfs::UnsupportedOperation
|
127
138
|
end
|
128
139
|
end
|
129
140
|
|
130
|
-
it '
|
131
|
-
|
141
|
+
it 'loads multiple single resources' do
|
142
|
+
john = nil
|
143
|
+
mirx = nil
|
144
|
+
jimy = nil
|
145
|
+
|
146
|
+
users = MyUser.find([2, 3, 100]) do |users|
|
132
147
|
# This block should be called only after *all* resources are loaded.
|
133
|
-
|
134
|
-
|
135
|
-
|
148
|
+
john = users[0]
|
149
|
+
mirx = users[1]
|
150
|
+
jimy = users[2]
|
136
151
|
end
|
137
152
|
|
138
|
-
expect(
|
153
|
+
expect(users).not_to be_loaded
|
139
154
|
|
140
155
|
Acfs.run
|
141
156
|
|
142
|
-
expect(
|
143
|
-
expect(
|
157
|
+
expect(users).to be_loaded
|
158
|
+
expect(users).to have(3).items
|
144
159
|
|
145
|
-
expect(
|
146
|
-
expect(
|
147
|
-
expect(
|
148
|
-
expect(
|
160
|
+
expect(users[0].id).to eq 2
|
161
|
+
expect(users[0].name).to eq 'John'
|
162
|
+
expect(users[0].age).to eq 26
|
163
|
+
expect(users[0]).to eq john
|
149
164
|
|
150
|
-
expect(
|
151
|
-
expect(
|
152
|
-
expect(
|
153
|
-
expect(
|
165
|
+
expect(users[1].id).to eq 3
|
166
|
+
expect(users[1].name).to eq 'Miraculix'
|
167
|
+
expect(users[1].age).to eq 122
|
168
|
+
expect(users[1]).to eq mirx
|
154
169
|
|
155
|
-
expect(
|
156
|
-
expect(
|
157
|
-
expect(
|
158
|
-
expect(
|
170
|
+
expect(users[2].id).to eq 100
|
171
|
+
expect(users[2].name).to eq 'Jimmy'
|
172
|
+
expect(users[2].age).to eq 45
|
173
|
+
expect(users[2]).to eq jimy
|
159
174
|
end
|
160
175
|
|
161
|
-
it '
|
162
|
-
|
176
|
+
it 'loads multiple resources' do
|
177
|
+
users = MyUser.all
|
163
178
|
|
164
|
-
expect(
|
179
|
+
expect(users).not_to be_loaded
|
165
180
|
|
166
181
|
Acfs.run
|
167
182
|
|
168
|
-
expect(
|
169
|
-
expect(
|
170
|
-
expect(
|
171
|
-
expect(
|
172
|
-
expect(
|
173
|
-
expect(
|
183
|
+
expect(users).to be_loaded
|
184
|
+
expect(users).to have(2).items
|
185
|
+
expect(users[0].name).to eq 'Anon'
|
186
|
+
expect(users[0].age).to eq 12
|
187
|
+
expect(users[1].name).to eq 'John'
|
188
|
+
expect(users[1].age).to eq 26
|
174
189
|
end
|
175
190
|
|
176
|
-
it '
|
191
|
+
it 'loads associated resources' do
|
177
192
|
pending 'TODO: Implement high level feature'
|
193
|
+
friends = nil
|
178
194
|
|
179
|
-
|
180
|
-
|
195
|
+
user = MyUser.find(2) do |user|
|
196
|
+
friends = user.friends.all
|
181
197
|
end
|
182
198
|
|
183
199
|
Acfs.run
|
184
200
|
|
185
|
-
expect(
|
186
|
-
expect(
|
201
|
+
expect(user.name).to eq 'John'
|
202
|
+
expect(user.age).to eq 26
|
187
203
|
|
188
|
-
expect(
|
204
|
+
expect(friends).to have(1).items
|
189
205
|
end
|
190
206
|
|
191
|
-
it '
|
192
|
-
|
193
|
-
|
194
|
-
|
207
|
+
it 'loads associated resources from different service' do
|
208
|
+
comments = nil
|
209
|
+
|
210
|
+
user = MyUser.find 2 do |user|
|
211
|
+
expect(user.id).to eq 2
|
212
|
+
comments = Comment.where({user: user.id})
|
195
213
|
end
|
196
214
|
|
197
215
|
Acfs.run
|
198
216
|
|
199
|
-
expect(
|
200
|
-
expect(
|
201
|
-
expect(
|
217
|
+
expect(user.id).to eq 2
|
218
|
+
expect(user.name).to eq 'John'
|
219
|
+
expect(user.age).to eq 26
|
202
220
|
|
203
|
-
expect(
|
221
|
+
expect(comments).to have(2).items
|
204
222
|
end
|
205
223
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -17,7 +17,6 @@ require 'bundler'
|
|
17
17
|
Bundler.require(:default, :test)
|
18
18
|
|
19
19
|
require 'acfs'
|
20
|
-
require 'webmock/rspec'
|
21
20
|
|
22
21
|
Dir[File.expand_path('spec/support/**/*.rb')].sort.each {|f| require f }
|
23
22
|
|
@@ -36,7 +35,7 @@ RSpec.configure do |config|
|
|
36
35
|
# --seed 1234
|
37
36
|
config.order = 'random'
|
38
37
|
|
39
|
-
config.before
|
38
|
+
config.before do
|
40
39
|
Acfs.runner.clear
|
41
40
|
Acfs::Stub.clear
|
42
41
|
end
|
data/spec/support/response.rb
CHANGED
@@ -4,9 +4,9 @@ require 'json'
|
|
4
4
|
|
5
5
|
def response(data = nil, opts = {})
|
6
6
|
if data
|
7
|
-
opts
|
7
|
+
opts[:body] = JSON.dump(data)
|
8
8
|
opts[:headers] ||= {}
|
9
|
-
opts[:headers]
|
9
|
+
opts[:headers]['Content-Type'] = 'application/json'
|
10
10
|
end
|
11
11
|
opts
|
12
12
|
end
|