diff --git a/app/controllers/admin/application_settings_controller.rb b/app/controllers/admin/application_settings_controller.rb index c977f42858d9c665f4500eeb0e43e62090971165..c3ad7394e4e5874995073c1cd07b889cf5944499 100644 --- a/app/controllers/admin/application_settings_controller.rb +++ b/app/controllers/admin/application_settings_controller.rb @@ -5,7 +5,9 @@ def show end def update - if @application_setting.update_attributes(application_setting_params) + result = ::ApplicationSettings::UpdateService.new(@application_setting, current_user, application_setting_params).execute + + if result[:status] == :success redirect_to admin_application_settings_path, notice: 'Application settings saved successfully' else diff --git a/app/controllers/concerns/lfs_request.rb b/app/controllers/concerns/lfs_request.rb index f8f1e41c4229a2b7421f654222482e0bd5dc0551..0ded2e3c44ee2961ff081f2f8df04551c12bba55 100644 --- a/app/controllers/concerns/lfs_request.rb +++ b/app/controllers/concerns/lfs_request.rb @@ -136,7 +136,7 @@ def objects_exceed_repo_limit? size_of_objects = objects.sum { |o| o[:size] } - @limit_exceeded = (project.repository_and_lfs_size + size_of_objects.to_mb) > project.actual_size_limit + @limit_exceeded = (project.repository_and_lfs_size + size_of_objects) > project.actual_size_limit end end diff --git a/app/models/project.rb b/app/models/project.rb index 50f6576e2e2c871a560dd92203f70a9f822beee3..d5f1d5cbc92fa9f0432ad960c395f2b1e95db016 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -1541,8 +1541,10 @@ def size_limit_enabled? actual_size_limit != 0 end - def changes_will_exceed_size_limit?(size_mb) - size_limit_enabled? && (size_mb > actual_size_limit || size_mb + repository_and_lfs_size > actual_size_limit) + def changes_will_exceed_size_limit?(size_in_bytes) + size_limit_enabled? && + (size_in_bytes > actual_size_limit || + size_in_bytes + repository_and_lfs_size > actual_size_limit) end def environments_for(ref, commit: nil, with_tags: false) diff --git a/app/services/application_settings/base_service.rb b/app/services/application_settings/base_service.rb new file mode 100644 index 0000000000000000000000000000000000000000..d452718491bda318743742c1726047687fc615b1 --- /dev/null +++ b/app/services/application_settings/base_service.rb @@ -0,0 +1,9 @@ +module ApplicationSettings + class BaseService < ::BaseService + attr_accessor :application_setting, :current_user, :params + + def initialize(application_setting, user, params = {}) + @application_setting, @current_user, @params = application_setting, user, params.dup + end + end +end diff --git a/app/services/application_settings/create_service.rb b/app/services/application_settings/create_service.rb new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/app/services/application_settings/update_service.rb b/app/services/application_settings/update_service.rb new file mode 100644 index 0000000000000000000000000000000000000000..521aa37c9ea5ffcb97258800a7712034c20a01fd --- /dev/null +++ b/app/services/application_settings/update_service.rb @@ -0,0 +1,14 @@ +module ApplicationSettings + class UpdateService < ApplicationSettings::BaseService + def execute + # Repository size limit comes as MB from the view + assign_repository_size_limit_as_bytes(application_setting) + + if application_setting.update(params) + success + else + error('Application settings could not be updated') + end + end + end +end diff --git a/app/services/base_service.rb b/app/services/base_service.rb index 1a2bad77a0291e6edfef7be253bdd5fdbed91262..9d333fa3f5aa76c42b2387c61d5fda21a966a880 100644 --- a/app/services/base_service.rb +++ b/app/services/base_service.rb @@ -46,6 +46,13 @@ def deny_visibility_level(model, denied_visibility_level = nil) private + def assign_repository_size_limit_as_bytes(model) + repository_size_limit = @params.delete(:repository_size_limit) + new_value = repository_size_limit.to_i.megabytes if repository_size_limit.present? + + model.repository_size_limit = new_value + end + def error(message, http_status = nil) result = { message: message, diff --git a/app/services/groups/create_service.rb b/app/services/groups/create_service.rb index febeb661fb5f3bb5622a5c06591e19d223dde4df..ec621a6b06409ee20b50b6ef1bebda9e8cb9c767 100644 --- a/app/services/groups/create_service.rb +++ b/app/services/groups/create_service.rb @@ -12,6 +12,9 @@ def execute return @group end + # Repository size limit comes as MB from the view + assign_repository_size_limit_as_bytes(@group) + if @group.parent && !can?(current_user, :admin_group, @group.parent) @group.parent = nil @group.errors.add(:parent_id, 'manage access required to create subgroup') diff --git a/app/services/groups/update_service.rb b/app/services/groups/update_service.rb index 4e878ec556a2e77f2ac571e6c45efa938f0e91aa..c8eff0f4c751756c36a7a62048eb45be88b4307f 100644 --- a/app/services/groups/update_service.rb +++ b/app/services/groups/update_service.rb @@ -12,6 +12,9 @@ def execute end end + # Repository size limit comes as MB from the view + assign_repository_size_limit_as_bytes(group) + group.assign_attributes(params) begin diff --git a/app/services/projects/create_service.rb b/app/services/projects/create_service.rb index 31e3902d86f3a349cbb15138049be544111f9be2..642a899d89736e1dac74cc7a392d5c06b814d1bf 100644 --- a/app/services/projects/create_service.rb +++ b/app/services/projects/create_service.rb @@ -22,6 +22,9 @@ def execute return @project end + # Repository size limit comes as MB from the view + assign_repository_size_limit_as_bytes(@project) + # Set project name from path if @project.name.present? && @project.path.present? # if both name and path set - everything is ok diff --git a/app/services/projects/update_service.rb b/app/services/projects/update_service.rb index 955b69258a10e313fd07f8c2aae3cf770f1d5109..6edff7c5352571993f8b710f7d79eb75770b653e 100644 --- a/app/services/projects/update_service.rb +++ b/app/services/projects/update_service.rb @@ -13,6 +13,9 @@ def execute end end + # Repository size limit comes as MB from the view + assign_repository_size_limit_as_bytes(project) + new_branch = params.delete(:default_branch) new_repository_storage = params.delete(:repository_storage) diff --git a/app/views/admin/application_settings/_form.html.haml b/app/views/admin/application_settings/_form.html.haml index 85b451da13129230fc128f7d0bcf55b349e8c621..d771c3e6443d44a4f8c25bb9b255b3061c17dff4 100644 --- a/app/views/admin/application_settings/_form.html.haml +++ b/app/views/admin/application_settings/_form.html.haml @@ -67,7 +67,7 @@ = f.label :repository_size_limit, class: 'control-label col-sm-2' do Size limit per repository (MB) .col-sm-10 - = f.number_field :repository_size_limit, class: 'form-control', min: 0 + = f.number_field :repository_size_limit, value: f.object.repository_size_limit.try(:to_mb), class: 'form-control', min: 0 %span.help-block#repository_size_limit_help_block Includes LFS objects. It can be overridden per group, or per project. 0 for unlimited. = link_to icon('question-circle'), help_page_path("user/admin_area/settings/account_and_limit_settings") diff --git a/app/views/groups/_repository_size_limit_setting.html.haml b/app/views/groups/_repository_size_limit_setting.html.haml index 27463737489985f2fed4d224018a747d8ccc41a4..7d36627243b25bcd70c9fd9b5ed9cce46917d0d4 100644 --- a/app/views/groups/_repository_size_limit_setting.html.haml +++ b/app/views/groups/_repository_size_limit_setting.html.haml @@ -3,6 +3,6 @@ = f.label :repository_size_limit, class: 'control-label' do Repository size limit (MB) .col-sm-10 - = f.number_field :repository_size_limit, class: 'form-control', min: 0 + = f.number_field :repository_size_limit, value: f.object.repository_size_limit.try(:to_mb), class: 'form-control', min: 0 %span.help-block#repository_size_limit_help_block = size_limit_message_for_group(@group) diff --git a/app/views/projects/edit.html.haml b/app/views/projects/edit.html.haml index 680eac0fa0693d11c862db4803fd6be542e60929..ed608f111eec70446cf7d84bf229e110e8273190 100644 --- a/app/views/projects/edit.html.haml +++ b/app/views/projects/edit.html.haml @@ -38,7 +38,7 @@ .form-group = f.label :repository_size_limit, class: 'label-light' do Repository size limit (MB) - = f.number_field :repository_size_limit, class: 'form-control', min: 0 + = f.number_field :repository_size_limit, value: f.object.repository_size_limit.try(:to_mb), class: 'form-control', min: 0 %span.help-block#repository_size_limit_help_block = size_limit_message(@project) diff --git a/db/migrate/20170118194941_convert_application_settings_repository_size_limit_to_bytes.rb b/db/migrate/20170118194941_convert_application_settings_repository_size_limit_to_bytes.rb new file mode 100644 index 0000000000000000000000000000000000000000..1cee31aa595b801b9cc9e0efeabd03b4cd7ae8fb --- /dev/null +++ b/db/migrate/20170118194941_convert_application_settings_repository_size_limit_to_bytes.rb @@ -0,0 +1,46 @@ +class ConvertApplicationSettingsRepositorySizeLimitToBytes < ActiveRecord::Migration + include Gitlab::Database::MigrationHelpers + + DOWNTIME = false + disable_ddl_transaction! + + def up + connection.transaction do + rename_column :application_settings, :repository_size_limit, :repository_size_limit_mb + add_column :application_settings, :repository_size_limit, :integer, default: 0, limit: 8 + end + + bigint_string = if Gitlab::Database.postgresql? + 'repository_size_limit_mb::bigint * 1024 * 1024' + else + 'repository_size_limit_mb * 1024 * 1024' + end + + sql_expression = Arel::Nodes::SqlLiteral.new(bigint_string) + + connection.transaction do + update_column_in_batches(:application_settings, :repository_size_limit, sql_expression) do |t, query| + query.where(t[:repository_size_limit_mb].not_eq(nil)) + end + + remove_column :application_settings, :repository_size_limit_mb + end + end + + def down + connection.transaction do + rename_column :application_settings, :repository_size_limit, :repository_size_limit_bytes + add_column :application_settings, :repository_size_limit, :integer, default: 0, limit: nil + end + + sql_expression = Arel::Nodes::SqlLiteral.new('repository_size_limit_bytes / 1024 / 1024') + + connection.transaction do + update_column_in_batches(:application_settings, :repository_size_limit, sql_expression) do |t, query| + query.where(t[:repository_size_limit_bytes].not_eq(nil)) + end + + remove_column :application_settings, :repository_size_limit_bytes + end + end +end diff --git a/db/migrate/20170118200338_convert_projects_repository_size_limit_to_bytes.rb b/db/migrate/20170118200338_convert_projects_repository_size_limit_to_bytes.rb new file mode 100644 index 0000000000000000000000000000000000000000..043ca5c384f0a4e46ebcb1bab2c95f1d0735d762 --- /dev/null +++ b/db/migrate/20170118200338_convert_projects_repository_size_limit_to_bytes.rb @@ -0,0 +1,49 @@ +# See http://doc.gitlab.com/ce/development/migration_style_guide.html +# for more information on how to write migrations for GitLab. + +class ConvertProjectsRepositorySizeLimitToBytes < ActiveRecord::Migration + include Gitlab::Database::MigrationHelpers + + DOWNTIME = false + disable_ddl_transaction! + + def up + connection.transaction do + rename_column :projects, :repository_size_limit, :repository_size_limit_mb + add_column :projects, :repository_size_limit, :integer, limit: 8 + end + + bigint_string = if Gitlab::Database.postgresql? + 'repository_size_limit_mb::bigint * 1024 * 1024' + else + 'repository_size_limit_mb * 1024 * 1024' + end + + sql_expression = Arel::Nodes::SqlLiteral.new(bigint_string) + + connection.transaction do + update_column_in_batches(:projects, :repository_size_limit, sql_expression) do |t, query| + query.where(t[:repository_size_limit_mb].not_eq(nil)) + end + + remove_column :projects, :repository_size_limit_mb + end + end + + def down + connection.transaction do + rename_column :projects, :repository_size_limit, :repository_size_limit_bytes + add_column :projects, :repository_size_limit, :integer, limit: nil + end + + sql_expression = Arel::Nodes::SqlLiteral.new('repository_size_limit_bytes / 1024 / 1024') + + connection.transaction do + update_column_in_batches(:projects, :repository_size_limit, sql_expression) do |t, query| + query.where(t[:repository_size_limit_bytes].not_eq(nil)) + end + + remove_column :projects, :repository_size_limit_bytes + end + end +end diff --git a/db/migrate/20170118200412_convert_namespaces_repository_size_limit_to_bytes.rb b/db/migrate/20170118200412_convert_namespaces_repository_size_limit_to_bytes.rb new file mode 100644 index 0000000000000000000000000000000000000000..d7b597aa276de55579a822479a603bfb39d92319 --- /dev/null +++ b/db/migrate/20170118200412_convert_namespaces_repository_size_limit_to_bytes.rb @@ -0,0 +1,49 @@ +# See http://doc.gitlab.com/ce/development/migration_style_guide.html +# for more information on how to write migrations for GitLab. + +class ConvertNamespacesRepositorySizeLimitToBytes < ActiveRecord::Migration + include Gitlab::Database::MigrationHelpers + + DOWNTIME = false + disable_ddl_transaction! + + def up + connection.transaction do + rename_column :namespaces, :repository_size_limit, :repository_size_limit_mb + add_column :namespaces, :repository_size_limit, :integer, limit: 8 + end + + bigint_string = if Gitlab::Database.postgresql? + 'repository_size_limit_mb::bigint * 1024 * 1024' + else + 'repository_size_limit_mb * 1024 * 1024' + end + + sql_expression = Arel::Nodes::SqlLiteral.new(bigint_string) + + connection.transaction do + update_column_in_batches(:namespaces, :repository_size_limit, sql_expression) do |t, query| + query.where(t[:repository_size_limit_mb].not_eq(nil)) + end + + remove_column :namespaces, :repository_size_limit_mb + end + end + + def down + connection.transaction do + rename_column :namespaces, :repository_size_limit, :repository_size_limit_bytes + add_column :namespaces, :repository_size_limit, :integer, limit: nil + end + + sql_expression = Arel::Nodes::SqlLiteral.new('repository_size_limit_bytes / 1024 / 1024') + + connection.transaction do + update_column_in_batches(:namespaces, :repository_size_limit, sql_expression) do |t, query| + query.where(t[:repository_size_limit_bytes].not_eq(nil)) + end + + remove_column :namespaces, :repository_size_limit_bytes + end + end +end diff --git a/db/schema.rb b/db/schema.rb index d569dd5df02faec654a33e68be8a538e81d63112..03e962c7f8e95ce1471b3a479cd17f031bee4056 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20170106172237) do +ActiveRecord::Schema.define(version: 20170118200412) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -102,7 +102,6 @@ t.boolean "usage_ping_enabled", default: true, null: false t.boolean "koding_enabled" t.string "koding_url" - t.integer "repository_size_limit", default: 0 t.text "sign_in_text_html" t.text "help_page_text_html" t.text "shared_runners_text_html" @@ -119,6 +118,7 @@ t.string "plantuml_url" t.boolean "plantuml_enabled" t.integer "shared_runners_minutes", default: 0, null: false + t.integer "repository_size_limit", limit: 8, default: 0 end create_table "approvals", force: :cascade do |t| @@ -853,10 +853,10 @@ t.datetime "ldap_sync_last_sync_at" t.datetime "deleted_at" t.boolean "lfs_enabled" - t.integer "repository_size_limit" t.text "description_html" t.integer "parent_id" t.integer "shared_runners_minutes_limit" + t.integer "repository_size_limit", limit: 8 end add_index "namespaces", ["created_at"], name: "index_namespaces_on_created_at", using: :btree @@ -1105,8 +1105,8 @@ t.boolean "repository_read_only" t.boolean "lfs_enabled" t.text "description_html" - t.integer "repository_size_limit" t.boolean "only_allow_merge_if_all_discussions_are_resolved" + t.integer "repository_size_limit", limit: 8 end add_index "projects", ["ci_id"], name: "index_projects_on_ci_id", using: :btree diff --git a/lib/gitlab/git_access.rb b/lib/gitlab/git_access.rb index 026725369a0004dbfa564fbd7b7537d91bbb7227..89510c282e6e3d664c93647a4f31877987430300 100644 --- a/lib/gitlab/git_access.rb +++ b/lib/gitlab/git_access.rb @@ -185,7 +185,7 @@ def check_change_access!(changes) end end - if project.changes_will_exceed_size_limit?(push_size_in_bytes.to_mb) + if project.changes_will_exceed_size_limit?(push_size_in_bytes) raise UnauthorizedError, Gitlab::RepositorySizeError.new(project).new_changes_error end end diff --git a/lib/gitlab/repository_size_error.rb b/lib/gitlab/repository_size_error.rb index e9271cbd9b395f48923d7f33bc32aa9343e78785..c1dbd3b93edbf51177834c27a41d4dd618fe046f 100644 --- a/lib/gitlab/repository_size_error.rb +++ b/lib/gitlab/repository_size_error.rb @@ -55,7 +55,7 @@ def size_to_remove end def format_number(number) - number_to_human_size(number * 1.megabyte, delimiter: ',', precision: 2) + number_to_human_size(number, delimiter: ',', precision: 2) end end end diff --git a/spec/controllers/admin/application_settings_controller_spec.rb b/spec/controllers/admin/application_settings_controller_spec.rb index 763de76d453ddcd0d9081a5c4eabfc1e71c53894..bab8a03feec25fccece30f2613fde5b3fc402b07 100644 --- a/spec/controllers/admin/application_settings_controller_spec.rb +++ b/spec/controllers/admin/application_settings_controller_spec.rb @@ -6,6 +6,36 @@ let(:admin) { create(:admin) } let(:user) { create(:user)} + describe 'PUT #update' do + before do + sign_in(admin) + end + + context 'with valid params' do + subject { put :update, application_setting: { repository_size_limit: '100' } } + + it 'redirect to application settings page' do + is_expected.to redirect_to(admin_application_settings_path) + end + + it 'set flash notice' do + is_expected.to set_flash[:notice].to('Application settings saved successfully') + end + end + + context 'with invalid params' do + subject! { put :update, application_setting: { repository_size_limit: '-100' } } + + it 'render show template' do + is_expected.to render_template(:show) + end + + it 'assigned @application_settings has errors' do + expect(assigns(:application_setting).errors[:repository_size_limit]).to be_present + end + end + end + describe 'GET #usage_data with no access' do before do sign_in(user) diff --git a/spec/lib/gitlab/git_access_spec.rb b/spec/lib/gitlab/git_access_spec.rb index 52128583dbda066ce73bf6e51fe4748e00ae5ea6..97cfcf6e078cbe6cbf5d9ea68e2f62f60c03c39c 100644 --- a/spec/lib/gitlab/git_access_spec.rb +++ b/spec/lib/gitlab/git_access_spec.rb @@ -751,7 +751,7 @@ def self.run_group_permission_checks(permissions_matrix) describe 'repository size restrictions' do before do - project.update_attribute(:repository_size_limit, 50) + project.update_attribute(:repository_size_limit, 50.megabytes) end it 'returns false when blob is too big' do diff --git a/spec/lib/gitlab/repository_size_error_spec.rb b/spec/lib/gitlab/repository_size_error_spec.rb index b8312b43b8900f63fdef08bbaf35f82b883213a1..5ee09b3093e1620109100a788c2bff7f83b165f9 100644 --- a/spec/lib/gitlab/repository_size_error_spec.rb +++ b/spec/lib/gitlab/repository_size_error_spec.rb @@ -2,14 +2,14 @@ describe Gitlab::RepositorySizeError, lib: true do let(:project) do - create(:empty_project, statistics: build(:project_statistics, repository_size: 15)) + create(:empty_project, statistics: build(:project_statistics, repository_size: 15.megabytes)) end let(:message) { Gitlab::RepositorySizeError.new(project) } let(:base_message) { 'because this repository has exceeded its size limit of 10 MB by 5 MB' } before do - allow(project).to receive(:actual_size_limit).and_return(10) + allow(project).to receive(:actual_size_limit).and_return(10.megabytes) end describe 'error messages' do diff --git a/spec/models/application_setting_spec.rb b/spec/models/application_setting_spec.rb index b950fcdd81aae02426e796e1ac8193872ad84afa..7fab73500c313f409011e3dc2654d042115f537e 100644 --- a/spec/models/application_setting_spec.rb +++ b/spec/models/application_setting_spec.rb @@ -176,4 +176,14 @@ expect(setting.domain_blacklist).to contain_exactly('example.com', 'test.com', 'foo.bar') end end + + describe '#repository_size_limit column' do + it 'support values up to 8 exabytes' do + setting.update_column(:repository_size_limit, 8.exabytes - 1) + + setting.reload + + expect(setting.repository_size_limit).to eql(8.exabytes - 1) + end + end end diff --git a/spec/models/ee/group_spec.rb b/spec/models/ee/group_spec.rb index 62d3bdbcd89681ed1a0af045c85f56aed783949a..816efa3e0ff85bf3f1abbd0184ba2821934d1c36 100644 --- a/spec/models/ee/group_spec.rb +++ b/spec/models/ee/group_spec.rb @@ -103,4 +103,15 @@ expect(group.actual_size_limit).to eq(75) end end + + describe '#repository_size_limit column' do + it 'support values up to 8 exabytes' do + group = create(:group) + group.update_column(:repository_size_limit, 8.exabytes - 1) + + group.reload + + expect(group.repository_size_limit).to eql(8.exabytes - 1) + end + end end diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb index db6af6d2a9b6f65976fc21bf7ad401d28b489c04..03713a799930311e31da2d1dcc79f8078688164d 100644 --- a/spec/models/project_spec.rb +++ b/spec/models/project_spec.rb @@ -623,6 +623,17 @@ end end + describe '#repository_size_limit column' do + it 'support values up to 8 exabytes' do + project = create(:empty_project) + project.update_column(:repository_size_limit, 8.exabytes - 1) + + project.reload + + expect(project.repository_size_limit).to eql(8.exabytes - 1) + end + end + describe '#default_issues_tracker?' do it "is true if used internal tracker" do project = build(:empty_project) diff --git a/spec/services/application_settings/update_service_spec.rb b/spec/services/application_settings/update_service_spec.rb new file mode 100644 index 0000000000000000000000000000000000000000..6ec51b65318a6cc045adaa1af4246593119ea9d4 --- /dev/null +++ b/spec/services/application_settings/update_service_spec.rb @@ -0,0 +1,69 @@ +require 'spec_helper' + +describe ApplicationSettings::UpdateService, services: true do + let(:user) { create(:user) } + let(:setting) { ApplicationSetting.create_from_defaults } + let(:service) { described_class.new(setting, user, opts) } + + describe '#execute' do + context 'common params' do + let(:opts) { { home_page_url: 'http://foo.bar' } } + + it 'properly updates settings with given params' do + service.execute + + expect(setting.home_page_url).to eql(opts[:home_page_url]) + end + end + + context 'with valid params' do + let(:opts) { { repository_size_limit: '100' } } + + it 'returns success params' do + result = service.execute + + expect(result).to eql(status: :success) + end + end + + context 'with invalid params' do + let(:opts) { { repository_size_limit: '-100' } } + + it 'returns error params' do + result = service.execute + + expect(result).to eql(message: "Application settings could not be updated", status: :error) + end + end + + context 'repository_size_limit assignment as Bytes' do + let(:service) { described_class.new(setting, user, opts) } + + context 'when param present' do + let(:opts) { { repository_size_limit: '100' } } + + it 'converts from MB to Bytes' do + service.execute + + expect(setting.reload.repository_size_limit).to eql(100 * 1024 * 1024) + end + end + + context 'when param not present' do + let(:opts) { { repository_size_limit: '' } } + + it 'does not update due to invalidity' do + service.execute + + expect(setting.reload.repository_size_limit).to be_zero + end + + it 'assign nil value' do + service.execute + + expect(setting.repository_size_limit).to be_nil + end + end + end + end +end diff --git a/spec/services/groups/create_service_spec.rb b/spec/services/groups/create_service_spec.rb index 14717a7455d3de3d56ea5709b00ec163b55b5e65..116219475500f3ce35f256423f5c43e3687c371d 100644 --- a/spec/services/groups/create_service_spec.rb +++ b/spec/services/groups/create_service_spec.rb @@ -40,4 +40,29 @@ end end end + + context 'repository_size_limit assignment as Bytes' do + let(:admin_user) { create(:user, admin: true) } + let(:service) { described_class.new(admin_user, group_params.merge(opts)) } + + context 'when param present' do + let(:opts) { { repository_size_limit: '100' } } + + it 'assign repository_size_limit as Bytes' do + group = service.execute + + expect(group.repository_size_limit).to eql(100 * 1024 * 1024) + end + end + + context 'when param not present' do + let(:opts) { { repository_size_limit: '' } } + + it 'assign nil value' do + group = service.execute + + expect(group.repository_size_limit).to be_nil + end + end + end end diff --git a/spec/services/groups/update_service_spec.rb b/spec/services/groups/update_service_spec.rb index 531180e48a1db0444550c63b757e9393f07c9f19..4a045b78187b3f402b961c4f3d70adc0f3582127 100644 --- a/spec/services/groups/update_service_spec.rb +++ b/spec/services/groups/update_service_spec.rb @@ -38,6 +38,31 @@ end end + context 'repository_size_limit assignment as Bytes' do + let(:group) { create(:group, :public, repository_size_limit: 0) } + let(:service) { described_class.new(group, user, opts) } + + context 'when param present' do + let(:opts) { { repository_size_limit: '100' } } + + it 'converts from MB to Bytes' do + service.execute + + expect(group.reload.repository_size_limit).to eql(100 * 1024 * 1024) + end + end + + context 'when param not present' do + let(:opts) { { repository_size_limit: '' } } + + it 'assign nil value' do + service.execute + + expect(group.reload.repository_size_limit).to be_nil + end + end + end + context "unauthorized visibility_level validation" do let!(:service) { described_class.new(internal_group, user, visibility_level: 99) } before do diff --git a/spec/services/projects/create_service_spec.rb b/spec/services/projects/create_service_spec.rb index 466e18fbe0093368443ea11a601d6a2a6ee515f4..d75d913c2bff0bca6910899c5fd11bea338c7a14 100644 --- a/spec/services/projects/create_service_spec.rb +++ b/spec/services/projects/create_service_spec.rb @@ -98,6 +98,30 @@ end end + context 'repository_size_limit assignment as Bytes' do + let(:admin_user) { create(:user, admin: true) } + + context 'when param present' do + let(:opts) { { repository_size_limit: '100' } } + + it 'assign repository_size_limit as Bytes' do + project = create_project(admin_user, opts) + + expect(project.repository_size_limit).to eql(100 * 1024 * 1024) + end + end + + context 'when param not present' do + let(:opts) { { repository_size_limit: '' } } + + it 'assign nil value' do + project = create_project(admin_user, opts) + + expect(project.repository_size_limit).to be_nil + end + end + end + context 'restricted visibility level' do before do stub_application_setting(restricted_visibility_levels: [Gitlab::VisibilityLevel::PUBLIC]) diff --git a/spec/services/projects/update_service_spec.rb b/spec/services/projects/update_service_spec.rb index 9de7d64409c4aed1f23b20e2861f9a5caf8757ec..13397e2b6ca1ff309ef54ef313f883c61eea036a 100644 --- a/spec/services/projects/update_service_spec.rb +++ b/spec/services/projects/update_service_spec.rb @@ -127,6 +127,31 @@ end end + context 'repository_size_limit assignment as Bytes' do + let(:admin_user) { create(:user, admin: true) } + let(:project) { create(:empty_project, repository_size_limit: 0) } + + context 'when param present' do + let(:opts) { { repository_size_limit: '100' } } + + it 'converts from MB to Bytes' do + update_project(project, admin_user, opts) + + expect(project.reload.repository_size_limit).to eql(100 * 1024 * 1024) + end + end + + context 'when param not present' do + let(:opts) { { repository_size_limit: '' } } + + it 'assign nil value' do + update_project(project, admin_user, opts) + + expect(project.reload.repository_size_limit).to be_nil + end + end + end + it 'returns an error result when record cannot be updated' do result = update_project(project, admin, { name: 'foo&bar' })