acfs 1.6.0 → 1.7.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (55) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +1 -0
  3. data/README.md +16 -19
  4. data/acfs.gemspec +2 -0
  5. data/lib/acfs/adapter/typhoeus.rb +6 -4
  6. data/lib/acfs/configuration.rb +13 -3
  7. data/lib/acfs/errors.rb +1 -1
  8. data/lib/acfs/global.rb +2 -2
  9. data/lib/acfs/location.rb +1 -1
  10. data/lib/acfs/operation.rb +1 -1
  11. data/lib/acfs/request/callbacks.rb +1 -1
  12. data/lib/acfs/request.rb +1 -1
  13. data/lib/acfs/resource/attributes/uuid.rb +1 -1
  14. data/lib/acfs/resource/locatable.rb +2 -2
  15. data/lib/acfs/resource/query_methods.rb +2 -2
  16. data/lib/acfs/runner.rb +15 -15
  17. data/lib/acfs/stub.rb +34 -29
  18. data/lib/acfs/version.rb +2 -2
  19. data/spec/acfs/adapter/typhoeus_spec.rb +1 -1
  20. data/spec/acfs/collection_spec.rb +66 -41
  21. data/spec/acfs/configuration_spec.rb +22 -12
  22. data/spec/acfs/global_spec.rb +9 -7
  23. data/spec/acfs/middleware/json_spec.rb +8 -8
  24. data/spec/acfs/middleware/{msgpack_spec.rb → message_pack_spec.rb} +6 -6
  25. data/spec/acfs/operation_spec.rb +3 -2
  26. data/spec/acfs/request/callbacks_spec.rb +19 -10
  27. data/spec/acfs/request_spec.rb +15 -19
  28. data/spec/acfs/resource/attributes/boolean_spec.rb +32 -32
  29. data/spec/acfs/resource/attributes/date_time_spec.rb +16 -8
  30. data/spec/acfs/resource/attributes/dict_spec.rb +15 -9
  31. data/spec/acfs/resource/attributes/float_spec.rb +20 -10
  32. data/spec/acfs/resource/attributes/integer_spec.rb +10 -5
  33. data/spec/acfs/resource/attributes/list_spec.rb +13 -8
  34. data/spec/acfs/resource/attributes/uuid_spec.rb +12 -6
  35. data/spec/acfs/resource/attributes_spec.rb +33 -32
  36. data/spec/acfs/resource/dirty_spec.rb +6 -3
  37. data/spec/acfs/resource/initialization_spec.rb +4 -5
  38. data/spec/acfs/resource/loadable_spec.rb +3 -1
  39. data/spec/acfs/resource/locatable_spec.rb +24 -18
  40. data/spec/acfs/resource/{persistance_spec.rb → persistence_spec.rb} +114 -82
  41. data/spec/acfs/resource/query_methods_spec.rb +143 -110
  42. data/spec/acfs/resource/validation_spec.rb +34 -27
  43. data/spec/acfs/response/formats_spec.rb +8 -8
  44. data/spec/acfs/response/status_spec.rb +16 -9
  45. data/spec/acfs/runner_spec.rb +10 -8
  46. data/spec/acfs/service/middleware_spec.rb +3 -3
  47. data/spec/acfs/service_spec.rb +5 -4
  48. data/spec/acfs/singleton_resource_spec.rb +2 -1
  49. data/spec/acfs/stub_spec.rb +57 -53
  50. data/spec/acfs_spec.rb +111 -93
  51. data/spec/spec_helper.rb +1 -1
  52. data/spec/support/response.rb +2 -2
  53. data/spec/support/service.rb +1 -1
  54. data/spec/support/shared/find_callbacks.rb +14 -10
  55. metadata +9 -8
@@ -10,61 +10,70 @@ describe Acfs::Resource::Validation do
10
10
  context 'with valid attributes' do
11
11
  subject { model }
12
12
 
13
- it { should be_valid }
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
- it { should_not be_valid }
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 { should_not be_valid }
37
+ it { is_expected.not_to be_valid }
36
38
 
