diff options
Diffstat (limited to 'alphabetlearning/resources/tests/test_views.py')
-rw-r--r-- | alphabetlearning/resources/tests/test_views.py | 190 |
1 files changed, 190 insertions, 0 deletions
diff --git a/alphabetlearning/resources/tests/test_views.py b/alphabetlearning/resources/tests/test_views.py new file mode 100644 index 0000000..b57e79d --- /dev/null +++ b/alphabetlearning/resources/tests/test_views.py @@ -0,0 +1,190 @@ +import unittest +from pathlib import Path + +import pytest +from django.conf import settings +from django.contrib.auth import get_user_model +from django.contrib.auth.models import User +from django.core.files.uploadedfile import SimpleUploadedFile +from django.test import RequestFactory +from django.test import TestCase +from django.urls import reverse + +from alphabetlearning.resources import services +from alphabetlearning.resources.forms import ResourceCreateForm +from alphabetlearning.resources.models import ResourceCategory +from alphabetlearning.resources.models import ResourceType +from alphabetlearning.resources.views import create_resource + +pytestmark = pytest.mark.django_db + + +def test_create_featured_resource_view(client): + url = reverse("resources:create_featured") + response = client.get(url) + assert response.status_code == 302 + + +def test_create_resource_view(client): + url = reverse("resources:create_resource") + response = client.get(url) + assert response.status_code == 302 + + +@pytest.mark.django_db +def test_create_resource_has_form(client): + User = get_user_model() + user = User.objects.create_user(email="testuser@example.com", password="12345") + client.login(email="testuser@example.com", password="12345") + + url = reverse("resources:create_resource") + response = client.get(url) + assert response.status_code == 200 + assert "form" in response.context + assert isinstance(response.context["form"], ResourceCreateForm) + + +class PDFFileUploadTestCase(TestCase): + def setUp(self): + self.url = reverse("resources:create_resource") + self.two_page_pdf = Path( + settings.BASE_DIR / "alphabetlearning" / "resources/tests/testdata/two_page.pdf" + ) + self.seven_page_pdf = Path( + settings.BASE_DIR / "alphabetlearning" / "resources/tests/testdata/seven_page.pdf" + ) + + # Create a test user + self.email = "testuser@example.com" + self.password = "testpassword" + self.user = get_user_model().objects.create_user( + email=self.email, + password=self.password, + ) + + # Log in the test user + self.client.login(email=self.email, password=self.password) + + # Open the test files and create SimpleUploadedFile objects + with open(self.two_page_pdf, "rb") as file: + self.uploaded_two_page_pdf = SimpleUploadedFile( + "two_page.pdf", + file.read(), + content_type="application/pdf", + ) + with open(self.seven_page_pdf, "rb") as file: + self.uploaded_seven_page_pdf = SimpleUploadedFile( + "seven_page.pdf", + file.read(), + content_type="application/pdf", + ) + + def tearDown(self): + # Close the SimpleUploadedFile objects + self.uploaded_two_page_pdf.close() + self.uploaded_seven_page_pdf.close() + + def test_file_upload_is_pdf(self): + """ + Test that a file can be uploaded successfully using our create_resource view. + """ + response = self.client.post( + self.url, + {"pdf_files": [self.uploaded_two_page_pdf, self.uploaded_seven_page_pdf]}, + ) + + two_page_metadata = services.get_pdf_metadata_from_path(self.two_page_pdf) + seven_page_metadata = services.get_pdf_metadata_from_path(self.seven_page_pdf) + image_files_two_pager = list(services.export_pages_as_images(self.two_page_pdf)) + image_files_seven_pager = list( + services.export_pages_as_images(self.seven_page_pdf), + ) + + self.assertEqual(two_page_metadata.n_pages, 2) + self.assertEqual(seven_page_metadata.n_pages, 7) + self.assertGreater(two_page_metadata.file_size, 0) + self.assertGreater(seven_page_metadata.file_size, 0) + self.assertEqual(len(image_files_two_pager), 2) + self.assertEqual(len(image_files_seven_pager), 7) + self.assertEqual(response.status_code, 200) + + +@unittest.skip("Currently not able to mock S3 API at this point") +class TestCreateResourceUsingResourceFactory(TestCase): + def setUp(self): + self.factory = RequestFactory() + self.user = User.objects.create_user( + username="testuser", + password="testpassword", + ) + self.two_page_pdf = "resources/tests/testdata/two_page.pdf" + self.seven_page_pdf = "resources/tests/testdata/seven_page.pdf" + + # Create resource type + self.resource_type = ResourceType.objects.create(name="Test Resource Type") + + # Create resource categories + self.main_resource_category = ResourceCategory.objects.create( + name="Test Main Category", + ) + self.additional_resource_category = ResourceCategory.objects.create( + name="Test Additional Category", + ) + + def test_post_pdf(self): + # Open the test files and create SimpleUploadedFile objects + with open(self.two_page_pdf, "rb") as file: + uploaded_two_page_pdf = SimpleUploadedFile( + "two_page.pdf", + file.read(), + content_type="application/pdf", + ) + with open(self.seven_page_pdf, "rb") as file: + uploaded_seven_page_pdf = SimpleUploadedFile( + "seven_page.pdf", + file.read(), + content_type="application/pdf", + ) + + # Create a thumbnail file (you can use a dummy file for testing) + thumbnail_file = SimpleUploadedFile( + "thumbnail.jpg", + b"thumbnail_content", + content_type="image/jpeg", + ) + + # Prepare the form data + form_data = { + "name": "Test Resource", + "description": "Test Description", + "resource_type": self.resource_type.id, + "age_range": "5-7", + "curriculum": "English", + "main_resource_category": self.main_resource_category.id, + "additional_resource_category": self.additional_resource_category.id, + "pdf_files": [uploaded_two_page_pdf, uploaded_seven_page_pdf], + "thumbnail_files": [thumbnail_file], + } + + # Prepare the form files + form_files = { + "pdf_files": [uploaded_two_page_pdf, uploaded_seven_page_pdf], + "thumbnail_files": [thumbnail_file], + } + + # Create the request object with form data and files + request = self.factory.post("/create/", data=form_data) + request.user = self.user + + # TODO mock the call to the Spaces S3 service inside the view + + # Call the create_resource view function + response = create_resource(request) + + # Assert the response status code + self.assertEqual( + response.status_code, + 302, + ) # Assuming a successful form submission redirects (status code 302) + + # Add more assertions as needed |