Changeset View
Changeset View
Standalone View
Standalone View
swh/web/tests/api/views/test_origin_save.py
# Copyright (C) 2018-2021 The Software Heritage developers | # Copyright (C) 2018-2021 The Software Heritage developers | ||||
# See the AUTHORS file at the top-level directory of this distribution | # See the AUTHORS file at the top-level directory of this distribution | ||||
# License: GNU Affero General Public License version 3, or any later version | # License: GNU Affero General Public License version 3, or any later version | ||||
# See top-level LICENSE file for more information | # See top-level LICENSE file for more information | ||||
from datetime import datetime, timedelta | from datetime import datetime, timedelta | ||||
import uuid | import uuid | ||||
import pytest | import pytest | ||||
from django.core.exceptions import ObjectDoesNotExist | from django.core.exceptions import ObjectDoesNotExist | ||||
from django.utils import timezone | from django.utils import timezone | ||||
from swh.web.auth.utils import SWH_AMBASSADOR_PERMISSION | from swh.web.auth.utils import API_SAVE_ORIGIN_PERMISSION, SWH_AMBASSADOR_PERMISSION | ||||
from swh.web.common.models import ( | from swh.web.common.models import ( | ||||
SAVE_REQUEST_ACCEPTED, | SAVE_REQUEST_ACCEPTED, | ||||
SAVE_REQUEST_PENDING, | SAVE_REQUEST_PENDING, | ||||
SAVE_REQUEST_REJECTED, | SAVE_REQUEST_REJECTED, | ||||
SAVE_TASK_FAILED, | SAVE_TASK_FAILED, | ||||
SAVE_TASK_NOT_CREATED, | SAVE_TASK_NOT_CREATED, | ||||
SAVE_TASK_NOT_YET_SCHEDULED, | SAVE_TASK_NOT_YET_SCHEDULED, | ||||
SAVE_TASK_SCHEDULED, | SAVE_TASK_SCHEDULED, | ||||
SAVE_TASK_SUCCEEDED, | SAVE_TASK_SUCCEEDED, | ||||
VISIT_STATUS_FAILED, | VISIT_STATUS_FAILED, | ||||
VISIT_STATUS_FULL, | VISIT_STATUS_FULL, | ||||
SaveAuthorizedOrigin, | SaveAuthorizedOrigin, | ||||
SaveOriginRequest, | SaveOriginRequest, | ||||
SaveUnauthorizedOrigin, | SaveUnauthorizedOrigin, | ||||
) | ) | ||||
from swh.web.common.typing import OriginExistenceCheckInfo | from swh.web.common.typing import OriginExistenceCheckInfo | ||||
from swh.web.common.utils import reverse | from swh.web.common.utils import reverse | ||||
from swh.web.settings.tests import save_origin_rate_post | from swh.web.settings.tests import save_origin_rate_post | ||||
from swh.web.tests.utils import ( | from swh.web.tests.utils import ( | ||||
check_api_get_responses, | check_api_get_responses, | ||||
check_api_post_response, | check_api_post_response, | ||||
check_api_post_responses, | check_api_post_responses, | ||||
create_django_permission, | |||||
) | ) | ||||
pytestmark = pytest.mark.django_db | pytestmark = pytest.mark.django_db | ||||
@pytest.fixture(autouse=True) | @pytest.fixture(autouse=True) | ||||
def populated_db(): | def populated_db(): | ||||
SaveAuthorizedOrigin.objects.create(url="https://github.com/"), | SaveAuthorizedOrigin.objects.create(url="https://github.com/"), | ||||
▲ Show 20 Lines • Show All 282 Lines • ▼ Show 20 Lines | assert response.data == { | ||||
% unknown_origin_url, | % unknown_origin_url, | ||||
} | } | ||||
_visit_type = "git" | _visit_type = "git" | ||||
_origin_url = "https://github.com/python/cpython" | _origin_url = "https://github.com/python/cpython" | ||||
def test_save_requests_rate_limit(api_client, mocker): | def test_save_requests_rate_limit(api_client, swh_scheduler): | ||||
create_save_origin_request = mocker.patch( | |||||
"swh.web.api.views.origin_save.create_save_origin_request" | url = reverse( | ||||
"api-1-save-origin", | |||||
url_args={"visit_type": _visit_type, "origin_url": _origin_url}, | |||||
) | ) | ||||
def _save_request_dict(*args, **kwargs): | for _ in range(save_origin_rate_post): | ||||
return { | check_api_post_response(api_client, url, status_code=200) | ||||
"id": 1, | |||||
"visit_type": _visit_type, | check_api_post_response(api_client, url, status_code=429) | ||||
"origin_url": _origin_url, | |||||
"save_request_date": datetime.now().isoformat(), | |||||
"save_request_status": SAVE_REQUEST_ACCEPTED, | |||||
"save_task_status": SAVE_TASK_NOT_YET_SCHEDULED, | |||||
"visit_date": None, | |||||
"visit_status": None, | |||||
} | |||||
create_save_origin_request.side_effect = _save_request_dict | |||||
def test_save_requests_no_rate_limit_if_permission( | |||||
api_client, regular_user, swh_scheduler | |||||
): | |||||
regular_user.user_permissions.add( | |||||
create_django_permission(API_SAVE_ORIGIN_PERMISSION) | |||||
) | |||||
assert regular_user.has_perm(API_SAVE_ORIGIN_PERMISSION) | |||||
api_client.force_login(regular_user) | |||||
url = reverse( | url = reverse( | ||||
"api-1-save-origin", | "api-1-save-origin", | ||||
url_args={"visit_type": _visit_type, "origin_url": _origin_url}, | url_args={"visit_type": _visit_type, "origin_url": _origin_url}, | ||||
) | ) | ||||
for _ in range(save_origin_rate_post): | for _ in range(save_origin_rate_post): | ||||
check_api_post_response(api_client, url, status_code=200) | check_api_post_response(api_client, url, status_code=200) | ||||
check_api_post_response(api_client, url, status_code=429) | check_api_post_response(api_client, url, status_code=200) | ||||
def test_save_request_unknown_repo_with_permission( | |||||
api_client, regular_user, mocker, swh_scheduler | |||||
): | |||||
regular_user.user_permissions.add( | |||||
create_django_permission(API_SAVE_ORIGIN_PERMISSION) | |||||
) | |||||
assert regular_user.has_perm(API_SAVE_ORIGIN_PERMISSION) | |||||
api_client.force_login(regular_user) | |||||
origin_url = "https://unkwownforge.org/user/repo" | |||||
check_created_save_request_status( | |||||
api_client, | |||||
mocker, | |||||
origin_url, | |||||
expected_request_status=SAVE_REQUEST_ACCEPTED, | |||||
expected_task_status=SAVE_TASK_NOT_YET_SCHEDULED, | |||||
) | |||||
check_save_request_status( | |||||
api_client, | |||||
mocker, | |||||
swh_scheduler, | |||||
origin_url, | |||||
expected_request_status=SAVE_REQUEST_ACCEPTED, | |||||
expected_task_status=SAVE_TASK_NOT_YET_SCHEDULED, | |||||
) | |||||
def test_save_request_form_server_error(api_client, mocker): | def test_save_request_form_server_error(api_client, mocker): | ||||
create_save_origin_request = mocker.patch( | create_save_origin_request = mocker.patch( | ||||
"swh.web.api.views.origin_save.create_save_origin_request" | "swh.web.api.views.origin_save.create_save_origin_request" | ||||
) | ) | ||||
create_save_origin_request.side_effect = Exception("Server error") | create_save_origin_request.side_effect = Exception("Server error") | ||||
▲ Show 20 Lines • Show All 171 Lines • Show Last 20 Lines |