acfs 1.4.0 → 1.7.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (73) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +26 -0
  3. data/README.md +22 -39
  4. data/acfs.gemspec +8 -14
  5. data/lib/acfs/adapter/base.rb +2 -0
  6. data/lib/acfs/adapter/typhoeus.rb +16 -11
  7. data/lib/acfs/collections/paginatable.rb +1 -1
  8. data/lib/acfs/configuration.rb +13 -3
  9. data/lib/acfs/errors.rb +41 -21
  10. data/lib/acfs/global.rb +2 -2
  11. data/lib/acfs/location.rb +26 -32
  12. data/lib/acfs/middleware/base.rb +2 -2
  13. data/lib/acfs/middleware/json.rb +4 -2
  14. data/lib/acfs/middleware/logger.rb +4 -6
  15. data/lib/acfs/middleware/serializer.rb +1 -1
  16. data/lib/acfs/operation.rb +21 -8
  17. data/lib/acfs/request/callbacks.rb +4 -4
  18. data/lib/acfs/request.rb +4 -11
  19. data/lib/acfs/resource/attributes/date_time.rb +1 -1
  20. data/lib/acfs/resource/attributes/uuid.rb +1 -1
  21. data/lib/acfs/resource/attributes.rb +16 -15
  22. data/lib/acfs/resource/dirty.rb +2 -2
  23. data/lib/acfs/resource/initialization.rb +5 -5
  24. data/lib/acfs/resource/locatable.rb +11 -8
  25. data/lib/acfs/resource/operational.rb +6 -3
  26. data/lib/acfs/resource/persistence.rb +13 -15
  27. data/lib/acfs/resource/query_methods.rb +10 -10
  28. data/lib/acfs/resource/service.rb +2 -2
  29. data/lib/acfs/resource/validation.rb +17 -7
  30. data/lib/acfs/response.rb +5 -5
  31. data/lib/acfs/runner.rb +15 -15
  32. data/lib/acfs/service.rb +16 -19
  33. data/lib/acfs/singleton_resource.rb +2 -2
  34. data/lib/acfs/stub.rb +41 -31
  35. data/lib/acfs/version.rb +2 -2
  36. data/spec/acfs/adapter/typhoeus_spec.rb +2 -2
  37. data/spec/acfs/collection_spec.rb +66 -41
  38. data/spec/acfs/configuration_spec.rb +22 -12
  39. data/spec/acfs/global_spec.rb +11 -9
  40. data/spec/acfs/location_spec.rb +2 -2
  41. data/spec/acfs/middleware/json_spec.rb +22 -8
  42. data/spec/acfs/middleware/{msgpack_spec.rb → message_pack_spec.rb} +6 -6
  43. data/spec/acfs/operation_spec.rb +3 -2
  44. data/spec/acfs/request/callbacks_spec.rb +19 -10
  45. data/spec/acfs/request_spec.rb +16 -20
  46. data/spec/acfs/resource/attributes/boolean_spec.rb +32 -32
  47. data/spec/acfs/resource/attributes/date_time_spec.rb +16 -8
  48. data/spec/acfs/resource/attributes/dict_spec.rb +15 -9
  49. data/spec/acfs/resource/attributes/float_spec.rb +20 -10
  50. data/spec/acfs/resource/attributes/integer_spec.rb +10 -5
  51. data/spec/acfs/resource/attributes/list_spec.rb +13 -8
  52. data/spec/acfs/resource/attributes/uuid_spec.rb +12 -6
  53. data/spec/acfs/resource/attributes_spec.rb +37 -38
  54. data/spec/acfs/resource/dirty_spec.rb +6 -3
  55. data/spec/acfs/resource/initialization_spec.rb +4 -5
  56. data/spec/acfs/resource/loadable_spec.rb +3 -1
  57. data/spec/acfs/resource/locatable_spec.rb +24 -18
  58. data/spec/acfs/resource/{persistance_spec.rb → persistence_spec.rb} +122 -90
  59. data/spec/acfs/resource/query_methods_spec.rb +143 -110
  60. data/spec/acfs/resource/validation_spec.rb +34 -27
  61. data/spec/acfs/response/formats_spec.rb +8 -8
  62. data/spec/acfs/response/status_spec.rb +16 -9
  63. data/spec/acfs/runner_spec.rb +10 -8
  64. data/spec/acfs/service/middleware_spec.rb +3 -3
  65. data/spec/acfs/service_spec.rb +6 -5
  66. data/spec/acfs/singleton_resource_spec.rb +2 -1
  67. data/spec/acfs/stub_spec.rb +57 -53
  68. data/spec/acfs_spec.rb +111 -93
  69. data/spec/spec_helper.rb +1 -2
  70. data/spec/support/response.rb +2 -2
  71. data/spec/support/service.rb +1 -1
  72. data/spec/support/shared/find_callbacks.rb +14 -10
  73. metadata +30 -29
