Changeset View
Changeset View
Standalone View
Standalone View
swh/loader/package/cpan/tests/test_cpan.py
# Copyright (C) 2022 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 General Public License version 3, or any later version | # License: GNU 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 | ||||
# flake8: noqa: B950 | # flake8: noqa: B950 | ||||
import json | |||||
from pathlib import Path | |||||
import pytest | import pytest | ||||
from swh.loader.package import __version__ | from swh.loader.package import __version__ | ||||
from swh.loader.package.cpan.loader import CpanLoader | from swh.loader.package.cpan.loader import CpanLoader | ||||
from swh.loader.tests import assert_last_visit_matches, check_snapshot, get_stats | from swh.loader.tests import assert_last_visit_matches, check_snapshot, get_stats | ||||
from swh.model.hashutil import hash_to_bytes | from swh.model.hashutil import hash_to_bytes | ||||
from swh.model.model import ( | from swh.model.model import ( | ||||
Person, | Person, | ||||
RawExtrinsicMetadata, | |||||
Release, | Release, | ||||
Snapshot, | Snapshot, | ||||
SnapshotBranch, | SnapshotBranch, | ||||
TargetType, | TargetType, | ||||
TimestampWithTimezone, | TimestampWithTimezone, | ||||
) | ) | ||||
from swh.model.model import MetadataFetcher | |||||
from swh.model.model import ObjectType as ModelObjectType | from swh.model.model import ObjectType as ModelObjectType | ||||
from swh.model.swhids import CoreSWHID, ExtendedObjectType, ExtendedSWHID, ObjectType | |||||
ORIGIN_URL = "https://metacpan.org/dist/Internals-CountObjects" | ORIGIN_URL = "https://metacpan.org/dist/Internals-CountObjects" | ||||
API_BASE_URL = "https://fastapi.metacpan.org/v1" | API_BASE_URL = "https://fastapi.metacpan.org/v1" | ||||
ORIGIN_ARTIFACTS = [ | ORIGIN_ARTIFACTS = [ | ||||
{ | { | ||||
"url": "https://cpan.metacpan.org/authors/id/J/JJ/JJORE/Internals-CountObjects-0.05.tar.gz", | "url": "https://cpan.metacpan.org/authors/id/J/JJ/JJORE/Internals-CountObjects-0.05.tar.gz", | ||||
Show All 31 Lines | ORIGIN_MODULE_METADATA = [ | ||||
"cpan_author": "JJORE", | "cpan_author": "JJORE", | ||||
"date": "2011-06-05T18:44:02", | "date": "2011-06-05T18:44:02", | ||||
"release_name": "Internals-CountObjects-0.01", | "release_name": "Internals-CountObjects-0.01", | ||||
}, | }, | ||||
] | ] | ||||
@pytest.fixture | @pytest.fixture | ||||
def head_release_original_artifacts_metadata(): | |||||
return json.dumps( | |||||
[{k: v for k, v in ORIGIN_ARTIFACTS[0].items() if k != "version"}] | |||||
).encode() | |||||
@pytest.fixture | |||||
def head_release_extrinsic_metadata(datadir): | |||||
return Path( | |||||
datadir, | |||||
"https_fastapi.metacpan.org", | |||||
"v1_release_JJORE_Internals-CountObjects-0.05", | |||||
).read_bytes() | |||||
@pytest.fixture | |||||
def cpan_loader(requests_mock_datadir, swh_storage): | def cpan_loader(requests_mock_datadir, swh_storage): | ||||
return CpanLoader( | return CpanLoader( | ||||
swh_storage, | swh_storage, | ||||
url=ORIGIN_URL, | url=ORIGIN_URL, | ||||
api_base_url=API_BASE_URL, | api_base_url=API_BASE_URL, | ||||
artifacts=ORIGIN_ARTIFACTS, | artifacts=ORIGIN_ARTIFACTS, | ||||
module_metadata=ORIGIN_MODULE_METADATA, | module_metadata=ORIGIN_MODULE_METADATA, | ||||
) | ) | ||||
def test_get_versions(cpan_loader): | def test_get_versions(cpan_loader): | ||||
assert cpan_loader.get_versions() == ["0.01", "0.05"] | assert cpan_loader.get_versions() == ["0.01", "0.05"] | ||||
def test_get_default_version(cpan_loader): | def test_get_default_version(cpan_loader): | ||||
assert cpan_loader.get_default_version() == "0.05" | assert cpan_loader.get_default_version() == "0.05" | ||||
def test_cpan_loader_load_multiple_version(cpan_loader): | def test_cpan_loader_load_multiple_version( | ||||
cpan_loader, | |||||
head_release_original_artifacts_metadata, | |||||
head_release_extrinsic_metadata, | |||||
): | |||||
load_status = cpan_loader.load() | load_status = cpan_loader.load() | ||||
assert load_status["status"] == "eventful" | assert load_status["status"] == "eventful" | ||||
assert load_status["snapshot_id"] is not None | assert load_status["snapshot_id"] is not None | ||||
expected_snapshot_id = "848ee8d69d33481c88ab81f6794f6504190f011f" | expected_snapshot_id = "848ee8d69d33481c88ab81f6794f6504190f011f" | ||||
expected_head_release = "07382fd255ec0fc293b92aeb7e68b3fe31c174f9" | expected_head_release = "07382fd255ec0fc293b92aeb7e68b3fe31c174f9" | ||||
▲ Show 20 Lines • Show All 52 Lines • ▼ Show 20 Lines | ): | ||||
assert_last_visit_matches( | assert_last_visit_matches( | ||||
storage, | storage, | ||||
url=ORIGIN_URL, | url=ORIGIN_URL, | ||||
status="full", | status="full", | ||||
type="cpan", | type="cpan", | ||||
snapshot=expected_snapshot.id, | snapshot=expected_snapshot.id, | ||||
) | ) | ||||
release_swhid = CoreSWHID(object_type=ObjectType.RELEASE, object_id=head_release.id) | |||||
directory_swhid = ExtendedSWHID( | |||||
object_type=ExtendedObjectType.DIRECTORY, object_id=head_release.target | |||||
) | |||||
expected_metadata = [ | |||||
RawExtrinsicMetadata( | |||||
target=directory_swhid, | |||||
authority=cpan_loader.get_metadata_authority(), | |||||
fetcher=MetadataFetcher( | |||||
name="swh.loader.package.cpan.loader.CpanLoader", | |||||
version=__version__, | |||||
), | |||||
discovery_date=cpan_loader.visit_date, | |||||
format="cpan-module-json", | |||||
metadata=head_release_extrinsic_metadata, | |||||
origin=ORIGIN_URL, | |||||
release=release_swhid, | |||||
), | |||||
] | |||||
assert ( | |||||
cpan_loader.storage.raw_extrinsic_metadata_get( | |||||
directory_swhid, | |||||
cpan_loader.get_metadata_authority(), | |||||
).results | |||||
== expected_metadata | |||||
) |