spec/lib/release_tools/services/sync_remotes_service_spec.rb (162 lines of code) (raw):
# frozen_string_literal: true
require 'spec_helper'
describe ReleaseTools::Services::SyncRemotesService do
let(:version) { ReleaseTools::Version.new('15.2.0') }
let(:service) { described_class.new(version) }
before do
helm_finder = instance_double(ReleaseTools::Helm::HelmVersionFinder, execute: ReleaseTools::Version.new('3.2.1'))
allow(ReleaseTools::Helm::HelmVersionFinder).to receive(:new).and_return(helm_finder)
end
describe '#execute' do
it 'syncs stable branches for the version' do
allow(service).to receive(:sync_tags).and_return(true)
expect(service).to receive(:sync_branches)
.with(ReleaseTools::Project::GitlabCe, '15-2-stable')
expect(service).to receive(:sync_branches)
.with(ReleaseTools::Project::GitlabEe, '15-2-stable-ee')
expect(service).to receive(:sync_branches)
.with(ReleaseTools::Project::OmnibusGitlab, '15-2-stable')
expect(service).to receive(:sync_branches)
.with(ReleaseTools::Project::CNGImage, '15-2-stable')
expect(service).to receive(:sync_branches)
.with(ReleaseTools::Project::Gitaly, '15-2-stable')
expect(service).to receive(:sync_branches)
.with(ReleaseTools::Project::HelmGitlab, '3-2-stable')
expect(service).to receive(:sync_branches)
.with(ReleaseTools::Project::GitlabPages, '15-2-stable')
without_dry_run do
service.execute
end
end
it 'syncs tags for the version' do
service = described_class.new(version)
allow(service).to receive(:sync_branches).and_return(true)
expect(service).to receive(:sync_tags)
.with(ReleaseTools::Project::GitlabCe, 'v15.2.0')
expect(service).to receive(:sync_tags)
.with(ReleaseTools::Project::GitlabEe, 'v15.2.0-ee')
expect(service).to receive(:sync_tags)
.with(ReleaseTools::Project::OmnibusGitlab, '15.2.0+ee.0', '15.2.0+ce.0')
expect(service).to receive(:sync_tags)
.with(ReleaseTools::Project::CNGImage, 'v15.2.0', 'v15.2.0-ee', 'v15.2.0-ubi8', 'v15.2.0-fips')
expect(service).to receive(:sync_tags)
.with(ReleaseTools::Project::Gitaly, 'v15.2.0')
expect(service).to receive(:sync_tags)
.with(ReleaseTools::Project::HelmGitlab, 'v3.2.1')
expect(service).to receive(:sync_tags)
.with(ReleaseTools::Project::GitlabPages, 'v15.2.0')
without_dry_run do
service.execute
end
end
context 'with release_the_kas feature flag enabled' do
before do
enable_feature(:release_the_kas)
end
it 'syncs tags and branches of kas' do
service = described_class.new(version)
allow(service).to receive_messages(sync_branches: true, sync_tags: true)
expect(service).to receive(:sync_branches)
.with(ReleaseTools::Project::Kas, '15-2-stable')
expect(service).to receive(:sync_tags)
.with(ReleaseTools::Project::Kas, 'v15.2.0')
without_dry_run do
service.execute
end
end
end
context 'with dry_run' do
it 'does nothing' do
service = described_class.new(version)
expect(service).not_to receive(:sync_branches)
expect(service).not_to receive(:sync_tags)
service.execute
end
end
context 'for versions before when CNG FIPS tags were introduced' do
let(:service) { described_class.new(ReleaseTools::Version.new('14.2.0')) }
it 'does not attempt to sync FIPS tags' do
allow(service).to receive(:sync_branches).and_return(true)
expect(service).to receive(:sync_tags)
.with(ReleaseTools::Project::GitlabCe, 'v14.2.0')
expect(service).to receive(:sync_tags)
.with(ReleaseTools::Project::GitlabEe, 'v14.2.0-ee')
expect(service).to receive(:sync_tags)
.with(ReleaseTools::Project::OmnibusGitlab, '14.2.0+ee.0', '14.2.0+ce.0')
expect(service).to receive(:sync_tags)
.with(ReleaseTools::Project::CNGImage, 'v14.2.0', 'v14.2.0-ee', 'v14.2.0-ubi8')
expect(service).to receive(:sync_tags)
.with(ReleaseTools::Project::Gitaly, 'v14.2.0')
expect(service).to receive(:sync_tags)
.with(ReleaseTools::Project::HelmGitlab, 'v3.2.1')
expect(service).to receive(:sync_tags)
.with(ReleaseTools::Project::GitlabPages, 'v14.2.0')
without_dry_run do
service.execute
end
end
end
end
describe '#sync_branches' do
let(:fake_repo) { instance_double(ReleaseTools::RemoteRepository).as_null_object }
let(:project) { ReleaseTools::Project::GitlabEe }
context 'with invalid remotes' do
it 'logs an error and returns' do
stub_const("ReleaseTools::Project::GitlabEe::REMOTES", {})
service = described_class.new(version)
expect(ReleaseTools::RemoteRepository).not_to receive(:get)
service.sync_branches(project, 'branch')
end
end
context 'with a successful merge' do
it 'merges branch and pushes' do
branch = '15-2-stable-ee'
successful_merge = double(status: double(success?: true))
expect(ReleaseTools::RemoteRepository).to receive(:get)
.with(
a_hash_including(project::REMOTES),
a_hash_including(branch: branch)
).and_return(fake_repo)
expect(fake_repo).to receive(:merge)
.with("dev/#{branch}", { no_ff: true })
.and_return(successful_merge)
expect(fake_repo).to receive(:push_to_all_remotes).with(branch).and_return([true])
without_dry_run do
described_class.new(version).sync_branches(project, branch)
end
end
end
context 'with a failed merge' do
it 'logs a fatal message with the output' do
branch = '15-2-stable-ee'
failed_merge = double(status: double(success?: false), output: 'output')
allow(ReleaseTools::RemoteRepository).to receive(:get).and_return(fake_repo)
expect(fake_repo).to receive(:merge).and_return(failed_merge)
expect(fake_repo).not_to receive(:push_to_all_remotes)
service = described_class.new(version)
expect(service.logger).to receive(:fatal)
.with(anything, a_hash_including(output: 'output'))
without_dry_run do
service.sync_branches(project, branch)
end
end
end
end
describe '#sync_tags' do
let(:fake_repo) { instance_double(ReleaseTools::RemoteRepository).as_null_object }
let(:project) { ReleaseTools::Project::GitlabEe }
let(:tag) { 'v15.2.0' }
it 'fetches tags and pushes' do
allow(ReleaseTools::RemoteRepository).to receive(:get).and_return(fake_repo)
expect(fake_repo).to receive(:fetch).with("refs/tags/#{tag}", { remote: :dev })
expect(fake_repo).to receive(:push_to_all_remotes).with(tag)
expect(ReleaseTools::RemoteRepository).to receive(:get)
.with(
a_hash_including(project::REMOTES),
a_hash_including(global_depth: 50)
).and_return(fake_repo)
without_dry_run do
described_class.new(version).sync_tags(project, tag)
end
end
end
end