Fix project feature being deleted when updating project with invalid visibility level
This commit is contained in:
		
							parent
							
								
									de14e9c203
								
							
						
					
					
						commit
						056c42cca5
					
				|  | @ -161,7 +161,7 @@ class Project < ActiveRecord::Base | |||
|   has_many :notification_settings, as: :source, dependent: :delete_all # rubocop:disable Cop/ActiveRecordDependent | ||||
| 
 | ||||
|   has_one :import_data, class_name: 'ProjectImportData', inverse_of: :project, autosave: true | ||||
|   has_one :project_feature | ||||
|   has_one :project_feature, inverse_of: :project | ||||
|   has_one :statistics, class_name: 'ProjectStatistics' | ||||
| 
 | ||||
|   # Container repositories need to remove data from the container registry, | ||||
|  | @ -190,7 +190,7 @@ class Project < ActiveRecord::Base | |||
|   has_one :auto_devops, class_name: 'ProjectAutoDevops' | ||||
| 
 | ||||
|   accepts_nested_attributes_for :variables, allow_destroy: true | ||||
|   accepts_nested_attributes_for :project_feature | ||||
|   accepts_nested_attributes_for :project_feature, update_only: true | ||||
|   accepts_nested_attributes_for :import_data | ||||
|   accepts_nested_attributes_for :auto_devops | ||||
| 
 | ||||
|  |  | |||
|  | @ -41,6 +41,8 @@ class ProjectFeature < ActiveRecord::Base | |||
|   # http://stackoverflow.com/questions/1540645/how-to-disable-default-scope-for-a-belongs-to | ||||
|   belongs_to :project, -> { unscope(where: :pending_delete) } | ||||
| 
 | ||||
|   validates :project, presence: true | ||||
| 
 | ||||
|   validate :repository_children_level | ||||
| 
 | ||||
|   default_value_for :builds_access_level,         value: ENABLED, allows_nil: false | ||||
|  |  | |||
|  | @ -24,7 +24,10 @@ module Projects | |||
| 
 | ||||
|         success | ||||
|       else | ||||
|         error('Project could not be updated!') | ||||
|         model_errors = project.errors.full_messages.to_sentence | ||||
|         error_message = model_errors.presence || 'Project could not be updated!' | ||||
| 
 | ||||
|         error(error_message) | ||||
|       end | ||||
|     end | ||||
| 
 | ||||
|  |  | |||
|  | @ -0,0 +1,6 @@ | |||
| --- | ||||
| title: Fix project feature being deleted when updating project with invalid visibility | ||||
|   level | ||||
| merge_request: | ||||
| author: | ||||
| type: fixed | ||||
|  | @ -57,6 +57,21 @@ describe Projects::UpdateService, '#execute' do | |||
|         end | ||||
|       end | ||||
|     end | ||||
| 
 | ||||
|     context 'When project visibility is higher than parent group' do | ||||
|       let(:group) { create(:group, visibility_level: Gitlab::VisibilityLevel::INTERNAL) } | ||||
| 
 | ||||
|       before do | ||||
|         project.update(namespace: group, visibility_level: group.visibility_level) | ||||
|       end | ||||
| 
 | ||||
|       it 'does not update project visibility level' do | ||||
|         result = update_project(project, admin, visibility_level: Gitlab::VisibilityLevel::PUBLIC) | ||||
| 
 | ||||
|         expect(result).to eq({ status: :error, message: 'Visibility level public is not allowed in a internal group.' }) | ||||
|         expect(project.reload).to be_internal | ||||
|       end | ||||
|     end | ||||
|   end | ||||
| 
 | ||||
|   describe 'when updating project that has forks' do | ||||
|  | @ -159,8 +174,10 @@ describe Projects::UpdateService, '#execute' do | |||
|     it 'returns an error result when record cannot be updated' do | ||||
|       result = update_project(project, admin, { name: 'foo&bar' }) | ||||
| 
 | ||||
|       expect(result).to eq({ status: :error, | ||||
|                              message: 'Project could not be updated!' }) | ||||
|       expect(result).to eq({ | ||||
|         status: :error, | ||||
|         message: "Name can contain only letters, digits, emojis, '_', '.', dash, space. It must start with letter, digit, emoji or '_'." | ||||
|       }) | ||||
|     end | ||||
|   end | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue