Files
mayan-edms/mayan/apps/sources/tests/test_views.py
Roberto Rosario 8e69178e07 Project: Switch to full app paths
Instead of inserting the path of the apps into the Python app,
the apps are now referenced by their full import path.

This app name claves with external or native Python libraries.
Example: Mayan statistics app vs. Python new statistics library.

Every app reference is now prepended with 'mayan.apps'.

Existing config.yml files need to be updated manually.

Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
2018-12-05 02:04:20 -04:00

366 lines
12 KiB
Python

from __future__ import unicode_literals
import os
import shutil
from django.test import override_settings
from mayan.apps.checkouts.models import NewVersionBlock
from mayan.apps.common.tests import GenericViewTestCase
from mayan.apps.common.utils import fs_cleanup, mkdtemp
from mayan.apps.documents.models import Document, DocumentType
from mayan.apps.documents.permissions import permission_document_create
from mayan.apps.documents.tests import (
GenericDocumentViewTestCase, TEST_DOCUMENT_DESCRIPTION,
TEST_DOCUMENT_TYPE_LABEL, TEST_SMALL_DOCUMENT_CHECKSUM,
TEST_SMALL_DOCUMENT_PATH,
)
from ..links import link_upload_version
from ..literals import SOURCE_CHOICE_WEB_FORM
from ..models import StagingFolderSource, WebFormSource
from ..permissions import (
permission_sources_setup_create, permission_sources_setup_delete,
permission_sources_setup_view, permission_staging_file_delete
)
from .literals import (
TEST_SOURCE_LABEL, TEST_SOURCE_UNCOMPRESS_N, TEST_STAGING_PREVIEW_WIDTH
)
class DocumentUploadTestCase(GenericDocumentViewTestCase):
def setUp(self):
super(DocumentUploadTestCase, self).setUp()
self.source = WebFormSource.objects.create(
enabled=True, label=TEST_SOURCE_LABEL,
uncompress=TEST_SOURCE_UNCOMPRESS_N
)
self.document.delete()
def _request_upload_wizard_view(self):
with open(TEST_SMALL_DOCUMENT_PATH, mode='rb') as file_object:
return self.post(
viewname='sources:upload_interactive', args=(self.source.pk,),
data={
'source-file': file_object,
'document_type_id': self.document_type.pk,
}, follow=True
)
def test_upload_wizard_without_permission(self):
self.login_user()
response = self._request_upload_wizard_view()
self.assertEqual(response.status_code, 403)
self.assertEqual(Document.objects.count(), 0)
def test_upload_wizard_with_permission(self):
self.login_user()
self.grant_permission(permission=permission_document_create)
response = self._request_upload_wizard_view()
self.assertTrue(b'queued' in response.content)
self.assertEqual(Document.objects.count(), 1)
self.assertEqual(
Document.objects.first().checksum, TEST_SMALL_DOCUMENT_CHECKSUM
)
def test_upload_wizard_with_document_type_access(self):
"""
Test uploading of documents by granting the document create
permssion for the document type to the user
"""
self.login_user()
# Create an access control entry giving the role the document
# create permission for the selected document type.
self.grant_access(
obj=self.document_type, permission=permission_document_create
)
with open(TEST_SMALL_DOCUMENT_PATH, mode='rb') as file_object:
response = self.post(
viewname='sources:upload_interactive', args=(self.source.pk,),
data={
'source-file': file_object,
'document_type_id': self.document_type.pk,
}, follow=True
)
self.assertTrue(b'queued' in response.content)
self.assertEqual(Document.objects.count(), 1)
def _request_upload_interactive_view(self):
return self.get(
viewname='sources:upload_interactive', data={
'document_type_id': self.document_type.pk,
}
)
def test_upload_interactive_view_no_permission(self):
self.login_user()
response = self._request_upload_interactive_view()
self.assertEqual(response.status_code, 403)
def test_upload_interactive_view_with_access(self):
self.login_user()
self.grant_access(
permission=permission_document_create, obj=self.document_type
)
response = self._request_upload_interactive_view()
self.assertContains(
response=response, text=self.source.label, status_code=200
)
@override_settings(OCR_AUTO_OCR=False)
class DocumentUploadIssueTestCase(GenericViewTestCase):
def setUp(self):
super(DocumentUploadIssueTestCase, self).setUp()
self.document_type = DocumentType.objects.create(
label=TEST_DOCUMENT_TYPE_LABEL
)
def tearDown(self):
self.document_type.delete()
super(DocumentUploadIssueTestCase, self).tearDown()
def test_issue_25(self):
self.login_admin_user()
# Create new webform source
self.post(
viewname='sources:setup_source_create',
args=(SOURCE_CHOICE_WEB_FORM,),
data={'label': 'test', 'uncompress': 'n', 'enabled': True}
)
self.assertEqual(WebFormSource.objects.count(), 1)
# Upload the test document
with open(TEST_SMALL_DOCUMENT_PATH, mode='rb') as file_descriptor:
self.post(
viewname='sources:upload_interactive', data={
'document-language': 'eng',
'source-file': file_descriptor,
'document_type_id': self.document_type.pk
}
)
self.assertEqual(Document.objects.count(), 1)
document = Document.objects.first()
# Test for issue 25 during creation
# ** description fields was removed from upload from **
self.assertEqual(document.description, '')
# Reset description
document.description = TEST_DOCUMENT_DESCRIPTION
document.save()
self.assertEqual(document.description, TEST_DOCUMENT_DESCRIPTION)
# Test for issue 25 during editing
self.post(
viewname='documents:document_edit', args=(document.pk,), data={
'description': TEST_DOCUMENT_DESCRIPTION,
'language': document.language, 'label': document.label
}
)
# Fetch document again and test description
document = Document.objects.first()
self.assertEqual(document.description, TEST_DOCUMENT_DESCRIPTION)
class NewDocumentVersionViewTestCase(GenericDocumentViewTestCase):
def test_new_version_block(self):
"""
Gitlab issue #231
User shown option to upload new version of a document even though it
is blocked by checkout - v2.0.0b2
Expected results:
- Link to upload version view should not resolve
- Upload version view should reject request
"""
self.login_admin_user()
NewVersionBlock.objects.block(self.document)
response = self.post(
viewname='sources:upload_version', args=(self.document.pk,),
follow=True
)
self.assertContains(
response, text='blocked from uploading',
status_code=200
)
response = self.get(
'documents:document_version_list', args=(self.document.pk,),
follow=True
)
# Needed by the url view resolver
response.context.current_app = None
resolved_link = link_upload_version.resolve(context=response.context)
self.assertEqual(resolved_link, None)
class StagingFolderViewTestCase(GenericViewTestCase):
def setUp(self):
super(StagingFolderViewTestCase, self).setUp()
self.temporary_directory = mkdtemp()
shutil.copy(TEST_SMALL_DOCUMENT_PATH, self.temporary_directory)
self.filename = os.path.basename(TEST_SMALL_DOCUMENT_PATH)
def tearDown(self):
fs_cleanup(self.temporary_directory)
super(StagingFolderViewTestCase, self).tearDown()
def _request_staging_file_delete_view(self, staging_folder, staging_file):
return self.post(
viewname='sources:staging_file_delete', args=(
staging_folder.pk, staging_file.encoded_filename
)
)
def test_staging_folder_delete_no_permission(self):
self.login_user()
staging_folder = StagingFolderSource.objects.create(
label=TEST_SOURCE_LABEL,
folder_path=self.temporary_directory,
preview_width=TEST_STAGING_PREVIEW_WIDTH,
uncompress=TEST_SOURCE_UNCOMPRESS_N,
)
self.assertEqual(len(list(staging_folder.get_files())), 1)
staging_file = list(staging_folder.get_files())[0]
response = self._request_staging_file_delete_view(
staging_folder=staging_folder, staging_file=staging_file
)
self.assertEqual(response.status_code, 403)
self.assertEqual(len(list(staging_folder.get_files())), 1)
def test_staging_folder_delete_with_permission(self):
self.login_user()
self.grant_permission(permission=permission_staging_file_delete)
staging_folder = StagingFolderSource.objects.create(
label=TEST_SOURCE_LABEL,
folder_path=self.temporary_directory,
preview_width=TEST_STAGING_PREVIEW_WIDTH,
uncompress=TEST_SOURCE_UNCOMPRESS_N,
)
self.assertEqual(len(list(staging_folder.get_files())), 1)
staging_file = list(staging_folder.get_files())[0]
response = self._request_staging_file_delete_view(
staging_folder=staging_folder, staging_file=staging_file
)
self.assertEqual(response.status_code, 302)
self.assertEqual(len(list(staging_folder.get_files())), 0)
class SourcesTestCase(GenericDocumentViewTestCase):
def _create_web_source(self):
self.source = WebFormSource.objects.create(
enabled=True, label=TEST_SOURCE_LABEL,
uncompress=TEST_SOURCE_UNCOMPRESS_N
)
def _request_setup_source_list_view(self):
return self.get(viewname='sources:setup_source_list')
def test_source_list_view_no_permission(self):
self._create_web_source()
self.login_user()
response = self._request_setup_source_list_view()
self.assertEqual(response.status_code, 403)
def test_source_list_view_with_permission(self):
self._create_web_source()
self.login_user()
self.grant_permission(permission=permission_sources_setup_view)
response = self._request_setup_source_list_view()
self.assertContains(
response=response, text=self.source.label, status_code=200
)
def _request_setup_source_create_view(self):
return self.post(
args=(SOURCE_CHOICE_WEB_FORM,),
viewname='sources:setup_source_create', data={
'enabled': True, 'label': TEST_SOURCE_LABEL,
'uncompress': TEST_SOURCE_UNCOMPRESS_N
}
)
def test_source_create_view_no_permission(self):
self.login_user()
self.grant_permission(permission=permission_sources_setup_view)
response = self._request_setup_source_create_view()
self.assertEqual(response.status_code, 403)
self.assertEqual(WebFormSource.objects.count(), 0)
def test_source_create_view_with_permission(self):
self.login_user()
self.grant_permission(permission=permission_sources_setup_create)
self.grant_permission(permission=permission_sources_setup_view)
response = self._request_setup_source_create_view()
self.assertEquals(response.status_code, 302)
webform_source = WebFormSource.objects.first()
self.assertEqual(webform_source.label, TEST_SOURCE_LABEL)
self.assertEqual(webform_source.uncompress, TEST_SOURCE_UNCOMPRESS_N)
def _request_setup_source_delete_view(self):
return self.post(
args=(self.source.pk,),
viewname='sources:setup_source_delete'
)
def test_source_delete_view_with_permission(self):
self._create_web_source()
self.login_user()
self.grant_permission(permission=permission_sources_setup_delete)
self.grant_permission(permission=permission_sources_setup_view)
response = self._request_setup_source_delete_view()
self.assertEqual(response.status_code, 302)
self.assertEqual(WebFormSource.objects.count(), 0)
def test_source_delete_view_no_permission(self):
self._create_web_source()
self.login_user()
self.grant_permission(permission=permission_sources_setup_view)
response = self._request_setup_source_delete_view()
self.assertEqual(response.status_code, 403)
self.assertEqual(WebFormSource.objects.count(), 1)