spec/lib/release_tools/release_environment/environment_spec.rb (197 lines of code) (raw):

# frozen_string_literal: true require 'spec_helper' RSpec.describe ReleaseTools::ReleaseEnvironment::Environment do subject(:environment) { described_class.new(version, suffix) } let(:version) { '16.11.0' } let(:suffix) { nil } let(:client) { stub_const('ReleaseTools::GitlabClient', spy) } let(:commit) { create(:commit, short_id: 'fddfe1c1') } let(:branch) do instance_double( ReleaseTools::Branch, last_commit: commit, version: ReleaseTools::Version.new('16.11') ) end let(:project) do ReleaseTools::Project::Infrastructure::ReleaseEnvironment end let(:tree_entries) do Gitlab::PaginatedResponse.new( [ create(:gitlab_response, name: '16-9-stable'), create(:gitlab_response, name: '16-10-stable') ] ) end # Simplified environment model for testing let(:latest_environment_config) do <<~EOF --- install_type: helm cluster: release-gitlab-gke versions: chart: ~7.6.0-0 registry: registry.gitlab.com/gitlab-org/build/cng-mirror components: gitaly: 16-10-stable-c23c8625 registry: 16-10-stable-c23c8625 EOF end let(:new_environment_config) do <<~EOF --- install_type: helm cluster: release-gitlab-gke versions: chart: "~7.6.0-0" registry: registry.gitlab.com/gitlab-org/build/cng-mirror components: gitaly: 16-11-stable-fddfe1c1 registry: 16-11-stable-fddfe1c1 EOF end before do allow(client) .to receive_messages( tree: tree_entries, file_contents: latest_environment_config ) end describe '#create' do it 'creates a new release environment file' do allow(ReleaseTools::Branch).to receive(:new).and_return(branch) expect(client) .to receive(:create_file) .with( project, 'environments/16-11-stable/environment.yaml', project.default_branch, new_environment_config, a_string_matching('Add new environment 16-11-stable') ) without_dry_run do environment.create end end context 'when the environment already exists' do it 'does not create the new release environment file' do allow(ReleaseTools::Branch).to receive(:new).and_return(branch) tree_entries = Gitlab::PaginatedResponse.new( [create(:gitlab_response, name: '16-11-stable')] ) allow(client) .to receive(:tree) .and_return(tree_entries) expect(client).not_to receive(:create_file) without_dry_run do environment.create end end end context 'when the environment belongs to an old version' do let(:version) { '15.10.0' } it 'uses the correct stable branch' do allow(ReleaseTools::Branch).to receive(:new).and_return(branch) expect(ReleaseTools::Branch) .to receive(:new) .with(name: '15-10-stable-ee', project: ReleaseTools::Project::GitlabEe) without_dry_run do environment.create end end end context 'when a patch version is used' do let(:version) { '16.8.1' } let(:new_environment_config) do <<~EOF --- install_type: helm cluster: release-gitlab-gke versions: chart: "~7.6.0-0" registry: registry.gitlab.com/gitlab-org/build/cng-mirror components: gitaly: 16-8-stable-fddfe1c1 registry: 16-8-stable-fddfe1c1 EOF end it 'creates the release environment' do allow(ReleaseTools::Branch).to receive(:new).and_return(branch) expect(client) .to receive(:create_file) .with( project, 'environments/16-8-stable/environment.yaml', project.default_branch, new_environment_config, a_string_matching('Add new environment 16-8-stable') ) without_dry_run do environment.create end end end context 'when multiple environments exist' do let(:version) { '17.0.0' } let(:tree_entries) do Gitlab::PaginatedResponse.new( [ create(:gitlab_response, name: '16-1-stable'), create(:gitlab_response, name: '16-2-stable'), create(:gitlab_response, name: '16-9-stable'), create(:gitlab_response, name: '16-10-stable'), create(:gitlab_response, name: '16-11-stable') ] ) end it 'uses the latest environment per version' do expect(client) .to receive(:file_contents) .with( project, 'environments/16-11-stable/environment.yaml', project.default_branch ) without_dry_run do environment.create end end end context 'without dry run do' do it 'does not create a new release environment file' do expect(client).not_to receive(:create_file) environment.create end end context 'when the suffix is security' do let(:suffix) { 'security' } let(:new_environment_config) do <<~EOF --- install_type: helm cluster: release-gitlab-gke versions: chart: "~7.6.0-0" registry: registry.gitlab.com/gitlab-org/security/charts/components/images components: gitaly: 16-11-stable-fddfe1c1 registry: 16-11-stable-fddfe1c1 EOF end it 'creates a security release environment' do allow(ReleaseTools::Branch).to receive(:new).and_return(branch) expect(client) .to receive(:create_file) .with( project, 'environments/16-11-stable-security/environment.yaml', project.default_branch, new_environment_config, a_string_matching('Add new environment 16-11-stable') ) without_dry_run do environment.create end end end end end