import pytest
from django.core.files.uploadedfile import SimpleUploadedFile
from django.db import IntegrityError
from django.test import TestCase
from django.utils.datastructures import MultiValueDict
from alphabetlearning.resources.factories import ResourceModelFactory
from alphabetlearning.resources.forms import ResourceCreateForm
from alphabetlearning.resources.models import ResourceCategory
from alphabetlearning.resources.models import ResourceType
class ResourceCreateFormTest(TestCase):
def setUp(self):
self.resource_type = ResourceType.objects.create(name="Test Resource Type")
self.resource_category = ResourceCategory.objects.create(name="Test Resource Category")
self.form_data = {
"name": "Test Resource",
"description": "Test Description",
"card_description": "Test Card Description",
"resource_type": self.resource_type.id,
"age_range": "Reception (4-5yrs)",
"curriculum": "English",
"feature_slot": 1,
"main_resource_category": self.resource_category.id,
}
self.pdf_files = [
# use the correct PDF file header - this should pass validation
SimpleUploadedFile(
f"file{i}.pdf",
b"\x25\x50\x44\x46\x2d",
content_type="application/pdf",
)
for i in range(11)
]
self.thumbnail_files = [
# use the correct JPG file header - this should pass validation
SimpleUploadedFile(
f"thumbnail{i}.jpg",
b"\xff\xd8\xff\xdb",
content_type="image/jpeg",
)
# 5 is the max number currently set in ALLOWED_THUMBNAILS
for i in range(5)
]
# This needs to be a MultiValueDict for the test to mimic production code
# see clean_pdf_files - self.files.getlist()
self.form_files = MultiValueDict(
{"pdf_files": self.pdf_files, "thumbnail_files": self.thumbnail_files},
)
def test_form_valid(self):
form = ResourceCreateForm(data=self.form_data, files=self.form_files)
assert form.is_valid()
@pytest.mark.django_db()
def test_featured_slots_must_be_unique(self):
r1 = ResourceModelFactory(feature_slot=1)
with pytest.raises(IntegrityError):
ResourceModelFactory(feature_slot=1)
@pytest.mark.django_db()
def test_featured_slots_allowable(self):
form_data = {
"name": "Test Resource",
"description": "Test Description",
"resource_type": self.resource_type.id,
"age_range": "5-7",
"curriculum": "English",
"feature_slot": 4,
"main_resource_category": self.resource_category.id,
}
form = ResourceCreateForm(data=form_data, files=self.form_files)
assert not form.is_valid()