98 lines
5.2 KiB
Python
98 lines
5.2 KiB
Python
|
|
from django.urls import reverse
|
|
from rest_framework.test import APITestCase, APIClient
|
|
from rest_framework import status
|
|
from django.core.files.uploadedfile import SimpleUploadedFile
|
|
from api.organization.models import Organizacion, UsoAlmacenamiento
|
|
from api.cuser.models import CustomUser
|
|
from api.customs.models import Pedimento
|
|
from .models import Document
|
|
import io
|
|
|
|
class DocumentViewSetTests(APITestCase):
|
|
def setUp(self):
|
|
self.org = Organizacion.objects.create(nombre="OrgTest", is_active=True, is_verified=True)
|
|
self.pedimento = Pedimento.objects.create(organizacion=self.org, numero="123456")
|
|
self.admin = CustomUser.objects.create_user(username="admin", password="adminpass", organizacion=self.org)
|
|
self.admin.groups.create(name="admin")
|
|
self.superuser = CustomUser.objects.create_superuser(username="superuser", password="superpass")
|
|
self.client = APIClient()
|
|
|
|
def test_list_documents_only_own_org(self):
|
|
doc1 = Document.objects.create(organizacion=self.org, pedimento=self.pedimento, archivo="documents/test1.pdf", size=100, extension="pdf")
|
|
org2 = Organizacion.objects.create(nombre="OrgTest2", is_active=True, is_verified=True)
|
|
ped2 = Pedimento.objects.create(organizacion=org2, numero="654321")
|
|
Document.objects.create(organizacion=org2, pedimento=ped2, archivo="documents/test2.pdf", size=200, extension="pdf")
|
|
self.client.force_authenticate(user=self.admin)
|
|
url = reverse('Document-list')
|
|
response = self.client.get(url)
|
|
ids = [d['id'] for d in response.data]
|
|
self.assertIn(str(doc1.id), ids)
|
|
self.assertEqual(len(ids), 1)
|
|
|
|
def test_create_document_success(self):
|
|
self.client.force_authenticate(user=self.admin)
|
|
file_content = b"dummy pdf content"
|
|
archivo = SimpleUploadedFile("test.pdf", file_content, content_type="application/pdf")
|
|
url = reverse('Document-list')
|
|
data = {
|
|
"pedimento": str(self.pedimento.id),
|
|
"archivo": archivo,
|
|
"size": len(file_content),
|
|
"extension": "pdf"
|
|
}
|
|
response = self.client.post(url, data, format='multipart')
|
|
self.assertEqual(response.status_code, status.HTTP_201_CREATED)
|
|
doc = Document.objects.get(id=response.data['id'])
|
|
self.assertEqual(doc.organizacion, self.org)
|
|
|
|
def test_update_document_size(self):
|
|
doc = Document.objects.create(organizacion=self.org, pedimento=self.pedimento, archivo="documents/test1.pdf", size=100, extension="pdf")
|
|
self.client.force_authenticate(user=self.admin)
|
|
url = reverse('Document-detail', args=[doc.id])
|
|
file_content = b"new content"
|
|
archivo = SimpleUploadedFile("test2.pdf", file_content, content_type="application/pdf")
|
|
data = {
|
|
"archivo": archivo,
|
|
"size": len(file_content),
|
|
"extension": "pdf"
|
|
}
|
|
response = self.client.patch(url, data, format='multipart')
|
|
self.assertEqual(response.status_code, status.HTTP_200_OK)
|
|
doc.refresh_from_db()
|
|
self.assertEqual(doc.size, len(file_content))
|
|
|
|
def test_delete_document_frees_storage(self):
|
|
doc = Document.objects.create(organizacion=self.org, pedimento=self.pedimento, archivo="documents/test1.pdf", size=100, extension="pdf")
|
|
UsoAlmacenamiento.objects.create(organizacion=self.org, espacio_utilizado=100)
|
|
self.client.force_authenticate(user=self.admin)
|
|
url = reverse('Document-detail', args=[doc.id])
|
|
response = self.client.delete(url)
|
|
self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
|
|
uso = UsoAlmacenamiento.objects.get(organizacion=self.org)
|
|
self.assertEqual(uso.espacio_utilizado, 0)
|
|
|
|
def test_permission_denied_for_other_org(self):
|
|
org2 = Organizacion.objects.create(nombre="OrgTest2", is_active=True, is_verified=True)
|
|
ped2 = Pedimento.objects.create(organizacion=org2, numero="654321")
|
|
doc2 = Document.objects.create(organizacion=org2, pedimento=ped2, archivo="documents/test2.pdf", size=200, extension="pdf")
|
|
self.client.force_authenticate(user=self.admin)
|
|
url = reverse('Document-detail', args=[doc2.id])
|
|
response = self.client.get(url)
|
|
self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
|
|
|
|
def test_superuser_can_access_all(self):
|
|
org2 = Organizacion.objects.create(nombre="OrgTest2", is_active=True, is_verified=True)
|
|
ped2 = Pedimento.objects.create(organizacion=org2, numero="654321")
|
|
doc2 = Document.objects.create(organizacion=org2, pedimento=ped2, archivo="documents/test2.pdf", size=200, extension="pdf")
|
|
self.client.force_authenticate(user=self.superuser)
|
|
url = reverse('Document-detail', args=[doc2.id])
|
|
response = self.client.get(url)
|
|
self.assertEqual(response.status_code, status.HTTP_200_OK)
|
|
|
|
def test_protected_download_requires_auth(self):
|
|
doc = Document.objects.create(organizacion=self.org, pedimento=self.pedimento, archivo="documents/test1.pdf", size=100, extension="pdf")
|
|
url = reverse('descargar-documento', args=[doc.id])
|
|
response = self.client.get(url)
|
|
self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
|