aboutsummaryrefslogtreecommitdiffstats
path: root/alphabetlearning/resources/tests/test_forms.py
blob: 465dc58544096c857b2056c16e6d9a886010005c (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
import pytest
from alphabetlearning.resources.factories import ResourceModelFactory
from alphabetlearning.resources.forms import ResourceCreateForm
from alphabetlearning.resources.models import ResourceCategory, ResourceType
from django.core.files.uploadedfile import SimpleUploadedFile
from django.db import IntegrityError
from django.test import TestCase
from django.utils.datastructures import MultiValueDict


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):
        _ = 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()