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)
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)
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)
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)