diff --git a/swh/web/tests/api/test_throttling.py b/swh/web/tests/api/test_throttling.py --- a/swh/web/tests/api/test_throttling.py +++ b/swh/web/tests/api/test_throttling.py @@ -1,4 +1,4 @@ -# Copyright (C) 2017-2020 The Software Heritage developers +# Copyright (C) 2017-2021 The Software Heritage developers # See the AUTHORS file at the top-level directory of this distribution # License: GNU Affero General Public License version 3, or any later version # See top-level LICENSE file for more information @@ -6,8 +6,7 @@ import pytest from django.conf.urls import url -from django.contrib.auth.models import Permission, User -from django.contrib.contenttypes.models import ContentType +from django.contrib.auth.models import User from django.test.utils import override_settings from rest_framework.decorators import api_view from rest_framework.response import Response @@ -27,6 +26,7 @@ scope3_limiter_rate, scope3_limiter_rate_post, ) +from swh.web.tests.utils import create_django_permission from swh.web.urls import urlpatterns @@ -217,14 +217,7 @@ @pytest.mark.django_db def test_users_with_throttling_exempted_perm_are_not_rate_limited(api_client): user = User.objects.create_user(username="johndoe", password="") - perm_splitted = API_THROTTLING_EXEMPTED_PERM.split(".") - app_label = ".".join(perm_splitted[:-1]) - perm_name = perm_splitted[-1] - content_type = ContentType.objects.create(app_label=app_label, model="dummy") - permission = Permission.objects.create( - codename=perm_name, name=perm_name, content_type=content_type, - ) - user.user_permissions.add(permission) + user.user_permissions.add(create_django_permission(API_THROTTLING_EXEMPTED_PERM)) assert user.has_perm(API_THROTTLING_EXEMPTED_PERM) diff --git a/swh/web/tests/create_test_users.py b/swh/web/tests/create_test_users.py --- a/swh/web/tests/create_test_users.py +++ b/swh/web/tests/create_test_users.py @@ -3,14 +3,27 @@ # License: GNU Affero General Public License version 3, or any later version # See top-level LICENSE file for more information +from typing import Dict, List, Tuple from django.contrib.auth import get_user_model +from swh.web.auth.utils import SWH_AMBASSADOR_PERMISSION +from swh.web.tests.utils import create_django_permission + User = get_user_model() -username = "user" -password = "user" -email = "user@swh-web.org" -if not User.objects.filter(username=username).exists(): - User.objects.create_user(username, email, password) +users: Dict[str, Tuple[str, str, List[str]]] = { + "user": ("user", "user@swh-web.org", []), + "ambassador": ("ambassador", "ambassador@swh-web.org", [SWH_AMBASSADOR_PERMISSION]), +} + +for username, (password, email, permissions) in users.items(): + if not User.objects.filter(username=username).exists(): + user = User.objects.create_user(username, email, password) + if permissions: + for perm_name in permissions: + permission = create_django_permission(perm_name) + user.user_permissions.add(permission) + + user.save() diff --git a/swh/web/tests/test_create_users.py b/swh/web/tests/test_create_users.py new file mode 100644 --- /dev/null +++ b/swh/web/tests/test_create_users.py @@ -0,0 +1,16 @@ +# Copyright (C) 2021 The Software Heritage developers +# See the AUTHORS file at the top-level directory of this distribution +# License: GNU Affero General Public License version 3, or any later version +# See top-level LICENSE file for more information + + +def test_create_users_test_users_exist(db): + from .create_test_users import User, users + + for username, (_, _, permissions) in users.items(): + + user = User.objects.filter(username=username).get() + assert user is not None + + for permission in permissions: + assert user.has_perm(permission) diff --git a/swh/web/tests/utils.py b/swh/web/tests/utils.py --- a/swh/web/tests/utils.py +++ b/swh/web/tests/utils.py @@ -1,10 +1,12 @@ -# Copyright (C) 2020 The Software Heritage developers +# Copyright (C) 2020-2021 The Software Heritage developers # See the AUTHORS file at the top-level directory of this distribution # License: GNU Affero General Public License version 3, or any later version # See top-level LICENSE file for more information from typing import Any, Dict, Optional, cast +from django.contrib.auth.models import Permission +from django.contrib.contenttypes.models import ContentType from django.http import HttpResponse, StreamingHttpResponse from django.test.client import Client from rest_framework.response import Response @@ -207,3 +209,23 @@ if template_used is not None: assert_template_used(response, template_used) return response + + +def create_django_permission(perm_name: str) -> Permission: + """Create permission out of a permission name string + + Args: + perm_name: Permission name (e.g. swh.web.api.throttling_exempted, + swh.ambassador, ...) + + Returns: + The persisted permission + + """ + perm_splitted = perm_name.split(".") + app_label = ".".join(perm_splitted[:-1]) + perm_name = perm_splitted[-1] + content_type = ContentType.objects.create(app_label=app_label, model="dummy") + return Permission.objects.create( + codename=perm_name, name=perm_name, content_type=content_type, + )