diff --git a/HISTORY.rst b/HISTORY.rst index 3e4d0c0ed3..fef2465aa7 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -30,7 +30,7 @@ Next (2018-XX-XX) - Add periodic AJAX workers to update the value of the notifications link. - Add notification count inside a badge on the notification link. - Add the MERC specifying javascript library usage. -- Documents without at least a version are not scanned for duplicates. +- Documents without at least a version are not scanned for duplicates. - Use a SHA256 hex digest of the secret key at the name of the lockfile. This makes the generation of the name repeatable while unique between installations. - Squashed apps migrations. - Convert document thumbnails, preview, image preview and staging files to template base widgets. @@ -41,7 +41,11 @@ Next (2018-XX-XX) - Update to Fancybox 3. - Update to jQuery 3.3.1 - Move transfomations to their own module. - +- Split documents.tests.test_views into base.py, test_deleted_document_views.py, + test_document_page_views.py, test_document_type_views.py, test_document_version_views.py, + test_document_views.py, test_duplicated_document_views.py + + 2.8 (2018-02-27) ================ - Rename the role groups link label from "Members" to "Groups". diff --git a/docs/topics/pending_work.rst b/docs/topics/pending_work.rst index bbeddd7efd..faa68c01e1 100644 --- a/docs/topics/pending_work.rst +++ b/docs/topics/pending_work.rst @@ -49,7 +49,7 @@ Caching Converter ~~~~~~~~~ -- Move converter transformations to their own module. +- Move converter transformations to their own module. [DONE] Documents @@ -172,7 +172,7 @@ Testing - Update all API tests using self.client to just self. and the HTTP method. - Add test for searches for each app that uses search. - Split documents.tests.test_views into test_document_views test_pages_views, etc. - The module is too big. + The module is too big. [DONE] UI - Frontend ~~~~~~~~~~~~~ diff --git a/mayan/apps/acls/tests/test_links.py b/mayan/apps/acls/tests/test_links.py index 8722d3032c..0ccc5ca63c 100644 --- a/mayan/apps/acls/tests/test_links.py +++ b/mayan/apps/acls/tests/test_links.py @@ -3,7 +3,7 @@ from __future__ import unicode_literals from django.contrib.contenttypes.models import ContentType from django.urls import reverse -from documents.tests.test_views import GenericDocumentViewTestCase +from documents.tests import GenericDocumentViewTestCase from ..links import ( link_acl_delete, link_acl_list, link_acl_create, link_acl_permissions diff --git a/mayan/apps/acls/tests/test_views.py b/mayan/apps/acls/tests/test_views.py index 5c87c33c8e..338808b945 100644 --- a/mayan/apps/acls/tests/test_views.py +++ b/mayan/apps/acls/tests/test_views.py @@ -2,7 +2,7 @@ from __future__ import absolute_import, unicode_literals from django.contrib.contenttypes.models import ContentType -from documents.tests.test_views import GenericDocumentViewTestCase +from documents.tests import GenericDocumentViewTestCase from ..models import AccessControlList from ..permissions import permission_acl_edit, permission_acl_view diff --git a/mayan/apps/cabinets/tests/test_views.py b/mayan/apps/cabinets/tests/test_views.py index d47acaf3d4..999c683d5c 100644 --- a/mayan/apps/cabinets/tests/test_views.py +++ b/mayan/apps/cabinets/tests/test_views.py @@ -1,6 +1,6 @@ from __future__ import absolute_import, unicode_literals -from documents.tests.test_views import GenericDocumentViewTestCase +from documents.tests import GenericDocumentViewTestCase from ..models import Cabinet from ..permissions import ( diff --git a/mayan/apps/checkouts/tests/test_views.py b/mayan/apps/checkouts/tests/test_views.py index 9652e99259..95c96750b6 100644 --- a/mayan/apps/checkouts/tests/test_views.py +++ b/mayan/apps/checkouts/tests/test_views.py @@ -6,7 +6,7 @@ import logging from django.utils.timezone import now from common.literals import TIME_DELTA_UNIT_DAYS -from documents.tests.test_views import GenericDocumentViewTestCase +from documents.tests import GenericDocumentViewTestCase from sources.links import link_upload_version from user_management.tests import ( TEST_USER_PASSWORD, TEST_USER_USERNAME, TEST_ADMIN_PASSWORD, diff --git a/mayan/apps/converter/tests/test_views.py b/mayan/apps/converter/tests/test_views.py index 9deb586989..4cea22811f 100644 --- a/mayan/apps/converter/tests/test_views.py +++ b/mayan/apps/converter/tests/test_views.py @@ -2,7 +2,7 @@ from __future__ import unicode_literals from django.contrib.contenttypes.models import ContentType -from documents.tests.test_views import GenericDocumentViewTestCase +from documents.tests import GenericDocumentViewTestCase from ..models import Transformation from ..permissions import ( diff --git a/mayan/apps/document_indexing/tests/test_views.py b/mayan/apps/document_indexing/tests/test_views.py index ebe9d45c69..2dfbd425a5 100644 --- a/mayan/apps/document_indexing/tests/test_views.py +++ b/mayan/apps/document_indexing/tests/test_views.py @@ -1,6 +1,6 @@ from __future__ import absolute_import, unicode_literals -from documents.tests.test_views import GenericDocumentViewTestCase +from documents.tests import GenericDocumentViewTestCase from ..models import Index from ..permissions import ( diff --git a/mayan/apps/document_parsing/tests/test_views.py b/mayan/apps/document_parsing/tests/test_views.py index 995250e09e..a26ccd715c 100644 --- a/mayan/apps/document_parsing/tests/test_views.py +++ b/mayan/apps/document_parsing/tests/test_views.py @@ -1,7 +1,8 @@ from __future__ import unicode_literals -from documents.tests.literals import TEST_DOCUMENT_FILENAME -from documents.tests.test_views import GenericDocumentViewTestCase +from documents.tests import ( + GenericDocumentViewTestCase, TEST_DOCUMENT_FILENAME +) from ..permissions import permission_content_view from ..utils import get_document_content diff --git a/mayan/apps/document_signatures/tests/test_links.py b/mayan/apps/document_signatures/tests/test_links.py index bfe43b0e0d..05edd7540c 100644 --- a/mayan/apps/document_signatures/tests/test_links.py +++ b/mayan/apps/document_signatures/tests/test_links.py @@ -3,8 +3,9 @@ from __future__ import unicode_literals from django.core.files import File from django.urls import reverse -from documents.tests.literals import TEST_DOCUMENT_PATH -from documents.tests.test_views import GenericDocumentViewTestCase +from documents.tests import ( + GenericDocumentViewTestCase, TEST_DOCUMENT_PATH +) from ..links import ( link_document_version_signature_delete, diff --git a/mayan/apps/document_signatures/tests/test_views.py b/mayan/apps/document_signatures/tests/test_views.py index e2a4b2fbdb..573ff40064 100644 --- a/mayan/apps/document_signatures/tests/test_views.py +++ b/mayan/apps/document_signatures/tests/test_views.py @@ -8,8 +8,9 @@ from django_downloadview.test import assert_download_response from django_gpg.models import Key from documents.models import DocumentVersion -from documents.tests.literals import TEST_DOCUMENT_PATH -from documents.tests.test_views import GenericDocumentViewTestCase +from documents.tests import ( + GenericDocumentViewTestCase, TEST_DOCUMENT_PATH +) from ..models import DetachedSignature, EmbeddedSignature from ..permissions import ( diff --git a/mayan/apps/document_states/tests/test_views.py b/mayan/apps/document_states/tests/test_views.py index b5b4cb991d..273ccb1cc4 100644 --- a/mayan/apps/document_states/tests/test_views.py +++ b/mayan/apps/document_states/tests/test_views.py @@ -1,8 +1,9 @@ from __future__ import unicode_literals from common.tests.test_views import GenericViewTestCase -from documents.tests.literals import TEST_SMALL_DOCUMENT_PATH -from documents.tests.test_views import GenericDocumentViewTestCase +from documents.tests import ( + GenericDocumentViewTestCase, TEST_SMALL_DOCUMENT_PATH +) from ..models import Workflow, WorkflowState, WorkflowTransition from ..permissions import ( diff --git a/mayan/apps/documents/tests/__init__.py b/mayan/apps/documents/tests/__init__.py index 124ec460a6..68da177dbd 100644 --- a/mayan/apps/documents/tests/__init__.py +++ b/mayan/apps/documents/tests/__init__.py @@ -1 +1,2 @@ +from .base import GenericDocumentViewTestCase # NOQA from .literals import * # NOQA diff --git a/mayan/apps/documents/tests/base.py b/mayan/apps/documents/tests/base.py new file mode 100644 index 0000000000..43f7fb6c5d --- /dev/null +++ b/mayan/apps/documents/tests/base.py @@ -0,0 +1,35 @@ +# -*- coding: utf-8 -*- + +from __future__ import unicode_literals + +from django.test import override_settings + +from common.tests.test_views import GenericViewTestCase + +from ..models import DocumentType + +from .literals import ( + TEST_DOCUMENT_TYPE_LABEL, TEST_SMALL_DOCUMENT_FILENAME, + TEST_SMALL_DOCUMENT_PATH, +) + + +@override_settings(OCR_AUTO_OCR=False) +class GenericDocumentViewTestCase(GenericViewTestCase): + test_document_filename = TEST_SMALL_DOCUMENT_FILENAME + + def setUp(self): + super(GenericDocumentViewTestCase, self).setUp() + self.document_type = DocumentType.objects.create( + label=TEST_DOCUMENT_TYPE_LABEL + ) + + with open(TEST_SMALL_DOCUMENT_PATH) as file_object: + self.document = self.document_type.new_document( + file_object=file_object, label=self.test_document_filename + ) + + def tearDown(self): + if self.document_type.pk: + self.document_type.delete() + super(GenericDocumentViewTestCase, self).tearDown() diff --git a/mayan/apps/documents/tests/test_deleted_document_views.py b/mayan/apps/documents/tests/test_deleted_document_views.py new file mode 100644 index 0000000000..de9f1f4e6a --- /dev/null +++ b/mayan/apps/documents/tests/test_deleted_document_views.py @@ -0,0 +1,109 @@ +# -*- coding: utf-8 -*- + +from __future__ import unicode_literals + +from ..models import DeletedDocument, Document +from ..permissions import ( + permission_document_delete, permission_document_restore, + permission_document_trash, permission_document_view +) + +from .base import GenericDocumentViewTestCase + + +class DeletedDocumentTestCase(GenericDocumentViewTestCase): + def setUp(self): + super(DeletedDocumentTestCase, self).setUp() + self.login_user() + + def test_document_restore_view_no_permission(self): + self.document.delete() + self.assertEqual(Document.objects.count(), 0) + + response = self.post( + 'documents:document_restore', args=(self.document.pk,) + ) + self.assertEqual(response.status_code, 403) + self.assertEqual(DeletedDocument.objects.count(), 1) + self.assertEqual(Document.objects.count(), 0) + + def test_document_restore_view_with_access(self): + self.document.delete() + self.assertEqual(Document.objects.count(), 0) + + self.grant_access( + obj=self.document, permission=permission_document_restore + ) + response = self.post( + 'documents:document_restore', args=(self.document.pk,), + ) + self.assertEqual(response.status_code, 302) + self.assertEqual(DeletedDocument.objects.count(), 0) + self.assertEqual(Document.objects.count(), 1) + + def test_document_trash_no_permissions(self): + response = self.post( + 'documents:document_trash', args=(self.document.pk,) + ) + + self.assertEqual(response.status_code, 403) + self.assertEqual(DeletedDocument.objects.count(), 0) + self.assertEqual(Document.objects.count(), 1) + + def test_document_trash_with_access(self): + self.grant_access( + obj=self.document, permission=permission_document_trash + ) + + response = self.post( + 'documents:document_trash', args=(self.document.pk,), + ) + + self.assertEqual(response.status_code, 302) + self.assertEqual(DeletedDocument.objects.count(), 1) + self.assertEqual(Document.objects.count(), 0) + + def test_document_delete_no_permissions(self): + self.document.delete() + self.assertEqual(Document.objects.count(), 0) + self.assertEqual(DeletedDocument.objects.count(), 1) + + response = self.post( + 'documents:document_delete', args=(self.document.pk,), + ) + self.assertEqual(response.status_code, 403) + self.assertEqual(Document.objects.count(), 0) + self.assertEqual(DeletedDocument.objects.count(), 1) + + def test_document_delete_with_access(self): + self.document.delete() + self.assertEqual(Document.objects.count(), 0) + self.assertEqual(DeletedDocument.objects.count(), 1) + + self.grant_access( + obj=self.document, permission=permission_document_delete + ) + + response = self.post( + 'documents:document_delete', args=(self.document.pk,), + ) + self.assertEqual(response.status_code, 302) + self.assertEqual(DeletedDocument.objects.count(), 0) + self.assertEqual(Document.objects.count(), 0) + + def test_deleted_document_list_view_no_permissions(self): + self.document.delete() + + response = self.get('documents:document_list_deleted') + + self.assertNotContains(response, self.document.label, status_code=200) + + def test_deleted_document_list_view_with_access(self): + self.document.delete() + + self.grant_access( + obj=self.document, permission=permission_document_view + ) + response = self.get('documents:document_list_deleted') + + self.assertContains(response, self.document.label, status_code=200) diff --git a/mayan/apps/documents/tests/test_document_page_views.py b/mayan/apps/documents/tests/test_document_page_views.py new file mode 100644 index 0000000000..12c21e9948 --- /dev/null +++ b/mayan/apps/documents/tests/test_document_page_views.py @@ -0,0 +1,31 @@ +# -*- coding: utf-8 -*- + +from __future__ import unicode_literals + +from ..permissions import permission_document_view + +from .base import GenericDocumentViewTestCase + + +class DocumentPageViewTestCase(GenericDocumentViewTestCase): + def setUp(self): + super(DocumentPageViewTestCase, self).setUp() + self.login_user() + + def _document_page_list_view(self): + return self.get( + 'documents:document_pages', args=(self.document.pk,) + ) + + def test_document_page_list_view_no_permission(self): + response = self._document_page_list_view() + self.assertEqual(response.status_code, 403) + + def test_document_page_list_view_with_access(self): + self.grant_access( + obj=self.document, permission=permission_document_view + ) + response = self._document_page_list_view() + self.assertContains( + response, text=self.document.label, status_code=200 + ) diff --git a/mayan/apps/documents/tests/test_document_type_views.py b/mayan/apps/documents/tests/test_document_type_views.py new file mode 100644 index 0000000000..7d5719f996 --- /dev/null +++ b/mayan/apps/documents/tests/test_document_type_views.py @@ -0,0 +1,244 @@ +# -*- coding: utf-8 -*- + +from __future__ import unicode_literals + +from ..literals import ( + DEFAULT_DELETE_PERIOD, DEFAULT_DELETE_TIME_UNIT +) +from ..models import Document, DocumentType +from ..permissions import ( + permission_document_type_create, permission_document_type_delete, + permission_document_type_edit, permission_document_type_view, +) + +from .base import GenericDocumentViewTestCase +from .literals import ( + TEST_DOCUMENT_TYPE_LABEL, TEST_DOCUMENT_TYPE_LABEL_EDITED, + TEST_DOCUMENT_TYPE_QUICK_LABEL, TEST_DOCUMENT_TYPE_QUICK_LABEL_EDITED +) + + +class DocumentTypeViewsTestCase(GenericDocumentViewTestCase): + def setUp(self): + super(DocumentTypeViewsTestCase, self).setUp() + self.login_user() + + def _request_document_type_create(self): + return self.post( + 'documents:document_type_create', + data={ + 'label': TEST_DOCUMENT_TYPE_LABEL, + 'delete_time_period': DEFAULT_DELETE_PERIOD, + 'delete_time_unit': DEFAULT_DELETE_TIME_UNIT + }, follow=True + ) + + def test_document_type_create_view_no_permission(self): + self.document_type.delete() + + self.assertEqual(Document.objects.count(), 0) + + # Grant the document type view permission so that the post create + # redirect works + self.grant_permission(permission=permission_document_type_view) + self._request_document_type_create() + + self.assertEqual(DocumentType.objects.count(), 0) + + def test_document_type_create_view_with_permission(self): + self.document_type.delete() + + self.assertEqual(Document.objects.count(), 0) + + self.grant_permission(permission=permission_document_type_create) + # Grant the document type view permission so that the post create + # redirect works + self.grant_permission(permission=permission_document_type_view) + + response = self._request_document_type_create() + + self.assertContains(response, text='successfully', status_code=200) + + self.assertEqual(DocumentType.objects.count(), 1) + self.assertEqual( + DocumentType.objects.first().label, TEST_DOCUMENT_TYPE_LABEL + ) + + def _request_document_type_delete(self): + return self.post( + 'documents:document_type_delete', + args=(self.document_type.pk,), follow=True + ) + + def test_document_type_delete_view_no_permission(self): + # Grant the document type view permission so that the post delete + # redirect works + self.grant_permission(permission=permission_document_type_view) + + self._request_document_type_delete() + + self.assertEqual(DocumentType.objects.count(), 1) + + def test_document_type_delete_view_with_access(self): + self.grant_access( + obj=self.document_type, permission=permission_document_type_delete + ) + # Grant the document type view permission so that the post delete + # redirect works + self.grant_permission(permission=permission_document_type_view) + + response = self._request_document_type_delete() + + self.assertContains(response, 'successfully', status_code=200) + self.assertEqual(DocumentType.objects.count(), 0) + + def _request_document_type_edit(self): + return self.post( + 'documents:document_type_edit', + args=(self.document_type.pk,), + data={ + 'label': TEST_DOCUMENT_TYPE_LABEL_EDITED, + 'delete_time_period': DEFAULT_DELETE_PERIOD, + 'delete_time_unit': DEFAULT_DELETE_TIME_UNIT + }, follow=True + ) + + def test_document_type_edit_view_no_permission(self): + self._request_document_type_edit() + + self.assertEqual( + DocumentType.objects.get(pk=self.document_type.pk).label, + TEST_DOCUMENT_TYPE_LABEL + ) + + def test_document_type_edit_view_with_access(self): + self.grant_access( + obj=self.document_type, permission=permission_document_type_edit + ) + + # Grant the document type view permission so that the post delete + # redirect works + self.grant_permission(permission=permission_document_type_view) + + response = self._request_document_type_edit() + + self.assertContains(response, 'successfully', status_code=200) + + self.assertEqual( + DocumentType.objects.get(pk=self.document_type.pk).label, + TEST_DOCUMENT_TYPE_LABEL_EDITED + ) + + def _request_quick_label_create(self): + return self.post( + 'documents:document_type_filename_create', + args=(self.document_type.pk,), + data={ + 'filename': TEST_DOCUMENT_TYPE_QUICK_LABEL, + } + ) + + def test_document_type_quick_label_create_no_permission(self): + self.grant_access( + obj=self.document_type, permission=permission_document_type_view + ) + response = self._request_quick_label_create() + + self.assertEqual(response.status_code, 403) + self.assertEqual(self.document_type.filenames.count(), 0) + + def test_document_type_quick_label_create_with_access(self): + self.grant_access( + obj=self.document_type, permission=permission_document_type_view + ) + self.grant_access( + obj=self.document_type, permission=permission_document_type_edit + ) + + response = self._request_quick_label_create() + + self.assertEqual(response.status_code, 302) + self.assertEqual(self.document_type.filenames.count(), 1) + + def _create_quick_label(self): + self.document_type_filename = self.document_type.filenames.create( + filename=TEST_DOCUMENT_TYPE_QUICK_LABEL + ) + + def _request_quick_label_edit(self): + return self.post( + 'documents:document_type_filename_edit', + args=(self.document_type_filename.pk,), + data={ + 'filename': TEST_DOCUMENT_TYPE_QUICK_LABEL_EDITED, + }, follow=True + ) + + def test_document_type_quick_label_edit_no_permission(self): + self._create_quick_label() + self.grant_access( + obj=self.document_type, permission=permission_document_type_view + ) + response = self._request_quick_label_edit() + + self.assertEqual(response.status_code, 403) + self.assertEqual( + self.document_type_filename.filename, + TEST_DOCUMENT_TYPE_QUICK_LABEL + ) + + def test_document_type_quick_label_edit_with_access(self): + self.grant_access( + obj=self.document_type, permission=permission_document_type_edit + ) + self.grant_access( + obj=self.document_type, permission=permission_document_type_view + ) + + self._create_quick_label() + response = self._request_quick_label_edit() + self.assertEqual(response.status_code, 200) + + self.document_type_filename.refresh_from_db() + self.assertEqual( + self.document_type_filename.filename, + TEST_DOCUMENT_TYPE_QUICK_LABEL_EDITED + ) + + def _request_quick_label_delete(self): + return self.post( + 'documents:document_type_filename_delete', + args=(self.document_type_filename.pk,), + follow=True + ) + + def test_document_type_quick_label_delete_no_permission(self): + self._create_quick_label() + self.grant_access( + obj=self.document_type, permission=permission_document_type_view + ) + self._request_quick_label_delete() + + self.assertEqual( + self.document_type.filenames.count(), 1 + ) + self.assertEqual( + self.document_type.filenames.first().filename, + TEST_DOCUMENT_TYPE_QUICK_LABEL + ) + + def test_document_type_quick_label_delete_with_access(self): + self.grant_access( + obj=self.document_type, permission=permission_document_type_edit + ) + self.grant_access( + obj=self.document_type, permission=permission_document_type_view + ) + + self._create_quick_label() + response = self._request_quick_label_delete() + + self.assertEqual(response.status_code, 200) + self.assertEqual( + self.document_type.filenames.count(), 0 + ) diff --git a/mayan/apps/documents/tests/test_document_version_views.py b/mayan/apps/documents/tests/test_document_version_views.py new file mode 100644 index 0000000000..6354c31930 --- /dev/null +++ b/mayan/apps/documents/tests/test_document_version_views.py @@ -0,0 +1,80 @@ +# -*- coding: utf-8 -*- + +from __future__ import unicode_literals + +from ..permissions import ( + permission_document_version_revert, permission_document_version_view, +) + +from .base import GenericDocumentViewTestCase +from .literals import ( + TEST_SMALL_DOCUMENT_PATH, TEST_VERSION_COMMENT +) + + +class DocumentVersionTestCase(GenericDocumentViewTestCase): + def setUp(self): + super(DocumentVersionTestCase, self).setUp() + self.login_user() + + def test_document_version_list_no_permission(self): + with open(TEST_SMALL_DOCUMENT_PATH) as file_object: + self.document.new_version( + comment=TEST_VERSION_COMMENT, file_object=file_object + ) + + response = self.get( + 'documents:document_version_list', args=(self.document.pk,) + ) + + self.assertEqual(response.status_code, 403) + + def test_document_version_list_with_access(self): + self.grant_access( + obj=self.document, permission=permission_document_version_view + ) + + with open(TEST_SMALL_DOCUMENT_PATH) as file_object: + self.document.new_version( + comment=TEST_VERSION_COMMENT, file_object=file_object + ) + + response = self.get( + 'documents:document_version_list', args=(self.document.pk,) + ) + + self.assertContains(response, TEST_VERSION_COMMENT, status_code=200) + + def test_document_version_revert_no_permission(self): + first_version = self.document.latest_version + + with open(TEST_SMALL_DOCUMENT_PATH) as file_object: + self.document.new_version( + file_object=file_object + ) + + response = self.post( + 'documents:document_version_revert', args=(first_version.pk,) + ) + + self.assertEqual(response.status_code, 403) + self.assertEqual(self.document.versions.count(), 2) + + def test_document_version_revert_with_access(self): + first_version = self.document.latest_version + + with open(TEST_SMALL_DOCUMENT_PATH) as file_object: + self.document.new_version( + file_object=file_object + ) + + self.grant_access( + obj=self.document, permission=permission_document_version_revert + ) + + response = self.post( + 'documents:document_version_revert', args=(first_version.pk,), + ) + + self.assertEqual(response.status_code, 302) + self.assertEqual(self.document.versions.count(), 1) diff --git a/mayan/apps/documents/tests/test_views.py b/mayan/apps/documents/tests/test_document_views.py similarity index 50% rename from mayan/apps/documents/tests/test_views.py rename to mayan/apps/documents/tests/test_document_views.py index f3672f4380..5f92a5a761 100644 --- a/mayan/apps/documents/tests/test_views.py +++ b/mayan/apps/documents/tests/test_document_views.py @@ -2,67 +2,28 @@ from __future__ import unicode_literals -import os - -from django.conf import settings from django.contrib.contenttypes.models import ContentType -from django.test import override_settings from django.utils.encoding import force_text -from common.tests.test_views import GenericViewTestCase from converter.models import Transformation from converter.permissions import permission_transformation_delete -from ..literals import ( - DEFAULT_DELETE_PERIOD, DEFAULT_DELETE_TIME_UNIT, PAGE_RANGE_ALL -) +from ..literals import PAGE_RANGE_ALL from ..models import DeletedDocument, Document, DocumentType from ..permissions import ( - permission_document_create, permission_document_delete, - permission_document_download, permission_document_print, - permission_document_properties_edit, permission_document_restore, - permission_document_tools, permission_document_trash, - permission_document_type_create, permission_document_type_delete, - permission_document_type_edit, permission_document_type_view, - permission_document_version_revert, permission_document_version_view, - permission_document_view, permission_empty_trash + permission_document_create, permission_document_download, + permission_document_print, permission_document_properties_edit, + permission_document_tools, permission_document_view, + permission_empty_trash ) +from .base import GenericDocumentViewTestCase from .literals import ( - TEST_DOCUMENT_TYPE_LABEL, TEST_DOCUMENT_TYPE_2_LABEL, - TEST_DOCUMENT_TYPE_LABEL_EDITED, TEST_DOCUMENT_TYPE_QUICK_LABEL, - TEST_DOCUMENT_TYPE_QUICK_LABEL_EDITED, TEST_SMALL_DOCUMENT_FILENAME, - TEST_SMALL_DOCUMENT_PATH, TEST_TRANSFORMATION_ARGUMENT, - TEST_TRANSFORMATION_NAME, TEST_VERSION_COMMENT + TEST_DOCUMENT_TYPE_2_LABEL, TEST_SMALL_DOCUMENT_FILENAME, + TEST_TRANSFORMATION_ARGUMENT, TEST_TRANSFORMATION_NAME, ) -@override_settings(OCR_AUTO_OCR=False) -class GenericDocumentViewTestCase(GenericViewTestCase): - test_document_filename = TEST_SMALL_DOCUMENT_FILENAME - - def setUp(self): - super(GenericDocumentViewTestCase, self).setUp() - self.document_type = DocumentType.objects.create( - label=TEST_DOCUMENT_TYPE_LABEL - ) - - self.test_document_path = os.path.join( - settings.BASE_DIR, 'apps', 'documents', 'tests', 'contrib', - 'sample_documents', self.test_document_filename - ) - - with open(self.test_document_path) as file_object: - self.document = self.document_type.new_document( - file_object=file_object, label=self.test_document_filename - ) - - def tearDown(self): - super(GenericDocumentViewTestCase, self).tearDown() - if self.document_type.pk: - self.document_type.delete() - - class DocumentsViewsTestCase(GenericDocumentViewTestCase): def setUp(self): super(DocumentsViewsTestCase, self).setUp() @@ -596,483 +557,3 @@ class DocumentsViewsTestCase(GenericDocumentViewTestCase): ) response = self._request_print_view() self.assertEqual(response.status_code, 200) - - -class DocumentPageViewTestCase(GenericDocumentViewTestCase): - def setUp(self): - super(DocumentPageViewTestCase, self).setUp() - self.login_user() - - def _document_page_list_view(self): - return self.get( - 'documents:document_pages', args=(self.document.pk,) - ) - - def test_document_page_list_view_no_permission(self): - response = self._document_page_list_view() - self.assertEqual(response.status_code, 403) - - def test_document_page_list_view_with_access(self): - self.grant_access( - obj=self.document, permission=permission_document_view - ) - response = self._document_page_list_view() - self.assertContains( - response, text=self.document.label, status_code=200 - ) - - -class DocumentTypeViewsTestCase(GenericDocumentViewTestCase): - def setUp(self): - super(DocumentTypeViewsTestCase, self).setUp() - self.login_user() - - def _request_document_type_create(self): - return self.post( - 'documents:document_type_create', - data={ - 'label': TEST_DOCUMENT_TYPE_LABEL, - 'delete_time_period': DEFAULT_DELETE_PERIOD, - 'delete_time_unit': DEFAULT_DELETE_TIME_UNIT - }, follow=True - ) - - def test_document_type_create_view_no_permission(self): - self.document_type.delete() - - self.assertEqual(Document.objects.count(), 0) - - # Grant the document type view permission so that the post create - # redirect works - self.grant_permission(permission=permission_document_type_view) - self._request_document_type_create() - - self.assertEqual(DocumentType.objects.count(), 0) - - def test_document_type_create_view_with_permission(self): - self.document_type.delete() - - self.assertEqual(Document.objects.count(), 0) - - self.grant_permission(permission=permission_document_type_create) - # Grant the document type view permission so that the post create - # redirect works - self.grant_permission(permission=permission_document_type_view) - - response = self._request_document_type_create() - - self.assertContains(response, text='successfully', status_code=200) - - self.assertEqual(DocumentType.objects.count(), 1) - self.assertEqual( - DocumentType.objects.first().label, TEST_DOCUMENT_TYPE_LABEL - ) - - def _request_document_type_delete(self): - return self.post( - 'documents:document_type_delete', - args=(self.document_type.pk,), follow=True - ) - - def test_document_type_delete_view_no_permission(self): - # Grant the document type view permission so that the post delete - # redirect works - self.grant_permission(permission=permission_document_type_view) - - self._request_document_type_delete() - - self.assertEqual(DocumentType.objects.count(), 1) - - def test_document_type_delete_view_with_access(self): - self.grant_access( - obj=self.document_type, permission=permission_document_type_delete - ) - # Grant the document type view permission so that the post delete - # redirect works - self.grant_permission(permission=permission_document_type_view) - - response = self._request_document_type_delete() - - self.assertContains(response, 'successfully', status_code=200) - self.assertEqual(DocumentType.objects.count(), 0) - - def _request_document_type_edit(self): - return self.post( - 'documents:document_type_edit', - args=(self.document_type.pk,), - data={ - 'label': TEST_DOCUMENT_TYPE_LABEL_EDITED, - 'delete_time_period': DEFAULT_DELETE_PERIOD, - 'delete_time_unit': DEFAULT_DELETE_TIME_UNIT - }, follow=True - ) - - def test_document_type_edit_view_no_permission(self): - self._request_document_type_edit() - - self.assertEqual( - DocumentType.objects.get(pk=self.document_type.pk).label, - TEST_DOCUMENT_TYPE_LABEL - ) - - def test_document_type_edit_view_with_access(self): - self.grant_access( - obj=self.document_type, permission=permission_document_type_edit - ) - - # Grant the document type view permission so that the post delete - # redirect works - self.grant_permission(permission=permission_document_type_view) - - response = self._request_document_type_edit() - - self.assertContains(response, 'successfully', status_code=200) - - self.assertEqual( - DocumentType.objects.get(pk=self.document_type.pk).label, - TEST_DOCUMENT_TYPE_LABEL_EDITED - ) - - def _request_quick_label_create(self): - return self.post( - 'documents:document_type_filename_create', - args=(self.document_type.pk,), - data={ - 'filename': TEST_DOCUMENT_TYPE_QUICK_LABEL, - } - ) - - def test_document_type_quick_label_create_no_permission(self): - self.grant_access( - obj=self.document_type, permission=permission_document_type_view - ) - response = self._request_quick_label_create() - - self.assertEqual(response.status_code, 403) - self.assertEqual(self.document_type.filenames.count(), 0) - - def test_document_type_quick_label_create_with_access(self): - self.grant_access( - obj=self.document_type, permission=permission_document_type_view - ) - self.grant_access( - obj=self.document_type, permission=permission_document_type_edit - ) - - response = self._request_quick_label_create() - - self.assertEqual(response.status_code, 302) - self.assertEqual(self.document_type.filenames.count(), 1) - - def _create_quick_label(self): - self.document_type_filename = self.document_type.filenames.create( - filename=TEST_DOCUMENT_TYPE_QUICK_LABEL - ) - - def _request_quick_label_edit(self): - return self.post( - 'documents:document_type_filename_edit', - args=(self.document_type_filename.pk,), - data={ - 'filename': TEST_DOCUMENT_TYPE_QUICK_LABEL_EDITED, - }, follow=True - ) - - def test_document_type_quick_label_edit_no_permission(self): - self._create_quick_label() - self.grant_access( - obj=self.document_type, permission=permission_document_type_view - ) - response = self._request_quick_label_edit() - - self.assertEqual(response.status_code, 403) - self.assertEqual( - self.document_type_filename.filename, - TEST_DOCUMENT_TYPE_QUICK_LABEL - ) - - def test_document_type_quick_label_edit_with_access(self): - self.grant_access( - obj=self.document_type, permission=permission_document_type_edit - ) - self.grant_access( - obj=self.document_type, permission=permission_document_type_view - ) - - self._create_quick_label() - response = self._request_quick_label_edit() - self.assertEqual(response.status_code, 200) - - self.document_type_filename.refresh_from_db() - self.assertEqual( - self.document_type_filename.filename, - TEST_DOCUMENT_TYPE_QUICK_LABEL_EDITED - ) - - def _request_quick_label_delete(self): - return self.post( - 'documents:document_type_filename_delete', - args=(self.document_type_filename.pk,), - follow=True - ) - - def test_document_type_quick_label_delete_no_permission(self): - self._create_quick_label() - self.grant_access( - obj=self.document_type, permission=permission_document_type_view - ) - self._request_quick_label_delete() - - self.assertEqual( - self.document_type.filenames.count(), 1 - ) - self.assertEqual( - self.document_type.filenames.first().filename, - TEST_DOCUMENT_TYPE_QUICK_LABEL - ) - - def test_document_type_quick_label_delete_with_access(self): - self.grant_access( - obj=self.document_type, permission=permission_document_type_edit - ) - self.grant_access( - obj=self.document_type, permission=permission_document_type_view - ) - - self._create_quick_label() - response = self._request_quick_label_delete() - - self.assertEqual(response.status_code, 200) - self.assertEqual( - self.document_type.filenames.count(), 0 - ) - - -class DocumentVersionTestCase(GenericDocumentViewTestCase): - def setUp(self): - super(DocumentVersionTestCase, self).setUp() - self.login_user() - - def test_document_version_list_no_permission(self): - with open(TEST_SMALL_DOCUMENT_PATH) as file_object: - self.document.new_version( - comment=TEST_VERSION_COMMENT, file_object=file_object - ) - - response = self.get( - 'documents:document_version_list', args=(self.document.pk,) - ) - - self.assertEqual(response.status_code, 403) - - def test_document_version_list_with_access(self): - self.grant_access( - obj=self.document, permission=permission_document_version_view - ) - - with open(TEST_SMALL_DOCUMENT_PATH) as file_object: - self.document.new_version( - comment=TEST_VERSION_COMMENT, file_object=file_object - ) - - response = self.get( - 'documents:document_version_list', args=(self.document.pk,) - ) - - self.assertContains(response, TEST_VERSION_COMMENT, status_code=200) - - def test_document_version_revert_no_permission(self): - first_version = self.document.latest_version - - with open(TEST_SMALL_DOCUMENT_PATH) as file_object: - self.document.new_version( - file_object=file_object - ) - - response = self.post( - 'documents:document_version_revert', args=(first_version.pk,) - ) - - self.assertEqual(response.status_code, 403) - self.assertEqual(self.document.versions.count(), 2) - - def test_document_version_revert_with_access(self): - first_version = self.document.latest_version - - with open(TEST_SMALL_DOCUMENT_PATH) as file_object: - self.document.new_version( - file_object=file_object - ) - - self.grant_access( - obj=self.document, permission=permission_document_version_revert - ) - - response = self.post( - 'documents:document_version_revert', args=(first_version.pk,), - ) - - self.assertEqual(response.status_code, 302) - self.assertEqual(self.document.versions.count(), 1) - - -class DeletedDocumentTestCase(GenericDocumentViewTestCase): - def setUp(self): - super(DeletedDocumentTestCase, self).setUp() - self.login_user() - - def test_document_restore_view_no_permission(self): - self.document.delete() - self.assertEqual(Document.objects.count(), 0) - - response = self.post( - 'documents:document_restore', args=(self.document.pk,) - ) - self.assertEqual(response.status_code, 403) - self.assertEqual(DeletedDocument.objects.count(), 1) - self.assertEqual(Document.objects.count(), 0) - - def test_document_restore_view_with_access(self): - self.document.delete() - self.assertEqual(Document.objects.count(), 0) - - self.grant_access( - obj=self.document, permission=permission_document_restore - ) - response = self.post( - 'documents:document_restore', args=(self.document.pk,), - ) - self.assertEqual(response.status_code, 302) - self.assertEqual(DeletedDocument.objects.count(), 0) - self.assertEqual(Document.objects.count(), 1) - - def test_document_trash_no_permissions(self): - response = self.post( - 'documents:document_trash', args=(self.document.pk,) - ) - - self.assertEqual(response.status_code, 403) - self.assertEqual(DeletedDocument.objects.count(), 0) - self.assertEqual(Document.objects.count(), 1) - - def test_document_trash_with_access(self): - self.grant_access( - obj=self.document, permission=permission_document_trash - ) - - response = self.post( - 'documents:document_trash', args=(self.document.pk,), - ) - - self.assertEqual(response.status_code, 302) - self.assertEqual(DeletedDocument.objects.count(), 1) - self.assertEqual(Document.objects.count(), 0) - - def test_document_delete_no_permissions(self): - self.document.delete() - self.assertEqual(Document.objects.count(), 0) - self.assertEqual(DeletedDocument.objects.count(), 1) - - response = self.post( - 'documents:document_delete', args=(self.document.pk,), - ) - self.assertEqual(response.status_code, 403) - self.assertEqual(Document.objects.count(), 0) - self.assertEqual(DeletedDocument.objects.count(), 1) - - def test_document_delete_with_access(self): - self.document.delete() - self.assertEqual(Document.objects.count(), 0) - self.assertEqual(DeletedDocument.objects.count(), 1) - - self.grant_access( - obj=self.document, permission=permission_document_delete - ) - - response = self.post( - 'documents:document_delete', args=(self.document.pk,), - ) - self.assertEqual(response.status_code, 302) - self.assertEqual(DeletedDocument.objects.count(), 0) - self.assertEqual(Document.objects.count(), 0) - - def test_deleted_document_list_view_no_permissions(self): - self.document.delete() - - response = self.get('documents:document_list_deleted') - - self.assertNotContains(response, self.document.label, status_code=200) - - def test_deleted_document_list_view_with_access(self): - self.document.delete() - - self.grant_access( - obj=self.document, permission=permission_document_view - ) - response = self.get('documents:document_list_deleted') - - self.assertContains(response, self.document.label, status_code=200) - - -class DuplicatedDocumentsViewsTestCase(GenericDocumentViewTestCase): - def setUp(self): - super(DuplicatedDocumentsViewsTestCase, self).setUp() - self.login_user() - - def _upload_duplicate_document(self): - with open(TEST_SMALL_DOCUMENT_PATH) as file_object: - self.document_duplicate = self.document_type.new_document( - file_object=file_object, label=TEST_SMALL_DOCUMENT_FILENAME - ) - - def _request_duplicated_document_list(self): - return self.get('documents:duplicated_document_list') - - def _request_document_duplicates_list(self): - return self.get( - 'documents:document_duplicates_list', args=(self.document.pk,) - ) - - def test_duplicated_document_list_no_permissions(self): - self._upload_duplicate_document() - response = self._request_duplicated_document_list() - - self.assertNotContains( - response, text=self.document.label, status_code=200 - ) - - def test_duplicated_document_list_with_access(self): - self._upload_duplicate_document() - self.grant_access( - obj=self.document, permission=permission_document_view - ) - self.grant_access( - obj=self.document_duplicate, - permission=permission_document_view - ) - response = self._request_duplicated_document_list() - - self.assertContains( - response, text=self.document.label, status_code=200 - ) - - def test_document_duplicates_list_no_permissions(self): - self._upload_duplicate_document() - response = self._request_document_duplicates_list() - - self.assertEqual(response.status_code, 403) - - def test_document_duplicates_list_with_access(self): - self._upload_duplicate_document() - self.grant_access( - obj=self.document, permission=permission_document_view - ) - self.grant_access( - obj=self.document_duplicate, - permission=permission_document_view - ) - response = self._request_document_duplicates_list() - - self.assertContains( - response, text=self.document.label, status_code=200 - ) diff --git a/mayan/apps/documents/tests/test_duplicated_document_views.py b/mayan/apps/documents/tests/test_duplicated_document_views.py new file mode 100644 index 0000000000..c1fc7a46ac --- /dev/null +++ b/mayan/apps/documents/tests/test_duplicated_document_views.py @@ -0,0 +1,74 @@ +# -*- coding: utf-8 -*- + +from __future__ import unicode_literals + +from ..permissions import permission_document_view + +from .base import GenericDocumentViewTestCase +from .literals import ( + TEST_SMALL_DOCUMENT_FILENAME, TEST_SMALL_DOCUMENT_PATH, +) + + +class DuplicatedDocumentsViewsTestCase(GenericDocumentViewTestCase): + def setUp(self): + super(DuplicatedDocumentsViewsTestCase, self).setUp() + self.login_user() + + def _upload_duplicate_document(self): + with open(TEST_SMALL_DOCUMENT_PATH) as file_object: + self.document_duplicate = self.document_type.new_document( + file_object=file_object, label=TEST_SMALL_DOCUMENT_FILENAME + ) + + def _request_duplicated_document_list(self): + return self.get('documents:duplicated_document_list') + + def _request_document_duplicates_list(self): + return self.get( + 'documents:document_duplicates_list', args=(self.document.pk,) + ) + + def test_duplicated_document_list_no_permissions(self): + self._upload_duplicate_document() + response = self._request_duplicated_document_list() + + self.assertNotContains( + response, text=self.document.label, status_code=200 + ) + + def test_duplicated_document_list_with_access(self): + self._upload_duplicate_document() + self.grant_access( + obj=self.document, permission=permission_document_view + ) + self.grant_access( + obj=self.document_duplicate, + permission=permission_document_view + ) + response = self._request_duplicated_document_list() + + self.assertContains( + response, text=self.document.label, status_code=200 + ) + + def test_document_duplicates_list_no_permissions(self): + self._upload_duplicate_document() + response = self._request_document_duplicates_list() + + self.assertEqual(response.status_code, 403) + + def test_document_duplicates_list_with_access(self): + self._upload_duplicate_document() + self.grant_access( + obj=self.document, permission=permission_document_view + ) + self.grant_access( + obj=self.document_duplicate, + permission=permission_document_view + ) + response = self._request_document_duplicates_list() + + self.assertContains( + response, text=self.document.label, status_code=200 + ) diff --git a/mayan/apps/documents/tests/test_events.py b/mayan/apps/documents/tests/test_events.py index 65c9bcd4e1..ea11f31e93 100644 --- a/mayan/apps/documents/tests/test_events.py +++ b/mayan/apps/documents/tests/test_events.py @@ -14,7 +14,7 @@ from ..permissions import ( permission_document_download, permission_document_view ) -from .test_views import GenericDocumentViewTestCase +from .base import GenericDocumentViewTestCase TEST_DOCUMENT_TYPE_EDITED_LABEL = 'test document type edited label' diff --git a/mayan/apps/documents/tests/test_links.py b/mayan/apps/documents/tests/test_links.py index 43d807cde0..b59b35c033 100644 --- a/mayan/apps/documents/tests/test_links.py +++ b/mayan/apps/documents/tests/test_links.py @@ -17,8 +17,8 @@ from ..permissions import ( permission_document_version_revert ) +from .base import GenericDocumentViewTestCase from .literals import TEST_SMALL_DOCUMENT_PATH -from .test_views import GenericDocumentViewTestCase class DocumentsLinksTestCase(GenericDocumentViewTestCase): diff --git a/mayan/apps/events/tests/test_views.py b/mayan/apps/events/tests/test_views.py index d559b6dfbb..1aa0beec89 100644 --- a/mayan/apps/events/tests/test_views.py +++ b/mayan/apps/events/tests/test_views.py @@ -2,7 +2,7 @@ from __future__ import absolute_import, unicode_literals from django.contrib.contenttypes.models import ContentType -from documents.tests.test_views import GenericDocumentViewTestCase +from documents.tests import GenericDocumentViewTestCase from ..permissions import permission_events_view diff --git a/mayan/apps/linking/tests/test_views.py b/mayan/apps/linking/tests/test_views.py index 425ff18a5b..b8b6fd4805 100644 --- a/mayan/apps/linking/tests/test_views.py +++ b/mayan/apps/linking/tests/test_views.py @@ -1,7 +1,7 @@ from __future__ import absolute_import, unicode_literals from documents.permissions import permission_document_view -from documents.tests.test_views import GenericDocumentViewTestCase +from documents.tests import GenericDocumentViewTestCase from ..models import SmartLink from ..permissions import ( diff --git a/mayan/apps/mailer/tests/test_views.py b/mayan/apps/mailer/tests/test_views.py index c9645d8d33..f2628928f3 100644 --- a/mayan/apps/mailer/tests/test_views.py +++ b/mayan/apps/mailer/tests/test_views.py @@ -2,7 +2,7 @@ from __future__ import unicode_literals from django.core import mail -from documents.tests.test_views import GenericDocumentViewTestCase +from documents.tests import GenericDocumentViewTestCase from ..models import UserMailer from ..permissions import ( diff --git a/mayan/apps/metadata/tests/test_views.py b/mayan/apps/metadata/tests/test_views.py index 98a62632d9..ccc6578b71 100644 --- a/mayan/apps/metadata/tests/test_views.py +++ b/mayan/apps/metadata/tests/test_views.py @@ -7,10 +7,10 @@ from documents.models import DocumentType from documents.permissions import ( permission_document_properties_edit, permission_document_view ) -from documents.tests.literals import ( - TEST_DOCUMENT_TYPE_2_LABEL, TEST_SMALL_DOCUMENT_PATH +from documents.tests import ( + GenericDocumentViewTestCase, TEST_DOCUMENT_TYPE_2_LABEL, + TEST_SMALL_DOCUMENT_PATH, ) -from documents.tests.test_views import GenericDocumentViewTestCase from ..models import MetadataType from ..permissions import ( diff --git a/mayan/apps/ocr/tests/test_views.py b/mayan/apps/ocr/tests/test_views.py index 41b0462103..8bf3170434 100644 --- a/mayan/apps/ocr/tests/test_views.py +++ b/mayan/apps/ocr/tests/test_views.py @@ -2,7 +2,7 @@ from __future__ import unicode_literals from django.test import override_settings -from documents.tests.test_views import GenericDocumentViewTestCase +from documents.tests import GenericDocumentViewTestCase from ..permissions import permission_ocr_content_view from ..utils import get_document_ocr_content diff --git a/mayan/apps/sources/tests/test_views.py b/mayan/apps/sources/tests/test_views.py index c393a6e677..e61c43ef93 100644 --- a/mayan/apps/sources/tests/test_views.py +++ b/mayan/apps/sources/tests/test_views.py @@ -14,10 +14,10 @@ from common.utils import fs_cleanup, mkdtemp from documents.models import Document, DocumentType from documents.permissions import permission_document_create from documents.tests import ( - TEST_DOCUMENT_DESCRIPTION, TEST_DOCUMENT_TYPE_LABEL, - TEST_SMALL_DOCUMENT_CHECKSUM, TEST_SMALL_DOCUMENT_PATH + GenericDocumentViewTestCase, TEST_DOCUMENT_DESCRIPTION, + TEST_DOCUMENT_TYPE_LABEL, TEST_SMALL_DOCUMENT_CHECKSUM, + TEST_SMALL_DOCUMENT_PATH, ) -from documents.tests.test_views import GenericDocumentViewTestCase from metadata.tests.literals import TEST_METADATA_VALUE_UNICODE from metadata.tests.mixins import MetadataTypeMixin diff --git a/mayan/apps/tags/tests/test_views.py b/mayan/apps/tags/tests/test_views.py index 39e5770544..c17e0fddbb 100644 --- a/mayan/apps/tags/tests/test_views.py +++ b/mayan/apps/tags/tests/test_views.py @@ -1,7 +1,7 @@ from __future__ import unicode_literals from documents.permissions import permission_document_view -from documents.tests.test_views import GenericDocumentViewTestCase +from documents.tests import GenericDocumentViewTestCase from ..models import Tag from ..permissions import ( diff --git a/mayan/apps/user_management/tests/test_views.py b/mayan/apps/user_management/tests/test_views.py index c05a49a234..9e45dd38d0 100644 --- a/mayan/apps/user_management/tests/test_views.py +++ b/mayan/apps/user_management/tests/test_views.py @@ -4,7 +4,7 @@ from django.contrib.auth import get_user_model from django.contrib.auth.models import Group from common.tests.test_views import GenericViewTestCase -from documents.tests.test_views import GenericDocumentViewTestCase +from documents.tests import GenericDocumentViewTestCase from metadata.models import MetadataType from metadata.permissions import permission_metadata_document_edit