def test_ActualHours(self): """Make sure rawActualHours returns the expected value. Also make sure the same value is stored in the catalog. """ self.assertAnnotationTaskBrainHoursEquality(self.task, 3.25) createBooking(self.task, id='booking2', minutes=15) self.assertAnnotationTaskBrainHoursEquality(self.task, 3.5) # make a copy to test later copydata = self.story.manage_copyObjects(self.task.getId()) self.story.manage_pasteObjects(copydata) copy = self.story.copy_of_task # If a Booking gets deleted, its parent task should be # reindexed. self.task.manage_delObjects('booking2') self.assertAnnotationTaskBrainHoursEquality(self.task, 3.25) self.task.manage_delObjects('booking') self.assertAnnotationTaskBrainHoursEquality(self.task, 0) # Make sure the copy retained it's info reset_request(copy) self.assertAnnotationTaskBrainHoursEquality(copy, 3.5) # Test cutting Bookings. cutdata = copy.manage_cutObjects(ids=['booking', 'booking2']) self.story.invokeFactory('Task', id='task3') task3 = self.story.task3 task3.manage_pasteObjects(cutdata) self.assertAnnotationTaskBrainHoursEquality(copy, 0) reset_request(copy) self.assertAnnotationTaskBrainHoursEquality(task3, 3.5)
def test_ActualHours(self): """Make sure rawActualHours returns the expected value. Also make sure the same value is stored in the catalog. """ self.assertAnnotationTaskBrainHoursEquality(self.task, 3.25) createBooking(self.task, id='booking2', minutes=15) self.assertAnnotationTaskBrainHoursEquality(self.task, 3.5) # make a copy to test later copydata = self.story.manage_copyObjects(self.task.getId()) self.story.manage_pasteObjects(copydata) copy = self.story.copy_of_task # If a Booking gets deleted, its parent task should be # reindexed. self.task.manage_delObjects('booking2') self.assertAnnotationTaskBrainHoursEquality(self.task, 3.25) self.task.manage_delObjects('booking') self.assertAnnotationTaskBrainHoursEquality(self.task, 0) # Make sure the copy retained it's info reset_request(copy) self.assertAnnotationTaskBrainHoursEquality(copy, 3.5) # Test cutting Bookings. cutdata = copy.manage_cutObjects(ids=['booking', 'booking2']) self.story.invokeFactory('Task', id='task3') task3 = self.story.task3 task3.manage_pasteObjects(cutdata) self.assertAnnotationTaskBrainHoursEquality(copy, 0) reset_request(copy) self.assertAnnotationTaskBrainHoursEquality(task3, 3.5)
def test_EstimateAndActual(self): """ When a story has tasks, get their estimates. If not, get the roughEstimate of this story. Also test ActualHours while we are at it. """ # It is best to create a completely new story here. iteration = self.portal.project.iteration iteration.invokeFactory('Story', id='st') story = iteration.st story.update(roughEstimate=1.5) notify(ObjectModifiedEvent(story)) self.assertEqual(story.getRoughEstimate(), 1.5) xm_props = self.portal.portal_properties.xm_properties hours_per_day = xm_props.hours_per_day self.assertEqual(hours_per_day, 8.0) # Add a Task. workflow = self.portal.portal_workflow workflow.doActionFor(story, 'estimate') story.invokeFactory('Task', id='task') task = story.task self.assertAnnotationStoryBrainEstimateEquality(story, 0.0) task.update(hours=4) notify(ObjectModifiedEvent(task)) self.assertAnnotationStoryBrainEstimateEquality(story, 4.0) createBooking(task, id='booking1', hours=1) self.assertAnnotationStoryBrainHoursEquality(story, 1) # Add another task. story.invokeFactory('Task', id='2') task2 = story['2'] task2.update(hours=2) notify(ObjectModifiedEvent(task2)) self.assertAnnotationStoryBrainEstimateEquality(story, 6) createBooking(task2, id='booking1', hours=1) self.assertAnnotationStoryBrainHoursEquality(story, 2) # make a copy to test later copydata = iteration.manage_copyObjects(story.getId()) iteration.manage_pasteObjects(copydata) copy = iteration.copy_of_st # make sure deleting a task updates the story's catalog entry story.manage_delObjects(ids=['task']) self.assertAnnotationStoryBrainEstimateEquality(story, 2) self.assertAnnotationStoryBrainHoursEquality(story, 1) # Make sure the copy retained it's info reset_request(copy) self.assertAnnotationStoryBrainEstimateEquality(copy, 6) self.assertAnnotationStoryBrainHoursEquality(copy, 2) # Check that cutting and pasting also works correctly with # respect to the estimates (and the booked hours, etc, but # that should be fine. # First make a second story for pasting into. iteration.invokeFactory('Story', id='story2') story2 = iteration.story2 reset_request(story2) self.assertAnnotationStoryBrainEstimateEquality(story2, 0) self.assertAnnotationStoryBrainHoursEquality(story2, 0) # We need to commit a few times, before this works in tests. transaction.savepoint(optimistic=True) cut_data = story.manage_cutObjects(ids=['2']) story2.manage_pasteObjects(cut_data) self.assertAnnotationStoryBrainEstimateEquality(story, 0.0) self.assertAnnotationStoryBrainHoursEquality(story, 0) self.assertAnnotationStoryBrainEstimateEquality(story2, 2) self.assertAnnotationStoryBrainHoursEquality(story2, 1) # The recalc method is tested in xm.booking, but we can at # least call it once here. story.recalc()
def test_EstimateAndActual(self): """ When a story has tasks, get their estimates. If not, get the roughEstimate of this story. Also test ActualHours while we are at it. """ # It is best to create a completely new story here. iteration = self.portal.project.iteration iteration.invokeFactory('Story', id='st') story = iteration.st story.update(roughEstimate=1.5) notify(ObjectModifiedEvent(story)) self.assertEqual(story.getRoughEstimate(), 1.5) xm_props = self.portal.portal_properties.xm_properties hours_per_day = xm_props.hours_per_day self.assertEqual(hours_per_day, 8.0) # Add a Task. workflow = self.portal.portal_workflow workflow.doActionFor(story, 'estimate') story.invokeFactory('Task', id='task') task = story.task self.assertAnnotationStoryBrainEstimateEquality(story, 0.0) task.update(hours=4) notify(ObjectModifiedEvent(task)) self.assertAnnotationStoryBrainEstimateEquality(story, 4.0) createBooking(task, id='booking1', hours=1) self.assertAnnotationStoryBrainHoursEquality(story, 1) # Add another task. story.invokeFactory('Task', id='2') task2 = story['2'] task2.update(hours=2) notify(ObjectModifiedEvent(task2)) self.assertAnnotationStoryBrainEstimateEquality(story, 6) createBooking(task2, id='booking1', hours=1) self.assertAnnotationStoryBrainHoursEquality(story, 2) # make a copy to test later copydata = iteration.manage_copyObjects(story.getId()) iteration.manage_pasteObjects(copydata) copy = iteration.copy_of_st # make sure deleting a task updates the story's catalog entry story.manage_delObjects(ids=['task']) self.assertAnnotationStoryBrainEstimateEquality(story, 2) self.assertAnnotationStoryBrainHoursEquality(story, 1) # Make sure the copy retained it's info reset_request(copy) self.assertAnnotationStoryBrainEstimateEquality(copy, 6) self.assertAnnotationStoryBrainHoursEquality(copy, 2) # Check that cutting and pasting also works correctly with # respect to the estimates (and the booked hours, etc, but # that should be fine. # First make a second story for pasting into. iteration.invokeFactory('Story', id='story2') story2 = iteration.story2 reset_request(story2) self.assertAnnotationStoryBrainEstimateEquality(story2, 0) self.assertAnnotationStoryBrainHoursEquality(story2, 0) # We need to commit a few times, before this works in tests. transaction.savepoint(optimistic=True) cut_data = story.manage_cutObjects(ids=['2']) story2.manage_pasteObjects(cut_data) self.assertAnnotationStoryBrainEstimateEquality(story, 0.0) self.assertAnnotationStoryBrainHoursEquality(story, 0) self.assertAnnotationStoryBrainEstimateEquality(story2, 2) self.assertAnnotationStoryBrainHoursEquality(story2, 1) # The recalc method is tested in xm.booking, but we can at # least call it once here. story.recalc()