Example #1
0
    def test_create_and_download_attachment(self):
        # create file for uploading
        filecontent = 'Hello World'
        temp = tempfile.NamedTemporaryFile(delete=False)
        temp.write(filecontent.encode())
        temp.close()

        f = File(open(temp.name, 'r'))
        attachment = Attachment(file=f, creator=self.user, issue=self.issue)
        attachment.save()
        f.close()
        # delete the uploaded file locally
        os.unlink(temp.name)

        issue = Issue.objects.get(pk=self.issue.pk)
        self.assertEqual(self.issue.attachments.count(), 1)
        attachment = self.issue.attachments.first()
        self.assertEqual(attachment.creator, self.user)
        self.assertEqual(attachment.seqnum, 1)
        self.assertEqual(attachment.issue.nextAttachmentId, 2)

        response = self.client.get(reverse('issue:download_attachment',
                                   kwargs={'project': proj_short, 'sqn_i': 1, 'sqn_a': attachment.seqnum}))
        self.assertEqual(response.status_code, 200)
        self.assertEqual("application/octet-stream", response.get('Content-Type'))
        self.assertEqual(response.resolver_match.func.__name__, AttachmentDownloadView.as_view().__name__)
        # delete the uploaded file from the server
        os.unlink(MEDIA_ROOT + '/' + attachment.file.name)
Example #2
0
    def test_attachment_delete(self):
        # create sample attachment
        filecontent = 'Hello World'
        temp = tempfile.NamedTemporaryFile(delete=False)
        temp.write(filecontent.encode())
        temp.close()
        f = File(open(temp.name, 'r'))
        attachment = Attachment(file=f, creator=self.user, issue=self.issue)
        attachment.save()
        f.close()
        filePath = attachment.file.path
        self.assertTrue(os.path.isfile(filePath))

        # delete the attachment
        response = self.client.get(reverse('issue:delete_attachment',
                                           kwargs={'project': self.project.name_short,
                                                   'sqn_i': self.issue.number,
                                                   'sqn_a': attachment.seqnum}),
                                   follow=True)
        self.assertRedirects(response, reverse('issue:detail', kwargs={'project': self.project.name_short,
                                                                       'sqn_i': self.issue.number}))
        self.assertFalse(self.issue.attachments.all().exists())
        self.assertFalse(os.path.isfile(filePath))

        # delete temp file locally
        os.unlink(temp.name)
Example #3
0
class IssueSearchTest(TestCase):
    @classmethod
    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')

    def setUp(self):
        self.project = Project(creator=self.user, name_short='PRJ')
        self.project.save()
        self.project.manager.add(self.user)

        # create issue, comment and attachment
        self.issue = Issue(title="Test-Issue",
                           project=self.project,
                           kanbancol=self.project.kanbancol.first(),
                           type="Bug")
        self.issue.save()

        self.comment = Comment(issue=self.issue, creator=self.user)
        self.comment.save()

        self.attachment = Attachment(issue=self.issue, creator=self.user)
        self.attachment.save()

    def test_check_credentials(self):
        for i in [self.project, self.issue, self.comment, self.attachment]:
            self.assertEqual(
                getattr(i, 'user_has_read_permissions')(self.user), 1)
            self.assertEqual(
                getattr(i, 'user_has_write_permissions')(self.user), 1)

        # remove write permissions
        user2 = get_user_model().objects.create_user('d', 'e', 'f')

        self.project.developer.add(self.user)
        self.project.manager.remove(self.user)
        self.comment.creator = user2
        self.comment.save()
        self.attachment.creator = user2
        self.attachment.save()

        # issue and project do distinguish between read and write permissions
        for i in [self.project, self.issue]:
            self.assertEqual(
                getattr(i, 'user_has_read_permissions')(self.user), 1)
            self.assertEqual(
                getattr(i, 'user_has_write_permissions')(self.user), 0)

        for i in [self.comment, self.attachment]:
            self.assertEqual(
                getattr(i, 'user_has_read_permissions')(self.user), 1)
            self.assertEqual(
                getattr(i, 'user_has_write_permissions')(self.user), 0)

        # remove read permissions
        self.project.developer.remove(self.user)

        for i in [self.project, self.issue, self.comment, self.attachment]:
            self.assertEqual(
                getattr(i, 'user_has_read_permissions')(self.user), 0)
            self.assertEqual(
                getattr(i, 'user_has_write_permissions')(self.user), 0)
