from datetime import timedelta from django.conf import settings from django.test import TestCase from django.utils import timezone from django.utils.six import StringIO from misago.categories.models import Category from .. import testutils from ..management.commands import clearattachments from ..models import Attachment, AttachmentType class ClearAttachmentsTests(TestCase): def test_no_attachments_sync(self): """command works when there are no attachments""" command = clearattachments.Command() out = StringIO() command.execute(stdout=out) command_output = out.getvalue().strip() self.assertEqual(command_output, "No attachments were found") def test_attachments_sync(self): """command synchronizes attachments""" filetype = AttachmentType.objects.order_by('id').last() # create 5 expired orphaned attachments cutoff = timezone.now() - timedelta(minutes=settings.MISAGO_ATTACHMENT_ORPHANED_EXPIRE) cutoff -= timedelta(minutes=5) for i in range(5): Attachment.objects.create( secret=Attachment.generate_new_secret(), filetype=filetype, size=1000, uploaded_on=cutoff, uploader_name='bob', uploader_slug='bob', uploader_ip='127.0.0.1', filename='testfile_{}.zip'.format(Attachment.objects.count() + 1), ) # create 5 expired non-orphaned attachments category = Category.objects.get(slug='first-category') post = testutils.post_thread(category).first_post for i in range(5): Attachment.objects.create( secret=Attachment.generate_new_secret(), filetype=filetype, size=1000, uploaded_on=cutoff, post=post, uploader_name='bob', uploader_slug='bob', uploader_ip='127.0.0.1', filename='testfile_{}.zip'.format(Attachment.objects.count() + 1), ) # create 5 fresh orphaned attachments for i in range(5): Attachment.objects.create( secret=Attachment.generate_new_secret(), filetype=filetype, size=1000, uploader_name='bob', uploader_slug='bob', uploader_ip='127.0.0.1', filename='testfile_{}.zip'.format(Attachment.objects.count() + 1), ) command = clearattachments.Command() out = StringIO() command.execute(stdout=out) command_output = out.getvalue().splitlines()[-1].strip() self.assertEqual(command_output, "Cleared 5 attachments") self.assertEqual(Attachment.objects.count(), 10)