diff options
Diffstat (limited to 'spec/services/packages')
10 files changed, 115 insertions, 278 deletions
diff --git a/spec/services/packages/debian/create_distribution_service_spec.rb b/spec/services/packages/debian/create_distribution_service_spec.rb index 87cf1070075..ecf82c6a1db 100644 --- a/spec/services/packages/debian/create_distribution_service_spec.rb +++ b/spec/services/packages/debian/create_distribution_service_spec.rb @@ -4,8 +4,12 @@ require 'spec_helper' RSpec.describe Packages::Debian::CreateDistributionService do RSpec.shared_examples 'Create Debian Distribution' do |expected_message, expected_components, expected_architectures| + let_it_be(:container) { create(container_type) } # rubocop:disable Rails/SaveBang + it 'returns ServiceResponse', :aggregate_failures do if expected_message.nil? + expect(::Packages::Debian::GenerateDistributionWorker).to receive(:perform_async).with(container_type, an_instance_of(Integer)) + expect { response } .to change { container.debian_distributions.klass.all.count } .from(0).to(1) @@ -18,6 +22,7 @@ RSpec.describe Packages::Debian::CreateDistributionService do .and not_change { Packages::Debian::ProjectComponentFile.count } .and not_change { Packages::Debian::GroupComponentFile.count } else + expect(::Packages::Debian::GenerateDistributionWorker).not_to receive(:perform_async) expect { response } .to not_change { container.debian_distributions.klass.all.count } .and not_change { container.debian_distributions.count } @@ -109,13 +114,13 @@ RSpec.describe Packages::Debian::CreateDistributionService do let(:response) { subject.execute } context 'within a projet' do - let_it_be(:container) { create(:project) } + let_it_be(:container_type) { :project } it_behaves_like 'Debian Create Distribution Service' end context 'within a group' do - let_it_be(:container) { create(:group) } + let_it_be(:container_type) { :group } it_behaves_like 'Debian Create Distribution Service' end diff --git a/spec/services/packages/debian/destroy_distribution_service_spec.rb b/spec/services/packages/debian/destroy_distribution_service_spec.rb deleted file mode 100644 index e4c43884bb4..00000000000 --- a/spec/services/packages/debian/destroy_distribution_service_spec.rb +++ /dev/null @@ -1,78 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' - -RSpec.describe Packages::Debian::DestroyDistributionService do - RSpec.shared_examples 'Destroy Debian Distribution' do |expected_message| - it 'returns ServiceResponse', :aggregate_failures do - if expected_message.nil? - expect { response } - .to change { container.debian_distributions.klass.all.count } - .from(1).to(0) - .and change { container.debian_distributions.count } - .from(1).to(0) - .and change { component1.class.all.count } - .from(2).to(0) - .and change { architecture1.class.all.count } - .from(3).to(0) - .and change { component_file1.class.all.count } - .from(4).to(0) - else - expect { response } - .to not_change { container.debian_distributions.klass.all.count } - .and not_change { container.debian_distributions.count } - .and not_change { component1.class.all.count } - .and not_change { architecture1.class.all.count } - .and not_change { component_file1.class.all.count } - end - - expect(response).to be_a(ServiceResponse) - expect(response.success?).to eq(expected_message.nil?) - expect(response.error?).to eq(!expected_message.nil?) - expect(response.message).to eq(expected_message) - - if expected_message.nil? - expect(response.payload).to eq({}) - else - expect(response.payload).to eq(distribution: distribution) - end - end - end - - RSpec.shared_examples 'Debian Destroy Distribution Service' do |container_type, can_freeze| - context "with a Debian #{container_type} distribution" do - let_it_be(:container, freeze: can_freeze) { create(container_type) } # rubocop:disable Rails/SaveBang - let_it_be(:distribution, freeze: can_freeze) { create("debian_#{container_type}_distribution", container: container) } - let_it_be(:component1, freeze: can_freeze) { create("debian_#{container_type}_component", distribution: distribution, name: 'component1') } - let_it_be(:component2, freeze: can_freeze) { create("debian_#{container_type}_component", distribution: distribution, name: 'component2') } - let_it_be(:architecture0, freeze: true) { create("debian_#{container_type}_architecture", distribution: distribution, name: 'all') } - let_it_be(:architecture1, freeze: can_freeze) { create("debian_#{container_type}_architecture", distribution: distribution, name: 'architecture1') } - let_it_be(:architecture2, freeze: can_freeze) { create("debian_#{container_type}_architecture", distribution: distribution, name: 'architecture2') } - let_it_be(:component_file1, freeze: can_freeze) { create("debian_#{container_type}_component_file", :source, component: component1) } - let_it_be(:component_file2, freeze: can_freeze) { create("debian_#{container_type}_component_file", component: component1, architecture: architecture1) } - let_it_be(:component_file3, freeze: can_freeze) { create("debian_#{container_type}_component_file", :source, component: component2) } - let_it_be(:component_file4, freeze: can_freeze) { create("debian_#{container_type}_component_file", component: component2, architecture: architecture2) } - - subject { described_class.new(distribution) } - - let(:response) { subject.execute } - - context 'with a distribution' do - it_behaves_like 'Destroy Debian Distribution' - end - - context 'when destroy fails' do - let(:distribution) { create("debian_#{container_type}_distribution", container: container) } - - before do - expect(distribution).to receive(:destroy).and_return(false) - end - - it_behaves_like 'Destroy Debian Distribution', "Unable to destroy Debian #{container_type} distribution" - end - end - end - - it_behaves_like 'Debian Destroy Distribution Service', :project, true - it_behaves_like 'Debian Destroy Distribution Service', :group, false -end diff --git a/spec/services/packages/debian/extract_changes_metadata_service_spec.rb b/spec/services/packages/debian/extract_changes_metadata_service_spec.rb index 2a92b8ed26e..ced846866c2 100644 --- a/spec/services/packages/debian/extract_changes_metadata_service_spec.rb +++ b/spec/services/packages/debian/extract_changes_metadata_service_spec.rb @@ -6,8 +6,10 @@ RSpec.describe Packages::Debian::ExtractChangesMetadataService do let_it_be(:distribution) { create(:debian_project_distribution, codename: 'unstable') } let_it_be(:incoming) { create(:debian_incoming, project: distribution.project) } - let(:package_file) { incoming.package_files.last } - let(:service) { described_class.new(package_file) } + let(:source_file) { incoming.package_files.first } + let(:dsc_file) { incoming.package_files.second } + let(:changes_file) { incoming.package_files.last } + let(:service) { described_class.new(changes_file) } subject { service.execute } @@ -23,7 +25,7 @@ RSpec.describe Packages::Debian::ExtractChangesMetadataService do end context 'with invalid package file' do - let(:package_file) { incoming.package_files.first } + let(:changes_file) { incoming.package_files.first } it 'raise ArgumentError', :aggregate_failures do expect { subject }.to raise_error(described_class::ExtractionError, "is not a changes file") @@ -31,14 +33,14 @@ RSpec.describe Packages::Debian::ExtractChangesMetadataService do end context 'with invalid metadata' do - let(:md5_dsc) { '3b0817804f669e16cdefac583ad88f0e 671 libs optional sample_1.2.3~alpha2.dsc' } - let(:md5_source) { 'd79b34f58f61ff4ad696d9bd0b8daa68 864 libs optional sample_1.2.3~alpha2.tar.xz' } + let(:md5_dsc) { "#{dsc_file.file_md5} 671 libs optional sample_1.2.3~alpha2.dsc" } + let(:md5_source) { "#{source_file.file_md5} 864 libs optional sample_1.2.3~alpha2.tar.xz" } let(:md5s) { "#{md5_dsc}\n#{md5_source}" } - let(:sha1_dsc) { '32ecbd674f0bfd310df68484d87752490685a8d6 671 sample_1.2.3~alpha2.dsc' } - let(:sha1_source) { '5f8bba5574eb01ac3b1f5e2988e8c29307788236 864 sample_1.2.3~alpha2.tar.xz' } + let(:sha1_dsc) { "#{dsc_file.file_sha1} 671 sample_1.2.3~alpha2.dsc" } + let(:sha1_source) { "#{source_file.file_sha1} 864 sample_1.2.3~alpha2.tar.xz" } let(:sha1s) { "#{sha1_dsc}\n#{sha1_source}" } - let(:sha256_dsc) { '844f79825b7e8aaa191e514b58a81f9ac1e58e2180134b0c9512fa66d896d7ba 671 sample_1.2.3~alpha2.dsc' } - let(:sha256_source) { 'b5a599e88e7cbdda3bde808160a21ba1dd1ec76b2ec8d4912aae769648d68362 864 sample_1.2.3~alpha2.tar.xz' } + let(:sha256_dsc) { "#{dsc_file.file_sha256} 671 sample_1.2.3~alpha2.dsc" } + let(:sha256_source) { "#{source_file.file_sha256} 864 sample_1.2.3~alpha2.tar.xz" } let(:sha256s) { "#{sha256_dsc}\n#{sha256_source}" } let(:fields) { { 'Files' => md5s, 'Checksums-Sha1' => sha1s, 'Checksums-Sha256' => sha256s } } let(:metadata) { { file_type: :changes, architecture: 'amd64', fields: fields } } @@ -82,7 +84,7 @@ RSpec.describe Packages::Debian::ExtractChangesMetadataService do end context 'with different size in Checksums-Sha1' do - let(:sha1_dsc) { '32ecbd674f0bfd310df68484d87752490685a8d6 42 sample_1.2.3~alpha2.dsc' } + let(:sha1_dsc) { "#{dsc_file.file_sha1} 42 sample_1.2.3~alpha2.dsc" } it 'raise ArgumentError', :aggregate_failures do expect { subject }.to raise_error(described_class::ExtractionError, "Size for sample_1.2.3~alpha2.dsc in Files and Checksums-Sha1 differ") @@ -99,7 +101,7 @@ RSpec.describe Packages::Debian::ExtractChangesMetadataService do end context 'with different size in Checksums-Sha256' do - let(:sha256_dsc) { '844f79825b7e8aaa191e514b58a81f9ac1e58e2180134b0c9512fa66d896d7ba 42 sample_1.2.3~alpha2.dsc' } + let(:sha256_dsc) { "#{dsc_file.file_sha256} 42 sample_1.2.3~alpha2.dsc" } it 'raise ArgumentError', :aggregate_failures do expect { subject }.to raise_error(described_class::ExtractionError, "Size for sample_1.2.3~alpha2.dsc in Files and Checksums-Sha256 differ") @@ -126,7 +128,7 @@ RSpec.describe Packages::Debian::ExtractChangesMetadataService do let(:md5_dsc) { '1234567890123456789012345678012 671 libs optional sample_1.2.3~alpha2.dsc' } it 'raise ArgumentError', :aggregate_failures do - expect { subject }.to raise_error(described_class::ExtractionError, "Validation failed: Md5sum mismatch for sample_1.2.3~alpha2.dsc: 3b0817804f669e16cdefac583ad88f0e != 1234567890123456789012345678012") + expect { subject }.to raise_error(described_class::ExtractionError, "Validation failed: Md5sum mismatch for sample_1.2.3~alpha2.dsc: #{dsc_file.file_md5} != 1234567890123456789012345678012") end end @@ -134,7 +136,7 @@ RSpec.describe Packages::Debian::ExtractChangesMetadataService do let(:sha1_dsc) { '1234567890123456789012345678901234567890 671 sample_1.2.3~alpha2.dsc' } it 'raise ArgumentError', :aggregate_failures do - expect { subject }.to raise_error(described_class::ExtractionError, "Validation failed: Sha1sum mismatch for sample_1.2.3~alpha2.dsc: 32ecbd674f0bfd310df68484d87752490685a8d6 != 1234567890123456789012345678901234567890") + expect { subject }.to raise_error(described_class::ExtractionError, "Validation failed: Sha1sum mismatch for sample_1.2.3~alpha2.dsc: #{dsc_file.file_sha1} != 1234567890123456789012345678901234567890") end end @@ -142,7 +144,7 @@ RSpec.describe Packages::Debian::ExtractChangesMetadataService do let(:sha256_dsc) { '1234567890123456789012345678901234567890123456789012345678901234 671 sample_1.2.3~alpha2.dsc' } it 'raise ArgumentError', :aggregate_failures do - expect { subject }.to raise_error(described_class::ExtractionError, "Validation failed: Sha256sum mismatch for sample_1.2.3~alpha2.dsc: 844f79825b7e8aaa191e514b58a81f9ac1e58e2180134b0c9512fa66d896d7ba != 1234567890123456789012345678901234567890123456789012345678901234") + expect { subject }.to raise_error(described_class::ExtractionError, "Validation failed: Sha256sum mismatch for sample_1.2.3~alpha2.dsc: #{dsc_file.file_sha256} != 1234567890123456789012345678901234567890123456789012345678901234") end end end diff --git a/spec/services/packages/debian/generate_distribution_service_spec.rb b/spec/services/packages/debian/generate_distribution_service_spec.rb index 0547d18c8bc..a162e492e7e 100644 --- a/spec/services/packages/debian/generate_distribution_service_spec.rb +++ b/spec/services/packages/debian/generate_distribution_service_spec.rb @@ -1,182 +1,25 @@ # frozen_string_literal: true + require 'spec_helper' RSpec.describe Packages::Debian::GenerateDistributionService do - let_it_be(:group) { create(:group, :public) } - let_it_be(:project) { create(:project, :public, group: group) } - let_it_be(:project_distribution) { create("debian_project_distribution", container: project, codename: 'unstable', valid_time_duration_seconds: 48.hours.to_i) } - - let_it_be(:incoming) { create(:debian_incoming, project: project) } - - before_all do - ::Packages::Debian::ProcessChangesService.new(incoming.package_files.last, nil).execute - end - - let(:service) { described_class.new(distribution) } - describe '#execute' do - subject { service.execute } - - shared_examples 'Generate Distribution' do |container_type| - context "for #{container_type}" do - if container_type == :group - let_it_be(:container) { group } - let_it_be(:distribution, reload: true) { create('debian_group_distribution', container: group, codename: 'unstable', valid_time_duration_seconds: 48.hours.to_i) } - else - let_it_be(:container) { project } - let_it_be(:distribution, reload: true) { project_distribution } - end - - context 'with components and architectures' do - let_it_be(:component_main ) { create("debian_#{container_type}_component", distribution: distribution, name: 'main') } - let_it_be(:component_contrib) { create("debian_#{container_type}_component", distribution: distribution, name: 'contrib') } - - let_it_be(:architecture_all ) { create("debian_#{container_type}_architecture", distribution: distribution, name: 'all') } - let_it_be(:architecture_amd64) { create("debian_#{container_type}_architecture", distribution: distribution, name: 'amd64') } - let_it_be(:architecture_arm64) { create("debian_#{container_type}_architecture", distribution: distribution, name: 'arm64') } - - let_it_be(:component_file1) { create("debian_#{container_type}_component_file", component: component_main, architecture: architecture_all, created_at: '2020-01-24T09:00:00.000Z') } # destroyed - let_it_be(:component_file2) { create("debian_#{container_type}_component_file", component: component_main, architecture: architecture_amd64, created_at: '2020-01-24T10:29:59.000Z') } # destroyed - let_it_be(:component_file3) { create("debian_#{container_type}_component_file", component: component_contrib, architecture: architecture_all, created_at: '2020-01-24T10:30:00.000Z') } # kept - let_it_be(:component_file4) { create("debian_#{container_type}_component_file", component: component_contrib, architecture: architecture_amd64, created_at: '2020-01-24T11:30:00.000Z') } # kept - - def check_component_file(component_name, component_file_type, architecture_name, expected_content) - component_file = distribution - .component_files - .with_component_name(component_name) - .with_file_type(component_file_type) - .with_architecture_name(architecture_name) - .last + subject { described_class.new(distribution).execute } - expect(component_file).not_to be_nil - expect(component_file.file.exists?).to eq(!expected_content.nil?) + include_context 'with published Debian package' - unless expected_content.nil? - component_file.file.use_file do |file_path| - expect(File.read(file_path)).to eq(expected_content) - end - end - end - - it 'updates distribution and component files', :aggregate_failures do - travel_to(Time.utc(2020, 01, 25, 15, 17, 18, 123456)) do - expect(Gitlab::ErrorTracking).not_to receive(:log_exception) - - expect { subject } - .to not_change { Packages::Package.count } - .and not_change { Packages::PackageFile.count } - .and change { distribution.component_files.count }.from(4).to(2 + 6) - - expected_main_amd64_content = <<~EOF - Package: libsample0 - Source: sample - Version: 1.2.3~alpha2 - Installed-Size: 7 - Maintainer: John Doe <john.doe@example.com> - Architecture: amd64 - Description: Some mostly empty lib - Used in GitLab tests. - . - Testing another paragraph. - Multi-Arch: same - Homepage: https://gitlab.com/ - Section: libs - Priority: optional - Filename: pool/unstable/#{project.id}/s/sample/libsample0_1.2.3~alpha2_amd64.deb - Size: 409600 - MD5sum: fb0842b21adc44207996296fe14439dd - SHA256: 1c383a525bfcba619c7305ccd106d61db501a6bbaf0003bf8d0c429fbdb7fcc1 - - Package: sample-dev - Source: sample (1.2.3~alpha2) - Version: 1.2.3~binary - Installed-Size: 7 - Maintainer: John Doe <john.doe@example.com> - Architecture: amd64 - Depends: libsample0 (= 1.2.3~binary) - Description: Some mostly empty developpement files - Used in GitLab tests. - . - Testing another paragraph. - Multi-Arch: same - Homepage: https://gitlab.com/ - Section: libdevel - Priority: optional - Filename: pool/unstable/#{project.id}/s/sample/sample-dev_1.2.3~binary_amd64.deb - Size: 409600 - MD5sum: d2afbd28e4d74430d22f9504e18bfdf5 - SHA256: 9fbeee2191ce4dab5288fad5ecac1bd369f58fef9a992a880eadf0caf25f086d - EOF - - check_component_file('main', :packages, 'all', nil) - check_component_file('main', :packages, 'amd64', expected_main_amd64_content) - check_component_file('main', :packages, 'arm64', nil) - - check_component_file('contrib', :packages, 'all', nil) - check_component_file('contrib', :packages, 'amd64', nil) - check_component_file('contrib', :packages, 'arm64', nil) - - size = expected_main_amd64_content.length - md5sum = Digest::MD5.hexdigest(expected_main_amd64_content) - sha256 = Digest::SHA256.hexdigest(expected_main_amd64_content) - - expected_release_content = <<~EOF - Codename: unstable - Date: Sat, 25 Jan 2020 15:17:18 +0000 - Valid-Until: Mon, 27 Jan 2020 15:17:18 +0000 - Architectures: all amd64 arm64 - Components: contrib main - MD5Sum: - d41d8cd98f00b204e9800998ecf8427e 0 contrib/binary-all/Packages - d41d8cd98f00b204e9800998ecf8427e 0 contrib/binary-amd64/Packages - d41d8cd98f00b204e9800998ecf8427e 0 contrib/binary-arm64/Packages - d41d8cd98f00b204e9800998ecf8427e 0 main/binary-all/Packages - #{md5sum} #{size} main/binary-amd64/Packages - d41d8cd98f00b204e9800998ecf8427e 0 main/binary-arm64/Packages - SHA256: - e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 contrib/binary-all/Packages - e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 contrib/binary-amd64/Packages - e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 contrib/binary-arm64/Packages - e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 main/binary-all/Packages - #{sha256} #{size} main/binary-amd64/Packages - e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 main/binary-arm64/Packages - EOF + [:project, :group].each do |container_type| + context "for #{container_type}" do + include_context 'with Debian distribution', container_type - distribution.file.use_file do |file_path| - expect(File.read(file_path)).to eq(expected_release_content) - end - end - end + context 'with Debian components and architectures' do + it_behaves_like 'Generate Debian Distribution and component files' end context 'without components and architectures' do - it 'updates distribution and component files', :aggregate_failures do - travel_to(Time.utc(2020, 01, 25, 15, 17, 18, 123456)) do - expect(Gitlab::ErrorTracking).not_to receive(:log_exception) - - expect { subject } - .to not_change { Packages::Package.count } - .and not_change { Packages::PackageFile.count } - .and not_change { distribution.component_files.count } - - expected_release_content = <<~EOF - Codename: unstable - Date: Sat, 25 Jan 2020 15:17:18 +0000 - Valid-Until: Mon, 27 Jan 2020 15:17:18 +0000 - MD5Sum: - SHA256: - EOF - - distribution.file.use_file do |file_path| - expect(File.read(file_path)).to eq(expected_release_content) - end - end - end + it_behaves_like 'Generate minimal Debian Distribution' end end end - - it_behaves_like 'Generate Distribution', :project - it_behaves_like 'Generate Distribution', :group end end diff --git a/spec/services/packages/debian/parse_debian822_service_spec.rb b/spec/services/packages/debian/parse_debian822_service_spec.rb index f43e38991ce..cad4e81f350 100644 --- a/spec/services/packages/debian/parse_debian822_service_spec.rb +++ b/spec/services/packages/debian/parse_debian822_service_spec.rb @@ -68,7 +68,7 @@ RSpec.describe Packages::Debian::ParseDebian822Service do 'Architecture' => 'any', 'Multi-Arch' => 'same', 'Depends' => 'libsample0 (= ${binary:Version}), ${misc:Depends}', - 'Description' => "Some mostly empty developpement files\nUsed in GitLab tests.\n\nTesting another paragraph." + 'Description' => "Some mostly empty development files\nUsed in GitLab tests.\n\nTesting another paragraph." }, 'Package: libsample0' => { 'Package' => 'libsample0', diff --git a/spec/services/packages/debian/process_changes_service_spec.rb b/spec/services/packages/debian/process_changes_service_spec.rb index f23471659bc..3069a2806b2 100644 --- a/spec/services/packages/debian/process_changes_service_spec.rb +++ b/spec/services/packages/debian/process_changes_service_spec.rb @@ -13,6 +13,7 @@ RSpec.describe Packages::Debian::ProcessChangesService do context 'with valid package file' do it 'updates package and package file', :aggregate_failures do + expect(::Packages::Debian::GenerateDistributionWorker).to receive(:perform_async).with(:project, distribution.id) expect { subject.execute } .to change { Packages::Package.count }.from(1).to(2) .and not_change { Packages::PackageFile.count } @@ -30,6 +31,7 @@ RSpec.describe Packages::Debian::ProcessChangesService do let(:package_file) { incoming.package_files.first } it 'raise ExtractionError', :aggregate_failures do + expect(::Packages::Debian::GenerateDistributionWorker).not_to receive(:perform_async) expect { subject.execute } .to not_change { Packages::Package.count } .and not_change { Packages::PackageFile.count } @@ -47,6 +49,7 @@ RSpec.describe Packages::Debian::ProcessChangesService do end it 'remove the package file', :aggregate_failures do + expect(::Packages::Debian::GenerateDistributionWorker).not_to receive(:perform_async) expect { subject.execute } .to not_change { Packages::Package.count } .and not_change { Packages::PackageFile.count } diff --git a/spec/services/packages/debian/update_distribution_service_spec.rb b/spec/services/packages/debian/update_distribution_service_spec.rb index 852fc713e34..2aa34a62111 100644 --- a/spec/services/packages/debian/update_distribution_service_spec.rb +++ b/spec/services/packages/debian/update_distribution_service_spec.rb @@ -6,6 +6,8 @@ RSpec.describe Packages::Debian::UpdateDistributionService do RSpec.shared_examples 'Update Debian Distribution' do |expected_message, expected_components, expected_architectures, component_file_delta = 0| it 'returns ServiceResponse', :aggregate_failures do expect(distribution).to receive(:update).with(simple_params).and_call_original if expected_message.nil? + expect(::Packages::Debian::GenerateDistributionWorker).to receive(:perform_async).with(distribution.class.container_type, distribution.id).and_call_original if expected_message.nil? + expect(::Packages::Debian::GenerateDistributionWorker).not_to receive(:perform_async) unless expected_message.nil? if component_file_delta.zero? expect { response } diff --git a/spec/services/packages/helm/extract_file_metadata_service_spec.rb b/spec/services/packages/helm/extract_file_metadata_service_spec.rb new file mode 100644 index 00000000000..ea196190e24 --- /dev/null +++ b/spec/services/packages/helm/extract_file_metadata_service_spec.rb @@ -0,0 +1,59 @@ +# frozen_string_literal: true +require 'spec_helper' + +RSpec.describe Packages::Helm::ExtractFileMetadataService do + let_it_be(:package_file) { create(:helm_package_file) } + + let(:service) { described_class.new(package_file) } + + let(:expected) do + { + 'apiVersion' => 'v2', + 'description' => 'File, Block, and Object Storage Services for your Cloud-Native Environment', + 'icon' => 'https://rook.io/images/rook-logo.svg', + 'name' => 'rook-ceph', + 'sources' => ['https://github.com/rook/rook'], + 'version' => 'v1.5.8' + } + end + + subject { service.execute } + + context 'with a valid file' do + it { is_expected.to eq(expected) } + end + + context 'without Chart.yaml' do + before do + expect_next_instances_of(Gem::Package::TarReader::Entry, 14) do |entry| + expect(entry).to receive(:full_name).exactly(:once).and_wrap_original do |m, *args| + m.call(*args) + '_suffix' + end + end + end + + it { expect { subject }.to raise_error(described_class::ExtractionError, 'Chart.yaml not found within a directory') } + end + + context 'with Chart.yaml at root' do + before do + expect_next_instances_of(Gem::Package::TarReader::Entry, 14) do |entry| + expect(entry).to receive(:full_name).exactly(:once) do + 'Chart.yaml' + end + end + end + + it { expect { subject }.to raise_error(described_class::ExtractionError, 'Chart.yaml not found within a directory') } + end + + context 'with an invalid YAML' do + before do + expect_next_instance_of(Gem::Package::TarReader::Entry) do |entry| + expect(entry).to receive(:read).and_return('{') + end + end + + it { expect { subject }.to raise_error(described_class::ExtractionError, 'Error while parsing Chart.yaml: (<unknown>): did not find expected node content while parsing a flow node at line 2 column 1') } + end +end diff --git a/spec/services/packages/nuget/metadata_extraction_service_spec.rb b/spec/services/packages/nuget/metadata_extraction_service_spec.rb index 39fc0f9e6a1..79428b58bd9 100644 --- a/spec/services/packages/nuget/metadata_extraction_service_spec.rb +++ b/spec/services/packages/nuget/metadata_extraction_service_spec.rb @@ -3,7 +3,8 @@ require 'spec_helper' RSpec.describe Packages::Nuget::MetadataExtractionService do - let(:package_file) { create(:nuget_package).package_files.first } + let_it_be(:package_file) { create(:nuget_package).package_files.first } + let(:service) { described_class.new(package_file.id) } describe '#execute' do @@ -28,7 +29,7 @@ RSpec.describe Packages::Nuget::MetadataExtractionService do context 'with nuspec file' do before do - allow(service).to receive(:nuspec_file).and_return(fixture_file(nuspec_filepath)) + allow(service).to receive(:nuspec_file_content).and_return(fixture_file(nuspec_filepath)) end context 'with dependencies' do @@ -57,7 +58,7 @@ RSpec.describe Packages::Nuget::MetadataExtractionService do let_it_be(:nuspec_filepath) { 'packages/nuget/with_metadata.nuspec' } before do - allow(service).to receive(:nuspec_file).and_return(fixture_file(nuspec_filepath)) + allow(service).to receive(:nuspec_file_content).and_return(fixture_file(nuspec_filepath)) end it { expect(subject[:license_url]).to eq('https://opensource.org/licenses/MIT') } diff --git a/spec/services/packages/nuget/update_package_from_metadata_service_spec.rb b/spec/services/packages/nuget/update_package_from_metadata_service_spec.rb index c1cce46a54c..ffe1a5b7646 100644 --- a/spec/services/packages/nuget/update_package_from_metadata_service_spec.rb +++ b/spec/services/packages/nuget/update_package_from_metadata_service_spec.rb @@ -12,7 +12,7 @@ RSpec.describe Packages::Nuget::UpdatePackageFromMetadataService, :clean_gitlab_ let(:package_version) { '1.0.0' } let(:package_file_name) { 'dummyproject.dummypackage.1.0.0.nupkg' } - RSpec.shared_examples 'raising an' do |error_class| + shared_examples 'raising an' do |error_class| it "raises an #{error_class}" do expect { subject }.to raise_error(error_class) end @@ -21,11 +21,7 @@ RSpec.describe Packages::Nuget::UpdatePackageFromMetadataService, :clean_gitlab_ describe '#execute' do subject { service.execute } - before do - stub_package_file_object_storage(enabled: true, direct_upload: true) - end - - RSpec.shared_examples 'taking the lease' do + shared_examples 'taking the lease' do before do allow(service).to receive(:lease_release?).and_return(false) end @@ -39,7 +35,7 @@ RSpec.describe Packages::Nuget::UpdatePackageFromMetadataService, :clean_gitlab_ end end - RSpec.shared_examples 'not updating the package if the lease is taken' do + shared_examples 'not updating the package if the lease is taken' do context 'without obtaining the exclusive lease' do let(:lease_key) { "packages:nuget:update_package_from_metadata_service:package:#{package_id}" } let(:metadata) { { package_name: package_name, package_version: package_version } } @@ -117,9 +113,10 @@ RSpec.describe Packages::Nuget::UpdatePackageFromMetadataService, :clean_gitlab_ let(:expected_tags) { %w(foo bar test tag1 tag2 tag3 tag4 tag5) } before do - allow_any_instance_of(Packages::Nuget::MetadataExtractionService) - .to receive(:nuspec_file) - .and_return(fixture_file(nuspec_filepath)) + allow_next_instance_of(Packages::Nuget::MetadataExtractionService) do |service| + allow(service) + .to receive(:nuspec_file_content).and_return(fixture_file(nuspec_filepath)) + end end it 'creates tags' do @@ -172,9 +169,10 @@ RSpec.describe Packages::Nuget::UpdatePackageFromMetadataService, :clean_gitlab_ let(:package_file_name) { 'test.package.3.5.2.nupkg' } before do - allow_any_instance_of(Packages::Nuget::MetadataExtractionService) - .to receive(:nuspec_file) - .and_return(fixture_file(nuspec_filepath)) + allow_next_instance_of(Packages::Nuget::MetadataExtractionService) do |service| + allow(service) + .to receive(:nuspec_file_content).and_return(fixture_file(nuspec_filepath)) + end end it 'updates package and package file' do @@ -195,7 +193,9 @@ RSpec.describe Packages::Nuget::UpdatePackageFromMetadataService, :clean_gitlab_ context 'with package file not containing a nuspec file' do before do - allow_any_instance_of(Zip::File).to receive(:glob).and_return([]) + allow_next_instance_of(Zip::File) do |file| + allow(file).to receive(:glob).and_return([]) + end end it_behaves_like 'raising an', ::Packages::Nuget::MetadataExtractionService::ExtractionError |