Changeset View
Changeset View
Standalone View
Standalone View
swh/web/tests/browse/views/test_directory.py
# Copyright (C) 2017-2020 The Software Heritage developers | # Copyright (C) 2017-2020 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 random | import random | ||||
from hypothesis import given | from hypothesis import given | ||||
from django.utils.html import escape | from django.utils.html import escape | ||||
from swh.model.from_disk import DentryPerms | |||||
from swh.model.hashutil import hash_to_bytes, hash_to_hex | |||||
from swh.model.identifiers import DIRECTORY, RELEASE, REVISION, SNAPSHOT | from swh.model.identifiers import DIRECTORY, RELEASE, REVISION, SNAPSHOT | ||||
from swh.model.model import ( | |||||
Directory, | |||||
DirectoryEntry, | |||||
Origin, | |||||
OriginVisit, | |||||
OriginVisitStatus, | |||||
Revision, | |||||
RevisionType, | |||||
Snapshot, | |||||
SnapshotBranch, | |||||
TargetType, | |||||
TimestampWithTimezone, | |||||
) | |||||
from swh.storage.utils import now | |||||
from swh.web.browse.snapshot_context import process_snapshot_branches | from swh.web.browse.snapshot_context import process_snapshot_branches | ||||
from swh.web.common.identifiers import gen_swhid | from swh.web.common.identifiers import gen_swhid | ||||
from swh.web.common.utils import gen_path_info, reverse | from swh.web.common.utils import gen_path_info, reverse | ||||
from swh.web.tests.django_asserts import assert_contains, assert_template_used | from swh.web.tests.django_asserts import assert_contains, assert_template_used | ||||
from swh.web.tests.strategies import ( | from swh.web.tests.strategies import ( | ||||
directory, | directory, | ||||
directory_with_subdirs, | directory_with_subdirs, | ||||
empty_directory, | |||||
invalid_sha1, | invalid_sha1, | ||||
new_person, | |||||
new_swh_date, | |||||
origin_with_multiple_visits, | origin_with_multiple_visits, | ||||
unknown_directory, | unknown_directory, | ||||
) | ) | ||||
@given(directory()) | @given(directory()) | ||||
def test_root_directory_view(client, archive_data, directory): | def test_root_directory_view(client, archive_data, directory): | ||||
_directory_view_checks(client, directory, archive_data.directory_ls(directory)) | _directory_view_checks(client, directory, archive_data.directory_ls(directory)) | ||||
@given(directory_with_subdirs()) | @given(directory_with_subdirs()) | ||||
def test_sub_directory_view(client, archive_data, directory): | def test_sub_directory_view(client, archive_data, directory): | ||||
dir_content = archive_data.directory_ls(directory) | dir_content = archive_data.directory_ls(directory) | ||||
subdir = random.choice([e for e in dir_content if e["type"] == "dir"]) | subdir = random.choice([e for e in dir_content if e["type"] == "dir"]) | ||||
subdir_content = archive_data.directory_ls(subdir["target"]) | subdir_content = archive_data.directory_ls(subdir["target"]) | ||||
_directory_view_checks(client, directory, subdir_content, subdir["name"]) | _directory_view_checks(client, directory, subdir_content, subdir["name"]) | ||||
@given(empty_directory(), new_person(), new_swh_date()) | |||||
def test_sub_directory_view_origin_context( | |||||
client, archive_data, empty_directory, person, date | |||||
): | |||||
origin_url = "test_sub_directory_view_origin_context" | |||||
subdir = Directory( | |||||
entries=( | |||||
DirectoryEntry( | |||||
name=b"foo", | |||||
type="dir", | |||||
target=hash_to_bytes(empty_directory), | |||||
perms=DentryPerms.directory, | |||||
), | |||||
DirectoryEntry( | |||||
name=b"bar", | |||||
type="dir", | |||||
target=hash_to_bytes(empty_directory), | |||||
perms=DentryPerms.directory, | |||||
), | |||||
) | |||||
) | |||||
parentdir = Directory( | |||||
entries=( | |||||
DirectoryEntry( | |||||
name=b"baz", type="dir", target=subdir.id, perms=DentryPerms.directory, | |||||
), | |||||
) | |||||
) | |||||
archive_data.directory_add([subdir, parentdir]) | |||||
revision = Revision( | |||||
directory=parentdir.id, | |||||
author=person, | |||||
committer=person, | |||||
message=b"commit message", | |||||
date=TimestampWithTimezone.from_datetime(date), | |||||
committer_date=TimestampWithTimezone.from_datetime(date), | |||||
synthetic=False, | |||||
type=RevisionType.GIT, | |||||
) | |||||
archive_data.revision_add([revision]) | |||||
snapshot = Snapshot( | |||||
branches={ | |||||
b"HEAD": SnapshotBranch( | |||||
target="refs/head/master".encode(), target_type=TargetType.ALIAS, | |||||
), | |||||
b"refs/head/master": SnapshotBranch( | |||||
target=revision.id, target_type=TargetType.REVISION, | |||||
), | |||||
} | |||||
) | |||||
archive_data.snapshot_add([snapshot]) | |||||
archive_data.origin_add([Origin(url=origin_url)]) | |||||
date = now() | |||||
visit = OriginVisit(origin=origin_url, date=date, type="git") | |||||
visit = archive_data.origin_visit_add([visit])[0] | |||||
visit_status = OriginVisitStatus( | |||||
origin=origin_url, | |||||
visit=visit.visit, | |||||
date=date, | |||||
status="full", | |||||
snapshot=snapshot.id, | |||||
) | |||||
archive_data.origin_visit_status_add([visit_status]) | |||||
dir_content = archive_data.directory_ls(hash_to_hex(parentdir.id)) | |||||
subdir = dir_content[0] | |||||
subdir_content = archive_data.directory_ls(subdir["target"]) | |||||
_directory_view_checks( | |||||
client, | |||||
hash_to_hex(parentdir.id), | |||||
subdir_content, | |||||
subdir["name"], | |||||
origin_url, | |||||
hash_to_hex(snapshot.id), | |||||
hash_to_hex(revision.id), | |||||
) | |||||
@given(invalid_sha1(), unknown_directory()) | @given(invalid_sha1(), unknown_directory()) | ||||
def test_directory_request_errors(client, invalid_sha1, unknown_directory): | def test_directory_request_errors(client, invalid_sha1, unknown_directory): | ||||
dir_url = reverse("browse-directory", url_args={"sha1_git": invalid_sha1}) | dir_url = reverse("browse-directory", url_args={"sha1_git": invalid_sha1}) | ||||
resp = client.get(dir_url) | resp = client.get(dir_url) | ||||
assert resp.status_code == 400 | assert resp.status_code == 400 | ||||
assert_template_used(resp, "error.html") | assert_template_used(resp, "error.html") | ||||
▲ Show 20 Lines • Show All 180 Lines • ▼ Show 20 Lines | |||||
def _directory_view_checks( | def _directory_view_checks( | ||||
client, | client, | ||||
root_directory_sha1, | root_directory_sha1, | ||||
directory_entries, | directory_entries, | ||||
path=None, | path=None, | ||||
origin_url=None, | origin_url=None, | ||||
snapshot_id=None, | snapshot_id=None, | ||||
revision_id=None, | |||||
): | ): | ||||
dirs = [e for e in directory_entries if e["type"] in ("dir", "rev")] | dirs = [e for e in directory_entries if e["type"] in ("dir", "rev")] | ||||
files = [e for e in directory_entries if e["type"] == "file"] | files = [e for e in directory_entries if e["type"] == "file"] | ||||
url_args = {"sha1_git": root_directory_sha1} | url_args = {"sha1_git": root_directory_sha1} | ||||
query_params = {"path": path, "origin_url": origin_url, "snapshot": snapshot_id} | query_params = {"origin_url": origin_url, "snapshot": snapshot_id} | ||||
url = reverse("browse-directory", url_args=url_args, query_params=query_params) | url = reverse( | ||||
"browse-directory", | |||||
url_args=url_args, | |||||
query_params={**query_params, "path": path}, | |||||
) | |||||
root_dir_url = reverse( | root_dir_url = reverse( | ||||
"browse-directory", url_args={"sha1_git": root_directory_sha1} | "browse-directory", url_args=url_args, query_params=query_params, | ||||
) | ) | ||||
resp = client.get(url) | resp = client.get(url) | ||||
assert resp.status_code == 200 | assert resp.status_code == 200 | ||||
assert_template_used(resp, "browse/directory.html") | assert_template_used(resp, "browse/directory.html") | ||||
assert_contains( | assert_contains( | ||||
resp, '<a href="' + root_dir_url + '">' + root_directory_sha1[:7] + "</a>" | resp, '<a href="' + root_dir_url + '">' + root_directory_sha1[:7] + "</a>", | ||||
) | ) | ||||
assert_contains(resp, '<td class="swh-directory">', count=len(dirs)) | assert_contains(resp, '<td class="swh-directory">', count=len(dirs)) | ||||
assert_contains(resp, '<td class="swh-content">', count=len(files)) | assert_contains(resp, '<td class="swh-content">', count=len(files)) | ||||
for d in dirs: | for d in dirs: | ||||
if d["type"] == "rev": | if d["type"] == "rev": | ||||
dir_url = reverse("browse-revision", url_args={"sha1_git": d["target"]}) | dir_url = reverse("browse-revision", url_args={"sha1_git": d["target"]}) | ||||
else: | else: | ||||
dir_path = d["name"] | dir_path = d["name"] | ||||
if path: | if path: | ||||
dir_path = "%s/%s" % (path, d["name"]) | dir_path = "%s/%s" % (path, d["name"]) | ||||
dir_url = reverse( | dir_url = reverse( | ||||
"browse-directory", | "browse-directory", | ||||
url_args={"sha1_git": root_directory_sha1}, | url_args={"sha1_git": root_directory_sha1}, | ||||
query_params={"path": dir_path}, | query_params={**query_params, "path": dir_path}, | ||||
) | ) | ||||
assert_contains(resp, dir_url) | assert_contains(resp, dir_url) | ||||
for f in files: | for f in files: | ||||
file_path = "%s/%s" % (root_directory_sha1, f["name"]) | file_path = "%s/%s" % (root_directory_sha1, f["name"]) | ||||
if path: | if path: | ||||
file_path = "%s/%s/%s" % (root_directory_sha1, path, f["name"]) | file_path = "%s/%s/%s" % (root_directory_sha1, path, f["name"]) | ||||
query_string = "sha1_git:" + f["target"] | query_string = "sha1_git:" + f["target"] | ||||
file_url = reverse( | file_url = reverse( | ||||
"browse-content", | "browse-content", | ||||
url_args={"query_string": query_string}, | url_args={"query_string": query_string}, | ||||
query_params={"path": file_path}, | query_params={**query_params, "path": file_path}, | ||||
) | ) | ||||
assert_contains(resp, file_url) | assert_contains(resp, file_url) | ||||
path_info = gen_path_info(path) | path_info = gen_path_info(path) | ||||
assert_contains(resp, '<li class="swh-path">', count=len(path_info) + 1) | assert_contains(resp, '<li class="swh-path">', count=len(path_info) + 1) | ||||
assert_contains( | assert_contains( | ||||
resp, '<a href="%s">%s</a>' % (root_dir_url, root_directory_sha1[:7]) | resp, '<a href="%s">%s</a>' % (root_dir_url, root_directory_sha1[:7]) | ||||
) | ) | ||||
for p in path_info: | for p in path_info: | ||||
dir_url = reverse( | dir_url = reverse( | ||||
"browse-directory", | "browse-directory", | ||||
url_args={"sha1_git": root_directory_sha1}, | url_args={"sha1_git": root_directory_sha1}, | ||||
query_params={"path": p["path"]}, | query_params={**query_params, "path": p["path"]}, | ||||
) | ) | ||||
assert_contains(resp, '<a href="%s">%s</a>' % (dir_url, p["name"])) | assert_contains(resp, '<a href="%s">%s</a>' % (dir_url, p["name"])) | ||||
assert_contains(resp, "vault-cook-directory") | assert_contains(resp, "vault-cook-directory") | ||||
swh_dir_id = gen_swhid(DIRECTORY, directory_entries[0]["dir_id"]) | swh_dir_id = gen_swhid(DIRECTORY, directory_entries[0]["dir_id"]) | ||||
swh_dir_id_url = reverse("browse-swhid", url_args={"swhid": swh_dir_id}) | swh_dir_id_url = reverse("browse-swhid", url_args={"swhid": swh_dir_id}) | ||||
swhid_context = {} | swhid_context = {} | ||||
if origin_url: | |||||
swhid_context["origin"] = origin_url | |||||
if snapshot_id: | |||||
swhid_context["visit"] = gen_swhid(SNAPSHOT, snapshot_id) | |||||
if root_directory_sha1 != directory_entries[0]["dir_id"]: | if root_directory_sha1 != directory_entries[0]["dir_id"]: | ||||
swhid_context["anchor"] = gen_swhid(DIRECTORY, root_directory_sha1) | swhid_context["anchor"] = gen_swhid(DIRECTORY, root_directory_sha1) | ||||
swhid_context["path"] = f"/{path}/" if path else None | |||||
if root_directory_sha1 != directory_entries[0]["dir_id"]: | if root_directory_sha1 != directory_entries[0]["dir_id"]: | ||||
swhid_context["anchor"] = gen_swhid(DIRECTORY, root_directory_sha1) | swhid_context["anchor"] = gen_swhid(DIRECTORY, root_directory_sha1) | ||||
if revision_id: | |||||
swhid_context["anchor"] = gen_swhid(REVISION, revision_id) | |||||
swhid_context["path"] = f"/{path}/" if path else None | |||||
swh_dir_id = gen_swhid( | swh_dir_id = gen_swhid( | ||||
DIRECTORY, directory_entries[0]["dir_id"], metadata=swhid_context | DIRECTORY, directory_entries[0]["dir_id"], metadata=swhid_context | ||||
) | ) | ||||
swh_dir_id_url = reverse("browse-swhid", url_args={"swhid": swh_dir_id}) | swh_dir_id_url = reverse("browse-swhid", url_args={"swhid": swh_dir_id}) | ||||
assert_contains(resp, swh_dir_id) | assert_contains(resp, swh_dir_id) | ||||
assert_contains(resp, swh_dir_id_url) | assert_contains(resp, swh_dir_id_url) |