aboutsummaryrefslogtreecommitdiffstats
path: root/alphabetlearning/resources/tests/test_file_processing.py
diff options
context:
space:
mode:
Diffstat (limited to 'alphabetlearning/resources/tests/test_file_processing.py')
-rw-r--r--alphabetlearning/resources/tests/test_file_processing.py134
1 files changed, 134 insertions, 0 deletions
diff --git a/alphabetlearning/resources/tests/test_file_processing.py b/alphabetlearning/resources/tests/test_file_processing.py
new file mode 100644
index 0000000..e09a135
--- /dev/null
+++ b/alphabetlearning/resources/tests/test_file_processing.py
@@ -0,0 +1,134 @@
+from pathlib import Path
+
+from django.conf import settings
+from django.contrib.auth import get_user_model
+from django.core.files.uploadedfile import InMemoryUploadedFile
+from django.core.files.uploadedfile import SimpleUploadedFile
+from django.core.files.uploadedfile import TemporaryUploadedFile
+from django.test import TestCase
+from django.urls import reverse
+
+from .. import services
+from ..utils import _get_pdf_collection_type
+
+
+def test_detect_snapshotted_pdf_collection():
+ single_pdf_single_page = [["toss"]]
+ single_pdf_multi_page = [["toss2", "toss8"]]
+ multi_pdf_single_page = [["toss"], ["toss2"]]
+ multi_pdf_multi_page = [["toss", "toss2"], ["toss", "toss2"]]
+
+ assert _get_pdf_collection_type(single_pdf_single_page) == "SINGLE_PDF_SINGLE_PAGE"
+ assert _get_pdf_collection_type(single_pdf_multi_page) == "SINGLE_PDF_MULTI_PAGE"
+ assert _get_pdf_collection_type(multi_pdf_single_page) == "MULTI_PDF_SINGLE_PAGE"
+ assert _get_pdf_collection_type(multi_pdf_multi_page) == "MULTI_PDF_MULTI_PAGE"
+
+
+class PDFFileUploadTestCase(TestCase):
+ def setUp(self):
+ self.url = reverse("resources:create_resource")
+ self.test_file_path = Path(
+ settings.BASE_DIR / "alphabetlearning" / "resources/tests/testdata/test_small_file.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,
+ )
+
+ def test_file_upload(self):
+ """
+ Test that a file can be uploaded successfully using our create_resource view.
+ """
+ self.client.login(
+ email=self.email,
+ password=self.password,
+ ) # Log in the test user
+
+ with open(self.test_file_path, "rb") as file:
+ uploaded_file = SimpleUploadedFile(
+ "test_file.pdf",
+ file.read(),
+ content_type="application/pdf",
+ )
+
+ response = self.client.post(self.url, {"pdf_files": [uploaded_file]})
+
+ # Check if the response is OK
+ self.assertEqual(response.status_code, 200)
+
+ def test_file_upload_with_upload_handlers(self):
+ """
+ This test does not test my code but the behavior of the Django file upload handlers.
+ """
+ self.client.login(
+ email=self.email,
+ password=self.password,
+ ) # Log in the test user
+
+ with open(self.test_file_path, "rb") as file:
+ uploaded_file = SimpleUploadedFile(
+ "test_file.pdf",
+ file.read(),
+ content_type="application/pdf",
+ )
+
+ response = self.client.post(self.url, {"pdf_files": [uploaded_file]})
+
+ self.assertEqual(response.status_code, 200)
+
+ # Check if the uploaded file was handled by MemoryFileUploadHandler or TemporaryFileUploadHandler
+ uploaded_files = response.wsgi_request.FILES.getlist("pdf_files")
+ self.assertEqual(len(uploaded_files), 1)
+
+ # We should expect an instance of InMemoryUploadedFile here because test_small_file.pdf is less than 2.5 MB
+ self.assertIsInstance(
+ uploaded_files[0],
+ (SimpleUploadedFile, TemporaryUploadedFile, InMemoryUploadedFile),
+ )
+
+ def test_uploaded_pdf_file_metadata(self):
+ """
+ This test does not test my application code, but rather tests the
+ behavior of the Django file upload handlers.
+ """
+ self.client.login(
+ email=self.email,
+ password=self.password,
+ ) # Log in the test user
+
+ with open(self.test_file_path, "rb") as file:
+ uploaded_file = SimpleUploadedFile(
+ "test_file.pdf",
+ file.read(),
+ content_type="application/pdf",
+ )
+
+ response = self.client.post(self.url, {"pdf_files": [uploaded_file]})
+
+ self.assertEqual(
+ response.status_code,
+ 200,
+ )
+
+ # Extract metadata from the uploaded file
+ pdf_metadata_from_path = services.get_pdf_metadata_from_path(self.test_file_path)
+
+ # Get the number of pages in the PDF - is 4
+ self.assertEqual(pdf_metadata_from_path.n_pages, 4)
+
+ # Get the file size in bytes
+ self.assertGreater(pdf_metadata_from_path.file_size, 0)
+
+ self.assertLess(
+ pdf_metadata_from_path.file_size,
+ 5 * 1024 * 1024,
+ ) # Assuming a maximum file size of 5 MB
+
+ # self.assertTrue(services.export_pdf_pages_as_images_temp_dir(self.test_file_path))
+ # capture the output of the export_pdf_pages_as_images_temp_dir function coroutine
+ files = list(services.export_pages_as_images(self.test_file_path))
+ self.assertEqual(len(files), 4)