2020-01-30 14:47:36 +01:00
|
|
|
import os
|
2021-06-03 15:20:39 +02:00
|
|
|
|
|
|
|
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
|
2021-06-03 15:20:39 +02:00
|
|
|
from libretimeapi.models.user_constants import ADMIN, DJ, GUEST, PROGRAM_MANAGER
|
2021-05-27 16:23:02 +02:00
|
|
|
from libretimeapi.permission_constants import (
|
|
|
|
DJ_PERMISSIONS,
|
2021-06-03 15:20:39 +02:00
|
|
|
GUEST_PERMISSIONS,
|
2021-05-27 16:23:02 +02:00
|
|
|
PROGRAM_MANAGER_PERMISSIONS,
|
|
|
|
)
|
2021-06-03 15:20:39 +02:00
|
|
|
from libretimeapi.permissions import IsSystemTokenOrUser
|
|
|
|
from model_bakery import baker
|
|
|
|
from rest_framework.test import APIRequestFactory, APITestCase
|
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()
|
2021-05-27 16:23:02 +02:00
|
|
|
request.META["Authorization"] = "Api-Key {token}".format(token=token)
|
2020-01-30 14:47:36 +01:00
|
|
|
allowed = IsSystemTokenOrUser().has_permission(request, None)
|
|
|
|
self.assertFalse(allowed)
|
|
|
|
|
|
|
|
def test_token_correct(self):
|
2021-05-27 16:23:02 +02:00
|
|
|
token = settings.CONFIG.get("general", "api_key")
|
2020-01-30 14:47:36 +01:00
|
|
|
request = APIRequestFactory().get(self.path)
|
|
|
|
request.user = AnonymousUser()
|
2021-05-27 16:23:02 +02:00
|
|
|
request.META["Authorization"] = "Api-Key {token}".format(token=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)
|
|
|
|
user_created = get_user_model().objects.filter(username=name)
|
|
|
|
if not user_created:
|
2021-05-27 16:23:02 +02:00
|
|
|
user = get_user_model().objects.create_user(
|
|
|
|
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="Invalid for model {}".format(model)
|
|
|
|
)
|
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="Invalid for model {}".format(model)
|
|
|
|
)
|
|
|
|
response = self.logged_in_test_model("users", "guest", GUEST, self.client.get)
|
|
|
|
self.assertEqual(response.status_code, 403, msg="Invalid for model users")
|
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="Invalid for model {}".format(model)
|
|
|
|
)
|
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",
|
|
|
|
)
|
|
|
|
f = baker.make("libretimeapi.File", owner=user)
|
|
|
|
model = "files/{}".format(f.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):
|
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",
|
|
|
|
)
|
|
|
|
f = baker.make("libretimeapi.File")
|
|
|
|
model = "files/{}".format(f.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)
|