@@ -16,23 +16,23 @@ describe Acfs::Middleware::MessagePack do
16
16
 
17
17
  describe 'encode' do
18
18
  context 'with not serialized request' do
19
- it 'should set Content-Type' do
19
+ it 'sets Content-Type' do
20
20
  expect(request.headers['Content-Type']).to eq 'application/x-msgpack'
21
21
  end
22
22
 
23
- it 'should append Accept header' do
23
+ it 'appends Accept header' do
24
24
  expect(request.headers['Accept']).to eq 'application/x-msgpack;q=1'
25
25
  end
26
26
 
27
27
  context 'with JSON chained' do
28
28
  let(:decoder) { Acfs::Middleware::JSON.new super(), q: 0.5 }
29
29
 
30
- it 'should append to Accept header' do
30
+ it 'appends to Accept header' do
31
31
  expect(request.headers['Accept']).to eq 'application/json;q=0.5,application/x-msgpack;q=1'
32
32
  end
33
33
  end
34
34
 
35
- it 'should serialize data to MessagePack' do
35
+ it 'serializes data to MessagePack' do
36
36
  expect(MessagePack.unpack(request.body)).to eq data.map(&:stringify_keys)
37
37
  end
38
38
  end
@@ -42,7 +42,7 @@ describe Acfs::Middleware::MessagePack do
42
42
  let(:headers) { {'Content-Type' => 'application/x-msgpack'} }
43
43
  let(:body) { MessagePack.pack data }
44
44
 
45
- it 'should decode body data' do
45
+ it 'decodes body data' do
46
46
  request.complete! response
47
47
 
48
48
  expect(response.data).to be == data.map(&:stringify_keys)
@@ -53,7 +53,7 @@ describe Acfs::Middleware::MessagePack do
53
53
  let(:headers) { {'Content-Type' => 'application/text'} }
54
54
  let(:body) { data.to_json }
55
55
 
56
- it 'should not decode non-MessagePack encoded responses' do
56
+ it 'does not decode non-MessagePack encoded responses' do
57
57
  request.complete! response
58
58
 
59
59
  expect(response.data).to be_nil
@@ -5,8 +5,9 @@ require 'spec_helper'
5
5
  describe ::Acfs::Operation do
6
6
  let(:operation) { described_class.new MyUser, :read, params: {id: 0} }
7
7
 
8
- context '#request' do
8
+ describe '#request' do
9
9
  subject { operation.request }
10
- its(:operation) { should eq operation }
10
+
11
+ its(:operation) { is_expected.to eq operation }
11
12
  end
12
13
  end
@@ -7,42 +7,51 @@ describe Acfs::Request::Callbacks do
7
7
  let(:request) { Acfs::Request.new('fubar') }
8
8
 
9
9
  describe '#on_complete' do
10
- it 'should store a given callback' do
10
+ it 'stores a given callback' do
11
11
  request.on_complete(&callback)
12
12
 
13
13
  expect(request.callbacks).to have(1).item
14
- expect(request.callbacks[0]).to be == callback
14
+ expect(request.callbacks[0]).to eq callback
15
15
  end
16
16
 
17
- it 'should store multiple callback' do
17
+ it 'stores multiple callback' do
18
18
  request.on_complete {|_res| 'abc' }
19
19
  request.on_complete(&callback)
20
20
 
21
21
  expect(request.callbacks).to have(2).item
22
- expect(request.callbacks[0]).to be == callback
22
+ expect(request.callbacks[0]).to eq callback
23
23
  end
24
24
  end
25
25
 
26
26
  describe '#complete!' do
27
27
  let(:response) { Acfs::Response.new(request) }
28
28
 
