##// END OF EJS Templates
Updated object_daddy to a newer version (bugfixes)...
Eric Davis -
r3284:81ee2ff884c8
parent child
Show More
@@ -1,29 +1,29
1 # Settings specified here will take precedence over those in config/environment.rb
1 # Settings specified here will take precedence over those in config/environment.rb
2
2
3 # The test environment is used exclusively to run your application's
3 # The test environment is used exclusively to run your application's
4 # test suite. You never need to work with it otherwise. Remember that
4 # test suite. You never need to work with it otherwise. Remember that
5 # your test database is "scratch space" for the test suite and is wiped
5 # your test database is "scratch space" for the test suite and is wiped
6 # and recreated between test runs. Don't rely on the data there!
6 # and recreated between test runs. Don't rely on the data there!
7 config.cache_classes = true
7 config.cache_classes = true
8
8
9 # Log error messages when you accidentally call methods on nil.
9 # Log error messages when you accidentally call methods on nil.
10 config.whiny_nils = true
10 config.whiny_nils = true
11
11
12 # Show full error reports and disable caching
12 # Show full error reports and disable caching
13 config.action_controller.consider_all_requests_local = true
13 config.action_controller.consider_all_requests_local = true
14 config.action_controller.perform_caching = false
14 config.action_controller.perform_caching = false
15
15
16 config.action_mailer.perform_deliveries = true
16 config.action_mailer.perform_deliveries = true
17 config.action_mailer.delivery_method = :test
17 config.action_mailer.delivery_method = :test
18
18
19 config.action_controller.session = {
19 config.action_controller.session = {
20 :session_key => "_test_session",
20 :session_key => "_test_session",
21 :secret => "some secret phrase for the tests."
21 :secret => "some secret phrase for the tests."
22 }
22 }
23
23
24 # Skip protect_from_forgery in requests http://m.onkey.org/2007/9/28/csrf-protection-for-your-existing-rails-application
24 # Skip protect_from_forgery in requests http://m.onkey.org/2007/9/28/csrf-protection-for-your-existing-rails-application
25 config.action_controller.allow_forgery_protection = false
25 config.action_controller.allow_forgery_protection = false
26
26
27 config.gem "thoughtbot-shoulda", :lib => "shoulda", :source => "http://gems.github.com"
27 config.gem "thoughtbot-shoulda", :lib => "shoulda", :source => "http://gems.github.com"
28 config.gem "nofxx-object_daddy", :lib => "object_daddy", :source => "http://gems.github.com"
28 config.gem "edavis10-object_daddy", :lib => "object_daddy"
29 config.gem "mocha"
29 config.gem "mocha"
@@ -1,15 +1,20
1 class Issue < ActiveRecord::Base
1 class Issue < ActiveRecord::Base
2 generator_for :subject, :method => :next_subject
2 generator_for :subject, :method => :next_subject
3 generator_for :author, :method => :next_author
3 generator_for :author, :method => :next_author
4 generator_for :priority, :method => :fetch_priority
4
5
5 def self.next_subject
6 def self.next_subject
6 @last_subject ||= 'Subject 0'
7 @last_subject ||= 'Subject 0'
7 @last_subject.succ!
8 @last_subject.succ!
8 @last_subject
9 @last_subject
9 end
10 end
10
11
11 def self.next_author
12 def self.next_author
12 User.generate_with_protected!
13 User.generate_with_protected!
13 end
14 end
14
15
16 def self.fetch_priority
17 IssuePriority.first || IssuePriority.generate!
18 end
19
15 end
20 end
@@ -1,48 +1,34
1 module ObjectDaddyHelpers
1 module ObjectDaddyHelpers
2 # TODO: The gem or official version of ObjectDaddy doesn't set
2 # TODO: Remove these three once everyone has ported their code to use the
3 # protected attributes so they need to be wrapped.
3 # new object_daddy version with protected attribute support
4 def User.generate_with_protected(attributes={})
4 def User.generate_with_protected(attributes={})
5 user = User.spawn_with_protected(attributes)
5 User.generate(attributes)
6 user.save
7 user
8 end
6 end
9
7
10 # TODO: The gem or official version of ObjectDaddy doesn't set
11 # protected attributes so they need to be wrapped.
12 def User.generate_with_protected!(attributes={})
8 def User.generate_with_protected!(attributes={})
13 user = User.spawn_with_protected(attributes)
9 User.generate!(attributes)
14 user.save!
15 user
16 end
10 end
17
11
18 # TODO: The gem or official version of ObjectDaddy doesn't set
19 # protected attributes so they need to be wrapped.
20 def User.spawn_with_protected(attributes={})
12 def User.spawn_with_protected(attributes={})
21 user = User.spawn(attributes) do |user|
13 User.spawn(attributes)
22 user.login = User.next_login
23 attributes.each do |attr,v|
24 user.send("#{attr}=", v)
25 end
26 end
27 user
28 end
14 end
29
15
30 # Generate the default Query
16 # Generate the default Query
31 def Query.generate_default!(attributes={})
17 def Query.generate_default!(attributes={})
32 query = Query.spawn(attributes)
18 query = Query.spawn(attributes)
33 query.name ||= '_'
19 query.name ||= '_'
34 query.save!
20 query.save!
35 query
21 query
36 end
22 end
37
23
38 # Generate an issue for a project, using it's trackers
24 # Generate an issue for a project, using it's trackers
39 def Issue.generate_for_project!(project, attributes={})
25 def Issue.generate_for_project!(project, attributes={})
40 issue = Issue.spawn(attributes) do |issue|
26 issue = Issue.spawn(attributes) do |issue|
41 issue.project = project
27 issue.project = project
42 end
28 end
43 issue.tracker = project.trackers.first unless project.trackers.empty?
29 issue.tracker = project.trackers.first unless project.trackers.empty?
44 issue.save!
30 issue.save!
45 issue
31 issue
46 end
32 end
47
33
48 end
34 end
@@ -1,741 +1,741
1 # redMine - project management software
1 # redMine - project management software
2 # Copyright (C) 2006-2007 Jean-Philippe Lang
2 # Copyright (C) 2006-2007 Jean-Philippe Lang
3 #
3 #
4 # This program is free software; you can redistribute it and/or
4 # This program is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU General Public License
5 # modify it under the terms of the GNU General Public License
6 # as published by the Free Software Foundation; either version 2
6 # as published by the Free Software Foundation; either version 2
7 # of the License, or (at your option) any later version.
7 # of the License, or (at your option) any later version.
8 #
8 #
9 # This program is distributed in the hope that it will be useful,
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
12 # GNU General Public License for more details.
13 #
13 #
14 # You should have received a copy of the GNU General Public License
14 # You should have received a copy of the GNU General Public License
15 # along with this program; if not, write to the Free Software
15 # along with this program; if not, write to the Free Software
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17
17
18 require File.dirname(__FILE__) + '/../test_helper'
18 require File.dirname(__FILE__) + '/../test_helper'
19
19
20 class ProjectTest < ActiveSupport::TestCase
20 class ProjectTest < ActiveSupport::TestCase
21 fixtures :all
21 fixtures :all
22
22
23 def setup
23 def setup
24 @ecookbook = Project.find(1)
24 @ecookbook = Project.find(1)
25 @ecookbook_sub1 = Project.find(3)
25 @ecookbook_sub1 = Project.find(3)
26 User.current = nil
26 User.current = nil
27 end
27 end
28
28
29 should_validate_presence_of :name
29 should_validate_presence_of :name
30 should_validate_presence_of :identifier
30 should_validate_presence_of :identifier
31
31
32 should_validate_uniqueness_of :name
32 should_validate_uniqueness_of :name
33 should_validate_uniqueness_of :identifier
33 should_validate_uniqueness_of :identifier
34
34
35 context "associations" do
35 context "associations" do
36 should_have_many :members
36 should_have_many :members
37 should_have_many :users, :through => :members
37 should_have_many :users, :through => :members
38 should_have_many :member_principals
38 should_have_many :member_principals
39 should_have_many :principals, :through => :member_principals
39 should_have_many :principals, :through => :member_principals
40 should_have_many :enabled_modules
40 should_have_many :enabled_modules
41 should_have_many :issues
41 should_have_many :issues
42 should_have_many :issue_changes, :through => :issues
42 should_have_many :issue_changes, :through => :issues
43 should_have_many :versions
43 should_have_many :versions
44 should_have_many :time_entries
44 should_have_many :time_entries
45 should_have_many :queries
45 should_have_many :queries
46 should_have_many :documents
46 should_have_many :documents
47 should_have_many :news
47 should_have_many :news
48 should_have_many :issue_categories
48 should_have_many :issue_categories
49 should_have_many :boards
49 should_have_many :boards
50 should_have_many :changesets, :through => :repository
50 should_have_many :changesets, :through => :repository
51
51
52 should_have_one :repository
52 should_have_one :repository
53 should_have_one :wiki
53 should_have_one :wiki
54
54
55 should_have_and_belong_to_many :trackers
55 should_have_and_belong_to_many :trackers
56 should_have_and_belong_to_many :issue_custom_fields
56 should_have_and_belong_to_many :issue_custom_fields
57 end
57 end
58
58
59 def test_truth
59 def test_truth
60 assert_kind_of Project, @ecookbook
60 assert_kind_of Project, @ecookbook
61 assert_equal "eCookbook", @ecookbook.name
61 assert_equal "eCookbook", @ecookbook.name
62 end
62 end
63
63
64 def test_update
64 def test_update
65 assert_equal "eCookbook", @ecookbook.name
65 assert_equal "eCookbook", @ecookbook.name
66 @ecookbook.name = "eCook"
66 @ecookbook.name = "eCook"
67 assert @ecookbook.save, @ecookbook.errors.full_messages.join("; ")
67 assert @ecookbook.save, @ecookbook.errors.full_messages.join("; ")
68 @ecookbook.reload
68 @ecookbook.reload
69 assert_equal "eCook", @ecookbook.name
69 assert_equal "eCook", @ecookbook.name
70 end
70 end
71
71
72 def test_validate_identifier
72 def test_validate_identifier
73 to_test = {"abc" => true,
73 to_test = {"abc" => true,
74 "ab12" => true,
74 "ab12" => true,
75 "ab-12" => true,
75 "ab-12" => true,
76 "12" => false,
76 "12" => false,
77 "new" => false}
77 "new" => false}
78
78
79 to_test.each do |identifier, valid|
79 to_test.each do |identifier, valid|
80 p = Project.new
80 p = Project.new
81 p.identifier = identifier
81 p.identifier = identifier
82 p.valid?
82 p.valid?
83 assert_equal valid, p.errors.on('identifier').nil?
83 assert_equal valid, p.errors.on('identifier').nil?
84 end
84 end
85 end
85 end
86
86
87 def test_members_should_be_active_users
87 def test_members_should_be_active_users
88 Project.all.each do |project|
88 Project.all.each do |project|
89 assert_nil project.members.detect {|m| !(m.user.is_a?(User) && m.user.active?) }
89 assert_nil project.members.detect {|m| !(m.user.is_a?(User) && m.user.active?) }
90 end
90 end
91 end
91 end
92
92
93 def test_users_should_be_active_users
93 def test_users_should_be_active_users
94 Project.all.each do |project|
94 Project.all.each do |project|
95 assert_nil project.users.detect {|u| !(u.is_a?(User) && u.active?) }
95 assert_nil project.users.detect {|u| !(u.is_a?(User) && u.active?) }
96 end
96 end
97 end
97 end
98
98
99 def test_archive
99 def test_archive
100 user = @ecookbook.members.first.user
100 user = @ecookbook.members.first.user
101 @ecookbook.archive
101 @ecookbook.archive
102 @ecookbook.reload
102 @ecookbook.reload
103
103
104 assert !@ecookbook.active?
104 assert !@ecookbook.active?
105 assert !user.projects.include?(@ecookbook)
105 assert !user.projects.include?(@ecookbook)
106 # Subproject are also archived
106 # Subproject are also archived
107 assert !@ecookbook.children.empty?
107 assert !@ecookbook.children.empty?
108 assert @ecookbook.descendants.active.empty?
108 assert @ecookbook.descendants.active.empty?
109 end
109 end
110
110
111 def test_archive_should_fail_if_versions_are_used_by_non_descendant_projects
111 def test_archive_should_fail_if_versions_are_used_by_non_descendant_projects
112 # Assign an issue of a project to a version of a child project
112 # Assign an issue of a project to a version of a child project
113 Issue.find(4).update_attribute :fixed_version_id, 4
113 Issue.find(4).update_attribute :fixed_version_id, 4
114
114
115 assert_no_difference "Project.count(:all, :conditions => 'status = #{Project::STATUS_ARCHIVED}')" do
115 assert_no_difference "Project.count(:all, :conditions => 'status = #{Project::STATUS_ARCHIVED}')" do
116 assert_equal false, @ecookbook.archive
116 assert_equal false, @ecookbook.archive
117 end
117 end
118 @ecookbook.reload
118 @ecookbook.reload
119 assert @ecookbook.active?
119 assert @ecookbook.active?
120 end
120 end
121
121
122 def test_unarchive
122 def test_unarchive
123 user = @ecookbook.members.first.user
123 user = @ecookbook.members.first.user
124 @ecookbook.archive
124 @ecookbook.archive
125 # A subproject of an archived project can not be unarchived
125 # A subproject of an archived project can not be unarchived
126 assert !@ecookbook_sub1.unarchive
126 assert !@ecookbook_sub1.unarchive
127
127
128 # Unarchive project
128 # Unarchive project
129 assert @ecookbook.unarchive
129 assert @ecookbook.unarchive
130 @ecookbook.reload
130 @ecookbook.reload
131 assert @ecookbook.active?
131 assert @ecookbook.active?
132 assert user.projects.include?(@ecookbook)
132 assert user.projects.include?(@ecookbook)
133 # Subproject can now be unarchived
133 # Subproject can now be unarchived
134 @ecookbook_sub1.reload
134 @ecookbook_sub1.reload
135 assert @ecookbook_sub1.unarchive
135 assert @ecookbook_sub1.unarchive
136 end
136 end
137
137
138 def test_destroy
138 def test_destroy
139 # 2 active members
139 # 2 active members
140 assert_equal 2, @ecookbook.members.size
140 assert_equal 2, @ecookbook.members.size
141 # and 1 is locked
141 # and 1 is locked
142 assert_equal 3, Member.find(:all, :conditions => ['project_id = ?', @ecookbook.id]).size
142 assert_equal 3, Member.find(:all, :conditions => ['project_id = ?', @ecookbook.id]).size
143 # some boards
143 # some boards
144 assert @ecookbook.boards.any?
144 assert @ecookbook.boards.any?
145
145
146 @ecookbook.destroy
146 @ecookbook.destroy
147 # make sure that the project non longer exists
147 # make sure that the project non longer exists
148 assert_raise(ActiveRecord::RecordNotFound) { Project.find(@ecookbook.id) }
148 assert_raise(ActiveRecord::RecordNotFound) { Project.find(@ecookbook.id) }
149 # make sure related data was removed
149 # make sure related data was removed
150 assert Member.find(:all, :conditions => ['project_id = ?', @ecookbook.id]).empty?
150 assert Member.find(:all, :conditions => ['project_id = ?', @ecookbook.id]).empty?
151 assert Board.find(:all, :conditions => ['project_id = ?', @ecookbook.id]).empty?
151 assert Board.find(:all, :conditions => ['project_id = ?', @ecookbook.id]).empty?
152 end
152 end
153
153
154 def test_move_an_orphan_project_to_a_root_project
154 def test_move_an_orphan_project_to_a_root_project
155 sub = Project.find(2)
155 sub = Project.find(2)
156 sub.set_parent! @ecookbook
156 sub.set_parent! @ecookbook
157 assert_equal @ecookbook.id, sub.parent.id
157 assert_equal @ecookbook.id, sub.parent.id
158 @ecookbook.reload
158 @ecookbook.reload
159 assert_equal 4, @ecookbook.children.size
159 assert_equal 4, @ecookbook.children.size
160 end
160 end
161
161
162 def test_move_an_orphan_project_to_a_subproject
162 def test_move_an_orphan_project_to_a_subproject
163 sub = Project.find(2)
163 sub = Project.find(2)
164 assert sub.set_parent!(@ecookbook_sub1)
164 assert sub.set_parent!(@ecookbook_sub1)
165 end
165 end
166
166
167 def test_move_a_root_project_to_a_project
167 def test_move_a_root_project_to_a_project
168 sub = @ecookbook
168 sub = @ecookbook
169 assert sub.set_parent!(Project.find(2))
169 assert sub.set_parent!(Project.find(2))
170 end
170 end
171
171
172 def test_should_not_move_a_project_to_its_children
172 def test_should_not_move_a_project_to_its_children
173 sub = @ecookbook
173 sub = @ecookbook
174 assert !(sub.set_parent!(Project.find(3)))
174 assert !(sub.set_parent!(Project.find(3)))
175 end
175 end
176
176
177 def test_set_parent_should_add_roots_in_alphabetical_order
177 def test_set_parent_should_add_roots_in_alphabetical_order
178 ProjectCustomField.delete_all
178 ProjectCustomField.delete_all
179 Project.delete_all
179 Project.delete_all
180 Project.create!(:name => 'Project C', :identifier => 'project-c').set_parent!(nil)
180 Project.create!(:name => 'Project C', :identifier => 'project-c').set_parent!(nil)
181 Project.create!(:name => 'Project B', :identifier => 'project-b').set_parent!(nil)
181 Project.create!(:name => 'Project B', :identifier => 'project-b').set_parent!(nil)
182 Project.create!(:name => 'Project D', :identifier => 'project-d').set_parent!(nil)
182 Project.create!(:name => 'Project D', :identifier => 'project-d').set_parent!(nil)
183 Project.create!(:name => 'Project A', :identifier => 'project-a').set_parent!(nil)
183 Project.create!(:name => 'Project A', :identifier => 'project-a').set_parent!(nil)
184
184
185 assert_equal 4, Project.count
185 assert_equal 4, Project.count
186 assert_equal Project.all.sort_by(&:name), Project.all.sort_by(&:lft)
186 assert_equal Project.all.sort_by(&:name), Project.all.sort_by(&:lft)
187 end
187 end
188
188
189 def test_set_parent_should_add_children_in_alphabetical_order
189 def test_set_parent_should_add_children_in_alphabetical_order
190 ProjectCustomField.delete_all
190 ProjectCustomField.delete_all
191 parent = Project.create!(:name => 'Parent', :identifier => 'parent')
191 parent = Project.create!(:name => 'Parent', :identifier => 'parent')
192 Project.create!(:name => 'Project C', :identifier => 'project-c').set_parent!(parent)
192 Project.create!(:name => 'Project C', :identifier => 'project-c').set_parent!(parent)
193 Project.create!(:name => 'Project B', :identifier => 'project-b').set_parent!(parent)
193 Project.create!(:name => 'Project B', :identifier => 'project-b').set_parent!(parent)
194 Project.create!(:name => 'Project D', :identifier => 'project-d').set_parent!(parent)
194 Project.create!(:name => 'Project D', :identifier => 'project-d').set_parent!(parent)
195 Project.create!(:name => 'Project A', :identifier => 'project-a').set_parent!(parent)
195 Project.create!(:name => 'Project A', :identifier => 'project-a').set_parent!(parent)
196
196
197 parent.reload
197 parent.reload
198 assert_equal 4, parent.children.size
198 assert_equal 4, parent.children.size
199 assert_equal parent.children.sort_by(&:name), parent.children
199 assert_equal parent.children.sort_by(&:name), parent.children
200 end
200 end
201
201
202 def test_rebuild_should_sort_children_alphabetically
202 def test_rebuild_should_sort_children_alphabetically
203 ProjectCustomField.delete_all
203 ProjectCustomField.delete_all
204 parent = Project.create!(:name => 'Parent', :identifier => 'parent')
204 parent = Project.create!(:name => 'Parent', :identifier => 'parent')
205 Project.create!(:name => 'Project C', :identifier => 'project-c').move_to_child_of(parent)
205 Project.create!(:name => 'Project C', :identifier => 'project-c').move_to_child_of(parent)
206 Project.create!(:name => 'Project B', :identifier => 'project-b').move_to_child_of(parent)
206 Project.create!(:name => 'Project B', :identifier => 'project-b').move_to_child_of(parent)
207 Project.create!(:name => 'Project D', :identifier => 'project-d').move_to_child_of(parent)
207 Project.create!(:name => 'Project D', :identifier => 'project-d').move_to_child_of(parent)
208 Project.create!(:name => 'Project A', :identifier => 'project-a').move_to_child_of(parent)
208 Project.create!(:name => 'Project A', :identifier => 'project-a').move_to_child_of(parent)
209
209
210 Project.update_all("lft = NULL, rgt = NULL")
210 Project.update_all("lft = NULL, rgt = NULL")
211 Project.rebuild!
211 Project.rebuild!
212
212
213 parent.reload
213 parent.reload
214 assert_equal 4, parent.children.size
214 assert_equal 4, parent.children.size
215 assert_equal parent.children.sort_by(&:name), parent.children
215 assert_equal parent.children.sort_by(&:name), parent.children
216 end
216 end
217
217
218
218
219 def test_set_parent_should_update_issue_fixed_version_associations_when_a_fixed_version_is_moved_out_of_the_hierarchy
219 def test_set_parent_should_update_issue_fixed_version_associations_when_a_fixed_version_is_moved_out_of_the_hierarchy
220 # Parent issue with a hierarchy project's fixed version
220 # Parent issue with a hierarchy project's fixed version
221 parent_issue = Issue.find(1)
221 parent_issue = Issue.find(1)
222 parent_issue.update_attribute(:fixed_version_id, 4)
222 parent_issue.update_attribute(:fixed_version_id, 4)
223 parent_issue.reload
223 parent_issue.reload
224 assert_equal 4, parent_issue.fixed_version_id
224 assert_equal 4, parent_issue.fixed_version_id
225
225
226 # Should keep fixed versions for the issues
226 # Should keep fixed versions for the issues
227 issue_with_local_fixed_version = Issue.find(5)
227 issue_with_local_fixed_version = Issue.find(5)
228 issue_with_local_fixed_version.update_attribute(:fixed_version_id, 4)
228 issue_with_local_fixed_version.update_attribute(:fixed_version_id, 4)
229 issue_with_local_fixed_version.reload
229 issue_with_local_fixed_version.reload
230 assert_equal 4, issue_with_local_fixed_version.fixed_version_id
230 assert_equal 4, issue_with_local_fixed_version.fixed_version_id
231
231
232 # Local issue with hierarchy fixed_version
232 # Local issue with hierarchy fixed_version
233 issue_with_hierarchy_fixed_version = Issue.find(13)
233 issue_with_hierarchy_fixed_version = Issue.find(13)
234 issue_with_hierarchy_fixed_version.update_attribute(:fixed_version_id, 6)
234 issue_with_hierarchy_fixed_version.update_attribute(:fixed_version_id, 6)
235 issue_with_hierarchy_fixed_version.reload
235 issue_with_hierarchy_fixed_version.reload
236 assert_equal 6, issue_with_hierarchy_fixed_version.fixed_version_id
236 assert_equal 6, issue_with_hierarchy_fixed_version.fixed_version_id
237
237
238 # Move project out of the issue's hierarchy
238 # Move project out of the issue's hierarchy
239 moved_project = Project.find(3)
239 moved_project = Project.find(3)
240 moved_project.set_parent!(Project.find(2))
240 moved_project.set_parent!(Project.find(2))
241 parent_issue.reload
241 parent_issue.reload
242 issue_with_local_fixed_version.reload
242 issue_with_local_fixed_version.reload
243 issue_with_hierarchy_fixed_version.reload
243 issue_with_hierarchy_fixed_version.reload
244
244
245 assert_equal 4, issue_with_local_fixed_version.fixed_version_id, "Fixed version was not keep on an issue local to the moved project"
245 assert_equal 4, issue_with_local_fixed_version.fixed_version_id, "Fixed version was not keep on an issue local to the moved project"
246 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"
246 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"
247 assert_equal nil, parent_issue.fixed_version_id, "Fixed version is still set after moving the Version out of the hierarchy for the issue."
247 assert_equal nil, parent_issue.fixed_version_id, "Fixed version is still set after moving the Version out of the hierarchy for the issue."
248 end
248 end
249
249
250 def test_parent
250 def test_parent
251 p = Project.find(6).parent
251 p = Project.find(6).parent
252 assert p.is_a?(Project)
252 assert p.is_a?(Project)
253 assert_equal 5, p.id
253 assert_equal 5, p.id
254 end
254 end
255
255
256 def test_ancestors
256 def test_ancestors
257 a = Project.find(6).ancestors
257 a = Project.find(6).ancestors
258 assert a.first.is_a?(Project)
258 assert a.first.is_a?(Project)
259 assert_equal [1, 5], a.collect(&:id)
259 assert_equal [1, 5], a.collect(&:id)
260 end
260 end
261
261
262 def test_root
262 def test_root
263 r = Project.find(6).root
263 r = Project.find(6).root
264 assert r.is_a?(Project)
264 assert r.is_a?(Project)
265 assert_equal 1, r.id
265 assert_equal 1, r.id
266 end
266 end
267
267
268 def test_children
268 def test_children
269 c = Project.find(1).children
269 c = Project.find(1).children
270 assert c.first.is_a?(Project)
270 assert c.first.is_a?(Project)
271 assert_equal [5, 3, 4], c.collect(&:id)
271 assert_equal [5, 3, 4], c.collect(&:id)
272 end
272 end
273
273
274 def test_descendants
274 def test_descendants
275 d = Project.find(1).descendants
275 d = Project.find(1).descendants
276 assert d.first.is_a?(Project)
276 assert d.first.is_a?(Project)
277 assert_equal [5, 6, 3, 4], d.collect(&:id)
277 assert_equal [5, 6, 3, 4], d.collect(&:id)
278 end
278 end
279
279
280 def test_allowed_parents_should_be_empty_for_non_member_user
280 def test_allowed_parents_should_be_empty_for_non_member_user
281 Role.non_member.add_permission!(:add_project)
281 Role.non_member.add_permission!(:add_project)
282 user = User.find(9)
282 user = User.find(9)
283 assert user.memberships.empty?
283 assert user.memberships.empty?
284 User.current = user
284 User.current = user
285 assert Project.new.allowed_parents.compact.empty?
285 assert Project.new.allowed_parents.compact.empty?
286 end
286 end
287
287
288 def test_users_by_role
288 def test_users_by_role
289 users_by_role = Project.find(1).users_by_role
289 users_by_role = Project.find(1).users_by_role
290 assert_kind_of Hash, users_by_role
290 assert_kind_of Hash, users_by_role
291 role = Role.find(1)
291 role = Role.find(1)
292 assert_kind_of Array, users_by_role[role]
292 assert_kind_of Array, users_by_role[role]
293 assert users_by_role[role].include?(User.find(2))
293 assert users_by_role[role].include?(User.find(2))
294 end
294 end
295
295
296 def test_rolled_up_trackers
296 def test_rolled_up_trackers
297 parent = Project.find(1)
297 parent = Project.find(1)
298 parent.trackers = Tracker.find([1,2])
298 parent.trackers = Tracker.find([1,2])
299 child = parent.children.find(3)
299 child = parent.children.find(3)
300
300
301 assert_equal [1, 2], parent.tracker_ids
301 assert_equal [1, 2], parent.tracker_ids
302 assert_equal [2, 3], child.trackers.collect(&:id)
302 assert_equal [2, 3], child.trackers.collect(&:id)
303
303
304 assert_kind_of Tracker, parent.rolled_up_trackers.first
304 assert_kind_of Tracker, parent.rolled_up_trackers.first
305 assert_equal Tracker.find(1), parent.rolled_up_trackers.first
305 assert_equal Tracker.find(1), parent.rolled_up_trackers.first
306
306
307 assert_equal [1, 2, 3], parent.rolled_up_trackers.collect(&:id)
307 assert_equal [1, 2, 3], parent.rolled_up_trackers.collect(&:id)
308 assert_equal [2, 3], child.rolled_up_trackers.collect(&:id)
308 assert_equal [2, 3], child.rolled_up_trackers.collect(&:id)
309 end
309 end
310
310
311 def test_rolled_up_trackers_should_ignore_archived_subprojects
311 def test_rolled_up_trackers_should_ignore_archived_subprojects
312 parent = Project.find(1)
312 parent = Project.find(1)
313 parent.trackers = Tracker.find([1,2])
313 parent.trackers = Tracker.find([1,2])
314 child = parent.children.find(3)
314 child = parent.children.find(3)
315 child.trackers = Tracker.find([1,3])
315 child.trackers = Tracker.find([1,3])
316 parent.children.each(&:archive)
316 parent.children.each(&:archive)
317
317
318 assert_equal [1,2], parent.rolled_up_trackers.collect(&:id)
318 assert_equal [1,2], parent.rolled_up_trackers.collect(&:id)
319 end
319 end
320
320
321 def test_shared_versions_none_sharing
321 def test_shared_versions_none_sharing
322 p = Project.find(5)
322 p = Project.find(5)
323 v = Version.create!(:name => 'none_sharing', :project => p, :sharing => 'none')
323 v = Version.create!(:name => 'none_sharing', :project => p, :sharing => 'none')
324 assert p.shared_versions.include?(v)
324 assert p.shared_versions.include?(v)
325 assert !p.children.first.shared_versions.include?(v)
325 assert !p.children.first.shared_versions.include?(v)
326 assert !p.root.shared_versions.include?(v)
326 assert !p.root.shared_versions.include?(v)
327 assert !p.siblings.first.shared_versions.include?(v)
327 assert !p.siblings.first.shared_versions.include?(v)
328 assert !p.root.siblings.first.shared_versions.include?(v)
328 assert !p.root.siblings.first.shared_versions.include?(v)
329 end
329 end
330
330
331 def test_shared_versions_descendants_sharing
331 def test_shared_versions_descendants_sharing
332 p = Project.find(5)
332 p = Project.find(5)
333 v = Version.create!(:name => 'descendants_sharing', :project => p, :sharing => 'descendants')
333 v = Version.create!(:name => 'descendants_sharing', :project => p, :sharing => 'descendants')
334 assert p.shared_versions.include?(v)
334 assert p.shared_versions.include?(v)
335 assert p.children.first.shared_versions.include?(v)
335 assert p.children.first.shared_versions.include?(v)
336 assert !p.root.shared_versions.include?(v)
336 assert !p.root.shared_versions.include?(v)
337 assert !p.siblings.first.shared_versions.include?(v)
337 assert !p.siblings.first.shared_versions.include?(v)
338 assert !p.root.siblings.first.shared_versions.include?(v)
338 assert !p.root.siblings.first.shared_versions.include?(v)
339 end
339 end
340
340
341 def test_shared_versions_hierarchy_sharing
341 def test_shared_versions_hierarchy_sharing
342 p = Project.find(5)
342 p = Project.find(5)
343 v = Version.create!(:name => 'hierarchy_sharing', :project => p, :sharing => 'hierarchy')
343 v = Version.create!(:name => 'hierarchy_sharing', :project => p, :sharing => 'hierarchy')
344 assert p.shared_versions.include?(v)
344 assert p.shared_versions.include?(v)
345 assert p.children.first.shared_versions.include?(v)
345 assert p.children.first.shared_versions.include?(v)
346 assert p.root.shared_versions.include?(v)
346 assert p.root.shared_versions.include?(v)
347 assert !p.siblings.first.shared_versions.include?(v)
347 assert !p.siblings.first.shared_versions.include?(v)
348 assert !p.root.siblings.first.shared_versions.include?(v)
348 assert !p.root.siblings.first.shared_versions.include?(v)
349 end
349 end
350
350
351 def test_shared_versions_tree_sharing
351 def test_shared_versions_tree_sharing
352 p = Project.find(5)
352 p = Project.find(5)
353 v = Version.create!(:name => 'tree_sharing', :project => p, :sharing => 'tree')
353 v = Version.create!(:name => 'tree_sharing', :project => p, :sharing => 'tree')
354 assert p.shared_versions.include?(v)
354 assert p.shared_versions.include?(v)
355 assert p.children.first.shared_versions.include?(v)
355 assert p.children.first.shared_versions.include?(v)
356 assert p.root.shared_versions.include?(v)
356 assert p.root.shared_versions.include?(v)
357 assert p.siblings.first.shared_versions.include?(v)
357 assert p.siblings.first.shared_versions.include?(v)
358 assert !p.root.siblings.first.shared_versions.include?(v)
358 assert !p.root.siblings.first.shared_versions.include?(v)
359 end
359 end
360
360
361 def test_shared_versions_system_sharing
361 def test_shared_versions_system_sharing
362 p = Project.find(5)
362 p = Project.find(5)
363 v = Version.create!(:name => 'system_sharing', :project => p, :sharing => 'system')
363 v = Version.create!(:name => 'system_sharing', :project => p, :sharing => 'system')
364 assert p.shared_versions.include?(v)
364 assert p.shared_versions.include?(v)
365 assert p.children.first.shared_versions.include?(v)
365 assert p.children.first.shared_versions.include?(v)
366 assert p.root.shared_versions.include?(v)
366 assert p.root.shared_versions.include?(v)
367 assert p.siblings.first.shared_versions.include?(v)
367 assert p.siblings.first.shared_versions.include?(v)
368 assert p.root.siblings.first.shared_versions.include?(v)
368 assert p.root.siblings.first.shared_versions.include?(v)
369 end
369 end
370
370
371 def test_shared_versions
371 def test_shared_versions
372 parent = Project.find(1)
372 parent = Project.find(1)
373 child = parent.children.find(3)
373 child = parent.children.find(3)
374 private_child = parent.children.find(5)
374 private_child = parent.children.find(5)
375
375
376 assert_equal [1,2,3], parent.version_ids.sort
376 assert_equal [1,2,3], parent.version_ids.sort
377 assert_equal [4], child.version_ids
377 assert_equal [4], child.version_ids
378 assert_equal [6], private_child.version_ids
378 assert_equal [6], private_child.version_ids
379 assert_equal [7], Version.find_all_by_sharing('system').collect(&:id)
379 assert_equal [7], Version.find_all_by_sharing('system').collect(&:id)
380
380
381 assert_equal 6, parent.shared_versions.size
381 assert_equal 6, parent.shared_versions.size
382 parent.shared_versions.each do |version|
382 parent.shared_versions.each do |version|
383 assert_kind_of Version, version
383 assert_kind_of Version, version
384 end
384 end
385
385
386 assert_equal [1,2,3,4,6,7], parent.shared_versions.collect(&:id).sort
386 assert_equal [1,2,3,4,6,7], parent.shared_versions.collect(&:id).sort
387 end
387 end
388
388
389 def test_shared_versions_should_ignore_archived_subprojects
389 def test_shared_versions_should_ignore_archived_subprojects
390 parent = Project.find(1)
390 parent = Project.find(1)
391 child = parent.children.find(3)
391 child = parent.children.find(3)
392 child.archive
392 child.archive
393 parent.reload
393 parent.reload
394
394
395 assert_equal [1,2,3], parent.version_ids.sort
395 assert_equal [1,2,3], parent.version_ids.sort
396 assert_equal [4], child.version_ids
396 assert_equal [4], child.version_ids
397 assert !parent.shared_versions.collect(&:id).include?(4)
397 assert !parent.shared_versions.collect(&:id).include?(4)
398 end
398 end
399
399
400 def test_shared_versions_visible_to_user
400 def test_shared_versions_visible_to_user
401 user = User.find(3)
401 user = User.find(3)
402 parent = Project.find(1)
402 parent = Project.find(1)
403 child = parent.children.find(5)
403 child = parent.children.find(5)
404
404
405 assert_equal [1,2,3], parent.version_ids.sort
405 assert_equal [1,2,3], parent.version_ids.sort
406 assert_equal [6], child.version_ids
406 assert_equal [6], child.version_ids
407
407
408 versions = parent.shared_versions.visible(user)
408 versions = parent.shared_versions.visible(user)
409
409
410 assert_equal 4, versions.size
410 assert_equal 4, versions.size
411 versions.each do |version|
411 versions.each do |version|
412 assert_kind_of Version, version
412 assert_kind_of Version, version
413 end
413 end
414
414
415 assert !versions.collect(&:id).include?(6)
415 assert !versions.collect(&:id).include?(6)
416 end
416 end
417
417
418
418
419 def test_next_identifier
419 def test_next_identifier
420 ProjectCustomField.delete_all
420 ProjectCustomField.delete_all
421 Project.create!(:name => 'last', :identifier => 'p2008040')
421 Project.create!(:name => 'last', :identifier => 'p2008040')
422 assert_equal 'p2008041', Project.next_identifier
422 assert_equal 'p2008041', Project.next_identifier
423 end
423 end
424
424
425 def test_next_identifier_first_project
425 def test_next_identifier_first_project
426 Project.delete_all
426 Project.delete_all
427 assert_nil Project.next_identifier
427 assert_nil Project.next_identifier
428 end
428 end
429
429
430
430
431 def test_enabled_module_names_should_not_recreate_enabled_modules
431 def test_enabled_module_names_should_not_recreate_enabled_modules
432 project = Project.find(1)
432 project = Project.find(1)
433 # Remove one module
433 # Remove one module
434 modules = project.enabled_modules.slice(0..-2)
434 modules = project.enabled_modules.slice(0..-2)
435 assert modules.any?
435 assert modules.any?
436 assert_difference 'EnabledModule.count', -1 do
436 assert_difference 'EnabledModule.count', -1 do
437 project.enabled_module_names = modules.collect(&:name)
437 project.enabled_module_names = modules.collect(&:name)
438 end
438 end
439 project.reload
439 project.reload
440 # Ids should be preserved
440 # Ids should be preserved
441 assert_equal project.enabled_module_ids.sort, modules.collect(&:id).sort
441 assert_equal project.enabled_module_ids.sort, modules.collect(&:id).sort
442 end
442 end
443
443
444 def test_copy_from_existing_project
444 def test_copy_from_existing_project
445 source_project = Project.find(1)
445 source_project = Project.find(1)
446 copied_project = Project.copy_from(1)
446 copied_project = Project.copy_from(1)
447
447
448 assert copied_project
448 assert copied_project
449 # Cleared attributes
449 # Cleared attributes
450 assert copied_project.id.blank?
450 assert copied_project.id.blank?
451 assert copied_project.name.blank?
451 assert copied_project.name.blank?
452 assert copied_project.identifier.blank?
452 assert copied_project.identifier.blank?
453
453
454 # Duplicated attributes
454 # Duplicated attributes
455 assert_equal source_project.description, copied_project.description
455 assert_equal source_project.description, copied_project.description
456 assert_equal source_project.enabled_modules, copied_project.enabled_modules
456 assert_equal source_project.enabled_modules, copied_project.enabled_modules
457 assert_equal source_project.trackers, copied_project.trackers
457 assert_equal source_project.trackers, copied_project.trackers
458
458
459 # Default attributes
459 # Default attributes
460 assert_equal 1, copied_project.status
460 assert_equal 1, copied_project.status
461 end
461 end
462
462
463 def test_activities_should_use_the_system_activities
463 def test_activities_should_use_the_system_activities
464 project = Project.find(1)
464 project = Project.find(1)
465 assert_equal project.activities, TimeEntryActivity.find(:all, :conditions => {:active => true} )
465 assert_equal project.activities, TimeEntryActivity.find(:all, :conditions => {:active => true} )
466 end
466 end
467
467
468
468
469 def test_activities_should_use_the_project_specific_activities
469 def test_activities_should_use_the_project_specific_activities
470 project = Project.find(1)
470 project = Project.find(1)
471 overridden_activity = TimeEntryActivity.new({:name => "Project", :project => project})
471 overridden_activity = TimeEntryActivity.new({:name => "Project", :project => project})
472 assert overridden_activity.save!
472 assert overridden_activity.save!
473
473
474 assert project.activities.include?(overridden_activity), "Project specific Activity not found"
474 assert project.activities.include?(overridden_activity), "Project specific Activity not found"
475 end
475 end
476
476
477 def test_activities_should_not_include_the_inactive_project_specific_activities
477 def test_activities_should_not_include_the_inactive_project_specific_activities
478 project = Project.find(1)
478 project = Project.find(1)
479 overridden_activity = TimeEntryActivity.new({:name => "Project", :project => project, :parent => TimeEntryActivity.find(:first), :active => false})
479 overridden_activity = TimeEntryActivity.new({:name => "Project", :project => project, :parent => TimeEntryActivity.find(:first), :active => false})
480 assert overridden_activity.save!
480 assert overridden_activity.save!
481
481
482 assert !project.activities.include?(overridden_activity), "Inactive Project specific Activity found"
482 assert !project.activities.include?(overridden_activity), "Inactive Project specific Activity found"
483 end
483 end
484
484
485 def test_activities_should_not_include_project_specific_activities_from_other_projects
485 def test_activities_should_not_include_project_specific_activities_from_other_projects
486 project = Project.find(1)
486 project = Project.find(1)
487 overridden_activity = TimeEntryActivity.new({:name => "Project", :project => Project.find(2)})
487 overridden_activity = TimeEntryActivity.new({:name => "Project", :project => Project.find(2)})
488 assert overridden_activity.save!
488 assert overridden_activity.save!
489
489
490 assert !project.activities.include?(overridden_activity), "Project specific Activity found on a different project"
490 assert !project.activities.include?(overridden_activity), "Project specific Activity found on a different project"
491 end
491 end
492
492
493 def test_activities_should_handle_nils
493 def test_activities_should_handle_nils
494 overridden_activity = TimeEntryActivity.new({:name => "Project", :project => Project.find(1), :parent => TimeEntryActivity.find(:first)})
494 overridden_activity = TimeEntryActivity.new({:name => "Project", :project => Project.find(1), :parent => TimeEntryActivity.find(:first)})
495 TimeEntryActivity.delete_all
495 TimeEntryActivity.delete_all
496
496
497 # No activities
497 # No activities
498 project = Project.find(1)
498 project = Project.find(1)
499 assert project.activities.empty?
499 assert project.activities.empty?
500
500
501 # No system, one overridden
501 # No system, one overridden
502 assert overridden_activity.save!
502 assert overridden_activity.save!
503 project.reload
503 project.reload
504 assert_equal [overridden_activity], project.activities
504 assert_equal [overridden_activity], project.activities
505 end
505 end
506
506
507 def test_activities_should_override_system_activities_with_project_activities
507 def test_activities_should_override_system_activities_with_project_activities
508 project = Project.find(1)
508 project = Project.find(1)
509 parent_activity = TimeEntryActivity.find(:first)
509 parent_activity = TimeEntryActivity.find(:first)
510 overridden_activity = TimeEntryActivity.new({:name => "Project", :project => project, :parent => parent_activity})
510 overridden_activity = TimeEntryActivity.new({:name => "Project", :project => project, :parent => parent_activity})
511 assert overridden_activity.save!
511 assert overridden_activity.save!
512
512
513 assert project.activities.include?(overridden_activity), "Project specific Activity not found"
513 assert project.activities.include?(overridden_activity), "Project specific Activity not found"
514 assert !project.activities.include?(parent_activity), "System Activity found when it should have been overridden"
514 assert !project.activities.include?(parent_activity), "System Activity found when it should have been overridden"
515 end
515 end
516
516
517 def test_activities_should_include_inactive_activities_if_specified
517 def test_activities_should_include_inactive_activities_if_specified
518 project = Project.find(1)
518 project = Project.find(1)
519 overridden_activity = TimeEntryActivity.new({:name => "Project", :project => project, :parent => TimeEntryActivity.find(:first), :active => false})
519 overridden_activity = TimeEntryActivity.new({:name => "Project", :project => project, :parent => TimeEntryActivity.find(:first), :active => false})
520 assert overridden_activity.save!
520 assert overridden_activity.save!
521
521
522 assert project.activities(true).include?(overridden_activity), "Inactive Project specific Activity not found"
522 assert project.activities(true).include?(overridden_activity), "Inactive Project specific Activity not found"
523 end
523 end
524
524
525 test 'activities should not include active System activities if the project has an override that is inactive' do
525 test 'activities should not include active System activities if the project has an override that is inactive' do
526 project = Project.find(1)
526 project = Project.find(1)
527 system_activity = TimeEntryActivity.find_by_name('Design')
527 system_activity = TimeEntryActivity.find_by_name('Design')
528 assert system_activity.active?
528 assert system_activity.active?
529 overridden_activity = TimeEntryActivity.generate!(:project => project, :parent => system_activity, :active => false)
529 overridden_activity = TimeEntryActivity.generate!(:project => project, :parent => system_activity, :active => false)
530 assert overridden_activity.save!
530 assert overridden_activity.save!
531
531
532 assert !project.activities.include?(overridden_activity), "Inactive Project specific Activity not found"
532 assert !project.activities.include?(overridden_activity), "Inactive Project specific Activity not found"
533 assert !project.activities.include?(system_activity), "System activity found when the project has an inactive override"
533 assert !project.activities.include?(system_activity), "System activity found when the project has an inactive override"
534 end
534 end
535
535
536 def test_close_completed_versions
536 def test_close_completed_versions
537 Version.update_all("status = 'open'")
537 Version.update_all("status = 'open'")
538 project = Project.find(1)
538 project = Project.find(1)
539 assert_not_nil project.versions.detect {|v| v.completed? && v.status == 'open'}
539 assert_not_nil project.versions.detect {|v| v.completed? && v.status == 'open'}
540 assert_not_nil project.versions.detect {|v| !v.completed? && v.status == 'open'}
540 assert_not_nil project.versions.detect {|v| !v.completed? && v.status == 'open'}
541 project.close_completed_versions
541 project.close_completed_versions
542 project.reload
542 project.reload
543 assert_nil project.versions.detect {|v| v.completed? && v.status != 'closed'}
543 assert_nil project.versions.detect {|v| v.completed? && v.status != 'closed'}
544 assert_not_nil project.versions.detect {|v| !v.completed? && v.status == 'open'}
544 assert_not_nil project.versions.detect {|v| !v.completed? && v.status == 'open'}
545 end
545 end
546
546
547 context "Project#copy" do
547 context "Project#copy" do
548 setup do
548 setup do
549 ProjectCustomField.destroy_all # Custom values are a mess to isolate in tests
549 ProjectCustomField.destroy_all # Custom values are a mess to isolate in tests
550 Project.destroy_all :identifier => "copy-test"
550 Project.destroy_all :identifier => "copy-test"
551 @source_project = Project.find(2)
551 @source_project = Project.find(2)
552 @project = Project.new(:name => 'Copy Test', :identifier => 'copy-test')
552 @project = Project.new(:name => 'Copy Test', :identifier => 'copy-test')
553 @project.trackers = @source_project.trackers
553 @project.trackers = @source_project.trackers
554 @project.enabled_module_names = @source_project.enabled_modules.collect(&:name)
554 @project.enabled_module_names = @source_project.enabled_modules.collect(&:name)
555 end
555 end
556
556
557 should "copy issues" do
557 should "copy issues" do
558 @source_project.issues << Issue.generate!(:status_id => 5,
558 @source_project.issues << Issue.generate!(:status => IssueStatus.find_by_name('Closed'),
559 :subject => "copy issue status",
559 :subject => "copy issue status",
560 :tracker_id => 1,
560 :tracker_id => 1,
561 :assigned_to_id => 2,
561 :assigned_to_id => 2,
562 :project_id => @source_project.id)
562 :project_id => @source_project.id)
563 assert @project.valid?
563 assert @project.valid?
564 assert @project.issues.empty?
564 assert @project.issues.empty?
565 assert @project.copy(@source_project)
565 assert @project.copy(@source_project)
566
566
567 assert_equal @source_project.issues.size, @project.issues.size
567 assert_equal @source_project.issues.size, @project.issues.size
568 @project.issues.each do |issue|
568 @project.issues.each do |issue|
569 assert issue.valid?
569 assert issue.valid?
570 assert ! issue.assigned_to.blank?
570 assert ! issue.assigned_to.blank?
571 assert_equal @project, issue.project
571 assert_equal @project, issue.project
572 end
572 end
573
573
574 copied_issue = @project.issues.first(:conditions => {:subject => "copy issue status"})
574 copied_issue = @project.issues.first(:conditions => {:subject => "copy issue status"})
575 assert copied_issue
575 assert copied_issue
576 assert copied_issue.status
576 assert copied_issue.status
577 assert_equal "Closed", copied_issue.status.name
577 assert_equal "Closed", copied_issue.status.name
578 end
578 end
579
579
580 should "change the new issues to use the copied version" do
580 should "change the new issues to use the copied version" do
581 User.current = User.find(1)
581 User.current = User.find(1)
582 assigned_version = Version.generate!(:name => "Assigned Issues", :status => 'open')
582 assigned_version = Version.generate!(:name => "Assigned Issues", :status => 'open')
583 @source_project.versions << assigned_version
583 @source_project.versions << assigned_version
584 assert_equal 3, @source_project.versions.size
584 assert_equal 3, @source_project.versions.size
585 Issue.generate_for_project!(@source_project,
585 Issue.generate_for_project!(@source_project,
586 :fixed_version_id => assigned_version.id,
586 :fixed_version_id => assigned_version.id,
587 :subject => "change the new issues to use the copied version",
587 :subject => "change the new issues to use the copied version",
588 :tracker_id => 1,
588 :tracker_id => 1,
589 :project_id => @source_project.id)
589 :project_id => @source_project.id)
590
590
591 assert @project.copy(@source_project)
591 assert @project.copy(@source_project)
592 @project.reload
592 @project.reload
593 copied_issue = @project.issues.first(:conditions => {:subject => "change the new issues to use the copied version"})
593 copied_issue = @project.issues.first(:conditions => {:subject => "change the new issues to use the copied version"})
594
594
595 assert copied_issue
595 assert copied_issue
596 assert copied_issue.fixed_version
596 assert copied_issue.fixed_version
597 assert_equal "Assigned Issues", copied_issue.fixed_version.name # Same name
597 assert_equal "Assigned Issues", copied_issue.fixed_version.name # Same name
598 assert_not_equal assigned_version.id, copied_issue.fixed_version.id # Different record
598 assert_not_equal assigned_version.id, copied_issue.fixed_version.id # Different record
599 end
599 end
600
600
601 should "copy issue relations" do
601 should "copy issue relations" do
602 Setting.cross_project_issue_relations = '1'
602 Setting.cross_project_issue_relations = '1'
603
603
604 second_issue = Issue.generate!(:status_id => 5,
604 second_issue = Issue.generate!(:status_id => 5,
605 :subject => "copy issue relation",
605 :subject => "copy issue relation",
606 :tracker_id => 1,
606 :tracker_id => 1,
607 :assigned_to_id => 2,
607 :assigned_to_id => 2,
608 :project_id => @source_project.id)
608 :project_id => @source_project.id)
609 source_relation = IssueRelation.generate!(:issue_from => Issue.find(4),
609 source_relation = IssueRelation.generate!(:issue_from => Issue.find(4),
610 :issue_to => second_issue,
610 :issue_to => second_issue,
611 :relation_type => "relates")
611 :relation_type => "relates")
612 source_relation_cross_project = IssueRelation.generate!(:issue_from => Issue.find(1),
612 source_relation_cross_project = IssueRelation.generate!(:issue_from => Issue.find(1),
613 :issue_to => second_issue,
613 :issue_to => second_issue,
614 :relation_type => "duplicates")
614 :relation_type => "duplicates")
615
615
616 assert @project.copy(@source_project)
616 assert @project.copy(@source_project)
617 assert_equal @source_project.issues.count, @project.issues.count
617 assert_equal @source_project.issues.count, @project.issues.count
618 copied_issue = @project.issues.find_by_subject("Issue on project 2") # Was #4
618 copied_issue = @project.issues.find_by_subject("Issue on project 2") # Was #4
619 copied_second_issue = @project.issues.find_by_subject("copy issue relation")
619 copied_second_issue = @project.issues.find_by_subject("copy issue relation")
620
620
621 # First issue with a relation on project
621 # First issue with a relation on project
622 assert_equal 1, copied_issue.relations.size, "Relation not copied"
622 assert_equal 1, copied_issue.relations.size, "Relation not copied"
623 copied_relation = copied_issue.relations.first
623 copied_relation = copied_issue.relations.first
624 assert_equal "relates", copied_relation.relation_type
624 assert_equal "relates", copied_relation.relation_type
625 assert_equal copied_second_issue.id, copied_relation.issue_to_id
625 assert_equal copied_second_issue.id, copied_relation.issue_to_id
626 assert_not_equal source_relation.id, copied_relation.id
626 assert_not_equal source_relation.id, copied_relation.id
627
627
628 # Second issue with a cross project relation
628 # Second issue with a cross project relation
629 assert_equal 2, copied_second_issue.relations.size, "Relation not copied"
629 assert_equal 2, copied_second_issue.relations.size, "Relation not copied"
630 copied_relation = copied_second_issue.relations.select {|r| r.relation_type == 'duplicates'}.first
630 copied_relation = copied_second_issue.relations.select {|r| r.relation_type == 'duplicates'}.first
631 assert_equal "duplicates", copied_relation.relation_type
631 assert_equal "duplicates", copied_relation.relation_type
632 assert_equal 1, copied_relation.issue_from_id, "Cross project relation not kept"
632 assert_equal 1, copied_relation.issue_from_id, "Cross project relation not kept"
633 assert_not_equal source_relation_cross_project.id, copied_relation.id
633 assert_not_equal source_relation_cross_project.id, copied_relation.id
634 end
634 end
635
635
636 should "copy memberships" do
636 should "copy memberships" do
637 assert @project.valid?
637 assert @project.valid?
638 assert @project.members.empty?
638 assert @project.members.empty?
639 assert @project.copy(@source_project)
639 assert @project.copy(@source_project)
640
640
641 assert_equal @source_project.memberships.size, @project.memberships.size
641 assert_equal @source_project.memberships.size, @project.memberships.size
642 @project.memberships.each do |membership|
642 @project.memberships.each do |membership|
643 assert membership
643 assert membership
644 assert_equal @project, membership.project
644 assert_equal @project, membership.project
645 end
645 end
646 end
646 end
647
647
648 should "copy project specific queries" do
648 should "copy project specific queries" do
649 assert @project.valid?
649 assert @project.valid?
650 assert @project.queries.empty?
650 assert @project.queries.empty?
651 assert @project.copy(@source_project)
651 assert @project.copy(@source_project)
652
652
653 assert_equal @source_project.queries.size, @project.queries.size
653 assert_equal @source_project.queries.size, @project.queries.size
654 @project.queries.each do |query|
654 @project.queries.each do |query|
655 assert query
655 assert query
656 assert_equal @project, query.project
656 assert_equal @project, query.project
657 end
657 end
658 end
658 end
659
659
660 should "copy versions" do
660 should "copy versions" do
661 @source_project.versions << Version.generate!
661 @source_project.versions << Version.generate!
662 @source_project.versions << Version.generate!
662 @source_project.versions << Version.generate!
663
663
664 assert @project.versions.empty?
664 assert @project.versions.empty?
665 assert @project.copy(@source_project)
665 assert @project.copy(@source_project)
666
666
667 assert_equal @source_project.versions.size, @project.versions.size
667 assert_equal @source_project.versions.size, @project.versions.size
668 @project.versions.each do |version|
668 @project.versions.each do |version|
669 assert version
669 assert version
670 assert_equal @project, version.project
670 assert_equal @project, version.project
671 end
671 end
672 end
672 end
673
673
674 should "copy wiki" do
674 should "copy wiki" do
675 assert_difference 'Wiki.count' do
675 assert_difference 'Wiki.count' do
676 assert @project.copy(@source_project)
676 assert @project.copy(@source_project)
677 end
677 end
678
678
679 assert @project.wiki
679 assert @project.wiki
680 assert_not_equal @source_project.wiki, @project.wiki
680 assert_not_equal @source_project.wiki, @project.wiki
681 assert_equal "Start page", @project.wiki.start_page
681 assert_equal "Start page", @project.wiki.start_page
682 end
682 end
683
683
684 should "copy wiki pages and content" do
684 should "copy wiki pages and content" do
685 assert @project.copy(@source_project)
685 assert @project.copy(@source_project)
686
686
687 assert @project.wiki
687 assert @project.wiki
688 assert_equal 1, @project.wiki.pages.length
688 assert_equal 1, @project.wiki.pages.length
689
689
690 @project.wiki.pages.each do |wiki_page|
690 @project.wiki.pages.each do |wiki_page|
691 assert wiki_page.content
691 assert wiki_page.content
692 assert !@source_project.wiki.pages.include?(wiki_page)
692 assert !@source_project.wiki.pages.include?(wiki_page)
693 end
693 end
694 end
694 end
695
695
696 should "copy issue categories" do
696 should "copy issue categories" do
697 assert @project.copy(@source_project)
697 assert @project.copy(@source_project)
698
698
699 assert_equal 2, @project.issue_categories.size
699 assert_equal 2, @project.issue_categories.size
700 @project.issue_categories.each do |issue_category|
700 @project.issue_categories.each do |issue_category|
701 assert !@source_project.issue_categories.include?(issue_category)
701 assert !@source_project.issue_categories.include?(issue_category)
702 end
702 end
703 end
703 end
704
704
705 should "copy boards" do
705 should "copy boards" do
706 assert @project.copy(@source_project)
706 assert @project.copy(@source_project)
707
707
708 assert_equal 1, @project.boards.size
708 assert_equal 1, @project.boards.size
709 @project.boards.each do |board|
709 @project.boards.each do |board|
710 assert !@source_project.boards.include?(board)
710 assert !@source_project.boards.include?(board)
711 end
711 end
712 end
712 end
713
713
714 should "change the new issues to use the copied issue categories" do
714 should "change the new issues to use the copied issue categories" do
715 issue = Issue.find(4)
715 issue = Issue.find(4)
716 issue.update_attribute(:category_id, 3)
716 issue.update_attribute(:category_id, 3)
717
717
718 assert @project.copy(@source_project)
718 assert @project.copy(@source_project)
719
719
720 @project.issues.each do |issue|
720 @project.issues.each do |issue|
721 assert issue.category
721 assert issue.category
722 assert_equal "Stock management", issue.category.name # Same name
722 assert_equal "Stock management", issue.category.name # Same name
723 assert_not_equal IssueCategory.find(3), issue.category # Different record
723 assert_not_equal IssueCategory.find(3), issue.category # Different record
724 end
724 end
725 end
725 end
726
726
727 should "limit copy with :only option" do
727 should "limit copy with :only option" do
728 assert @project.members.empty?
728 assert @project.members.empty?
729 assert @project.issue_categories.empty?
729 assert @project.issue_categories.empty?
730 assert @source_project.issues.any?
730 assert @source_project.issues.any?
731
731
732 assert @project.copy(@source_project, :only => ['members', 'issue_categories'])
732 assert @project.copy(@source_project, :only => ['members', 'issue_categories'])
733
733
734 assert @project.members.any?
734 assert @project.members.any?
735 assert @project.issue_categories.any?
735 assert @project.issue_categories.any?
736 assert @project.issues.empty?
736 assert @project.issues.empty?
737 end
737 end
738
738
739 end
739 end
740
740
741 end
741 end
General Comments 0
You need to be logged in to leave comments. Login now