acfs 1.3.2 → 1.3.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
- 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
|