29
- it 'should trigger registered callbacks with given response' do
29
+ it 'triggers registered callbacks with given response' do
30
30
  expect(callback).to receive(:call).with(response, kind_of(Proc))
31
31
 
32
32
  request.on_complete(&callback)
33
33
  request.complete! response
34
34
  end
35
35
 
36
- it 'should trigger multiple callback in reverted insertion order' do
36
+ it 'triggers multiple callback in reverted insertion order' do
37
37
  check = []
38
38
 
39
- request.on_complete {|res, nxt| check << 1; nxt.call res }
40
- request.on_complete {|res, nxt| check << 2; nxt.call res }
41
- request.on_complete {|res, nxt| check << 3; nxt.call res }
39
+ request.on_complete do |res, nxt|
40
+ check << 1
41
+ nxt.call res
42
+ end
43
+ request.on_complete do |res, nxt|
44
+ check << 2
45
+ nxt.call res
46
+ end
47
+ request.on_complete do |res, nxt|
48
+ check << 3
49
+ nxt.call res
50
+ end
42
51
 
43
52
  request.complete! response
44
53
 
45
- expect(check).to be == [3, 2, 1]
54
+ expect(check).to eq [3, 2, 1]
46
55
  end
47
56
  end
48
57
  end
@@ -9,18 +9,18 @@ describe Acfs::Request do
9
9
  let(:data) { nil }
10
10
  let(:method) { :get }
11
11
  let(:options) { {method: method, headers: headers, params: params, data: data} }
12
- let(:request) { Acfs::Request.new(url, options) }
12
+ let(:request) { Acfs::Request.new(url, **options) }
13
13
 
14
14
  describe '#url' do
15
- it 'should return request URL' do
16
- expect(request.url).to be == url
15
+ it 'returns request URL' do
16
+ expect(request.url).to eq url
17
17
  end
18
18
 
19
19
  context 'with parameters' do
20
20
  let(:params) { {id: 10} }
21
21
 
22
- it 'should return URL without query' do
23
- expect(request.url).to be == url.to_s
22
+ it 'returns URL without query' do
23
+ expect(request.url).to eq url.to_s
24
24
  end
25
25
  end
26
26
  end
@@ -28,8 +28,8 @@ describe Acfs::Request do
28
28
  describe '#headers' do
29
29
  let(:headers) { {'Accept' => 'application/json'} }
30
30
 
31
- it 'should return request headers' do
32
- expect(request.headers).to be == headers
31
+ it 'returns request headers' do
32
+ expect(request.headers).to eq headers
33
33
  end
34
34
  end
35
35
 
@@ -37,43 +37,39 @@ describe Acfs::Request do
37
37
  context 'when nil given' do
38
38
  let(:method) { nil }
39
39
 
40
- it 'should default to :get' do
41
- expect(request.method).to be == :get
40
+ it 'defaults to :get' do
41
+ expect(request.method).to eq :get
42
42
  end
43
43
  end
44
44
 
45
- it 'should return request method' do
46
- expect(request.method).to be == method
45
+ it 'returns request method' do
46
+ expect(request.method).to eq method
47
47
  end
48
48
  end
49
49
 
50
50
  describe '#params' do
51
51
  let(:params) { {id: 10} }
52
52
 
53
- it 'should return request headers' do
54
- expect(request.params).to be == params
53
+ it 'returns request headers' do
54
+ expect(request.params).to eq params
55
55
  end
56
56
  end
57
57
 
58
58
  describe '#data' do
59
59
  let(:data) { {id: 10, name: 'Anon'} }
60
60
 
61
- it 'should return request data' do
62
- expect(request.data).to be == data
61
+ it 'returns request data' do
62
+ expect(request.data).to eq data
63
63
  end
64
- end
65
64
 
66
- describe '#data' do
67
65
  context 'with data' do
68
- let(:data) { {id: 10, name: 'Anon'} }
69
-
70
66
  it { expect(request).to be_data }
71
67
  end
72
68
 
73
69
  context 'without data' do
74
70
  let(:data) { nil }
75
71
 
76
- it { expect(request).to_not be_data }
72
+ it { expect(request).not_to be_data }
77
73
  end
78
74
  end
79
75
  end
@@ -3,56 +3,56 @@
3
3
  require 'spec_helper'
4
4
 
