Exemple #1
0
class TestEstimateTracking(test.TestCase):
    fixtures = ['burndown.json']

    def setUp(self):
        self.iter = Iteration.objects.all().get()
        self.task = Task.objects.all().get()
        self.old_remaining = self.task.remaining
        self.log = TaskLog(task=self.task,
                           time_on_task=1,
                           summary='...',
                           date=self.iter.start_date + datetime.timedelta(1),
                           owner=User.objects.all().get(),
                           old_remaining=self.old_remaining)
        self.task.remaining = self.task.remaining - self.log.time_on_task
        self.log.save()
        self.task.save()
        
    def test_remaining_after_log_is_equal_to_remaining(self):
        self.assertEqual(self.task.remaining_for_date(self.iter.end_date),
                         self.task.remaining or 0)

    def test_remaining_before_log_is_equal_to_estimate(self):
        self.assertEqual(self.task.remaining_for_date(self.iter.start_date),
                         self.task.estimate or 0)

        
    def test_burndown_data(self):
        bd = self.iter.burndown_data()
        # burndown data should be a list of dicts, for convenience
        self.assertEqual(bd[0],
                         dict(day=0,
                              remaining=self.task.estimate or 0,
                              ideal=self.task.estimate or 0))

    def test_burndown_data_too(self):
        bd = self.iter.burndown_data()
        # burndown data should be a list of dicts, for convenience
        self.assertEqual(bd[-1],
                         dict(day=10,
                              remaining=self.task.remaining or 0,
                              ideal=0))

    def test_burndown_shows_no_remaining_for_days_in_the_future(self):
        today = datetime.datetime.now().date()
        self.iter.start_date = today - datetime.timedelta(7)
        self.iter.end_date = today + datetime.timedelta(7)
        self.iter.save()

        self.assertEqual(self.iter.burndown_data()[-1]['remaining'], None)
Exemple #2
0
 def setUp(self):
     self.iter = Iteration.objects.all().get()
     self.task = Task.objects.all().get()
     self.old_remaining = self.task.remaining
     self.log = TaskLog(task=self.task,
                        time_on_task=1,
                        summary='...',
                        date=self.iter.start_date + datetime.timedelta(1),
                        owner=User.objects.all().get(),
                        old_remaining=self.old_remaining)
     self.task.remaining = self.task.remaining - self.log.time_on_task
     self.log.save()
     self.task.save()
Exemple #3
0
    def test_tc79(self):
        """
        A task that has actual time logged should not have its time
        remaining value changed, even when the estimated time value is
        changed.
        """
        tl = TaskLog(task=self.task_b,
                     time_on_task=5,
                     summary='...',
                     date=datetime.date.today(),
                     iteration=self.iteration,
                     owner=self.user,
                     old_remaining=self.task_b.remaining)
        tl.save()

        b = self.browser
        b.open(self.task_b.get_absolute_url() + 'edit/')
        b.wait()
        estimate = str(self.task_b.estimate * 3)
        b.type("id_estimate", estimate)
        self.assertEqual(Decimal(b.get_value("id_remaining")),
                         Decimal(str(self.task_b.remaining)))
