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