Commit 14ad75a1 authored by Grzegorz Bizon's avatar Grzegorz Bizon

Fix `passed with warnings` stage status on MySQL

parent cb19fd14
...@@ -144,7 +144,7 @@ module Ci ...@@ -144,7 +144,7 @@ module Ci
status_sql = statuses.latest.where('stage=sg.stage').status_sql status_sql = statuses.latest.where('stage=sg.stage').status_sql
warnings_sql = statuses.latest.select('COUNT(*) > 0') warnings_sql = statuses.latest.select('COUNT(*)')
.where('stage=sg.stage').failed_but_allowed.to_sql .where('stage=sg.stage').failed_but_allowed.to_sql
stages_with_statuses = CommitStatus.from(stages_query, :sg) stages_with_statuses = CommitStatus.from(stages_query, :sg)
......
...@@ -46,10 +46,10 @@ module Ci ...@@ -46,10 +46,10 @@ module Ci
end end
def has_warnings? def has_warnings?
if @warnings.nil? if @warnings.is_a?(Fixnum)
statuses.latest.failed_but_allowed.any? @warnings > 0
else else
@warnings statuses.latest.failed_but_allowed.any?
end end
end end
end end
......
...@@ -197,6 +197,24 @@ describe Ci::Pipeline, models: true do ...@@ -197,6 +197,24 @@ describe Ci::Pipeline, models: true do
end end
end end
end end
context 'when there is a stage with warnings' do
before do
create(:commit_status, pipeline: pipeline,
stage: 'deploy',
name: 'prod:2',
stage_idx: 2,
status: 'failed',
allow_failure: true)
end
it 'populates stage with correct number of warnings' do
deploy_stage = pipeline.stages.third
expect(deploy_stage).not_to receive(:statuses)
expect(deploy_stage).to have_warnings
end
end
end end
describe '#stages_count' do describe '#stages_count' do
......
...@@ -170,22 +170,31 @@ describe Ci::Stage, models: true do ...@@ -170,22 +170,31 @@ describe Ci::Stage, models: true do
context 'when stage has warnings' do context 'when stage has warnings' do
context 'when using memoized warnings flag' do context 'when using memoized warnings flag' do
context 'when there are warnings' do context 'when there are warnings' do
let(:stage) { build(:ci_stage, warnings: true) } let(:stage) { build(:ci_stage, warnings: 2) }
it 'has memoized warnings' do it 'returns true using memoized value' do
expect(stage).not_to receive(:statuses) expect(stage).not_to receive(:statuses)
expect(stage).to have_warnings expect(stage).to have_warnings
end end
end end
context 'when there are no warnings' do context 'when there are no warnings' do
let(:stage) { build(:ci_stage, warnings: false) } let(:stage) { build(:ci_stage, warnings: 0) }
it 'has memoized warnings' do it 'returns false using memoized value' do
expect(stage).not_to receive(:statuses) expect(stage).not_to receive(:statuses)
expect(stage).not_to have_warnings expect(stage).not_to have_warnings
end end
end end
context 'when number of warnings is not a valid value' do
let(:stage) { build(:ci_stage, warnings: true) }
it 'calculates statuses using database queries' do
expect(stage).to receive(:statuses).and_call_original
expect(stage).not_to have_warnings
end
end
end end
context 'when calculating warnings from statuses' do context 'when calculating warnings from statuses' 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