Beispiel #1
0
    def test_show_other_user_profile_page(self):
        otheruser = get_user_model().objects.create_user('uname', '[email protected]', 'abcd')

        sharedproject = Project(creator=self.user, name_short='SPRJ')
        sharedproject.save()
        sharedproject.developer.add(self.user)
        sharedproject.developer.add(otheruser)
        notsharedproject = Project(creator=self.user, name_short='NPRJ')
        notsharedproject.save()
        notsharedproject.developer.add(self.user)

        sharedissue = Issue(title='abcd', project=sharedproject)
        sharedissue.save()
        sharedissue.assignee.add(self.user)
        sharedissue.assignee.add(otheruser)
        notsharedissue = Issue(title='efgh', project=sharedproject)
        notsharedissue.save()
        notsharedissue.assignee.add(self.user)

        response = self.client.get(reverse('user_profile:user_profile_page', kwargs={"username": otheruser.username}))
        self.assertContains(response, otheruser.username)
        self.assertContains(response, sharedproject)
        self.assertContains(response, sharedissue)
        self.assertNotIn(notsharedissue, response.context['sharedissues'])
        self.assertNotIn(notsharedproject, response.context['sharedprojects'])
Beispiel #2
0
 def setUp(self):
     self.client.force_login(self.user)
     # NOTE: this element gets modified by some of those tests, so this shall NOT be created in setUpTestData()
     self.project = Project(creator=self.user, name_short='PRJ')
     self.project.save()
     self.project.developer.add(self.user)
     self.project.developer.add(self.user2)
     # NOTE: this element gets modified by some of those tests, so this shall NOT be created in setUpTestData()
     self.kanbancol = KanbanColumn(project=self.project,
                                   position=4,
                                   name='test')
     self.kanbancol.save()
     # NOTE: this element gets modified by some of those tests, so this shall NOT be created in setUpTestData()
     self.issue = Issue(
         title='a very very very very very very very long issue title',
         project=self.project,
         due_date='2016-12-16',
         kanbancol=self.kanbancol,
         storypoints='3')
     self.issue.save()
     self.issue2 = Issue(title='issue title',
                         project=self.project,
                         due_date='2016-12-16',
                         kanbancol=self.kanbancol,
                         storypoints='3')
     self.issue2.save()
     self.issue.assignee.add(self.user)
Beispiel #3
0
    def setUp(self):
        self.client.force_login(self.user)
        # NOTE: this element gets modified by some of those tests, so this shall NOT be created in setUpTestData()
        self.project = Project(creator=self.user, name_short='PRJ', activity_only_for_managers=False)
        self.project.save()
        self.project.developer.add(self.user)

        self.project2 = Project(creator=self.user, activity_only_for_managers=True, name_short='PRJJ')
        self.project2.save()
        self.project2.manager.add(self.user)
        self.project2.developer.add(self.user, self.user2)

        # NOTE: this element gets modified by some of those tests, so this shall NOT be created in setUpTestData()
        self.kanbancol = KanbanColumn(project=self.project, position=4, name='test')
        self.kanbancol.save()
        # NOTE: this element gets modified by some of those tests, so this shall NOT be created in setUpTestData()
        self.issue = Issue(title='a very very very very very very very long issue title',
                           project=self.project,
                           due_date='2016-12-16',
                           kanbancol=self.kanbancol,
                           storypoints='3'
                           )
        self.issue.save()
        self.issue.assignee.add(self.user)
        self.issue2 = Issue(title='second_issue', project=self.project)
        self.issue2.save()
        self.issue2.assignee.add(self.user)
        self.time = now().strftime("%Y-%m-%d %H:%M:%S")
 def setUp(self):
     # NOTE: these elements get modified by some testcases, so they should NOT be created in setUpTestData()
     self.project = Project(creator=self.user1, name_short='asdf')
     self.project.save()
     self.project.developer.add(self.user1)
     self.project.developer.add(self.user2)
     self.project.manager.add(self.user1)
     self.project2 = Project(creator=self.user2, name_short='asdg')
     self.project2.save()
     self.project2.manager.add(self.user2)
     self.issue = Issue(title='test', project=self.project)
     self.issue.save()
     self.issue2 = Issue(title='test', project=self.project2)
     self.issue2.save()
     self.comment = Comment(text='test', creator=self.user1, issue=self.issue)
     self.comment.save()
     self.comment2 = Comment(text='test', creator=self.user2, issue=self.issue2)
     self.comment2.save()
     self.log = Timelog(time=datetime.timedelta(hours=2), user=self.user1, issue=self.issue)
     self.log.save()
     self.log2 = Timelog(time=datetime.timedelta(hours=2), user=self.user2, issue=self.issue2)
     self.log2.save()
     self.user1_auth = 'Basic ' + base64.b64encode('user1:c'.encode()).decode()
     self.user2_auth = 'Basic ' + base64.b64encode('user2:c'.encode()).decode()
     self.client.credentials(HTTP_AUTHORIZATION=self.user1_auth)
Beispiel #5
0
    def test_stop_sprint_move_issues_to_new_sprint(self):
        # self.sprint should not have started
        self.assertNotEqual(self.sprint.seqnum, -1)
        project = Project(creator=self.user, name_short='APF')
        project.save()
        project.manager.add(self.user)

        sprint = Sprint(project=project)
        sprint.save()
        self.assertEqual(project.sprint.get_new_sprints().count(), 1)

        # columns and issues for testing archiving function
        kanbancol1 = KanbanColumn.objects.get(name='Todo', project=project)
        kanbancol2 = KanbanColumn.objects.get(name='In Progress', project=project)
        kanbancol3 = KanbanColumn.objects.get(name='Done', project=project)

        issue = Issue(title="Test-Issue", kanbancol=kanbancol1, project=project, type="Bug", sprint=sprint)
        issue.save()
        issue2 = Issue(title="Test-Issue2", kanbancol=kanbancol2, project=project, type="Bug", sprint=sprint)
        issue2.save()
        issue3 = Issue(title="Test-Issue3", kanbancol=kanbancol2, project=project, type="Bug", sprint=sprint)
        issue3.save()
        issue4 = Issue(title="Test-Issue4", kanbancol=kanbancol3, project=project, type="Bug")
        issue4.save()
        sprint.set_active()

        # move to autocreated sprint
        response = self.client.post(reverse('sprint:stopsprint',
                                            kwargs={'project': project.name_short, 'sqn_s': sprint.seqnum}),
                                    {'sprint': 'new', 'move_to_new_sprint': [issue.number, issue2.number]},
                                    follow=True)
        # new sprint created
        # self.sprint and sprint created during post request
        self.assertEqual(project.sprint.all().count(), 2)
        self.assertEqual(project.sprint.get_new_sprints().count(), 1)
        self.assertEqual(project.sprint.get_old_sprints().count(), 1)

        # issue, issue2 in new sprint, issue3 in backlog
        self.assertIn(issue, project.sprint.get_new_sprints().last().issue.all())
        self.assertIn(issue2, project.sprint.get_new_sprints().last().issue.all())
        self.assertNotIn(issue3, project.sprint.get_new_sprints().last().issue.all())
        issue3.refresh_from_db()
        self.assertEqual(issue3.sprint, None)

        # move to existing sprint
        sprint = project.sprint.get_new_sprints().last()
        sprint.set_active()
        project.refresh_from_db()
        sprint2 = Sprint(project=project)
        sprint2.save()
        response = self.client.post(reverse('sprint:stopsprint',
                                            kwargs={'project': project.name_short, 'sqn_s': sprint.seqnum}),
                                    {'sprint': sprint2.seqnum, 'move_to_new_sprint': [issue.number]},
                                    follow=True)

        # issue in sprint2, issue2 moved to backlog
        self.assertIn(issue, sprint2.issue.all())
        self.assertNotIn(issue2, sprint2.issue.all())
        issue2.refresh_from_db()
        self.assertEqual(issue2.sprint, None)
Beispiel #6
0
    def setUpTestData(cls):
        # NOTE: if you modify those elements they need to be created in setUp, instead of here
        cls.user = get_user_model().objects.create_user('a', 'b', 'c')
        cls.user2 = get_user_model().objects.create_user('d', 'e', 'f')
        cls.project = Project(creator=cls.user, name_short='PRJ')
        cls.project.save()
        cls.project.developer.add(cls.user)
        cls.project2 = Project(creator=cls.user, name_short='PROJ')
        cls.project2.save()
        cls.project2.developer.add(cls.user)
        cls.project2.developer.add(cls.user2)
        # create test data (They are needed for search-purpose only)
        cls.issue = Issue(title="Test-Issue",
                          project=cls.project,
                          kanbancol=cls.project.kanbancol.first(),
                          type="Bug")
        cls.issue.save()
        issue = Issue(title="Blub-Issue", project=cls.project, kanbancol=cls.project.kanbancol.first(), type="Bug")
        issue.save()
        issue = Issue(title="Bla-Issue", project=cls.project, kanbancol=cls.project.kanbancol.first(), type="Task")
        issue.save()

        cls.issuep2 = Issue(title="Bling-Issue",
                            project=cls.project2,
                            kanbancol=cls.project2.kanbancol.first(),
                            type="Task")
        cls.issuep2.due_date = datetime.date(2000, 1, 1)
        cls.issuep2.save()
Beispiel #7
0
    def setUp(self):
        self.user = get_user_model().objects.create_user(
            'test', '*****@*****.**', 'test')
        self.project = Project(creator=self.user, name_short='PRJ')
        self.project.save()
        self.project.developer.add(self.user)
        # NOTE: those elements get modified by some of those tests, so this shall NOT be created in setUpTestData()
        self.issue = Issue(title='issue title',
                           project=self.project,
                           due_date='2016-12-16',
                           storypoints='3')
        self.issue.save()
        self.issue2 = Issue(title='title2',
                            project=self.project,
                            due_date='2016-12-16',
                            storypoints='3')
        self.issue2.save()
        self.issue.assignee.add(self.user)

        # Uses the cookie hack from:
        # https://stackoverflow.com/questions/22494583/login-with-code-when-using-liveservertestcase-with-django
        client = Client()
        client.login(username='******', password='******')
        self.cookie = client.cookies['sessionid']
        self.selenium.get("{}{}".format(self.live_server_url,
                                        reverse('timelog:loginfo')))
        self.selenium.add_cookie({
            'name': 'sessionid',
            'value': self.cookie.value,
            'secure': False,
            'path': '/'
        })
        self.selenium.refresh()
