spec/lib/release_tools/monthly_issue_spec.rb (160 lines of code) (raw):

# frozen_string_literal: true require 'spec_helper' describe ReleaseTools::MonthlyIssue do let(:version) { ReleaseTools::Version.new('8.3.0') } let(:helm_version_finder) { instance_double(ReleaseTools::Helm::HelmVersionFinder, execute: '1.2.3') } before do allow(ReleaseTools::Helm::HelmVersionFinder) .to receive(:new) .and_return(helm_version_finder) end it_behaves_like 'issuable #initialize' subject(:issue) { described_class.new(version: version) } describe '#title' do let(:version) { ReleaseTools::Version.new('8.3.5-rc1') } it "returns the issue title" do expect(issue.title).to eq 'Release 8.3' end end describe '#description' do before do allow(ReleaseTools::Versions) .to receive(:current_stable_branch) .and_return('15-11-stable-ee') upcoming_releases = { '8.2' => '2023-04-22', '8.3' => '2023-05-24' } allow(ReleaseTools::GitlabReleasesGemClient) .to receive(:upcoming_releases) .and_return(upcoming_releases) end it "includes a section to tag the monthly release" do expect(issue.description).to include('Tag day') end it "includes the correct version" do content = issue.description expect(content).to include('8.3.0 is published and publicly available') end it 'returns Helm versions' do content = issue.description expect(content).to include 'https://dev.gitlab.org/gitlab/charts/gitlab/-/pipelines/?ref=v1.2.3' end end describe '#labels' do it 'returns a list of labels' do expect(issue.labels).to eq 'Monthly Release,team::Delivery' end end describe '#assignees' do let(:version) { ReleaseTools::Version.new('11.8') } it 'returns the assignee IDs' do schedule = instance_spy(ReleaseTools::ReleaseManagers::Schedule) allow(ReleaseTools::ReleaseManagers::Schedule) .to receive(:new) .and_return(schedule) expect(schedule) .to receive(:active_release_managers) .and_return([double('user1', id: 1), double('user2', id: 2)]) expect(issue.assignees).to eq([1, 2]) end end describe '#current_stable_branch' do let(:version) { ReleaseTools::Version.new('16.0') } it 'returns the current stable branch' do versions = [ ReleaseTools::Version.new('15.11.1'), ReleaseTools::Version.new('15.10.9'), ReleaseTools::Version.new('15.9.8') ] allow(ReleaseTools::Versions) .to receive(:next_versions) .and_return(versions) expect(issue.current_stable_branch).to eq('15-11-stable-ee') end end describe "#create" do it 'creates a monthly release pipeline' do expect(issue).to receive(:release_pipeline).and_return(true) 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" } it "creates a monthly release pipeline on the ops instance" do expect(ReleaseTools::GitlabOpsClient).to receive(:create_pipeline).with( ReleaseTools::Project::ReleaseTools, { MONTHLY_RELEASE_PIPELINE: 'true' } ).and_call_original expect(ReleaseTools::GitlabOpsClient.client).to receive(:create_pipeline).and_return(double(web_url: web_url)) without_dry_run do expect(issue.release_pipeline.web_url).to eq(web_url) 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 '#release_date' do it 'fetches the release date and returns a Date' do release_date = '2023-05-24' upcoming_releases = { '8.2' => '2023-04-22', '8.3' => release_date, '8.4' => '2023-06-18', '8.5' => '2023-07-21' } allow(ReleaseTools::GitlabReleasesGemClient) .to receive(:upcoming_releases) .and_return(upcoming_releases) expect(issue.release_date).to eq(Date.parse(release_date)) end end describe '#formated_date' do it 'formats the date' do expect(issue.formated_date(Date.parse('2023-08-03'))).to eq('Thursday, 2023-08-03') end end context 'release day helpers' do before do allow(issue).to receive(:release_date).and_return(Date.parse('2023-08-17')) end describe '#ordinalized_release_date' do it 'returns the dynamic ordinalized day' do expect(issue.ordinalized_release_date).to eq('17th') end end describe '#release_day' do it 'returns the release day' do expect(issue.release_day).to eq('Thursday, 2023-08-17') end end describe '#tag_day' do it 'returns one day before the release day' do expect(issue.tag_day).to eq('Wednesday, 2023-08-16') end end describe '#rc_tag_day' do it 'returns two days before the release day' do expect(issue.rc_tag_day).to eq('Tuesday, 2023-08-15') end end describe '#candidate_selection_day' do it 'returns three days before the release day' do expect(issue.candidate_selection_day).to eq('Monday, 2023-08-14') end end describe '#preparation_start_day' do it 'returns the Friday before the release day' do expect(issue.preparation_start_day).to eq('Friday, 2023-08-11') end end end end