diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2021-05-19 18:44:42 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2021-05-19 18:44:42 +0300 |
commit | 4555e1b21c365ed8303ffb7a3325d773c9b8bf31 (patch) | |
tree | 5423a1c7516cffe36384133ade12572cf709398d /spec/models/packages | |
parent | e570267f2f6b326480d284e0164a6464ba4081bc (diff) |
Add latest changes from gitlab-org/gitlab@13-12-stable-eev13.12.0-rc42
Diffstat (limited to 'spec/models/packages')
-rw-r--r-- | spec/models/packages/dependency_spec.rb | 5 | ||||
-rw-r--r-- | spec/models/packages/go/module_version_spec.rb | 11 | ||||
-rw-r--r-- | spec/models/packages/helm/file_metadatum_spec.rb | 60 | ||||
-rw-r--r-- | spec/models/packages/package_file_spec.rb | 47 | ||||
-rw-r--r-- | spec/models/packages/package_spec.rb | 116 | ||||
-rw-r--r-- | spec/models/packages/tag_spec.rb | 1 |
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) } |