Split document.tests.test_views.
Signed-off-by: Michael Price <loneviking72@gmail.com>
This commit is contained in:
committed by
Roberto Rosario
parent
77777deec5
commit
96836065a8
@@ -1 +1,2 @@
|
||||
from .base import GenericDocumentViewTestCase # NOQA
|
||||
from .literals import * # NOQA
|
||||
|
||||
35
mayan/apps/documents/tests/base.py
Normal file
35
mayan/apps/documents/tests/base.py
Normal file
@@ -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()
|
||||
109
mayan/apps/documents/tests/test_deleted_document_views.py
Normal file
109
mayan/apps/documents/tests/test_deleted_document_views.py
Normal file
@@ -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)
|
||||
31
mayan/apps/documents/tests/test_document_page_views.py
Normal file
31
mayan/apps/documents/tests/test_document_page_views.py
Normal file
@@ -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
|
||||
)
|
||||
244
mayan/apps/documents/tests/test_document_type_views.py
Normal file
244
mayan/apps/documents/tests/test_document_type_views.py
Normal file
@@ -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
|
||||
)
|
||||
80
mayan/apps/documents/tests/test_document_version_views.py
Normal file
80
mayan/apps/documents/tests/test_document_version_views.py
Normal file
@@ -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)
|
||||
File diff suppressed because it is too large
Load Diff
74
mayan/apps/documents/tests/test_duplicated_document_views.py
Normal file
74
mayan/apps/documents/tests/test_duplicated_document_views.py
Normal file
@@ -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
|
||||
)
|
||||
@@ -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'
|
||||
|
||||
@@ -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):
|
||||
|
||||
Reference in New Issue
Block a user