Example #4
0
    def test_notification_types_and_mention_feature(self):
        self.client.force_login(self.user1)
        issue = Issue(title="asdf", project=self.project, creator=self.user1)
        issue.save()

        # mention with bullshit input
        Comment(creator=self.user1, issue=issue, text='@everybody').save()
        self.assertEqual(
            self.user2.notifications.get(issue=issue).type.filter(
                type='Mention').count(), 0)
        self.assertEqual(
            self.user1.notifications.filter(issue=issue).count(), 0)
        Comment(creator=self.user1, issue=issue,
                text='@thisisnousername').save()
        self.assertEqual(
            self.user2.notifications.get(issue=issue).type.filter(
                type='Mention').count(), 0)
        self.assertEqual(
            self.user1.notifications.filter(issue=issue).count(), 0)

        # NewIssue-Type in notification
        self.assertEqual(self.user2.notifications.first().type.first().type,
                         'NewIssue')

        Comment(creator=self.user1, issue=issue, text='mention @user2').save()
        # NewIssue-Type plus Mention-Type in notification
        self.assertEqual(self.user2.notifications.first().type.first().type,
                         'NewIssue')
        self.assertEqual(self.user2.notifications.first().type.last().type,
                         'Mention')

        # user1 is following the issue because he created it
        comm = Comment(creator=self.user2,
                       issue=issue,
                       text='lets make a comment')
        comm.save()
        self.assertEqual(self.user1.notifications.first().type.first().type,
                         'NewComment')
        self.assertEqual(self.user1.notifications.first().type.first().comment,
                         comm)

        comm.text = 'edited comment'
        comm.save()
        # NewComment-Type got replaced by EditComment-Type
        self.assertEqual(self.user1.notifications.first().type.first().type,
                         'EditComment')
        self.assertEqual(self.user1.notifications.first().type.first().comment,
                         comm)
        self.assertEqual(self.user1.notifications.first().type.count(), 1)

        comm.text = 'mention @user1"'
        comm.save()
        # NewComment-Type got replaced by Mention-Type
        self.assertEqual(self.user1.notifications.first().type.first().type,
                         'Mention')
        self.assertEqual(self.user1.notifications.first().type.first().comment,
                         comm)
        self.assertEqual(self.user1.notifications.first().type.count(), 1)

        comm.text = 'mentionedited @user1"'
        comm.save()
        # still Mention-Type
        self.assertEqual(self.user1.notifications.first().type.first().type,
                         'Mention')
        self.assertEqual(self.user1.notifications.first().type.first().comment,
                         comm)
        self.assertEqual(self.user1.notifications.first().type.count(), 1)

        # third user for project
        user3 = get_user_model().objects.create_user('user3', '*****@*****.**',
                                                     'c')
        self.project.developer.add(user3)

        issue2 = Issue(title="a new issue",
                       project=self.project,
                       creator=self.user1)
        issue2.save()
        self.assertEqual(
            user3.notifications.get(issue=issue2).type.filter(
                type="NewIssue").exists(), True)
        self.assertEqual(
            self.user2.notifications.get(issue=issue2).type.filter(
                type="NewIssue").exists(), True)

        comm2 = Comment(creator=self.user1, issue=issue2, text='@user2')
        comm2.save()
        comm2.text = 'lets make a comment with a all mention @all'
        comm2.save()

        # user1 created comment, mention for user2 and user3
        self.assertEqual(
            user3.notifications.get(issue=issue2).type.filter(
                comment=comm2, type="Mention").exists(), True)
        self.assertEqual(
            self.user2.notifications.get(issue=issue2).type.filter(
                comment=comm2, type="Mention").exists(), True)
        self.assertEqual(
            self.user1.notifications.filter(issue=issue2).count(), 0)

        comm3 = Comment(
            creator=self.user2,
            issue=issue2,
            text='lets make a comment from user2 with a all mention @all')
        comm3.save()

        # user2 created comment, mention for user1 and user3
        self.assertEqual(
            user3.notifications.get(issue=issue2).type.filter(
                type="Mention").count(), 2)
        self.assertEqual(
            self.user1.notifications.get(issue=issue2).type.filter(
                comment=comm3, type="Mention").exists(), True)
        self.assertEqual(
            self.user2.notifications.get(issue=issue2).type.filter(
                comment=comm3, type="Mention").count(), 0)

        issue3 = Issue(title="test multiple comment notifications",
                       project=self.project,
                       creator=self.user1)
        issue3.save()
        # instant mention
        self.user2.notifications.get(issue=issue3).delete()
        mention = Comment(creator=self.user1, issue=issue3, text='@user2')
        mention.save()
        self.assertEqual(
            self.user2.notifications.get(issue=issue3).type.filter(
                type="Mention", comment=mention).count(), 1)

        comm4 = Comment(creator=self.user2,
                        issue=issue3,
                        text='lets make a comment from user2')
        comm4.save()
        self.assertEqual(
            self.user1.notifications.get(issue=issue3).type.filter(
                type="NewComment").count(), 1)
        comm5 = Comment(creator=self.user2,
                        issue=issue3,
                        text='lets make another comment from user2')
        comm5.save()
        self.assertEqual(
            self.user1.notifications.get(issue=issue3).type.filter(
                type="NewComment").count(), 2)
        comm4.text = 'now a mention @user1'
        comm4.save()
        self.assertEqual(
            self.user1.notifications.get(issue=issue3).type.filter(
                type="NewComment").count(), 1)
        self.assertEqual(
            self.user1.notifications.get(issue=issue3).type.filter(
                type="Mention").count(), 1)
        comm5.text = 'now a mention @user1'
        comm5.save()
        self.assertEqual(
            self.user1.notifications.get(issue=issue3).type.filter(
                type="NewComment").count(), 0)
        self.assertEqual(
            self.user1.notifications.get(issue=issue3).type.filter(
                type="Mention").count(), 2)

        # test create comment trumped by edit comment trumped by mention
        comm6 = Comment(creator=self.user2,
                        issue=issue2,
                        text='lets make a comment from user2')
        comm6.save()
        self.assertEqual(
            self.user1.notifications.get(issue=issue2).type.filter(
                comment=comm6, type="NewComment").count(), 1)
        comm6.text = 'edited comment'
        comm6.save()
        self.assertEqual(
            self.user1.notifications.get(issue=issue2).type.filter(
                comment=comm6, type="NewComment").count(), 0)
        self.assertEqual(
            self.user1.notifications.get(issue=issue2).type.filter(
                comment=comm6, type="EditComment").count(), 1)
        # still one edit notification
        comm6.text = 'annother edit'
        comm6.save()
        self.assertEqual(
            self.user1.notifications.get(issue=issue2).type.filter(
                comment=comm6, type="EditComment").count(), 1)

        comm6.text = 'now a mention @user1'
        comm6.save()
        self.assertEqual(
            self.user1.notifications.get(issue=issue2).type.filter(
                comment=comm6, type="EditComment").count(), 0)
        self.assertEqual(
            self.user1.notifications.get(issue=issue2).type.filter(
                comment=comm6, type="Mention").count(), 1)
        number = comm6.seqnum

        # delete all notitypes for user1 on issue2 except the comm6 mention
        for notitype in self.user1.notifications.get(issue=issue2).type.all():
            if notitype.comment.seqnum == number:
                continue
            else:
                notitype.delete()

        # delete mention comme notification object gets deletedd
        comm6.delete()
        self.assertEqual(
            self.user1.notifications.filter(issue=issue2).count(), 0)

        # test attachment
        filecontent = 'Hello World'
        temp = tempfile.NamedTemporaryFile(delete=False)
        temp.write(filecontent.encode())
        temp.close()

        f = File(open(temp.name, 'r'))
        attachment = Attachment(file=f, creator=self.user2, issue=issue2)
        attachment.save()
        f.close()

        self.assertEqual(
            self.user1.notifications.get(issue=issue2).type.filter(
                type="NewAttachment").count(), 1)
        # delete the uploaded file from the server
        os.unlink(MEDIA_ROOT + '/' + attachment.file.name)
        # delete the uploaded file locally
        os.unlink(temp.name)