Beispiel #8
0
    def setUp(self):
        self.user = get_user_model().objects.create_user(
            'a_user', '*****@*****.**', 'a1234568')
        self.project = Project(name="Projectname",
                               name_short="proj",
                               creator=self.user)
        self.project.save()
        self.project.manager.add(self.user)
        self.short = self.project.name_short

        tag = Tag(project=self.project, tag_text="foo")
        tag.save()
        Issue(project=self.project, title="a").save()
        issue = Issue(project=self.project, title="b")
        issue.save()
        issue.tags.add(tag)

        # Uses the cookie hack from:
        # https://stackoverflow.com/questions/22494583/login-with-code-when-using-liveservertestcase-with-django
        client = Client()
        client.login(username='******', password='******')
        self.cookie = client.cookies['sessionid']
        self.selenium.get("{}{}".format(self.live_server_url,
                                        reverse('invite_users:invite_users')))
        self.selenium.add_cookie({
            'name': 'sessionid',
            'value': self.cookie.value,
            'secure': False,
            'path': '/'
        })
        self.selenium.refresh()
Beispiel #9
0
    def setUp(self):
        self.client.force_login(self.user)
        # NOTE: these elements get modified by some testcases, so they should NOT be created in setUpTestData()
        self.project = Project(creator=self.user, name_short='PRJ', activity_only_for_managers=False)
        self.project.save()
        self.project.developer.add(self.user)

        self.project2 = Project(creator=self.user, activity_only_for_managers=True, name_short='PRJJ')
        self.project2.save()
        self.project2.manager.add(self.user)
        self.project2.developer.add(self.user, self.user2)

        self.kanbancol = KanbanColumn(project=self.project, position=4, name='test')
        self.kanbancol.save()
        self.issue = Issue(title='a very very very very very very very long issue title',
                           project=self.project,
                           due_date='2016-12-16',
                           kanbancol=self.kanbancol,
                           storypoints='3'
                           )
        self.issue.save()
        self.issue.assignee.add(self.user)
        self.issue2 = Issue(title='second_issue', project=self.project)
        self.issue2.save()
        self.issue2.assignee.add(self.user)
        self.time = now().strftime("%Y-%m-%d %H:%M:%S")

        # success logedit_address_kwargs
        self.sqn_l1_address_kwarg = {"project": self.issue.project.name_short,
                                     "sqn_i": self.issue.number,
                                     "sqn_l": 1
                                     }
Beispiel #10
0
    def test_board_order_by(self):

        # driver.find_element_by_id("dropdownMenu1").click()
        # driver.find_element_by_link_text("Sprint 1").click()

        # create project and issues
        driver = self.selenium
        project = Project(name='TestProjekt', name_short='TP', creator=self.user)
        project.save()
        project.developer.add(self.user)
        issue1 = Issue(project=project, title="TestIssue1", priority=4, type='Story')
        issue2 = Issue(project=project, title="TestIssue2", priority=0, type='Bug')
        issue3 = Issue(project=project, title="TestIssue3", priority=3, type='Task')
        issue4 = Issue(project=project, title="TestIssue3", priority=2, type='Task')
        issue5 = Issue(project=project, title="TestIssue3", priority=0, type='Story')

        issue1.save()
        issue2.save()
        issue3.save()
        issue4.save()
        issue5.save()

        # check order_by number
        driver.get("{}{}".format(self.live_server_url, reverse('sprint:sprintboard',
                                                               kwargs={'project': project.name_short}
                                                               )))
        col = driver.find_element_by_id("sortable0")
        issues = col.find_elements_by_class_name("issuecard")
        for i in range(len(issues)-1):
            self.assertEqual(issues[i].get_attribute("id") < issues[i+1].get_attribute("id"), True)

        # check order_by priority
        driver.get("{}{}".format(self.live_server_url, reverse('sprint:sprintboard',
                                                               kwargs={'project': project.name_short}
                                                               ))+"?order_by=priority")
        col = driver.find_element_by_id("sortable0")
        issues = col.find_elements_by_class_name("issuecard")
        for i in range(len(issues)-1):
            self.assertEqual(issues[i].get_attribute("data-priority") >= issues[i+1].get_attribute("data-priority"),
                             True)

        # check order_by title
        driver.get("{}{}".format(self.live_server_url, reverse('sprint:sprintboard',
                                                               kwargs={'project': project.name_short}
                                                               ))+"?order_by=title")
        col = driver.find_element_by_id("sortable0")
        issues = col.find_elements_by_class_name("issuecard")
        for i in range(len(issues)-1):
            self.assertEqual(issues[i].get_attribute("data-title") <= issues[i+1].get_attribute("data-title"), True)

        # check order_by Type
        driver.get("{}{}".format(self.live_server_url, reverse('sprint:sprintboard',
                                                               kwargs={'project': project.name_short}
                                                               ))+"?order_by=type")
        col = driver.find_element_by_id("sortable0")
        issues = col.find_elements_by_class_name("issuecard")
        for i in range(len(issues)-1):
            self.assertEqual(issues[i].get_attribute("data-type") <= issues[i+1].get_attribute("data-type"), True)
