##// END OF EJS Templates
Added the ability to copy a project in the Project Administration panel....
Added the ability to copy a project in the Project Administration panel. * Added Copy project button. * Added Project#copy_from to duplicate a project to be modified and saved by the user * Added a ProjectsController#copy based off the add method ** Used Project#copy_from to create a duplicate project in memory * Implemented Project#copy to copy data for a project from another and save it. ** Members ** Project level queries ** Project custom fields * Added a plugin hook for Project#copy. #1125 #1556 #886 #309 git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2704 e93f8b46-1217-0410-a6f0-8f06a7374b81

File last commit:

r2608:fa7bd1c71dca
r2608:fa7bd1c71dca
Show More
project_test.rb
320 lines | 10.7 KiB | text/x-ruby | RubyLexer
Jean-Philippe Lang
Added issues status changes on the activity view (initial patch by Cyril Mougel)....
r879 # redMine - project management software
# Copyright (C) 2006-2007 Jean-Philippe Lang
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
require File.dirname(__FILE__) + '/../test_helper'
class ProjectTest < Test::Unit::TestCase
Jean-Philippe Lang
Do not DELETE/INSERT enabled_modules when updating project modules....
r2412 fixtures :projects, :enabled_modules,
:issues, :issue_statuses, :journals, :journal_details,
Eric Davis
Added the ability to copy a project in the Project Administration panel....
r2608 :users, :members, :roles, :projects_trackers, :trackers, :boards,
:queries
Jean-Philippe Lang
Added issues status changes on the activity view (initial patch by Cyril Mougel)....
r879
def setup
@ecookbook = Project.find(1)
@ecookbook_sub1 = Project.find(3)
end
def test_truth
assert_kind_of Project, @ecookbook
assert_equal "eCookbook", @ecookbook.name
end
def test_update
assert_equal "eCookbook", @ecookbook.name
@ecookbook.name = "eCook"
assert @ecookbook.save, @ecookbook.errors.full_messages.join("; ")
@ecookbook.reload
assert_equal "eCook", @ecookbook.name
end
def test_validate
@ecookbook.name = ""
assert !@ecookbook.save
assert_equal 1, @ecookbook.errors.count
Jean-Philippe Lang
Merged Rails 2.2 branch. Redmine now requires Rails 2.2.2....
r2430 assert_equal I18n.translate('activerecord.errors.messages.blank'), @ecookbook.errors.on(:name)
Jean-Philippe Lang
Added issues status changes on the activity view (initial patch by Cyril Mougel)....
r879 end
def test_archive
user = @ecookbook.members.first.user
@ecookbook.archive
@ecookbook.reload
assert !@ecookbook.active?
assert !user.projects.include?(@ecookbook)
# Subproject are also archived
assert !@ecookbook.children.empty?
Jean-Philippe Lang
Merged nested projects branch. Removes limit on subproject nesting (#594)....
r2302 assert @ecookbook.descendants.active.empty?
Jean-Philippe Lang
Added issues status changes on the activity view (initial patch by Cyril Mougel)....
r879 end
def test_unarchive
user = @ecookbook.members.first.user
@ecookbook.archive
# A subproject of an archived project can not be unarchived
assert !@ecookbook_sub1.unarchive
# Unarchive project
assert @ecookbook.unarchive
@ecookbook.reload
assert @ecookbook.active?
assert user.projects.include?(@ecookbook)
# Subproject can now be unarchived
@ecookbook_sub1.reload
assert @ecookbook_sub1.unarchive
end
def test_destroy
Jean-Philippe Lang
Merged Rails 2.0 compatibility changes....
r962 # 2 active members
assert_equal 2, @ecookbook.members.size
# and 1 is locked
assert_equal 3, Member.find(:all, :conditions => ['project_id = ?', @ecookbook.id]).size
Jean-Philippe Lang
Fixed: Boards are not deleted when project is deleted (closes #963)....
r1301 # some boards
assert @ecookbook.boards.any?
Jean-Philippe Lang
Merged Rails 2.0 compatibility changes....
r962
Jean-Philippe Lang
Added issues status changes on the activity view (initial patch by Cyril Mougel)....
r879 @ecookbook.destroy
Jean-Philippe Lang
Merged Rails 2.0 compatibility changes....
r962 # make sure that the project non longer exists
Jean-Philippe Lang
Added issues status changes on the activity view (initial patch by Cyril Mougel)....
r879 assert_raise(ActiveRecord::RecordNotFound) { Project.find(@ecookbook.id) }
Jean-Philippe Lang
Fixed: Boards are not deleted when project is deleted (closes #963)....
r1301 # make sure related data was removed
assert Member.find(:all, :conditions => ['project_id = ?', @ecookbook.id]).empty?
assert Board.find(:all, :conditions => ['project_id = ?', @ecookbook.id]).empty?
Jean-Philippe Lang
Added issues status changes on the activity view (initial patch by Cyril Mougel)....
r879 end
Jean-Philippe Lang
Merged nested projects branch. Removes limit on subproject nesting (#594)....
r2302 def test_move_an_orphan_project_to_a_root_project
Jean-Philippe Lang
Added issues status changes on the activity view (initial patch by Cyril Mougel)....
r879 sub = Project.find(2)
Jean-Philippe Lang
Merged nested projects branch. Removes limit on subproject nesting (#594)....
r2302 sub.set_parent! @ecookbook
Jean-Philippe Lang
Added issues status changes on the activity view (initial patch by Cyril Mougel)....
r879 assert_equal @ecookbook.id, sub.parent.id
@ecookbook.reload
Jean-Philippe Lang
Fixed: private subprojects names are revealed on the project overview (#1152)....
r1384 assert_equal 4, @ecookbook.children.size
Jean-Philippe Lang
Added issues status changes on the activity view (initial patch by Cyril Mougel)....
r879 end
Jean-Philippe Lang
Merged nested projects branch. Removes limit on subproject nesting (#594)....
r2302 def test_move_an_orphan_project_to_a_subproject
Jean-Philippe Lang
Added issues status changes on the activity view (initial patch by Cyril Mougel)....
r879 sub = Project.find(2)
Jean-Philippe Lang
Merged nested projects branch. Removes limit on subproject nesting (#594)....
r2302 assert sub.set_parent!(@ecookbook_sub1)
end
def test_move_a_root_project_to_a_project
sub = @ecookbook
assert sub.set_parent!(Project.find(2))
Jean-Philippe Lang
Added issues status changes on the activity view (initial patch by Cyril Mougel)....
r879 end
Jean-Philippe Lang
Merged nested projects branch. Removes limit on subproject nesting (#594)....
r2302 def test_should_not_move_a_project_to_its_children
Jean-Philippe Lang
Added issues status changes on the activity view (initial patch by Cyril Mougel)....
r879 sub = @ecookbook
Jean-Philippe Lang
Merged nested projects branch. Removes limit on subproject nesting (#594)....
r2302 assert !(sub.set_parent!(Project.find(3)))
end
def test_set_parent_should_add_roots_in_alphabetical_order
ProjectCustomField.delete_all
Project.delete_all
Project.create!(:name => 'Project C', :identifier => 'project-c').set_parent!(nil)
Project.create!(:name => 'Project B', :identifier => 'project-b').set_parent!(nil)
Project.create!(:name => 'Project D', :identifier => 'project-d').set_parent!(nil)
Project.create!(:name => 'Project A', :identifier => 'project-a').set_parent!(nil)
assert_equal 4, Project.count
assert_equal Project.all.sort_by(&:name), Project.all.sort_by(&:lft)
end
def test_set_parent_should_add_children_in_alphabetical_order
ProjectCustomField.delete_all
parent = Project.create!(:name => 'Parent', :identifier => 'parent')
Project.create!(:name => 'Project C', :identifier => 'project-c').set_parent!(parent)
Project.create!(:name => 'Project B', :identifier => 'project-b').set_parent!(parent)
Project.create!(:name => 'Project D', :identifier => 'project-d').set_parent!(parent)
Project.create!(:name => 'Project A', :identifier => 'project-a').set_parent!(parent)
parent.reload
assert_equal 4, parent.children.size
assert_equal parent.children.sort_by(&:name), parent.children
end
def test_rebuild_should_sort_children_alphabetically
ProjectCustomField.delete_all
parent = Project.create!(:name => 'Parent', :identifier => 'parent')
Project.create!(:name => 'Project C', :identifier => 'project-c').move_to_child_of(parent)
Project.create!(:name => 'Project B', :identifier => 'project-b').move_to_child_of(parent)
Project.create!(:name => 'Project D', :identifier => 'project-d').move_to_child_of(parent)
Project.create!(:name => 'Project A', :identifier => 'project-a').move_to_child_of(parent)
Project.update_all("lft = NULL, rgt = NULL")
Project.rebuild!
parent.reload
assert_equal 4, parent.children.size
assert_equal parent.children.sort_by(&:name), parent.children
end
def test_parent
p = Project.find(6).parent
assert p.is_a?(Project)
assert_equal 5, p.id
end
def test_ancestors
a = Project.find(6).ancestors
assert a.first.is_a?(Project)
assert_equal [1, 5], a.collect(&:id)
end
def test_root
r = Project.find(6).root
assert r.is_a?(Project)
assert_equal 1, r.id
end
def test_children
c = Project.find(1).children
assert c.first.is_a?(Project)
assert_equal [5, 3, 4], c.collect(&:id)
end
def test_descendants
d = Project.find(1).descendants
assert d.first.is_a?(Project)
assert_equal [5, 6, 3, 4], d.collect(&:id)
Jean-Philippe Lang
Added issues status changes on the activity view (initial patch by Cyril Mougel)....
r879 end
Jean-Philippe Lang
On the calendar, the gantt and in the Tracker filter on the issue list, only active trackers of the project (and its sub projects) can be selected....
r1057
def test_rolled_up_trackers
parent = Project.find(1)
Jean-Philippe Lang
Fixes test broken by r1610....
r1602 parent.trackers = Tracker.find([1,2])
Jean-Philippe Lang
On the calendar, the gantt and in the Tracker filter on the issue list, only active trackers of the project (and its sub projects) can be selected....
r1057 child = parent.children.find(3)
assert_equal [1, 2], parent.tracker_ids
Jean-Philippe Lang
Merged Rails 2.2 branch. Redmine now requires Rails 2.2.2....
r2430 assert_equal [2, 3], child.trackers.collect(&:id)
Jean-Philippe Lang
On the calendar, the gantt and in the Tracker filter on the issue list, only active trackers of the project (and its sub projects) can be selected....
r1057
assert_kind_of Tracker, parent.rolled_up_trackers.first
assert_equal Tracker.find(1), parent.rolled_up_trackers.first
assert_equal [1, 2, 3], parent.rolled_up_trackers.collect(&:id)
assert_equal [2, 3], child.rolled_up_trackers.collect(&:id)
end
Jean-Philippe Lang
Adds an option to generate sequential project identifiers....
r1776
Jean-Philippe Lang
Ignore archived subprojects in Project#rolled_up_trackers (#2550)....
r2309 def test_rolled_up_trackers_should_ignore_archived_subprojects
parent = Project.find(1)
parent.trackers = Tracker.find([1,2])
child = parent.children.find(3)
child.trackers = Tracker.find([1,3])
parent.children.each(&:archive)
assert_equal [1,2], parent.rolled_up_trackers.collect(&:id)
end
Jean-Philippe Lang
Adds an option to generate sequential project identifiers....
r1776 def test_next_identifier
ProjectCustomField.delete_all
Project.create!(:name => 'last', :identifier => 'p2008040')
assert_equal 'p2008041', Project.next_identifier
end
def test_next_identifier_first_project
Project.delete_all
assert_nil Project.next_identifier
end
Jean-Philippe Lang
Do not DELETE/INSERT enabled_modules when updating project modules....
r2412
Eric Davis
Added the ability to copy a project in the Project Administration panel....
r2608
Jean-Philippe Lang
Do not DELETE/INSERT enabled_modules when updating project modules....
r2412 def test_enabled_module_names_should_not_recreate_enabled_modules
project = Project.find(1)
# Remove one module
modules = project.enabled_modules.slice(0..-2)
assert modules.any?
assert_difference 'EnabledModule.count', -1 do
project.enabled_module_names = modules.collect(&:name)
end
project.reload
# Ids should be preserved
assert_equal project.enabled_module_ids.sort, modules.collect(&:id).sort
end
Eric Davis
Added the ability to copy a project in the Project Administration panel....
r2608
def test_copy_from_existing_project
source_project = Project.find(1)
copied_project = Project.copy_from(1)
assert copied_project
# Cleared attributes
assert copied_project.id.blank?
assert copied_project.name.blank?
assert copied_project.identifier.blank?
# Duplicated attributes
assert_equal source_project.description, copied_project.description
assert_equal source_project.enabled_modules, copied_project.enabled_modules
assert_equal source_project.trackers, copied_project.trackers
# Default attributes
assert_equal 1, copied_project.status
end
# Context: Project#copy
def test_copy_should_copy_issues
# Setup
ProjectCustomField.destroy_all # Custom values are a mess to isolate in tests
source_project = Project.find(2)
Project.destroy_all :identifier => "copy-test"
project = Project.new(:name => 'Copy Test', :identifier => 'copy-test')
project.trackers = source_project.trackers
assert project.valid?
assert project.issues.empty?
assert project.copy(source_project)
# Tests
assert_equal source_project.issues.size, project.issues.size
project.issues.each do |issue|
assert issue.valid?
assert ! issue.assigned_to.blank?
assert_equal project, issue.project
end
end
def test_copy_should_copy_members
# Setup
ProjectCustomField.destroy_all # Custom values are a mess to isolate in tests
source_project = Project.find(2)
project = Project.new(:name => 'Copy Test', :identifier => 'copy-test')
project.trackers = source_project.trackers
project.enabled_modules = source_project.enabled_modules
assert project.valid?
assert project.members.empty?
assert project.copy(source_project)
# Tests
assert_equal source_project.members.size, project.members.size
project.members.each do |member|
assert member
assert_equal project, member.project
end
end
def test_copy_should_copy_project_level_queries
# Setup
ProjectCustomField.destroy_all # Custom values are a mess to isolate in tests
source_project = Project.find(2)
project = Project.new(:name => 'Copy Test', :identifier => 'copy-test')
project.trackers = source_project.trackers
project.enabled_modules = source_project.enabled_modules
assert project.valid?
assert project.queries.empty?
assert project.copy(source_project)
# Tests
assert_equal source_project.queries.size, project.queries.size
project.queries.each do |query|
assert query
assert_equal project, query.project
end
end
Jean-Philippe Lang
Added issues status changes on the activity view (initial patch by Cyril Mougel)....
r879 end