Changeset View
Changeset View
Standalone View
Standalone View
swh/web/tests/api/views/test_vault.py
# Copyright (C) 2017-2021 The Software Heritage developers | # Copyright (C) 2017-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 | ||||
import re | import re | ||||
from hypothesis import given | from hypothesis import given | ||||
import pytest | import pytest | ||||
from swh.model.swhids import CoreSWHID | from swh.model.swhids import CoreSWHID | ||||
from swh.vault.exc import NotFoundExc | from swh.vault.exc import NotFoundExc | ||||
from swh.web.common.utils import reverse | from swh.web.common.utils import reverse | ||||
from swh.web.tests.strategies import revision, unknown_directory, unknown_revision | from swh.web.tests.strategies import unknown_directory, unknown_revision | ||||
from swh.web.tests.utils import ( | from swh.web.tests.utils import ( | ||||
check_api_get_responses, | check_api_get_responses, | ||||
check_api_post_responses, | check_api_post_responses, | ||||
check_http_get_response, | check_http_get_response, | ||||
check_http_post_response, | check_http_post_response, | ||||
) | ) | ||||
##################### | ##################### | ||||
# Current API: | # Current API: | ||||
@given(revision()) | |||||
def test_api_vault_cook(api_client, mocker, directory, revision): | def test_api_vault_cook(api_client, mocker, directory, revision): | ||||
mock_archive = mocker.patch("swh.web.api.views.vault.archive") | mock_archive = mocker.patch("swh.web.api.views.vault.archive") | ||||
for bundle_type, swhid, content_type, in ( | for bundle_type, swhid, content_type, in ( | ||||
("flat", f"swh:1:dir:{directory}", "application/gzip"), | ("flat", f"swh:1:dir:{directory}", "application/gzip"), | ||||
("gitfast", f"swh:1:rev:{revision}", "application/gzip"), | ("gitfast", f"swh:1:rev:{revision}", "application/gzip"), | ||||
("git_bare", f"swh:1:rev:{revision}", "application/x-tar"), | ("git_bare", f"swh:1:rev:{revision}", "application/x-tar"), | ||||
): | ): | ||||
Show All 33 Lines | ): | ||||
mock_archive.vault_cook.assert_called_with(bundle_type, swhid, email) | mock_archive.vault_cook.assert_called_with(bundle_type, swhid, email) | ||||
rv = check_http_get_response(api_client, fetch_url, status_code=200) | rv = check_http_get_response(api_client, fetch_url, status_code=200) | ||||
assert rv["Content-Type"] == content_type | assert rv["Content-Type"] == content_type | ||||
assert rv.content == stub_fetch | assert rv.content == stub_fetch | ||||
mock_archive.vault_fetch.assert_called_with(bundle_type, swhid) | mock_archive.vault_fetch.assert_called_with(bundle_type, swhid) | ||||
@given(revision(), unknown_directory(), unknown_revision()) | @given(unknown_directory(), unknown_revision()) | ||||
def test_api_vault_cook_notfound( | def test_api_vault_cook_notfound( | ||||
api_client, mocker, directory, revision, unknown_directory, unknown_revision | api_client, mocker, directory, revision, unknown_directory, unknown_revision | ||||
): | ): | ||||
mock_vault = mocker.patch("swh.web.common.archive.vault") | mock_vault = mocker.patch("swh.web.common.archive.vault") | ||||
mock_vault.cook.side_effect = NotFoundExc("object not found") | mock_vault.cook.side_effect = NotFoundExc("object not found") | ||||
mock_vault.fetch.side_effect = NotFoundExc("cooked archive not found") | mock_vault.fetch.side_effect = NotFoundExc("cooked archive not found") | ||||
mock_vault.progress.side_effect = NotFoundExc("cooking request not found") | mock_vault.progress.side_effect = NotFoundExc("cooking request not found") | ||||
▲ Show 20 Lines • Show All 96 Lines • ▼ Show 20 Lines | def test_api_vault_cook_error(api_client, mocker, bundle_type, swhid_type, hint): | ||||
else: | else: | ||||
assert re.match(r"Only .* can be cooked as .* bundles\.", rv.data["reason"]) | assert re.match(r"Only .* can be cooked as .* bundles\.", rv.data["reason"]) | ||||
##################### | ##################### | ||||
# Legacy API: | # Legacy API: | ||||
@given(revision()) | |||||
def test_api_vault_cook_legacy(api_client, mocker, directory, revision): | def test_api_vault_cook_legacy(api_client, mocker, directory, revision): | ||||
mock_archive = mocker.patch("swh.web.api.views.vault.archive") | mock_archive = mocker.patch("swh.web.api.views.vault.archive") | ||||
for obj_type, bundle_type, response_obj_type, obj_id in ( | for obj_type, bundle_type, response_obj_type, obj_id in ( | ||||
("directory", "flat", "directory", directory), | ("directory", "flat", "directory", directory), | ||||
("revision_gitfast", "gitfast", "revision", revision), | ("revision_gitfast", "gitfast", "revision", revision), | ||||
): | ): | ||||
swhid = CoreSWHID.from_string(f"swh:1:{obj_type[:3]}:{obj_id}") | swhid = CoreSWHID.from_string(f"swh:1:{obj_type[:3]}:{obj_id}") | ||||
Show All 35 Lines | ): | ||||
mock_archive.vault_cook.assert_called_with(bundle_type, swhid, email) | mock_archive.vault_cook.assert_called_with(bundle_type, swhid, email) | ||||
rv = check_http_get_response(api_client, fetch_url, status_code=200) | rv = check_http_get_response(api_client, fetch_url, status_code=200) | ||||
assert rv["Content-Type"] == "application/gzip" | assert rv["Content-Type"] == "application/gzip" | ||||
assert rv.content == stub_fetch | assert rv.content == stub_fetch | ||||
mock_archive.vault_fetch.assert_called_with(bundle_type, swhid) | mock_archive.vault_fetch.assert_called_with(bundle_type, swhid) | ||||
@given(revision()) | |||||
def test_api_vault_cook_uppercase_hash_legacy(api_client, directory, revision): | def test_api_vault_cook_uppercase_hash_legacy(api_client, directory, revision): | ||||
for obj_type, obj_id in ( | for obj_type, obj_id in ( | ||||
("directory", directory), | ("directory", directory), | ||||
("revision_gitfast", revision), | ("revision_gitfast", revision), | ||||
): | ): | ||||
url = reverse( | url = reverse( | ||||
Show All 19 Lines | ): | ||||
redirect_url = reverse( | redirect_url = reverse( | ||||
f"api-1-vault-fetch-{obj_type}", url_args={f"{obj_type[:3]}_id": obj_id}, | f"api-1-vault-fetch-{obj_type}", url_args={f"{obj_type[:3]}_id": obj_id}, | ||||
) | ) | ||||
assert rv["location"] == redirect_url | assert rv["location"] == redirect_url | ||||
@given(revision(), unknown_directory(), unknown_revision()) | @given(unknown_directory(), unknown_revision()) | ||||
def test_api_vault_cook_notfound_legacy( | def test_api_vault_cook_notfound_legacy( | ||||
api_client, mocker, directory, revision, unknown_directory, unknown_revision | api_client, mocker, directory, revision, unknown_directory, unknown_revision | ||||
): | ): | ||||
mock_vault = mocker.patch("swh.web.common.archive.vault") | mock_vault = mocker.patch("swh.web.common.archive.vault") | ||||
mock_vault.cook.side_effect = NotFoundExc("object not found") | mock_vault.cook.side_effect = NotFoundExc("object not found") | ||||
mock_vault.fetch.side_effect = NotFoundExc("cooked archive not found") | mock_vault.fetch.side_effect = NotFoundExc("cooked archive not found") | ||||
mock_vault.progress.side_effect = NotFoundExc("cooking request not found") | mock_vault.progress.side_effect = NotFoundExc("cooking request not found") | ||||
▲ Show 20 Lines • Show All 47 Lines • Show Last 20 Lines |