acfs 1.3.2 → 1.3.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- metadata +8 -141
- data/CHANGELOG.md +0 -325
- data/LICENSE +0 -22
- data/README.md +0 -334
- data/acfs.gemspec +0 -37
- data/lib/acfs.rb +0 -49
- data/lib/acfs/adapter/base.rb +0 -26
- data/lib/acfs/adapter/typhoeus.rb +0 -60
- data/lib/acfs/collection.rb +0 -27
- data/lib/acfs/collections/paginatable.rb +0 -75
- data/lib/acfs/configuration.rb +0 -113
- data/lib/acfs/errors.rb +0 -106
- data/lib/acfs/global.rb +0 -99
- data/lib/acfs/location.rb +0 -78
- data/lib/acfs/middleware/base.rb +0 -20
- data/lib/acfs/middleware/json.rb +0 -27
- data/lib/acfs/middleware/logger.rb +0 -23
- data/lib/acfs/middleware/msgpack.rb +0 -30
- data/lib/acfs/middleware/print.rb +0 -21
- data/lib/acfs/middleware/serializer.rb +0 -39
- data/lib/acfs/operation.rb +0 -81
- data/lib/acfs/request.rb +0 -36
- data/lib/acfs/request/callbacks.rb +0 -50
- data/lib/acfs/resource.rb +0 -37
- data/lib/acfs/resource/attributes.rb +0 -268
- data/lib/acfs/resource/attributes/base.rb +0 -28
- data/lib/acfs/resource/attributes/boolean.rb +0 -37
- data/lib/acfs/resource/attributes/date_time.rb +0 -31
- data/lib/acfs/resource/attributes/dict.rb +0 -37
- data/lib/acfs/resource/attributes/float.rb +0 -31
- data/lib/acfs/resource/attributes/integer.rb +0 -27
- data/lib/acfs/resource/attributes/list.rb +0 -34
- data/lib/acfs/resource/attributes/string.rb +0 -24
- data/lib/acfs/resource/attributes/uuid.rb +0 -47
- data/lib/acfs/resource/dirty.rb +0 -35
- data/lib/acfs/resource/initialization.rb +0 -29
- data/lib/acfs/resource/loadable.rb +0 -33
- data/lib/acfs/resource/locatable.rb +0 -128
- data/lib/acfs/resource/operational.rb +0 -22
- data/lib/acfs/resource/persistence.rb +0 -257
- data/lib/acfs/resource/query_methods.rb +0 -264
- data/lib/acfs/resource/service.rb +0 -42
- data/lib/acfs/resource/validation.rb +0 -37
- data/lib/acfs/response.rb +0 -28
- data/lib/acfs/response/formats.rb +0 -25
- data/lib/acfs/response/status.rb +0 -31
- data/lib/acfs/rspec.rb +0 -11
- data/lib/acfs/runner.rb +0 -97
- data/lib/acfs/service.rb +0 -91
- data/lib/acfs/service/middleware.rb +0 -56
- data/lib/acfs/service/middleware/stack.rb +0 -63
- data/lib/acfs/singleton_resource.rb +0 -83
- data/lib/acfs/stub.rb +0 -172
- data/lib/acfs/util.rb +0 -20
- data/lib/acfs/version.rb +0 -14
- data/lib/acfs/yard.rb +0 -5
- data/spec/acfs/adapter/typhoeus_spec.rb +0 -28
- data/spec/acfs/collection_spec.rb +0 -155
- data/spec/acfs/configuration_spec.rb +0 -51
- data/spec/acfs/global_spec.rb +0 -137
- data/spec/acfs/location_spec.rb +0 -23
- data/spec/acfs/middleware/json_spec.rb +0 -63
- data/spec/acfs/middleware/msgpack_spec.rb +0 -60
- data/spec/acfs/operation_spec.rb +0 -10
- data/spec/acfs/request/callbacks_spec.rb +0 -46
- data/spec/acfs/request_spec.rb +0 -77
- data/spec/acfs/resource/attributes/boolean_spec.rb +0 -56
- data/spec/acfs/resource/attributes/date_time_spec.rb +0 -49
- data/spec/acfs/resource/attributes/dict_spec.rb +0 -75
- data/spec/acfs/resource/attributes/float_spec.rb +0 -59
- data/spec/acfs/resource/attributes/integer_spec.rb +0 -34
- data/spec/acfs/resource/attributes/list_spec.rb +0 -58
- data/spec/acfs/resource/attributes/uuid_spec.rb +0 -40
- data/spec/acfs/resource/attributes_spec.rb +0 -179
- data/spec/acfs/resource/dirty_spec.rb +0 -47
- data/spec/acfs/resource/initialization_spec.rb +0 -30
- data/spec/acfs/resource/loadable_spec.rb +0 -20
- data/spec/acfs/resource/locatable_spec.rb +0 -116
- data/spec/acfs/resource/persistance_spec.rb +0 -316
- data/spec/acfs/resource/query_methods_spec.rb +0 -541
- data/spec/acfs/resource/validation_spec.rb +0 -127
- data/spec/acfs/response/formats_spec.rb +0 -50
- data/spec/acfs/response/status_spec.rb +0 -69
- data/spec/acfs/runner_spec.rb +0 -97
- data/spec/acfs/service/middleware_spec.rb +0 -33
- data/spec/acfs/service_spec.rb +0 -46
- data/spec/acfs/singleton_resource_spec.rb +0 -15
- data/spec/acfs/stub_spec.rb +0 -343
- data/spec/acfs_spec.rb +0 -203
- data/spec/fixtures/config.yml +0 -14
- data/spec/spec_helper.rb +0 -41
- data/spec/support/hash.rb +0 -9
- data/spec/support/response.rb +0 -10
- data/spec/support/service.rb +0 -91
- data/spec/support/shared/find_callbacks.rb +0 -48
@@ -1,127 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe Acfs::Resource::Validation do
|
4
|
-
let(:params) { {name: 'john smith', age: 24} }
|
5
|
-
let(:model) { MyUserWithValidations.new params }
|
6
|
-
|
7
|
-
describe '#valid?' do
|
8
|
-
context 'with valid attributes' do
|
9
|
-
subject { model }
|
10
|
-
|
11
|
-
it { should be_valid }
|
12
|
-
end
|
13
|
-
|
14
|
-
context 'with invalid attributes' do
|
15
|
-
let(:params) { {name: 'invname'} }
|
16
|
-
subject { model }
|
17
|
-
|
18
|
-
it { should_not be_valid }
|
19
|
-
end
|
20
|
-
|
21
|
-
context 'on resource with service side errors' do
|
22
|
-
before { Acfs::Stub.enable }
|
23
|
-
after { Acfs::Stub.disable }
|
24
|
-
|
25
|
-
before do
|
26
|
-
Acfs::Stub.resource MyUser, :create, return: {errors: {name: ['can\'t be blank']}}, raise: 422
|
27
|
-
end
|
28
|
-
|
29
|
-
let(:params) { {} }
|
30
|
-
let(:resource) { MyUser.create params }
|
31
|
-
subject { resource }
|
32
|
-
|
33
|
-
it { should_not be_valid }
|
34
|
-
|
35
|
-
it 'should not override errors' do
|
36
|
-
subject.valid?
|
37
|
-
expect(subject.errors.to_hash).to eq(name: ['can\'t be blank'])
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
describe '#errors' do
|
43
|
-
context 'with valid attributes' do
|
44
|
-
let(:params) { {name: 'john smith', age: 24} }
|
45
|
-
before { model.valid? }
|
46
|
-
subject { model.errors }
|
47
|
-
|
48
|
-
it { should be_empty }
|
49
|
-
end
|
50
|
-
|
51
|
-
context 'with invalid attributes' do
|
52
|
-
let(:params) { {name: 'john'} }
|
53
|
-
before { model.valid? }
|
54
|
-
subject { model.errors }
|
55
|
-
|
56
|
-
it { should_not be_empty }
|
57
|
-
it { should have(2).items }
|
58
|
-
|
59
|
-
it 'should contain a list of error messages' do
|
60
|
-
expect(subject.to_hash).to eq age: ["can't be blank"], name: ['is invalid']
|
61
|
-
end
|
62
|
-
end
|
63
|
-
|
64
|
-
context 'server side errors' do
|
65
|
-
before { Acfs::Stub.enable }
|
66
|
-
after { Acfs::Stub.disable }
|
67
|
-
|
68
|
-
before do
|
69
|
-
Acfs::Stub.resource MyUser, :create,
|
70
|
-
with: {}, return: {errors: errors}, raise: 422
|
71
|
-
end
|
72
|
-
|
73
|
-
let(:params) { {} }
|
74
|
-
let(:resource) { MyUser.create params }
|
75
|
-
subject { resource.errors.to_hash }
|
76
|
-
|
77
|
-
context 'with `field => [messages]` payload' do
|
78
|
-
let(:errors) { {name: ['cannot be blank']} }
|
79
|
-
|
80
|
-
it { is_expected.to eq(name: ['cannot be blank']) }
|
81
|
-
end
|
82
|
-
|
83
|
-
context 'with `field => message` payload' do
|
84
|
-
let(:errors) { {name: 'cannot be blank'} }
|
85
|
-
|
86
|
-
it { is_expected.to eq(name: ['cannot be blank']) }
|
87
|
-
end
|
88
|
-
|
89
|
-
context 'with `[messages]` payload' do
|
90
|
-
let(:errors) { ['cannot be blank'] }
|
91
|
-
|
92
|
-
it { is_expected.to eq(base: ['cannot be blank']) }
|
93
|
-
end
|
94
|
-
end
|
95
|
-
end
|
96
|
-
|
97
|
-
describe '#save!' do
|
98
|
-
subject { -> { model.save! } }
|
99
|
-
before { allow(model).to receive(:operation) }
|
100
|
-
|
101
|
-
context 'with invalid attributes' do
|
102
|
-
let(:params) { {name: 'john'} }
|
103
|
-
|
104
|
-
it { expect { subject.call }.to raise_error Acfs::InvalidResource }
|
105
|
-
end
|
106
|
-
|
107
|
-
context 'on new resource' do
|
108
|
-
it 'should validate with `create` context' do
|
109
|
-
expect(model).to receive(:valid?).with(:create).and_call_original
|
110
|
-
subject.call
|
111
|
-
end
|
112
|
-
end
|
113
|
-
|
114
|
-
context 'on changed resource' do
|
115
|
-
before { model.loaded! }
|
116
|
-
let(:model) { super().tap {|m| m.id = 1 } }
|
117
|
-
|
118
|
-
it 'should validate with `save` context' do
|
119
|
-
expect(model).to receive(:valid?).with(:save).and_call_original
|
120
|
-
subject.call
|
121
|
-
end
|
122
|
-
end
|
123
|
-
end
|
124
|
-
|
125
|
-
describe 'validates with context' do
|
126
|
-
end
|
127
|
-
end
|
@@ -1,50 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe Acfs::Response::Formats do
|
4
|
-
let(:status) { 200 }
|
5
|
-
let(:mime_type) { 'application/unknown' }
|
6
|
-
let(:headers) { {'Content-Type' => mime_type} }
|
7
|
-
let(:request) { Acfs::Request.new 'fubar' }
|
8
|
-
let(:body) { nil }
|
9
|
-
let(:response) { Acfs::Response.new request, status: status, headers: headers, body: body }
|
10
|
-
|
11
|
-
context 'without Content-Type header' do
|
12
|
-
let(:headers) { {} }
|
13
|
-
|
14
|
-
it "should fallback on 'text/plain'" do
|
15
|
-
expect(response.content_type).to be == Mime[:text]
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
context 'with JSON mimetype' do
|
20
|
-
let(:mime_type) { 'application/json' }
|
21
|
-
|
22
|
-
describe '#content_type' do
|
23
|
-
it 'should return Mime::JSON' do
|
24
|
-
expect(response.content_type).to be == Mime[:json]
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
describe '#json?' do
|
29
|
-
it 'should return true' do
|
30
|
-
expect(response).to be_json
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
context 'with charset option' do
|
35
|
-
let(:mime_type) { 'application/json; charset=utf8' }
|
36
|
-
|
37
|
-
describe '#content_type' do
|
38
|
-
it 'should return Mime::JSON' do
|
39
|
-
expect(response.content_type).to be == Mime[:json]
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
describe '#json?' do
|
44
|
-
it 'should return true' do
|
45
|
-
expect(response).to be_json
|
46
|
-
end
|
47
|
-
end
|
48
|
-
end
|
49
|
-
end
|
50
|
-
end
|
@@ -1,69 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe Acfs::Response::Status do
|
4
|
-
let(:status) { 200 }
|
5
|
-
let(:mime_type) { 'application/unknown' }
|
6
|
-
let(:headers) { {'Content-Type' => mime_type} }
|
7
|
-
let(:request) { Acfs::Request.new 'fubar' }
|
8
|
-
let(:body) { nil }
|
9
|
-
let(:response) { Acfs::Response.new request, status: status, headers: headers, body: body }
|
10
|
-
|
11
|
-
describe '#status_code alias #code' do
|
12
|
-
context 'when given' do
|
13
|
-
let(:status) { 200 }
|
14
|
-
|
15
|
-
it 'should return status code' do
|
16
|
-
expect(response.code).to be == 200
|
17
|
-
expect(response.status_code).to be == 200
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
context 'when nil' do
|
22
|
-
let(:status) { nil }
|
23
|
-
|
24
|
-
it 'should return zero' do
|
25
|
-
expect(response.code).to be == 0
|
26
|
-
expect(response.status_code).to be == 0
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
describe '#success?' do
|
32
|
-
context 'with success status code' do
|
33
|
-
let(:status) { 200 }
|
34
|
-
it { expect(response).to be_success }
|
35
|
-
end
|
36
|
-
|
37
|
-
context 'with error status code' do
|
38
|
-
let(:status) { 500 }
|
39
|
-
it { expect(response).to_not be_success }
|
40
|
-
end
|
41
|
-
|
42
|
-
context 'with zero status code' do
|
43
|
-
let(:status) { nil }
|
44
|
-
it { expect(response).to_not be_success }
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
describe '#modified?' do
|
49
|
-
context 'with success status code' do
|
50
|
-
let(:status) { 200 }
|
51
|
-
it { expect(response).to be_modified }
|
52
|
-
end
|
53
|
-
|
54
|
-
context 'with not modified status code' do
|
55
|
-
let(:status) { 304 }
|
56
|
-
it { expect(response).to_not be_modified }
|
57
|
-
end
|
58
|
-
|
59
|
-
context 'with error status code' do
|
60
|
-
let(:status) { 500 }
|
61
|
-
it { expect(response).to be_modified }
|
62
|
-
end
|
63
|
-
|
64
|
-
context 'with zero status code' do
|
65
|
-
let(:status) { nil }
|
66
|
-
it { expect(response).to be_modified }
|
67
|
-
end
|
68
|
-
end
|
69
|
-
end
|
data/spec/acfs/runner_spec.rb
DELETED
@@ -1,97 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
class NullAdapter < Acfs::Adapter::Base
|
4
|
-
# Start processing queued requests.
|
5
|
-
#
|
6
|
-
def start
|
7
|
-
end
|
8
|
-
|
9
|
-
# Abort running and queued requests.
|
10
|
-
#
|
11
|
-
def abort
|
12
|
-
end
|
13
|
-
|
14
|
-
# Run request right now skipping queue.
|
15
|
-
#
|
16
|
-
def run(_)
|
17
|
-
end
|
18
|
-
|
19
|
-
# Enqueue request to be run later.
|
20
|
-
#
|
21
|
-
def queue(_)
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
class NotificationCollector
|
26
|
-
def call(*args)
|
27
|
-
events << ActiveSupport::Notifications::Event.new(*args)
|
28
|
-
end
|
29
|
-
|
30
|
-
def events
|
31
|
-
@events ||= []
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
describe ::Acfs::Runner do
|
36
|
-
let(:adapter) { ::NullAdapter.new }
|
37
|
-
let(:runner) { ::Acfs::Runner.new adapter }
|
38
|
-
let(:collector) { NotificationCollector.new }
|
39
|
-
let(:collector2) { NotificationCollector.new }
|
40
|
-
|
41
|
-
after do
|
42
|
-
::ActiveSupport::Notifications.notifier = \
|
43
|
-
::ActiveSupport::Notifications::Fanout.new
|
44
|
-
end
|
45
|
-
|
46
|
-
describe '#instrumentation' do
|
47
|
-
before do
|
48
|
-
::ActiveSupport::Notifications.subscribe(/^acfs\.runner/, collector)
|
49
|
-
::ActiveSupport::Notifications.subscribe(/^acfs\.operation/, collector2)
|
50
|
-
end
|
51
|
-
|
52
|
-
describe '#process' do
|
53
|
-
it 'should trigger event' do
|
54
|
-
runner.process ::Acfs::Operation.new MyUser, :read, params: {id: 0}
|
55
|
-
expect(collector.events).to have(1).items
|
56
|
-
expect(collector2.events).to have(1).items
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|
60
|
-
describe '#run' do
|
61
|
-
it 'should trigger event' do
|
62
|
-
runner.run ::Acfs::Operation.new MyUser, :read, params: {id: 0}
|
63
|
-
expect(collector.events).to have(1).items
|
64
|
-
expect(collector2.events).to have(0).items
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
|
-
describe '#enqueue' do
|
69
|
-
it 'should trigger event' do
|
70
|
-
runner.enqueue ::Acfs::Operation.new MyUser, :read, params: {id: 0}
|
71
|
-
expect(collector.events).to have(1).items
|
72
|
-
expect(collector2.events).to have(0).items
|
73
|
-
end
|
74
|
-
end
|
75
|
-
end
|
76
|
-
|
77
|
-
describe '#run' do
|
78
|
-
before do
|
79
|
-
expect_any_instance_of(UserService).to receive(:prepare).and_return nil
|
80
|
-
end
|
81
|
-
it 'it should not do requests when a middleware aborted' do
|
82
|
-
expect(adapter).to_not receive :run
|
83
|
-
runner.run ::Acfs::Operation.new MyUser, :read, params: {id: 0}
|
84
|
-
end
|
85
|
-
end
|
86
|
-
|
87
|
-
describe '#enqueue' do
|
88
|
-
before do
|
89
|
-
expect_any_instance_of(UserService).to receive(:prepare).and_return nil
|
90
|
-
end
|
91
|
-
it 'it should not do requests when a middleware aborted' do
|
92
|
-
expect(adapter).to_not receive :queue
|
93
|
-
runner.enqueue ::Acfs::Operation.new MyUser, :read, params: {id: 0}
|
94
|
-
runner.start
|
95
|
-
end
|
96
|
-
end
|
97
|
-
end
|
@@ -1,33 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
class TestMiddleware < Acfs::Middleware::Base
|
4
|
-
end
|
5
|
-
|
6
|
-
describe Acfs::Service::Middleware do
|
7
|
-
let(:srv_class) { Class.new(Acfs::Service) }
|
8
|
-
let(:options) { {} }
|
9
|
-
let(:middleware) { TestMiddleware }
|
10
|
-
|
11
|
-
describe '.use' do
|
12
|
-
let(:options) { {abc: 'cde'} }
|
13
|
-
|
14
|
-
it 'should add middleware to list' do
|
15
|
-
srv_class.use middleware
|
16
|
-
|
17
|
-
expect(srv_class.middleware).to include(middleware)
|
18
|
-
end
|
19
|
-
|
20
|
-
it 'should add middleware to stack' do
|
21
|
-
srv_class.use middleware
|
22
|
-
|
23
|
-
expect(srv_class.middleware.build(1)).to be_a(middleware)
|
24
|
-
end
|
25
|
-
|
26
|
-
it 'should instantiate middleware object' do
|
27
|
-
expect(middleware).to receive(:new).with(anything, options)
|
28
|
-
|
29
|
-
srv_class.use middleware, options
|
30
|
-
srv_class.middleware.build
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
data/spec/acfs/service_spec.rb
DELETED
@@ -1,46 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe Acfs::Service do
|
4
|
-
let(:srv_class) { Class.new(Acfs::Service) { identity :test } }
|
5
|
-
let(:options) { {} }
|
6
|
-
let(:service) { srv_class.new options }
|
7
|
-
|
8
|
-
before do
|
9
|
-
Acfs::Configuration.current.locate :test, ''
|
10
|
-
end
|
11
|
-
|
12
|
-
describe '#initialize' do
|
13
|
-
let(:options) { {path: 'abc', key: 'value'} }
|
14
|
-
|
15
|
-
it 'should set options' do
|
16
|
-
expect(service.options).to eq(options)
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
describe '#location' do
|
21
|
-
let(:resource) { Class.new }
|
22
|
-
before { allow(resource).to receive(:location_default_path, &proc{|_a, p| p}) }
|
23
|
-
|
24
|
-
it 'should extract resource path name from given class' do
|
25
|
-
expect(service.location(resource).to_s).to eq('/classes')
|
26
|
-
end
|
27
|
-
|
28
|
-
context 'with path options' do
|
29
|
-
let(:options) { {path: 'abc'} }
|
30
|
-
|
31
|
-
it 'should have custom resource path' do
|
32
|
-
expect(service.location(resource).to_s).to eq('/abc')
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
describe '.base_url' do
|
38
|
-
before do
|
39
|
-
Acfs::Configuration.current.locate :test, 'http://abc.de/api/v1'
|
40
|
-
end
|
41
|
-
|
42
|
-
it 'should return configured URI for service' do
|
43
|
-
expect(srv_class.base_url).to eq('http://abc.de/api/v1')
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|
@@ -1,15 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe Acfs::SingletonResource do
|
4
|
-
let(:model) { Single }
|
5
|
-
|
6
|
-
describe '.find' do
|
7
|
-
before do
|
8
|
-
stub_request(:get, 'http://users.example.org/singles')
|
9
|
-
.to_return response id: 1
|
10
|
-
end
|
11
|
-
|
12
|
-
let(:action) { ->(cb) { model.find(&cb) } }
|
13
|
-
it_should_behave_like 'a query method with multi-callback support'
|
14
|
-
end
|
15
|
-
end
|
data/spec/acfs/stub_spec.rb
DELETED
@@ -1,343 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
class SpecialCustomError < StandardError; end
|
4
|
-
|
5
|
-
describe Acfs::Stub do
|
6
|
-
let(:stub) { Class.new(Acfs::Stub) }
|
7
|
-
|
8
|
-
before(:all) { Acfs::Stub.enable }
|
9
|
-
after(:all) { Acfs::Stub.disable }
|
10
|
-
|
11
|
-
before do
|
12
|
-
Acfs::Stub.allow_requests = false
|
13
|
-
end
|
14
|
-
|
15
|
-
describe '#called?' do
|
16
|
-
context 'without specified number' do
|
17
|
-
let!(:operation) { Acfs::Stub.resource MyUser, :read, with: {id: 1}, return: {id: 1, name: 'John Smith', age: 32} }
|
18
|
-
|
19
|
-
it 'should allow to test if stub was called' do
|
20
|
-
MyUser.find 1
|
21
|
-
Acfs.run
|
22
|
-
|
23
|
-
expect(operation).to be_called
|
24
|
-
end
|
25
|
-
|
26
|
-
it 'should allow to test if stub was called a specific number of times' do
|
27
|
-
MyUser.find 1
|
28
|
-
Acfs.run
|
29
|
-
|
30
|
-
MyUser.find 1
|
31
|
-
Acfs.run
|
32
|
-
|
33
|
-
expect(operation).to be_called 2.times
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
describe '.resource' do
|
39
|
-
context 'with ambiguous stubs' do
|
40
|
-
before do
|
41
|
-
Acfs::Stub.resource MyUser, :read, with: {id: 1}, return: {id: 1, name: 'John Smith', age: 32}
|
42
|
-
Acfs::Stub.resource MyUser, :read, with: {id: 1}, raise: :not_found
|
43
|
-
end
|
44
|
-
|
45
|
-
it 'should raise error' do
|
46
|
-
MyUser.find 1
|
47
|
-
|
48
|
-
expect { Acfs.run }.to raise_error(Acfs::AmbiguousStubError)
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
context 'with read action' do
|
53
|
-
before do
|
54
|
-
Acfs::Stub.resource MyUser, :read, with: {id: 1}, return: {id: 1, name: 'John Smith', age: 32}
|
55
|
-
Acfs::Stub.resource MyUser, :read, with: {id: 2}, raise: SpecialCustomError
|
56
|
-
Acfs::Stub.resource MyUser, :read, with: {id: 3}, raise: :not_found
|
57
|
-
end
|
58
|
-
|
59
|
-
it 'should allow to stub resource reads' do
|
60
|
-
user = MyUser.find 1
|
61
|
-
Acfs.run
|
62
|
-
|
63
|
-
expect(user.id).to be == 1
|
64
|
-
expect(user.name).to be == 'John Smith'
|
65
|
-
expect(user.age).to be == 32
|
66
|
-
end
|
67
|
-
|
68
|
-
context 'with error' do
|
69
|
-
it 'should allow to raise errors' do
|
70
|
-
MyUser.find 2
|
71
|
-
|
72
|
-
expect { Acfs.run }.to raise_error(SpecialCustomError)
|
73
|
-
end
|
74
|
-
|
75
|
-
it 'should allow to raise symbolic errors' do
|
76
|
-
MyUser.find 3
|
77
|
-
|
78
|
-
expect { Acfs.run }.to raise_error(Acfs::ResourceNotFound)
|
79
|
-
end
|
80
|
-
end
|
81
|
-
|
82
|
-
context 'with type parameter' do
|
83
|
-
before do
|
84
|
-
Acfs::Stub.resource Computer, :read, with: {id: 1}, return: {id: 1, type: 'PC'}
|
85
|
-
Acfs::Stub.resource Computer, :read, with: {id: 2}, return: {id: 2, type: 'Mac'}
|
86
|
-
end
|
87
|
-
|
88
|
-
it 'should create inherited type' do
|
89
|
-
pc = Computer.find 1
|
90
|
-
mac = Computer.find 2
|
91
|
-
|
92
|
-
Acfs.run
|
93
|
-
|
94
|
-
expect(pc).to be_a PC
|
95
|
-
expect(mac).to be_a Mac
|
96
|
-
end
|
97
|
-
end
|
98
|
-
end
|
99
|
-
|
100
|
-
context 'with create action' do
|
101
|
-
before do
|
102
|
-
Acfs::Stub.resource Session, :create, with: {ident: 'john@exmaple.org', password: 's3cr3t'}, return: {id: 'longhash', user: 1}
|
103
|
-
Acfs::Stub.resource Session, :create, with: ->(op) { op.data[:ident] == 'john@exmaple.org' && op.data[:password] == 'wrong' }, raise: 422
|
104
|
-
end
|
105
|
-
|
106
|
-
it 'should allow stub resource creation' do
|
107
|
-
session = Session.create! ident: 'john@exmaple.org', password: 's3cr3t'
|
108
|
-
|
109
|
-
expect(session.id).to be == 'longhash'
|
110
|
-
expect(session.user).to be == 1
|
111
|
-
end
|
112
|
-
|
113
|
-
it 'should allow to raise error' do
|
114
|
-
expect do
|
115
|
-
Session.create! ident: 'john@exmaple.org', password: 'wrong'
|
116
|
-
end.to raise_error(::Acfs::InvalidResource)
|
117
|
-
end
|
118
|
-
end
|
119
|
-
|
120
|
-
context 'with list action' do
|
121
|
-
before do
|
122
|
-
Acfs::Stub.resource MyUser, :list,
|
123
|
-
return: [{id: 1, name: 'John Smith', age: 32}, {id: 2, name: 'Anon', age: 12}]
|
124
|
-
end
|
125
|
-
|
126
|
-
it 'should return collection' do
|
127
|
-
users = MyUser.all
|
128
|
-
Acfs.run
|
129
|
-
|
130
|
-
expect(users).to have(2).items
|
131
|
-
end
|
132
|
-
|
133
|
-
it 'should return defined resources' do
|
134
|
-
users = MyUser.all
|
135
|
-
Acfs.run
|
136
|
-
|
137
|
-
expect(users[0].id).to eq 1
|
138
|
-
expect(users[1].id).to eq 2
|
139
|
-
expect(users[0].name).to eq 'John Smith'
|
140
|
-
expect(users[1].name).to eq 'Anon'
|
141
|
-
end
|
142
|
-
|
143
|
-
context 'with type parameter' do
|
144
|
-
before do
|
145
|
-
Acfs::Stub.resource Computer, :list,
|
146
|
-
return: [{id: 1, type: 'PC'}, {id: 2, type: 'Mac'}]
|
147
|
-
end
|
148
|
-
|
149
|
-
it 'should create inherited type' do
|
150
|
-
computers = Computer.all
|
151
|
-
Acfs.run
|
152
|
-
|
153
|
-
expect(computers.first).to be_a PC
|
154
|
-
expect(computers.last).to be_a Mac
|
155
|
-
end
|
156
|
-
end
|
157
|
-
|
158
|
-
context 'with header' do
|
159
|
-
before do
|
160
|
-
Acfs::Stub.resource Comment, :list,
|
161
|
-
return: [{id: 1, text: 'Foo'}, {id: 2, text: 'Bar'}],
|
162
|
-
headers: headers
|
163
|
-
end
|
164
|
-
|
165
|
-
let!(:comments) { Comment.all }
|
166
|
-
let(:headers) do
|
167
|
-
{
|
168
|
-
'X-Total-Pages' => '2',
|
169
|
-
'X-Total-Count' => '10'
|
170
|
-
}
|
171
|
-
end
|
172
|
-
subject { Acfs.run; comments }
|
173
|
-
|
174
|
-
its(:total_pages) { should eq 2 }
|
175
|
-
its(:total_count) { should eq 10 }
|
176
|
-
end
|
177
|
-
end
|
178
|
-
|
179
|
-
context 'with update action' do
|
180
|
-
before do
|
181
|
-
Acfs::Stub.resource MyUser, :read, with: {id: 1}, return: {id: 1, name: 'John Smith', age: 32}
|
182
|
-
Acfs::Stub.resource MyUser, :update, with: {id: 1, name: 'John Smith', age: 22}, return: {id: 1, name: 'John Smith', age: 23}
|
183
|
-
Acfs::Stub.resource MyUser, :update, with: {id: 1, name: 'John Smith', age: 0}, raise: 422
|
184
|
-
end
|
185
|
-
|
186
|
-
let!(:update_stub) do
|
187
|
-
Acfs::Stub.resource MyUser, :update,
|
188
|
-
with: {id: 1, name: 'Jane Smith'},
|
189
|
-
return: ->(op) { Hash[op.data.map {|k, v| [k, v.to_s.upcase] }] }
|
190
|
-
end
|
191
|
-
|
192
|
-
it 'should allow stub resource update' do
|
193
|
-
user = MyUser.find 1
|
194
|
-
Acfs.run
|
195
|
-
|
196
|
-
user.age = 22
|
197
|
-
user.save!
|
198
|
-
|
199
|
-
expect(user.age).to be == 23
|
200
|
-
end
|
201
|
-
|
202
|
-
it 'should allow to raise error' do
|
203
|
-
user = MyUser.find 1
|
204
|
-
Acfs.run
|
205
|
-
|
206
|
-
user.age = 0
|
207
|
-
user.save
|
208
|
-
|
209
|
-
expect do
|
210
|
-
user.save!
|
211
|
-
end.to raise_error(::Acfs::InvalidResource)
|
212
|
-
end
|
213
|
-
|
214
|
-
it 'should match partial :with' do
|
215
|
-
user = MyUser.find 1
|
216
|
-
Acfs.run
|
217
|
-
|
218
|
-
user.age = 5
|
219
|
-
user.name = 'Jane Smith'
|
220
|
-
user.save!
|
221
|
-
|
222
|
-
expect(update_stub).to be_called
|
223
|
-
end
|
224
|
-
|
225
|
-
it 'should process response body' do
|
226
|
-
user = MyUser.find 1
|
227
|
-
Acfs.run
|
228
|
-
|
229
|
-
user.age = 5
|
230
|
-
user.name = 'Jane Smith'
|
231
|
-
user.save!
|
232
|
-
|
233
|
-
expect(user.name).to eq 'JANE SMITH'
|
234
|
-
end
|
235
|
-
end
|
236
|
-
|
237
|
-
context 'with create action' do
|
238
|
-
before do
|
239
|
-
Acfs::Stub.resource MyUser, :create, with: {name: 'John Smith', age: 0}, raise: 422
|
240
|
-
end
|
241
|
-
|
242
|
-
it 'should allow to raise error' do
|
243
|
-
expect do
|
244
|
-
MyUser.create! name: 'John Smith', age: 0
|
245
|
-
end.to raise_error(::Acfs::InvalidResource)
|
246
|
-
end
|
247
|
-
end
|
248
|
-
end
|
249
|
-
|
250
|
-
describe '.allow_requests=' do
|
251
|
-
context 'when enabled' do
|
252
|
-
before do
|
253
|
-
Acfs::Stub.allow_requests = true
|
254
|
-
stub_request(:get, 'http://users.example.org/users/2').to_return response(id: 2, name: 'John', age: 26)
|
255
|
-
end
|
256
|
-
|
257
|
-
it 'should allow real requests' do
|
258
|
-
@user = MyUser.find 2
|
259
|
-
expect { Acfs.run }.to_not raise_error
|
260
|
-
end
|
261
|
-
end
|
262
|
-
|
263
|
-
context 'when disabled' do
|
264
|
-
before do
|
265
|
-
Acfs::Stub.allow_requests = false
|
266
|
-
end
|
267
|
-
|
268
|
-
it 'should not allow real requests' do
|
269
|
-
@user = MyUser.find 2
|
270
|
-
expect { Acfs.run }.to raise_error(Acfs::RealRequestsNotAllowedError)
|
271
|
-
end
|
272
|
-
end
|
273
|
-
end
|
274
|
-
|
275
|
-
describe 'accept?' do
|
276
|
-
subject { stub.accept?(op) }
|
277
|
-
|
278
|
-
context 'with a match in params' do
|
279
|
-
let(:op) do
|
280
|
-
double('operation').tap do |op|
|
281
|
-
allow(op).to receive(:full_params).and_return(id: 1337, blub: 'abc')
|
282
|
-
allow(op).to receive(:data).and_return({})
|
283
|
-
end
|
284
|
-
end
|
285
|
-
|
286
|
-
let(:stub) { Acfs::Stub.resource MyUser, :read, with: {id: 1337} }
|
287
|
-
|
288
|
-
it { is_expected.to be true }
|
289
|
-
end
|
290
|
-
|
291
|
-
context 'with a match in data' do
|
292
|
-
let(:op) do
|
293
|
-
double('operation').tap do |op|
|
294
|
-
allow(op).to receive(:full_params).and_return({})
|
295
|
-
allow(op).to receive(:data).and_return(id: 1337, blub: 'abc')
|
296
|
-
end
|
297
|
-
end
|
298
|
-
|
299
|
-
let(:stub) { Acfs::Stub.resource MyUser, :read, with: {id: 1337} }
|
300
|
-
|
301
|
-
it { is_expected.to be true }
|
302
|
-
end
|
303
|
-
|
304
|
-
context 'with no match in params nor data' do
|
305
|
-
let(:op) do
|
306
|
-
double('operation').tap do |op|
|
307
|
-
allow(op).to receive(:full_params).and_return(id: 1337)
|
308
|
-
allow(op).to receive(:data).and_return({})
|
309
|
-
end
|
310
|
-
end
|
311
|
-
|
312
|
-
let(:stub) { Acfs::Stub.resource MyUser, :read, with: {abc: '123'} }
|
313
|
-
|
314
|
-
it { is_expected.to be false }
|
315
|
-
end
|
316
|
-
|
317
|
-
context 'with a wrong match' do
|
318
|
-
let(:op) do
|
319
|
-
double('operation').tap do |op|
|
320
|
-
allow(op).to receive(:full_params).and_return(id: 1337, blub: 'abc')
|
321
|
-
allow(op).to receive(:data).and_return({})
|
322
|
-
end
|
323
|
-
end
|
324
|
-
|
325
|
-
let(:stub) { Acfs::Stub.resource MyUser, :read, with: {id: 1337, blub: '123'} }
|
326
|
-
|
327
|
-
it { is_expected.to be false }
|
328
|
-
end
|
329
|
-
|
330
|
-
context 'with a missing match' do
|
331
|
-
let(:op) do
|
332
|
-
double('operation').tap do |op|
|
333
|
-
allow(op).to receive(:full_params).and_return(id: 1337, blub: 'abc')
|
334
|
-
allow(op).to receive(:data).and_return({})
|
335
|
-
end
|
336
|
-
end
|
337
|
-
|
338
|
-
let(:stub) { Acfs::Stub.resource MyUser, :read, with: {id: 1337, answer: 42} }
|
339
|
-
|
340
|
-
it { is_expected.to be false }
|
341
|
-
end
|
342
|
-
end
|
343
|
-
end
|