diff --git a/swh/web/browse/snapshot_context.py b/swh/web/browse/snapshot_context.py --- a/swh/web/browse/snapshot_context.py +++ b/swh/web/browse/snapshot_context.py @@ -791,6 +791,7 @@ swh_objects = [] vault_cooking = {} revision_found = True + if sha1_git is None and revision_id is not None: try: archive.lookup_revision(revision_id) @@ -804,7 +805,7 @@ vault_cooking.update( {"directory_context": True, "directory_swhid": f"swh:1:dir:{sha1_git}",} ) - if revision_found: + if revision_id is not None and revision_found: swh_objects.append( SWHObjectInfo(object_type=ObjectType.REVISION, object_id=revision_id) ) @@ -983,14 +984,25 @@ content_checksums = content_data.get("checksums", {}) - swh_objects = [ - SWHObjectInfo( - object_type=ObjectType.CONTENT, object_id=content_checksums.get("sha1_git") - ), - SWHObjectInfo(object_type=ObjectType.DIRECTORY, object_id=directory_id), - SWHObjectInfo(object_type=ObjectType.REVISION, object_id=revision_id), - SWHObjectInfo(object_type=ObjectType.SNAPSHOT, object_id=snapshot_id), - ] + sha1_git = content_checksums.get("sha1_git") + + swh_objects = [] + + if sha1_git is not None: + swh_objects.append( + SWHObjectInfo(object_type=ObjectType.CONTENT, object_id=sha1_git) + ) + if directory_id is not None: + swh_objects.append( + SWHObjectInfo(object_type=ObjectType.DIRECTORY, object_id=directory_id) + ) + if revision_id is not None: + swh_objects.append( + SWHObjectInfo(object_type=ObjectType.REVISION, object_id=revision_id) + ) + swh_objects.append( + SWHObjectInfo(object_type=ObjectType.SNAPSHOT, object_id=snapshot_id) + ) visit_date = None visit_type = None diff --git a/swh/web/tests/browse/views/test_origin.py b/swh/web/tests/browse/views/test_origin.py --- a/swh/web/tests/browse/views/test_origin.py +++ b/swh/web/tests/browse/views/test_origin.py @@ -8,6 +8,7 @@ import string from hypothesis import given +import pytest from django.utils.html import escape @@ -617,32 +618,44 @@ assert mock_get_origin_visits.called -@given(origin()) -def test_browse_origin_content_directory_empty_snapshot(client, mocker, origin): - mock_snapshot_archive = mocker.patch("swh.web.browse.snapshot_context.archive") - mock_get_origin_visit_snapshot = mocker.patch( - "swh.web.browse.snapshot_context.get_origin_visit_snapshot" - ) - mock_get_origin_visit_snapshot.return_value = ([], [], {}) - mock_snapshot_archive.lookup_origin.return_value = origin - mock_snapshot_archive.lookup_snapshot_sizes.return_value = { - "alias": 0, - "revision": 0, - "release": 0, - } +def _add_empty_snapshot_origin(new_origin, archive_data): + snapshot = Snapshot(branches={}) + archive_data.origin_add([new_origin]) + archive_data.snapshot_add([snapshot]) + visit = archive_data.origin_visit_add( + [OriginVisit(origin=new_origin.url, date=now(), type="git",)] + )[0] + visit_status = OriginVisitStatus( + origin=new_origin.url, + visit=visit.visit, + date=now(), + status="full", + snapshot=snapshot.id, + ) + archive_data.origin_visit_status_add([visit_status]) - for browse_context in ("content", "directory"): - url = reverse( - f"browse-origin-{browse_context}", - query_params={"origin_url": origin["url"], "path": "baz"}, - ) - resp = check_html_get_response( - client, url, status_code=200, template_used=f"browse/{browse_context}.html" - ) - assert re.search("snapshot.*is empty", resp.content.decode("utf-8")) - assert mock_get_origin_visit_snapshot.called - assert mock_snapshot_archive.lookup_origin.called +@pytest.mark.django_db +@pytest.mark.parametrize("object_type", ["content", "directory"]) +@given(new_origin()) +def test_browse_origin_content_directory_empty_snapshot( + client, staff_user, archive_data, object_type, new_origin +): + + _add_empty_snapshot_origin(new_origin, archive_data) + + # to check proper generation of raw extrinsic metadata api links + client.force_login(staff_user) + + url = reverse( + f"browse-origin-{object_type}", + query_params={"origin_url": new_origin.url, "path": "baz"}, + ) + + resp = check_html_get_response( + client, url, status_code=200, template_used=f"browse/{object_type}.html" + ) + assert re.search("snapshot.*is empty", resp.content.decode("utf-8")) @given(origin()) @@ -673,20 +686,14 @@ assert mock_get_snapshot_context.called -@given(origin()) -def test_origin_empty_snapshot(client, mocker, origin): - mock_archive = mocker.patch("swh.web.browse.snapshot_context.archive") - mock_get_origin_visit_snapshot = mocker.patch( - "swh.web.browse.snapshot_context.get_origin_visit_snapshot" - ) - mock_get_origin_visit_snapshot.return_value = ([], [], {}) - mock_archive.lookup_snapshot_sizes.return_value = { - "alias": 0, - "revision": 0, - "release": 0, - } - mock_archive.lookup_origin.return_value = origin - url = reverse("browse-origin-directory", query_params={"origin_url": origin["url"]}) +@given(new_origin()) +def test_origin_empty_snapshot(client, archive_data, new_origin): + + _add_empty_snapshot_origin(new_origin, archive_data) + + url = reverse( + "browse-origin-directory", query_params={"origin_url": new_origin.url} + ) resp = check_html_get_response( client, url, status_code=200, template_used="browse/directory.html" @@ -694,7 +701,6 @@ resp_content = resp.content.decode("utf-8") assert re.search("snapshot.*is empty", resp_content) assert not re.search("swh-tr-link", resp_content) - assert mock_get_origin_visit_snapshot.called @given(new_origin())