gitlab-ce/spec/models/namespace/package_setting_spec.rb

167 lines
6.1 KiB
Ruby

# frozen_string_literal: true
require 'spec_helper'
RSpec.describe Namespace::PackageSetting, feature_category: :package_registry do
describe 'relationships' do
it { is_expected.to belong_to(:namespace) }
end
describe 'validations' do
it { is_expected.to validate_presence_of(:namespace) }
describe '#maven_duplicates_allowed' do
it { is_expected.to validate_length_of(:maven_duplicate_exception_regex).is_at_most(255) }
end
it { is_expected.not_to allow_value(nil).for(:nuget_symbol_server_enabled) }
it { is_expected.to validate_length_of(:generic_duplicate_exception_regex).is_at_most(255) }
it { is_expected.to validate_length_of(:nuget_duplicate_exception_regex).is_at_most(255) }
it { is_expected.to allow_value(true, false).for(:terraform_module_duplicates_allowed) }
it { is_expected.not_to allow_value(nil).for(:terraform_module_duplicates_allowed) }
it { is_expected.to validate_length_of(:terraform_module_duplicate_exception_regex).is_at_most(255) }
describe 'regex values' do
let_it_be(:package_settings) { create(:namespace_package_setting) }
subject { package_settings }
valid_regexps = %w[SNAPSHOT .* v.+ v10.1.* (?:v.+|SNAPSHOT|TEMP)]
invalid_regexps = ['[', '(?:v.+|SNAPSHOT|TEMP']
%i[maven_duplicate_exception_regex generic_duplicate_exception_regex nuget_duplicate_exception_regex].each do |attribute|
valid_regexps.each do |valid_regexp|
it { is_expected.to allow_value(valid_regexp).for(attribute) }
end
invalid_regexps.each do |invalid_regexp|
it { is_expected.not_to allow_value(invalid_regexp).for(attribute) }
end
end
end
end
describe 'scopes' do
describe '.namespace_id_in' do
let_it_be(:package_settings) { create(:namespace_package_setting) }
let_it_be(:other_package_settings) { create(:namespace_package_setting) }
subject { described_class.namespace_id_in([package_settings.namespace_id]) }
it { is_expected.to eq([package_settings]) }
end
describe '.with_terraform_module_duplicates_allowed_or_exception_regex' do
let_it_be(:package_settings) { create(:namespace_package_setting) }
subject { described_class.with_terraform_module_duplicates_allowed_or_exception_regex }
context 'when terraform_module_duplicates_allowed is true' do
before do
package_settings.update_column(:terraform_module_duplicates_allowed, true)
end
it { is_expected.to eq([package_settings]) }
end
context 'when terraform_module_duplicate_exception_regex is present' do
before do
package_settings.update_column(:terraform_module_duplicate_exception_regex, 'foo')
end
it { is_expected.to eq([package_settings]) }
end
context 'when terraform_module_duplicates_allowed is false and terraform_module_duplicate_exception_regex is empty' do
before do
package_settings.update_columns(
terraform_module_duplicates_allowed: false,
terraform_module_duplicate_exception_regex: ''
)
end
it { is_expected.to be_empty }
end
end
end
shared_examples 'package types without package_settings' do
package_types = Packages::Package.package_types.keys - Namespace::PackageSetting::PACKAGES_WITH_SETTINGS
package_types.each do |package_type|
context "with package_type:#{package_type}" do
let_it_be(:package) { create("#{package_type}_package", package_name_and_version(package_type)) }
let_it_be(:package_settings) { package.project.namespace.package_settings }
it 'raises an error' do
expect { subject }.to raise_error(Namespace::PackageSetting::PackageSettingNotImplemented)
end
end
end
end
describe '.duplicates_allowed?' do
using RSpec::Parameterized::TableSyntax
subject { described_class.duplicates_allowed?(package) }
context 'package types with package_settings' do
Namespace::PackageSetting::PACKAGES_WITH_SETTINGS.each do |package_type|
context "with package_type: #{package_type}" do
let_it_be(:package) { create("#{package_type}_package", package_name_and_version(package_type)) }
let(:package_name) { package.name }
let(:package_version) { package.version }
let_it_be(:package_type) { package.package_type }
let_it_be(:package_setting) { package.project.namespace.package_settings }
where(:duplicates_allowed, :duplicate_exception_regex, :result) do
true | ref(:package_name) | false
true | ref(:package_version) | false
true | 'asdf' | true
true | '.*' | false
true | '.*be.*' | false
false | ref(:package_name) | true
false | ref(:package_version) | true
false | 'asdf' | false
false | '.*' | true
false | '.*be.*' | true
end
with_them do
before do
package_setting.update!(
"#{package_type}_duplicates_allowed" => duplicates_allowed,
"#{package_type}_duplicate_exception_regex" => duplicate_exception_regex
)
end
it { is_expected.to be(result) }
end
end
end
end
it_behaves_like 'package types without package_settings'
end
describe 'package forwarding attributes' do
%i[maven_package_requests_forwarding pypi_package_requests_forwarding npm_package_requests_forwarding]
.each do |attribute|
it_behaves_like 'a cascading namespace setting boolean attribute',
settings_attribute_name: attribute,
settings_association: :package_settings
end
end
def package_name_and_version(package_type)
package_name = 'foo'
version = '1.0.0-beta'
package_name = 'foo/bar' if package_type == 'terraform_module'
version = 'v1.0.1' if package_type == 'golang'
{ name: package_name, version: version }
end
end