Beispiel #11
0
    def test_sprints_and_issues_in_archive_view(self):
        newsprint = Sprint(project=self.project)
        newsprint.save()
        startedsprint = Sprint(project=self.project,
                               startdate=datetime.datetime.now())
        startedsprint.save()
        stoppedsprint = Sprint(project=self.project,
                               startdate=datetime.datetime.now(),
                               enddate=datetime.datetime.now())
        stoppedsprint.save()
        wrongsprint = Sprint(project=self.project,
                             enddate=datetime.datetime.now())
        wrongsprint.save()
        issueinnew = Issue(title="boo",
                           project=self.project,
                           sprint=newsprint,
                           archived=True)
        issueinnew.save()
        issueinstarted = Issue(title="coo",
                               project=self.project,
                               sprint=startedsprint,
                               archived=True)
        issueinstarted.save()
        issueinstopped = Issue(title="doo",
                               project=self.project,
                               sprint=stoppedsprint,
                               archived=True)
        issueinstopped.save()
        issueinwrong = Issue(title="foo",
                             project=self.project,
                             sprint=wrongsprint,
                             archived=True)
        issueinwrong.save()
        issueinno = Issue(title="goo", project=self.project, archived=True)
        issueinno.save()

        response = self.client.get(
            reverse('archive:archive',
                    kwargs={'project': self.project.name_short}))
        self.assertNotIn(issueinnew,
                         response.context['archived_issues_without_sprint'])
        self.assertNotIn(issueinwrong,
                         response.context['archived_issues_without_sprint'])
        self.assertNotIn(issueinstopped,
                         response.context['archived_issues_without_sprint'])
        self.assertNotIn(issueinstarted,
                         response.context['archived_issues_without_sprint'])
        self.assertIn(issueinno,
                      response.context['archived_issues_without_sprint'])
        self.assertEqual(response.context['sprints_sorted'].all()[0],
                         wrongsprint)
        self.assertEqual(response.context['sprints_sorted'].all()[1],
                         stoppedsprint)
        self.assertEqual(response.context['sprints_sorted'].all()[2],
                         startedsprint)
        self.assertEqual(response.context['sprints_sorted'].all()[3],
                         newsprint)
Beispiel #12
0
    def test_board_filter_my_issues(self):
        driver = self.selenium
        project = Project(name='TestProjekt',
                          name_short='TP',
                          creator=self.user)
        project.save()
        project.developer.add(self.user)
        issue1 = Issue(project=project,
                       title="TestIssue1",
                       priority=4,
                       type='Story')
        issue2 = Issue(project=project,
                       title="TestIssue2",
                       priority=0,
                       type='Bug')
        issue3 = Issue(project=project,
                       title="TestIssue3",
                       priority=3,
                       type='Task')
        issue4 = Issue(project=project,
                       title="TestIssue3",
                       priority=2,
                       type='Task')
        issue5 = Issue(project=project,
                       title="TestIssue3",
                       priority=0,
                       type='Story')

        issue1.save()
        issue2.save()
        issue3.save()
        issue4.save()
        issue5.save()

        driver.get("{}{}".format(
            self.live_server_url,
            reverse('sprint:sprintboard',
                    kwargs={'project': project.name_short})))

        # 5 issues in col 0
        col = driver.find_element_by_id("sortable0")
        issues = col.find_elements_by_class_name("issuecard")
        self.assertEqual(len(issues), 5)

        issue1.assignee.add(self.user)

        driver.get("{}{}".format(
            self.live_server_url,
            reverse('sprint:sprintboard',
                    kwargs={'project': project.name_short})) +
                   "?myissues=true")

        # 1 issue in col 0
        col = driver.find_element_by_id("sortable0")
        issues = col.find_elements_by_class_name("issuecard")
        self.assertEqual(len(issues), 1)
Beispiel #13
0
    def setUp(self):

        self.user = get_user_model().objects.create_user('a', 'b', 'c')
        self.user.last_name = 'Issue'
        self.user.save()
        # Uses the cookie hack from:
        # https://stackoverflow.com/questions/22494583/login-with-code-when-using-liveservertestcase-with-django
        client = Client()
        client.login(username='******', password='******')
        self.cookie = client.cookies['sessionid']
        self.selenium.get('{}{}'.format(self.live_server_url,
                                        reverse('landing_page:home')))
        self.selenium.add_cookie({
            'name': 'sessionid',
            'value': self.cookie.value,
            'secure': False,
            'path': '/'
        })
        self.selenium.refresh()

        # project: user is manager
        self.project = Project(creator=self.user,
                               name="asdf",
                               description='project for fancy issues',
                               name_short="PRJ")
        self.project.save()
        self.project.developer.add(self.user)
        self.project.manager.add(self.user)
        self.projiss1 = Issue(title="Issue for Proj1",
                              project=self.project,
                              kanbancol=self.project.kanbancol.first(),
                              type="Task")
        self.projiss1.save()
        self.projiss2 = Issue(title="Another Issue for Proj1",
                              project=self.project,
                              kanbancol=self.project.kanbancol.first(),
                              type="Bug")
        self.projiss2.save()
        # project2: user is developer
        self.project2 = Project(creator=self.user,
                                name="2ndproj",
                                name_short="PRJ2")
        self.project2.save()
        self.project2.developer.add(self.user)
        # project2: user is neither developer nor manager
        self.project3 = Project(creator=self.user,
                                name="3rdproj",
                                name_short="PRJ3")
        self.project3.save()
        self.proj2iss1 = Issue(title="Issue for Proj2",
                               project=self.project2,
                               kanbancol=self.project2.kanbancol.first(),
                               type="Bug")
        self.proj2iss1.save()
 def create_some_issues(self):
     col = KanbanColumn.objects.filter(project=self.project)
     col2 = KanbanColumn.objects.filter(project=self.project2)
     iss = []
     iss.append(Issue(title='asd', kanbancol=col.get(pk=1), priority=0, type='Bug', project=self.project))
     iss.append(Issue(title='asd2', kanbancol=col.get(pk=2), priority=1, type='Story', project=self.project))
     iss.append(Issue(title='asd3', kanbancol=col.get(pk=3), priority=2, type='Task', project=self.project))
     iss.append(Issue(title='asd4', kanbancol=col.get(pk=3), priority=3, archived=True, project=self.project))
     iss.append(Issue(title='asd5', kanbancol=col2.first(), priority=4, project=self.project2))
     for issue in iss:
         issue.save()
         issue.assignee.add(self.user)
     return iss
