Changeset View
Changeset View
Standalone View
Standalone View
swh/web/tests/api/views/test_metadata.py
# Copyright (C) 2021 The Software Heritage developers | # Copyright (C) 2022 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 attr | import attr | ||||
from hypothesis import given | from hypothesis import given, settings | ||||
from hypothesis.strategies import composite, sampled_from, sets | from hypothesis.strategies import sets | ||||
import pytest | import pytest | ||||
from swh.model.hypothesis_strategies import raw_extrinsic_metadata, sha1_git | from swh.model.hypothesis_strategies import raw_extrinsic_metadata | ||||
from swh.model.swhids import CoreSWHID, ObjectType | from swh.model.model import Origin | ||||
from swh.web.common.utils import reverse | from swh.web.common.utils import reverse | ||||
from swh.web.tests.api.views.utils import scroll_results | from swh.web.tests.api.views.utils import scroll_results | ||||
from swh.web.tests.utils import check_api_get_responses, check_http_get_response | from swh.web.tests.utils import check_api_get_responses, check_http_get_response | ||||
@composite | @given(raw_extrinsic_metadata()) | ||||
def core_swhids(draw): | |||||
object_type = draw(sampled_from(ObjectType)) | |||||
object_id = draw(sha1_git()) | |||||
return CoreSWHID(object_type=object_type, object_id=object_id).to_extended() | |||||
@given(raw_extrinsic_metadata(target=core_swhids())) | |||||
def test_api_raw_extrinsic_metadata(api_client, subtest, metadata): | def test_api_raw_extrinsic_metadata(api_client, subtest, metadata): | ||||
# ensure archive_data fixture will be reset between each hypothesis | # ensure archive_data fixture will be reset between each hypothesis | ||||
# example test run | # example test run | ||||
@subtest | @subtest | ||||
def test_inner(archive_data): | def test_inner(archive_data): | ||||
archive_data.metadata_authority_add([metadata.authority]) | archive_data.metadata_authority_add([metadata.authority]) | ||||
archive_data.metadata_fetcher_add([metadata.fetcher]) | archive_data.metadata_fetcher_add([metadata.fetcher]) | ||||
archive_data.raw_extrinsic_metadata_add([metadata]) | archive_data.raw_extrinsic_metadata_add([metadata]) | ||||
Show All 11 Lines | def test_inner(archive_data): | ||||
expected_result = metadata.to_dict() | expected_result = metadata.to_dict() | ||||
del expected_result["id"] | del expected_result["id"] | ||||
del expected_result["metadata"] | del expected_result["metadata"] | ||||
metadata_url = rv.data[0]["metadata_url"] | metadata_url = rv.data[0]["metadata_url"] | ||||
expected_result["metadata_url"] = metadata_url | expected_result["metadata_url"] = metadata_url | ||||
expected_result["discovery_date"] = expected_result[ | expected_result["discovery_date"] = expected_result[ | ||||
"discovery_date" | "discovery_date" | ||||
].isoformat() | ].isoformat() | ||||
if expected_result["target"].startswith(("swh:1:ori:", "swh:1:emd:")): | |||||
# non-core SWHID are hidden from the API | |||||
del expected_result["target"] | |||||
assert rv.data == [expected_result] | assert rv.data == [expected_result] | ||||
rv = check_http_get_response(api_client, metadata_url, status_code=200) | rv = check_http_get_response(api_client, metadata_url, status_code=200) | ||||
assert rv["Content-Type"] == "application/octet-stream" | assert rv["Content-Type"] == "application/octet-stream" | ||||
assert ( | assert ( | ||||
rv["Content-Disposition"] | rv["Content-Disposition"] | ||||
== f'attachment; filename="{metadata.target}_metadata"' | == f'attachment; filename="{metadata.target}_metadata"' | ||||
) | ) | ||||
assert rv.content == metadata.metadata | assert rv.content == metadata.metadata | ||||
anlambert: any reason to restrict the number of examples ? | |||||
Done Inline ActionsI don't see the point of testing more; the origin URL is always the same anyway vlorentz: I don't see the point of testing more; the origin URL is always the same anyway | |||||
Not Done Inline Actionsack anlambert: ack | |||||
@settings(max_examples=1) | |||||
@given(raw_extrinsic_metadata()) | |||||
def test_api_raw_extrinsic_metadata_origin_filename(api_client, subtest, metadata): | |||||
# ensure archive_data fixture will be reset between each hypothesis | |||||
# example test run | |||||
@subtest | |||||
def test_inner(archive_data): | |||||
nonlocal metadata | |||||
origin = Origin(url="http://example.com/repo.git") | |||||
metadata = attr.evolve(metadata, target=origin.swhid()) | |||||
metadata = attr.evolve(metadata, id=metadata.compute_hash()) | |||||
archive_data.origin_add([origin]) | |||||
archive_data.metadata_authority_add([metadata.authority]) | |||||
archive_data.metadata_fetcher_add([metadata.fetcher]) | |||||
archive_data.raw_extrinsic_metadata_add([metadata]) | |||||
authority = metadata.authority | |||||
url = reverse( | |||||
"api-1-raw-extrinsic-metadata-swhid", | |||||
url_args={"target": str(metadata.target)}, | |||||
query_params={"authority": f"{authority.type.value} {authority.url}"}, | |||||
) | |||||
rv = check_api_get_responses(api_client, url, status_code=200) | |||||
assert len(rv.data) == 1 | |||||
metadata_url = rv.data[0]["metadata_url"] | |||||
rv = check_http_get_response(api_client, metadata_url, status_code=200) | |||||
assert rv["Content-Type"] == "application/octet-stream" | |||||
assert ( | |||||
rv["Content-Disposition"] | |||||
== 'attachment; filename="http_example_com_repo_git_metadata"' | |||||
) | |||||
assert rv.content == metadata.metadata | |||||
@pytest.mark.parametrize("limit", [1, 2, 10, 100]) | @pytest.mark.parametrize("limit", [1, 2, 10, 100]) | ||||
@given(sets(raw_extrinsic_metadata(target=core_swhids()), min_size=1)) | @given(sets(raw_extrinsic_metadata(), min_size=1)) | ||||
def test_api_raw_extrinsic_metadata_scroll(api_client, subtest, limit, meta): | def test_api_raw_extrinsic_metadata_scroll(api_client, subtest, limit, meta): | ||||
# ensure archive_data fixture will be reset between each hypothesis | # ensure archive_data fixture will be reset between each hypothesis | ||||
# example test run | # example test run | ||||
@subtest | @subtest | ||||
def test_inner(archive_data): | def test_inner(archive_data): | ||||
# Make all metadata objects use the same authority and target | # Make all metadata objects use the same authority and target | ||||
metadata0 = next(iter(meta)) | metadata0 = next(iter(meta)) | ||||
metadata = { | metadata = { | ||||
Show All 22 Lines | def test_inner(archive_data): | ||||
expected_results = [m.to_dict() for m in metadata] | expected_results = [m.to_dict() for m in metadata] | ||||
for expected_result in expected_results: | for expected_result in expected_results: | ||||
del expected_result["id"] | del expected_result["id"] | ||||
del expected_result["metadata"] | del expected_result["metadata"] | ||||
expected_result["discovery_date"] = expected_result[ | expected_result["discovery_date"] = expected_result[ | ||||
"discovery_date" | "discovery_date" | ||||
].isoformat() | ].isoformat() | ||||
if expected_result["target"].startswith(("swh:1:ori:", "swh:1:emd:")): | |||||
# non-core SWHID are hidden from the API | |||||
del expected_result["target"] | |||||
assert len(results) == len(expected_results) | assert len(results) == len(expected_results) | ||||
for result in results: | for result in results: | ||||
del result["metadata_url"] | del result["metadata_url"] | ||||
assert result in expected_results | assert result in expected_results, str(expected_results) | ||||
_swhid = "swh:1:dir:a2faa28028657859c16ff506924212b33f0e1307" | _swhid = "swh:1:dir:a2faa28028657859c16ff506924212b33f0e1307" | ||||
@pytest.mark.parametrize( | @pytest.mark.parametrize( | ||||
"status_code,url_args,query_params", | "status_code,url_args,query_params", | ||||
[ | [ | ||||
▲ Show 20 Lines • Show All 45 Lines • ▼ Show 20 Lines | ): | ||||
url = reverse( | url = reverse( | ||||
"api-1-raw-extrinsic-metadata-swhid", | "api-1-raw-extrinsic-metadata-swhid", | ||||
url_args=url_args, | url_args=url_args, | ||||
query_params=query_params, | query_params=query_params, | ||||
) | ) | ||||
check_api_get_responses(api_client, url, status_code=status_code) | check_api_get_responses(api_client, url, status_code=status_code) | ||||
@given(raw_extrinsic_metadata(target=core_swhids())) | @given(raw_extrinsic_metadata()) | ||||
def test_api_raw_extrinsic_metadata_list_authorities(api_client, subtest, metadata): | def test_api_raw_extrinsic_metadata_list_authorities(api_client, subtest, metadata): | ||||
# ensure archive_data fixture will be reset between each hypothesis | # ensure archive_data fixture will be reset between each hypothesis | ||||
# example test run | # example test run | ||||
@subtest | @subtest | ||||
def test_inner(archive_data): | def test_inner(archive_data): | ||||
archive_data.metadata_authority_add([metadata.authority]) | archive_data.metadata_authority_add([metadata.authority]) | ||||
archive_data.metadata_fetcher_add([metadata.fetcher]) | archive_data.metadata_fetcher_add([metadata.fetcher]) | ||||
archive_data.raw_extrinsic_metadata_add([metadata]) | archive_data.raw_extrinsic_metadata_add([metadata]) | ||||
Show All 24 Lines |
any reason to restrict the number of examples ?