37
- it 'should not override errors' do
38
- subject.valid?
39
- expect(subject.errors.to_hash).to eq(name: ['can\'t be blank'])
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 { should be_empty }
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 { should_not be_empty }
59
- it { should have(2).items }
64
+ it { is_expected.not_to be_empty }
65
+ it { is_expected.to have(2).items }
60
66
 
61
- it 'should contain a list of error messages' do
62
- expect(subject.to_hash).to eq age: ["can't be blank"], name: ['is invalid']
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 { subject.call }.to raise_error Acfs::InvalidResource }
115
+ it { expect { save.call }.to raise_error Acfs::InvalidResource }
107
116
  end
108
117
 
109
118
  context 'on new resource' do
110
- it 'should validate with `create` context' do
119
+ it 'validates with `create` context' do
111
120
  expect(model).to receive(:valid?).with(:create).and_call_original
112
- subject.call
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 'should validate with `save` context' do
130
+ it 'validates with `save` context' do
121
131
  expect(model).to receive(:valid?).with(:save).and_call_original
122
- subject.call
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 "should fallback on 'text/plain'" do
17
- expect(response.content_type).to be == Mime[:text]
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 'should return Mime::JSON' do
26
- expect(response.content_type).to be == Mime[:json]
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 'should return true' do
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 'should return Mime::JSON' do
41
- expect(response.content_type).to be == Mime[:json]
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 'should return true' do
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 'should return status code' do
18
- expect(response.code).to be == 200
19
- expect(response.status_code).to be == 200
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 'should return zero' do
27
- expect(response.code).to be == 0
28
- expect(response.status_code).to be == 0
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
- it { expect(response).to_not be_success }
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
- it { expect(response).to_not be_success }
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
- it { expect(response).to_not be_modified }
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
@@ -48,7 +48,7 @@ describe ::Acfs::Runner do
48
48
  end
49
49
 
50
50
  describe '#process' do
51
- it 'should trigger event' do
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 'should trigger event' do
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 'should trigger event' do
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
- it 'it should not do requests when a middleware aborted' do
80
- expect(adapter).to_not receive :run
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 nil
88
+ expect_any_instance_of(UserService).to receive(:prepare).and_return(nil)
88
89
  end
89
- it 'it should not do requests when a middleware aborted' do
90
- expect(adapter).to_not receive :queue
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 'should add middleware to list' do
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 'should add middleware to stack' do
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 'should instantiate middleware object' do
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
@@ -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 'should set options' do
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 'should extract resource path name from given class' do
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 'should have custom resource path' do
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 'should return configured URI for service' do
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
@@ -12,6 +12,7 @@ describe Acfs::SingletonResource do
12
12
  end
13
13
 
14
14
  let(:action) { ->(cb) { model.find(&cb) } }
15
- it_should_behave_like 'a query method with multi-callback support'
15
+
16
+ it_behaves_like 'a query method with multi-callback support'
16
17
  end
17
18
  end
@@ -7,8 +7,9 @@ class SpecialCustomError < StandardError; end
7
7
  describe Acfs::Stub do
8
8
  let(:stub) { Class.new(Acfs::Stub) }
9
9
 
10
- before(:all) { Acfs::Stub.enable }
11
- after(:all) { Acfs::Stub.disable }
10
+ before(:all) { Acfs::Stub.enable } # rubocop:disable RSpec/BeforeAfterAll
11
+
12
+ after(:all) { Acfs::Stub.disable } # rubocop:disable RSpec/BeforeAfterAll
12
13
 
13
14
  before do
14
15
  Acfs::Stub.allow_requests = false
@@ -16,16 +17,18 @@ describe Acfs::Stub do
16
17
 
17
18
  describe '#called?' do
18
19
  context 'without specified number' do
19
- let!(:operation) { Acfs::Stub.resource MyUser, :read, with: {id: 1}, return: {id: 1, name: 'John Smith', age: 32} }
20
+ let!(:operation) do
21
+ Acfs::Stub.resource MyUser, :read, with: {id: 1}, return: {id: 1, name: 'John Smith', age: 32}
22
+ end
20
23
 