Exemple #4
0
    def setUp(self):
        super(TestUS254, self).setUp()

        self.user_story_states = dict((v,k) for (k,v) in UserStory.STATES)

        self.story_2 = UserStory(name='TestUS254 A', project=self.project,
                               description='a userstory to test us254',
                               iteration=self.iteration, planned=42, rank=1,
                               state=10, blocked=False)
        self.story_2.save()

        self.story_3 = UserStory(name='TestUS254 B', project=self.project,
                               description='another userstory to test us254',
                               iteration=self.iteration, planned=42, rank=1,
                               state=10, blocked=False)
        self.story_3.save()

        self.story_4 = UserStory(name='TestUS254 C', project=self.project,
                               description='yet another userstory to test us254',
                               iteration=self.iteration, planned=42, rank=1,
                               state=10, blocked=False)
        self.story_4.save()

        self.story_5 = UserStory(name='TestUS254 D', project=self.project,
                               description='again, yet another userstory to test us254',
                               iteration=self.iteration, planned=42, rank=1,
                               state=10, blocked=False)
        self.story_5.save()

        
        self.task_states = dict((v,k) for (k,v) in Task.STATES)

        # actuals > 0, not completed -> change state to In progress

        self.task_c = Task(name="Task C", estimate=8, remaining=6,
                           state=self.task_states['Defined'],
                           owner=self.user, user_story=self.story_2)
        self.task_c.save()

        self.tasklog_c = TaskLog(task=self.task_c, time_on_task=2, summary='test',
                                 date=datetime.today(), owner=self.user,
                                 old_remaining=0)

        self.tasklog_c.save()

        # actuals > 0, completed, remaining > 0, all task in us completed -> 
        # should change US to complete and change task to complete, remaining 0

        self.task_d = Task(name="Task D", estimate=2, remaining=2,
                           state=self.task_states['Complete'],
                           owner=self.user, user_story=self.story_3)
        self.task_d.save()

        self.task_f = Task(name="Task F", estimate=2, remaining=0,
                           state=self.task_states['Complete'],
                           owner=self.user, user_story=self.story_3)
        self.task_f.save()

        self.tasklog_f = TaskLog(task=self.task_f, time_on_task=2, summary='test',
                                 date=datetime.today(), owner=self.user,
                                 old_remaining=0)

        self.tasklog_f.save()

        self.tasklog_d = TaskLog(task=self.task_d, time_on_task=2, summary='test',
                                 date=datetime.today(), owner=self.user,
                                 old_remaining=0)

        self.tasklog_d.save()


        # actuals > 0, defined, remaining = 0, not all task in us completed 
        # should change to complete.                           
        self.task_e = Task(name="Task E", estimate=2, remaining=0,
                           state=self.task_states['Defined'],
                           owner=self.user, user_story=self.story_2)
        self.task_e.save()

        self.tasklog_e = TaskLog(task=self.task_e, time_on_task=2, summary='test',
                                 date=datetime.today(), owner=self.user,
                                 old_remaining=0)

        self.tasklog_e.save()

        # actuals > 0, in progress, remaining = 0, not all task in us completed 
        # should change to complete.   
        self.task_g = Task(name="Task G", estimate=2, remaining=0,
                           state=self.task_states['In Progress'],
                           owner=self.user, user_story=self.story_2)
        self.task_g.save()

        self.tasklog_g = TaskLog(task=self.task_g, time_on_task=2, summary='test',
                                 date=datetime.today(), owner=self.user,
                                 old_remaining=0)

        self.tasklog_g.save()