Beispiel #15
0
 def setUp(self):
     self.client.force_login(self.user)
     # NOTE: these elements get modified by some testcases, so they should NOT be created in setUpTestData()
     self.issue = Issue(project=self.project,
                        due_date='2016-12-16',
                        kanbancol=self.kanbancol,
                        storypoints='3')
     self.issue.save()
     self.issue2 = Issue(project=self.project2,
                         due_date='2016-12-16',
                         kanbancol=self.kanbancol,
                         storypoints='3')
     self.issue2.save()
Beispiel #16
0
 def setUpTestData(cls):
     # NOTE: if you modify these elements they need to be created in setUp(), instead of here
     cls.user = get_user_model().objects.create_user('test', '*****@*****.**', 'test1234')
     cls.project = Project(creator=cls.user, name_short='PRJ')
     cls.project.save()
     cls.project.developer.add(cls.user)
     cls.kanbancol = KanbanColumn(project=cls.project, position=4, name='test')
     cls.kanbancol.save()
     cls.issue = Issue(project=cls.project, due_date='2016-12-16', kanbancol=cls.kanbancol, storypoints='3')
     cls.issue.save()
     cls.issue2 = Issue(project=cls.project, due_date='2016-12-16', kanbancol=cls.kanbancol, storypoints='3')
     cls.time = timezone.now().replace(microsecond=100000)
     cls.timestamp = cls.time.timestamp()
Beispiel #17
0
 def setUp(self):
     self.client.force_login(self.user)
     # NOTE: this element gets modified by some of those tests, so this shall NOT be created in setUpTestData()
     self.issue = Issue(project=self.project,
                        due_date='2016-12-16',
                        kanbancol=self.kanbancol,
                        storypoints='3')
     self.issue.save()
     self.issue2 = Issue(project=self.project2,
                         due_date='2016-12-16',
                         kanbancol=self.kanbancol,
                         storypoints='3')
     self.issue2.save()
Beispiel #18
0
    def test_sprint_functions(self):
        # sprint is new sprint
        self.assertTrue(self.sprint in Sprint.objects.get_new_sprints())
        self.assertFalse(self.sprint in Sprint.objects.get_current_sprints())
        self.assertFalse(self.sprint in Sprint.objects.get_old_sprints())

        # set sprint active
        self.sprint.set_active()
        self.assertTrue(self.sprint.is_active)

        # sprint is new current sprint
        self.assertFalse(self.sprint in Sprint.objects.get_new_sprints())
        self.assertTrue(self.sprint in Sprint.objects.get_current_sprints())
        self.assertFalse(self.sprint in Sprint.objects.get_old_sprints())

        # done and undone issue to put back in backlog
        kanbancoldone = KanbanColumn.objects.get(type='Done',
                                                 project=self.project)
        kanbancolprogress = KanbanColumn.objects.get(type='InProgress',
                                                     project=self.project)
        issuedone = Issue(title="Test-Issue",
                          kanbancol=kanbancoldone,
                          project=self.project,
                          type="Bug",
                          sprint=self.sprint)
        issuedone.save()
        issueprogress = Issue(title="Test-Issue",
                              kanbancol=kanbancolprogress,
                              project=self.project,
                              type="Bug",
                              sprint=self.sprint)
        issueprogress.save()

        # set sprint inactive
        issueleft = self.sprint.set_inactive()
        self.assertTrue(self.sprint.is_inactive())
        issuedone.refresh_from_db()
        issueprogress.refresh_from_db()

        # issues are right archived and assigned
        self.assertTrue(issueleft)
        self.assertTrue(issuedone.archived)
        self.assertFalse(issueprogress.archived)
        self.assertIsNotNone(issuedone.sprint)
        self.assertIsNone(issueprogress.sprint)
        self.assertTrue(issueprogress.was_in_sprint)

        # sprint is new old sprint
        self.assertFalse(self.sprint in Sprint.objects.get_new_sprints())
        self.assertFalse(self.sprint in Sprint.objects.get_current_sprints())
        self.assertTrue(self.sprint in Sprint.objects.get_old_sprints())
