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
@@ -10,61 +10,70 @@ describe Acfs::Resource::Validation do
|
|
10
10
|
context 'with valid attributes' do
|
11
11
|
subject { model }
|
12
12
|
|
13
|
-
it {
|
13
|
+
it { is_expected.to be_valid }
|
14
14
|
end
|
15
15
|
|
16
16
|
context 'with invalid attributes' do
|
17
|
-
let(:params) { {name: 'invname'} }
|
18
17
|
subject { model }
|
19
18
|
|
20
|
-
|
19
|
+
let(:params) { {name: 'invname'} }
|
20
|
+
|
21
|
+
it { is_expected.not_to be_valid }
|
21
22
|
end
|
22
23
|
|
23
24
|
context 'on resource with service side errors' do
|
25
|
+
subject(:resource) { MyUser.create(params) }
|
26
|
+
|
24
27
|
before { Acfs::Stub.enable }
|
28
|
+
|
25
29
|
after { Acfs::Stub.disable }
|
26
30
|
|
27
31
|
before do
|
28
32
|
Acfs::Stub.resource MyUser, :create, return: {errors: {name: ['can\'t be blank']}}, raise: 422
|
29
33
|
end
|
30
34
|
|
31
|
-
let(:params)
|
32
|
-
let(:resource) { MyUser.create params }
|
33
|
-
subject { resource }
|
35
|
+
let(:params) { {} }
|
34
36
|
|
35
|
-
it {
|
37
|
+
it { is_expected.not_to be_valid }
|
36
38
|
|
37
|
-
it '
|
38
|
-
|
39
|
-
expect(
|
39
|
+
it 'does not override errors' do
|
40
|
+
resource.valid?
|
41
|
+
expect(resource.errors.to_hash).to eq(name: ['can\'t be blank'])
|
40
42
|
end
|
41
43
|
end
|
42
44
|
end
|
43
45
|
|
44
46
|
describe '#errors' do
|
45
47
|
context 'with valid attributes' do
|
48
|
+
subject { model.errors }
|
49
|
+
|
46
50
|
let(:params) { {name: 'john smith', age: 24} }
|
51
|
+
|
47
52
|
before { model.valid? }
|
48
|
-
subject { model.errors }
|
49
53
|
|
50
|
-
it {
|
54
|
+
it { is_expected.to be_empty }
|
51
55
|
end
|
52
56
|
|
53
57
|
context 'with invalid attributes' do
|
58
|
+
subject(:errors) { model.errors }
|
59
|
+
|
54
60
|
let(:params) { {name: 'john'} }
|
61
|
+
|
55
62
|
before { model.valid? }
|
56
|
-
subject { model.errors }
|
57
63
|
|
58
|
-
it {
|
59
|
-
it {
|
64
|
+
it { is_expected.not_to be_empty }
|
65
|
+
it { is_expected.to have(2).items }
|
60
66
|
|
61
|
-
it '
|
62
|
-
expect(
|
67
|
+
it 'contains a list of error messages' do
|
68
|
+
expect(errors.to_hash).to eq age: ["can't be blank"], name: ['is invalid']
|
63
69
|
end
|
64
70
|
end
|
65
71
|
|
66
72
|
context 'server side errors' do
|
73
|
+
subject { resource.errors.to_hash }
|
74
|
+
|
67
75
|
before { Acfs::Stub.enable }
|
76
|
+
|
68
77
|
after { Acfs::Stub.disable }
|
69
78
|
|
70
79
|
before do
|
@@ -74,7 +83,6 @@ describe Acfs::Resource::Validation do
|
|
74
83
|
|
75
84
|
let(:params) { {} }
|
76
85
|
let(:resource) { MyUser.create params }
|
77
|
-
subject { resource.errors.to_hash }
|
78
86
|
|
79
87
|
context 'with `field => [messages]` payload' do
|
80
88
|
let(:errors) { {name: ['cannot be blank']} }
|
@@ -97,33 +105,32 @@ describe Acfs::Resource::Validation do
|
|
97
105
|
end
|
98
106
|
|
99
107
|
describe '#save!' do
|
100
|
-
subject { -> { model.save! } }
|
108
|
+
subject(:save) { -> { model.save! } }
|
109
|
+
|
101
110
|
before { allow(model).to receive(:operation) }
|
102
111
|
|
103
112
|
context 'with invalid attributes' do
|
104
113
|
let(:params) { {name: 'john'} }
|
105
114
|
|
106
|
-
it { expect {
|
115
|
+
it { expect { save.call }.to raise_error Acfs::InvalidResource }
|
107
116
|
end
|
108
117
|
|
109
118
|
context 'on new resource' do
|
110
|
-
it '
|
119
|
+
it 'validates with `create` context' do
|
111
120
|
expect(model).to receive(:valid?).with(:create).and_call_original
|
112
|
-
|
121
|
+
save.call
|
113
122
|
end
|
114
123
|
end
|
115
124
|
|
116
125
|
context 'on changed resource' do
|
117
126
|
before { model.loaded! }
|
127
|
+
|
118
128
|
let(:model) { super().tap {|m| m.id = 1 } }
|
119
129
|
|
120
|
-
it '
|
130
|
+
it 'validates with `save` context' do
|
121
131
|
expect(model).to receive(:valid?).with(:save).and_call_original
|
122
|
-
|
132
|
+
save.call
|
123
133
|
end
|
124
134
|
end
|
125
135
|
end
|
126
|
-
|
127
|
-
describe 'validates with context' do
|
128
|
-
end
|
129
136
|
end
|
@@ -13,8 +13,8 @@ describe Acfs::Response::Formats do
|
|
13
13
|
context 'without Content-Type header' do
|
14
14
|
let(:headers) { {} }
|
15
15
|
|
16
|
-
it "
|
17
|
-
expect(response.content_type).to
|
16
|
+
it "fallbacks on 'text/plain'" do
|
17
|
+
expect(response.content_type).to eq Mime[:text]
|
18
18
|
end
|
19
19
|
end
|
20
20
|
|
@@ -22,13 +22,13 @@ describe Acfs::Response::Formats do
|
|
22
22
|
let(:mime_type) { 'application/json' }
|
23
23
|
|
24
24
|
describe '#content_type' do
|
25
|
-
it '
|
26
|
-
expect(response.content_type).to
|
25
|
+
it 'returns Mime::JSON' do
|
26
|
+
expect(response.content_type).to eq Mime[:json]
|
27
27
|
end
|
28
28
|
end
|
29
29
|
|
30
30
|
describe '#json?' do
|
31
|
-
it '
|
31
|
+
it 'returns true' do
|
32
32
|
expect(response).to be_json
|
33
33
|
end
|
34
34
|
end
|
@@ -37,13 +37,13 @@ describe Acfs::Response::Formats do
|
|
37
37
|
let(:mime_type) { 'application/json; charset=utf8' }
|
38
38
|
|
39
39
|
describe '#content_type' do
|
40
|
-
it '
|
41
|
-
expect(response.content_type).to
|
40
|
+
it 'returns Mime::JSON' do
|
41
|
+
expect(response.content_type).to eq Mime[:json]
|
42
42
|
end
|
43
43
|
end
|
44
44
|
|
45
45
|
describe '#json?' do
|
46
|
-
it '
|
46
|
+
it 'returns true' do
|
47
47
|
expect(response).to be_json
|
48
48
|
end
|
49
49
|
end
|
@@ -14,18 +14,18 @@ describe Acfs::Response::Status do
|
|
14
14
|
context 'when given' do
|
15
15
|
let(:status) { 200 }
|
16
16
|
|
17
|
-
it '
|
18
|
-
expect(response.code).to
|
19
|
-
expect(response.status_code).to
|
17
|
+
it 'returns status code' do
|
18
|
+
expect(response.code).to eq 200
|
19
|
+
expect(response.status_code).to eq 200
|
20
20
|
end
|
21
21
|
end
|
22
22
|
|
23
23
|
context 'when nil' do
|
24
24
|
let(:status) { nil }
|
25
25
|
|
26
|
-
it '
|
27
|
-
expect(response.code).to
|
28
|
-
expect(response.status_code).to
|
26
|
+
it 'returns zero' do
|
27
|
+
expect(response.code).to eq 0
|
28
|
+
expect(response.status_code).to eq 0
|
29
29
|
end
|
30
30
|
end
|
31
31
|
end
|
@@ -33,38 +33,45 @@ describe Acfs::Response::Status do
|
|
33
33
|
describe '#success?' do
|
34
34
|
context 'with success status code' do
|
35
35
|
let(:status) { 200 }
|
36
|
+
|
36
37
|
it { expect(response).to be_success }
|
37
38
|
end
|
38
39
|
|
39
40
|
context 'with error status code' do
|
40
41
|
let(:status) { 500 }
|
41
|
-
|
42
|
+
|
43
|
+
it { expect(response).not_to be_success }
|
42
44
|
end
|
43
45
|
|
44
46
|
context 'with zero status code' do
|
45
47
|
let(:status) { nil }
|
46
|
-
|
48
|
+
|
49
|
+
it { expect(response).not_to be_success }
|
47
50
|
end
|
48
51
|
end
|
49
52
|
|
50
53
|
describe '#modified?' do
|
51
54
|
context 'with success status code' do
|
52
55
|
let(:status) { 200 }
|
56
|
+
|
53
57
|
it { expect(response).to be_modified }
|
54
58
|
end
|
55
59
|
|
56
60
|
context 'with not modified status code' do
|
57
61
|
let(:status) { 304 }
|
58
|
-
|
62
|
+
|
63
|
+
it { expect(response).not_to be_modified }
|
59
64
|
end
|
60
65
|
|
61
66
|
context 'with error status code' do
|
62
67
|
let(:status) { 500 }
|
68
|
+
|
63
69
|
it { expect(response).to be_modified }
|
64
70
|
end
|
65
71
|
|
66
72
|
context 'with zero status code' do
|
67
73
|
let(:status) { nil }
|
74
|
+
|
68
75
|
it { expect(response).to be_modified }
|
69
76
|
end
|
70
77
|
end
|
data/spec/acfs/runner_spec.rb
CHANGED
@@ -48,7 +48,7 @@ describe ::Acfs::Runner do
|
|
48
48
|
end
|
49
49
|
|
50
50
|
describe '#process' do
|
51
|
-
it '
|
51
|
+
it 'triggers event' do
|
52
52
|
runner.process ::Acfs::Operation.new MyUser, :read, params: {id: 0}
|
53
53
|
expect(collector.events).to have(1).items
|
54
54
|
expect(collector2.events).to have(1).items
|
@@ -56,7 +56,7 @@ describe ::Acfs::Runner do
|
|
56
56
|
end
|
57
57
|
|
58
58
|
describe '#run' do
|
59
|
-
it '
|
59
|
+
it 'triggers event' do
|
60
60
|
runner.run ::Acfs::Operation.new MyUser, :read, params: {id: 0}
|
61
61
|
expect(collector.events).to have(1).items
|
62
62
|
expect(collector2.events).to have(0).items
|
@@ -64,7 +64,7 @@ describe ::Acfs::Runner do
|
|
64
64
|
end
|
65
65
|
|
66
66
|
describe '#enqueue' do
|
67
|
-
it '
|
67
|
+
it 'triggers event' do
|
68
68
|
runner.enqueue ::Acfs::Operation.new MyUser, :read, params: {id: 0}
|
69
69
|
expect(collector.events).to have(1).items
|
70
70
|
expect(collector2.events).to have(0).items
|
@@ -76,18 +76,20 @@ describe ::Acfs::Runner do
|
|
76
76
|
before do
|
77
77
|
expect_any_instance_of(UserService).to receive(:prepare).and_return nil
|
78
78
|
end
|
79
|
-
|
80
|
-
|
79
|
+
|
80
|
+
it 'does not do requests when a middleware aborted' do
|
81
|
+
expect(adapter).not_to receive :run
|
81
82
|
runner.run ::Acfs::Operation.new MyUser, :read, params: {id: 0}
|
82
83
|
end
|
83
84
|
end
|
84
85
|
|
85
86
|
describe '#enqueue' do
|
86
87
|
before do
|
87
|
-
expect_any_instance_of(UserService).to receive(:prepare).and_return
|
88
|
+
expect_any_instance_of(UserService).to receive(:prepare).and_return(nil)
|
88
89
|
end
|
89
|
-
|
90
|
-
|
90
|
+
|
91
|
+
it 'does not do requests when a middleware aborted' do
|
92
|
+
expect(adapter).not_to receive(:queue)
|
91
93
|
runner.enqueue ::Acfs::Operation.new MyUser, :read, params: {id: 0}
|
92
94
|
runner.start
|
93
95
|
end
|
@@ -13,19 +13,19 @@ describe Acfs::Service::Middleware do
|
|
13
13
|
describe '.use' do
|
14
14
|
let(:options) { {abc: 'cde'} }
|
15
15
|
|
16
|
-
it '
|
16
|
+
it 'adds middleware to list' do
|
17
17
|
srv_class.use middleware
|
18
18
|
|
19
19
|
expect(srv_class.middleware).to include(middleware)
|
20
20
|
end
|
21
21
|
|
22
|
-
it '
|
22
|
+
it 'adds middleware to stack' do
|
23
23
|
srv_class.use middleware
|
24
24
|
|
25
25
|
expect(srv_class.middleware.build(1)).to be_a(middleware)
|
26
26
|
end
|
27
27
|
|
28
|
-
it '
|
28
|
+
it 'instantiates middleware object' do
|
29
29
|
expect(middleware).to receive(:new).with(anything, options)
|
30
30
|
|
31
31
|
srv_class.use middleware, options
|
data/spec/acfs/service_spec.rb
CHANGED
@@ -5,7 +5,7 @@ require 'spec_helper'
|
|
5
5
|
describe Acfs::Service do
|
6
6
|
let(:srv_class) { Class.new(Acfs::Service) { identity :test } }
|
7
7
|
let(:options) { {} }
|
8
|
-
let(:service) { srv_class.new
|
8
|
+
let(:service) { srv_class.new(**options) }
|
9
9
|
|
10
10
|
before do
|
11
11
|
Acfs::Configuration.current.locate :test, ''
|
@@ -14,23 +14,24 @@ describe Acfs::Service do
|
|
14
14
|
describe '#initialize' do
|
15
15
|
let(:options) { {path: 'abc', key: 'value'} }
|
16
16
|
|
17
|
-
it '
|
17
|
+
it 'sets options' do
|
18
18
|
expect(service.options).to eq(options)
|
19
19
|
end
|
20
20
|
end
|
21
21
|
|
22
22
|
describe '#location' do
|
23
23
|
let(:resource) { Class.new }
|
24
|
+
|
24
25
|
before { allow(resource).to receive(:location_default_path, &proc {|_a, p| p }) }
|
25
26
|
|
26
|
-
it '
|
27
|
+
it 'extracts resource path name from given class' do
|
27
28
|
expect(service.location(resource).to_s).to eq('/classes')
|
28
29
|
end
|
29
30
|
|
30
31
|
context 'with path options' do
|
31
32
|
let(:options) { {path: 'abc'} }
|
32
33
|
|
33
|
-
it '
|
34
|
+
it 'has custom resource path' do
|
34
35
|
expect(service.location(resource).to_s).to eq('/abc')
|
35
36
|
end
|
36
37
|
end
|
@@ -41,7 +42,7 @@ describe Acfs::Service do
|
|
41
42
|
Acfs::Configuration.current.locate :test, 'http://abc.de/api/v1'
|
42
43
|
end
|
43
44
|
|
44
|
-
it '
|
45
|
+
it 'returns configured URI for service' do
|
45
46
|
expect(srv_class.base_url).to eq('http://abc.de/api/v1')
|
46
47
|
end
|
47
48
|
end
|