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)
Beispiel #3
0
    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()