Beispiel #19
0
    def test_dependencies(self):
        driver = self.selenium

        # create two issues
        issue = Issue(title="title",
                      kanbancol=KanbanColumn.objects.get(project=self.project,
                                                         name="Todo"),
                      due_date=str(datetime.date.today()),
                      priority=3,
                      storypoints=2,
                      description="blubber",
                      project=self.project)
        issue.save()
        issue.assignee.add(self.user)
        issue = Issue(title="title",
                      kanbancol=KanbanColumn.objects.get(project=self.project,
                                                         name="Todo"),
                      due_date=str(datetime.date.today()),
                      priority=3,
                      storypoints=2,
                      description="blubber",
                      project=self.project)
        issue.save()
        issue.assignee.add(self.user)

        driver.get('{}{}'.format(
            self.live_server_url,
            reverse('backlog:backlog',
                    kwargs={'project': self.project.name_short})))

        driver.find_element_by_link_text("PRJ-1").click()
        driver.find_element_by_id("issue_detail_edit_link").click()
        driver.find_element_by_xpath("(//input[@type='search'])[2]").send_keys(
            '\n')
        time.sleep(1)
        self.assertEqual(
            len(
                driver.find_elements_by_css_selector(
                    '#select2-id_dependsOn-results li')), 1)
        for i in driver.find_elements_by_css_selector(
                '#select2-id_dependsOn-results li'):
            i.click()
        driver.find_element_by_id("id_submit_edit").click()
        self.assertIn('Depends on', driver.page_source)
        self.assertIn('PRJ-2', driver.page_source)
        url = driver.current_url
        driver.find_element_by_link_text("title").click()
        self.assertIn('Dependent issues', driver.page_source)
        self.assertIn('PRJ-1', driver.page_source)
        driver.find_element_by_link_text("title").click()
        self.assertEqual(url, driver.current_url)
Beispiel #20
0
    def test_dont_assign_issues_to_stoped_sprints(self):
        issue = Issue(title="Test-Issue", project=self.project, type="Bug")
        issue.save()
        issue2 = Issue(title="Test-Issue2", project=self.project, type="Bug")
        issue2.save()

        # start sprint
        self.sprint.set_active()
        self.sprint.save()
        self.project.currentsprint = self.sprint
        self.project.save()
        # assign first issue
        response = self.client.post(reverse('sprint:assigntosprint', kwargs={'project': self.project.name_short}),
                                    {'sqn_i': issue.number}, follow=True,
                                    HTTP_REFERER=reverse('backlog:backlog',
                                                         kwargs={'project': self.project.name_short}))
        self.assertRedirects(response, reverse('backlog:backlog', kwargs={'project': self.project.name_short,
                                                                          'sqn_s': self.sprint.seqnum}))
        # first issue is part of the sprint
        issue.refresh_from_db()
        self.assertIsNotNone(issue.sprint)

        # stop sprint
        response = self.client.post(reverse('sprint:stopsprint',
                                            kwargs={'project': self.project.name_short, 'sqn_s': self.sprint.seqnum}),
                                    {'sprint': 'new', 'move_to_new_sprint': []},
                                    follow=True)
        self.assertEqual(Issue.objects.get(pk=issue.pk).was_in_sprint, True)
        # assign second issue => should fail
        response = self.client.post(reverse('sprint:assigntosprint', kwargs={'project': self.project.name_short}),
                                    {'sqn_i': issue2.number}, follow=True,
                                    HTTP_REFERER=reverse('backlog:backlog',
                                                         kwargs={'project': self.project.name_short}))
        self.assertRedirects(response, reverse('backlog:backlog', kwargs={'project': self.project.name_short}))
        # second issue is NOT part of the sprint
        issue2.refresh_from_db()
        self.assertIsNone(issue2.sprint)

        # create new sprint - so we don't run into the not-sprint part but really into the atomic check for enddate
        sprint2 = Sprint(project=self.project)
        sprint2.save()

        response = self.client.post(reverse('sprint:assigntosprint', kwargs={'project': self.project.name_short}),
                                    {'sqn_i': issue2.number}, follow=True,
                                    HTTP_REFERER=reverse('backlog:backlog', kwargs={'project': self.project.name_short,
                                                                                    'sqn_s': self.sprint.seqnum}))
        self.assertRedirects(response, reverse('backlog:backlog', kwargs={'project': self.project.name_short,
                                                                          'sqn_s': self.sprint.seqnum}))
        issue2.refresh_from_db()
        self.assertIsNone(issue2.sprint)
Beispiel #21
0
 def test_get_issues(self):
     response = self.client.get(reverse('api:issues-list'))
     self.assertEqual(response.status_code, status.HTTP_200_OK)
     self.assertEqual(response.json().get('count'), 0)
     issue = Issue(title='asdf', project=self.project)
     issue.save()
     issue.assignee.add(self.user1)
     response = self.client.get(reverse('api:issues-list'))
     self.assertEqual(response.json().get('count'), 1)
     issue = Issue(title='asdf2', project=self.project)
     issue.save()
     issue.assignee.add(self.user2)
     response = self.client.get(reverse('api:issues-list'))
     self.assertEqual(response.json().get('count'), 1)
