spec/lib/release_tools/internal_release/issue_spec.rb (174 lines of code) (raw):

# frozen_string_literal: true require 'spec_helper' RSpec.describe ReleaseTools::InternalRelease::Issue do subject(:issue) { described_class.new(iteration: iteration) } let(:iteration) { 0 } let(:versions) do [ ReleaseTools::Version.new('15.2.1-internal0'), ReleaseTools::Version.new('15.1.2-internal0') ] end let(:internal_release_coordinator) do instance_double(ReleaseTools::InternalRelease::Coordinator, versions: versions) end before do allow(ReleaseTools::InternalRelease::Coordinator) .to receive(:new) .with(iteration) .and_return(internal_release_coordinator) end it_behaves_like 'issuable #initialize' describe '#initialize' do let(:iteration) { nil } it 'sets internal_number to 0 when input is nil' do expect(issue.send(:internal_number)).to eq(0) end end describe '#create' do it 'creates an internal release pipeline and issue' do expect(issue).to receive(:release_pipeline) expect(ReleaseTools::GitlabClient).to receive(:create_issue) .with(issue, issue.project).and_return(true) issue.create end end describe '#release_pipeline' do let(:web_url) { "https://gitlab.example.com/pipelines/123" } let(:dry_run_url) { "https://example.com/foo/bar/-/pipelines/1" } let(:pipeline) { build(:pipeline, web_url: web_url) } it "with no version specified it includes INTERNAL_VERSIONS variable with all the Coordinator versions" do expect(ReleaseTools::GitlabOpsClient).to receive(:create_pipeline).with( ReleaseTools::Project::ReleaseTools, { INTERNAL_RELEASE_PIPELINE: 'true', INTERNAL_VERSIONS: '15.2.1-internal0 15.1.2-internal0' } ).and_return(pipeline) without_dry_run do expect(issue.release_pipeline.web_url).to eq(web_url) end end context 'with version specified' do subject(:issue) do described_class.new( iteration: iteration, version: ReleaseTools::Version.new('15.2.6') ) end it "includes INTERNAL_VERSIONS variable with the internal version" do expect(ReleaseTools::GitlabOpsClient).to receive(:create_pipeline).with( ReleaseTools::Project::ReleaseTools, { INTERNAL_RELEASE_PIPELINE: 'true', INTERNAL_VERSIONS: '15.2.6-internal0' } ).and_return(pipeline) without_dry_run do expect(issue.release_pipeline.web_url).to eq(web_url) end end end context 'in dry run mode' do it 'imitates the create_pipeline API response' do expect(ReleaseTools::GitlabOpsClient).not_to receive(:create_pipeline) expect(issue.release_pipeline.web_url).to eq(dry_run_url) end end end describe '#title' do it 'returns the issue title' do expect(issue.title).to eq('Internal Release: 15.2.1-internal0, 15.1.2-internal0') end context 'with version specified' do subject(:issue) { described_class.new(iteration: iteration, version: ReleaseTools::Version.new('15.2.6')) } it 'returns a title with the internal version' do expect(issue.title).to eq('Internal Release: 15.2.6-internal0') end end end describe '#confidential?' do it 'is always confidential' do expect(issue).to be_confidential end end describe '#labels' do it 'returns internal releases label' do expect(issue.labels).to eq('internal releases') end end describe '#project' do it 'returns Release::Tasks project' do expect(issue.project).to eq(ReleaseTools::Project::Release::Tasks) end end describe '#versions' do context 'with default 0 iteration' do it 'returns versions with internal0 suffix' do expect(issue.versions).to eq(versions) end end context 'when iteration is a positive integer' do let(:iteration) { 1 } it 'returns versions with correct internal suffix' do expect(issue.versions).to eq(versions) end end context 'with version specified' do subject(:issue) { described_class.new(iteration: iteration, version: ReleaseTools::Version.new('15.2.6')) } it 'returns only the specified version with internal suffix' do expect(issue.versions).to eq([ReleaseTools::Version.new('15.2.6-internal0')]) end end end describe '#regular_versions' do context 'with default 0 iteration' do it 'returns comma-separated regular versions' do expect(issue.regular_versions).to eq('15.2, 15.1') end end context 'with version specified' do subject(:issue) { described_class.new(iteration: iteration, version: ReleaseTools::Version.new('15.2.6')) } it 'returns the specified version' do expect(issue.regular_versions).to eq('15.2') end end end describe '#assignees' do let(:schedule) do instance_double( ReleaseTools::ReleaseManagers::Schedule, active_release_managers: [build(:user, id: 1), build(:user, id: 2)] ) end before do allow(ReleaseTools::ReleaseManagers::Schedule) .to receive(:new) .and_return(schedule) end it 'returns the current RM user IDs' do expect(issue.assignees).to eq([1, 2]) end context 'when VersionNotFoundError is raised' do before do allow(schedule) .to receive(:active_release_managers) .and_raise(ReleaseTools::ReleaseManagers::Schedule::VersionNotFoundError) end it 'returns nil' do expect(issue.assignees).to be_nil end end end describe '#description' do let(:tracking_issue) { build(:issue, web_url: 'http://example.com') } before do allow(issue) .to receive(:security_tracking_issue) .and_return(build(:issue)) end it 'includes renders the internal template' do content = issue.description expect(content).to include 'Internal package preparation' end end end