180 lines
5 KiB
Ruby
180 lines
5 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
require 'spec_helper'
|
|
|
|
RSpec.describe Ci::CommitStatusesFinder, '#execute' do
|
|
let_it_be(:project) { create(:project, :public, :repository) }
|
|
let_it_be(:release) { create(:release, project: project) }
|
|
let_it_be(:user) { create(:user) }
|
|
|
|
context 'tag refs' do
|
|
let_it_be(:tags) { project.repository.tags }
|
|
|
|
let(:subject) { described_class.new(project, project.repository, user, tags).execute }
|
|
|
|
context 'no pipelines' do
|
|
it 'returns nil' do
|
|
expect(subject).to be_blank
|
|
end
|
|
end
|
|
|
|
context 'when multiple tags exist' do
|
|
before do
|
|
create(:ci_pipeline,
|
|
project: project,
|
|
ref: 'v1.1.0',
|
|
sha: project.commit('v1.1.0').sha,
|
|
status: :running)
|
|
create(:ci_pipeline,
|
|
project: project,
|
|
ref: 'v1.0.0',
|
|
sha: project.commit('v1.0.0').sha,
|
|
status: :success)
|
|
end
|
|
|
|
it 'all relevant commit statuses are received' do
|
|
expect(subject['v1.1.0'].group).to eq("running")
|
|
expect(subject['v1.0.0'].group).to eq("success")
|
|
end
|
|
end
|
|
|
|
context 'when a tag has multiple pipelines' do
|
|
before do
|
|
create(:ci_pipeline,
|
|
project: project,
|
|
ref: 'v1.0.0',
|
|
sha: project.commit('v1.0.0').sha,
|
|
status: :running,
|
|
created_at: 6.months.ago)
|
|
create(:ci_pipeline,
|
|
project: project,
|
|
ref: 'v1.0.0',
|
|
sha: project.commit('v1.0.0').sha,
|
|
status: :success,
|
|
created_at: 2.months.ago)
|
|
end
|
|
|
|
it 'chooses the latest to determine status' do
|
|
expect(subject['v1.0.0'].group).to eq("success")
|
|
end
|
|
end
|
|
end
|
|
|
|
context 'branch refs' do
|
|
let(:subject) { described_class.new(project, project.repository, user, branches).execute }
|
|
|
|
before do
|
|
project.add_developer(user)
|
|
end
|
|
|
|
context 'no pipelines' do
|
|
let(:branches) { BranchesFinder.new(project.repository, {}).execute }
|
|
|
|
it 'returns nil' do
|
|
expect(subject).to be_blank
|
|
end
|
|
end
|
|
|
|
context 'when a branch has multiple pipelines' do
|
|
let(:branches) { BranchesFinder.new(project.repository, {}).execute }
|
|
|
|
before do
|
|
sha = project.repository.create_file(user, generate(:branch), 'content', message: 'message', branch_name: 'master')
|
|
create(:ci_pipeline,
|
|
project: project,
|
|
user: user,
|
|
ref: "master",
|
|
sha: sha,
|
|
status: :running,
|
|
created_at: 6.months.ago)
|
|
create(:ci_pipeline,
|
|
project: project,
|
|
user: user,
|
|
ref: "master",
|
|
sha: sha,
|
|
status: :success,
|
|
created_at: 2.months.ago)
|
|
end
|
|
|
|
it 'chooses the latest to determine status' do
|
|
expect(subject["master"].group).to eq("success")
|
|
end
|
|
end
|
|
|
|
context 'when multiple branches exist' do
|
|
let(:branches) { BranchesFinder.new(project.repository, {}).execute }
|
|
|
|
before do
|
|
master_sha = project.repository.create_file(user, generate(:branch), 'content', message: 'message', branch_name: 'master')
|
|
create(:ci_pipeline,
|
|
project: project,
|
|
user: user,
|
|
ref: "master",
|
|
sha: master_sha,
|
|
status: :running,
|
|
created_at: 6.months.ago)
|
|
test_sha = project.repository.create_file(user, generate(:branch), 'content', message: 'message', branch_name: 'test')
|
|
create(:ci_pipeline,
|
|
project: project,
|
|
user: user,
|
|
ref: "test",
|
|
sha: test_sha,
|
|
status: :success,
|
|
created_at: 2.months.ago)
|
|
end
|
|
|
|
it 'all relevant commit statuses are received' do
|
|
expect(subject["master"].group).to eq("running")
|
|
expect(subject["test"].group).to eq("success")
|
|
end
|
|
end
|
|
end
|
|
|
|
context 'CI pipelines visible to' do
|
|
let_it_be(:tags) { project.repository.tags }
|
|
|
|
let(:subject) { described_class.new(project, project.repository, user, tags).execute }
|
|
|
|
before do
|
|
create(:ci_pipeline,
|
|
project: project,
|
|
ref: 'v1.1.0',
|
|
sha: project.commit('v1.1.0').sha,
|
|
status: :running)
|
|
end
|
|
|
|
context 'everyone' do
|
|
it 'returns something' do
|
|
expect(subject).not_to be_blank
|
|
end
|
|
end
|
|
|
|
context 'project members only' do
|
|
before do
|
|
project.project_feature.update!(builds_access_level: ProjectFeature::PRIVATE)
|
|
end
|
|
|
|
it 'returns a blank hash' do
|
|
expect(subject).to eq({})
|
|
end
|
|
end
|
|
|
|
context 'when not a member of a private project' do
|
|
let(:private_project) { create(:project, :private, :repository) }
|
|
let(:private_tags) { private_tags.repository.tags }
|
|
let(:private_subject) { described_class.new(private_project, private_project.repository, user, tags).execute }
|
|
|
|
before do
|
|
create(:ci_pipeline,
|
|
project: private_project,
|
|
ref: 'v1.1.0',
|
|
sha: private_project.commit('v1.1.0').sha,
|
|
status: :running)
|
|
end
|
|
|
|
it 'returns a blank hash' do
|
|
expect(private_subject).to eq({})
|
|
end
|
|
end
|
|
end
|
|
end
|