Beispiel #22
0
 def test_storypoints_in_backlog(self):
     kanbancol = KanbanColumn(name='Column',
                              position=1,
                              project=self.project)
     kanbancol.save()
     issue = Issue(title="Test-Issue",
                   kanbancol=kanbancol,
                   project=self.project,
                   type="Bug",
                   sprint=self.sprint)
     issue.save()
     response = self.client.get(
         reverse('backlog:backlog',
                 kwargs={'project': self.project.name_short}))
     self.assertNotContains(response, 'Storypoints:')
     issue.storypoints = 5
     issue.save()
     response = self.client.get(
         reverse('backlog:backlog',
                 kwargs={'project': self.project.name_short}))
     self.assertNotContains(response, 'Storypoints:')
     issue.assignee.add(self.user)
     response = self.client.get(
         reverse('backlog:backlog',
                 kwargs={'project': self.project.name_short}))
     self.assertContains(response, 'Storypoints:')
     self.assertContains(response, str(self.user.username) + ': 5')
     user2 = get_user_model().objects.create_user('a2', 'b2', 'c2')
     user2.save()
     self.project.developer.add(user2)
     issue.assignee.add(user2)
     response = self.client.get(
         reverse('backlog:backlog',
                 kwargs={'project': self.project.name_short}))
     self.assertContains(response, str(user2.username) + ': 2.5')
     self.assertContains(response, str(self.user.username) + ': 2.5')
     issue2 = Issue(title="Test-Issue",
                    kanbancol=kanbancol,
                    project=self.project,
                    type="Bug",
                    sprint=self.sprint,
                    storypoints=5)
     issue2.save()
     issue2.assignee.add(self.user)
     response = self.client.get(
         reverse('backlog:backlog',
                 kwargs={'project': self.project.name_short}))
     self.assertContains(response, str(user2.username) + ': 2.5')
     self.assertContains(response, str(self.user.username) + ': 7.5')
Beispiel #23
0
    def test_managerfunctions(self):
        issue1 = Issue(title="issue1",
                       project=self.project,
                       kanbancol=self.column)
        issue1.save()
        sprint_current = Sprint(project=self.project,
                                startdate=(timezone.now() - timedelta(days=1)))
        sprint_current.save()
        sprint_old = Sprint(project=self.project,
                            startdate=(timezone.now() - timedelta(days=14)),
                            enddate=(timezone.now() - timedelta(days=1)))
        sprint_old.save()

        issues_wo_sprint = Issue.objects.without_sprint()
        self.assertTrue(issue1 in issues_wo_sprint)

        issue1.sprint = sprint_current
        issue1.save()
        issues_cur_sprint = Issue.objects.current_sprint()
        self.assertTrue(issue1 in issues_cur_sprint)
        issue1.sprint = sprint_old
        issue1.save()
        issues_cur_sprint = Issue.objects.current_sprint()
        issues_wo_sprint = Issue.objects.without_sprint()
        self.assertFalse(issue1 in issues_cur_sprint)
        self.assertFalse(issue1 in issues_wo_sprint)
Beispiel #24
0
    def test_add_and_remove_issue_from_sprint(self):
        kanbancol = KanbanColumn(name='Column', position=1, project=self.project)
        kanbancol.save()
        issue = Issue(title="Test-Issue", kanbancol=kanbancol, project=self.project, type="Bug")
        issue.save()

        # add to sprint
        response = self.client.post(reverse('sprint:assigntosprint', kwargs={'project': self.project.name_short}),
                                    {'sqn_i': issue.number}, follow=True,
                                    HTTP_REFERER=reverse('backlog:backlog',
                                                         kwargs={'project': self.project.name_short}))
        self.assertRedirects(response, reverse('backlog:backlog', kwargs={'project': self.project.name_short,
                                                                          'sqn_s': self.sprint.seqnum}))

        self.assertEqual(Issue.objects.get(pk=issue.pk).sprint, Sprint.objects.get(pk=self.sprint.pk))

        # remove from sprint
        response = self.client.post(reverse('sprint:assigntosprint', kwargs={'project': self.project.name_short}),
                                    {'sqn_s': self.sprint.seqnum, 'sqn_i': issue.number}, follow=True,
                                    HTTP_REFERER=reverse('backlog:backlog', kwargs={'project': self.project.name_short})
                                    )
        self.assertRedirects(response, reverse('backlog:backlog', kwargs={'project': self.project.name_short,
                                                                          'sqn_s': self.sprint.seqnum}))

        self.assertEqual(Issue.objects.get(pk=issue.pk).sprint, None)
Beispiel #25
0
    def test_comment(self, slackmock):
        issue = Issue()
        issue.title = self.title_name
        issue.project = self.project
        issue.save()

        self.selenium.get(
                '{}{}'.format(
                    self.live_server_url,
                    reverse('issue:detail', kwargs={'project': self.project.name_short, 'sqn_i': issue.number})
                    )
                )
        f = self.selenium.find_element_by_id("id_text")
        f.send_keys(self.comment)
        self.selenium.find_element_by_name("action").click()
        slackmock().api_call.assert_called_with(
            "chat.postMessage",
            channel="channel",
            attachments=[{
                'fallback': str(self.user) + ' commented on \"'+self.short+'-1 '+self.title_name+'\".',
                'pretext': 'New comment:',
                'text': self.comment,
                'title': self.short+"-1 "+self.title_name,
                'title_link': "http://localhost:8000/project/"+self.short+"/issue/1/",
                'author_name': str(self.user),
                'author_link': "http://localhost:8000" + self.user.get_absolute_url(),
                'author_icon': "http://localhost:8000" + self.user.avatar.url,
                'color': 'good',
            }]
        )
