2019-12-21 20:55:43 +05:30
# frozen_string_literal: true
2018-11-08 19:23:39 +05:30
require " spec_helper "
2017-08-17 22:00:37 +05:30
2020-07-28 23:09:34 +05:30
RSpec . describe StorageHelper do
2018-11-08 19:23:39 +05:30
describe " # storage_counter " do
it " formats bytes to one decimal place " do
expect ( helper . storage_counter ( 1 . 23 . megabytes ) ) . to eq ( " 1.2 MB " )
2017-08-17 22:00:37 +05:30
end
2018-11-08 19:23:39 +05:30
it " does not add decimals for sizes < 1 MB " do
expect ( helper . storage_counter ( 23 . 5 . kilobytes ) ) . to eq ( " 24 KB " )
2017-08-17 22:00:37 +05:30
end
2018-11-08 19:23:39 +05:30
it " does not add decimals for zeroes " do
expect ( helper . storage_counter ( 2 . megabytes ) ) . to eq ( " 2 MB " )
2017-08-17 22:00:37 +05:30
end
2018-11-08 19:23:39 +05:30
it " uses commas as thousands separator " do
2019-02-15 15:39:39 +05:30
expect ( helper . storage_counter ( 100_000_000_000_000_000_000_000 ) ) . to eq ( " 86,736.2 EB " )
2017-08-17 22:00:37 +05:30
end
end
2019-07-31 22:56:46 +05:30
describe " # storage_counters_details " do
2020-11-24 15:15:51 +05:30
let_it_be ( :namespace ) { create ( :namespace ) }
let_it_be ( :project ) do
2019-07-31 22:56:46 +05:30
create ( :project ,
namespace : namespace ,
statistics : build ( :project_statistics ,
2021-12-11 22:18:48 +05:30
namespace : namespace ,
repository_size : 10 . kilobytes ,
wiki_size : 10 . bytes ,
lfs_objects_size : 20 . gigabytes ,
build_artifacts_size : 30 . megabytes ,
pipeline_artifacts_size : 11 . megabytes ,
snippets_size : 40 . megabytes ,
packages_size : 12 . megabytes ,
uploads_size : 15 . megabytes ) )
2019-07-31 22:56:46 +05:30
end
2021-12-11 22:18:48 +05:30
let ( :message ) { 'Repository: 10 KB / Wikis: 10 Bytes / Build Artifacts: 30 MB / Pipeline Artifacts: 11 MB / LFS: 20 GB / Snippets: 40 MB / Packages: 12 MB / Uploads: 15 MB' }
2019-07-31 22:56:46 +05:30
it 'works on ProjectStatistics' do
expect ( helper . storage_counters_details ( project . statistics ) ) . to eq ( message )
end
it 'works on Namespace.with_statistics' do
namespace_stats = Namespace . with_statistics . find ( project . namespace . id )
expect ( helper . storage_counters_details ( namespace_stats ) ) . to eq ( message )
end
end
2022-04-04 11:22:00 +05:30
2022-08-13 15:12:31 +05:30
describe " storage_enforcement_banner " do
2022-04-04 11:22:00 +05:30
let_it_be_with_refind ( :current_user ) { create ( :user ) }
let_it_be ( :free_group ) { create ( :group ) }
let_it_be ( :paid_group ) { create ( :group ) }
before do
2022-08-27 11:52:29 +05:30
allow ( helper ) . to receive ( :can? ) . with ( current_user , :maintainer_access , free_group ) . and_return ( true )
allow ( helper ) . to receive ( :can? ) . with ( current_user , :maintainer_access , paid_group ) . and_return ( true )
2022-04-04 11:22:00 +05:30
allow ( helper ) . to receive ( :current_user ) { current_user }
allow ( paid_group ) . to receive ( :paid? ) . and_return ( true )
2022-07-23 23:45:48 +05:30
stub_feature_flags ( namespace_storage_limit_bypass_date_check : false )
2022-04-04 11:22:00 +05:30
end
describe " # storage_enforcement_banner_info " do
it 'returns nil when namespace is not free' do
2022-05-07 20:08:51 +05:30
expect ( helper . storage_enforcement_banner_info ( paid_group ) ) . to be ( nil )
2022-04-04 11:22:00 +05:30
end
it 'returns nil when storage_enforcement_date is not set' do
allow ( free_group ) . to receive ( :storage_enforcement_date ) . and_return ( nil )
2022-05-07 20:08:51 +05:30
expect ( helper . storage_enforcement_banner_info ( free_group ) ) . to be ( nil )
2022-04-04 11:22:00 +05:30
end
2022-05-07 20:08:51 +05:30
describe 'when storage_enforcement_date is set' do
let_it_be ( :storage_enforcement_date ) { Date . today + 30 }
before do
allow ( free_group ) . to receive ( :storage_enforcement_date ) . and_return ( storage_enforcement_date )
end
it 'returns nil when current_user do not have access usage quotas page' do
2022-08-27 11:52:29 +05:30
allow ( helper ) . to receive ( :can? ) . with ( current_user , :maintainer_access , free_group ) . and_return ( false )
2022-08-13 15:12:31 +05:30
expect ( helper . storage_enforcement_banner_info ( free_group ) ) . to be ( nil )
end
it 'returns nil when namespace_storage_limit_show_preenforcement_banner FF is disabled' do
stub_feature_flags ( namespace_storage_limit_show_preenforcement_banner : false )
2022-05-07 20:08:51 +05:30
expect ( helper . storage_enforcement_banner_info ( free_group ) ) . to be ( nil )
end
2022-07-16 23:28:13 +05:30
context 'when current_user can access the usage quotas page' do
it 'returns a hash' do
2022-08-27 11:52:29 +05:30
used_storage = helper . storage_counter ( free_group . root_storage_statistics & . storage_size || 0 )
2022-07-16 23:28:13 +05:30
expect ( helper . storage_enforcement_banner_info ( free_group ) ) . to eql ( {
2022-08-27 11:52:29 +05:30
text_paragraph_1 : " Effective #{ storage_enforcement_date } , namespace storage limits will apply to the <strong> #{ free_group . name } </strong> namespace. View the <a href= \" /help/user/usage_quotas # namespace-storage-limit-enforcement-schedule \" >rollout schedule for this change</a>. " ,
text_paragraph_2 : " The namespace is currently using <strong> #{ used_storage } </strong> of namespace storage. Group owners can view namespace storage usage and purchase more from <strong>Group settings > Usage quotas</strong>. <a href= \" /help/user/usage_quotas # manage-your-storage-usage \" >Learn more.</a> " ,
text_paragraph_3 : " See our <a href= \" https://about.gitlab.com/pricing/faq-efficient-free-tier/ # storage-limits-on-gitlab-saas-free-tier \" >FAQ</a> for more information. " ,
2022-07-16 23:28:13 +05:30
variant : 'warning' ,
2022-08-27 11:52:29 +05:30
namespace_id : free_group . id ,
2022-07-16 23:28:13 +05:30
callouts_feature_name : 'storage_enforcement_banner_second_enforcement_threshold' ,
2022-08-27 11:52:29 +05:30
callouts_path : '/-/users/group_callouts'
2022-07-16 23:28:13 +05:30
} )
end
context 'when namespace has used storage' do
before do
create ( :namespace_root_storage_statistics , namespace : free_group , storage_size : 102400 )
end
it 'returns a hash with the correct storage size text' do
2022-08-27 11:52:29 +05:30
expect ( helper . storage_enforcement_banner_info ( free_group ) [ :text_paragraph_2 ] ) . to eql ( " The namespace is currently using <strong>100 KB</strong> of namespace storage. Group owners can view namespace storage usage and purchase more from <strong>Group settings > Usage quotas</strong>. <a href= \" /help/user/usage_quotas # manage-your-storage-usage \" >Learn more.</a> " )
2022-07-16 23:28:13 +05:30
end
end
2022-07-23 23:45:48 +05:30
context 'when the given group is a sub-group' do
let_it_be ( :sub_group ) { build ( :group ) }
before do
2022-08-27 11:52:29 +05:30
allow ( helper ) . to receive ( :can? ) . with ( current_user , :maintainer_access , sub_group ) . and_return ( true )
2022-07-23 23:45:48 +05:30
allow ( sub_group ) . to receive ( :root_ancestor ) . and_return ( free_group )
end
it 'returns the banner hash' do
2022-08-27 11:52:29 +05:30
expect ( helper . storage_enforcement_banner_info ( sub_group ) . keys ) . to match_array ( % i ( text_paragraph_1 text_paragraph_2 text_paragraph_3 variant namespace_id callouts_feature_name callouts_path ) )
2022-07-23 23:45:48 +05:30
end
end
end
end
context 'when the :storage_banner_bypass_date_check is enabled' , :freeze_time do
before do
stub_feature_flags ( namespace_storage_limit_bypass_date_check : true )
end
it 'returns the enforcement info' do
2022-08-27 11:52:29 +05:30
puts helper . storage_enforcement_banner_info ( free_group ) [ :text_paragraph_1 ]
expect ( helper . storage_enforcement_banner_info ( free_group ) [ :text_paragraph_1 ] ) . to include ( " Effective #{ Date . current } , namespace storage limits will apply " )
2022-05-07 20:08:51 +05:30
end
2022-04-04 11:22:00 +05:30
end
context 'when storage_enforcement_date is set and dismissed callout exists' do
before do
create ( :group_callout ,
user : current_user ,
group_id : free_group . id ,
feature_name : 'storage_enforcement_banner_second_enforcement_threshold' )
storage_enforcement_date = Date . today + 30
allow ( free_group ) . to receive ( :storage_enforcement_date ) . and_return ( storage_enforcement_date )
end
2022-05-07 20:08:51 +05:30
it { expect ( helper . storage_enforcement_banner_info ( free_group ) ) . to be ( nil ) }
2022-04-04 11:22:00 +05:30
end
context 'callouts_feature_name' do
let ( :days_from_now ) { 45 }
subject do
storage_enforcement_date = Date . today + days_from_now
allow ( free_group ) . to receive ( :storage_enforcement_date ) . and_return ( storage_enforcement_date )
2022-05-07 20:08:51 +05:30
helper . storage_enforcement_banner_info ( free_group ) [ :callouts_feature_name ]
2022-04-04 11:22:00 +05:30
end
it 'returns first callouts_feature_name' do
is_expected . to eq ( 'storage_enforcement_banner_first_enforcement_threshold' )
end
context 'returns second callouts_feature_name' do
let ( :days_from_now ) { 20 }
it { is_expected . to eq ( 'storage_enforcement_banner_second_enforcement_threshold' ) }
end
context 'returns third callouts_feature_name' do
let ( :days_from_now ) { 13 }
it { is_expected . to eq ( 'storage_enforcement_banner_third_enforcement_threshold' ) }
end
context 'returns fourth callouts_feature_name' do
let ( :days_from_now ) { 3 }
it { is_expected . to eq ( 'storage_enforcement_banner_fourth_enforcement_threshold' ) }
end
end
end
end
2017-08-17 22:00:37 +05:30
end