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 pyblackbird_cc.resources import services from pyblackbird_cc.resources.forms import ResourceCreateForm from pyblackbird_cc.resources.models import ResourceCategory from pyblackbird_cc.resources.models import ResourceType from pyblackbird_cc.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 / "pyblackbird_cc" / "resources/tests/testdata/two_page.pdf" ) self.seven_page_pdf = Path( settings.BASE_DIR / "pyblackbird_cc" / "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