Commit 114c26cc authored by Grzegorz Bizon's avatar Grzegorz Bizon

Raise error if pipeline / stage hits unknown status

parent 93241149
...@@ -517,7 +517,8 @@ module Ci ...@@ -517,7 +517,8 @@ module Ci
def update_status def update_status
retry_optimistic_lock(self) do retry_optimistic_lock(self) do
case latest_builds_status case latest_builds_status.to_s
when 'created' then nil
when 'pending' then enqueue when 'pending' then enqueue
when 'running' then run when 'running' then run
when 'success' then succeed when 'success' then succeed
...@@ -525,6 +526,9 @@ module Ci ...@@ -525,6 +526,9 @@ module Ci
when 'canceled' then cancel when 'canceled' then cancel
when 'skipped' then skip when 'skipped' then skip
when 'manual' then block when 'manual' then block
else
raise HasStatus::UnknownStatusError,
"Unknown status `#{latest_builds_status}`"
end end
end end
end end
......
...@@ -68,6 +68,7 @@ module Ci ...@@ -68,6 +68,7 @@ module Ci
def update_status def update_status
retry_optimistic_lock(self) do retry_optimistic_lock(self) do
case statuses.latest.status case statuses.latest.status
when 'created' then nil
when 'pending' then enqueue when 'pending' then enqueue
when 'running' then run when 'running' then run
when 'success' then succeed when 'success' then succeed
...@@ -75,6 +76,9 @@ module Ci ...@@ -75,6 +76,9 @@ module Ci
when 'canceled' then cancel when 'canceled' then cancel
when 'manual' then block when 'manual' then block
when 'skipped', nil then skip when 'skipped', nil then skip
else
raise HasStatus::UnknownStatusError,
"Unknown status `#{statuses.latest.status}`"
end end
end end
end end
......
...@@ -11,6 +11,8 @@ module HasStatus ...@@ -11,6 +11,8 @@ module HasStatus
STATUSES_ENUM = { created: 0, pending: 1, running: 2, success: 3, STATUSES_ENUM = { created: 0, pending: 1, running: 2, success: 3,
failed: 4, canceled: 5, skipped: 6, manual: 7 }.freeze failed: 4, canceled: 5, skipped: 6, manual: 7 }.freeze
UnknownStatusError = Class.new(StandardError)
class_methods do class_methods do
def status_sql def status_sql
scope_relevant = respond_to?(:exclude_ignored) ? exclude_ignored : all scope_relevant = respond_to?(:exclude_ignored) ? exclude_ignored : all
......
...@@ -1251,6 +1251,43 @@ describe Ci::Pipeline, :mailer do ...@@ -1251,6 +1251,43 @@ describe Ci::Pipeline, :mailer do
end end
end end
describe '#update_status' do
context 'when pipeline is empty' do
it 'updates does not change pipeline status' do
expect(pipeline.statuses.latest.status).to be_nil
expect { pipeline.update_status }
.to change { pipeline.reload.status }.to 'skipped'
end
end
context 'when updating status to pending' do
before do
allow(pipeline)
.to receive_message_chain(:statuses, :latest, :status)
.and_return(:running)
end
it 'updates pipeline status to running' do
expect { pipeline.update_status }
.to change { pipeline.reload.status }.to 'running'
end
end
context 'when statuses status was not recognized' do
before do
allow(pipeline)
.to receive(:latest_builds_status)
.and_return(:unknown)
end
it 'raises an exception' do
expect { pipeline.update_status }
.to raise_error(HasStatus::UnknownStatusError)
end
end
end
describe '#detailed_status' do describe '#detailed_status' do
subject { pipeline.detailed_status(user) } subject { pipeline.detailed_status(user) }
......
...@@ -110,6 +110,19 @@ describe Ci::Stage, :models do ...@@ -110,6 +110,19 @@ describe Ci::Stage, :models do
expect(stage.reload).to be_failed expect(stage.reload).to be_failed
end end
end end
context 'when statuses status was not recognized' do
before do
allow(stage)
.to receive_message_chain(:statuses, :latest, :status)
.and_return(:unknown)
end
it 'raises an exception' do
expect { stage.update_status }
.to raise_error(HasStatus::UnknownStatusError)
end
end
end end
describe '#detailed_status' do describe '#detailed_status' do
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment