test cases for #67

This commit is contained in:
jonaswinkler 2020-11-29 15:47:56 +01:00
parent a27daaebe9
commit 023aeea7ea
5 changed files with 43 additions and 18 deletions

View File

@ -53,7 +53,8 @@ them running.
Testing and code style: Testing and code style:
* Run ``pytest`` in the src/ directory to execute all tests. This also generates a HTML coverage * Run ``pytest`` in the src/ directory to execute all tests. This also generates a HTML coverage
report. report. When runnings test, paperless.conf is loaded as well. However: the tests rely on the default
configuration. This is not ideal. But for now, make sure no settings except for DEBUG are overridden when testing.
* Run ``pycodestyle`` to test your code for issues with the configured code style settings. * Run ``pycodestyle`` to test your code for issues with the configured code style settings.
.. note:: .. note::

View File

@ -169,7 +169,9 @@ class Consumer(LoggingMixin):
# Afte performing all database operations and moving files # Afte performing all database operations and moving files
# into place, tell paperless where the file is. # into place, tell paperless where the file is.
document.filename = generate_filename(document) document.filename = os.path.basename(document.source_path)
# Saving the document now will trigger the filename handling
# logic.
document.save() document.save()
# Delete the file only if it was successfully consumed # Delete the file only if it was successfully consumed

View File

@ -218,7 +218,11 @@ def update_filename_and_move_files(sender, instance, **kwargs):
try: try:
os.rename(old_path, new_path) os.rename(old_path, new_path)
instance.filename = new_filename instance.filename = new_filename
instance.save() # Don't save here to prevent infinite recursion.
Document.objects.filter(pk=instance.pk).update(filename=new_filename)
logging.getLogger(__name__).debug(
f"Moved file {old_path} to {new_path}.")
except OSError as e: except OSError as e:
instance.filename = old_filename instance.filename = old_filename

View File

@ -563,13 +563,34 @@ class TestConsumer(DirectoriesMixin, TestCase):
document = self.consumer.try_consume_file(filename, override_filename="Bank - Test.pdf", override_title="new docs") document = self.consumer.try_consume_file(filename, override_filename="Bank - Test.pdf", override_title="new docs")
print(document.source_path)
print("===")
self.assertEqual(document.title, "new docs") self.assertEqual(document.title, "new docs")
self.assertEqual(document.correspondent.name, "Bank") self.assertEqual(document.correspondent.name, "Bank")
self.assertEqual(document.filename, "bank/new-docs-0000001.pdf") self.assertEqual(document.filename, "bank/new-docs-0000001.pdf")
@override_settings(PAPERLESS_FILENAME_FORMAT="{correspondent}/{title}")
@mock.patch("documents.signals.handlers.generate_filename")
def testFilenameHandlingUnstableFormat(self, m):
filenames = ["this", "that", "now this", "i cant decide"]
def get_filename():
f = filenames.pop()
filenames.insert(0, f)
return f
m.side_effect = lambda f: get_filename()
filename = self.get_test_file()
Tag.objects.create(name="test", is_inbox_tag=True)
document = self.consumer.try_consume_file(filename, override_filename="Bank - Test.pdf", override_title="new docs")
self.assertEqual(document.title, "new docs")
self.assertEqual(document.correspondent.name, "Bank")
self.assertIsNotNone(os.path.isfile(document.title))
self.assertTrue(os.path.isfile(document.source_path))
@mock.patch("documents.consumer.DocumentClassifier") @mock.patch("documents.consumer.DocumentClassifier")
def testClassifyDocument(self, m): def testClassifyDocument(self, m):
correspondent = Correspondent.objects.create(name="test") correspondent = Correspondent.objects.create(name="test")

View File

@ -1,14 +1,15 @@
import os import os
import shutil import shutil
from pathlib import Path from pathlib import Path
from unittest import mock
from uuid import uuid4 from uuid import uuid4
from django.conf import settings from django.conf import settings
from django.db import DatabaseError
from django.test import TestCase, override_settings from django.test import TestCase, override_settings
from ..file_handling import generate_filename, create_source_path_directory, delete_empty_directories from ..file_handling import generate_filename, create_source_path_directory, delete_empty_directories
from ..models import Document, Correspondent from ..models import Document, Correspondent
from ..signals.handlers import update_filename_and_move_files
class TestDate(TestCase): class TestDate(TestCase):
@ -133,18 +134,14 @@ class TestDate(TestCase):
document.correspondent = Correspondent.objects.get_or_create( document.correspondent = Correspondent.objects.get_or_create(
name="test")[0] name="test")[0]
# This will cause save() to fail. with mock.patch("documents.signals.handlers.Document.objects.filter") as m:
document.checksum = document1.checksum m.side_effect = DatabaseError()
document.save()
# Assume saving the document initially works, this gets called. # Check proper handling of files
# After renaming, an error occurs, and filename is not saved: self.assertTrue(os.path.isfile(document.source_path))
# document should still be available at document.filename. self.assertEqual(os.path.isfile(settings.MEDIA_ROOT + "/documents/originals/none/none-{:07d}.pdf".format(document.pk)), True)
update_filename_and_move_files(None, document) self.assertEqual(document.filename, "none/none-{:07d}.pdf".format(document.pk))
# Check proper handling of files
self.assertTrue(os.path.isfile(document.source_path))
self.assertEqual(os.path.isfile(settings.MEDIA_ROOT + "/documents/originals/none/none-{:07d}.pdf".format(document.pk)), True)
self.assertEqual(document.filename, "none/none-{:07d}.pdf".format(document.pk))
@override_settings(PAPERLESS_FILENAME_FORMAT="{correspondent}/{correspondent}") @override_settings(PAPERLESS_FILENAME_FORMAT="{correspondent}/{correspondent}")
def test_document_delete(self): def test_document_delete(self):