21
- it 'should allow to test if stub was called' do
24
+ it 'allows to test if stub was called' do
22
25
  MyUser.find 1
23
26
  Acfs.run
24
27
 
25
28
  expect(operation).to be_called
26
29
  end
27
30
 
28
- it 'should allow to test if stub was called a specific number of times' do
31
+ it 'allows to test if stub was called a specific number of times' do
29
32
  MyUser.find 1
30
33
  Acfs.run
31
34
 
@@ -44,7 +47,7 @@ describe Acfs::Stub do
44
47
  Acfs::Stub.resource MyUser, :read, with: {id: 1}, raise: :not_found
45
48
  end
46
49
 
47
- it 'should raise error' do
50
+ it 'raises error' do
48
51
  MyUser.find 1
49
52
 
50
53
  expect { Acfs.run }.to raise_error(Acfs::AmbiguousStubError)
@@ -58,23 +61,23 @@ describe Acfs::Stub do
58
61
  Acfs::Stub.resource MyUser, :read, with: {id: 3}, raise: :not_found
59
62
  end
60
63
 
61
- it 'should allow to stub resource reads' do
64
+ it 'allows to stub resource reads' do
62
65
  user = MyUser.find 1
63
66
  Acfs.run
64
67
 
65
- expect(user.id).to be == 1
66
- expect(user.name).to be == 'John Smith'
67
- expect(user.age).to be == 32
68
+ expect(user.id).to eq 1
69
+ expect(user.name).to eq 'John Smith'
70
+ expect(user.age).to eq 32
68
71
  end
69
72
 
70
73
  context 'with error' do
71
- it 'should allow to raise errors' do
74
+ it 'allows to raise errors' do
72
75
  MyUser.find 2
73
76
 
74
77
  expect { Acfs.run }.to raise_error(SpecialCustomError)
75
78
  end
76
79
 
77
- it 'should allow to raise symbolic errors' do
80
+ it 'allows to raise symbolic errors' do
78
81
  MyUser.find 3
79
82
 
80
83
  expect { Acfs.run }.to raise_error(Acfs::ResourceNotFound)
@@ -87,7 +90,7 @@ describe Acfs::Stub do
87
90
  Acfs::Stub.resource Computer, :read, with: {id: 2}, return: {id: 2, type: 'Mac'}
88
91
  end
89
92
 
90
- it 'should create inherited type' do
93
+ it 'creates inherited type' do
91
94
  pc = Computer.find 1
92
95
  mac = Computer.find 2
93
96
 
@@ -101,18 +104,26 @@ describe Acfs::Stub do
101
104
 
102
105
  context 'with create action' do
103
106
  before do
104
- Acfs::Stub.resource Session, :create, with: {ident: 'john@exmaple.org', password: 's3cr3t'}, return: {id: 'longhash', user: 1}
105
- Acfs::Stub.resource Session, :create, with: ->(op) { op.data[:ident] == 'john@exmaple.org' && op.data[:password] == 'wrong' }, raise: 422
107
+ lmbd = lambda {|op|
108
+ op.data[:ident] == 'john@exmaple.org' && op.data[:password] == 'wrong'
109
+ }
110
+
111
+ Acfs::Stub.resource Session, :create,
112
+ with: {ident: 'john@exmaple.org', password: 's3cr3t'},
113
+ return: {id: 'longhash', user: 1}
114
+ Acfs::Stub.resource Session, :create,
115
+ with: lmbd,
116
+ raise: 422
106
117
  end
107
118
 
108
- it 'should allow stub resource creation' do
119
+ it 'allows stub resource creation' do
109
120
  session = Session.create! ident: 'john@exmaple.org', password: 's3cr3t'
110
121
 
111
- expect(session.id).to be == 'longhash'
112
- expect(session.user).to be == 1
122
+ expect(session.id).to eq 'longhash'
123
+ expect(session.user).to eq 1
113
124
  end
114
125
 
115
- it 'should allow to raise error' do
126
+ it 'allows to raise error' do
116
127
  expect do
