PyInventory/inventory/tests/test_item_images.py

77 wiersze
3.5 KiB
Python

2020-11-15 13:31:37 +00:00
import tempfile
from unittest import mock
from django.http import FileResponse
from django.test import TestCase, override_settings
from django_tools.serve_media_app.models import UserMediaTokenModel
2020-11-15 13:31:37 +00:00
from model_bakery import baker
from inventory.models import ItemImageModel
from inventory.tests.fixtures.users import get_normal_pyinventory_user
2022-06-20 17:22:58 +00:00
@override_settings(SECURE_SSL_REDIRECT=True)
2020-11-15 13:31:37 +00:00
class ItemImagesTestCase(TestCase):
def test_basics(self):
with mock.patch('secrets.token_urlsafe', return_value='user1token'):
pyinventory_user1 = get_normal_pyinventory_user(id=1)
with mock.patch('secrets.token_urlsafe', return_value='user2token'):
pyinventory_user2 = get_normal_pyinventory_user(id=2)
token1_instance = UserMediaTokenModel.objects.get(user=pyinventory_user1)
2023-07-21 05:50:19 +00:00
assert repr(token1_instance) == (f"<UserMediaTokenModel: user:1 token:'user1token' ({token1_instance.pk})>")
token2_instance = UserMediaTokenModel.objects.get(user=pyinventory_user2)
2023-07-21 05:50:19 +00:00
assert repr(token2_instance) == (f"<UserMediaTokenModel: user:2 token:'user2token' ({token2_instance.pk})>")
with tempfile.TemporaryDirectory() as temp:
with override_settings(MEDIA_ROOT=temp):
with mock.patch('secrets.token_urlsafe', return_value='12345678901234567890'):
2023-07-21 05:50:19 +00:00
image_instance = baker.make(ItemImageModel, user=pyinventory_user1, _create_files=True)
2020-11-15 13:31:37 +00:00
assert image_instance.image is not None
url = image_instance.image.url
assert url == '/media/user1token/12345678901234567890/mock_img.jpeg'
2020-11-15 13:31:37 +00:00
2021-12-05 15:22:24 +00:00
# HTTP -> HTTPS redirect:
2023-07-21 05:50:19 +00:00
response = self.client.get('/media/user1token/12345678901234567890/mock_img.jpeg', secure=False)
2021-12-05 15:22:24 +00:00
self.assertRedirects(
response,
status_code=301,
expected_url='https://testserver/media/user1token/12345678901234567890/mock_img.jpeg',
fetch_redirect_response=False,
)
# Anonymous has no access:
2021-12-05 15:22:24 +00:00
response = self.client.get(
'/media/user1token/12345678901234567890/mock_img.jpeg',
secure=True,
)
2020-11-15 13:31:37 +00:00
assert response.status_code == 403
# Can't access with wrong user:
self.client.force_login(pyinventory_user2)
2021-12-05 15:22:24 +00:00
response = self.client.get(
'/media/user1token/12345678901234567890/mock_img.jpeg',
secure=True,
)
2020-11-15 13:31:37 +00:00
assert response.status_code == 403
# Can access with the right user:
self.client.force_login(pyinventory_user1)
2021-12-05 15:22:24 +00:00
response = self.client.get(
'/media/user1token/12345678901234567890/mock_img.jpeg',
secure=True,
)
assert response.status_code == 200
assert isinstance(response, FileResponse)
assert response.getvalue() == image_instance.image.open('rb').read()
# Test whats happen, if token was deleted
UserMediaTokenModel.objects.all().delete()
2021-12-05 15:22:24 +00:00
response = self.client.get(
'/media/user1token/12345678901234567890/mock_img.jpeg',
secure=True,
)
assert response.status_code == 400 # SuspiciousOperation -> HttpResponseBadRequest