Skip to content
This repository was archived by the owner on Jun 2, 2021. It is now read-only.

Commit e7c68a1

Browse files
Brian ButzFelisiaM
authored andcommitted
v3(services): backfill explicit error tests for SI actions
[#172144638](https://www.pivotaltracker.com/story/show/172144638)
1 parent 07835db commit e7c68a1

4 files changed

Lines changed: 111 additions & 48 deletions

File tree

app/actions/mixins/service_instance_create.rb

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@ module VCAP::CloudController
22
module ServiceInstanceCreateMixin
33
private
44

5-
def validate_quotas!(e)
6-
quota_errors = e.errors.on(:quota).to_a
7-
plan_errors = e.errors.on(:service_plan).to_a
5+
def validate_quotas!(errors)
6+
quota_errors = errors.on(:quota).to_a
7+
plan_errors = errors.on(:service_plan).to_a
88

99
code = if quota_errors.include?(:service_instance_space_quota_exceeded)
1010
'ServiceInstanceSpaceQuotaExceeded'
@@ -20,16 +20,18 @@ def validate_quotas!(e)
2020
end
2121

2222
def validation_error!(
23-
error,
23+
exception,
2424
name:,
2525
validation_error_handler:
2626
)
27-
validate_quotas!(error)
27+
errors = exception.errors
28+
validate_quotas!(errors)
2829

29-
if error.errors.on(:name)&.include?(:unique)
30+
if errors.on(:name)&.include?(:unique)
3031
validation_error_handler.error!("The service instance name is taken: #{name}")
3132
end
32-
validation_error_handler.error!(error.message)
33+
34+
validation_error_handler.error!(exception.message)
3335
end
3436
end
3537
end

app/actions/service_instance_create_managed.rb

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,11 @@ def create(message)
5252

5353
pollable_job
5454
rescue Sequel::ValidationFailed => e
55-
validation_error!(e, name: message.name, validation_error_handler: ValidationErrorHandler.new)
55+
validation_error!(
56+
e,
57+
name: message.name,
58+
validation_error_handler: ValidationErrorHandler.new
59+
)
5660
end
5761

5862
private

spec/unit/actions/service_instance_create_user_provided_spec.rb

Lines changed: 45 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ module CloudController
1111
let(:message) { ServiceInstanceCreateUserProvidedMessage.new(request) }
1212
let(:instance) { ServiceInstance.last }
1313
let(:name) { 'my-service-instance' }
14+
let(:tags) { %w(foo bar baz) }
1415

1516
let(:event_repository) do
1617
dbl = double(Repositories::ServiceEventRepository::WithUserActor)
@@ -28,7 +29,7 @@ module CloudController
2829
},
2930
syslog_drain_url: 'https://drain.com/foo',
3031
route_service_url: 'https://route.com/bar',
31-
tags: %w(foo bar baz),
32+
tags: tags,
3233
relationships: {
3334
space: {
3435
data: {
@@ -102,29 +103,54 @@ module CloudController
102103
end
103104
end
104105

105-
context 'name is already taken' do
106-
it 'raises an error' do
107-
ServiceInstance.make(name: name, space: space)
108-
109-
expect { action.create(message) }.
110-
to raise_error(
111-
ServiceInstanceCreateUserProvided::InvalidUserProvidedServiceInstance,
112-
"The service instance name is taken: #{name}"
113-
)
106+
describe 'validation fails' do
107+
context 'name' do
108+
describe 'when missing' do
109+
let(:name) { '' }
110+
111+
it 'raises an error' do
112+
expect { action.create(message) }.
113+
to raise_error(ServiceInstanceCreateUserProvided::InvalidUserProvidedServiceInstance, 'name presence')
114+
end
115+
end
116+
117+
describe 'when too long' do
118+
let(:name) { way_too_long }
119+
120+
it 'raises an error' do
121+
expect { action.create(message) }.
122+
to raise_error(ServiceInstanceCreateUserProvided::InvalidUserProvidedServiceInstance, 'name max_length')
123+
end
124+
end
125+
126+
describe 'when already taken' do
127+
it 'raises an error' do
128+
ServiceInstance.make(name: name, space: space)
129+
130+
expect { action.create(message) }.
131+
to raise_error(
132+
ServiceInstanceCreateUserProvided::InvalidUserProvidedServiceInstance,
133+
"The service instance name is taken: #{name}"
134+
)
135+
end
136+
end
114137
end
115-
end
116138

117-
context 'SQL validation fails' do
118-
it 'raises an error' do
119-
errors = Sequel::Model::Errors.new
120-
errors.add(:blork, 'is busted')
121-
expect(UserProvidedServiceInstance).to receive(:create).
122-
and_raise(Sequel::ValidationFailed.new(errors))
139+
context 'tags' do
140+
let(:tags) { [way_too_long] }
123141

124-
expect { action.create(message) }.
125-
to raise_error(ServiceInstanceCreateUserProvided::InvalidUserProvidedServiceInstance, 'blork is busted')
142+
describe 'when too long' do
143+
it 'raises an error' do
144+
expect { action.create(message) }.
145+
to raise_error(ServiceInstanceCreateUserProvided::InvalidUserProvidedServiceInstance, 'tags too_long')
146+
end
147+
end
126148
end
127149
end
150+
151+
def way_too_long
152+
'a' * 10_000
153+
end
128154
end
129155
end
130156
end

spec/unit/actions/service_instance_update_user_provided_spec.rb

Lines changed: 52 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -108,33 +108,64 @@ module VCAP::CloudController
108108
end
109109
end
110110

111-
context 'when the name is already taken' do
112-
let!(:other_service_instance) { UserProvidedServiceInstance.make(name: 'already_taken', space: service_instance.space) }
113-
let(:body) do
114-
{ name: 'already_taken' }
115-
end
111+
describe 'validation fails' do
112+
context 'name' do
113+
describe 'when missing' do
114+
let(:body) do
115+
{ name: '' }
116+
end
116117

117-
it 'fails' do
118-
expect {
119-
action.update(service_instance, message)
120-
}.to raise_error(
121-
ServiceInstanceUpdateUserProvided::UnprocessableUpdate,
122-
'The service instance name is taken: already_taken',
123-
)
118+
it 'raises an error' do
119+
expect { action.update(service_instance, message) }.
120+
to raise_error(ServiceInstanceUpdateUserProvided::UnprocessableUpdate, 'name presence')
121+
end
122+
end
123+
124+
describe 'when too long' do
125+
let(:body) do
126+
{ name: way_too_long }
127+
end
128+
129+
it 'raises an error' do
130+
expect { action.update(service_instance, message) }.
131+
to raise_error(ServiceInstanceUpdateUserProvided::UnprocessableUpdate, 'name max_length')
132+
end
133+
end
134+
135+
describe 'when already taken' do
136+
let!(:other_service_instance) { UserProvidedServiceInstance.make(name: 'already_taken', space: service_instance.space) }
137+
let(:body) do
138+
{ name: 'already_taken' }
139+
end
140+
141+
it 'fails' do
142+
expect {
143+
action.update(service_instance, message)
144+
}.to raise_error(
145+
ServiceInstanceUpdateUserProvided::UnprocessableUpdate,
146+
'The service instance name is taken: already_taken',
147+
)
148+
end
149+
end
124150
end
125-
end
126151

127-
context 'SQL validation fails' do
128-
it 'raises an error' do
129-
errors = Sequel::Model::Errors.new
130-
errors.add(:blork, 'is busted')
131-
expect_any_instance_of(UserProvidedServiceInstance).to receive(:update).
132-
and_raise(Sequel::ValidationFailed.new(errors))
152+
context 'tags' do
153+
let(:body) do
154+
{ tags: [way_too_long] }
155+
end
133156

134-
expect { action.update(service_instance, message) }.
135-
to raise_error(ServiceInstanceUpdateUserProvided::UnprocessableUpdate, 'blork is busted')
157+
describe 'when too long' do
158+
it 'raises an error' do
159+
expect { action.update(service_instance, message) }.
160+
to raise_error(ServiceInstanceUpdateUserProvided::UnprocessableUpdate, 'tags too_long')
161+
end
162+
end
136163
end
137164
end
138165
end
166+
167+
def way_too_long
168+
'a' * 10_000
169+
end
139170
end
140171
end

0 commit comments

Comments
 (0)