acfs 0.50.0 → 1.0.0.dev.1.b297
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 +13 -5
- data/CHANGELOG.md +0 -80
- data/README.md +9 -8
- data/acfs.gemspec +7 -7
- data/lib/acfs.rb +5 -7
- data/lib/acfs/adapter/base.rb +2 -0
- data/lib/acfs/adapter/typhoeus.rb +13 -17
- data/lib/acfs/collections/paginatable.rb +10 -10
- data/lib/acfs/configuration.rb +5 -4
- data/lib/acfs/errors.rb +9 -10
- data/lib/acfs/global.rb +7 -16
- data/lib/acfs/location.rb +11 -11
- data/lib/acfs/middleware/base.rb +2 -1
- data/lib/acfs/middleware/json_decoder.rb +16 -0
- data/lib/acfs/middleware/json_encoder.rb +20 -0
- data/lib/acfs/middleware/logger.rb +2 -0
- data/lib/acfs/middleware/msgpack_decoder.rb +26 -0
- data/lib/acfs/middleware/msgpack_encoder.rb +19 -0
- data/lib/acfs/middleware/print.rb +2 -0
- data/lib/acfs/operation.rb +5 -5
- data/lib/acfs/request.rb +4 -4
- data/lib/acfs/request/callbacks.rb +3 -2
- data/lib/acfs/resource.rb +2 -2
- data/lib/acfs/resource/attributes.rb +38 -11
- data/lib/acfs/resource/attributes/base.rb +19 -10
- data/lib/acfs/resource/attributes/boolean.rb +8 -10
- data/lib/acfs/resource/attributes/date_time.rb +9 -6
- data/lib/acfs/resource/attributes/float.rb +5 -11
- data/lib/acfs/resource/attributes/integer.rb +5 -7
- data/lib/acfs/resource/attributes/list.rb +6 -13
- data/lib/acfs/resource/attributes/string.rb +5 -3
- data/lib/acfs/resource/attributes/uuid.rb +17 -8
- data/lib/acfs/resource/dirty.rb +15 -3
- data/lib/acfs/resource/loadable.rb +1 -0
- data/lib/acfs/resource/locatable.rb +4 -0
- data/lib/acfs/resource/operational.rb +2 -0
- data/lib/acfs/resource/persistence.rb +17 -17
- data/lib/acfs/resource/query_methods.rb +7 -8
- data/lib/acfs/resource/service.rb +2 -0
- data/lib/acfs/resource/validation.rb +4 -4
- data/lib/acfs/response.rb +2 -1
- data/lib/acfs/response/formats.rb +3 -2
- data/lib/acfs/response/status.rb +5 -3
- data/lib/acfs/runner.rb +11 -21
- data/lib/acfs/service.rb +6 -4
- data/lib/acfs/service/middleware.rb +30 -20
- data/lib/acfs/singleton_resource.rb +2 -0
- data/lib/acfs/stub.rb +21 -30
- data/lib/acfs/util.rb +1 -1
- data/lib/acfs/version.rb +4 -6
- data/spec/acfs/adapter/typhoeus_spec.rb +4 -12
- data/spec/acfs/collection_spec.rb +33 -45
- data/spec/acfs/configuration_spec.rb +1 -9
- data/spec/acfs/global_spec.rb +3 -21
- data/spec/acfs/middleware/json_decoder_spec.rb +45 -0
- data/spec/acfs/middleware/msgpack_decoder_spec.rb +36 -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 +9 -40
- data/spec/acfs/resource/attributes/date_time_spec.rb +35 -29
- data/spec/acfs/resource/attributes/float_spec.rb +9 -48
- data/spec/acfs/resource/attributes/list_spec.rb +19 -43
- data/spec/acfs/resource/attributes/uuid_spec.rb +54 -31
- data/spec/acfs/resource/attributes_spec.rb +31 -17
- data/spec/acfs/resource/locatable_spec.rb +2 -2
- data/spec/acfs/resource/persistance_spec.rb +34 -65
- data/spec/acfs/resource/query_methods_spec.rb +90 -97
- data/spec/acfs/resource/validation_spec.rb +5 -4
- data/spec/acfs/response/formats_spec.rb +4 -4
- data/spec/acfs/response/status_spec.rb +1 -1
- data/spec/acfs/runner_spec.rb +3 -28
- data/spec/acfs/service/middleware_spec.rb +20 -4
- data/spec/acfs/service_spec.rb +5 -3
- data/spec/acfs/singleton_resource_spec.rb +2 -1
- data/spec/acfs/stub_spec.rb +22 -137
- data/spec/acfs_spec.rb +19 -22
- data/spec/spec_helper.rb +2 -3
- data/spec/support/service.rb +6 -10
- data/spec/support/shared/find_callbacks.rb +7 -7
- metadata +36 -43
- data/lib/acfs/middleware/json.rb +0 -27
- data/lib/acfs/middleware/msgpack.rb +0 -30
- data/lib/acfs/middleware/serializer.rb +0 -39
- data/lib/acfs/resource/attributes/dict.rb +0 -37
- data/lib/acfs/service/middleware/stack.rb +0 -63
- 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/resource/attributes/dict_spec.rb +0 -75
- data/spec/acfs/resource/attributes/integer_spec.rb +0 -34
@@ -11,59 +11,47 @@ describe Acfs::Collection do
|
|
11
11
|
|
12
12
|
context 'without explicit page parameter' do
|
13
13
|
before do
|
14
|
-
stub_request(:get, 'http://users.example.org/users')
|
15
|
-
|
16
|
-
|
17
|
-
'X-Total-Pages' => '2',
|
18
|
-
'X-Total-Count' => '10'
|
19
|
-
})
|
14
|
+
stub_request(:get, 'http://users.example.org/users').
|
15
|
+
to_return response([{id: 1, name: 'Anon', age: 12, born_at: 'Berlin'}],
|
16
|
+
headers: {'X-Total-Pages' => '2'})
|
20
17
|
end
|
21
18
|
|
22
19
|
its(:total_pages) { should eq 2 }
|
23
20
|
its(:current_page) { should eq 1 }
|
24
|
-
its(:total_count) { should eq 10 }
|
25
21
|
end
|
26
22
|
|
27
23
|
context 'with page parameter' do
|
28
24
|
let(:params) { {page: 2} }
|
29
25
|
before do
|
30
|
-
stub_request(:get, 'http://users.example.org/users?page=2')
|
31
|
-
|
32
|
-
|
33
|
-
'X-Total-Pages' => '2',
|
34
|
-
'X-Total-Count' => '10'
|
35
|
-
})
|
26
|
+
stub_request(:get, 'http://users.example.org/users?page=2').
|
27
|
+
to_return response([{id: 1, name: 'Anon', age: 12, born_at: 'Berlin'}],
|
28
|
+
headers: {'X-Total-Pages' => '2'})
|
36
29
|
end
|
37
30
|
|
38
31
|
its(:total_pages) { should eq 2 }
|
39
32
|
its(:current_page) { should eq 2 }
|
40
|
-
its(:total_count) { should eq 10 }
|
41
33
|
end
|
42
34
|
|
43
35
|
context 'with non-numerical page parameter' do
|
44
36
|
let(:params) { {page: 'e546f5'} }
|
45
37
|
before do
|
46
|
-
stub_request(:get, 'http://users.example.org/users?page=e546f5')
|
47
|
-
|
48
|
-
|
49
|
-
'X-Total-Pages' => '2',
|
50
|
-
'X-Total-Count' => '10'
|
51
|
-
})
|
38
|
+
stub_request(:get, 'http://users.example.org/users?page=e546f5').
|
39
|
+
to_return response([{id: 1, name: 'Anon', age: 12, born_at: 'Berlin'}],
|
40
|
+
headers: {'X-Total-Pages' => '2'})
|
52
41
|
end
|
53
42
|
|
54
43
|
its(:total_pages) { should eq 2 }
|
55
44
|
its(:current_page) { should eq 'e546f5' }
|
56
|
-
its(:total_count) { should eq 10 }
|
57
45
|
end
|
58
46
|
|
59
47
|
describe '#next_page' do
|
60
48
|
before do
|
61
|
-
stub_request(:get, 'http://users.example.org/users')
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
49
|
+
stub_request(:get, 'http://users.example.org/users').
|
50
|
+
to_return response([{id: 1, name: 'Anon', age: 12, born_at: 'Berlin'}],
|
51
|
+
headers: {
|
52
|
+
'X-Total-Pages' => '2',
|
53
|
+
'Link' => '<http://users.example.org/users?page=2>; rel="next"'
|
54
|
+
})
|
67
55
|
end
|
68
56
|
let!(:req) do
|
69
57
|
stub_request(:get, 'http://users.example.org/users?page=2').to_return response([])
|
@@ -82,12 +70,12 @@ describe Acfs::Collection do
|
|
82
70
|
|
83
71
|
describe '#prev_page' do
|
84
72
|
before do
|
85
|
-
stub_request(:get, 'http://users.example.org/users?page=2')
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
73
|
+
stub_request(:get, 'http://users.example.org/users?page=2').
|
74
|
+
to_return response([{id: 2, name: 'Anno', age: 1604, born_at: 'Santa Maria'}],
|
75
|
+
headers: {
|
76
|
+
'X-Total-Pages' => '2',
|
77
|
+
'Link' => '<http://users.example.org/users>; rel="prev"'
|
78
|
+
})
|
91
79
|
end
|
92
80
|
let!(:req) do
|
93
81
|
stub_request(:get, 'http://users.example.org/users').to_return response([])
|
@@ -106,12 +94,12 @@ describe Acfs::Collection do
|
|
106
94
|
|
107
95
|
describe '#first_page' do
|
108
96
|
before do
|
109
|
-
stub_request(:get, 'http://users.example.org/users?page=2')
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
97
|
+
stub_request(:get, 'http://users.example.org/users?page=2').
|
98
|
+
to_return response([{id: 2, name: 'Anno', age: 1604, born_at: 'Santa Maria'}],
|
99
|
+
headers: {
|
100
|
+
'X-Total-Pages' => '2',
|
101
|
+
'Link' => '<http://users.example.org/users>; rel="first"'
|
102
|
+
})
|
115
103
|
end
|
116
104
|
let!(:req) do
|
117
105
|
stub_request(:get, 'http://users.example.org/users').to_return response([])
|
@@ -130,12 +118,12 @@ describe Acfs::Collection do
|
|
130
118
|
|
131
119
|
describe '#last_page' do
|
132
120
|
before do
|
133
|
-
stub_request(:get, 'http://users.example.org/users?page=2')
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
121
|
+
stub_request(:get, 'http://users.example.org/users?page=2').
|
122
|
+
to_return response([{id: 2, name: 'Anno', age: 1604, born_at: 'Santa Maria'}],
|
123
|
+
headers: {
|
124
|
+
'X-Total-Pages' => '2',
|
125
|
+
'Link' => '<http://users.example.org/users?page=12>; rel="last"'
|
126
|
+
})
|
139
127
|
end
|
140
128
|
let!(:req) do
|
141
129
|
stub_request(:get, 'http://users.example.org/users?page=12').to_return response([])
|
@@ -1,6 +1,7 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Acfs::Configuration do
|
4
|
+
|
4
5
|
let(:cfg) { Acfs::Configuration.new }
|
5
6
|
before { @configuration = Acfs::Configuration.current.dup }
|
6
7
|
after { Acfs::Configuration.set @configuration }
|
@@ -39,13 +40,4 @@ describe Acfs::Configuration do
|
|
39
40
|
end
|
40
41
|
end
|
41
42
|
end
|
42
|
-
|
43
|
-
describe '#adapter' do
|
44
|
-
let(:object) { Object.new }
|
45
|
-
|
46
|
-
it 'should be a accessor' do
|
47
|
-
cfg.adapter = object
|
48
|
-
expect(cfg.adapter).to eq object
|
49
|
-
end
|
50
|
-
end
|
51
43
|
end
|
data/spec/acfs/global_spec.rb
CHANGED
@@ -14,11 +14,11 @@ describe ::Acfs::Global do
|
|
14
14
|
let(:adapter) { ::NullAdapter.new }
|
15
15
|
let(:runner) { double 'runner' }
|
16
16
|
let(:collector) { NotificationCollector.new }
|
17
|
-
let(:acfs) { Object.new.tap {|o| o.extend ::Acfs::Global } }
|
17
|
+
let(:acfs) { Object.new.tap { |o| o.extend ::Acfs::Global } }
|
18
18
|
|
19
19
|
describe 'instrumentation' do
|
20
20
|
before do
|
21
|
-
#
|
21
|
+
#allow(runner).to receive(:start)
|
22
22
|
allow(acfs).to receive(:runner).and_return runner
|
23
23
|
end
|
24
24
|
|
@@ -48,7 +48,7 @@ describe ::Acfs::Global do
|
|
48
48
|
stub_request(:get, %r{http://users.example.org/users/\d+}).to_return(
|
49
49
|
status: 200,
|
50
50
|
body: '{}',
|
51
|
-
headers: {'Content-Type' => 'application/json'})
|
51
|
+
headers: { 'Content-Type' => 'application/json' })
|
52
52
|
end
|
53
53
|
|
54
54
|
it 'should invoke when both resources' do
|
@@ -72,22 +72,4 @@ describe ::Acfs::Global do
|
|
72
72
|
Acfs.run
|
73
73
|
end
|
74
74
|
end
|
75
|
-
|
76
|
-
describe '#runner' do
|
77
|
-
it 'returns per-thread runner' do
|
78
|
-
runner1 = Thread.new { acfs.runner } .value
|
79
|
-
runner2 = Thread.new { acfs.runner } .value
|
80
|
-
|
81
|
-
expect(runner1).to_not equal runner2
|
82
|
-
end
|
83
|
-
|
84
|
-
it 'uses configurated adapter' do
|
85
|
-
adapter = double :adapter
|
86
|
-
expect(Acfs::Configuration.current).to receive(:adapter).and_return(-> { adapter })
|
87
|
-
|
88
|
-
runner = Thread.new { acfs.runner }.value
|
89
|
-
|
90
|
-
expect(runner.adapter).to equal adapter
|
91
|
-
end
|
92
|
-
end
|
93
75
|
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Acfs::Middleware::JsonDecoder do
|
4
|
+
let(:data) { [{id: 1, name: "Anon"},{id: 2, name:"John", friends: [ 1 ]}] }
|
5
|
+
let(:body) { data.to_param }
|
6
|
+
let(:headers) { {} }
|
7
|
+
let(:request) { Acfs::Request.new "fubar" }
|
8
|
+
let(:response) { Acfs::Response.new request, status: 200, headers: headers, body: body }
|
9
|
+
let(:decoder) { Acfs::Middleware::JsonDecoder.new lambda { |req| req } }
|
10
|
+
|
11
|
+
before do
|
12
|
+
decoder.call request
|
13
|
+
end
|
14
|
+
|
15
|
+
context 'with JSON response' do
|
16
|
+
let(:headers) { { 'Content-Type' => 'application/json; charset=utf-8' } }
|
17
|
+
let(:body) { data.to_json }
|
18
|
+
|
19
|
+
it 'should decode body data' do
|
20
|
+
request.complete! response
|
21
|
+
|
22
|
+
expect(response.data).to be == data.map(&:stringify_keys)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
context 'with invalid JSON response' do
|
27
|
+
let(:headers) { { 'Content-Type' => 'application/json' } }
|
28
|
+
let(:body) { data.to_json[4..-4] }
|
29
|
+
|
30
|
+
it 'should raise an error' do
|
31
|
+
expect { request.complete! response }.to raise_error(MultiJson::LoadError)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
context 'without JSON response' do
|
36
|
+
let(:headers) { { 'Content-Type' => 'application/text' } }
|
37
|
+
let(:body) { data.to_json }
|
38
|
+
|
39
|
+
it 'should not decode non-JSON encoded responses' do
|
40
|
+
request.complete! response
|
41
|
+
|
42
|
+
expect(response.data).to be_nil
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Acfs::Middleware::MessagePackDecoder do
|
4
|
+
let(:data) { [{id: 1, name: "Anon"},{id: 2, name:"John", friends: [ 1 ]}] }
|
5
|
+
let(:body) { data.to_param }
|
6
|
+
let(:headers) { {} }
|
7
|
+
let(:request) { Acfs::Request.new "fubar" }
|
8
|
+
let(:response) { Acfs::Response.new request, status: 200, headers: headers, body: body }
|
9
|
+
let(:decoder) { Acfs::Middleware::MessagePackDecoder.new lambda { |req| req } }
|
10
|
+
|
11
|
+
before do
|
12
|
+
decoder.call request
|
13
|
+
end
|
14
|
+
|
15
|
+
context 'with Message Pack response' do
|
16
|
+
let(:headers) { { 'Content-Type' => 'application/x-msgpack' } }
|
17
|
+
let(:body) { MessagePack.pack data }
|
18
|
+
|
19
|
+
it 'should decode body data' do
|
20
|
+
request.complete! response
|
21
|
+
|
22
|
+
expect(response.data).to be == data.map(&:stringify_keys)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
context 'without Message Pack response' do
|
27
|
+
let(:headers) { { 'Content-Type' => 'application/text' } }
|
28
|
+
let(:body) { data.to_json }
|
29
|
+
|
30
|
+
it 'should not decode non-MessagePack encoded responses' do
|
31
|
+
request.complete! response
|
32
|
+
|
33
|
+
expect(response.data).to be_nil
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -1,20 +1,20 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Acfs::Request::Callbacks do
|
4
|
-
let(:callback) {
|
4
|
+
let(:callback) { lambda { |res| } }
|
5
5
|
let(:request) { Acfs::Request.new('fubar') }
|
6
6
|
|
7
7
|
describe '#on_complete' do
|
8
8
|
it 'should store a given callback' do
|
9
|
-
request.on_complete
|
9
|
+
request.on_complete &callback
|
10
10
|
|
11
11
|
expect(request.callbacks).to have(1).item
|
12
12
|
expect(request.callbacks[0]).to be == callback
|
13
13
|
end
|
14
14
|
|
15
15
|
it 'should store multiple callback' do
|
16
|
-
request.on_complete {|
|
17
|
-
request.on_complete
|
16
|
+
request.on_complete { |res| "abc" }
|
17
|
+
request.on_complete &callback
|
18
18
|
|
19
19
|
expect(request.callbacks).to have(2).item
|
20
20
|
expect(request.callbacks[0]).to be == callback
|
@@ -27,16 +27,16 @@ describe Acfs::Request::Callbacks do
|
|
27
27
|
it 'should trigger registered callbacks with given response' do
|
28
28
|
expect(callback).to receive(:call).with(response, kind_of(Proc))
|
29
29
|
|
30
|
-
request.on_complete
|
30
|
+
request.on_complete &callback
|
31
31
|
request.complete! response
|
32
32
|
end
|
33
33
|
|
34
34
|
it 'should trigger multiple callback in reverted insertion order' do
|
35
35
|
check = []
|
36
36
|
|
37
|
-
request.on_complete {|res, nxt| check << 1; nxt.call res }
|
38
|
-
request.on_complete {|res, nxt| check << 2; nxt.call res }
|
39
|
-
request.on_complete {|res, nxt| check << 3; nxt.call res }
|
37
|
+
request.on_complete { |res, nxt| check << 1; nxt.call res }
|
38
|
+
request.on_complete { |res, nxt| check << 2; nxt.call res }
|
39
|
+
request.on_complete { |res, nxt| check << 3; nxt.call res }
|
40
40
|
|
41
41
|
request.complete! response
|
42
42
|
|
data/spec/acfs/request_spec.rb
CHANGED
@@ -15,7 +15,7 @@ describe Acfs::Request do
|
|
15
15
|
end
|
16
16
|
|
17
17
|
context 'with parameters' do
|
18
|
-
let(:params) { {id: 10
|
18
|
+
let(:params) { { id: 10 }}
|
19
19
|
|
20
20
|
it 'should return URL without query' do
|
21
21
|
expect(request.url).to be == "#{url}"
|
@@ -24,7 +24,7 @@ describe Acfs::Request do
|
|
24
24
|
end
|
25
25
|
|
26
26
|
describe '#headers' do
|
27
|
-
let(:headers) { {'Accept' => 'application/json'} }
|
27
|
+
let(:headers) { { 'Accept' => 'application/json' } }
|
28
28
|
|
29
29
|
it 'should return request headers' do
|
30
30
|
expect(request.headers).to be == headers
|
@@ -46,7 +46,7 @@ describe Acfs::Request do
|
|
46
46
|
end
|
47
47
|
|
48
48
|
describe '#params' do
|
49
|
-
let(:params) { {id: 10
|
49
|
+
let(:params) { { id: 10 }}
|
50
50
|
|
51
51
|
it 'should return request headers' do
|
52
52
|
expect(request.params).to be == params
|
@@ -54,7 +54,7 @@ describe Acfs::Request do
|
|
54
54
|
end
|
55
55
|
|
56
56
|
describe '#data' do
|
57
|
-
let(:data) { {id: 10, name: 'Anon'} }
|
57
|
+
let(:data) { { id: 10, name: 'Anon' } }
|
58
58
|
|
59
59
|
it 'should return request data' do
|
60
60
|
expect(request.data).to be == data
|
@@ -63,7 +63,7 @@ describe Acfs::Request do
|
|
63
63
|
|
64
64
|
describe '#data' do
|
65
65
|
context 'with data' do
|
66
|
-
let(:data) { {id: 10, name: 'Anon'} }
|
66
|
+
let(:data) { { id: 10, name: 'Anon' } }
|
67
67
|
|
68
68
|
it { expect(request).to be_data }
|
69
69
|
end
|
@@ -3,54 +3,23 @@ require 'spec_helper'
|
|
3
3
|
describe Acfs::Resource::Attributes::Boolean do
|
4
4
|
subject { Acfs::Resource::Attributes::Boolean.new }
|
5
5
|
|
6
|
-
describe '
|
7
|
-
it '
|
8
|
-
expect(subject.cast(nil)).to eq nil
|
9
|
-
end
|
10
|
-
|
11
|
-
it 'casts empty string to false' do
|
12
|
-
expect(subject.cast('')).to eq nil
|
13
|
-
end
|
14
|
-
|
15
|
-
it 'casts blank string to false' do
|
16
|
-
expect(subject.cast(" \t")).to eq nil
|
17
|
-
end
|
18
|
-
|
19
|
-
it 'preserves boolean values' do
|
6
|
+
describe 'cast' do
|
7
|
+
it 'should preserve boolean values' do
|
20
8
|
expect(subject.cast(false)).to eq false
|
21
9
|
expect(subject.cast(true)).to eq true
|
22
10
|
end
|
23
11
|
|
24
|
-
it '
|
25
|
-
expect(subject.cast(false)).to eq false
|
26
|
-
expect(subject.cast(0)).to eq false
|
27
|
-
expect(subject.cast('0')).to eq false
|
28
|
-
expect(subject.cast('no')).to eq false
|
29
|
-
expect(subject.cast('NO')).to eq false
|
30
|
-
expect(subject.cast('off')).to eq false
|
31
|
-
expect(subject.cast('OFF')).to eq false
|
32
|
-
expect(subject.cast('false')).to eq false
|
33
|
-
expect(subject.cast('FALSE')).to eq false
|
34
|
-
expect(subject.cast('f')).to eq false
|
35
|
-
expect(subject.cast('F')).to eq false
|
36
|
-
end
|
37
|
-
|
38
|
-
it 'casts any other value to true' do
|
39
|
-
expect(subject.cast(true)).to eq true
|
40
|
-
expect(subject.cast(1)).to eq true
|
41
|
-
expect(subject.cast('1')).to eq true
|
12
|
+
it 'should cast TRUE_VALUES to true' do
|
42
13
|
expect(subject.cast('yes')).to eq true
|
43
|
-
expect(subject.cast('YES')).to eq true
|
44
14
|
expect(subject.cast('on')).to eq true
|
45
|
-
expect(subject.cast('ON')).to eq true
|
46
15
|
expect(subject.cast('true')).to eq true
|
47
|
-
expect(subject.cast('
|
48
|
-
|
49
|
-
expect(subject.cast('T')).to eq true
|
16
|
+
expect(subject.cast('1')).to eq true
|
17
|
+
end
|
50
18
|
|
51
|
-
|
52
|
-
expect(subject.cast('
|
53
|
-
expect(subject.cast('
|
19
|
+
it 'should cast any other value to false' do
|
20
|
+
expect(subject.cast('')).to eq false
|
21
|
+
expect(subject.cast('wrong')).to eq false
|
22
|
+
expect(subject.cast('random')).to eq false
|
54
23
|
end
|
55
24
|
end
|
56
25
|
end
|
@@ -1,49 +1,55 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Acfs::Resource::Attributes::DateTime do
|
4
|
-
let(:
|
4
|
+
let(:model) { Class.new Acfs::Resource }
|
5
|
+
let(:params) { {} }
|
6
|
+
subject { Acfs::Resource::Attributes::DateTime.new params }
|
5
7
|
|
6
|
-
describe '
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
it { expect(subject.call).to eq nil }
|
8
|
+
describe 'cast' do
|
9
|
+
it 'should return same object, if obj is already of DateTime class' do
|
10
|
+
date_time = DateTime.now
|
11
|
+
retval = subject.cast(date_time)
|
12
|
+
expect(retval).to be == date_time
|
12
13
|
end
|
13
14
|
|
14
|
-
|
15
|
-
|
16
|
-
|
15
|
+
it 'should return parsed object, if obj is of Time class' do
|
16
|
+
time = Time.now
|
17
|
+
retval = subject.cast(time)
|
18
|
+
expect(retval).to be == DateTime.iso8601(time.iso8601)
|
17
19
|
end
|
18
20
|
|
19
|
-
|
20
|
-
|
21
|
-
|
21
|
+
it 'should return parsed object, if obj is of Date class' do
|
22
|
+
date = Date.today
|
23
|
+
retval = subject.cast(date)
|
24
|
+
expect(retval).to be == DateTime.iso8601(date.iso8601)
|
22
25
|
end
|
23
26
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
+
it 'should return parsed object, if obj is of String class in ISO-8601 format' do
|
28
|
+
date_time_string = DateTime.now.iso8601
|
29
|
+
retval = subject.cast(date_time_string)
|
30
|
+
expect(retval).to be == DateTime.iso8601(date_time_string)
|
27
31
|
end
|
28
32
|
|
29
|
-
|
30
|
-
|
31
|
-
|
33
|
+
it 'should raise an error if obj is of String class not in valid ISO-8601 format' do
|
34
|
+
malformed_string = 'qwe123'
|
35
|
+
expect {
|
36
|
+
subject.cast(malformed_string)
|
37
|
+
}.to raise_error ArgumentError
|
32
38
|
end
|
33
39
|
|
34
|
-
|
35
|
-
|
36
|
-
|
40
|
+
it 'should raise an error if obj is of wrong class (Fixnum)' do
|
41
|
+
fixnum = 12
|
42
|
+
expect {
|
43
|
+
subject.cast(fixnum)
|
44
|
+
}.to raise_error TypeError
|
37
45
|
end
|
38
46
|
|
39
|
-
context 'with
|
40
|
-
let(:
|
41
|
-
it { expect(subject.call.iso8601).to eq value }
|
42
|
-
end
|
47
|
+
context 'with allow_nil option' do
|
48
|
+
let(:params) { {allow_nil: true} }
|
43
49
|
|
44
|
-
|
45
|
-
|
46
|
-
|
50
|
+
it 'should accept empty string as nil' do
|
51
|
+
expect(subject.cast('')).to eq nil
|
52
|
+
end
|
47
53
|
end
|
48
54
|
end
|
49
55
|
end
|