From 86217866fda66cb770ee8c9a540bf535a980eb36 Mon Sep 17 00:00:00 2001 From: Grzegorz Bizon Date: Thu, 19 Jan 2017 18:49:14 +0100 Subject: [PATCH] Fix warnings argument memoization in CI/CD stage --- app/models/ci/stage.rb | 6 +++++- spec/models/ci/stage_spec.rb | 24 +++++++++++++++++++----- 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/app/models/ci/stage.rb b/app/models/ci/stage.rb index ca76d82f358..ca74c91b062 100644 --- a/app/models/ci/stage.rb +++ b/app/models/ci/stage.rb @@ -46,7 +46,11 @@ module Ci end def has_warnings? - @warnings ||= statuses.latest.failed_but_allowed.any? + if @warnings.nil? + statuses.latest.failed_but_allowed.any? + else + @warnings + end end end end diff --git a/spec/models/ci/stage_spec.rb b/spec/models/ci/stage_spec.rb index cca0cb1e3b0..c4a9743a4e2 100644 --- a/spec/models/ci/stage_spec.rb +++ b/spec/models/ci/stage_spec.rb @@ -169,10 +169,22 @@ describe Ci::Stage, models: true do describe '#has_warnings?' do context 'when stage has warnings' do context 'when using memoized warnings flag' do - let(:stage) { build(:ci_stage, warnings: true) } + context 'when there are warnings' do + let(:stage) { build(:ci_stage, warnings: true) } - it 'has warnings' do - expect(stage).to have_warnings + it 'has memoized warnings' do + expect(stage).not_to receive(:statuses) + expect(stage).to have_warnings + end + end + + context 'when there are no warnings' do + let(:stage) { build(:ci_stage, warnings: false) } + + it 'has memoized warnings' do + expect(stage).not_to receive(:statuses) + expect(stage).not_to have_warnings + end end end @@ -182,7 +194,8 @@ describe Ci::Stage, models: true do stage: stage_name, pipeline: pipeline) end - it 'has warnings' do + it 'has warnings calculated from statuses' do + expect(stage).to receive(:statuses).and_call_original expect(stage).to have_warnings end end @@ -194,7 +207,8 @@ describe Ci::Stage, models: true do pipeline: pipeline) end - it 'does not have warnings' do + it 'does not have warnings calculated from statuses' do + expect(stage).to receive(:statuses).and_call_original expect(stage).not_to have_warnings end end