def test_get_new_attachments(self): """get_initial_attachments returns list of attachments already existing on post""" middleware = AttachmentsMiddleware( request=RequestMock(), mode=PostingEndpoint.EDIT, user=self.user, post=self.post, ) serializer = middleware.get_serializer() attachments = serializer.get_new_attachments(middleware.user, [1, 2, 3]) self.assertEqual(attachments, []) attachment = self.mock_attachment() attachments = serializer.get_new_attachments(middleware.user, [attachment.pk]) self.assertEqual(attachments, [attachment]) # only own orphaned attachments may be assigned to posts other_user_attachment = self.mock_attachment(user=False) attachments = serializer.get_new_attachments( middleware.user, [other_user_attachment.pk]) self.assertEqual(attachments, [])
def test_steal_attachments(self): """middleware validates if attachments are already assigned to other posts""" other_post = testutils.reply_thread(self.thread) attachments = [ self.mock_attachment(post=other_post), self.mock_attachment(), ] middleware = AttachmentsMiddleware( request=RequestMock( {'attachments': [attachments[0].pk, attachments[1].pk]}), mode=PostingEndpoint.EDIT, user=self.user, post=self.post, ) serializer = middleware.get_serializer() self.assertTrue(serializer.is_valid()) middleware.save(serializer) # only unassociated attachment was associated with post self.assertEqual(self.post.update_fields, ['attachments_cache']) self.assertEqual(self.post.attachment_set.count(), 1) self.assertEqual( Attachment.objects.get(pk=attachments[0].pk).post, other_post) self.assertEqual( Attachment.objects.get(pk=attachments[1].pk).post, self.post)
def test_edit_attachments(self): """middleware removes and adds attachments to post""" attachments = [ self.mock_attachment(post=self.post), self.mock_attachment(post=self.post), self.mock_attachment(), ] middleware = AttachmentsMiddleware( request=RequestMock( {'attachments': [attachments[0].pk, attachments[2].pk]}), mode=PostingEndpoint.EDIT, user=self.user, post=self.post, ) serializer = middleware.get_serializer() self.assertTrue(serializer.is_valid()) middleware.save(serializer) # attachments were associated with post self.assertEqual(self.post.update_fields, ['attachments_cache']) self.assertEqual(self.post.attachment_set.count(), 2) attachments_filenames = [ attachments[2].filename, attachments[0].filename ] self.assertEqual([a['filename'] for a in self.post.attachments_cache], attachments_filenames)
def test_add_attachments(self): """middleware adds attachments to post""" attachments = [ self.mock_attachment(), self.mock_attachment(), ] middleware = AttachmentsMiddleware(request=RequestMock( {'attachments': [a.pk for a in attachments]}), mode=PostingEndpoint.EDIT, user=self.user, post=self.post) serializer = middleware.get_serializer() self.assertTrue(serializer.is_valid()) middleware.save(serializer) # attachments were associated with post self.assertEqual(self.post.update_fields, ['attachments_cache']) self.assertEqual(self.post.attachment_set.count(), 2) attachments_filenames = list( reversed([a.filename for a in attachments])) self.assertEqual([a['filename'] for a in self.post.attachments_cache], attachments_filenames)
def test_steal_attachments(self): """middleware validates if attachments are already assigned to other posts""" other_post = testutils.reply_thread(self.thread) attachments = [ self.mock_attachment(post=other_post), self.mock_attachment(), ] middleware = AttachmentsMiddleware( request=RequestMock({ 'attachments': [attachments[0].pk, attachments[1].pk] }), mode=PostingEndpoint.EDIT, user=self.user, post=self.post, ) serializer = middleware.get_serializer() self.assertTrue(serializer.is_valid()) middleware.save(serializer) # only unassociated attachment was associated with post self.assertEqual(self.post.update_fields, ['attachments_cache']) self.assertEqual(self.post.attachment_set.count(), 1) self.assertEqual(Attachment.objects.get(pk=attachments[0].pk).post, other_post) self.assertEqual(Attachment.objects.get(pk=attachments[1].pk).post, self.post)
def test_edit_attachments(self): """middleware removes and adds attachments to post""" attachments = [ self.mock_attachment(post=self.post), self.mock_attachment(post=self.post), self.mock_attachment(), ] middleware = AttachmentsMiddleware( request=RequestMock({ 'attachments': [attachments[0].pk, attachments[2].pk] }), mode=PostingEndpoint.EDIT, user=self.user, post=self.post, ) serializer = middleware.get_serializer() self.assertTrue(serializer.is_valid()) middleware.save(serializer) # attachments were associated with post self.assertEqual(self.post.update_fields, ['attachments_cache']) self.assertEqual(self.post.attachment_set.count(), 2) attachments_filenames = [attachments[2].filename, attachments[0].filename] self.assertEqual([a['filename'] for a in self.post.attachments_cache], attachments_filenames)
def test_use_this_middleware(self): """use_this_middleware returns False if we can't upload attachments""" middleware = AttachmentsMiddleware(user=self.user) self.override_acl({'max_attachment_size': 0}) self.assertFalse(middleware.use_this_middleware()) self.override_acl({'max_attachment_size': 1024}) self.assertTrue(middleware.use_this_middleware())
def test_middleware_is_optional(self): """middleware is optional""" INPUTS = ({}, {'attachments': []}) for test_input in INPUTS: middleware = AttachmentsMiddleware(request=RequestMock(test_input), mode=PostingEndpoint.START, user=self.user, post=self.post) serializer = middleware.get_serializer() self.assertTrue(serializer.is_valid())
def test_middleware_is_optional(self): """middleware is optional""" INPUTS = [{}, {'attachments': []}] for test_input in INPUTS: middleware = AttachmentsMiddleware( request=RequestMock(test_input), mode=PostingEndpoint.START, user=self.user, post=self.post, ) serializer = middleware.get_serializer() self.assertTrue(serializer.is_valid())
def test_middleware_validates_ids(self): """middleware validates attachments ids""" INPUTS = ('none', ['a', 'b', 123], range(settings.MISAGO_POST_ATTACHMENTS_LIMIT + 1)) for test_input in INPUTS: middleware = AttachmentsMiddleware(request=RequestMock( {'attachments': test_input}), mode=PostingEndpoint.START, user=self.user, post=self.post) serializer = middleware.get_serializer() self.assertFalse(serializer.is_valid(), "%r shouldn't validate" % test_input)
def test_middleware_validates_ids(self): """middleware validates attachments ids""" INPUTS = ['none', ['a', 'b', 123], range(settings.MISAGO_POST_ATTACHMENTS_LIMIT + 1)] for test_input in INPUTS: middleware = AttachmentsMiddleware( request=RequestMock({ 'attachments': test_input }), mode=PostingEndpoint.START, user=self.user, post=self.post, ) serializer = middleware.get_serializer() self.assertFalse(serializer.is_valid(), "%r shouldn't validate" % test_input)
def test_get_initial_attachments(self): """get_initial_attachments returns list of attachments already existing on post""" middleware = AttachmentsMiddleware(request=RequestMock(), mode=PostingEndpoint.EDIT, user=self.user, post=self.post) serializer = middleware.get_serializer() attachments = serializer.get_initial_attachments( middleware.mode, middleware.user, middleware.post) self.assertEqual(attachments, []) attachment = self.mock_attachment(post=self.post) attachments = serializer.get_initial_attachments( middleware.mode, middleware.user, middleware.post) self.assertEqual(attachments, [attachment])
def test_cant_delete_attachment(self): """middleware validates if we have permission to delete other users attachments""" self.override_acl({ 'max_attachment_size': 1024, 'can_delete_other_users_attachments': False }) attachment = self.mock_attachment(user=False, post=self.post) self.assertIsNone(attachment.uploader) serializer = AttachmentsMiddleware(request=RequestMock( {'attachments': []}), mode=PostingEndpoint.EDIT, user=self.user, post=self.post).get_serializer() self.assertFalse(serializer.is_valid())
def test_cant_delete_attachment(self): """middleware validates if we have permission to delete other users attachments""" self.override_acl({ 'max_attachment_size': 1024, 'can_delete_other_users_attachments': False, }) attachment = self.mock_attachment(user=False, post=self.post) self.assertIsNone(attachment.uploader) serializer = AttachmentsMiddleware( request=RequestMock({ 'attachments': [] }), mode=PostingEndpoint.EDIT, user=self.user, post=self.post, ).get_serializer() self.assertFalse(serializer.is_valid())
def test_get_initial_attachments(self): """get_initial_attachments returns list of attachments already existing on post""" middleware = AttachmentsMiddleware( request=RequestMock(), mode=PostingEndpoint.EDIT, user=self.user, post=self.post, ) serializer = middleware.get_serializer() attachments = serializer.get_initial_attachments( middleware.mode, middleware.user, middleware.post ) self.assertEqual(attachments, []) attachment = self.mock_attachment(post=self.post) attachments = serializer.get_initial_attachments( middleware.mode, middleware.user, middleware.post ) self.assertEqual(attachments, [attachment])
def test_get_new_attachments(self): """get_initial_attachments returns list of attachments already existing on post""" middleware = AttachmentsMiddleware( request=RequestMock(), mode=PostingEndpoint.EDIT, user=self.user, post=self.post, ) serializer = middleware.get_serializer() attachments = serializer.get_new_attachments(middleware.user, [1, 2, 3]) self.assertEqual(attachments, []) attachment = self.mock_attachment() attachments = serializer.get_new_attachments(middleware.user, [attachment.pk]) self.assertEqual(attachments, [attachment]) # only own orphaned attachments may be assigned to posts other_user_attachment = self.mock_attachment(user=False) attachments = serializer.get_new_attachments(middleware.user, [other_user_attachment.pk]) self.assertEqual(attachments, [])
def get_middleware_for_testing(**kwargs): mock_kwargs = { 'prefix': 'test', 'mode': 0, 'request': None, 'user': None, 'datetime': None, 'parsing_result': None, 'thread': None, 'post': None, } mock_kwargs.update(kwargs) return AttachmentsMiddleware(**mock_kwargs)