spec/lib/tasks/security_rake_spec.rb (182 lines of code) (raw):

# frozen_string_literal: true require 'rake_helper' describe 'security tasks', :rake do before do allow(ReleaseTools::SharedStatus) .to receive(:critical_patch_release?) .and_return(false) end after do # rake tasks in the security namespace run the force_security task altering # the global state ENV.delete('SECURITY') end describe 'sync_git_tags', task: 'security:sync_git_tags' do it 'syncs git tags' do expect(ReleaseTools::Security::SyncGitRemotesService).to receive(:new) .with(['1.0', '2.0', 'v3.1']) .and_return(instance_double(ReleaseTools::Security::SyncGitRemotesService, execute: true)) task.invoke('1.0 2.0 v3.1') end end describe 'prepare:review_security_fixes', task: 'security:prepare:review_security_fixes' do it 'verifies the fixes included in the patch release' do expect(ReleaseTools::Security::Prepare::FixesVerifier).to receive(:new) .and_return(instance_double(ReleaseTools::Security::Prepare::FixesVerifier, execute: true)) task.invoke end end describe 'prepare:appsec_issue', task: 'security:prepare:appsec_issue' do it 'creates the AppSec task issue' do expect(ReleaseTools::Security::Prepare::IssueCreator).to receive(:new) .and_return(instance_double(ReleaseTools::Security::Prepare::IssueCreator, execute: true)) task.invoke end end describe 'prepare:comms_issue', task: 'security:prepare:comms_issue' do it 'creates the AppSec task issue' do expect(ReleaseTools::Security::Prepare::IssueCreator).to receive(:new) .and_return(instance_double(ReleaseTools::Security::Prepare::IssueCreator, execute: true)) task.invoke end end describe 'publish:generate_dynamic_pipeline', task: 'security:publish:generate_dynamic_pipeline' do let(:versions) { ['1.0.1', '1.1.1', '1.2.3'] } let(:generated_jobs) { "dummy:output" } let(:publish_jobs) { instance_double(ReleaseTools::Security::Publish::DynamicPipeline) } let(:coordinator) { instance_double(ReleaseTools::PatchRelease::Coordinator) } before do allow(ReleaseTools::Security::Publish::DynamicPipeline).to receive(:new).with(versions).and_return(publish_jobs) allow(File).to receive(:write) allow(ReleaseTools::PatchRelease::Coordinator).to receive(:new).and_return(coordinator) allow(coordinator).to receive(:versions).and_return(versions) end it 'correctly processes and writes a dynamic pipeline to a file' do expect(ReleaseTools::Security::Publish::DynamicPipeline).to receive(:new).with(versions).and_return(publish_jobs) expect(publish_jobs).to receive(:generate).and_return(generated_jobs) expect(File).to receive(:write).with('dynamic-gitlab-ci.yml', generated_jobs) task.invoke end end describe 'publish:move_blog_post', task: 'security:publish:move_blog_post' do it 'moves the blog post to the handbook canonical repo' do expect(ReleaseTools::Security::Publish::MoveBlogPost).to receive(:new) .and_return(instance_double(ReleaseTools::Security::Publish::MoveBlogPost, execute: true)) task.invoke end end describe 'publish:deploy_blog_post', task: 'security:publish:deploy_blog_post' do it 'publishes the patch release blog post' do expect(ReleaseTools::Security::Publish::DeployBlogPost).to receive(:new) .and_return(instance_double(ReleaseTools::Security::Publish::DeployBlogPost, execute: true)) task.invoke end end describe 'finalize:enable_security_target_processor', task: 'security:finalize:enable_security_target_processor' do it 'enables the security target processor' do expect(ReleaseTools::Security::Finalize::ToggleSecurityTargetProcessor).to receive(:new) .and_return(instance_double(ReleaseTools::Security::Finalize::ToggleSecurityTargetProcessor, execute: true)) task.invoke end end describe 'process_security_target_issues', task: 'security:process_security_target_issues' do it 'runs the processor' do expect(ReleaseTools::Security::TargetIssuesProcessor).to receive(:new) .and_return(instance_double(ReleaseTools::Security::TargetIssuesProcessor, execute: true)) task.invoke end end describe 'finalize:create_release_status_metric', task: 'security:finalize:create_release_status_metric' do it 'creates a new patch release status metric with open status' do expect(ReleaseTools::Metrics::PatchReleaseStatus).to receive(:new).with(status: :open) .and_return(instance_double(ReleaseTools::Metrics::PatchReleaseStatus, execute: true)) task.invoke end end describe 'tag:generate_dynamic_pipeline', task: 'security:tag:generate_dynamic_pipeline' do let(:versions) { ['1.0.1', '1.1.1', '1.2.3'] } let(:generated_jobs) { "dummy:output" } let(:tag_jobs) { instance_double(ReleaseTools::Security::Tag::DynamicPipeline) } let(:coordinator) { instance_double(ReleaseTools::PatchRelease::Coordinator) } before do allow(ReleaseTools::Security::Tag::DynamicPipeline).to receive(:new).with(versions).and_return(tag_jobs) allow(File).to receive(:write) allow(ReleaseTools::PatchRelease::Coordinator).to receive(:new).and_return(coordinator) allow(coordinator).to receive(:versions).and_return(versions) end it 'correctly processes and writes a dynamic pipeline to a file' do expect(ReleaseTools::Security::Tag::DynamicPipeline).to receive(:new).with(versions).and_return(tag_jobs) expect(tag_jobs).to receive(:generate).and_return(generated_jobs) expect(File).to receive(:write).with('dynamic-tag-gitlab-ci.yml', generated_jobs) task.invoke end end describe 'tag:check_omnibus_packages_tagging', task: 'security:tag:check_omnibus_packages_tagging' do let(:versions) { ['13.0.1', '13.1.1', '13.2.1'] } let(:coordinator) { instance_double(ReleaseTools::PatchRelease::Coordinator, versions: versions) } let(:tagging_service) { instance_double(ReleaseTools::Services::OmnibusPackages::Tagging) } before do allow(ReleaseTools::PatchRelease::Coordinator).to receive(:new).and_return(coordinator) allow(ReleaseTools::Services::OmnibusPackages::Tagging).to receive(:new).and_return(tagging_service) allow(tagging_service).to receive(:execute).and_return(true) end it 'executes ReleaseTools::Services::OmnibusPackages::Tagging 3 times' do expect(tagging_service).to receive(:execute).exactly(3).times task.invoke end end describe 'verify:check_omnibus_packages_publishing', task: 'security:verify:check_omnibus_packages_publishing' do let(:versions) { ['13.0.1', '13.1.1', '13.2.1'] } let(:coordinator) { instance_double(ReleaseTools::PatchRelease::Coordinator, versions: versions) } let(:publishing_service) { instance_double(ReleaseTools::Services::OmnibusPackages::Publishing) } before do allow(ReleaseTools::PatchRelease::Coordinator).to receive(:new).and_return(coordinator) allow(ReleaseTools::Services::OmnibusPackages::Publishing).to receive(:new).and_return(publishing_service) allow(publishing_service).to receive(:execute).and_return(true) end it 'executes ReleaseTools::Services::OmnibusPackages::Publishing 3 times' do expect(publishing_service).to receive(:execute).exactly(3).times task.invoke end end describe 'verify:check_docker_tags', task: 'security:verify:check_docker_tags' do let(:versions) { ['13.0.1', '13.1.1', '13.2.1'] } let(:coordinator) { instance_double(ReleaseTools::PatchRelease::Coordinator, versions: versions) } let(:verifier) { instance_double(ReleaseTools::DockerHub::Verifier) } before do allow(ReleaseTools::PatchRelease::Coordinator).to receive(:new).and_return(coordinator) allow(ReleaseTools::DockerHub::Verifier).to receive(:new).and_return(verifier) allow(verifier).to receive(:execute).and_return(true) end it 'executes ReleaseTools::DockerHub::Verifier 3 times' do expect(verifier).to receive(:execute).exactly(3).times task.invoke end end describe 'disable_security_target_processor:verify_managed_version_projects', task: 'security:disable_security_target_processor:verify_managed_version_projects' do it 'runs the notification service' do expect(ReleaseTools::Security::ManagedVersioningNotificationService).to receive(:new) .and_return(instance_double(ReleaseTools::Security::ManagedVersioningNotificationService, execute: true)) task.invoke end end describe 'update_paths:generate_dynamic_pipeline', task: 'security:update_paths:generate_dynamic_pipeline' do let(:versions) { ['1.2.1', '1.1.1', '1.0.3'] } let(:latest_version) { '1.2.1' } let(:dynamic_pipeline) { instance_double(ReleaseTools::UpdatePaths::DynamicPipeline) } let(:coordinator) { instance_double(ReleaseTools::PatchRelease::Coordinator) } before do allow(ReleaseTools::UpdatePaths::DynamicPipeline).to receive(:new).with(latest_version).and_return(dynamic_pipeline) allow(dynamic_pipeline).to receive(:generate) allow(File).to receive(:write) allow(ReleaseTools::PatchRelease::Coordinator).to receive(:new).and_return(coordinator) allow(coordinator).to receive(:versions).and_return(versions) end it 'calls generate method on the ReleaseTools::UpdatePaths::DynamicPipeline instance' do expect(ReleaseTools::UpdatePaths::DynamicPipeline).to receive(:new).with(latest_version).and_return(dynamic_pipeline) expect(dynamic_pipeline).to receive(:generate) task.invoke end it 'writes the generated YAML content to dynamic-gitlab-ci.yml' do expect(File).to receive(:write).with('dynamic-gitlab-ci.yml', dynamic_pipeline.generate) task.invoke end end end