117
128
  Session.create! ident: 'john@exmaple.org', password: 'wrong'
118
129
  end.to raise_error(::Acfs::InvalidResource)
@@ -125,14 +136,14 @@ describe Acfs::Stub do
125
136
  return: [{id: 1, name: 'John Smith', age: 32}, {id: 2, name: 'Anon', age: 12}]
126
137
  end
127
138
 
128
- it 'should return collection' do
139
+ it 'returns collection' do
129
140
  users = MyUser.all
130
141
  Acfs.run
131
142
 
132
143
  expect(users).to have(2).items
133
144
  end
134
145
 
135
- it 'should return defined resources' do
146
+ it 'returns defined resources' do
136
147
  users = MyUser.all
137
148
  Acfs.run
138
149
 
@@ -148,7 +159,7 @@ describe Acfs::Stub do
148
159
  return: [{id: 1, type: 'PC'}, {id: 2, type: 'Mac'}]
149
160
  end
150
161
 
151
- it 'should create inherited type' do
162
+ it 'creates inherited type' do
152
163
  computers = Computer.all
153
164
  Acfs.run
154
165
 
@@ -158,6 +169,11 @@ describe Acfs::Stub do
158
169
  end
159
170
 
160
171
  context 'with header' do
172
+ subject do
173
+ Acfs.run
174
+ comments
175
+ end
176
+
161
177
  before do
162
178
  Acfs::Stub.resource Comment, :list,
163
179
  return: [{id: 1, text: 'Foo'}, {id: 2, text: 'Bar'}],
@@ -168,40 +184,40 @@ describe Acfs::Stub do
168
184
  let(:headers) do
169
185
  {
170
186
  'X-Total-Pages' => '2',
171
- 'X-Total-Count' => '10'
187
+ 'X-Total-Count' => '10',
172
188
  }
173
189
  end
174
- subject { Acfs.run; comments }
175
190
 
176
- its(:total_pages) { should eq 2 }
177
- its(:total_count) { should eq 10 }
191
+ its(:total_pages) { is_expected.to eq 2 }
192
+ its(:total_count) { is_expected.to eq 10 }
178
193
  end
179
194
  end
180
195
 
181
196
  context 'with update action' do
182
197
  before do
183
198
  Acfs::Stub.resource MyUser, :read, with: {id: 1}, return: {id: 1, name: 'John Smith', age: 32}
184
- Acfs::Stub.resource MyUser, :update, with: {id: 1, name: 'John Smith', age: 22}, return: {id: 1, name: 'John Smith', age: 23}
199
+ Acfs::Stub.resource MyUser, :update, with: {id: 1, name: 'John Smith', age: 22},
200
+ return: {id: 1, name: 'John Smith', age: 23}
185
201
  Acfs::Stub.resource MyUser, :update, with: {id: 1, name: 'John Smith', age: 0}, raise: 422
186
202
  end
187
203
 
188
204
  let!(:update_stub) do
189
205
  Acfs::Stub.resource MyUser, :update,
190
206
  with: {id: 1, name: 'Jane Smith'},
191
- return: ->(op) { Hash[op.data.map {|k, v| [k, v.to_s.upcase] }] }
207
+ return: ->(op) { op.data.map {|k, v| [k, v.to_s.upcase] }.to_h }
192
208
  end
193
209
 
194
- it 'should allow stub resource update' do
210
+ it 'allows stub resource update' do
195
211
  user = MyUser.find 1
196
212
  Acfs.run
197
213
 
198
214
  user.age = 22
199
215
  user.save!
200
216
 
201
- expect(user.age).to be == 23
217
+ expect(user.age).to eq 23
202
218
  end
203
219
 
204
- it 'should allow to raise error' do
220
+ it 'allows to raise error' do
205
221
  user = MyUser.find 1
206
222
  Acfs.run
207
223
 
@@ -213,7 +229,7 @@ describe Acfs::Stub do
213
229
  end.to raise_error(::Acfs::InvalidResource)
214
230
  end
215
231
 
216
- it 'should match partial :with' do
232
+ it 'matches partial :with' do
217
233
  user = MyUser.find 1