5
5
  describe Acfs::Resource::Attributes::Boolean do
6
- subject { Acfs::Resource::Attributes::Boolean.new }
6
+ subject(:type) { Acfs::Resource::Attributes::Boolean.new }
7
7
 
8
8
  describe '#cast' do
9
9
  it 'casts nil' do
10
- expect(subject.cast(nil)).to eq nil
10
+ expect(type.cast(nil)).to eq nil
11
11
  end
12
12
 
13
13
  it 'casts empty string to false' do
14
- expect(subject.cast('')).to eq nil
14
+ expect(type.cast('')).to eq nil
15
15
  end
16
16
 
17
17
  it 'casts blank string to false' do
18
- expect(subject.cast(" \t")).to eq nil
18
+ expect(type.cast(" \t")).to eq nil
19
19
  end
20
20
 
21
21
  it 'preserves boolean values' do
22
- expect(subject.cast(false)).to eq false
23
- expect(subject.cast(true)).to eq true
22
+ expect(type.cast(false)).to eq false
23
+ expect(type.cast(true)).to eq true
24
24
  end
25
25
 
26
26
  it 'casts falsy values to false' do
27
- expect(subject.cast(false)).to eq false
28
- expect(subject.cast(0)).to eq false
29
- expect(subject.cast('0')).to eq false
30
- expect(subject.cast('no')).to eq false
31
- expect(subject.cast('NO')).to eq false
32
- expect(subject.cast('off')).to eq false
33
- expect(subject.cast('OFF')).to eq false
34
- expect(subject.cast('false')).to eq false
35
- expect(subject.cast('FALSE')).to eq false
36
- expect(subject.cast('f')).to eq false
37
- expect(subject.cast('F')).to eq false
27
+ expect(type.cast(false)).to eq false
28
+ expect(type.cast(0)).to eq false
29
+ expect(type.cast('0')).to eq false
30
+ expect(type.cast('no')).to eq false
31
+ expect(type.cast('NO')).to eq false
32
+ expect(type.cast('off')).to eq false
33
+ expect(type.cast('OFF')).to eq false
34
+ expect(type.cast('false')).to eq false
35
+ expect(type.cast('FALSE')).to eq false
36
+ expect(type.cast('f')).to eq false
37
+ expect(type.cast('F')).to eq false
38
38
  end
39
39
 
40
40
  it 'casts any other value to true' do
41
- expect(subject.cast(true)).to eq true
42
- expect(subject.cast(1)).to eq true
43
- expect(subject.cast('1')).to eq true
44
- expect(subject.cast('yes')).to eq true
45
- expect(subject.cast('YES')).to eq true
46
- expect(subject.cast('on')).to eq true
47
- expect(subject.cast('ON')).to eq true
48
- expect(subject.cast('true')).to eq true
49
- expect(subject.cast('TRUE')).to eq true
50
- expect(subject.cast('t')).to eq true
51
- expect(subject.cast('T')).to eq true
52
-
53
- expect(subject.cast(2)).to eq true
54
- expect(subject.cast('wrong')).to eq true
55
- expect(subject.cast('random')).to eq true
41
+ expect(type.cast(true)).to eq true
42
+ expect(type.cast(1)).to eq true
43
+ expect(type.cast('1')).to eq true
44
+ expect(type.cast('yes')).to eq true
45
+ expect(type.cast('YES')).to eq true
46
+ expect(type.cast('on')).to eq true
47
+ expect(type.cast('ON')).to eq true
48
+ expect(type.cast('true')).to eq true
49
+ expect(type.cast('TRUE')).to eq true
50
+ expect(type.cast('t')).to eq true
51
+ expect(type.cast('T')).to eq true
52
+
53
+ expect(type.cast(2)).to eq true
54
+ expect(type.cast('wrong')).to eq true
55
+ expect(type.cast('random')).to eq true
56
56
  end
57
57
  end
58
58
  end
@@ -6,45 +6,53 @@ describe Acfs::Resource::Attributes::DateTime do
6
6
  let(:type) { Acfs::Resource::Attributes::DateTime.new }
7
7
 
8
8
  describe '#cast' do
9
- subject { -> { type.cast value } }
9
+ subject(:cast) { -> { type.cast value } }
10
10
 
11
11
  context 'with nil' do
12
12
  let(:value) { nil }
