spec/lib/release_tools/auto_deploy/cleanup_spec.rb (118 lines of code) (raw):

# frozen_string_literal: true require 'spec_helper' describe ReleaseTools::AutoDeploy::Cleanup do let(:cleanup) { described_class.new } shared_examples 'cleaning up auto-deploy branches' do it 'cleans up outdated auto-deploy branches' do allow(cleanup).to receive(:cleanup_project_branches) cleanup.cleanup expect(cleanup) .to have_received(:cleanup_project_branches) .with(project.path, ReleaseTools::GitlabClient) expect(cleanup) .to have_received(:cleanup_project_branches) .with(project.security_path, ReleaseTools::GitlabClient) expect(cleanup) .to have_received(:cleanup_project_branches) .with(project.dev_path, ReleaseTools::GitlabDevClient) end end describe '#cleanup' do context 'for GitLab EE' do let(:project) { ReleaseTools::Project::GitlabEe } it_behaves_like 'cleaning up auto-deploy branches' end context 'for Omnibus' do let(:project) { ReleaseTools::Project::OmnibusGitlab } it_behaves_like 'cleaning up auto-deploy branches' end context 'for CNG' do let(:project) { ReleaseTools::Project::CNGImage } it_behaves_like 'cleaning up auto-deploy branches' end context 'for Helm' do let(:project) { ReleaseTools::Project::HelmGitlab } it_behaves_like 'cleaning up auto-deploy branches' end end describe '#cleanup_project_branches' do context 'when there are regular branches' do it 'does not delete them' do client = class_spy(ReleaseTools::GitlabClient) branch = double(:branch, name: 'foo') allow(client) .to receive(:branches) .with('foo', { search: '-auto-deploy-' }) .and_return(Gitlab::PaginatedResponse.new([branch])) expect(client).not_to receive(:delete_branch) cleanup.cleanup_project_branches('foo', client) end end context 'when there are auto-deploy branches with invalid dates' do it 'does not delete them' do client = class_spy(ReleaseTools::GitlabClient) branch = double(:branch, name: '13-2-auto-deploy-00009999') allow(client) .to receive(:branches) .with('foo', { search: '-auto-deploy-' }) .and_return(Gitlab::PaginatedResponse.new([branch])) expect(client).not_to receive(:delete_branch) cleanup.cleanup_project_branches('foo', client) end end context 'when there are recent auto-deploy branches' do it 'does not delete them' do client = class_spy(ReleaseTools::GitlabClient) time = Date.today.strftime('%Y%m%d') branch = double(:branch, name: "13-2-auto-deploy-#{time}") allow(client) .to receive(:branches) .with('foo', { search: '-auto-deploy-' }) .and_return(Gitlab::PaginatedResponse.new([branch])) expect(client).not_to receive(:delete_branch) cleanup.cleanup_project_branches('foo', client) end end context 'when the same auto-deploy branch is returned by the API multiple times' do it 'only deletes the branch once' do client = class_spy(ReleaseTools::GitlabClient) branch = double(:branch, name: '13-2-auto-deploy-19990101') allow(client) .to receive(:branches) .with('foo', { search: '-auto-deploy-' }) .and_return(Gitlab::PaginatedResponse.new([branch, branch])) expect(client).to receive(:delete_branch).with(branch.name, 'foo').once cleanup.cleanup_project_branches('foo', client) end end context 'when there are auto-deploy branches to delete' do it 'deletes them' do client = class_spy(ReleaseTools::GitlabClient) branch = double(:branch, name: '13-2-auto-deploy-19990101') allow(client) .to receive(:branches) .with('foo', { search: '-auto-deploy-' }) .and_return(Gitlab::PaginatedResponse.new([branch])) expect(client).to receive(:delete_branch).with(branch.name, 'foo') cleanup.cleanup_project_branches('foo', client) end end end describe '#auto_deploy_branch_date' do context 'for a valid auto-deploy branch name' do it 'returns the date of the branch' do expect(cleanup.auto_deploy_branch_date('13-2-auto-deploy-1999010112')) .to eq(Time.new(1999, 1, 1, 12)) end it 'supports branch names without the hour' do expect(cleanup.auto_deploy_branch_date('13-2-auto-deploy-19990101')) .to eq(Time.new(1999, 1, 1)) end end context 'for an invalid auto-deploy branch name' do it 'raises ArgumentError' do expect { cleanup.auto_deploy_branch_date('13-2-auto-deploy-00009999') } .to raise_error(ArgumentError) end end end end