diff options
Diffstat (limited to 'spec/models/ci/pipeline_spec.rb')
-rw-r--r-- | spec/models/ci/pipeline_spec.rb | 120 |
1 files changed, 108 insertions, 12 deletions
diff --git a/spec/models/ci/pipeline_spec.rb b/spec/models/ci/pipeline_spec.rb index 90f56c1e0a4..c29cc04e0e9 100644 --- a/spec/models/ci/pipeline_spec.rb +++ b/spec/models/ci/pipeline_spec.rb @@ -390,20 +390,63 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do end describe '#merge_request?' do - let(:pipeline) { create(:ci_pipeline, merge_request: merge_request) } - let(:merge_request) { create(:merge_request) } + let_it_be(:merge_request) { create(:merge_request) } + let_it_be_with_reload(:pipeline) do + create(:ci_pipeline, project: project, merge_request_id: merge_request.id) + end + + it { expect(pipeline).to be_merge_request } - it 'returns true' do - expect(pipeline).to be_merge_request + context 'when merge request is already loaded' do + it 'does not reload the record and returns true' do + expect(pipeline.merge_request).to be_present + + expect { pipeline.merge_request? }.not_to exceed_query_limit(0) + expect(pipeline).to be_merge_request + end end - context 'when merge request is nil' do - let(:merge_request) { nil } + context 'when merge request is not loaded' do + it 'executes a database query and returns true' do + expect(pipeline).to be_present - it 'returns false' do + expect { pipeline.merge_request? }.not_to exceed_query_limit(1) + expect(pipeline).to be_merge_request + end + + it 'caches the result' do + expect(pipeline).to be_merge_request + expect { pipeline.merge_request? }.not_to exceed_query_limit(0) + end + end + + context 'when merge request was removed' do + before do + pipeline.update!(merge_request_id: non_existing_record_id) + end + + it 'executes a database query and returns false' do + expect { pipeline.merge_request? }.not_to exceed_query_limit(1) expect(pipeline).not_to be_merge_request end end + + context 'when merge request id is not present' do + before do + pipeline.update!(merge_request_id: nil) + end + + it { expect(pipeline).not_to be_merge_request } + end + + context 'when the feature flag is disabled' do + before do + stub_feature_flags(ci_pipeline_merge_request_presence_check: false) + pipeline.update!(merge_request_id: non_existing_record_id) + end + + it { expect(pipeline).to be_merge_request } + end end describe '#detached_merge_request_pipeline?' do @@ -3384,7 +3427,7 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do create(:ci_pipeline, project: project, sha: project.commit('master').sha, - user: project.owner) + user: project.first_owner) end before do @@ -4459,7 +4502,7 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do describe '#reset_source_bridge!' do let(:pipeline) { create(:ci_pipeline, :created, project: project) } - subject(:reset_bridge) { pipeline.reset_source_bridge!(project.owner) } + subject(:reset_bridge) { pipeline.reset_source_bridge!(project.first_owner) } context 'when the pipeline is a child pipeline and the bridge is depended' do let!(:parent_pipeline) { create(:ci_pipeline) } @@ -4656,9 +4699,11 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do let(:factory_name) { :ci_pipeline } end - it_behaves_like 'cleanup by a loose foreign key' do - let!(:model) { create(:ci_pipeline, user: create(:user)) } - let!(:parent) { model.user } + context 'loose foreign key on ci_pipelines.user_id' do + it_behaves_like 'cleanup by a loose foreign key' do + let!(:model) { create(:ci_pipeline, user: create(:user)) } + let!(:parent) { model.user } + end end describe 'tags count' do @@ -4679,4 +4724,55 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do it { expect(pipeline.distinct_tags_count).to eq(3) } end end + + context 'loose foreign key on ci_pipelines.merge_request_id' do + it_behaves_like 'cleanup by a loose foreign key' do + let!(:parent) { create(:merge_request) } + let!(:model) { create(:ci_pipeline, merge_request: parent) } + end + end + + context 'loose foreign key on ci_pipelines.project_id' do + it_behaves_like 'cleanup by a loose foreign key' do + let!(:parent) { create(:project) } + let!(:model) { create(:ci_pipeline, project: parent) } + end + end + + describe '#jobs_git_ref' do + subject { pipeline.jobs_git_ref } + + context 'when tag is true' do + let(:pipeline) { build(:ci_pipeline, tag: true) } + + it 'returns a tag ref' do + is_expected.to start_with(Gitlab::Git::TAG_REF_PREFIX) + end + end + + context 'when tag is false' do + let(:pipeline) { build(:ci_pipeline, tag: false) } + + it 'returns a branch ref' do + is_expected.to start_with(Gitlab::Git::BRANCH_REF_PREFIX) + end + end + + context 'when tag is nil' do + let(:pipeline) { build(:ci_pipeline, tag: nil) } + + it 'returns a branch ref' do + is_expected.to start_with(Gitlab::Git::BRANCH_REF_PREFIX) + end + end + + context 'when it is triggered by a merge request' do + let(:merge_request) { create(:merge_request, :with_detached_merge_request_pipeline) } + let(:pipeline) { merge_request.pipelines_for_merge_request.first } + + it 'returns nil' do + is_expected.to be_nil + end + end + end end |