218
234
  Acfs.run
219
235
 
@@ -224,7 +240,7 @@ describe Acfs::Stub do
224
240
  expect(update_stub).to be_called
225
241
  end
226
242
 
227
- it 'should process response body' do
243
+ it 'processes response body' do
228
244
  user = MyUser.find 1
229
245
  Acfs.run
230
246
 
@@ -235,18 +251,6 @@ describe Acfs::Stub do
235
251
  expect(user.name).to eq 'JANE SMITH'
236
252
  end
237
253
  end
238
-
239
- context 'with create action' do
240
- before do
241
- Acfs::Stub.resource MyUser, :create, with: {name: 'John Smith', age: 0}, raise: 422
242
- end
243
-
244
- it 'should allow to raise error' do
245
- expect do
246
- MyUser.create! name: 'John Smith', age: 0
247
- end.to raise_error(::Acfs::InvalidResource)
248
- end
249
- end
250
254
  end
251
255
 
252
256
  describe '.allow_requests=' do
@@ -256,9 +260,9 @@ describe Acfs::Stub do
256
260
  stub_request(:get, 'http://users.example.org/users/2').to_return response(id: 2, name: 'John', age: 26)
257
261
  end
258
262
 
259
- it 'should allow real requests' do
263
+ it 'allows real requests' do
260
264
  @user = MyUser.find 2
261
- expect { Acfs.run }.to_not raise_error
265
+ expect { Acfs.run }.not_to raise_error
262
266
  end
263
267
  end
264
268
 
@@ -267,7 +271,7 @@ describe Acfs::Stub do
267
271
  Acfs::Stub.allow_requests = false
268
272
  end
269
273
 
270
- it 'should not allow real requests' do
274
+ it 'does not allow real requests' do
271
275
  @user = MyUser.find 2
272
276
  expect { Acfs.run }.to raise_error(Acfs::RealRequestsNotAllowedError)
273
277
  end
@@ -279,7 +283,7 @@ describe Acfs::Stub do
279
283
 
280
284
  context 'with a match in params' do
281
285
  let(:op) do
282
- double('operation').tap do |op|
286
+ instance_double('Acfs::Operation').tap do |op|
283
287
  allow(op).to receive(:full_params).and_return(id: 1337, blub: 'abc')
284
288
  allow(op).to receive(:data).and_return({})
285
289
  end
@@ -292,7 +296,7 @@ describe Acfs::Stub do
292
296
 
293
297
  context 'with a match in data' do
294
298
  let(:op) do
295
- double('operation').tap do |op|
299
+ instance_double('Acfs::Operation').tap do |op|
296
300
  allow(op).to receive(:full_params).and_return({})
297
301
  allow(op).to receive(:data).and_return(id: 1337, blub: 'abc')
298
302
  end
@@ -305,7 +309,7 @@ describe Acfs::Stub do
305
309
 
306
310
  context 'with no match in params nor data' do
307
311
  let(:op) do
308
- double('operation').tap do |op|
312
+ instance_double('Acfs::Operation').tap do |op|
309
313
  allow(op).to receive(:full_params).and_return(id: 1337)
310
314
  allow(op).to receive(:data).and_return({})
311
315
  end
@@ -318,7 +322,7 @@ describe Acfs::Stub do
318
322
 
319
323
  context 'with a wrong match' do
320
324
  let(:op) do
321
- double('operation').tap do |op|
325
+ instance_double('Acfs::Operation').tap do |op|
322
326
  allow(op).to receive(:full_params).and_return(id: 1337, blub: 'abc')
323
327
  allow(op).to receive(:data).and_return({})
324
328
  end
@@ -331,7 +335,7 @@ describe Acfs::Stub do
331
335
 
332
336
  context 'with a missing match' do
333
337
  let(:op) do
334
- double('operation').tap do |op|
338
+ instance_double('Acfs::Operation').tap do |op|
335
339
  allow(op).to receive(:full_params).and_return(id: 1337, blub: 'abc')
336
340
  allow(op).to receive(:data).and_return({})
337
341
  end