sintonia/api/libretime_api/tests/test_permissions.py

126 lines
4.1 KiB
Python
Raw Normal View History

from django.conf import settings
2020-01-30 14:47:36 +01:00
from django.contrib.auth import get_user_model
from django.contrib.auth.models import AnonymousUser
from model_bakery import baker
from rest_framework.test import APIRequestFactory, APITestCase
2022-04-01 17:29:11 +02:00
from ..core.models import DJ, GUEST
from ..permissions import IsSystemTokenOrUser
2020-01-30 14:47:36 +01:00
class TestIsSystemTokenOrUser(APITestCase):
@classmethod
def setUpTestData(cls):
cls.path = "/api/v2/files/"
def test_unauthorized(self):
2021-05-27 16:23:02 +02:00
response = self.client.get(self.path.format("files"))
2020-01-30 14:47:36 +01:00
self.assertEqual(response.status_code, 403)
def test_token_incorrect(self):
2021-05-27 16:23:02 +02:00
token = "doesnotexist"
2020-01-30 14:47:36 +01:00
request = APIRequestFactory().get(self.path)
request.user = AnonymousUser()
request.META["Authorization"] = f"Api-Key {token}"
2020-01-30 14:47:36 +01:00
allowed = IsSystemTokenOrUser().has_permission(request, None)
self.assertFalse(allowed)
def test_token_correct(self):
token = settings.CONFIG.general.api_key
2020-01-30 14:47:36 +01:00
request = APIRequestFactory().get(self.path)
request.user = AnonymousUser()
request.META["Authorization"] = f"Api-Key {token}"
2020-01-30 14:47:36 +01:00
allowed = IsSystemTokenOrUser().has_permission(request, None)
self.assertTrue(allowed)
class TestPermissions(APITestCase):
URLS = [
2021-05-27 16:23:02 +02:00
"schedule",
"shows",
"show-days",
"show-hosts",
"show-instances",
"show-rebroadcasts",
"files",
"playlists",
"playlist-contents",
"smart-blocks",
"smart-block-contents",
"smart-block-criteria",
"webstreams",
2020-01-30 14:47:36 +01:00
]
def logged_in_test_model(self, model, name, user_type, fn):
path = self.path.format(model)
2022-04-01 17:29:11 +02:00
if not get_user_model().objects.filter(username=name):
get_user_model().objects.create_user(
2021-05-27 16:23:02 +02:00
name,
email="test@example.com",
password="test",
type=user_type,
first_name="test",
last_name="user",
)
self.client.login(username=name, password="test")
2020-01-30 14:47:36 +01:00
return fn(path)
@classmethod
def setUpTestData(cls):
cls.path = "/api/v2/{}/"
def test_guest_permissions_success(self):
for model in self.URLS:
2021-05-27 16:23:02 +02:00
response = self.logged_in_test_model(model, "guest", GUEST, self.client.get)
self.assertEqual(
response.status_code, 200, msg=f"Invalid for model {model}"
2021-05-27 16:23:02 +02:00
)
2020-01-30 14:47:36 +01:00
def test_guest_permissions_failure(self):
for model in self.URLS:
2021-05-27 16:23:02 +02:00
response = self.logged_in_test_model(
model, "guest", GUEST, self.client.post
)
self.assertEqual(
response.status_code, 403, msg=f"Invalid for model {model}"
2021-05-27 16:23:02 +02:00
)
2020-01-30 14:47:36 +01:00
def test_dj_get_permissions(self):
for model in self.URLS:
2021-05-27 16:23:02 +02:00
response = self.logged_in_test_model(model, "dj", DJ, self.client.get)
self.assertEqual(
response.status_code, 200, msg=f"Invalid for model {model}"
2021-05-27 16:23:02 +02:00
)
2020-01-30 14:47:36 +01:00
def test_dj_post_permissions(self):
2021-05-27 16:23:02 +02:00
user = get_user_model().objects.create_user(
"test-dj",
email="test@example.com",
password="test",
type=DJ,
first_name="test",
last_name="user",
)
2022-04-01 17:29:11 +02:00
file = baker.make("storage.File", owner=user)
model = f"files/{file.id}"
2020-01-30 14:47:36 +01:00
path = self.path.format(model)
2021-05-27 16:23:02 +02:00
self.client.login(username="test-dj", password="test")
response = self.client.patch(path, {"name": "newFilename"})
2020-01-30 14:47:36 +01:00
self.assertEqual(response.status_code, 200)
def test_dj_post_permissions_failure(self):
2022-04-01 17:29:11 +02:00
get_user_model().objects.create_user(
2021-05-27 16:23:02 +02:00
"test-dj",
email="test@example.com",
password="test",
type=DJ,
first_name="test",
last_name="user",
)
2022-04-01 17:29:11 +02:00
file = baker.make("storage.File")
model = f"files/{file.id}"
2020-01-30 14:47:36 +01:00
path = self.path.format(model)
2021-05-27 16:23:02 +02:00
self.client.login(username="test-dj", password="test")
response = self.client.patch(path, {"name": "newFilename"})
2020-01-30 14:47:36 +01:00
self.assertEqual(response.status_code, 403)