# 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.
@ecookbook_sub1 = Project.find(3)
User.current = nil
end
-
+
should_validate_presence_of :name
should_validate_presence_of :identifier
assert_kind_of Project, @ecookbook
assert_equal "eCookbook", @ecookbook.name
end
-
+
def test_default_attributes
with_settings :default_projects_public => '1' do
assert_equal true, Project.new.is_public
with_settings :default_projects_modules => ['issue_tracking', 'repository'] do
assert_equal ['issue_tracking', 'repository'], Project.new.enabled_module_names
end
-
+
assert_equal Tracker.all, Project.new.trackers
assert_equal Tracker.find(1, 3), Project.new(:tracker_ids => [1, 3]).trackers
end
-
+
def test_update
assert_equal "eCookbook", @ecookbook.name
@ecookbook.name = "eCook"
@ecookbook.reload
assert_equal "eCook", @ecookbook.name
end
-
+
def test_validate_identifier
to_test = {"abc" => true,
"ab12" => true,
"ab-12" => true,
"12" => false,
"new" => false}
-
+
to_test.each do |identifier, valid|
p = Project.new
p.identifier = identifier
assert_nil project.members.detect {|m| !(m.user.is_a?(User) && m.user.active?) }
end
end
-
+
def test_users_should_be_active_users
Project.all.each do |project|
assert_nil project.users.detect {|u| !(u.is_a?(User) && u.active?) }
end
end
-
+
def test_archive
user = @ecookbook.members.first.user
@ecookbook.archive
@ecookbook.reload
-
+
assert !@ecookbook.active?
assert @ecookbook.archived?
assert !user.projects.include?(@ecookbook)
assert !@ecookbook.children.empty?
assert @ecookbook.descendants.active.empty?
end
-
+
def test_archive_should_fail_if_versions_are_used_by_non_descendant_projects
# Assign an issue of a project to a version of a child project
Issue.find(4).update_attribute :fixed_version_id, 4
-
+
assert_no_difference "Project.count(:all, :conditions => 'status = #{Project::STATUS_ARCHIVED}')" do
assert_equal false, @ecookbook.archive
end
@ecookbook.reload
assert @ecookbook.active?
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
@ecookbook_sub1.reload
assert @ecookbook_sub1.unarchive
end
-
+
def test_destroy
# 2 active members
assert_equal 2, @ecookbook.members.size
assert_equal 3, Member.find(:all, :conditions => ['project_id = ?', @ecookbook.id]).size
# some boards
assert @ecookbook.boards.any?
-
+
@ecookbook.destroy
# make sure that the project non longer exists
assert_raise(ActiveRecord::RecordNotFound) { Project.find(@ecookbook.id) }
assert_nil Board.first(:conditions => {:project_id => @ecookbook.id})
assert_nil Issue.first(:conditions => {:project_id => @ecookbook.id})
end
-
+
def test_destroying_root_projects_should_clear_data
Project.roots.each do |root|
root.destroy
end
-
+
assert_equal 0, Project.count, "Projects were not deleted: #{Project.all.inspect}"
assert_equal 0, Member.count, "Members were not deleted: #{Member.all.inspect}"
assert_equal 0, MemberRole.count
assert_equal 0, Project.connection.select_all("SELECT * FROM custom_fields_projects").size
assert_equal 0, CustomValue.count(:conditions => {:customized_type => ['Project', 'Issue', 'TimeEntry', 'Version']})
end
-
+
def test_move_an_orphan_project_to_a_root_project
sub = Project.find(2)
sub.set_parent! @ecookbook
@ecookbook.reload
assert_equal 4, @ecookbook.children.size
end
-
+
def test_move_an_orphan_project_to_a_subproject
sub = Project.find(2)
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))
end
-
+
def test_should_not_move_a_project_to_its_children
sub = @ecookbook
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 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 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 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
issue_with_hierarchy_fixed_version.update_attribute(:fixed_version_id, 6)
issue_with_hierarchy_fixed_version.reload
assert_equal 6, issue_with_hierarchy_fixed_version.fixed_version_id
-
+
# Move project out of the issue's hierarchy
moved_project = Project.find(3)
moved_project.set_parent!(Project.find(2))
parent_issue.reload
issue_with_local_fixed_version.reload
issue_with_hierarchy_fixed_version.reload
-
+
assert_equal 4, issue_with_local_fixed_version.fixed_version_id, "Fixed version was not keep on an issue local to the moved project"
assert_equal nil, issue_with_hierarchy_fixed_version.fixed_version_id, "Fixed version is still set after moving the Project out of the hierarchy where the version is defined in"
assert_equal nil, parent_issue.fixed_version_id, "Fixed version is still set after moving the Version out of the hierarchy for the issue."
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)
end
-
+
def test_allowed_parents_should_be_empty_for_non_member_user
Role.non_member.add_permission!(:add_project)
user = User.find(9)
User.current = user
assert Project.new.allowed_parents.compact.empty?
end
-
+
def test_allowed_parents_with_add_subprojects_permission
Role.find(1).remove_permission!(:add_project)
Role.find(1).add_permission!(:add_subprojects)
assert Project.find(3).allowed_parents.include?(Project.find(1))
assert Project.find(3).allowed_parents.include?(nil)
end
-
+
def test_users_by_role
users_by_role = Project.find(1).users_by_role
assert_kind_of Hash, users_by_role
assert_kind_of Array, users_by_role[role]
assert users_by_role[role].include?(User.find(2))
end
-
+
def test_rolled_up_trackers
parent = Project.find(1)
parent.trackers = Tracker.find([1,2])
child = parent.children.find(3)
-
+
assert_equal [1, 2], parent.tracker_ids
assert_equal [2, 3], child.trackers.collect(&:id)
-
+
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
-
+
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
@parent_version_1 = Version.generate!(:project => @project)
@parent_version_2 = Version.generate!(:project => @project)
end
-
+
should "include the versions for the current project" do
assert_same_elements [@parent_version_1, @parent_version_2], @project.rolled_up_versions
end
-
+
should "include versions for a subproject" do
@subproject = Project.generate!
@subproject.set_parent!(@project)
@subproject_version
], @project.rolled_up_versions
end
-
+
should "include versions for a sub-subproject" do
@subproject = Project.generate!
@subproject.set_parent!(@project)
], @project.rolled_up_versions
end
-
should "only check active projects" do
@subproject = Project.generate!
@subproject.set_parent!(@project)
assert_same_elements [@parent_version_1, @parent_version_2], @project.rolled_up_versions
end
end
-
+
def test_shared_versions_none_sharing
p = Project.find(5)
v = Version.create!(:name => 'none_sharing', :project => p, :sharing => 'none')
assert !p.siblings.first.shared_versions.include?(v)
assert !p.root.siblings.first.shared_versions.include?(v)
end
-
+
def test_shared_versions_hierarchy_sharing
p = Project.find(5)
v = Version.create!(:name => 'hierarchy_sharing', :project => p, :sharing => 'hierarchy')
parent = Project.find(1)
child = parent.children.find(3)
private_child = parent.children.find(5)
-
+
assert_equal [1,2,3], parent.version_ids.sort
assert_equal [4], child.version_ids
assert_equal [6], private_child.version_ids
child = parent.children.find(3)
child.archive
parent.reload
-
+
assert_equal [1,2,3], parent.version_ids.sort
assert_equal [4], child.version_ids
assert !parent.shared_versions.collect(&:id).include?(4)
user = User.find(3)
parent = Project.find(1)
child = parent.children.find(5)
-
+
assert_equal [1,2,3], parent.version_ids.sort
assert_equal [6], child.version_ids
versions = parent.shared_versions.visible(user)
-
+
assert_equal 4, versions.size
versions.each do |version|
assert_kind_of Version, version
assert !versions.collect(&:id).include?(6)
end
-
def test_next_identifier
ProjectCustomField.delete_all
Project.create!(:name => 'last', :identifier => 'p2008040')
Project.delete_all
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
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 system_activity.active?
overridden_activity = TimeEntryActivity.generate!(:project => project, :parent => system_activity, :active => false)
assert overridden_activity.save!
-
+
assert !project.activities.include?(overridden_activity), "Inactive Project specific Activity not found"
assert !project.activities.include?(system_activity), "System activity found when the project has an inactive override"
end
-
+
def test_close_completed_versions
Version.update_all("status = 'open'")
project = Project.find(1)
assert ! issue.assigned_to.blank?
assert_equal @project, issue.project
end
-
+
copied_issue = @project.issues.first(:conditions => {:subject => "copy issue status"})
assert copied_issue
assert copied_issue.status
:subject => "change the new issues to use the copied version",
:tracker_id => 1,
:project_id => @source_project.id)
-
+
assert @project.copy(@source_project)
@project.reload
copied_issue = @project.issues.first(:conditions => {:subject => "change the new issues to use the copied version"})
assert_equal @project, membership.project
end
end
-
+
should "copy memberships with groups and additional roles" do
group = Group.create!(:lastname => "Copy group")
- user = User.find(7)
+ user = User.find(7)
group.users << user
# group role
Member.create!(:project_id => @source_project.id, :principal => group, :role_ids => [2])
assert_difference 'WikiPage.count', @source_project.wiki.pages.size do
assert @project.copy(@source_project)
end
-
+
assert @project.wiki
assert_equal @source_project.wiki.pages.size, @project.wiki.pages.size
assert wiki_page.content
assert !@source_project.wiki.pages.include?(wiki_page)
end
-
+
parent = @project.wiki.find_page('Parent_page')
child1 = @project.wiki.find_page('Child_page_1')
child2 = @project.wiki.find_page('Child_page_2')
assert_not_equal IssueCategory.find(3), issue.category # Different record
end
end
-
+
should "limit copy with :only option" do
assert @project.members.empty?
assert @project.issue_categories.empty?
assert @source_project.issues.any?
-
+
assert @project.copy(@source_project, :only => ['members', 'issue_categories'])
assert @project.members.any?
assert @project.issue_categories.any?
assert @project.issues.empty?
end
-
+
end
context "#start_date" do
@project = Project.generate!(:identifier => 'test0')
@project.trackers << Tracker.generate!
end
-
+
should "be nil if there are no issues on the project" do
assert_nil @project.start_date
end
-
+
should "be tested when issues have no start date"
should "be the earliest start date of it's issues" do
@project = Project.generate!(:identifier => 'test0')
@project.trackers << Tracker.generate!
end
-
+
should "be nil if there are no issues on the project" do
assert_nil @project.due_date
end
-
+
should "be tested when issues have no due date"
should "be the latest due date of it's issues" do
future = 7.days.from_now.to_date
@project.versions << Version.generate!(:effective_date => future)
@project.versions << Version.generate!(:effective_date => Date.today)
-
+
assert_equal future, @project.due_date
far_future = 14.days.from_now.to_date
Issue.generate_for_project!(@project, :due_date => far_future)
@project.versions << Version.generate!(:effective_date => future)
-
+
assert_equal far_future, @project.due_date
end
setup do
@project = Project.generate!
@role = Role.generate!
-
+
@user_with_membership_notification = User.generate!(:mail_notification => 'selected')
Member.generate!(:project => @project, :roles => [@role], :principal => @user_with_membership_notification, :mail_notification => true)
@only_owned_user = User.generate!(:mail_notification => 'only_owner')
Member.generate!(:project => @project, :roles => [@role], :principal => @only_owned_user)
end
-
+
should "include members with a mail notification" do
assert @project.notified_users.include?(@user_with_membership_notification)
end
-
+
should "include users with the 'all' notification option" do
assert @project.notified_users.include?(@all_events_user)
end
-
+
should "not include users with the 'none' notification option" do
assert !@project.notified_users.include?(@no_events_user)
end
-
+
should "not include users with the 'only_my_events' notification option" do
assert !@project.notified_users.include?(@only_my_events_user)
end
-
+
should "not include users with the 'only_assigned' notification option" do
assert !@project.notified_users.include?(@only_assigned_user)
end
-
+
should "not include users with the 'only_owner' notification option" do
assert !@project.notified_users.include?(@only_owned_user)
end
end
-
+
end