acfs 1.0.0.dev.1.b305 → 1.0.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 +5 -13
- data/CHANGELOG.md +64 -0
- data/README.md +2 -2
- data/acfs.gemspec +4 -4
- data/lib/acfs.rb +7 -5
- data/lib/acfs/adapter/base.rb +0 -2
- data/lib/acfs/adapter/typhoeus.rb +17 -13
- data/lib/acfs/collections/paginatable.rb +10 -10
- data/lib/acfs/configuration.rb +4 -5
- data/lib/acfs/errors.rb +10 -9
- data/lib/acfs/global.rb +16 -7
- data/lib/acfs/location.rb +11 -11
- data/lib/acfs/middleware/base.rb +1 -2
- data/lib/acfs/middleware/json.rb +27 -0
- data/lib/acfs/middleware/logger.rb +0 -2
- data/lib/acfs/middleware/msgpack.rb +30 -0
- data/lib/acfs/middleware/print.rb +0 -2
- data/lib/acfs/middleware/serializer.rb +39 -0
- data/lib/acfs/operation.rb +5 -5
- data/lib/acfs/request.rb +4 -4
- data/lib/acfs/request/callbacks.rb +2 -3
- data/lib/acfs/resource.rb +2 -2
- data/lib/acfs/resource/attributes.rb +10 -37
- data/lib/acfs/resource/attributes/base.rb +10 -19
- data/lib/acfs/resource/attributes/boolean.rb +10 -8
- data/lib/acfs/resource/attributes/date_time.rb +6 -9
- data/lib/acfs/resource/attributes/dict.rb +37 -0
- data/lib/acfs/resource/attributes/float.rb +11 -5
- data/lib/acfs/resource/attributes/integer.rb +7 -5
- data/lib/acfs/resource/attributes/list.rb +13 -6
- data/lib/acfs/resource/attributes/string.rb +3 -5
- data/lib/acfs/resource/attributes/uuid.rb +8 -17
- data/lib/acfs/resource/loadable.rb +0 -1
- data/lib/acfs/resource/locatable.rb +0 -4
- data/lib/acfs/resource/operational.rb +0 -2
- data/lib/acfs/resource/persistence.rb +17 -17
- data/lib/acfs/resource/query_methods.rb +3 -5
- data/lib/acfs/resource/service.rb +0 -2
- data/lib/acfs/resource/validation.rb +0 -2
- data/lib/acfs/response.rb +1 -2
- data/lib/acfs/response/formats.rb +1 -2
- data/lib/acfs/response/status.rb +3 -5
- data/lib/acfs/runner.rb +21 -11
- data/lib/acfs/service.rb +4 -6
- data/lib/acfs/service/middleware.rb +20 -30
- data/lib/acfs/service/middleware/stack.rb +63 -0
- data/lib/acfs/singleton_resource.rb +0 -2
- data/lib/acfs/stub.rb +30 -21
- data/lib/acfs/util.rb +1 -1
- data/lib/acfs/version.rb +4 -2
- data/spec/acfs/adapter/typhoeus_spec.rb +12 -4
- data/spec/acfs/collection_spec.rb +45 -33
- data/spec/acfs/configuration_spec.rb +9 -1
- data/spec/acfs/global_spec.rb +21 -3
- data/spec/acfs/middleware/json_spec.rb +63 -0
- data/spec/acfs/middleware/msgpack_spec.rb +60 -0
- data/spec/acfs/operation_spec.rb +10 -0
- data/spec/acfs/request/callbacks_spec.rb +8 -8
- data/spec/acfs/request_spec.rb +5 -5
- data/spec/acfs/resource/attributes/boolean_spec.rb +40 -9
- data/spec/acfs/resource/attributes/date_time_spec.rb +29 -35
- data/spec/acfs/resource/attributes/dict_spec.rb +75 -0
- data/spec/acfs/resource/attributes/float_spec.rb +48 -9
- data/spec/acfs/resource/attributes/integer_spec.rb +34 -0
- data/spec/acfs/resource/attributes/list_spec.rb +43 -19
- data/spec/acfs/resource/attributes/uuid_spec.rb +31 -54
- data/spec/acfs/resource/attributes_spec.rb +17 -31
- data/spec/acfs/resource/locatable_spec.rb +2 -2
- data/spec/acfs/resource/persistance_spec.rb +65 -34
- data/spec/acfs/resource/query_methods_spec.rb +87 -87
- data/spec/acfs/resource/validation_spec.rb +4 -5
- data/spec/acfs/response/formats_spec.rb +1 -1
- data/spec/acfs/response/status_spec.rb +1 -1
- data/spec/acfs/runner_spec.rb +28 -3
- data/spec/acfs/service/middleware_spec.rb +4 -20
- data/spec/acfs/service_spec.rb +3 -5
- data/spec/acfs/singleton_resource_spec.rb +1 -2
- data/spec/acfs/stub_spec.rb +137 -22
- data/spec/acfs_spec.rb +22 -19
- data/spec/spec_helper.rb +2 -1
- data/spec/support/service.rb +10 -6
- data/spec/support/shared/find_callbacks.rb +7 -7
- metadata +37 -30
- data/lib/acfs/middleware/json_decoder.rb +0 -16
- data/lib/acfs/middleware/json_encoder.rb +0 -20
- data/lib/acfs/middleware/msgpack_decoder.rb +0 -26
- data/lib/acfs/middleware/msgpack_encoder.rb +0 -19
- data/spec/acfs/middleware/json_decoder_spec.rb +0 -45
- data/spec/acfs/middleware/msgpack_decoder_spec.rb +0 -36
@@ -1,20 +1,59 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Acfs::Resource::Attributes::Float do
|
4
|
-
let(:
|
5
|
-
subject { described_class.new }
|
4
|
+
let(:type) { Acfs::Resource::Attributes::Float.new }
|
6
5
|
|
7
|
-
describe 'cast' do
|
8
|
-
|
9
|
-
|
6
|
+
describe '#cast' do
|
7
|
+
subject { -> { type.cast value } }
|
8
|
+
|
9
|
+
context 'with nil' do
|
10
|
+
let(:value) { nil }
|
11
|
+
it { expect(subject.call).to eq nil }
|
12
|
+
end
|
13
|
+
|
14
|
+
context 'with blank string (I)' do
|
15
|
+
let(:value) { '' }
|
16
|
+
it { expect(subject.call).to eq 0.0 }
|
17
|
+
end
|
18
|
+
|
19
|
+
context 'with blank string (II)' do
|
20
|
+
let(:value) { " \t" }
|
21
|
+
it { expect(subject.call).to eq 0.0 }
|
22
|
+
end
|
23
|
+
|
24
|
+
context 'with float' do
|
25
|
+
let(:value) { 1.7 }
|
26
|
+
it { expect(subject.call).to eq 1.7 }
|
27
|
+
end
|
28
|
+
|
29
|
+
context 'with Infinity' do
|
30
|
+
let(:value) { 'Infinity' }
|
31
|
+
it { expect(subject.call).to eq ::Float::INFINITY }
|
32
|
+
end
|
33
|
+
|
34
|
+
context 'with -Infinity' do
|
35
|
+
let(:value) { '-Infinity' }
|
36
|
+
it { expect(subject.call).to eq -::Float::INFINITY }
|
37
|
+
end
|
38
|
+
|
39
|
+
context 'with NaN' do
|
40
|
+
let(:value) { 'NaN' }
|
41
|
+
it { expect(subject.call).to be_nan }
|
42
|
+
end
|
43
|
+
|
44
|
+
context 'with fixnum' do
|
45
|
+
let(:value) { 1 }
|
46
|
+
it { expect(subject.call).to eq 1.0 }
|
10
47
|
end
|
11
48
|
|
12
|
-
|
13
|
-
|
49
|
+
context 'with valid string' do
|
50
|
+
let(:value) { '1.7' }
|
51
|
+
it { expect(subject.call).to eq 1.7 }
|
14
52
|
end
|
15
53
|
|
16
|
-
|
17
|
-
|
54
|
+
context 'with invalid string (I)' do
|
55
|
+
let(:value) { '1.7a' }
|
56
|
+
it { is_expected.to raise_error ArgumentError }
|
18
57
|
end
|
19
58
|
end
|
20
59
|
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Acfs::Resource::Attributes::Integer do
|
4
|
+
let(:type) { Acfs::Resource::Attributes::Integer.new }
|
5
|
+
|
6
|
+
describe '#cast' do
|
7
|
+
subject { -> { type.cast value } }
|
8
|
+
|
9
|
+
context 'with nil' do
|
10
|
+
let(:value) { nil }
|
11
|
+
it { expect(subject.call).to eq nil }
|
12
|
+
end
|
13
|
+
|
14
|
+
context 'with empty string' do
|
15
|
+
let(:value) { '' }
|
16
|
+
it { expect(subject.call).to eq 0 }
|
17
|
+
end
|
18
|
+
|
19
|
+
context 'with blank string' do
|
20
|
+
let(:value) { " \t" }
|
21
|
+
it { expect(subject.call).to eq 0 }
|
22
|
+
end
|
23
|
+
|
24
|
+
context 'with string' do
|
25
|
+
let(:value) { '123' }
|
26
|
+
it { expect(subject.call).to eq 123 }
|
27
|
+
end
|
28
|
+
|
29
|
+
context 'with invalid string' do
|
30
|
+
let(:value) { '123a' }
|
31
|
+
it { is_expected.to raise_error ArgumentError }
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -1,34 +1,58 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Acfs::Resource::Attributes::List do
|
4
|
-
let(:
|
5
|
-
subject { described_class.new }
|
4
|
+
let(:type) { Acfs::Resource::Attributes::List.new }
|
6
5
|
|
7
|
-
describe '
|
8
|
-
|
9
|
-
let(:sample) { %w(abc cde efg) }
|
6
|
+
describe '#cast' do
|
7
|
+
subject { -> { type.cast value } }
|
10
8
|
|
11
|
-
|
12
|
-
|
13
|
-
|
9
|
+
context 'with nil' do
|
10
|
+
let(:value) { nil }
|
11
|
+
it { expect(subject.call).to eq nil }
|
14
12
|
end
|
15
13
|
|
16
|
-
context 'with
|
17
|
-
let(:
|
14
|
+
context 'with blank string (I)' do
|
15
|
+
let(:value) { '' }
|
16
|
+
it { expect(subject.call).to eq Array.new }
|
17
|
+
end
|
18
18
|
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
end.to raise_error TypeError
|
23
|
-
end
|
19
|
+
context 'with blank string (II)' do
|
20
|
+
let(:value) { " \t" }
|
21
|
+
it { expect(subject.call).to eq Array.new }
|
24
22
|
end
|
25
23
|
|
26
|
-
context 'with
|
27
|
-
let(:
|
24
|
+
context 'with array' do
|
25
|
+
let(:value) { %w(abc cde efg) }
|
26
|
+
it { expect(subject.call).to eq value }
|
27
|
+
end
|
28
28
|
|
29
|
-
|
30
|
-
|
29
|
+
context 'with convertable object (I)' do
|
30
|
+
let(:value) do
|
31
|
+
Class.new do
|
32
|
+
def to_ary
|
33
|
+
[1, 2, 3]
|
34
|
+
end
|
35
|
+
end.new
|
31
36
|
end
|
37
|
+
|
38
|
+
it { expect(subject.call).to eq [1, 2, 3] }
|
39
|
+
end
|
40
|
+
|
41
|
+
context 'with convertable object (II)' do
|
42
|
+
let(:value) do
|
43
|
+
Class.new do
|
44
|
+
def to_a
|
45
|
+
[1, 2, 3]
|
46
|
+
end
|
47
|
+
end.new
|
48
|
+
end
|
49
|
+
|
50
|
+
it { expect(subject.call).to eq [1, 2, 3] }
|
51
|
+
end
|
52
|
+
|
53
|
+
context 'with non castable object' do
|
54
|
+
let(:value) { Object.new }
|
55
|
+
it { expect(subject.call).to eq [value] }
|
32
56
|
end
|
33
57
|
end
|
34
58
|
end
|
@@ -1,63 +1,40 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Acfs::Resource::Attributes::UUID do
|
4
|
-
let(:
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
subject { action }
|
13
|
-
|
14
|
-
context 'with String as param' do
|
15
|
-
context 'with valid UUID' do
|
16
|
-
let(:param) { '450b7a40-94ad-11e3-baa8-0800200c9a66' }
|
17
|
-
it { should be_a String }
|
18
|
-
it { should eq param }
|
19
|
-
end
|
20
|
-
|
21
|
-
context 'with invalid UUID' do
|
22
|
-
subject { -> { action } }
|
23
|
-
|
24
|
-
context 'with random non-empty string' do
|
25
|
-
let(:param) { 'invalid string' }
|
26
|
-
it { should raise_error ArgumentError }
|
27
|
-
end
|
28
|
-
|
29
|
-
context 'with UUID string containing invalid characters' do
|
30
|
-
let(:param) { 'xxxxxxxx-yyyy-11e3-baa8-0800200c9a66' }
|
31
|
-
it { should raise_error ArgumentError }
|
32
|
-
end
|
33
|
-
|
34
|
-
context 'with empty string' do
|
35
|
-
let(:param) { '' }
|
36
|
-
|
37
|
-
context 'with allow_nil option' do
|
38
|
-
let(:params) { {allow_nil: true} }
|
39
|
-
subject { action }
|
40
|
-
it { should eq nil }
|
41
|
-
end
|
42
|
-
|
43
|
-
context 'without allow_nil option' do
|
44
|
-
let(:params) { {allow_nil: false} }
|
45
|
-
it { should raise_error ArgumentError }
|
46
|
-
end
|
47
|
-
end
|
48
|
-
end
|
4
|
+
let(:type) { Acfs::Resource::Attributes::UUID.new }
|
5
|
+
|
6
|
+
describe '#cast' do
|
7
|
+
subject { -> { type.cast(value) } }
|
8
|
+
|
9
|
+
context 'with nil' do
|
10
|
+
let(:value) { nil }
|
11
|
+
it { expect(subject.call).to eq nil }
|
49
12
|
end
|
50
13
|
|
51
|
-
context 'with
|
52
|
-
|
14
|
+
context 'with empty string' do
|
15
|
+
let(:value) { '' }
|
16
|
+
it { expect(subject.call).to eq nil }
|
17
|
+
end
|
18
|
+
|
19
|
+
context 'with blank string' do
|
20
|
+
let(:value) { " \t" }
|
21
|
+
it { expect(subject.call).to eq nil }
|
22
|
+
end
|
23
|
+
|
24
|
+
context 'with string UUID' do
|
25
|
+
let(:value) { '450b7a40-94ad-11e3-baa8-0800200c9a66' }
|
26
|
+
it { expect(subject.call).to be_a String }
|
27
|
+
it { expect(subject.call).to eq value }
|
28
|
+
end
|
29
|
+
|
30
|
+
context 'with invalid string' do
|
31
|
+
let(:value) { 'invalid string' }
|
32
|
+
it { is_expected.to raise_error TypeError, /invalid UUID/i }
|
33
|
+
end
|
53
34
|
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
let(:param) { incorrect_param }
|
58
|
-
it { should raise_error ArgumentError }
|
59
|
-
end
|
60
|
-
end
|
35
|
+
context 'with invalid UUID' do
|
36
|
+
let(:value) { 'xxxxxxxx-yyyy-11e3-baa8-0800200c9a66' }
|
37
|
+
it { is_expected.to raise_error TypeError, /invalid UUID/i }
|
61
38
|
end
|
62
39
|
end
|
63
40
|
end
|
@@ -2,6 +2,7 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe Acfs::Resource::Attributes do
|
4
4
|
let(:model) { Class.new Acfs::Resource }
|
5
|
+
let(:submodel) { Class.new model }
|
5
6
|
|
6
7
|
describe '#initialize' do
|
7
8
|
before { model.attribute :name, :string, default: 'John' }
|
@@ -46,15 +47,15 @@ describe Acfs::Resource::Attributes do
|
|
46
47
|
end
|
47
48
|
end
|
48
49
|
let(:args) { [params] }
|
49
|
-
let(:params){ {name: 'James'} }
|
50
|
+
let(:params) { {name: 'James'} }
|
50
51
|
let(:m) { model.new }
|
51
|
-
let(:action) { ->{ m.write_attributes(*args) } }
|
52
|
+
let(:action) { -> { m.write_attributes(*args) } }
|
52
53
|
subject { action }
|
53
54
|
|
54
55
|
it 'should update attributes' do
|
55
56
|
should change(m, :attributes)
|
56
|
-
|
57
|
-
|
57
|
+
.from(name: 'The Great John', age: 25)
|
58
|
+
.to(name: 'The Great James', age: 25)
|
58
59
|
end
|
59
60
|
|
60
61
|
context 'without non-hash params' do
|
@@ -71,8 +72,8 @@ describe Acfs::Resource::Attributes do
|
|
71
72
|
|
72
73
|
it 'should update known attributes and store unknown' do
|
73
74
|
should change(m, :attributes)
|
74
|
-
|
75
|
-
|
75
|
+
.from(name: 'The Great John', age: 25)
|
76
|
+
.to(name: 'The Great James', age: 25, born_at: 'today')
|
76
77
|
end
|
77
78
|
|
78
79
|
context 'with unknown: :raise option' do
|
@@ -137,7 +138,7 @@ describe Acfs::Resource::Attributes do
|
|
137
138
|
end
|
138
139
|
|
139
140
|
describe 'class' do
|
140
|
-
describe '#
|
141
|
+
describe '#attributes' do
|
141
142
|
it 'should add an attribute to model attribute list' do
|
142
143
|
model.send :attribute, :name, :string
|
143
144
|
|
@@ -150,42 +151,27 @@ describe Acfs::Resource::Attributes do
|
|
150
151
|
expect(model.attributes.symbolize_keys).to eq name: 'John'
|
151
152
|
end
|
152
153
|
|
153
|
-
it 'should accept
|
154
|
+
it 'should accept a symbolic type' do
|
154
155
|
model.send :attribute, :age, :integer, default: '12'
|
155
156
|
|
156
157
|
expect(model.attributes.symbolize_keys).to eq age: 12
|
157
158
|
end
|
158
159
|
|
159
|
-
it 'should accept
|
160
|
+
it 'should accept a class type' do
|
160
161
|
model.send :attribute, :age, Acfs::Resource::Attributes::Integer,
|
161
|
-
|
162
|
+
default: '12'
|
162
163
|
|
163
164
|
expect(model.attributes.symbolize_keys).to eq age: 12
|
164
165
|
end
|
165
166
|
|
166
|
-
context '
|
167
|
-
|
168
|
-
model.
|
169
|
-
|
170
|
-
|
171
|
-
resource = model.new
|
172
|
-
expect(resource.updated_at).to eq DateTime.new
|
173
|
-
|
174
|
-
resource.updated_at = ''
|
175
|
-
expect(resource.updated_at).to eq nil
|
167
|
+
context 'on inherited resources' do
|
168
|
+
before do
|
169
|
+
model.attribute :age, :integer, default: 5
|
170
|
+
submodel.attribute :born_at, :date_time
|
176
171
|
end
|
177
|
-
end
|
178
|
-
|
179
|
-
context 'allow blank option' do
|
180
|
-
it 'should allow blank as value' do
|
181
|
-
model.send :attribute, :updated_at, :date_time,
|
182
|
-
default: DateTime.new, allow_blank: true
|
183
|
-
|
184
|
-
resource = model.new
|
185
|
-
expect(resource.updated_at).to eq DateTime.new
|
186
172
|
|
187
|
-
|
188
|
-
expect(
|
173
|
+
it 'includes superclass attributes' do
|
174
|
+
expect(submodel.attributes.keys).to match_array %w(age born_at)
|
189
175
|
end
|
190
176
|
end
|
191
177
|
end
|
@@ -28,7 +28,7 @@ describe Acfs::Resource::Locatable do
|
|
28
28
|
|
29
29
|
context 'without attributes' do
|
30
30
|
it 'should raise an error if attribute is missing' do
|
31
|
-
expect{ model.url }.to raise_error ArgumentError
|
31
|
+
expect { model.url }.to raise_error ArgumentError
|
32
32
|
end
|
33
33
|
end
|
34
34
|
end
|
@@ -59,7 +59,7 @@ describe Acfs::Resource::Locatable do
|
|
59
59
|
context ':update location' do
|
60
60
|
let(:action) { :update }
|
61
61
|
its(:raw_uri) do
|
62
|
-
expect{ subject }.to raise_error ArgumentError, /update.*disabled/
|
62
|
+
expect { subject }.to raise_error ArgumentError, /update.*disabled/
|
63
63
|
end
|
64
64
|
end
|
65
65
|
|
@@ -3,31 +3,31 @@ require 'spec_helper'
|
|
3
3
|
describe Acfs::Resource::Persistence do
|
4
4
|
let(:model_class) { MyUser }
|
5
5
|
before do
|
6
|
-
@get_stub = stub_request(:get, 'http://users.example.org/users/1').to_return response(
|
6
|
+
@get_stub = stub_request(:get, 'http://users.example.org/users/1').to_return response(id: 1, name: 'Anon', age: 12)
|
7
7
|
|
8
8
|
@patch_stub = stub_request(:put, 'http://users.example.org/users/1')
|
9
|
-
|
10
|
-
|
9
|
+
.with(body: '{"id":1,"name":"Idefix","age":12}')
|
10
|
+
.to_return response(id: 1, name: 'Idefix', age: 12)
|
11
11
|
|
12
12
|
@post_stub = stub_request(:post, 'http://users.example.org/users')
|
13
|
-
|
14
|
-
|
13
|
+
.with(body: '{"id":null,"name":"Idefix","age":12}')
|
14
|
+
.to_return response(id: 5, name: 'Idefix', age: 12)
|
15
15
|
|
16
16
|
stub_request(:post, 'http://users.example.org/users')
|
17
17
|
.with(body: '{"id":null,"name":"Anon","age":null}')
|
18
|
-
.to_return response(
|
18
|
+
.to_return response(id: 5, name: 'Anon', age: 12)
|
19
19
|
|
20
20
|
stub_request(:post, 'http://users.example.org/users')
|
21
21
|
.with(body: '{id:null,"name":"Idefix","age":12}')
|
22
|
-
.to_return response(
|
22
|
+
.to_return response(id: 5, name: 'Idefix', age: 12)
|
23
23
|
|
24
24
|
stub_request(:post, 'http://users.example.org/users')
|
25
25
|
.with(body: '{"id":null,"name":null,"age":12}')
|
26
|
-
.to_return response({
|
26
|
+
.to_return response({errors: {name: ['required']}}, {status: 422})
|
27
27
|
|
28
28
|
@del = stub_request(:delete, 'http://users.example.org/users/1')
|
29
|
-
|
30
|
-
|
29
|
+
.with(body: '{}')
|
30
|
+
.to_return response({id: 1, name: 'Idefix', age: 12}, {status: 200})
|
31
31
|
end
|
32
32
|
|
33
33
|
context 'new model' do
|
@@ -65,7 +65,7 @@ describe Acfs::Resource::Persistence do
|
|
65
65
|
let!(:req) do
|
66
66
|
stub_request(:post, 'http://users.example.org/users')
|
67
67
|
.with(body: '{"id":null,"name":"Idefix","age":null,"born_at":"Berlin"}')
|
68
|
-
.to_return response(
|
68
|
+
.to_return response(id: 5, name: 'Idefix', age: 12, wuff: 'woa')
|
69
69
|
end
|
70
70
|
let(:model) { model_class.new name: 'Idefix', born_at: 'Berlin' }
|
71
71
|
|
@@ -100,12 +100,12 @@ describe Acfs::Resource::Persistence do
|
|
100
100
|
|
101
101
|
describe '#update_attributes' do
|
102
102
|
subject { -> { model.update_attributes name: 'John' } }
|
103
|
-
it { expect{ subject.call }.to raise_error Acfs::ResourceNotLoaded }
|
103
|
+
it { expect { subject.call }.to raise_error Acfs::ResourceNotLoaded }
|
104
104
|
end
|
105
105
|
|
106
106
|
describe '#update_attributes!' do
|
107
107
|
subject { -> { model.update_attributes! name: 'John' } }
|
108
|
-
it { expect{ subject.call }.to raise_error Acfs::ResourceNotLoaded }
|
108
|
+
it { expect { subject.call }.to raise_error Acfs::ResourceNotLoaded }
|
109
109
|
end
|
110
110
|
end
|
111
111
|
|
@@ -122,22 +122,53 @@ describe Acfs::Resource::Persistence do
|
|
122
122
|
let(:model) { model_class.find 1 }
|
123
123
|
before { model; Acfs.run; model.name = 'dhh' }
|
124
124
|
|
125
|
-
it { expect(model).
|
125
|
+
it { expect(model).to be_persisted }
|
126
126
|
it { expect(model).to_not be_new }
|
127
127
|
end
|
128
128
|
|
129
129
|
describe '#delete!' do
|
130
130
|
let(:model) { model_class.find 1 }
|
131
|
-
|
131
|
+
let(:before_acfs_run) {}
|
132
|
+
|
133
|
+
describe 'normal delete actions' do
|
134
|
+
before { model; Acfs.run }
|
135
|
+
|
136
|
+
it 'should trigger DELETE request' do
|
137
|
+
model.delete!
|
138
|
+
expect(@del).to have_been_requested
|
139
|
+
end
|
132
140
|
|
133
|
-
|
134
|
-
|
135
|
-
|
141
|
+
it 'should be frozen after DELETE' do
|
142
|
+
model.delete!
|
143
|
+
expect(model.__getobj__).to be_frozen
|
144
|
+
end
|
136
145
|
end
|
137
146
|
|
138
|
-
|
139
|
-
|
140
|
-
|
147
|
+
describe 'correct URL generation' do
|
148
|
+
let(:model_class) { PathArguments }
|
149
|
+
let(:model) { model_class.find 1, params: {required_arg: 'some_value'} }
|
150
|
+
|
151
|
+
before :each do
|
152
|
+
resource_url = 'http://users.example.org/some_value/users/1'
|
153
|
+
@my_get_stub = stub_request(:get, resource_url)
|
154
|
+
.to_return response(id: 1, required_arg: 'some_value')
|
155
|
+
@my_delete_stub = stub_request(:delete, resource_url)
|
156
|
+
.with(body: '{}')
|
157
|
+
.to_return response({id: 1, required_arg: 'some_value'}, {status: 200})
|
158
|
+
model
|
159
|
+
Acfs.run
|
160
|
+
end
|
161
|
+
|
162
|
+
it 'should not raise an error on URL generation' do
|
163
|
+
expect do
|
164
|
+
model.delete!
|
165
|
+
end.not_to raise_error
|
166
|
+
end
|
167
|
+
|
168
|
+
it 'should request the delete' do
|
169
|
+
model.delete!
|
170
|
+
expect(@my_delete_stub).to have_been_requested
|
171
|
+
end
|
141
172
|
end
|
142
173
|
end
|
143
174
|
|
@@ -156,8 +187,8 @@ describe Acfs::Resource::Persistence do
|
|
156
187
|
end
|
157
188
|
|
158
189
|
it 'should pass second hash to save' do
|
159
|
-
expect(model.__getobj__).to receive(:save).with(
|
160
|
-
model.update_attributes({
|
190
|
+
expect(model.__getobj__).to receive(:save).with(bla: 'blub')
|
191
|
+
model.update_attributes({name: 'Idefix'}, {bla: 'blub'})
|
161
192
|
end
|
162
193
|
end
|
163
194
|
|
@@ -176,8 +207,8 @@ describe Acfs::Resource::Persistence do
|
|
176
207
|
end
|
177
208
|
|
178
209
|
it 'should pass second hash to save' do
|
179
|
-
expect(model.__getobj__).to receive(:save!).with(
|
180
|
-
model.update_attributes!({
|
210
|
+
expect(model.__getobj__).to receive(:save!).with(bla: 'blub')
|
211
|
+
model.update_attributes!({name: 'Idefix'}, {bla: 'blub'})
|
181
212
|
end
|
182
213
|
end
|
183
214
|
end
|
@@ -190,13 +221,13 @@ describe Acfs::Resource::Persistence do
|
|
190
221
|
before do
|
191
222
|
stub_request(:put, 'http://users.example.org/users/1')
|
192
223
|
.with(body: '{"id":1,"name":"","age":12}')
|
193
|
-
.to_return response({
|
224
|
+
.to_return response({errors: {name: ['required']}}, {status: 422})
|
194
225
|
end
|
195
226
|
|
196
227
|
it 'should set local errors hash' do
|
197
228
|
model.name = ''
|
198
229
|
model.save! rescue nil
|
199
|
-
expect(model.errors.to_hash).to be == {
|
230
|
+
expect(model.errors.to_hash).to be == {name: %w(required)}
|
200
231
|
end
|
201
232
|
end
|
202
233
|
|
@@ -206,15 +237,15 @@ describe Acfs::Resource::Persistence do
|
|
206
237
|
|
207
238
|
before do
|
208
239
|
stub_request(:put, 'http://users.example.org/users/1')
|
209
|
-
|
210
|
-
|
240
|
+
.with(body: '{"id":1,"name":"","age":12}')
|
241
|
+
.to_return response({errors: {name: ['required']}}, {status: 422})
|
211
242
|
end
|
212
243
|
end
|
213
244
|
end
|
214
245
|
|
215
246
|
describe '.create!' do
|
216
247
|
context 'with valid data' do
|
217
|
-
let(:data) { {
|
248
|
+
let(:data) { {name: 'Idefix', age: 12} }
|
218
249
|
|
219
250
|
it 'should create new resource' do
|
220
251
|
model = model_class.create! data
|
@@ -232,9 +263,9 @@ describe Acfs::Resource::Persistence do
|
|
232
263
|
let(:data) { {name: nil, age: 12} }
|
233
264
|
|
234
265
|
it 'should raise an error' do
|
235
|
-
expect{ model_class.create! data }.to \
|
266
|
+
expect { model_class.create! data }.to \
|
236
267
|
raise_error(::Acfs::InvalidResource) do |error|
|
237
|
-
expect(error.errors).to be == {
|
268
|
+
expect(error.errors).to be == {'name' => %w(required)}
|
238
269
|
end
|
239
270
|
end
|
240
271
|
end
|
@@ -272,13 +303,13 @@ describe Acfs::Resource::Persistence do
|
|
272
303
|
let!(:req) do
|
273
304
|
stub_request(:post, 'http://users.example.org/users')
|
274
305
|
.with(body: '{"id":null,"name":"Anon","age":9,"born_at":"today"}')
|
275
|
-
.to_return response(
|
306
|
+
.to_return response(id: 5, name: 'Anon', age: 9)
|
276
307
|
end
|
277
308
|
let(:data) { {age: 9, born_at: 'today'} }
|
278
309
|
|
279
310
|
it 'should store them in attributes' do
|
280
311
|
expect(subject.attributes).to eq 'id' => 5, 'name' => 'Anon',
|
281
|
-
|
312
|
+
'age' => 9, 'born_at' => 'today'
|
282
313
|
end
|
283
314
|
end
|
284
315
|
end
|