Files
mayan-edms/mayan/apps/documents/tests/test_models.py
Roberto Rosario 74dfa53787 Update documents app
Rename the DeletedDocument proxy model to a TrashedDocument.

Rename the deleted_document views to trashed_document.

Rename the document and deleted_document URL parameters to
trashed_document.

Update URL parameters to the '_id' form.

Add keyword arguments.

Update use of .filter_by_access().

Enclose trashed document restore method in a transaction.

Sort arguments.

Update app for compliance with MERCs 5 and 6.

Add document page view tests.

Add favorite document view tests.

Movernize tests.

Replace use of urlencode with furl.

Update views to use ExternalObjectMixin.

Refactor the document and version download views.

Rename the DocumentDocumentTypeEditView to DocumentChangeTypeView.

Move the trashed document views to their own module.

Signed-off-by: Roberto Rosario <Roberto.Rosario@mayan-edms.com>
2019-01-28 05:25:48 -04:00

286 lines
9.4 KiB
Python

from __future__ import unicode_literals
from datetime import timedelta
import time
from mayan.apps.common.tests import BaseTestCase
from ..literals import STUB_EXPIRATION_INTERVAL
from ..models import (
Document, DocumentType, DuplicatedDocument, TrashedDocument
)
from .base import GenericDocumentTestCase
from .literals import (
TEST_DOCUMENT_PATH, TEST_DOCUMENT_TYPE_LABEL, TEST_MULTI_PAGE_TIFF_PATH,
TEST_OFFICE_DOCUMENT_PATH, TEST_PDF_INDIRECT_ROTATE_PATH,
TEST_SMALL_DOCUMENT_CHECKSUM, TEST_SMALL_DOCUMENT_FILENAME,
TEST_SMALL_DOCUMENT_MIMETYPE, TEST_SMALL_DOCUMENT_PATH,
TEST_SMALL_DOCUMENT_SIZE
)
from .mixins import DocumentTestMixin
class DocumentTestCase(DocumentTestMixin, BaseTestCase):
def test_natural_keys(self):
self.document.pages.first().generate_image()
self._test_database_conversion('documents')
def test_document_creation(self):
self.assertEqual(self.document_type.label, TEST_DOCUMENT_TYPE_LABEL)
self.assertEqual(self.document.exists(), True)
self.assertEqual(self.document.size, TEST_SMALL_DOCUMENT_SIZE)
self.assertEqual(
self.document.file_mimetype, TEST_SMALL_DOCUMENT_MIMETYPE
)
self.assertEqual(self.document.file_mime_encoding, 'binary')
self.assertEqual(self.document.label, TEST_SMALL_DOCUMENT_FILENAME)
self.assertEqual(
self.document.checksum, TEST_SMALL_DOCUMENT_CHECKSUM
)
self.assertEqual(self.document.page_count, 1)
def test_version_creation(self):
with open(TEST_SMALL_DOCUMENT_PATH, mode='rb') as file_object:
self.document.new_version(file_object=file_object)
with open(TEST_SMALL_DOCUMENT_PATH, mode='rb') as file_object:
self.document.new_version(
file_object=file_object, comment='test comment 1'
)
self.assertEqual(self.document.versions.count(), 3)
def test_restoring_documents(self):
self.assertEqual(Document.objects.count(), 1)
# Trash the document
self.document.delete()
self.assertEqual(TrashedDocument.objects.count(), 1)
self.assertEqual(Document.objects.count(), 0)
# Restore the document
self.document.restore()
self.assertEqual(TrashedDocument.objects.count(), 0)
self.assertEqual(Document.objects.count(), 1)
def test_trashing_documents(self):
self.assertEqual(Document.objects.count(), 1)
# Trash the document
self.document.delete()
self.assertEqual(TrashedDocument.objects.count(), 1)
self.assertEqual(Document.objects.count(), 0)
# Delete the document
self.document.delete()
self.assertEqual(TrashedDocument.objects.count(), 0)
self.assertEqual(Document.objects.count(), 0)
def test_auto_trashing(self):
"""
Test document type trashing policies. Documents are moved to the
trash, x amount of time after being uploaded
"""
self.document_type.trash_time_period = 1
# 'seconds' is not a choice via the model, used here for convenience
self.document_type.trash_time_unit = 'seconds'
self.document_type.save()
# Needed by MySQL as milliseconds value is not store in timestamp
# field
time.sleep(1.01)
self.assertEqual(Document.objects.count(), 1)
self.assertEqual(TrashedDocument.objects.count(), 0)
DocumentType.objects.check_trash_periods()
self.assertEqual(Document.objects.count(), 0)
self.assertEqual(TrashedDocument.objects.count(), 1)
def test_auto_delete(self):
"""
Test document type deletion policies. Documents are deleted from the
trash, x amount of time after being trashed
"""
self.document_type.delete_time_period = 1
# 'seconds' is not a choice via the model, used here for convenience
self.document_type.delete_time_unit = 'seconds'
self.document_type.save()
self.assertEqual(Document.objects.count(), 1)
self.assertEqual(TrashedDocument.objects.count(), 0)
self.document.delete()
self.assertEqual(Document.objects.count(), 0)
self.assertEqual(TrashedDocument.objects.count(), 1)
# Needed by MySQL as milliseconds value is not stored in timestamp
# field
time.sleep(1.01)
DocumentType.objects.check_delete_periods()
self.assertEqual(Document.objects.count(), 0)
self.assertEqual(TrashedDocument.objects.count(), 0)
class PDFCompatibilityTestCase(BaseTestCase):
def test_indirect_rotate(self):
self.document_type = DocumentType.objects.create(
label=TEST_DOCUMENT_TYPE_LABEL
)
with open(TEST_PDF_INDIRECT_ROTATE_PATH, mode='rb') as file_object:
self.document = self.document_type.new_document(
file_object=file_object
)
self.assertQuerysetEqual(
qs=Document.objects.all(), values=(repr(self.document),)
)
class OfficeDocumentTestCase(BaseTestCase):
def setUp(self):
super(OfficeDocumentTestCase, self).setUp()
self.document_type = DocumentType.objects.create(
label=TEST_DOCUMENT_TYPE_LABEL
)
with open(TEST_OFFICE_DOCUMENT_PATH, mode='rb') as file_object:
self.document = self.document_type.new_document(
file_object=file_object
)
def tearDown(self):
self.document_type.delete()
super(OfficeDocumentTestCase, self).tearDown()
def test_document_creation(self):
self.assertEqual(self.document.file_mimetype, 'application/msword')
self.assertEqual(
self.document.file_mime_encoding, 'application/mswordbinary'
)
self.assertEqual(
self.document.checksum,
'03a7e9071d2c6ae05a6588acd7dff1d890fac2772cf61abd470c9ffa6ef71f03'
)
self.assertEqual(self.document.page_count, 2)
class MultiPageTiffTestCase(BaseTestCase):
def setUp(self):
super(MultiPageTiffTestCase, self).setUp()
self.document_type = DocumentType.objects.create(
label=TEST_DOCUMENT_TYPE_LABEL
)
with open(TEST_MULTI_PAGE_TIFF_PATH, mode='rb') as file_object:
self.document = self.document_type.new_document(
file_object=file_object
)
def tearDown(self):
self.document_type.delete()
super(MultiPageTiffTestCase, self).tearDown()
def test_document_creation(self):
self.assertEqual(self.document.file_mimetype, 'image/tiff')
self.assertEqual(self.document.file_mime_encoding, 'binary')
self.assertEqual(
self.document.checksum,
'40adaa9d658b65c70a7f002dfe084a8354bb77c0dfbf1993e31fb024a285fb1d'
)
self.assertEqual(self.document.page_count, 2)
class DocumentVersionTestCase(GenericDocumentTestCase):
def test_add_new_version(self):
self.assertEqual(self.document.versions.count(), 1)
with open(TEST_DOCUMENT_PATH, mode='rb') as file_object:
self.document.new_version(
file_object=file_object
)
self.assertEqual(self.document.versions.count(), 2)
self.assertEqual(
self.document.checksum,
'c637ffab6b8bb026ed3784afdb07663fddc60099853fae2be93890852a69ecf3'
)
def test_revert_version(self):
self.assertEqual(self.document.versions.count(), 1)
# Needed by MySQL as milliseconds value is not store in timestamp
# field
time.sleep(1.01)
with open(TEST_DOCUMENT_PATH, mode='rb') as file_object:
self.document.new_version(
file_object=file_object
)
self.assertEqual(self.document.versions.count(), 2)
self.document.versions.first().revert()
self.assertEqual(self.document.versions.count(), 1)
class DocumentPassthroughManagerTestCase(BaseTestCase):
def setUp(self):
super(DocumentPassthroughManagerTestCase, self).setUp()
self.document_type = DocumentType.objects.create(
label=TEST_DOCUMENT_TYPE_LABEL
)
def tearDown(self):
self.document_type.delete()
super(DocumentPassthroughManagerTestCase, self).tearDown()
def test_document_stubs_deletion(self):
document_stub = Document.objects.create(
document_type=self.document_type
)
Document.passthrough.delete_stubs()
self.assertEqual(Document.passthrough.count(), 1)
document_stub.date_added = document_stub.date_added - timedelta(
seconds=STUB_EXPIRATION_INTERVAL + 1
)
document_stub.save()
Document.passthrough.delete_stubs()
self.assertEqual(Document.passthrough.count(), 0)
class DuplicatedDocumentsTestCase(GenericDocumentTestCase):
def test_duplicates_after_delete(self):
document_2 = self.upload_document()
document_2.delete()
document_2.delete()
self.assertEqual(DuplicatedDocument.objects.filter(document=self.document).count(), 0)
def test_duplicates_after_trash(self):
document_2 = self.upload_document()
document_2.delete()
self.assertFalse(document_2 in DuplicatedDocument.objects.get(document=self.document).documents.all())
def test_duplicate_scan(self):
document_2 = self.upload_document()
self.assertTrue(document_2 in DuplicatedDocument.objects.get(document=self.document).documents.all())