Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'spec/models/packages')
-rw-r--r--spec/models/packages/dependency_spec.rb5
-rw-r--r--spec/models/packages/go/module_version_spec.rb11
-rw-r--r--spec/models/packages/helm/file_metadatum_spec.rb60
-rw-r--r--spec/models/packages/package_file_spec.rb47
-rw-r--r--spec/models/packages/package_spec.rb116
-rw-r--r--spec/models/packages/tag_spec.rb1
6 files changed, 196 insertions, 44 deletions
diff --git a/spec/models/packages/dependency_spec.rb b/spec/models/packages/dependency_spec.rb
index 4437cad46cd..1575dec98c9 100644
--- a/spec/models/packages/dependency_spec.rb
+++ b/spec/models/packages/dependency_spec.rb
@@ -18,6 +18,7 @@ RSpec.describe Packages::Dependency, type: :model do
let_it_be(:package_dependency1) { create(:packages_dependency, name: 'foo', version_pattern: '~1.0.0') }
let_it_be(:package_dependency2) { create(:packages_dependency, name: 'bar', version_pattern: '~2.5.0') }
let_it_be(:expected_ids) { [package_dependency1.id, package_dependency2.id] }
+
let(:names_and_version_patterns) { build_names_and_version_patterns(package_dependency1, package_dependency2) }
let(:chunk_size) { 50 }
let(:rows_limit) { 50 }
@@ -40,6 +41,7 @@ RSpec.describe Packages::Dependency, type: :model do
context 'with a name bigger than column size' do
let_it_be(:big_name) { 'a' * (Packages::Dependency::MAX_STRING_LENGTH + 1) }
+
let(:names_and_version_patterns) { build_names_and_version_patterns(package_dependency1, package_dependency2).merge(big_name => '~1.0.0') }
it { is_expected.to match_array(expected_ids) }
@@ -47,6 +49,7 @@ RSpec.describe Packages::Dependency, type: :model do
context 'with a version pattern bigger than column size' do
let_it_be(:big_version_pattern) { 'a' * (Packages::Dependency::MAX_STRING_LENGTH + 1) }
+
let(:names_and_version_patterns) { build_names_and_version_patterns(package_dependency1, package_dependency2).merge('test' => big_version_pattern) }
it { is_expected.to match_array(expected_ids) }
@@ -65,6 +68,7 @@ RSpec.describe Packages::Dependency, type: :model do
let_it_be(:package_dependency5) { create(:packages_dependency, name: 'foo5', version_pattern: '~1.5.5') }
let_it_be(:package_dependency6) { create(:packages_dependency, name: 'foo6', version_pattern: '~1.5.6') }
let_it_be(:package_dependency7) { create(:packages_dependency, name: 'foo7', version_pattern: '~1.5.7') }
+
let(:expected_ids) { [package_dependency1.id, package_dependency2.id, package_dependency3.id, package_dependency4.id, package_dependency5.id, package_dependency6.id, package_dependency7.id] }
let(:names_and_version_patterns) { build_names_and_version_patterns(package_dependency1, package_dependency2, package_dependency3, package_dependency4, package_dependency5, package_dependency6, package_dependency7) }
@@ -86,6 +90,7 @@ RSpec.describe Packages::Dependency, type: :model do
let_it_be(:package_dependency1) { create(:packages_dependency, name: 'foo', version_pattern: '~1.0.0') }
let_it_be(:package_dependency2) { create(:packages_dependency, name: 'bar', version_pattern: '~2.5.0') }
let_it_be(:expected_array) { [package_dependency1, package_dependency2] }
+
let(:names_and_version_patterns) { build_names_and_version_patterns(package_dependency1, package_dependency2) }
subject { Packages::Dependency.for_package_names_and_version_patterns(names_and_version_patterns) }
diff --git a/spec/models/packages/go/module_version_spec.rb b/spec/models/packages/go/module_version_spec.rb
index 7fa416d8537..cace2160878 100644
--- a/spec/models/packages/go/module_version_spec.rb
+++ b/spec/models/packages/go/module_version_spec.rb
@@ -32,16 +32,19 @@ RSpec.describe Packages::Go::ModuleVersion, type: :model do
describe '#name' do
context 'with ref and name specified' do
let_it_be(:version) { create :go_module_version, mod: mod, name: 'foobar', commit: project.repository.head_commit, ref: project.repository.find_tag('v1.0.0') }
+
it('returns that name') { expect(version.name).to eq('foobar') }
end
context 'with ref specified and name unspecified' do
let_it_be(:version) { create :go_module_version, mod: mod, commit: project.repository.head_commit, ref: project.repository.find_tag('v1.0.0') }
+
it('returns the name of the ref') { expect(version.name).to eq('v1.0.0') }
end
context 'with ref and name unspecified' do
let_it_be(:version) { create :go_module_version, mod: mod, commit: project.repository.head_commit }
+
it('returns nil') { expect(version.name).to eq(nil) }
end
end
@@ -49,11 +52,13 @@ RSpec.describe Packages::Go::ModuleVersion, type: :model do
describe '#gomod' do
context 'with go.mod missing' do
let_it_be(:version) { create :go_module_version, :tagged, mod: mod, name: 'v1.0.0' }
+
it('returns nil') { expect(version.gomod).to eq(nil) }
end
context 'with go.mod present' do
let_it_be(:version) { create :go_module_version, :tagged, mod: mod, name: 'v1.0.1' }
+
it('returns the contents of go.mod') { expect(version.gomod).to eq("module #{mod.name}\n") }
end
end
@@ -62,6 +67,7 @@ RSpec.describe Packages::Go::ModuleVersion, type: :model do
context 'with a root module' do
context 'with an empty module path' do
let_it_be(:version) { create :go_module_version, :tagged, mod: mod, name: 'v1.0.2' }
+
it_behaves_like '#files', 'all the files', 'README.md', 'go.mod', 'a.go', 'pkg/b.go'
end
end
@@ -69,12 +75,14 @@ RSpec.describe Packages::Go::ModuleVersion, type: :model do
context 'with a root module and a submodule' do
context 'with an empty module path' do
let_it_be(:version) { create :go_module_version, :tagged, mod: mod, name: 'v1.0.3' }
+
it_behaves_like '#files', 'files excluding the submodule', 'README.md', 'go.mod', 'a.go', 'pkg/b.go'
end
context 'with the submodule\'s path' do
let_it_be(:mod) { create :go_module, project: project, path: 'mod' }
let_it_be(:version) { create :go_module_version, :tagged, mod: mod, name: 'v1.0.3' }
+
it_behaves_like '#files', 'the submodule\'s files', 'mod/go.mod', 'mod/a.go'
end
end
@@ -84,6 +92,7 @@ RSpec.describe Packages::Go::ModuleVersion, type: :model do
context 'with a root module' do
context 'with an empty module path' do
let_it_be(:version) { create :go_module_version, :tagged, mod: mod, name: 'v1.0.2' }
+
it_behaves_like '#archive', 'all the files', 'README.md', 'go.mod', 'a.go', 'pkg/b.go'
end
end
@@ -91,12 +100,14 @@ RSpec.describe Packages::Go::ModuleVersion, type: :model do
context 'with a root module and a submodule' do
context 'with an empty module path' do
let_it_be(:version) { create :go_module_version, :tagged, mod: mod, name: 'v1.0.3' }
+
it_behaves_like '#archive', 'files excluding the submodule', 'README.md', 'go.mod', 'a.go', 'pkg/b.go'
end
context 'with the submodule\'s path' do
let_it_be(:mod) { create :go_module, project: project, path: 'mod' }
let_it_be(:version) { create :go_module_version, :tagged, mod: mod, name: 'v1.0.3' }
+
it_behaves_like '#archive', 'the submodule\'s files', 'go.mod', 'a.go'
end
end
diff --git a/spec/models/packages/helm/file_metadatum_spec.rb b/spec/models/packages/helm/file_metadatum_spec.rb
new file mode 100644
index 00000000000..c7c17b157e4
--- /dev/null
+++ b/spec/models/packages/helm/file_metadatum_spec.rb
@@ -0,0 +1,60 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Packages::Helm::FileMetadatum, type: :model do
+ describe 'relationships' do
+ it { is_expected.to belong_to(:package_file) }
+ end
+
+ describe 'validations' do
+ describe '#package_file' do
+ it { is_expected.to validate_presence_of(:package_file) }
+ end
+
+ describe '#valid_helm_package_type' do
+ let_it_be_with_reload(:helm_package_file) { create(:helm_package_file) }
+
+ let(:helm_file_metadatum) { helm_package_file.helm_file_metadatum }
+
+ before do
+ helm_package_file.package.package_type = :pypi
+ end
+
+ it 'validates package of type helm' do
+ expect(helm_file_metadatum).not_to be_valid
+ expect(helm_file_metadatum.errors.to_a).to contain_exactly('Package file Package type must be Helm')
+ end
+ end
+
+ describe '#channel' do
+ it 'validates #channel', :aggregate_failures do
+ is_expected.to validate_presence_of(:channel)
+
+ is_expected.to allow_value('a' * 63).for(:channel)
+ is_expected.not_to allow_value('a' * 64).for(:channel)
+
+ is_expected.to allow_value('release').for(:channel)
+ is_expected.to allow_value('my-repo').for(:channel)
+ is_expected.to allow_value('my-repo42').for(:channel)
+
+ # Do not allow empty
+ is_expected.not_to allow_value('').for(:channel)
+
+ # Do not allow Unicode
+ is_expected.not_to allow_value('hé').for(:channel)
+ end
+ end
+
+ describe '#metadata' do
+ it 'validates #metadata', :aggregate_failures do
+ is_expected.not_to validate_presence_of(:metadata)
+ is_expected.to allow_value({ 'name': 'foo', 'version': 'v1.0', 'apiVersion': 'v2' }).for(:metadata)
+ is_expected.not_to allow_value({}).for(:metadata)
+ is_expected.not_to allow_value({ 'version': 'v1.0', 'apiVersion': 'v2' }).for(:metadata)
+ is_expected.not_to allow_value({ 'name': 'foo', 'apiVersion': 'v2' }).for(:metadata)
+ is_expected.not_to allow_value({ 'name': 'foo', 'version': 'v1.0' }).for(:metadata)
+ end
+ end
+ end
+end
diff --git a/spec/models/packages/package_file_spec.rb b/spec/models/packages/package_file_spec.rb
index 9cf998a0639..f8ddd59ddc8 100644
--- a/spec/models/packages/package_file_spec.rb
+++ b/spec/models/packages/package_file_spec.rb
@@ -2,12 +2,18 @@
require 'spec_helper'
RSpec.describe Packages::PackageFile, type: :model do
+ let_it_be(:project) { create(:project) }
+ let_it_be(:package_file1) { create(:package_file, :xml, file_name: 'FooBar') }
+ let_it_be(:package_file2) { create(:package_file, :xml, file_name: 'ThisIsATest') }
+ let_it_be(:debian_package) { create(:debian_package, project: project) }
+
describe 'relationships' do
it { is_expected.to belong_to(:package) }
it { is_expected.to have_one(:conan_file_metadatum) }
it { is_expected.to have_many(:package_file_build_infos).inverse_of(:package_file) }
it { is_expected.to have_many(:pipelines).through(:package_file_build_infos) }
it { is_expected.to have_one(:debian_file_metadatum).inverse_of(:package_file).class_name('Packages::Debian::FileMetadatum') }
+ it { is_expected.to have_one(:helm_file_metadatum).inverse_of(:package_file).class_name('Packages::Helm::FileMetadatum') }
end
describe 'validations' do
@@ -15,9 +21,6 @@ RSpec.describe Packages::PackageFile, type: :model do
end
context 'with package filenames' do
- let_it_be(:package_file1) { create(:package_file, :xml, file_name: 'FooBar') }
- let_it_be(:package_file2) { create(:package_file, :xml, file_name: 'ThisIsATest') }
-
describe '.with_file_name' do
let(:filename) { 'FooBar' }
@@ -51,6 +54,13 @@ RSpec.describe Packages::PackageFile, type: :model do
end
end
+ describe '.for_package_ids' do
+ it 'returns matching packages' do
+ expect(described_class.for_package_ids([package_file1.package.id, package_file2.package.id]))
+ .to contain_exactly(package_file1, package_file2)
+ end
+ end
+
describe '.with_conan_package_reference' do
let_it_be(:non_matching_package_file) { create(:package_file, :nuget) }
let_it_be(:metadatum) { create(:conan_file_metadatum, :package_file) }
@@ -63,7 +73,6 @@ RSpec.describe Packages::PackageFile, type: :model do
end
describe '.for_rubygem_with_file_name' do
- let_it_be(:project) { create(:project) }
let_it_be(:non_ruby_package) { create(:nuget_package, project: project, package_type: :nuget) }
let_it_be(:ruby_package) { create(:rubygems_package, project: project, package_type: :rubygems) }
let_it_be(:file_name) { 'other.gem' }
@@ -77,6 +86,36 @@ RSpec.describe Packages::PackageFile, type: :model do
end
end
+ context 'Debian scopes' do
+ let_it_be(:debian_changes) { debian_package.package_files.last }
+ let_it_be(:debian_deb) { create(:debian_package_file, package: debian_package)}
+ let_it_be(:debian_udeb) { create(:debian_package_file, :udeb, package: debian_package)}
+
+ let_it_be(:debian_contrib) do
+ create(:debian_package_file, package: debian_package).tap do |pf|
+ pf.debian_file_metadatum.update!(component: 'contrib')
+ end
+ end
+
+ let_it_be(:debian_mipsel) do
+ create(:debian_package_file, package: debian_package).tap do |pf|
+ pf.debian_file_metadatum.update!(architecture: 'mipsel')
+ end
+ end
+
+ describe '#with_debian_file_type' do
+ it { expect(described_class.with_debian_file_type(:changes)).to contain_exactly(debian_changes) }
+ end
+
+ describe '#with_debian_component_name' do
+ it { expect(described_class.with_debian_component_name('contrib')).to contain_exactly(debian_contrib) }
+ end
+
+ describe '#with_debian_architecture_name' do
+ it { expect(described_class.with_debian_architecture_name('mipsel')).to contain_exactly(debian_mipsel) }
+ end
+ end
+
describe '#update_file_store callback' do
let_it_be(:package_file) { build(:package_file, :nuget, size: nil) }
diff --git a/spec/models/packages/package_spec.rb b/spec/models/packages/package_spec.rb
index cf52749a186..52ef61e3d44 100644
--- a/spec/models/packages/package_spec.rb
+++ b/spec/models/packages/package_spec.rb
@@ -47,6 +47,7 @@ RSpec.describe Packages::Package, type: :model do
describe '.sort_by_attribute' do
let_it_be(:group) { create(:group, :public) }
let_it_be(:project) { create(:project, :public, namespace: group, name: 'project A') }
+
let!(:package1) { create(:npm_package, project: project, version: '3.1.0', name: "@#{project.root_namespace.path}/foo1") }
let!(:package2) { create(:nuget_package, project: project, version: '2.0.4') }
let(:package3) { create(:maven_package, project: project, version: '1.1.1', name: 'zzz') }
@@ -113,18 +114,6 @@ RSpec.describe Packages::Package, type: :model do
expect(subject).to match_array([package1, package2])
end
-
- context 'with maven_packages_group_level_improvements disabled' do
- before do
- stub_feature_flags(maven_packages_group_level_improvements: false)
- end
-
- it 'returns package1 and package2' do
- expect(projects).to receive(:any?).and_call_original
-
- expect(subject).to match_array([package1, package2])
- end
- end
end
describe 'validations' do
@@ -184,6 +173,15 @@ RSpec.describe Packages::Package, type: :model do
it { is_expected.not_to allow_value('!!().for(:name)().for(:name)').for(:name) }
end
+ context 'helm package' do
+ subject { build(:helm_package) }
+
+ it { is_expected.to allow_value('prometheus').for(:name) }
+ it { is_expected.to allow_value('rook-ceph').for(:name) }
+ it { is_expected.not_to allow_value('a+b').for(:name) }
+ it { is_expected.not_to allow_value('Hé').for(:name) }
+ end
+
context 'nuget package' do
subject { build_stubbed(:nuget_package) }
@@ -210,6 +208,19 @@ RSpec.describe Packages::Package, type: :model do
it { is_expected.not_to allow_value("@scope%2e%2e%fpackage").for(:name) }
it { is_expected.not_to allow_value("@scope/sub/package").for(:name) }
end
+
+ context 'terraform module package' do
+ subject { build_stubbed(:terraform_module_package) }
+
+ it { is_expected.to allow_value('my-module/my-system').for(:name) }
+ it { is_expected.to allow_value('my/module').for(:name) }
+ it { is_expected.not_to allow_value('my-module').for(:name) }
+ it { is_expected.not_to allow_value('My-Module').for(:name) }
+ it { is_expected.not_to allow_value('my_module').for(:name) }
+ it { is_expected.not_to allow_value('my.module').for(:name) }
+ it { is_expected.not_to allow_value('../../../my-module').for(:name) }
+ it { is_expected.not_to allow_value('%2e%2e%2fmy-module').for(:name) }
+ end
end
describe '#version' do
@@ -387,7 +398,17 @@ RSpec.describe Packages::Package, type: :model do
it { is_expected.not_to allow_value(nil).for(:version) }
end
+ context 'helm package' do
+ subject { build_stubbed(:helm_package) }
+
+ it { is_expected.not_to allow_value(nil).for(:version) }
+ it { is_expected.not_to allow_value('').for(:version) }
+ it { is_expected.to allow_value('v1.2.3').for(:version) }
+ it { is_expected.not_to allow_value('1.2.3').for(:version) }
+ end
+
it_behaves_like 'validating version to be SemVer compliant for', :npm_package
+ it_behaves_like 'validating version to be SemVer compliant for', :terraform_module_package
context 'nuget package' do
it_behaves_like 'validating version to be SemVer compliant for', :nuget_package
@@ -485,6 +506,26 @@ RSpec.describe Packages::Package, type: :model do
end
end
+ describe '.with_package_type' do
+ let!(:package1) { create(:terraform_module_package) }
+ let!(:package2) { create(:npm_package) }
+ let(:package_type) { :terraform_module }
+
+ subject { described_class.with_package_type(package_type) }
+
+ it { is_expected.to eq([package1]) }
+ end
+
+ describe '.without_package_type' do
+ let!(:package1) { create(:npm_package) }
+ let!(:package2) { create(:terraform_module_package) }
+ let(:package_type) { :terraform_module }
+
+ subject { described_class.without_package_type(package_type) }
+
+ it { is_expected.to eq([package1]) }
+ end
+
context 'version scopes' do
let!(:package1) { create(:npm_package, version: '1.0.0') }
let!(:package2) { create(:npm_package, version: '1.0.1') }
@@ -565,22 +606,6 @@ RSpec.describe Packages::Package, type: :model do
end
end
- describe '.processed' do
- let!(:package1) { create(:nuget_package) }
- let!(:package2) { create(:npm_package) }
- let!(:package3) { create(:nuget_package) }
-
- subject { described_class.processed }
-
- it { is_expected.to match_array([package1, package2, package3]) }
-
- context 'with temporary packages' do
- let!(:package1) { create(:nuget_package, name: Packages::Nuget::TEMPORARY_PACKAGE_NAME) }
-
- it { is_expected.to match_array([package2, package3]) }
- end
- end
-
describe '.limit_recent' do
let!(:package1) { create(:nuget_package) }
let!(:package2) { create(:nuget_package) }
@@ -653,27 +678,37 @@ RSpec.describe Packages::Package, type: :model do
it { is_expected.to match_array([pypi_package]) }
end
- describe '.displayable' do
+ context 'status scopes' do
let_it_be(:hidden_package) { create(:maven_package, :hidden) }
let_it_be(:processing_package) { create(:maven_package, :processing) }
let_it_be(:error_package) { create(:maven_package, :error) }
- subject { described_class.displayable }
+ describe '.displayable' do
+ subject { described_class.displayable }
- it 'does not include non-displayable packages', :aggregate_failures do
- is_expected.to include(error_package)
- is_expected.not_to include(hidden_package)
- is_expected.not_to include(processing_package)
+ it 'does not include non-displayable packages', :aggregate_failures do
+ is_expected.to include(error_package)
+ is_expected.not_to include(hidden_package)
+ is_expected.not_to include(processing_package)
+ end
end
- end
- describe '.with_status' do
- let_it_be(:hidden_package) { create(:maven_package, :hidden) }
+ describe '.installable' do
+ subject { described_class.installable }
- subject { described_class.with_status(:hidden) }
+ it 'does not include non-displayable packages', :aggregate_failures do
+ is_expected.not_to include(error_package)
+ is_expected.not_to include(hidden_package)
+ is_expected.not_to include(processing_package)
+ end
+ end
+
+ describe '.with_status' do
+ subject { described_class.with_status(:hidden) }
- it 'returns packages with specified status' do
- is_expected.to match_array([hidden_package])
+ it 'returns packages with specified status' do
+ is_expected.to match_array([hidden_package])
+ end
end
end
end
@@ -896,6 +931,7 @@ RSpec.describe Packages::Package, type: :model do
let_it_be(:package_name) { 'composer-package-name' }
let_it_be(:json) { { 'name' => package_name } }
let_it_be(:project) { create(:project, :custom_repo, files: { 'composer.json' => json.to_json } ) }
+
let!(:package) { create(:composer_package, :with_metadatum, project: project, name: package_name, version: '1.0.0', json: json) }
before do
diff --git a/spec/models/packages/tag_spec.rb b/spec/models/packages/tag_spec.rb
index 18ec99c3d51..842ba7ad518 100644
--- a/spec/models/packages/tag_spec.rb
+++ b/spec/models/packages/tag_spec.rb
@@ -41,6 +41,7 @@ RSpec.describe Packages::Tag, type: :model do
let_it_be(:tag1) { create(:packages_tag, package: package, name: 'tag1') }
let_it_be(:tag2) { create(:packages_tag, package: package, name: 'tag2') }
let_it_be(:tag3) { create(:packages_tag, package: package, name: 'tag3') }
+
let(:name) { 'tag1' }
subject { described_class.with_name(name) }