import random import string from pathlib import Path from typing import Callable from unittest.mock import patch import pytest from django.conf import settings from django.core.files.base import ContentFile from django.core.files.uploadedfile import SimpleUploadedFile from django.test import Client from django.urls import reverse from django.utils.datastructures import MultiValueDict from django.utils.timezone import localdate from model_bakery import baker from PIL import Image from pytest_django.asserts import assertInHTML, assertRedirects from core.baker_recipes import subscriber_user from core.models import Group, User from core.utils import RED_PIXEL_PNG from sas.baker_recipes import picture_recipe from sas.forms import AlbumEditForm from sas.models import Album @pytest.fixture def sas_root(db) -> Album: return Album.objects.get(id=settings.SITH_SAS_ROOT_DIR_ID) @pytest.fixture def album(db) -> Album: name = "".join( random.choice(string.ascii_letters) for _ in range(Album.NAME_MAX_LENGTH) ) return baker.make( Album, name=name, parent_id=settings.SITH_SAS_ROOT_DIR_ID, is_moderated=True ) @pytest.mark.parametrize("user", [None, lambda: baker.make(User), subscriber_user.make]) @pytest.mark.django_db def test_permission_denied( client: Client, album: Album, user: Callable[[], User] | None ): if user: client.force_login(user()) url = reverse("sas:album_edit", kwargs={"album_id": album.pk}) for method in client.get, client.post: assert method(url).status_code == 403 @pytest.mark.django_db def test_sas_root_read_only(client: Client, sas_root: Album): moderator = baker.make( User, groups=[Group.objects.get(pk=settings.SITH_GROUP_SAS_ADMIN_ID)] ) client.force_login(moderator) url = reverse("sas:album_edit", kwargs={"album_id": sas_root.pk}) for method in client.get, client.post: assert method(url).status_code == 404 @pytest.mark.parametrize( ("excluded", "is_valid"), [ ("name", False), ("date", False), ("file", True), ("parent", False), ("edit_groups", True), ("recursive", True), ], ) @pytest.mark.django_db def test_form_required(album: Album, excluded: str, is_valid: bool): # noqa: FBT001 data = { "name": album.name, "parent": baker.make(Album, parent=album.parent, is_moderated=True).pk, "date": localdate(), "file": "/random/path", "edit_groups": [settings.SITH_GROUP_SAS_ADMIN_ID], "recursive": False, } del data[excluded] assert AlbumEditForm(data=data).is_valid() == is_valid @pytest.mark.django_db def test_form_album_name(album: Album): data = { "name": "a" * Album.NAME_MAX_LENGTH, "parent": album.pk, "date": localdate(), } assert AlbumEditForm(data=data).is_valid() data["name"] = "a" * (Album.NAME_MAX_LENGTH + 1) assert not AlbumEditForm(data=data).is_valid() @pytest.mark.django_db def test_update_recursive_parent(client: Client, album: Album): client.force_login(baker.make(User, is_superuser=True)) payload = {"name": album.name, "parent": album.pk, "date": localdate()} response = client.post( reverse("sas:album_edit", kwargs={"album_id": album.pk}), payload ) assertInHTML("