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