2019-08-22 06:57:44 -04:00
|
|
|
# frozen_string_literal: true
|
|
|
|
|
2017-03-20 17:05:53 -04:00
|
|
|
require 'spec_helper'
|
|
|
|
|
2020-06-24 14:09:03 -04:00
|
|
|
RSpec.describe Gitlab::VisibilityLevel do
|
2017-03-20 17:05:53 -04:00
|
|
|
describe '.level_value' do
|
2022-07-28 14:09:03 -04:00
|
|
|
where(:string_value, :integer_value) do
|
|
|
|
[
|
|
|
|
['private', described_class::PRIVATE],
|
|
|
|
['internal', described_class::INTERNAL],
|
|
|
|
['public', described_class::PUBLIC]
|
|
|
|
]
|
2017-03-20 17:05:53 -04:00
|
|
|
end
|
|
|
|
|
2022-07-28 14:09:03 -04:00
|
|
|
with_them do
|
|
|
|
it "converts '#{params[:string_value]}' to integer value #{params[:integer_value]}" do
|
|
|
|
expect(described_class.level_value(string_value)).to eq(integer_value)
|
|
|
|
end
|
|
|
|
|
|
|
|
it "converts string integer '#{params[:integer_value]}' to integer value #{params[:integer_value]}" do
|
|
|
|
expect(described_class.level_value(integer_value.to_s)).to eq(integer_value)
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'defaults to PRIVATE when string integer value is not valid' do
|
|
|
|
expect(described_class.level_value(integer_value.to_s + 'r')).to eq(described_class::PRIVATE)
|
|
|
|
expect(described_class.level_value(integer_value.to_s + ' ')).to eq(described_class::PRIVATE)
|
|
|
|
expect(described_class.level_value('r' + integer_value.to_s)).to eq(described_class::PRIVATE)
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'defaults to PRIVATE when string value is not valid' do
|
|
|
|
expect(described_class.level_value(string_value.capitalize)).to eq(described_class::PRIVATE)
|
|
|
|
expect(described_class.level_value(string_value + ' ')).to eq(described_class::PRIVATE)
|
|
|
|
expect(described_class.level_value(string_value + 'r')).to eq(described_class::PRIVATE)
|
|
|
|
end
|
2017-03-20 17:05:53 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
it 'defaults to PRIVATE when string value is not valid' do
|
2022-07-28 14:09:03 -04:00
|
|
|
expect(described_class.level_value('invalid')).to eq(described_class::PRIVATE)
|
2017-03-20 17:05:53 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
it 'defaults to PRIVATE when integer value is not valid' do
|
2022-07-28 14:09:03 -04:00
|
|
|
expect(described_class.level_value(100)).to eq(described_class::PRIVATE)
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'when `fallback_value` is set to `nil`' do
|
|
|
|
it 'returns `nil` when string value is not valid' do
|
|
|
|
expect(described_class.level_value('invalid', fallback_value: nil)).to be_nil
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'returns `nil` when integer value is not valid' do
|
|
|
|
expect(described_class.level_value(100, fallback_value: nil)).to be_nil
|
|
|
|
end
|
2017-03-20 17:05:53 -04:00
|
|
|
end
|
|
|
|
end
|
2017-06-13 10:44:55 -04:00
|
|
|
|
|
|
|
describe '.levels_for_user' do
|
2020-12-17 13:10:14 -05:00
|
|
|
context 'when admin mode is enabled', :enable_admin_mode do
|
|
|
|
it 'returns all levels for an admin' do
|
|
|
|
user = build(:user, :admin)
|
2017-06-13 10:44:55 -04:00
|
|
|
|
2020-12-17 13:10:14 -05:00
|
|
|
expect(described_class.levels_for_user(user))
|
|
|
|
.to eq([Gitlab::VisibilityLevel::PRIVATE,
|
|
|
|
Gitlab::VisibilityLevel::INTERNAL,
|
|
|
|
Gitlab::VisibilityLevel::PUBLIC])
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'when admin mode is disabled' do
|
|
|
|
it 'returns INTERNAL and PUBLIC for an admin' do
|
|
|
|
user = build(:user, :admin)
|
|
|
|
|
|
|
|
expect(described_class.levels_for_user(user))
|
|
|
|
.to eq([Gitlab::VisibilityLevel::INTERNAL,
|
|
|
|
Gitlab::VisibilityLevel::PUBLIC])
|
|
|
|
end
|
2017-06-13 10:44:55 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
it 'returns INTERNAL and PUBLIC for internal users' do
|
2017-06-22 02:35:49 -04:00
|
|
|
user = build(:user)
|
2017-06-13 10:44:55 -04:00
|
|
|
|
2017-06-21 09:48:12 -04:00
|
|
|
expect(described_class.levels_for_user(user))
|
|
|
|
.to eq([Gitlab::VisibilityLevel::INTERNAL,
|
|
|
|
Gitlab::VisibilityLevel::PUBLIC])
|
2017-06-13 10:44:55 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
it 'returns PUBLIC for external users' do
|
2017-06-22 02:35:49 -04:00
|
|
|
user = build(:user, :external)
|
2017-06-13 10:44:55 -04:00
|
|
|
|
2017-06-21 09:48:12 -04:00
|
|
|
expect(described_class.levels_for_user(user))
|
|
|
|
.to eq([Gitlab::VisibilityLevel::PUBLIC])
|
2017-06-13 10:44:55 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
it 'returns PUBLIC when no user is given' do
|
2017-06-21 09:48:12 -04:00
|
|
|
expect(described_class.levels_for_user)
|
|
|
|
.to eq([Gitlab::VisibilityLevel::PUBLIC])
|
2017-06-13 10:44:55 -04:00
|
|
|
end
|
|
|
|
end
|
2017-12-20 10:19:54 -05:00
|
|
|
|
|
|
|
describe '.allowed_levels' do
|
|
|
|
it 'only includes the levels that arent restricted' do
|
|
|
|
stub_application_setting(restricted_visibility_levels: [Gitlab::VisibilityLevel::INTERNAL])
|
|
|
|
|
|
|
|
expect(described_class.allowed_levels)
|
|
|
|
.to contain_exactly(described_class::PRIVATE, described_class::PUBLIC)
|
|
|
|
end
|
2018-02-02 05:23:05 -05:00
|
|
|
|
|
|
|
it 'returns all levels when no visibility level was set' do
|
|
|
|
allow(described_class)
|
|
|
|
.to receive_message_chain('current_application_settings.restricted_visibility_levels')
|
|
|
|
.and_return(nil)
|
|
|
|
|
|
|
|
expect(described_class.allowed_levels)
|
|
|
|
.to contain_exactly(described_class::PRIVATE, described_class::INTERNAL, described_class::PUBLIC)
|
|
|
|
end
|
2017-12-20 10:19:54 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
describe '.closest_allowed_level' do
|
|
|
|
it 'picks INTERNAL instead of PUBLIC if public is restricted' do
|
|
|
|
stub_application_setting(restricted_visibility_levels: [Gitlab::VisibilityLevel::PUBLIC])
|
|
|
|
|
|
|
|
expect(described_class.closest_allowed_level(described_class::PUBLIC))
|
|
|
|
.to eq(described_class::INTERNAL)
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'picks PRIVATE if nothing is available' do
|
|
|
|
stub_application_setting(restricted_visibility_levels: [Gitlab::VisibilityLevel::PUBLIC,
|
|
|
|
Gitlab::VisibilityLevel::INTERNAL,
|
|
|
|
Gitlab::VisibilityLevel::PRIVATE])
|
|
|
|
|
|
|
|
expect(described_class.closest_allowed_level(described_class::PUBLIC))
|
|
|
|
.to eq(described_class::PRIVATE)
|
|
|
|
end
|
|
|
|
end
|
2019-04-12 01:00:50 -04:00
|
|
|
|
|
|
|
describe '.valid_level?' do
|
|
|
|
it 'returns true when visibility is valid' do
|
|
|
|
expect(described_class.valid_level?(described_class::PRIVATE)).to be_truthy
|
|
|
|
expect(described_class.valid_level?(described_class::INTERNAL)).to be_truthy
|
|
|
|
expect(described_class.valid_level?(described_class::PUBLIC)).to be_truthy
|
|
|
|
end
|
|
|
|
end
|
2019-11-28 10:06:57 -05:00
|
|
|
|
2020-04-27 14:09:41 -04:00
|
|
|
describe '.restricted_level?, .non_restricted_level?, and .public_level_restricted?' do
|
|
|
|
using RSpec::Parameterized::TableSyntax
|
|
|
|
|
|
|
|
where(:visibility_levels, :expected_status) do
|
|
|
|
nil | false
|
|
|
|
[Gitlab::VisibilityLevel::PRIVATE] | false
|
|
|
|
[Gitlab::VisibilityLevel::PRIVATE, Gitlab::VisibilityLevel::INTERNAL] | false
|
|
|
|
[Gitlab::VisibilityLevel::PUBLIC] | true
|
|
|
|
[Gitlab::VisibilityLevel::PUBLIC, Gitlab::VisibilityLevel::INTERNAL] | true
|
|
|
|
end
|
|
|
|
|
|
|
|
with_them do
|
|
|
|
before do
|
|
|
|
stub_application_setting(restricted_visibility_levels: visibility_levels)
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'returns the expected status' do
|
|
|
|
expect(described_class.restricted_level?(Gitlab::VisibilityLevel::PUBLIC)).to eq(expected_status)
|
|
|
|
expect(described_class.non_restricted_level?(Gitlab::VisibilityLevel::PUBLIC)).to eq(!expected_status)
|
|
|
|
expect(described_class.public_visibility_restricted?).to eq(expected_status)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
2021-03-05 07:08:55 -05:00
|
|
|
|
|
|
|
describe '.options' do
|
|
|
|
context 'keys' do
|
|
|
|
it 'returns the allowed visibility levels' do
|
|
|
|
expect(described_class.options.keys).to contain_exactly('Private', 'Internal', 'Public')
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe '.level_name' do
|
|
|
|
using RSpec::Parameterized::TableSyntax
|
|
|
|
|
|
|
|
where(:level_value, :level_name) do
|
|
|
|
described_class::PRIVATE | 'Private'
|
|
|
|
described_class::INTERNAL | 'Internal'
|
|
|
|
described_class::PUBLIC | 'Public'
|
|
|
|
non_existing_record_access_level | 'Unknown'
|
|
|
|
end
|
|
|
|
|
|
|
|
with_them do
|
|
|
|
it 'returns the name of the visibility level' do
|
|
|
|
expect(described_class.level_name(level_value)).to eq(level_name)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
2017-03-20 17:05:53 -04:00
|
|
|
end
|