Exemple #5
0
class TestUS254(TestUS49Base):

    def setUp(self):
        super(TestUS254, self).setUp()

        self.user_story_states = dict((v,k) for (k,v) in UserStory.STATES)

        self.story_2 = UserStory(name='TestUS254 A', project=self.project,
                               description='a userstory to test us254',
                               iteration=self.iteration, planned=42, rank=1,
                               state=10, blocked=False)
        self.story_2.save()

        self.story_3 = UserStory(name='TestUS254 B', project=self.project,
                               description='another userstory to test us254',
                               iteration=self.iteration, planned=42, rank=1,
                               state=10, blocked=False)
        self.story_3.save()

        self.story_4 = UserStory(name='TestUS254 C', project=self.project,
                               description='yet another userstory to test us254',
                               iteration=self.iteration, planned=42, rank=1,
                               state=10, blocked=False)
        self.story_4.save()

        self.story_5 = UserStory(name='TestUS254 D', project=self.project,
                               description='again, yet another userstory to test us254',
                               iteration=self.iteration, planned=42, rank=1,
                               state=10, blocked=False)
        self.story_5.save()

        
        self.task_states = dict((v,k) for (k,v) in Task.STATES)

        # actuals > 0, not completed -> change state to In progress

        self.task_c = Task(name="Task C", estimate=8, remaining=6,
                           state=self.task_states['Defined'],
                           owner=self.user, user_story=self.story_2)
        self.task_c.save()

        self.tasklog_c = TaskLog(task=self.task_c, time_on_task=2, summary='test',
                                 date=datetime.today(), owner=self.user,
                                 old_remaining=0)

        self.tasklog_c.save()

        # actuals > 0, completed, remaining > 0, all task in us completed -> 
        # should change US to complete and change task to complete, remaining 0

        self.task_d = Task(name="Task D", estimate=2, remaining=2,
                           state=self.task_states['Complete'],
                           owner=self.user, user_story=self.story_3)
        self.task_d.save()

        self.task_f = Task(name="Task F", estimate=2, remaining=0,
                           state=self.task_states['Complete'],
                           owner=self.user, user_story=self.story_3)
        self.task_f.save()

        self.tasklog_f = TaskLog(task=self.task_f, time_on_task=2, summary='test',
                                 date=datetime.today(), owner=self.user,
                                 old_remaining=0)

        self.tasklog_f.save()

        self.tasklog_d = TaskLog(task=self.task_d, time_on_task=2, summary='test',
                                 date=datetime.today(), owner=self.user,
                                 old_remaining=0)

        self.tasklog_d.save()


        # actuals > 0, defined, remaining = 0, not all task in us completed 
        # should change to complete.                           
        self.task_e = Task(name="Task E", estimate=2, remaining=0,
                           state=self.task_states['Defined'],
                           owner=self.user, user_story=self.story_2)
        self.task_e.save()

        self.tasklog_e = TaskLog(task=self.task_e, time_on_task=2, summary='test',
                                 date=datetime.today(), owner=self.user,
                                 old_remaining=0)

        self.tasklog_e.save()

        # actuals > 0, in progress, remaining = 0, not all task in us completed 
        # should change to complete.   
        self.task_g = Task(name="Task G", estimate=2, remaining=0,
                           state=self.task_states['In Progress'],
                           owner=self.user, user_story=self.story_2)
        self.task_g.save()

        self.tasklog_g = TaskLog(task=self.task_g, time_on_task=2, summary='test',
                                 date=datetime.today(), owner=self.user,
                                 old_remaining=0)

        self.tasklog_g.save()



    def tearDown(self):
        super(TestUS254, self).tearDown()
        for obj in self.tasklog_f, self.tasklog_e, self.tasklog_d, self.tasklog_c,\
            self.task_g, self.task_f, self.task_e, self.task_d, self.task_c,\
            self.story_5, self.story_4, self.story_3, self.story_2:
            obj.delete() 

    def test_adding_a_task_in_progress_changes_us_to_in_progress(self):
        b = self.browser
        b.click("link=Iteration")
        b.wait()

        b.click("link=TestUS254 D")
        b.wait()        

        b.click("link=add a task")
        b.wait()

        b.type("id_name", "A sample detailed task")
        b.type("id_description", "This is a detailed task")
        b.type("id_estimate", "10")
        b.type("id_remaining", "10")
        b.type("id_state", "20")
        b.click("xpath=id('content')/form/input")
        b.wait()

        obj = UserStory.objects.get(id=self.story_5.id)
        self.assertEqual(obj.state, 20)

    def test_adding_a_task_in_progress_and_one_task_complete_changes_us_to_in_progress(self):
        b = self.browser
        b.click("link=Iteration")
        b.wait()

        b.click("link=TestUS254 D")
        b.wait()        
        last_location = b.get_location()

        b.click("link=add a task")
        b.wait()

        b.type("id_name", "A sample detailed task")
        b.type("id_description", "This is a detailed task")
        b.type("id_estimate", "10")
        b.type("id_remaining", "10")
        b.type("id_state", "20")
        b.click("xpath=id('content')/form/input")
        b.wait()

        obj = UserStory.objects.get(id=self.story_5.id)
        self.assertEqual(obj.state, 20)
        self.assertEqual(last_location, b.get_location())

        b.click("link=add a task")
        b.wait()

        b.type("id_name", "A sample detailed task")
        b.type("id_description", "This is a detailed task")
        b.type("id_estimate", "10")
        b.type("id_remaining", "0")
        b.type("id_state", "30")
        b.click("xpath=id('content')/form/input")
        b.wait()

        obj = UserStory.objects.get(id=self.story_5.id)
        self.assertEqual(obj.state, 20)

 
    def test_adding_a_task_define_does_not_change_state_of_us(self):
        b = self.browser
        b.click("link=Iteration")
        b.wait()

        b.click("link=TestUS254 D")
        b.wait()        

        b.click("link=add a task")
        b.wait()

        b.type("id_name", "A sample detailed task")
        b.type("id_description", "This is a detailed task")
        b.type("id_estimate", "10")
        b.type("id_remaining", "10")
        b.type("id_state", "10")
        b.click("xpath=id('content')/form/input")
        b.wait()

        obj = UserStory.objects.get(id=self.story_5.id)
        self.assertEqual(obj.state, 10)

    def test_editing_task_with_actuals_sets_from_defined_to_complete(self):
        # Task has actuals > 0 is on state defined should change state to 'In Progress'
        # Should change story to 'In Progress'

        b = self.browser
        b.click("link=Iteration")
        b.wait()

        b.click("link=TestUS254 A")
        b.wait()        

        b.click("xpath=id('task_edit_%d')/img" % self.task_c.id)
        b.wait()

        b.click("xpath=id('content')/form/input")
        b.wait()

        # Reload obj task, self.task_c is on a stale state:
        obj = Task.objects.get(id=self.task_c.id)
        # Check that only that the state changed
        self.assertEqual(obj.name, "Task C")
        self.assertEqual(obj.description, '')
        self.assertEqual(obj.estimate, 8)
        self.assertEqual(obj.remaining, 6)
        self.assertEqual(obj.owner, self.user)
        self.assertEqual(obj.user_story, self.story_2)
        self.assertEqual(obj.state, self.task_states['In Progress'])  
        self.assertEqual(obj.user_story.state, self.user_story_states['In Progress'])

    def test_editing_task_with_actuals_and_in_complete_state_sets_remaining_to_zero(self):
        # Task has actuals > 0, is completed, and has remaining > 0. 
        # All task in us completed. (There are two) 
        # should change US to complete and change task to complete, remaining 0
        
        b = self.browser
        b.click("link=Iteration")
        b.wait()

        b.click("link=TestUS254 B")
        b.wait()        

        b.click("xpath=id('task_edit_%d')/img" % self.task_d.id)
        b.wait()

        b.click("xpath=id('content')/form/input")
        b.wait()

        # Reload obj task, self.task_c is on a stale state:
        obj = Task.objects.get(id=self.task_d.id)
        # Check that nothing else changed except that which should
        self.assertEqual(obj.name, "Task D")
        self.assertEqual(obj.description, '')
        self.assertEqual(obj.estimate, 2)
        self.assertEqual(obj.remaining, 0)
        self.assertEqual(obj.owner, self.user)
        self.assertEqual(obj.user_story, self.story_3)
        self.assertEqual(obj.state, self.task_states['Complete'])  
        self.assertEqual(obj.user_story.state, self.user_story_states['Completed'])

    def test_editing_task_with_actuals_remaining_on_zero_in_defined_state_sets_state_to_complete(self):
        # Task has actuals > 0, is defined, and has remaining = 0. 
        # Not all task in us completed.
        # Should change US to In Progress and change task to complete, remaining 0

        
        b = self.browser
        b.click("link=Iteration")
        b.wait()

        b.click("link=TestUS254 A")
        b.wait()        

        b.click("xpath=id('task_edit_%d')/img" % self.task_e.id)
        b.wait()

        b.click("xpath=id('content')/form/input")
        b.wait()

        # Reload obj task, self.task_c is on a stale state:
        obj = Task.objects.get(id=self.task_e.id)
        # Check that nothing else changed except that which should
        self.assertEqual(obj.name, "Task E")
        self.assertEqual(obj.description, '')
        self.assertEqual(obj.estimate, 2)
        self.assertEqual(obj.remaining, 0)
        self.assertEqual(obj.owner, self.user)
        self.assertEqual(obj.user_story, self.story_2)
        self.assertEqual(obj.state, self.task_states['Complete'])  
        self.assertEqual(obj.user_story.state, self.user_story_states['In Progress'])

    def test_editing_task_with_actuals_remaining_on_zero_in_in_progress_state_sets_state_to_complete(self):
        # Task has actuals > 0, is in progress, and has remaining = 0. 
        # Not all task in us completed.
        # Should change US to In Progress and change task to complete, remaining 0
        
        b = self.browser
        b.click("link=Iteration")
        b.wait()

        b.click("link=TestUS254 A")
        b.wait()        

        b.click("xpath=id('task_edit_%d')/img" % self.task_g.id)
        b.wait()

        b.click("xpath=id('content')/form/input")
        b.wait()

        # Reload obj task, self.task_c is on a stale state:
        obj = Task.objects.get(id=self.task_g.id)
        # Check that nothing else changed except that which should
        self.assertEqual(obj.name, "Task G")
        self.assertEqual(obj.description, '')
        self.assertEqual(obj.estimate, 2)
        self.assertEqual(obj.remaining, 0)
        self.assertEqual(obj.owner, self.user)
        self.assertEqual(obj.user_story, self.story_2)
        self.assertEqual(obj.state, self.task_states['Complete'])  
        self.assertEqual(obj.user_story.state, self.user_story_states['In Progress'])