diff --git a/app/models/project.rb b/app/models/project.rb index 0953d786f..cd36bc76c 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -517,10 +517,7 @@ class Project < ActiveRecord::Base def enabled_module_names=(module_names) if module_names && module_names.is_a?(Array) module_names = module_names.collect(&:to_s).reject(&:blank?) - # remove disabled modules - enabled_modules.each {|mod| mod.destroy unless module_names.include?(mod.name)} - # add new modules - module_names.reject {|name| module_enabled?(name)}.each {|name| enabled_modules << EnabledModule.new(:name => name)} + self.enabled_modules = module_names.collect {|name| enabled_modules.detect {|mod| mod.name == name} || EnabledModule.new(:name => name)} else enabled_modules.clear end diff --git a/test/functional/projects_controller_test.rb b/test/functional/projects_controller_test.rb index fefb8d53b..74912a764 100644 --- a/test/functional/projects_controller_test.rb +++ b/test/functional/projects_controller_test.rb @@ -288,6 +288,22 @@ class ProjectsControllerTest < ActionController::TestCase end end + def test_create_should_preserve_modules_on_validation_failure + with_settings :default_projects_modules => ['issue_tracking', 'repository'] do + @request.session[:user_id] = 1 + assert_no_difference 'Project.count' do + post :create, :project => { + :name => "blog", + :identifier => "", + :enabled_module_names => %w(issue_tracking news) + } + end + assert_response :success + project = assigns(:project) + assert_equal %w(issue_tracking news), project.enabled_module_names.sort + end + end + def test_create_should_not_accept_get @request.session[:user_id] = 1 get :create diff --git a/test/unit/project_test.rb b/test/unit/project_test.rb index ba61db49c..d307500e3 100644 --- a/test/unit/project_test.rb +++ b/test/unit/project_test.rb @@ -588,6 +588,14 @@ class ProjectTest < ActiveSupport::TestCase assert_nil Project.next_identifier end + def test_enabled_module_names + with_settings :default_projects_modules => ['issue_tracking', 'repository'] do + project = Project.new + + project.enabled_module_names = %w(issue_tracking news) + assert_equal %w(issue_tracking news), project.enabled_module_names.sort + end + end def test_enabled_module_names_should_not_recreate_enabled_modules project = Project.find(1)