13
- it { expect(subject.call).to eq nil }
13
+
14
+ it { expect(cast.call).to eq nil }
14
15
  end
15
16
 
16
17
  context 'with empty string' do
17
18
  let(:value) { '' }
18
- it { expect(subject.call).to eq nil }
19
+
20
+ it { expect(cast.call).to eq nil }
19
21
  end
20
22
 
21
23
  context 'with blank string' do
22
24
  let(:value) { " \t" }
23
- it { expect(subject.call).to eq nil }
25
+
26
+ it { expect(cast.call).to eq nil }
24
27
  end
25
28
 
26
29
  context 'with DateTime' do
27
30
  let(:value) { DateTime.now }
28
- it { expect(subject.call).to eq value }
31
+
32
+ it { expect(cast.call).to eq value }
29
33
  end
30
34
 
31
35
  context 'with Time' do
32
36
  let(:value) { Time.now }
33
- it { expect(subject.call).to eq value.to_datetime }
37
+
38
+ it { expect(cast.call).to eq value.to_datetime }
34
39
  end
35
40
 
36
41
  context 'with Date' do
37
42
  let(:value) { Date.today }
38
- it { expect(subject.call).to eq value.to_datetime }
43
+
44
+ it { expect(cast.call).to eq value.to_datetime }
39
45
  end
40
46
 
41
47
  context 'with ISO8601' do
42
48
  let(:value) { DateTime.now.iso8601 }
43
- it { expect(subject.call.iso8601).to eq value }
49
+
50
+ it { expect(cast.call.iso8601).to eq value }
44
51
  end
45
52
 
46
53
  context 'with invalid string' do
47
54
  let(:value) { 'qwe123' }
55
+
48
56
  it { is_expected.to raise_error ArgumentError }
49
57
  end
50
58
  end
@@ -6,30 +6,35 @@ describe Acfs::Resource::Attributes::Dict do
6
6
  let(:type) { Acfs::Resource::Attributes::Dict.new }
7
7
 
8
8
  describe '#cast' do
9
- subject { -> { type.cast value } }
9
+ subject(:cast) { -> { type.cast value } }
10
10
 
11
11
  context 'with nil' do
12
12
  let(:value) { nil }
13
- it { expect(subject.call).to eq nil }
13
+
14
+ it { expect(cast.call).to eq nil }
14
15
  end
15
16
 
16
17
  context 'with blank string (I)' do
17
18
  let(:value) { '' }
18
- it { expect(subject.call).to eq({}) }
19
+
20
+ it { expect(cast.call).to eq({}) }
19
21
  end
20
22
 
21
23
  context 'with blank string (II)' do
22
24
  let(:value) { " \t" }
23
- it { expect(subject.call).to eq({}) }
25
+
26
+ it { expect(cast.call).to eq({}) }
24
27
  end
25
28
 
26
29
  context 'with hash' do
27
30
  let(:value) { {3 => true, abc: 4} }
28
- it { expect(subject.call).to eq value }
31
+
32
+ it { expect(cast.call).to eq value }
29
33
  end
30
34
 
31
35
  context 'with non hashable object' do
32
36
  let(:value) { Object.new }
37
+
33
38
  it { is_expected.to raise_error TypeError }
34
39
  end
35
40
 
@@ -42,7 +47,7 @@ describe Acfs::Resource::Attributes::Dict do
42
47
  end.new
43
48
  end
44
49
 
45
- it { expect(subject.call).to eq id: value.object_id }
50
+ it { expect(cast.call).to eq id: value.object_id }
46
51
  end
47
52
 
48
53
  context 'with hashable object (II)' do
@@ -54,7 +59,7 @@ describe Acfs::Resource::Attributes::Dict do
54
59
  end.new
55
60
  end
56
61
 
57
- it { expect(subject.call).to eq id: value.object_id }
62
+ it { expect(cast.call).to eq id: value.object_id }
58
63
  end
59
64
 
60
65
  context 'with serializable object' do
@@ -66,12 +71,13 @@ describe Acfs::Resource::Attributes::Dict do
66
71
  end.new
67
72
  end
68
73
 
69
- it { expect(subject.call).to eq id: value.object_id }
74
+ it { expect(cast.call).to eq id: value.object_id }
70
75
  end
71
76
 
72
77
  context 'with hash subclass object' do
73
78
  let(:value) { HashWithIndifferentAccess.new test: :foo }
74
- it { expect(subject.call).to be value }
79
+
80
+ it { expect(cast.call).to be value }
75
81
  end
76
82
  end
77
83
  end
@@ -6,55 +6,65 @@ describe Acfs::Resource::Attributes::Float do
6
6
  let(:type) { Acfs::Resource::Attributes::Float.new }
7
7
 
8
8
  describe '#cast' do
9
- subject { -> { type.cast value } }
9
+ subject(:cast) { -> { type.cast value } }
10
10
 
11
11
  context 'with nil' do
12
12
  let(:value) { nil }
13
- it { expect(subject.call).to eq nil }
13
+
14
+ it { expect(cast.call).to eq nil }
14
15
  end
15
16
 
16
17
  context 'with blank string (I)' do
17
18
  let(:value) { '' }
18
- it { expect(subject.call).to eq 0.0 }
19
+
20
+ it { expect(cast.call).to eq 0.0 }
19
21
  end
20
22
 
21
23
  context 'with blank string (II)' do
22
24
  let(:value) { " \t" }
23
- it { expect(subject.call).to eq 0.0 }
25
+
26
+ it { expect(cast.call).to eq 0.0 }
24
27
  end
25
28
 
26
29
  context 'with float' do
27
30
  let(:value) { 1.7 }
28
- it { expect(subject.call).to eq 1.7 }
31
+
32
+ it { expect(cast.call).to eq 1.7 }
29
33
  end
30
34
 
31
35
  context 'with Infinity' do
32
36
  let(:value) { 'Infinity' }
33
- it { expect(subject.call).to eq ::Float::INFINITY }
37
+
38
+ it { expect(cast.call).to eq ::Float::INFINITY }
34
39
  end
35
40
 
36
41
  context 'with -Infinity' do
37
42
  let(:value) { '-Infinity' }
38
- it { expect(subject.call).to eq -::Float::INFINITY }
43
+
44
+ it { expect(cast.call).to eq(-::Float::INFINITY) }
39
45
  end
40
46
 
41
47
  context 'with NaN' do
42
48
  let(:value) { 'NaN' }
43
- it { expect(subject.call).to be_nan }
49
+
50
+ it { expect(cast.call).to be_nan }
44
51
  end
45
52
 
46
53
  context 'with fixnum' do
47
54
  let(:value) { 1 }
48
- it { expect(subject.call).to eq 1.0 }
55
+
56
+ it { expect(cast.call).to eq 1.0 }
49
57
  end
50
58
 
51
59
  context 'with valid string' do
52
60
  let(:value) { '1.7' }
53
- it { expect(subject.call).to eq 1.7 }
61
+
62
+ it { expect(cast.call).to eq 1.7 }
54
63
  end
55
64
 
56
65
  context 'with invalid string (I)' do
57
66
  let(:value) { '1.7a' }
67
+
58
68
  it { is_expected.to raise_error ArgumentError }
59
69
  end
60
70
  end
@@ -6,30 +6,35 @@ describe Acfs::Resource::Attributes::Integer do
6
6
  let(:type) { Acfs::Resource::Attributes::Integer.new }
7
7
 
8
8
  describe '#cast' do
9
- subject { -> { type.cast value } }
9
+ subject(:cast) { -> { type.cast value } }
10
10
 
11
11
  context 'with nil' do
12
12
  let(:value) { nil }
13
- it { expect(subject.call).to eq nil }
13
+
14
+ it { expect(cast.call).to eq nil }
14
15
  end
15
16
 
16
17
  context 'with empty string' do
17
18
  let(:value) { '' }
18
- it { expect(subject.call).to eq 0 }
19
+
20
+ it { expect(cast.call).to eq 0 }
19
21
  end
20
22
 
21
23
  context 'with blank string' do
22
24
  let(:value) { " \t" }
23
- it { expect(subject.call).to eq 0 }
25
+
26
+ it { expect(cast.call).to eq 0 }
24
27
  end
25
28
 
26
29
  context 'with string' do
27
30
  let(:value) { '123' }
28
- it { expect(subject.call).to eq 123 }
31
+
32
+ it { expect(cast.call).to eq 123 }
29
33
  end
30
34
 
31
35
  context 'with invalid string' do