Beispiel #26
0
    def test_comment_delete(self):
        # create sample issue
        issue = Issue(title="Test-Issue",
                      project=self.project,
                      kanbancol=self.column,
                      type="Bug")
        issue.save()
        # create sample comment
        comment = Comment(text="Test Comment", creator=self.user, issue=issue)
        comment.save()

        # delete the comment
        response = self.client.get(reverse('issue:delete_comment',
                                           kwargs={
                                               'project':
                                               self.project.name_short,
                                               'sqn_i': issue.number,
                                               'pk_c': comment.pk
                                           }),
                                   follow=True)
        self.assertRedirects(
            response,
            reverse('issue:detail',
                    kwargs={
                        'project': self.project.name_short,
                        'sqn_i': issue.number
                    }))
        self.assertFalse(issue.comments.all().exists())
    def test_number_kanbancolumns_for_case_not_default(self):
        driver = self.selenium
        issue = Issue(title="title", kanbancol=KanbanColumn.objects.get(project=self.project, name="Todo"),
                      due_date=str(datetime.date.today()), priority=3, storypoints=2, description="blubber",
                      project=self.project
                      )
        issue.save()
        issue.assignee.add(self.user)

        driver.get("{}{}".format(self.live_server_url, reverse('issue:create',
                                                               kwargs={'project': self.project2.name_short})))
        driver.find_element_by_id("id_title").send_keys("title")
        # assert that 2nd project has one kanban col more
        self.assertEqual(len(Select(driver.find_element_by_id("id_kanbancol")).options), 5)

        # assert that dependsOn now has one entry
        driver.get('{}{}'.format(self.live_server_url, reverse('backlog:backlog',
                                                               kwargs={'project': self.project.name_short}
                                                               )))
        driver.find_element_by_link_text("New issue").click()
        driver.find_element_by_xpath("(//input[@type='search'])[2]").send_keys('\n')
        time.sleep(1)
        self.assertEqual(len(driver.find_elements_by_css_selector('#select2-id_dependsOn-results li')), 1)
        for i in driver.find_elements_by_css_selector('#select2-id_dependsOn-results li'):
            self.assertIn("title", i.text)
Beispiel #28
0
    def test_issue_modify(self, slackmock):
        issue = Issue()
        issue.title = self.title_name
        issue.project = self.project
        issue.save()

        self.selenium.get(
                '{}{}'.format(
                    self.live_server_url,
                    reverse('issue:edit', kwargs={'project': self.short, 'sqn_i': issue.number})
                    )
                )
        f = self.selenium.find_element_by_css_selector("input.select2-search__field").click()
        time.sleep(1)
        self.selenium.find_elements_by_css_selector('#select2-id_assignee-results li')[0].click()
        self.selenium.find_element_by_id('id_submit_edit').click()
        slackmock().api_call.assert_called_with(
            "chat.postMessage",
            channel="channel",
            attachments=[{
                'fallback': str(self.user) + " changed issue "+self.short+"-1 "+self.title_name+".",
                'pretext': 'Issue changed:',
                'title': self.short+"-1 "+self.title_name,
                'title_link': "http://localhost:8000/project/"+self.short+"/issue/1/",
                'author_name': str(self.user),
                'author_link': "http://localhost:8000" + self.user.get_absolute_url(),
                'author_icon': "http://localhost:8000" + self.user.avatar.url,
                'fields': [{
                    'title': 'Assignee',
                    'value': ' → a',
                    'short': True,
                    }],
                'color': 'good',
            }]
        )
Beispiel #29
0
    def test_edit_same_settings_as_set(self):
        driver = self.selenium
        issue = Issue(title="title",
                      kanbancol=KanbanColumn.objects.get(project=self.project,
                                                         name="Todo"),
                      due_date=str(datetime.date.today()),
                      priority=3,
                      storypoints=2,
                      description="blubber",
                      project=self.project)
        issue.save()
        issue.assignee.add(self.user)
        driver.get("{}{}".format(
            self.live_server_url,
            reverse('issue:edit',
                    kwargs={
                        'project': self.project.name_short,
                        'sqn_i': issue.number
                    })))
        self.assertEqual(
            len(Select(driver.find_element_by_id("id_kanbancol")).options), 4)

        # issue must not depend on itself
        driver.find_element_by_xpath("(//input[@type='search'])[2]").send_keys(
            '\n')
        time.sleep(1)
        self.assertEqual(
            len(
                driver.find_elements_by_css_selector(
                    '#select2-id_dependsOn-results li')), 1)
        for i in driver.find_elements_by_css_selector(
                '#select2-id_dependsOn-results li'):
            self.assertEqual(i.text, "No results found")
Beispiel #30
0
    def setUp(self):
        self.user = get_user_model().objects.create_user('a', 'b', 'c')
        self.user2 = get_user_model().objects.create_user('d', 'e', 'f')
        self.project = Project(creator=self.user,
                               name="Selenium-Project",
                               name_short="SLN")
        self.project.save()
        self.project.developer.add(self.user)
        self.project.developer.add(self.user2)
        self.project.manager.add(self.user)

        self.issue = Issue(title="Test-Issue",
                           project=self.project,
                           kanbancol=self.project.kanbancol.first(),
                           type="Bug")
        self.issue.save()

        # Uses the cookie hack from:
        # https://stackoverflow.com/questions/22494583/login-with-code-when-using-liveservertestcase-with-django
        client = Client()
        client.login(username='******', password='******')
        self.cookie = client.cookies['sessionid']
        self.selenium.get("{}{}".format(self.live_server_url,
                                        reverse('invite_users:invite_users')))
        self.selenium.add_cookie({
            'name': 'sessionid',
            'value': self.cookie.value,
            'secure': False,
            'path': '/'
        })
        self.selenium.refresh()