diff --git a/mayan/apps/authentication/tests/test_views.py b/mayan/apps/authentication/tests/test_views.py index 2e152e1338..3cafefc98e 100644 --- a/mayan/apps/authentication/tests/test_views.py +++ b/mayan/apps/authentication/tests/test_views.py @@ -21,14 +21,13 @@ class UserLoginTestCase(GenericViewTestCase): """ Test that users can login via the supported authentication methods """ - def setUp(self): super(UserLoginTestCase, self).setUp() Namespace.invalidate_cache_all() @override_settings(AUTHENTICATION_LOGIN_METHOD='username') def test_normal_behavior(self): - response = self.client.get(reverse('documents:document_list')) + response = self.get(viewname='documents:document_list') self.assertRedirects( response, 'http://testserver/authentication/login/?next=/documents/list/' @@ -40,7 +39,7 @@ class UserLoginTestCase(GenericViewTestCase): username=TEST_ADMIN_USERNAME, password=TEST_ADMIN_PASSWORD ) self.assertTrue(logged_in) - response = self.client.get(reverse('documents:document_list')) + response = self.get(viewname='documents:document_list') # We didn't get redirected to the login URL self.assertEqual(response.status_code, 200) @@ -57,59 +56,59 @@ class UserLoginTestCase(GenericViewTestCase): ) self.assertTrue(logged_in) - response = self.client.get(reverse('documents:document_list')) + response = self.get(viewname='documents:document_list') # We didn't get redirected to the login URL self.assertEqual(response.status_code, 200) @override_settings(AUTHENTICATION_LOGIN_METHOD='username') def test_username_login_via_views(self): - response = self.client.get(reverse('documents:document_list')) + response = self.get(viewname='documents:document_list') self.assertRedirects( response, 'http://testserver/authentication/login/?next=/documents/list/' ) - response = self.client.post( - reverse(settings.LOGIN_URL), { + response = self.post( + data={ 'username': TEST_ADMIN_USERNAME, 'password': TEST_ADMIN_PASSWORD - } + }, viewname=settings.LOGIN_URL ) - response = self.client.get(reverse('documents:document_list')) + response = self.get(viewname='documents:document_list') # We didn't get redirected to the login URL self.assertEqual(response.status_code, 200) @override_settings(AUTHENTICATION_LOGIN_METHOD='email') def test_email_login_via_views(self): with self.settings(AUTHENTICATION_BACKENDS=(TEST_EMAIL_AUTHENTICATION_BACKEND,)): - response = self.client.get(reverse('documents:document_list')) + response = self.get(viewname='documents:document_list') self.assertRedirects( response, 'http://testserver/authentication/login/?next=/documents/list/' ) - response = self.client.post( - reverse(settings.LOGIN_URL), { + response = self.post( + viewname=settings.LOGIN_URL, data={ 'email': TEST_ADMIN_EMAIL, 'password': TEST_ADMIN_PASSWORD }, follow=True ) self.assertEqual(response.status_code, 200) - response = self.client.get(reverse('documents:document_list')) + response = self.get(viewname='documents:document_list') # We didn't get redirected to the login URL self.assertEqual(response.status_code, 200) @override_settings(AUTHENTICATION_LOGIN_METHOD='username') def test_username_remember_me(self): - response = self.client.post( - reverse(settings.LOGIN_URL), { + response = self.post( + viewname=settings.LOGIN_URL, data={ 'username': TEST_ADMIN_USERNAME, 'password': TEST_ADMIN_PASSWORD, 'remember_me': True }, follow=True ) - response = self.client.get(reverse('documents:document_list')) + response = self.get(viewname='documents:document_list') self.assertEqual(response.status_code, 200) self.assertEqual( @@ -120,15 +119,15 @@ class UserLoginTestCase(GenericViewTestCase): @override_settings(AUTHENTICATION_LOGIN_METHOD='username') def test_username_dont_remember_me(self): - response = self.client.post( - reverse(settings.LOGIN_URL), { + response = self.post( + viewname=settings.LOGIN_URL, data={ 'username': TEST_ADMIN_USERNAME, 'password': TEST_ADMIN_PASSWORD, 'remember_me': False }, follow=True ) - response = self.client.get(reverse('documents:document_list')) + response = self.get(viewname='documents:document_list') self.assertEqual(response.status_code, 200) self.assertTrue(self.client.session.get_expire_at_browser_close()) @@ -136,15 +135,15 @@ class UserLoginTestCase(GenericViewTestCase): @override_settings(AUTHENTICATION_LOGIN_METHOD='email') def test_email_remember_me(self): with self.settings(AUTHENTICATION_BACKENDS=(TEST_EMAIL_AUTHENTICATION_BACKEND,)): - response = self.client.post( - reverse(settings.LOGIN_URL), { + response = self.post( + viewname=settings.LOGIN_URL, data={ 'email': TEST_ADMIN_EMAIL, 'password': TEST_ADMIN_PASSWORD, 'remember_me': True }, follow=True ) - response = self.client.get(reverse('documents:document_list')) + response = self.get(viewname='documents:document_list') self.assertEqual(response.status_code, 200) self.assertEqual( @@ -200,12 +199,11 @@ class UserLoginTestCase(GenericViewTestCase): self.assertEqual(response.status_code, 200) def test_username_login_redirect(self): - TEST_REDIRECT_URL = reverse('common:about_view') + TEST_REDIRECT_URL = reverse(viewname='common:about_view') - response = self.client.post( - '{}?next={}'.format( - reverse(settings.LOGIN_URL), TEST_REDIRECT_URL - ), { + response = self.post( + viewname=settings.LOGIN_URL, query={'next': TEST_REDIRECT_URL}, + data={ 'username': TEST_ADMIN_USERNAME, 'password': TEST_ADMIN_PASSWORD, 'remember_me': False diff --git a/mayan/apps/cabinets/tests/mixins.py b/mayan/apps/cabinets/tests/mixins.py new file mode 100644 index 0000000000..1f8d846c92 --- /dev/null +++ b/mayan/apps/cabinets/tests/mixins.py @@ -0,0 +1,10 @@ +from __future__ import unicode_literals + +from ..models import Cabinet + +from .literals import TEST_CABINET_LABEL + + +class CabinetTestMixin(object): + def _create_test_cabinet(self): + self.test_cabinet = Cabinet.objects.create(label=TEST_CABINET_LABEL) diff --git a/mayan/apps/cabinets/tests/test_api.py b/mayan/apps/cabinets/tests/test_api.py index 52f7d922db..f9d51bf713 100644 --- a/mayan/apps/cabinets/tests/test_api.py +++ b/mayan/apps/cabinets/tests/test_api.py @@ -1,49 +1,48 @@ from __future__ import unicode_literals -from django.contrib.auth import get_user_model from django.test import override_settings -from django.urls import reverse from django.utils.encoding import force_text from rest_framework import status -from rest_framework.test import APITestCase from mayan.apps.documents.tests import DocumentTestMixin -from mayan.apps.user_management.tests.literals import ( - TEST_ADMIN_EMAIL, TEST_ADMIN_PASSWORD, TEST_ADMIN_USERNAME -) +from mayan.apps.rest_api.tests import BaseAPITestCase from ..models import Cabinet +from ..permissions import ( + permission_cabinet_create, permission_cabinet_delete, + permission_cabinet_edit, permission_cabinet_view +) from .literals import TEST_CABINET_EDITED_LABEL, TEST_CABINET_LABEL +from .mixins import CabinetTestMixin -@override_settings(OCR_AUTO_OCR=False) -class CabinetAPITestCase(DocumentTestMixin, APITestCase): - """ - Test the cabinet API endpoints - """ - auto_upload_document = False - +class CabinetAPITestCase(CabinetTestMixin, BaseAPITestCase): def setUp(self): super(CabinetAPITestCase, self).setUp() + self.login_user() - self.admin_user = get_user_model().objects.create_superuser( - username=TEST_ADMIN_USERNAME, email=TEST_ADMIN_EMAIL, - password=TEST_ADMIN_PASSWORD + def _request_cabinet_create_api_view(self): + return self.post( + viewname='rest_api:cabinet-list', data={ + 'label': TEST_CABINET_LABEL + } ) - self.client.login( - username=TEST_ADMIN_USERNAME, password=TEST_ADMIN_PASSWORD - ) + def test_cabinet_create_api_view_no_permission(self): + cabinet_count = Cabinet.objects.count() - self.document = self.upload_document() - self.document_2 = self.upload_document() + response = self._request_cabinet_create_api_view() + self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN) + + self.assertEqual(cabinet_count, Cabinet.objects.count()) + + def test_cabinet_create_api_view_with_permission(self): + self.grant_permission(permission=permission_cabinet_create) + + response = self._request_cabinet_create_api_view() - def test_cabinet_create(self): - response = self.client.post( - reverse('rest_api:cabinet-list'), {'label': TEST_CABINET_LABEL} - ) self.assertEqual(response.status_code, status.HTTP_201_CREATED) cabinet = Cabinet.objects.first() @@ -54,9 +53,140 @@ class CabinetAPITestCase(DocumentTestMixin, APITestCase): self.assertEqual(Cabinet.objects.count(), 1) self.assertEqual(cabinet.label, TEST_CABINET_LABEL) + def _request_cabinet_delete_api_view(self): + return self.delete( + viewname='rest_api:cabinet-detail', kwargs={ + 'pk': self.test_cabinet.pk + } + ) + + def test_cabinet_delete_api_view_no_permssions(self): + self._create_test_cabinet() + + cabinet_count = Cabinet.objects.count() + + response = self._request_cabinet_delete_api_view() + self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) + + self.assertEqual(Cabinet.objects.count(), cabinet_count) + + def test_cabinet_delete_api_view_with_access(self): + self._create_test_cabinet() + + self.grant_access( + obj=self.test_cabinet, permission=permission_cabinet_delete + ) + + cabinet_count = Cabinet.objects.count() + + response = self._request_cabinet_delete_api_view() + self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT) + + self.assertEqual(Cabinet.objects.count(), cabinet_count - 1) + + def _request_cabinet_edit_api_patch_view(self): + return self.patch( + data={'label': TEST_CABINET_EDITED_LABEL}, kwargs={ + 'pk': self.test_cabinet.pk + }, viewname='rest_api:cabinet-detail' + ) + + def test_cabinet_edit_api_patch_view_no_pemission(self): + self._create_test_cabinet() + + cabinet_label = self.test_cabinet.label + + response = self._request_cabinet_edit_api_patch_view() + self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) + + self.test_cabinet.refresh_from_db() + self.assertEqual(cabinet_label, self.test_cabinet.label) + + def test_cabinet_edit_api_patch_view_with_access(self): + self._create_test_cabinet() + + self.grant_access( + obj=self.test_cabinet, permission=permission_cabinet_edit + ) + + cabinet_label = self.test_cabinet.label + + response = self._request_cabinet_edit_api_patch_view() + self.assertEqual(response.status_code, status.HTTP_200_OK) + + self.test_cabinet.refresh_from_db() + self.assertNotEqual(cabinet_label, self.test_cabinet.label) + + def _request_cabinet_edit_api_put_view(self): + return self.put( + data={'label': TEST_CABINET_EDITED_LABEL}, kwargs={ + 'pk': self.test_cabinet.pk + }, viewname='rest_api:cabinet-detail' + ) + + def test_cabinet_edit_api_put_view_no_pemission(self): + self._create_test_cabinet() + + cabinet_label = self.test_cabinet.label + + response = self._request_cabinet_edit_api_put_view() + self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) + + self.test_cabinet.refresh_from_db() + self.assertEqual(cabinet_label, self.test_cabinet.label) + + def test_cabinet_edit_api_put_view_with_access(self): + self._create_test_cabinet() + + self.grant_access( + obj=self.test_cabinet, permission=permission_cabinet_edit + ) + + cabinet_label = self.test_cabinet.label + + response = self._request_cabinet_edit_api_put_view() + self.assertEqual(response.status_code, status.HTTP_200_OK) + + self.test_cabinet.refresh_from_db() + self.assertNotEqual(cabinet_label, self.test_cabinet.label) + + def _request_cabinet_list_api_view(self): + return self.get(viewname='rest_api:cabinet-list') + + def test_cabinet_list_api_view_no_permission(self): + self._create_test_cabinet() + + response = self._request_cabinet_list_api_view() + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertEqual(response.data['count'], 0) + + def test_cabinet_list_api_view_with_access(self): + self._create_test_cabinet() + + self.grant_access( + obj=self.test_cabinet, permission=permission_cabinet_view + ) + + response = self._request_cabinet_list_api_view() + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertEqual( + response.data['results'][0]['label'], self.test_cabinet.label + ) + + +@override_settings(OCR_AUTO_OCR=False) +class CabinetDocumentAPITestCase(CabinetTestMixin, DocumentTestMixin, BaseAPITestCase): + auto_upload_document = False + + def setUp(self): + super(CabinetDocumentAPITestCase, self).setUp() + self.login_admin_user() + def test_cabinet_create_with_single_document(self): - response = self.client.post( - reverse('rest_api:cabinet-list'), { + self.document = self.upload_document() + + response = self.post( + viewname='rest_api:cabinet-list', data={ 'label': TEST_CABINET_LABEL, 'documents_pk_list': '{}'.format( self.document.pk ) @@ -75,8 +205,11 @@ class CabinetAPITestCase(DocumentTestMixin, APITestCase): self.assertEqual(cabinet.label, TEST_CABINET_LABEL) def test_cabinet_create_with_multiple_documents(self): - response = self.client.post( - reverse('rest_api:cabinet-list'), { + self.document = self.upload_document() + self.document_2 = self.upload_document() + + response = self.post( + viewname='rest_api:cabinet-list', data={ 'label': TEST_CABINET_LABEL, 'documents_pk_list': '{},{}'.format( self.document.pk, self.document_2.pk @@ -101,28 +234,31 @@ class CabinetAPITestCase(DocumentTestMixin, APITestCase): ) def test_cabinet_document_delete(self): - cabinet = Cabinet.objects.create(label=TEST_CABINET_LABEL) - cabinet.documents.add(self.document) + self.document = self.upload_document() - response = self.client.delete( - reverse( - 'rest_api:cabinet-document', - args=(cabinet.pk, self.document.pk) - ) + self._create_test_cabinet() + self.test_cabinet.documents.add(self.document) + + response = self.delete( + viewname='rest_api:cabinet-document', kwargs={ + 'pk': self.test_cabinet.pk, 'document_pk': self.document.pk + } ) self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT) - self.assertEqual(cabinet.documents.count(), 0) + self.assertEqual(self.test_cabinet.documents.count(), 0) def test_cabinet_document_detail(self): - cabinet = Cabinet.objects.create(label=TEST_CABINET_LABEL) - cabinet.documents.add(self.document) + self.document = self.upload_document() - response = self.client.get( - reverse( - 'rest_api:cabinet-document', - args=(cabinet.pk, self.document.pk) - ) + self._create_test_cabinet() + + self.test_cabinet.documents.add(self.document) + + response = self.get( + viewname='rest_api:cabinet-document', kwargs={ + 'pk': self.test_cabinet.pk, 'document_pk': self.document.pk + } ) self.assertEqual(response.status_code, status.HTTP_200_OK) @@ -131,11 +267,16 @@ class CabinetAPITestCase(DocumentTestMixin, APITestCase): ) def test_cabinet_document_list(self): - cabinet = Cabinet.objects.create(label=TEST_CABINET_LABEL) - cabinet.documents.add(self.document) + self.document = self.upload_document() - response = self.client.get( - reverse('rest_api:cabinet-document-list', args=(cabinet.pk,)) + self._create_test_cabinet() + + self.test_cabinet.documents.add(self.document) + + response = self.get( + viewname='rest_api:cabinet-document-list', kwargs={ + 'pk': self.test_cabinet.pk + } ) self.assertEqual(response.status_code, status.HTTP_200_OK) @@ -143,97 +284,58 @@ class CabinetAPITestCase(DocumentTestMixin, APITestCase): response.data['results'][0]['uuid'], force_text(self.document.uuid) ) - def test_cabinet_delete(self): - cabinet = Cabinet.objects.create(label=TEST_CABINET_LABEL) + def test_cabinet_remove_document(self): + self.document = self.upload_document() - response = self.client.delete( - reverse('rest_api:cabinet-detail', args=(cabinet.pk,)) + self._create_test_cabinet() + + self.test_cabinet.documents.add(self.document) + + response = self.delete( + viewname='rest_api:cabinet-document', kwargs={ + 'pk': self.test_cabinet.pk, 'document_pk': self.document.pk + } ) self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT) - - self.assertEqual(Cabinet.objects.count(), 0) - - def test_cabinet_edit_via_patch(self): - cabinet = Cabinet.objects.create(label=TEST_CABINET_LABEL) - - response = self.client.patch( - reverse('rest_api:cabinet-detail', args=(cabinet.pk,)), - {'label': TEST_CABINET_EDITED_LABEL} - ) - self.assertEqual(response.status_code, status.HTTP_200_OK) - - cabinet.refresh_from_db() - - self.assertEqual(cabinet.label, TEST_CABINET_EDITED_LABEL) - - def test_cabinet_edit_via_put(self): - cabinet = Cabinet.objects.create(label=TEST_CABINET_LABEL) - - response = self.client.put( - reverse('rest_api:cabinet-detail', args=(cabinet.pk,)), - {'label': TEST_CABINET_EDITED_LABEL} - ) - self.assertEqual(response.status_code, status.HTTP_200_OK) - - cabinet.refresh_from_db() - - self.assertEqual(cabinet.label, TEST_CABINET_EDITED_LABEL) + self.assertEqual(self.test_cabinet.documents.count(), 0) def test_cabinet_add_document(self): - cabinet = Cabinet.objects.create(label=TEST_CABINET_LABEL) + self.document = self.upload_document() - response = self.client.post( - reverse('rest_api:cabinet-document-list', args=(cabinet.pk,)), { + self._create_test_cabinet() + + response = self.post( + data={ 'documents_pk_list': '{}'.format(self.document.pk) - } + }, kwargs={ + 'pk': self.test_cabinet.pk + }, viewname='rest_api:cabinet-document-list' ) self.assertEqual(response.status_code, status.HTTP_201_CREATED) self.assertQuerysetEqual( - cabinet.documents.all(), (repr(self.document),) + self.test_cabinet.documents.all(), (repr(self.document),) ) def test_cabinet_add_multiple_documents(self): - cabinet = Cabinet.objects.create(label=TEST_CABINET_LABEL) + self.document = self.upload_document() + self.document_2 = self.upload_document() - response = self.client.post( - reverse('rest_api:cabinet-document-list', args=(cabinet.pk,)), { + self._create_test_cabinet() + + response = self.post( + data={ 'documents_pk_list': '{},{}'.format( self.document.pk, self.document_2.pk - ) - } + ), + }, kwargs={ + 'pk': self.test_cabinet.pk + }, viewname='rest_api:cabinet-document-list' ) self.assertEqual(response.status_code, status.HTTP_201_CREATED) self.assertQuerysetEqual( - cabinet.documents.all(), map( + self.test_cabinet.documents.all(), map( repr, (self.document, self.document_2) ) ) - - def test_cabinet_list_view(self): - cabinet = Cabinet.objects.create(label=TEST_CABINET_LABEL) - Cabinet.objects.create( - label=TEST_CABINET_LABEL, parent=cabinet - ) - - response = self.client.get( - reverse('rest_api:cabinet-list') - ) - self.assertEqual(response.status_code, status.HTTP_200_OK) - self.assertEqual(response.data['results'][0]['label'], cabinet.label) - - def test_cabinet_remove_document(self): - cabinet = Cabinet.objects.create(label=TEST_CABINET_LABEL) - - cabinet.documents.add(self.document) - - response = self.client.delete( - reverse( - 'rest_api:cabinet-document', args=( - cabinet.pk, self.document.pk - ) - ), - ) - self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT) - self.assertEqual(cabinet.documents.count(), 0) diff --git a/mayan/apps/common/tests/test_api.py b/mayan/apps/common/tests/test_api.py index a3d6a48650..4d7d6a1d72 100644 --- a/mayan/apps/common/tests/test_api.py +++ b/mayan/apps/common/tests/test_api.py @@ -12,14 +12,14 @@ TEST_TEMPLATE_RESULT = '