Files
mayan-edms/mayan/apps/metadata/tests/test_views.py
Roberto Rosario aa95a61451 Refactor metadata app
Update permission variable name from
"permission_document_metadata_" to "permission_metadata_".

Fix failing tests.

Add test for same metadata type mixin.

Split metadata add and remove test into test for GET and
POST requests.

Remove use of urlencode and instead use furl.

Simplify view using self.action_count and
self.action_id_list.

Use ExternalObjectMixin to remove repeated code.

Move the repeated code to test for all documents to
be of the same type into its own mixin.

Signed-off-by: Roberto Rosario <Roberto.Rosario@mayan-edms.com>
2019-02-03 23:37:52 -04:00

605 lines
21 KiB
Python

from __future__ import unicode_literals
import logging
from django.utils.encoding import force_text
from mayan.apps.common.tests import GenericViewTestCase
from mayan.apps.documents.models import DocumentType
from mayan.apps.documents.permissions import (
permission_document_properties_edit, permission_document_type_edit
)
from mayan.apps.documents.tests import (
DocumentTestMixin, GenericDocumentViewTestCase, TEST_DOCUMENT_TYPE_2_LABEL
)
from ..models import MetadataType
from ..permissions import (
permission_metadata_add, permission_metadata_remove,
permission_metadata_edit, permission_metadata_type_create,
permission_metadata_type_delete, permission_metadata_type_edit,
permission_metadata_type_view
)
from .literals import (
TEST_DOCUMENT_METADATA_VALUE_2, TEST_METADATA_TYPE_LABEL,
TEST_METADATA_TYPE_LABEL_2, TEST_METADATA_TYPE_LABEL_EDITED,
TEST_METADATA_TYPE_NAME, TEST_METADATA_TYPE_NAME_2,
TEST_METADATA_TYPE_NAME_EDITED, TEST_METADATA_VALUE_EDITED
)
from .mixins import MetadataTestsMixin
class DocumentMetadataViewTestCase(MetadataTestsMixin, GenericDocumentViewTestCase):
def setUp(self):
super(DocumentMetadataViewTestCase, self).setUp()
self._create_metadata_type()
self.document_type.metadata.create(metadata_type=self.metadata_type)
def _request_document_metadata_add_get_view(self):
return self.get(
viewname='metadata:document_metadata_add',
kwargs={'document_id': self.test_document.pk},
)
def _request_document_multiple_metadata_add_get_view(self):
return self.get(
viewname='metadata:document_multiple_metadata_add',
data={'id_list': ','.join([force_text(pk) for pk in self.id_list])},
)
def _request_document_metadata_add_post_view(self):
return self.post(
viewname='metadata:document_metadata_add',
kwargs={'document_id': self.test_document.pk},
data={'metadata_type': self.metadata_type.pk}
)
def test_document_metadata_add_get_view_no_permission(self):
response = self._request_document_metadata_add_get_view()
self.assertNotContains(
response, text=self.metadata_type.label, status_code=404
)
def test_document_metadata_add_get_view_with_full_access(self):
self.grant_access(
obj=self.test_document, permission=permission_metadata_add
)
response = self._request_document_metadata_add_get_view()
self.assertContains(
response, text=self.metadata_type.label, status_code=200
)
def test_document_individual_metadata_same_type_mixin_with_access(self):
self.grant_access(
obj=self.test_document, permission=permission_metadata_add
)
self._create_document_type_random()
self.test_document_type.metadata.create(metadata_type=self.metadata_type)
self._create_document()
self.grant_access(
obj=self.test_document, permission=permission_metadata_add
)
response = self._request_document_metadata_add_get_view()
self.assertContains(
response, text=self.metadata_type.label, status_code=200
)
def test_document_single_metadata_same_type_mixin_with_access(self):
self.id_list = [self.test_document.pk]
self.grant_access(
obj=self.test_document, permission=permission_metadata_add
)
self._create_document_type_random()
self.test_document_type.metadata.create(metadata_type=self.metadata_type)
self._create_document()
self.grant_access(
obj=self.test_document, permission=permission_metadata_add
)
response = self._request_document_multiple_metadata_add_get_view()
self.assertContains(
response, text=self.metadata_type.label, status_code=200
)
def test_document_multiple_metadata_same_type_mixin_with_access(self):
self.id_list = [self.test_document.pk]
self.grant_access(
obj=self.test_document, permission=permission_metadata_add
)
self._create_document_type_random()
self.test_document_type.metadata.create(metadata_type=self.metadata_type)
self._create_document()
self.id_list.append(self.test_document.pk)
self.grant_access(
obj=self.test_document, permission=permission_metadata_add
)
response = self._request_document_multiple_metadata_add_get_view()
self.assertNotContains(
response, text=self.metadata_type.label, status_code=302
)
def test_document_metadata_add_post_view_no_permission(self):
response = self._request_document_metadata_add_post_view()
self.assertEqual(response.status_code, 404)
self.assertEqual(len(self.document.metadata.all()), 0)
def test_document_metadata_add_post_view_with_full_access(self):
self.grant_access(
obj=self.test_document, permission=permission_metadata_add
)
response = self._request_document_metadata_add_post_view()
self.assertEqual(response.status_code, 302)
self.assertEqual(len(self.document.metadata.all()), 1)
self.assertQuerysetEqual(
qs=self.document.metadata.values('metadata_type',),
values=[
{
'metadata_type': self.metadata_type.pk,
}
], transform=dict
)
def test_document_metadata_edit_after_document_type_change(self):
# Gitlab issue #204
# Problems to add required metadata after changing the document type
document_type_2 = DocumentType.objects.create(
label=TEST_DOCUMENT_TYPE_2_LABEL
)
metadata_type_2 = MetadataType.objects.create(
name=TEST_METADATA_TYPE_NAME_2, label=TEST_METADATA_TYPE_LABEL_2
)
document_metadata_2 = document_type_2.metadata.create(
metadata_type=metadata_type_2, required=True
)
self.grant_access(
obj=self.document, permission=permission_document_properties_edit
)
self.grant_access(
obj=self.document, permission=permission_metadata_edit
)
self.document.set_document_type(document_type=document_type_2)
response = self.get(
viewname='metadata:document_metadata_edit',
kwargs={'document_id': self.document.pk}
)
self.assertContains(response, 'Edit', status_code=200)
response = self.post(
viewname='metadata:document_metadata_edit',
kwargs={'document_id': self.document.pk}, data={
'form-0-id': document_metadata_2.metadata_type.pk,
'form-0-update': True,
'form-0-value': TEST_DOCUMENT_METADATA_VALUE_2,
'form-TOTAL_FORMS': '1',
'form-INITIAL_FORMS': '0',
'form-MAX_NUM_FORMS': '',
}
)
self.assertEqual(response.status_code, 302)
self.assertEqual(
self.document.metadata.get(metadata_type=metadata_type_2).value,
TEST_DOCUMENT_METADATA_VALUE_2
)
def _request_document_document_metadata_remove_get_view(self):
return self.get(
viewname='metadata:document_metadata_remove',
kwargs={'document_id': self.document.pk}
)
def _request_document_document_metadata_remove_post_view(self):
return self.post(
viewname='metadata:document_metadata_remove',
kwargs={'document_id': self.document.pk}, data={
'form-0-id': self.document_metadata.metadata_type.pk,
'form-0-update': True,
'form-TOTAL_FORMS': '1',
'form-INITIAL_FORMS': '0',
'form-MAX_NUM_FORMS': '',
}
)
def test_document_metadata_remove_get_view_no_permission(self):
self.document_metadata = self.document.metadata.create(
metadata_type=self.metadata_type, value=''
)
response = self._request_document_document_metadata_remove_get_view()
self.assertNotContains(
response=response, text=self.metadata_type.label, status_code=404
)
def test_document_metadata_remove_get_view_with_full_access(self):
self.document_metadata = self.document.metadata.create(
metadata_type=self.metadata_type, value=''
)
self.grant_access(
obj=self.document, permission=permission_metadata_remove,
)
# Silence unrelated logging
logging.getLogger('mayan.apps.navigation.classes').setLevel(
level=logging.CRITICAL
)
response = self._request_document_document_metadata_remove_get_view()
self.assertContains(
response, text=self.metadata_type.label, status_code=200
)
def test_document_metadata_remove_post_view_no_permission(self):
self.document_metadata = self.document.metadata.create(
metadata_type=self.metadata_type, value=''
)
response = self._request_document_document_metadata_remove_get_view()
self.assertNotContains(
response=response, text=self.metadata_type.label, status_code=404
)
self.assertEqual(len(self.document.metadata.all()), 1)
def test_document_metadata_remove_post_view_with_access(self):
self.document_metadata = self.document.metadata.create(
metadata_type=self.metadata_type, value=''
)
self.grant_access(
obj=self.test_document, permission=permission_metadata_remove
)
response = self._request_document_document_metadata_remove_post_view()
self.assertEqual(response.status_code, 302)
self.assertEqual(len(self.document.metadata.all()), 0)
def _request_get_document_multiple_metadata_edit_view(self):
return self.get(
viewname='metadata:document_multiple_metadata_edit',
data={
'id_list': '{},{}'.format(self.document.pk, self.document_2.pk)
}
)
def _request_post_document_multiple_metadata_edit_view(self):
return self.post(
viewname='metadata:document_multiple_metadata_edit', data={
'id_list': '{},{}'.format(self.document.pk, self.document_2.pk),
'form-0-id': self.document_metadata.metadata_type.pk,
'form-0-value': TEST_METADATA_VALUE_EDITED,
'form-0-update': True,
'form-TOTAL_FORMS': '1',
'form-INITIAL_FORMS': '0',
'form-MAX_NUM_FORMS': '',
}
)
def test_document_multiple_metadata_edit_with_access(self):
self.document_2 = self.upload_document()
self.grant_access(
permission=permission_metadata_edit, obj=self.document
)
self.grant_access(
permission=permission_metadata_edit, obj=self.document_2
)
self.document_metadata = self.document.metadata.create(
metadata_type=self.metadata_type
)
self.document_2.metadata.create(metadata_type=self.metadata_type)
response = self._request_get_document_multiple_metadata_edit_view()
self.assertContains(
response, text=self.metadata_type.label, status_code=200
)
response = self._request_post_document_multiple_metadata_edit_view()
self.assertEqual(response.status_code, 302)
self.assertEqual(
self.document.metadata.first().value, TEST_METADATA_VALUE_EDITED
)
self.assertEqual(
self.document_2.metadata.first().value, TEST_METADATA_VALUE_EDITED
)
def _request_get_document_multiple_metadata_remove_view(self):
return self.get(
viewname='metadata:document_multiple_metadata_remove', data={
'id_list': '{},{}'.format(self.document.pk, self.document_2.pk)
}
)
def _request_post_document_multiple_metadata_remove_view(self):
return self.post(
viewname='metadata:document_multiple_metadata_remove', data={
'id_list': '{},{}'.format(self.document.pk, self.document_2.pk),
'form-0-id': self.document_metadata.metadata_type.pk,
'form-0-update': True,
'form-TOTAL_FORMS': '1',
'form-INITIAL_FORMS': '0',
'form-MAX_NUM_FORMS': '',
}
)
def test_document_multiple_metadata_remove_with_access(self):
self.document_2 = self.upload_document()
self.grant_access(
permission=permission_metadata_remove, obj=self.document
)
self.grant_access(
permission=permission_metadata_remove, obj=self.document_2
)
self.document_metadata = self.document.metadata.create(
metadata_type=self.metadata_type
)
self.document_2.metadata.create(metadata_type=self.metadata_type)
response = self._request_get_document_multiple_metadata_remove_view()
self.assertEquals(response.status_code, 200)
response = self._request_post_document_multiple_metadata_remove_view()
self.assertEqual(response.status_code, 302)
self.assertEqual(self.document.metadata.count(), 0)
self.assertEqual(self.document_2.metadata.count(), 0)
def _request_post_document_document_metadata_add_view(self):
return self.post(
viewname='metadata:document_multiple_metadata_add', data={
'id_list': '{},{}'.format(self.document.pk, self.document_2.pk),
'metadata_type': self.metadata_type.pk
}
)
def test_document_multiple_metadata_add_with_access(self):
self.document_2 = self.upload_document()
self.grant_access(
permission=permission_metadata_add, obj=self.document
)
self.grant_access(
permission=permission_metadata_add, obj=self.document_2
)
response = self._request_post_document_document_metadata_add_view()
self.assertEquals(response.status_code, 302)
self.assertEqual(self.document.metadata.all().count(), 1)
self.assertEqual(self.document_2.metadata.all().count(), 1)
def test_single_document_multiple_metadata_add_view_with_access(self):
self.grant_access(
permission=permission_metadata_add, obj=self.document
)
metadata_type_2 = MetadataType.objects.create(
name=TEST_METADATA_TYPE_NAME_2, label=TEST_METADATA_TYPE_LABEL_2
)
self.document_type.metadata.create(
metadata_type=metadata_type_2
)
self.post(
viewname='metadata:document_metadata_add',
kwargs={'document_id': self.document.pk}, data={
'metadata_type': [self.metadata_type.pk, metadata_type_2.pk],
}
)
document_metadata_types = self.document.metadata.values_list(
'metadata_type', flat=True
)
self.assertTrue(
self.metadata_type.pk in document_metadata_types and metadata_type_2.pk in document_metadata_types
)
class MetadataTypeViewViewTestCase(DocumentTestMixin, MetadataTestsMixin, GenericViewTestCase):
auto_create_document_type = False
auto_upload_document = False
def test_metadata_type_create_view_no_permission(self):
response = self._request_metadata_type_create_view()
self.assertEqual(response.status_code, 403)
def test_metadata_type_create_view_with_access(self):
self.grant_permission(permission=permission_metadata_type_create)
response = self._request_metadata_type_create_view()
self.assertEqual(response.status_code, 302)
self.assertQuerysetEqual(
qs=MetadataType.objects.values('label', 'name'),
values=[
{
'label': TEST_METADATA_TYPE_LABEL,
'name': TEST_METADATA_TYPE_NAME
}
], transform=dict
)
def test_metadata_type_delete_view_no_permission(self):
self._create_metadata_type()
response = self._request_metadata_type_delete_view()
self.assertEqual(response.status_code, 404)
self.assertQuerysetEqual(
qs=MetadataType.objects.values('label', 'name'),
values=[
{
'label': TEST_METADATA_TYPE_LABEL,
'name': TEST_METADATA_TYPE_NAME
}
], transform=dict
)
def test_metadata_type_delete_view_with_access(self):
self._create_metadata_type()
self.grant_access(
permission=permission_metadata_type_delete,
obj=self.metadata_type
)
response = self._request_metadata_type_delete_view()
self.assertEqual(response.status_code, 302)
self.assertEqual(MetadataType.objects.count(), 0)
def test_metadata_type_edit_view_no_permission(self):
self._create_metadata_type()
response = self._request_metadata_type_edit_view()
self.assertEqual(response.status_code, 404)
self.assertQuerysetEqual(
qs=MetadataType.objects.values('label', 'name'),
values=[
{
'label': TEST_METADATA_TYPE_LABEL,
'name': TEST_METADATA_TYPE_NAME
}
], transform=dict
)
def test_metadata_type_edit_view_with_access(self):
self._create_metadata_type()
self.grant_access(
permission=permission_metadata_type_edit,
obj=self.metadata_type
)
response = self._request_metadata_type_edit_view()
self.assertEqual(response.status_code, 302)
self.assertQuerysetEqual(
qs=MetadataType.objects.values('label', 'name'),
values=[
{
'label': TEST_METADATA_TYPE_LABEL_EDITED,
'name': TEST_METADATA_TYPE_NAME_EDITED
}
], transform=dict
)
def test_metadata_type_list_view_no_permission(self):
self._create_metadata_type()
response = self._request_metadata_type_list_view()
self.assertNotContains(
response=response, text=self.metadata_type, status_code=200
)
def test_metadata_type_list_view_with_access(self):
self._create_metadata_type()
self.grant_access(
permission=permission_metadata_type_view,
obj=self.metadata_type
)
response = self._request_metadata_type_list_view()
self.assertContains(
response=response, text=self.metadata_type, status_code=200
)
def test_metadata_type_relationship_view_no_permission(self):
self._create_metadata_type()
self._create_document_type()
self.upload_document()
response = self._request_metadata_type_relationship_edit_view()
self.assertEqual(response.status_code, 404)
self.document_type.refresh_from_db()
self.assertEqual(self.document_type.metadata.count(), 0)
def test_metadata_type_relationship_view_with_document_type_access(self):
self._create_metadata_type()
self._create_document_type()
self.upload_document()
self.grant_access(
permission=permission_document_type_edit, obj=self.document_type
)
response = self._request_metadata_type_relationship_edit_view()
self.assertEqual(response.status_code, 404)
self.document_type.refresh_from_db()
self.assertEqual(self.document_type.metadata.count(), 0)
def test_metadata_type_relationship_view_with_metadata_type_access(self):
self._create_metadata_type()
self._create_document_type()
self.upload_document()
self.grant_access(
permission=permission_metadata_type_edit, obj=self.metadata_type
)
response = self._request_metadata_type_relationship_edit_view()
self.assertEqual(response.status_code, 302)
self.document_type.refresh_from_db()
self.assertEqual(self.document_type.metadata.count(), 0)
def test_metadata_type_relationship_view_with_metadata_type_and_document_type_access(self):
self._create_metadata_type()
self._create_document_type()
self.upload_document()
self.grant_access(
permission=permission_metadata_type_edit, obj=self.metadata_type
)
self.grant_access(
permission=permission_document_type_edit, obj=self.document_type
)
response = self._request_metadata_type_relationship_edit_view()
self.assertEqual(response.status_code, 302)
self.document_type.refresh_from_db()
self.assertQuerysetEqual(
qs=self.document_type.metadata.values('metadata_type', 'required'),
values=[
{
'metadata_type': self.metadata_type.pk,
'required': True,
}
], transform=dict
)