diff options
Diffstat (limited to 'spec/services/packages')
11 files changed, 303 insertions, 29 deletions
diff --git a/spec/services/packages/composer/version_parser_service_spec.rb b/spec/services/packages/composer/version_parser_service_spec.rb index 904c75ab0a1..1a2f653c042 100644 --- a/spec/services/packages/composer/version_parser_service_spec.rb +++ b/spec/services/packages/composer/version_parser_service_spec.rb @@ -19,9 +19,11 @@ RSpec.describe Packages::Composer::VersionParserService do nil | '1.7.x' | '1.7.x-dev' 'v1.0.0' | nil | '1.0.0' 'v1.0' | nil | '1.0' + 'v1.0.1+meta' | nil | '1.0.1+meta' '1.0' | nil | '1.0' '1.0.2' | nil | '1.0.2' '1.0.2-beta2' | nil | '1.0.2-beta2' + '1.0.1+meta' | nil | '1.0.1+meta' end with_them do diff --git a/spec/services/packages/conan/create_package_file_service_spec.rb b/spec/services/packages/conan/create_package_file_service_spec.rb index 0e9cbba5fc1..bd6a91c883a 100644 --- a/spec/services/packages/conan/create_package_file_service_spec.rb +++ b/spec/services/packages/conan/create_package_file_service_spec.rb @@ -100,7 +100,7 @@ RSpec.describe Packages::Conan::CreatePackageFileService do end let(:tmp_object) do - fog_connection.directories.new(key: 'packages').files.create( + fog_connection.directories.new(key: 'packages').files.create( # rubocop:disable Rails/SaveBang key: "tmp/uploads/#{file_name}", body: 'content' ) diff --git a/spec/services/packages/create_event_service_spec.rb b/spec/services/packages/create_event_service_spec.rb index 7e66b430a8c..55703e9127f 100644 --- a/spec/services/packages/create_event_service_spec.rb +++ b/spec/services/packages/create_event_service_spec.rb @@ -15,40 +15,92 @@ RSpec.describe Packages::CreateEventService do subject { described_class.new(nil, user, params).execute } describe '#execute' do - shared_examples 'package event creation' do |originator_type, expected_scope| - it 'creates the event' do - expect { subject }.to change { Packages::Event.count }.by(1) - - expect(subject.originator_type).to eq(originator_type) - expect(subject.originator).to eq(user&.id) - expect(subject.event_scope).to eq(expected_scope) - expect(subject.event_type).to eq(event_name) + shared_examples 'db package event creation' do |originator_type, expected_scope| + before do + allow(::Gitlab::UsageDataCounters::HLLRedisCounter).to receive(:track_event) + end + + context 'with feature flag disable' do + before do + stub_feature_flags(collect_package_events: false) + end + + it 'does not create an event object' do + expect { subject }.not_to change { Packages::Event.count } + end + end + + context 'with feature flag enabled' do + before do + stub_feature_flags(collect_package_events: true) + end + + it 'creates the event' do + expect { subject }.to change { Packages::Event.count }.by(1) + + expect(subject.originator_type).to eq(originator_type) + expect(subject.originator).to eq(user&.id) + expect(subject.event_scope).to eq(expected_scope) + expect(subject.event_type).to eq(event_name) + end + end + end + + shared_examples 'redis package event creation' do |originator_type, expected_scope| + context 'with feature flag disable' do + before do + stub_feature_flags(collect_package_events_redis: false) + end + + it 'does not track the event' do + expect(::Gitlab::UsageDataCounters::HLLRedisCounter).not_to receive(:track_event) + + subject + end + end + + it 'tracks the event' do + expect(::Gitlab::UsageDataCounters::HLLRedisCounter).to receive(:track_event).with(user.id, Packages::Event.allowed_event_name(expected_scope, event_name, originator_type)) + + subject end end context 'with a user' do let(:user) { create(:user) } - it_behaves_like 'package event creation', 'user', 'container' + it_behaves_like 'db package event creation', 'user', 'container' + it_behaves_like 'redis package event creation', 'user', 'container' end context 'with a deploy token' do let(:user) { create(:deploy_token) } - it_behaves_like 'package event creation', 'deploy_token', 'container' + it_behaves_like 'db package event creation', 'deploy_token', 'container' + it_behaves_like 'redis package event creation', 'deploy_token', 'container' end context 'with no user' do let(:user) { nil } - it_behaves_like 'package event creation', 'guest', 'container' + it_behaves_like 'db package event creation', 'guest', 'container' end context 'with a package as scope' do - let(:user) { nil } let(:scope) { create(:npm_package) } - it_behaves_like 'package event creation', 'guest', 'npm' + context 'as guest' do + let(:user) { nil } + + it_behaves_like 'db package event creation', 'guest', 'npm' + end + + context 'with user' do + let(:user) { create(:user) } + + it_behaves_like 'db package event creation', 'user', 'npm' + it_behaves_like 'redis package event creation', 'user', 'npm' + end end end end diff --git a/spec/services/packages/create_package_file_service_spec.rb b/spec/services/packages/create_package_file_service_spec.rb index 93dde54916a..12fd1039d30 100644 --- a/spec/services/packages/create_package_file_service_spec.rb +++ b/spec/services/packages/create_package_file_service_spec.rb @@ -2,7 +2,10 @@ require 'spec_helper' RSpec.describe Packages::CreatePackageFileService do - let(:package) { create(:maven_package) } + let_it_be(:package) { create(:maven_package) } + let_it_be(:user) { create(:user) } + + subject { described_class.new(package, params) } describe '#execute' do context 'with valid params' do @@ -14,7 +17,7 @@ RSpec.describe Packages::CreatePackageFileService do end it 'creates a new package file' do - package_file = described_class.new(package, params).execute + package_file = subject.execute expect(package_file).to be_valid expect(package_file.file_name).to eq('foo.jar') @@ -29,9 +32,17 @@ RSpec.describe Packages::CreatePackageFileService do end it 'raises an error' do - service = described_class.new(package, params) + expect { subject.execute }.to raise_error(ActiveRecord::RecordInvalid) + end + end + + context 'with a build' do + let_it_be(:pipeline) { create(:ci_pipeline, user: user) } + let(:build) { double('build', pipeline: pipeline) } + let(:params) { { file: Tempfile.new, file_name: 'foo.jar', build: build } } - expect { service.execute }.to raise_error(ActiveRecord::RecordInvalid) + it 'creates a build_info' do + expect { subject.execute }.to change { Packages::PackageFileBuildInfo.count }.by(1) end end end diff --git a/spec/services/packages/debian/extract_deb_metadata_service_spec.rb b/spec/services/packages/debian/extract_deb_metadata_service_spec.rb new file mode 100644 index 00000000000..33059adf8a2 --- /dev/null +++ b/spec/services/packages/debian/extract_deb_metadata_service_spec.rb @@ -0,0 +1,37 @@ +# frozen_string_literal: true +require 'spec_helper' + +RSpec.describe Packages::Debian::ExtractDebMetadataService do + subject { described_class.new(file_path) } + + let(:file_name) { 'libsample0_1.2.3~alpha2_amd64.deb' } + let(:file_path) { "spec/fixtures/packages/debian/#{file_name}" } + + context 'with correct file' do + it 'return as expected' do + expected = { + 'Package': 'libsample0', + 'Source': 'sample', + 'Version': '1.2.3~alpha2', + 'Architecture': 'amd64', + 'Maintainer': 'John Doe <john.doe@example.com>', + 'Installed-Size': '7', + 'Section': 'libs', + 'Priority': 'optional', + 'Multi-Arch': 'same', + 'Homepage': 'https://gitlab.com/', + 'Description': "Some mostly empty lib\nUsed in GitLab tests.\n\nTesting another paragraph." + } + + expect(subject.execute).to eq expected + end + end + + context 'with incorrect file' do + let(:file_name) { 'README.md' } + + it 'raise error' do + expect {subject.execute}.to raise_error(described_class::CommandFailedError, /is not a Debian format archive/i) + end + end +end diff --git a/spec/services/packages/debian/parse_debian822_service_spec.rb b/spec/services/packages/debian/parse_debian822_service_spec.rb new file mode 100644 index 00000000000..b67daca89c4 --- /dev/null +++ b/spec/services/packages/debian/parse_debian822_service_spec.rb @@ -0,0 +1,148 @@ +# frozen_string_literal: true +require 'spec_helper' + +RSpec.describe Packages::Debian::ParseDebian822Service do + subject { described_class.new(input) } + + context 'with dpkg-deb --field output' do + let(:input) do + <<~HEREDOC + Package: libsample0 + Source: sample + Version: 1.2.3~alpha2 + Architecture: amd64 + Maintainer: John Doe <john.doe@example.com> + Installed-Size: 9 + Section: libs + Priority: optional + Multi-Arch: same + Homepage: https://gitlab.com/ + Description: Some mostly empty lib + Used in GitLab tests. + . + Testing another paragraph. + HEREDOC + end + + it 'return as expected, preserving order' do + expected = { + 'Package: libsample0' => { + 'Package': 'libsample0', + 'Source': 'sample', + 'Version': '1.2.3~alpha2', + 'Architecture': 'amd64', + 'Maintainer': 'John Doe <john.doe@example.com>', + 'Installed-Size': '9', + 'Section': 'libs', + 'Priority': 'optional', + 'Multi-Arch': 'same', + 'Homepage': 'https://gitlab.com/', + 'Description': "Some mostly empty lib\nUsed in GitLab tests.\n\nTesting another paragraph." + } + } + + expect(subject.execute.to_s).to eq(expected.to_s) + end + end + + context 'with control file' do + let(:input) { fixture_file('packages/debian/sample/debian/control') } + + it 'return as expected, preserving order' do + expected = { + 'Source: sample' => { + 'Source': 'sample', + 'Priority': 'optional', + 'Maintainer': 'John Doe <john.doe@example.com>', + 'Build-Depends': 'debhelper-compat (= 13)', + 'Standards-Version': '4.5.0', + 'Section': 'libs', + 'Homepage': 'https://gitlab.com/', + # 'Vcs-Browser': 'https://salsa.debian.org/debian/sample-1.2.3', + # '#Vcs-Git': 'https://salsa.debian.org/debian/sample-1.2.3.git', + 'Rules-Requires-Root': 'no' + }, + 'Package: sample-dev' => { + 'Package': 'sample-dev', + 'Section': 'libdevel', + '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." + }, + 'Package: libsample0' => { + 'Package': 'libsample0', + 'Architecture': 'any', + 'Multi-Arch': 'same', + 'Depends': '${shlibs:Depends}, ${misc:Depends}', + 'Description': "Some mostly empty lib\nUsed in GitLab tests.\n\nTesting another paragraph." + }, + 'Package: sample-udeb' => { + 'Package': 'sample-udeb', + 'Package-Type': 'udeb', + 'Architecture': 'any', + 'Depends': 'installed-base', + 'Description': 'Some mostly empty udeb' + } + } + + expect(subject.execute.to_s).to eq(expected.to_s) + end + end + + context 'with empty input' do + let(:input) { '' } + + it 'return a empty hash' do + expect(subject.execute).to eq({}) + end + end + + context 'with unexpected continuation line' do + let(:input) { ' continuation' } + + it 'raise error' do + expect {subject.execute}.to raise_error(described_class::InvalidDebian822Error, 'Parse error. Unexpected continuation line') + end + end + + context 'with duplicate field' do + let(:input) do + <<~HEREDOC + Package: libsample0 + Source: sample + Source: sample + HEREDOC + end + + it 'raise error' do + expect {subject.execute}.to raise_error(described_class::InvalidDebian822Error, "Duplicate field 'Source' in section 'Package: libsample0'") + end + end + + context 'with incorrect input' do + let(:input) do + <<~HEREDOC + Hello + HEREDOC + end + + it 'raise error' do + expect {subject.execute}.to raise_error(described_class::InvalidDebian822Error, 'Parse error on line Hello') + end + end + + context 'with duplicate section' do + let(:input) do + <<~HEREDOC + Package: libsample0 + + Package: libsample0 + HEREDOC + end + + it 'raise error' do + expect {subject.execute}.to raise_error(described_class::InvalidDebian822Error, "Duplicate section 'Package: libsample0'") + end + end +end diff --git a/spec/services/packages/generic/create_package_file_service_spec.rb b/spec/services/packages/generic/create_package_file_service_spec.rb index 0ae109ef996..907483e3d7f 100644 --- a/spec/services/packages/generic/create_package_file_service_spec.rb +++ b/spec/services/packages/generic/create_package_file_service_spec.rb @@ -5,6 +5,8 @@ require 'spec_helper' RSpec.describe Packages::Generic::CreatePackageFileService do let_it_be(:project) { create(:project) } let_it_be(:user) { create(:user) } + let_it_be(:pipeline) { create(:ci_pipeline, user: user) } + let(:build) { double('build', pipeline: pipeline) } describe '#execute' do let(:sha256) { '440e5e148a25331bbd7991575f7d54933c0ebf6cc735a18ee5066ac1381bb590' } @@ -16,7 +18,8 @@ RSpec.describe Packages::Generic::CreatePackageFileService do package_name: 'mypackage', package_version: '0.0.1', file: file, - file_name: 'myfile.tar.gz.1' + file_name: 'myfile.tar.gz.1', + build: build } end @@ -41,6 +44,7 @@ RSpec.describe Packages::Generic::CreatePackageFileService do service = described_class.new(project, user, params) expect { service.execute }.to change { package.package_files.count }.by(1) + .and change { Packages::PackageFileBuildInfo.count }.by(1) package_file = package.package_files.last aggregate_failures do diff --git a/spec/services/packages/generic/find_or_create_package_service_spec.rb b/spec/services/packages/generic/find_or_create_package_service_spec.rb index 5a9b8b03279..a045cb36418 100644 --- a/spec/services/packages/generic/find_or_create_package_service_spec.rb +++ b/spec/services/packages/generic/find_or_create_package_service_spec.rb @@ -27,7 +27,7 @@ RSpec.describe Packages::Generic::FindOrCreatePackageService do expect(package.creator).to eq(user) expect(package.name).to eq('mypackage') expect(package.version).to eq('0.0.1') - expect(package.build_info).to be_nil + expect(package.original_build_info).to be_nil end end @@ -42,7 +42,7 @@ RSpec.describe Packages::Generic::FindOrCreatePackageService do expect(package.creator).to eq(user) expect(package.name).to eq('mypackage') expect(package.version).to eq('0.0.1') - expect(package.build_info.pipeline).to eq(ci_build.pipeline) + expect(package.original_build_info.pipeline).to eq(ci_build.pipeline) end end end @@ -60,7 +60,7 @@ RSpec.describe Packages::Generic::FindOrCreatePackageService do expect(found_package).to eq(package) end.not_to change { project.packages.generic.count } - expect(package.reload.build_info).to be_nil + expect(package.reload.original_build_info).to be_nil end end @@ -68,7 +68,7 @@ RSpec.describe Packages::Generic::FindOrCreatePackageService do let(:pipeline) { create(:ci_pipeline, project: project) } before do - package.create_build_info!(pipeline: pipeline) + package.build_infos.create!(pipeline: pipeline) end it 'finds the package and does not change package build info even if build is provided' do @@ -80,7 +80,7 @@ RSpec.describe Packages::Generic::FindOrCreatePackageService do expect(found_package).to eq(package) end.not_to change { project.packages.generic.count } - expect(package.reload.build_info.pipeline).to eq(pipeline) + expect(package.reload.original_build_info.pipeline).to eq(pipeline) end end end diff --git a/spec/services/packages/maven/create_package_service_spec.rb b/spec/services/packages/maven/create_package_service_spec.rb index 7ec368aa00f..11bf00c1399 100644 --- a/spec/services/packages/maven/create_package_service_spec.rb +++ b/spec/services/packages/maven/create_package_service_spec.rb @@ -33,8 +33,6 @@ RSpec.describe Packages::Maven::CreatePackageService do expect(package.maven_metadatum.app_version).to eq(version) end - it_behaves_like 'assigns build to package' - it_behaves_like 'assigns the package creator' end diff --git a/spec/services/packages/maven/find_or_create_package_service_spec.rb b/spec/services/packages/maven/find_or_create_package_service_spec.rb index 4406e4037e2..2eaad7db445 100644 --- a/spec/services/packages/maven/find_or_create_package_service_spec.rb +++ b/spec/services/packages/maven/find_or_create_package_service_spec.rb @@ -10,11 +10,12 @@ RSpec.describe Packages::Maven::FindOrCreatePackageService do let(:version) { '1.0.0' } let(:file_name) { 'test.jar' } let(:param_path) { "#{path}/#{version}" } + let(:params) { { path: param_path, file_name: file_name } } describe '#execute' do using RSpec::Parameterized::TableSyntax - subject { described_class.new(project, user, { path: param_path, file_name: file_name }).execute } + subject { described_class.new(project, user, params).execute } RSpec.shared_examples 'reuse existing package' do it { expect { subject}.not_to change { Packages::Package.count } } @@ -23,7 +24,7 @@ RSpec.describe Packages::Maven::FindOrCreatePackageService do end RSpec.shared_examples 'create package' do - it { expect { subject}.to change { Packages::Package.count }.by(1) } + it { expect { subject }.to change { Packages::Package.count }.by(1) } it 'sets the proper name and version' do pkg = subject @@ -31,6 +32,8 @@ RSpec.describe Packages::Maven::FindOrCreatePackageService do expect(pkg.name).to eq(path) expect(pkg.version).to eq(version) end + + it_behaves_like 'assigns build to package' end context 'path with version' do @@ -77,5 +80,15 @@ RSpec.describe Packages::Maven::FindOrCreatePackageService do end end end + + context 'with a build' do + let_it_be(:pipeline) { create(:ci_pipeline, user: user) } + let(:build) { double('build', pipeline: pipeline) } + let(:params) { { path: param_path, file_name: file_name, build: build } } + + it 'creates a build_info' do + expect { subject }.to change { Packages::BuildInfo.count }.by(1) + end + end end end diff --git a/spec/services/packages/npm/create_package_service_spec.rb b/spec/services/packages/npm/create_package_service_spec.rb index c8431c640da..6db3777cde8 100644 --- a/spec/services/packages/npm/create_package_service_spec.rb +++ b/spec/services/packages/npm/create_package_service_spec.rb @@ -48,7 +48,16 @@ RSpec.describe Packages::Npm::CreatePackageService do context 'scoped package' do it_behaves_like 'valid package' - it_behaves_like 'assigns build to package' + context 'with build info' do + let(:job) { create(:ci_build, user: user) } + let(:params) { super().merge(build: job) } + + it_behaves_like 'assigns build to package' + + it 'creates a package file build info' do + expect { subject }.to change { Packages::PackageFileBuildInfo.count }.by(1) + end + end end context 'invalid package name' do |