summaryrefslogtreecommitdiff
path: root/spec/models/packages
diff options
context:
space:
mode:
Diffstat (limited to 'spec/models/packages')
-rw-r--r--spec/models/packages/npm_spec.rb24
-rw-r--r--spec/models/packages/package_file_spec.rb67
-rw-r--r--spec/models/packages/package_spec.rb161
3 files changed, 251 insertions, 1 deletions
diff --git a/spec/models/packages/npm_spec.rb b/spec/models/packages/npm_spec.rb
new file mode 100644
index 00000000000..fa4adadfe06
--- /dev/null
+++ b/spec/models/packages/npm_spec.rb
@@ -0,0 +1,24 @@
+# frozen_string_literal: true
+require 'spec_helper'
+
+RSpec.describe Packages::Npm do
+ using RSpec::Parameterized::TableSyntax
+
+ describe '.scope_of' do
+ subject { described_class.scope_of(package_name) }
+
+ where(:package_name, :expected_result) do
+ nil | nil
+ 'test' | nil
+ '@test' | nil
+ 'test/package' | nil
+ '@/package' | nil
+ '@test/package' | 'test'
+ '@test/' | nil
+ end
+
+ with_them do
+ it { is_expected.to eq(expected_result) }
+ end
+ end
+end
diff --git a/spec/models/packages/package_file_spec.rb b/spec/models/packages/package_file_spec.rb
index ee0aeb26d50..90910fcb7ce 100644
--- a/spec/models/packages/package_file_spec.rb
+++ b/spec/models/packages/package_file_spec.rb
@@ -159,4 +159,71 @@ RSpec.describe Packages::PackageFile, type: :model do
expect { subject }.to change { package_file.size }.from(nil).to(3513)
end
end
+
+ context 'update callbacks' do
+ subject { package_file.save! }
+
+ shared_examples 'executing the default callback' do
+ it 'executes the default callback' do
+ expect(package_file).to receive(:remove_previously_stored_file)
+ expect(package_file).not_to receive(:move_in_object_storage)
+
+ subject
+ end
+ end
+
+ context 'with object storage disabled' do
+ let(:package_file) { create(:package_file, file_name: 'file_name.txt') }
+
+ before do
+ stub_package_file_object_storage(enabled: false)
+ end
+
+ it_behaves_like 'executing the default callback'
+
+ context 'with new_file_path set' do
+ before do
+ package_file.new_file_path = 'test'
+ end
+
+ it_behaves_like 'executing the default callback'
+ end
+ end
+
+ context 'with object storage enabled' do
+ let(:package_file) do
+ create(
+ :package_file,
+ file_name: 'file_name.txt',
+ file: CarrierWaveStringFile.new_file(
+ file_content: 'content',
+ filename: 'file_name.txt',
+ content_type: 'text/plain'
+ ),
+ file_store: ::Packages::PackageFileUploader::Store::REMOTE
+ )
+ end
+
+ before do
+ stub_package_file_object_storage(enabled: true)
+ end
+
+ it_behaves_like 'executing the default callback'
+
+ context 'with new_file_path set' do
+ before do
+ package_file.new_file_path = 'test'
+ end
+
+ it 'executes the move_in_object_storage callback' do
+ expect(package_file).not_to receive(:remove_previously_stored_file)
+ expect(package_file).to receive(:move_in_object_storage).and_call_original
+ expect(package_file.file.file).to receive(:copy_to).and_call_original
+ expect(package_file.file.file).to receive(:delete).and_call_original
+
+ subject
+ end
+ end
+ end
+ end
end
diff --git a/spec/models/packages/package_spec.rb b/spec/models/packages/package_spec.rb
index 449e30f9fb7..4d4d4ad4fa9 100644
--- a/spec/models/packages/package_spec.rb
+++ b/spec/models/packages/package_spec.rb
@@ -3,6 +3,7 @@ require 'spec_helper'
RSpec.describe Packages::Package, type: :model do
include SortingHelper
+ using RSpec::Parameterized::TableSyntax
it_behaves_like 'having unique enum values'
@@ -418,7 +419,7 @@ RSpec.describe Packages::Package, type: :model do
end
end
- describe '#package_already_taken' do
+ describe '#npm_package_already_taken' do
context 'maven package' do
let!(:package) { create(:maven_package) }
@@ -428,6 +429,164 @@ RSpec.describe Packages::Package, type: :model do
expect(new_package).to be_valid
end
end
+
+ context 'npm package' do
+ let_it_be(:group) { create(:group) }
+ let_it_be(:project) { create(:project, namespace: group) }
+ let_it_be(:second_project) { create(:project, namespace: group)}
+
+ let(:package) { build(:npm_package, project: project, name: name) }
+
+ shared_examples 'validating the first package' do
+ it 'validates the first package' do
+ expect(package).to be_valid
+ end
+ end
+
+ shared_examples 'validating the second package' do
+ it 'validates the second package' do
+ package.save!
+
+ expect(second_package).to be_valid
+ end
+ end
+
+ shared_examples 'not validating the second package' do |field_with_error:|
+ it 'does not validate the second package' do
+ package.save!
+
+ expect(second_package).not_to be_valid
+ case field_with_error
+ when :base
+ expect(second_package.errors.messages[:base]).to eq ['Package already exists']
+ when :name
+ expect(second_package.errors.messages[:name]).to eq ['has already been taken']
+ else
+ raise ArgumentError, "field #{field_with_error} not expected"
+ end
+ end
+ end
+
+ context 'following the naming convention' do
+ let(:name) { "@#{group.path}/test" }
+
+ context 'with the second package in the project of the first package' do
+ let(:second_package) { build(:npm_package, project: project, name: second_package_name, version: second_package_version) }
+
+ context 'with no duplicated name' do
+ let(:second_package_name) { "@#{group.path}/test2" }
+ let(:second_package_version) { '5.0.0' }
+
+ it_behaves_like 'validating the first package'
+ it_behaves_like 'validating the second package'
+ end
+
+ context 'with duplicated name' do
+ let(:second_package_name) { package.name }
+ let(:second_package_version) { '5.0.0' }
+
+ it_behaves_like 'validating the first package'
+ it_behaves_like 'validating the second package'
+ end
+
+ context 'with duplicate name and duplicated version' do
+ let(:second_package_name) { package.name }
+ let(:second_package_version) { package.version }
+
+ it_behaves_like 'validating the first package'
+ it_behaves_like 'not validating the second package', field_with_error: :name
+ end
+ end
+
+ context 'with the second package in a different project than the first package' do
+ let(:second_package) { build(:npm_package, project: second_project, name: second_package_name, version: second_package_version) }
+
+ context 'with no duplicated name' do
+ let(:second_package_name) { "@#{group.path}/test2" }
+ let(:second_package_version) { '5.0.0' }
+
+ it_behaves_like 'validating the first package'
+ it_behaves_like 'validating the second package'
+ end
+
+ context 'with duplicated name' do
+ let(:second_package_name) { package.name }
+ let(:second_package_version) { '5.0.0' }
+
+ it_behaves_like 'validating the first package'
+ it_behaves_like 'validating the second package'
+ end
+
+ context 'with duplicate name and duplicated version' do
+ let(:second_package_name) { package.name }
+ let(:second_package_version) { package.version }
+
+ it_behaves_like 'validating the first package'
+ it_behaves_like 'not validating the second package', field_with_error: :base
+ end
+ end
+ end
+
+ context 'not following the naming convention' do
+ let(:name) { '@foobar/test' }
+
+ context 'with the second package in the project of the first package' do
+ let(:second_package) { build(:npm_package, project: project, name: second_package_name, version: second_package_version) }
+
+ context 'with no duplicated name' do
+ let(:second_package_name) { "@foobar/test2" }
+ let(:second_package_version) { '5.0.0' }
+
+ it_behaves_like 'validating the first package'
+ it_behaves_like 'validating the second package'
+ end
+
+ context 'with duplicated name' do
+ let(:second_package_name) { package.name }
+ let(:second_package_version) { '5.0.0' }
+
+ it_behaves_like 'validating the first package'
+ it_behaves_like 'validating the second package'
+ end
+
+ context 'with duplicate name and duplicated version' do
+ let(:second_package_name) { package.name }
+ let(:second_package_version) { package.version }
+
+ it_behaves_like 'validating the first package'
+ it_behaves_like 'not validating the second package', field_with_error: :name
+ end
+ end
+
+ context 'with the second package in a different project than the first package' do
+ let(:second_package) { build(:npm_package, project: second_project, name: second_package_name, version: second_package_version) }
+
+ context 'with no duplicated name' do
+ let(:second_package_name) { "@foobar/test2" }
+ let(:second_package_version) { '5.0.0' }
+
+ it_behaves_like 'validating the first package'
+ it_behaves_like 'validating the second package'
+ end
+
+ context 'with duplicated name' do
+ let(:second_package_name) { package.name }
+ let(:second_package_version) { '5.0.0' }
+
+ it_behaves_like 'validating the first package'
+ it_behaves_like 'validating the second package'
+ end
+
+ context 'with duplicate name and duplicated version' do
+ let(:second_package_name) { package.name }
+ let(:second_package_version) { package.version }
+
+ it_behaves_like 'validating the first package'
+ it_behaves_like 'validating the second package'
+ end
+ end
+ end
+ end
end
context "recipe uniqueness for conan packages" do