Skip to content

Commit d017f70

Browse files
committed
API: Disallow options=nil, fix and add tests
1 parent ea867ab commit d017f70

File tree

6 files changed

+56
-10
lines changed

6 files changed

+56
-10
lines changed

app/actions/route_create.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ def create(message:, space:, domain:, manifest_triggered: false)
1616
port: port(message, domain),
1717
space: space,
1818
domain: domain,
19-
options: message.options
19+
options: message.options.nil? ? {} : message.options.compact
2020
)
2121

2222
Route.db.transaction do

app/messages/validators.rb

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -242,12 +242,6 @@ def validate(record)
242242

243243
class OptionsValidator < ActiveModel::Validator
244244
def validate(record)
245-
if record.options.blank?
246-
# Route Creation with explicit 'null' options is not allowed
247-
record.errors.add(:options, message: 'is not a valid object') if record.is_a?(VCAP::CloudController::RouteCreateMessage) && record.options.nil?
248-
return
249-
end
250-
251245
unless record.options.is_a?(Hash)
252246
record.errors.add(:options, message: "'options' is not a valid object")
253247
return

spec/unit/messages/route_create_message_spec.rb

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -392,6 +392,24 @@ module VCAP::CloudController
392392
end
393393
end
394394

395+
context 'when nil' do
396+
let(:params) do
397+
{
398+
host: 'some-host',
399+
relationships: {
400+
space: { data: { guid: 'space-guid' } },
401+
domain: { data: { guid: 'domain-guid' } }
402+
},
403+
options: nil
404+
}
405+
end
406+
407+
it 'is not valid' do
408+
expect(subject).not_to be_valid
409+
expect(subject.errors[:options]).to include("'options' is not a valid object")
410+
end
411+
end
412+
395413
context 'when options has invalid key' do
396414
let(:params) do
397415
{
@@ -443,6 +461,23 @@ module VCAP::CloudController
443461
end
444462
end
445463

464+
context 'when lb_algo is nil' do
465+
let(:params) do
466+
{
467+
host: 'some-host',
468+
relationships: {
469+
space: { data: { guid: 'space-guid' } },
470+
domain: { data: { guid: 'domain-guid' } }
471+
},
472+
options: { lb_algo: nil }
473+
}
474+
end
475+
476+
it 'is valid' do
477+
expect(subject).to be_valid
478+
end
479+
end
480+
446481
context 'when lb_algo has invalid value' do
447482
let(:params) do
448483
{

spec/unit/messages/route_update_message_spec.rb

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,11 @@ module VCAP::CloudController
1818
expect(message).to be_valid
1919
end
2020

21+
it 'accepts options: {}' do
22+
message = RouteUpdateMessage.new(params.merge(options: {}))
23+
expect(message).to be_valid
24+
end
25+
2126
it 'accepts options params with round-robin load-balancing algorithm' do
2227
message = RouteUpdateMessage.new(params.merge(options: { lb_algo: 'round-robin' }))
2328
expect(message).to be_valid
@@ -28,9 +33,10 @@ module VCAP::CloudController
2833
expect(message).to be_valid
2934
end
3035

31-
it 'accepts options: nil to unset options' do
36+
it 'does not accept options: nil' do
3237
message = RouteUpdateMessage.new(params.merge(options: nil))
33-
expect(message).to be_valid
38+
expect(message).not_to be_valid
39+
expect(message.errors.full_messages[0]).to include("Options 'options' is not a valid object")
3440
end
3541

3642
it 'accepts lb_algo: nil to unset load-balancing algorithm' do

spec/unit/messages/validators_spec.rb

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -555,6 +555,17 @@ def options_message
555555
expect(message).to be_valid
556556
end
557557

558+
it 'adds invalid options message when options is null' do
559+
message = OptionsMessage.new({ options: nil })
560+
expect(message).not_to be_valid
561+
expect(message.errors_on(:options)).to include("'options' is not a valid object")
562+
end
563+
564+
it 'successfully validates empty load balancer' do
565+
message = OptionsMessage.new({ options: { lb_algo: nil } })
566+
expect(message).to be_valid
567+
end
568+
558569
it 'adds invalid object error message when options is not an object' do
559570
message = OptionsMessage.new({ options: 'cheesecake' })
560571
expect(message).not_to be_valid

spec/unit/presenters/v3/route_presenter_spec.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ module VCAP::CloudController::Presenters::V3
138138
)
139139
end
140140

141-
it 'does not output options' do
141+
it 'outputs empty options hash' do
142142
expect(subject[:options]).to eq({})
143143
end
144144
end

0 commit comments

Comments
 (0)