32
36
  let(:value) { '123a' }
37
+
33
38
  it { is_expected.to raise_error ArgumentError }
34
39
  end
35
40
  end
@@ -6,26 +6,30 @@ describe Acfs::Resource::Attributes::List do
6
6
  let(:type) { Acfs::Resource::Attributes::List.new }
7
7
 
8
8
  describe '#cast' do
9
- subject { -> { type.cast value } }
9
+ subject(:cast) { -> { type.cast value } }
10
10
 
11
11
  context 'with nil' do
12
12
  let(:value) { nil }
13
- it { expect(subject.call).to eq nil }
13
+
14
+ it { expect(cast.call).to eq nil }
14
15
  end
15
16
 
16
17
  context 'with blank string (I)' do
17
18
  let(:value) { '' }
18
- it { expect(subject.call).to eq [] }
19
+
20
+ it { expect(cast.call).to eq [] }
19
21
  end
20
22
 
21
23
  context 'with blank string (II)' do
22
24
  let(:value) { " \t" }
23
- it { expect(subject.call).to eq [] }
25
+
26
+ it { expect(cast.call).to eq [] }
24
27
  end
25
28
 
26
29
  context 'with array' do
27
30
  let(:value) { %w[abc cde efg] }
28
- it { expect(subject.call).to eq value }
31
+
32
+ it { expect(cast.call).to eq value }
29
33
  end
30
34
 
31
35
  context 'with convertable object (I)' do
@@ -37,7 +41,7 @@ describe Acfs::Resource::Attributes::List do
37
41
  end.new
38
42
  end
39
43
 
40
- it { expect(subject.call).to eq [1, 2, 3] }
44
+ it { expect(cast.call).to eq [1, 2, 3] }
41
45
  end
42
46
 
43
47
  context 'with convertable object (II)' do
@@ -49,12 +53,13 @@ describe Acfs::Resource::Attributes::List do
49
53
  end.new
50
54
  end
51
55
 
52
- it { expect(subject.call).to eq [1, 2, 3] }
56
+ it { expect(cast.call).to eq [1, 2, 3] }
53
57
  end
54
58
 
55
59
  context 'with non castable object' do
56
60
  let(:value) { Object.new }
57
- it { expect(subject.call).to eq [value] }
61
+
62
+ it { expect(cast.call).to eq [value] }
58
63
  end
59
64
  end
60
65
  end
@@ -6,36 +6,42 @@ describe Acfs::Resource::Attributes::UUID do
6
6
  let(:type) { Acfs::Resource::Attributes::UUID.new }
7
7
 
8
8
  describe '#cast' do
9
- subject { -> { type.cast(value) } }
9
+ subject(:cast) { -> { type.cast(value) } }
10
10
 
11
11
  context 'with nil' do
12
12
  let(:value) { nil }
13
- it { expect(subject.call).to eq nil }
13
+
14
+ it { expect(cast.call).to eq nil }
14
15
  end
15
16
 
16
17
  context 'with empty string' do
17
18
  let(:value) { '' }
18
- it { expect(subject.call).to eq nil }
19
+
20
+ it { expect(cast.call).to eq nil }
19
21
  end
20
22
 
21
23
  context 'with blank string' do
22
24
  let(:value) { " \t" }
23
- it { expect(subject.call).to eq nil }
25
+
26
+ it { expect(cast.call).to eq nil }
24
27
  end
25
28
 
26
29
  context 'with string UUID' do
27
30
  let(:value) { '450b7a40-94ad-11e3-baa8-0800200c9a66' }
28
- it { expect(subject.call).to be_a String }
29
- it { expect(subject.call).to eq value }
31
+
32
+ it { expect(cast.call).to be_a String }
33
+ it { expect(cast.call).to eq value }
30
34
  end
31
35
 
32
36
  context 'with invalid string' do
33
37
  let(:value) { 'invalid string' }
38
+
34
39
  it { is_expected.to raise_error TypeError, /invalid UUID/i }
35
40
  end
36
41
 
37
42
  context 'with invalid UUID' do
38
43
  let(:value) { 'xxxxxxxx-yyyy-11e3-baa8-0800200c9a66' }
44
+
39
45
  it { is_expected.to raise_error TypeError, /invalid UUID/i }
40
46
  end
41
47
  end