Changeset View
Changeset View
Standalone View
Standalone View
swh/web/tests/browse/views/test_content.py
Show All 15 Lines | from swh.web.browse.utils import ( | ||||
get_mimetype_and_encoding_for_content, | get_mimetype_and_encoding_for_content, | ||||
prepare_content_for_display, | prepare_content_for_display, | ||||
) | ) | ||||
from swh.web.common.exc import NotFoundExc | from swh.web.common.exc import NotFoundExc | ||||
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_not_contains | from swh.web.tests.django_asserts import assert_contains, assert_not_contains | ||||
from swh.web.tests.strategies import ( | from swh.web.tests.strategies import ( | ||||
content, | |||||
content_application_no_highlight, | |||||
content_image_type, | |||||
content_text, | |||||
content_text_no_highlight, | |||||
content_text_non_utf8, | |||||
content_unsupported_image_type_rendering, | |||||
content_utf8_detected_as_binary, | |||||
invalid_sha1, | invalid_sha1, | ||||
origin_with_multiple_visits, | origin_with_multiple_visits, | ||||
unknown_content, | unknown_content, | ||||
) | ) | ||||
from swh.web.tests.utils import check_html_get_response, check_http_get_response | from swh.web.tests.utils import check_html_get_response, check_http_get_response | ||||
@given(content_text()) | def test_content_view_text(client, archive_data, content_text): | ||||
def test_content_view_text(client, archive_data, content): | sha1_git = content_text["sha1_git"] | ||||
sha1_git = content["sha1_git"] | |||||
url = reverse( | url = reverse( | ||||
"browse-content", | "browse-content", | ||||
url_args={"query_string": content["sha1"]}, | url_args={"query_string": content_text["sha1"]}, | ||||
query_params={"path": content["path"]}, | query_params={"path": content_text["path"]}, | ||||
) | ) | ||||
url_raw = reverse("browse-content-raw", url_args={"query_string": content["sha1"]}) | url_raw = reverse( | ||||
"browse-content-raw", url_args={"query_string": content_text["sha1"]} | |||||
) | |||||
resp = check_html_get_response( | resp = check_html_get_response( | ||||
client, url, status_code=200, template_used="browse/content.html" | client, url, status_code=200, template_used="browse/content.html" | ||||
) | ) | ||||
content_display = _process_content_for_display(archive_data, content) | content_display = _process_content_for_display(archive_data, content_text) | ||||
mimetype = content_display["mimetype"] | mimetype = content_display["mimetype"] | ||||
if mimetype.startswith("text/"): | if mimetype.startswith("text/"): | ||||
assert_contains(resp, '<code class="%s">' % content_display["language"]) | assert_contains(resp, '<code class="%s">' % content_display["language"]) | ||||
assert_contains(resp, escape(content_display["content_data"])) | assert_contains(resp, escape(content_display["content_data"])) | ||||
assert_contains(resp, url_raw) | assert_contains(resp, url_raw) | ||||
swh_cnt_id = gen_swhid(ObjectType.CONTENT, sha1_git) | swh_cnt_id = gen_swhid(ObjectType.CONTENT, sha1_git) | ||||
swh_cnt_id_url = reverse("browse-swhid", url_args={"swhid": swh_cnt_id}) | swh_cnt_id_url = reverse("browse-swhid", url_args={"swhid": swh_cnt_id}) | ||||
assert_contains(resp, swh_cnt_id) | assert_contains(resp, swh_cnt_id) | ||||
assert_contains(resp, swh_cnt_id_url) | assert_contains(resp, swh_cnt_id_url) | ||||
assert_not_contains(resp, "swh-metadata-popover") | assert_not_contains(resp, "swh-metadata-popover") | ||||
@given(content_application_no_highlight(), content_text_no_highlight()) | def test_content_view_no_highlight( | ||||
def test_content_view_no_highlight(client, archive_data, content_app, content_text): | client, archive_data, content_application_no_highlight, content_text_no_highlight | ||||
for content_ in (content_app, content_text): | ): | ||||
for content_ in (content_application_no_highlight, content_text_no_highlight): | |||||
content = content_ | content = content_ | ||||
sha1_git = content["sha1_git"] | sha1_git = content["sha1_git"] | ||||
url = reverse("browse-content", url_args={"query_string": content["sha1"]}) | url = reverse("browse-content", url_args={"query_string": content["sha1"]}) | ||||
url_raw = reverse( | url_raw = reverse( | ||||
"browse-content-raw", url_args={"query_string": content["sha1"]} | "browse-content-raw", url_args={"query_string": content["sha1"]} | ||||
) | ) | ||||
Show All 10 Lines | for content_ in (content_application_no_highlight, content_text_no_highlight): | ||||
swh_cnt_id = gen_swhid(ObjectType.CONTENT, sha1_git) | swh_cnt_id = gen_swhid(ObjectType.CONTENT, sha1_git) | ||||
swh_cnt_id_url = reverse("browse-swhid", url_args={"swhid": swh_cnt_id}) | swh_cnt_id_url = reverse("browse-swhid", url_args={"swhid": swh_cnt_id}) | ||||
assert_contains(resp, swh_cnt_id) | assert_contains(resp, swh_cnt_id) | ||||
assert_contains(resp, swh_cnt_id_url) | assert_contains(resp, swh_cnt_id_url) | ||||
@given(content_text_non_utf8()) | def test_content_view_no_utf8_text(client, archive_data, content_text_non_utf8): | ||||
def test_content_view_no_utf8_text(client, archive_data, content): | sha1_git = content_text_non_utf8["sha1_git"] | ||||
sha1_git = content["sha1_git"] | |||||
url = reverse("browse-content", url_args={"query_string": content["sha1"]}) | url = reverse( | ||||
"browse-content", url_args={"query_string": content_text_non_utf8["sha1"]} | |||||
) | |||||
resp = check_html_get_response( | resp = check_html_get_response( | ||||
client, url, status_code=200, template_used="browse/content.html" | client, url, status_code=200, template_used="browse/content.html" | ||||
) | ) | ||||
content_display = _process_content_for_display(archive_data, content) | content_display = _process_content_for_display(archive_data, content_text_non_utf8) | ||||
swh_cnt_id = gen_swhid(ObjectType.CONTENT, sha1_git) | swh_cnt_id = gen_swhid(ObjectType.CONTENT, sha1_git) | ||||
swh_cnt_id_url = reverse("browse-swhid", url_args={"swhid": swh_cnt_id}) | swh_cnt_id_url = reverse("browse-swhid", url_args={"swhid": swh_cnt_id}) | ||||
assert_contains(resp, swh_cnt_id_url) | assert_contains(resp, swh_cnt_id_url) | ||||
assert_contains(resp, escape(content_display["content_data"])) | assert_contains(resp, escape(content_display["content_data"])) | ||||
@given(content_image_type()) | def test_content_view_image(client, archive_data, content_image_type): | ||||
def test_content_view_image(client, archive_data, content): | url = reverse( | ||||
url = reverse("browse-content", url_args={"query_string": content["sha1"]}) | "browse-content", url_args={"query_string": content_image_type["sha1"]} | ||||
) | |||||
url_raw = reverse("browse-content-raw", url_args={"query_string": content["sha1"]}) | url_raw = reverse( | ||||
"browse-content-raw", url_args={"query_string": content_image_type["sha1"]} | |||||
) | |||||
resp = check_html_get_response( | resp = check_html_get_response( | ||||
client, url, status_code=200, template_used="browse/content.html" | client, url, status_code=200, template_used="browse/content.html" | ||||
) | ) | ||||
content_display = _process_content_for_display(archive_data, content) | content_display = _process_content_for_display(archive_data, content_image_type) | ||||
mimetype = content_display["mimetype"] | mimetype = content_display["mimetype"] | ||||
content_data = content_display["content_data"] | content_data = content_display["content_data"] | ||||
assert_contains(resp, '<img src="data:%s;base64,%s"/>' % (mimetype, content_data)) | assert_contains(resp, '<img src="data:%s;base64,%s"/>' % (mimetype, content_data)) | ||||
assert_contains(resp, url_raw) | assert_contains(resp, url_raw) | ||||
@given(content_unsupported_image_type_rendering()) | def test_content_view_image_no_rendering( | ||||
def test_content_view_image_no_rendering(client, archive_data, content): | client, archive_data, content_unsupported_image_type_rendering | ||||
url = reverse("browse-content", url_args={"query_string": content["sha1"]}) | ): | ||||
url = reverse( | |||||
"browse-content", | |||||
url_args={"query_string": content_unsupported_image_type_rendering["sha1"]}, | |||||
) | |||||
resp = check_html_get_response( | resp = check_html_get_response( | ||||
client, url, status_code=200, template_used="browse/content.html" | client, url, status_code=200, template_used="browse/content.html" | ||||
) | ) | ||||
mimetype = content["mimetype"] | mimetype = content_unsupported_image_type_rendering["mimetype"] | ||||
encoding = content["encoding"] | encoding = content_unsupported_image_type_rendering["encoding"] | ||||
assert_contains( | assert_contains( | ||||
resp, | resp, | ||||
( | ( | ||||
f"Content with mime type {mimetype} and encoding {encoding} " | f"Content with mime type {mimetype} and encoding {encoding} " | ||||
"cannot be displayed." | "cannot be displayed." | ||||
), | ), | ||||
) | ) | ||||
@given(content_text()) | def test_content_view_text_with_path(client, archive_data, content_text): | ||||
def test_content_view_text_with_path(client, archive_data, content): | path = content_text["path"] | ||||
path = content["path"] | |||||
url = reverse( | url = reverse( | ||||
"browse-content", | "browse-content", | ||||
url_args={"query_string": content["sha1"]}, | url_args={"query_string": content_text["sha1"]}, | ||||
query_params={"path": path}, | query_params={"path": path}, | ||||
) | ) | ||||
resp = check_html_get_response( | resp = check_html_get_response( | ||||
client, url, status_code=200, template_used="browse/content.html" | client, url, status_code=200, template_used="browse/content.html" | ||||
) | ) | ||||
assert_contains(resp, '<nav class="bread-crumbs') | assert_contains(resp, '<nav class="bread-crumbs') | ||||
content_display = _process_content_for_display(archive_data, content) | content_display = _process_content_for_display(archive_data, content_text) | ||||
mimetype = content_display["mimetype"] | mimetype = content_display["mimetype"] | ||||
if mimetype.startswith("text/"): | if mimetype.startswith("text/"): | ||||
hljs_language = content["hljs_language"] | hljs_language = content_text["hljs_language"] | ||||
assert_contains(resp, '<code class="%s">' % hljs_language) | assert_contains(resp, '<code class="%s">' % hljs_language) | ||||
assert_contains(resp, escape(content_display["content_data"])) | assert_contains(resp, escape(content_display["content_data"])) | ||||
split_path = path.split("/") | split_path = path.split("/") | ||||
root_dir_sha1 = split_path[0] | root_dir_sha1 = split_path[0] | ||||
filename = split_path[-1] | filename = split_path[-1] | ||||
path = path.replace(root_dir_sha1 + "/", "").replace(filename, "") | path = path.replace(root_dir_sha1 + "/", "").replace(filename, "") | ||||
swhid_context = { | swhid_context = { | ||||
"anchor": gen_swhid(ObjectType.DIRECTORY, root_dir_sha1), | "anchor": gen_swhid(ObjectType.DIRECTORY, root_dir_sha1), | ||||
"path": f"/{path}{filename}", | "path": f"/{path}{filename}", | ||||
} | } | ||||
swh_cnt_id = gen_swhid( | swh_cnt_id = gen_swhid( | ||||
ObjectType.CONTENT, content["sha1_git"], metadata=swhid_context | ObjectType.CONTENT, content_text["sha1_git"], metadata=swhid_context | ||||
) | ) | ||||
swh_cnt_id_url = reverse("browse-swhid", url_args={"swhid": swh_cnt_id}) | swh_cnt_id_url = reverse("browse-swhid", url_args={"swhid": swh_cnt_id}) | ||||
assert_contains(resp, swh_cnt_id) | assert_contains(resp, swh_cnt_id) | ||||
assert_contains(resp, swh_cnt_id_url) | assert_contains(resp, swh_cnt_id_url) | ||||
path_info = gen_path_info(path) | path_info = gen_path_info(path) | ||||
root_dir_url = reverse("browse-directory", url_args={"sha1_git": root_dir_sha1}) | root_dir_url = reverse("browse-directory", url_args={"sha1_git": root_dir_sha1}) | ||||
Show All 11 Lines | for p in path_info: | ||||
query_params={"path": p["path"]}, | query_params={"path": p["path"]}, | ||||
) | ) | ||||
assert_contains(resp, '<a href="' + dir_url + '">' + p["name"] + "</a>") | assert_contains(resp, '<a href="' + dir_url + '">' + p["name"] + "</a>") | ||||
assert_contains(resp, "<li>" + filename + "</li>") | assert_contains(resp, "<li>" + filename + "</li>") | ||||
url_raw = reverse( | url_raw = reverse( | ||||
"browse-content-raw", | "browse-content-raw", | ||||
url_args={"query_string": content["sha1"]}, | url_args={"query_string": content_text["sha1"]}, | ||||
query_params={"filename": filename}, | query_params={"filename": filename}, | ||||
) | ) | ||||
assert_contains(resp, url_raw) | assert_contains(resp, url_raw) | ||||
url = reverse( | url = reverse( | ||||
"browse-content", | "browse-content", | ||||
url_args={"query_string": content["sha1"]}, | url_args={"query_string": content_text["sha1"]}, | ||||
query_params={"path": filename}, | query_params={"path": filename}, | ||||
) | ) | ||||
resp = check_html_get_response( | resp = check_html_get_response( | ||||
client, url, status_code=200, template_used="browse/content.html" | client, url, status_code=200, template_used="browse/content.html" | ||||
) | ) | ||||
assert_not_contains(resp, '<nav class="bread-crumbs') | assert_not_contains(resp, '<nav class="bread-crumbs') | ||||
invalid_path = "%s/foo/bar/baz" % root_dir_sha1 | invalid_path = "%s/foo/bar/baz" % root_dir_sha1 | ||||
url = reverse( | url = reverse( | ||||
"browse-content", | "browse-content", | ||||
url_args={"query_string": content["sha1"]}, | url_args={"query_string": content_text["sha1"]}, | ||||
query_params={"path": invalid_path}, | query_params={"path": invalid_path}, | ||||
) | ) | ||||
resp = check_html_get_response( | resp = check_html_get_response( | ||||
client, url, status_code=404, template_used="error.html" | client, url, status_code=404, template_used="error.html" | ||||
) | ) | ||||
@given(content_text()) | def test_content_raw_text(client, archive_data, content_text): | ||||
def test_content_raw_text(client, archive_data, content): | url = reverse("browse-content-raw", url_args={"query_string": content_text["sha1"]}) | ||||
url = reverse("browse-content-raw", url_args={"query_string": content["sha1"]}) | |||||
resp = check_http_get_response( | resp = check_http_get_response( | ||||
client, url, status_code=200, content_type="text/plain" | client, url, status_code=200, content_type="text/plain" | ||||
) | ) | ||||
content_data = archive_data.content_get_data(content["sha1"])["data"] | content_data = archive_data.content_get_data(content_text["sha1"])["data"] | ||||
assert resp["Content-Type"] == "text/plain" | assert resp["Content-Type"] == "text/plain" | ||||
assert resp["Content-disposition"] == ("filename=%s_%s" % ("sha1", content["sha1"])) | assert resp["Content-disposition"] == ( | ||||
"filename=%s_%s" % ("sha1", content_text["sha1"]) | |||||
) | |||||
assert resp.content == content_data | assert resp.content == content_data | ||||
filename = content["path"].split("/")[-1] | filename = content_text["path"].split("/")[-1] | ||||
url = reverse( | url = reverse( | ||||
"browse-content-raw", | "browse-content-raw", | ||||
url_args={"query_string": content["sha1"]}, | url_args={"query_string": content_text["sha1"]}, | ||||
query_params={"filename": filename}, | query_params={"filename": filename}, | ||||
) | ) | ||||
resp = check_http_get_response( | resp = check_http_get_response( | ||||
client, url, status_code=200, content_type="text/plain" | client, url, status_code=200, content_type="text/plain" | ||||
) | ) | ||||
assert resp["Content-Type"] == "text/plain" | assert resp["Content-Type"] == "text/plain" | ||||
assert resp["Content-disposition"] == "filename=%s" % filename | assert resp["Content-disposition"] == "filename=%s" % filename | ||||
assert resp.content == content_data | assert resp.content == content_data | ||||
@given(content_text_non_utf8()) | def test_content_raw_no_utf8_text(client, content_text_non_utf8): | ||||
def test_content_raw_no_utf8_text(client, content): | url = reverse( | ||||
url = reverse("browse-content-raw", url_args={"query_string": content["sha1"]}) | "browse-content-raw", url_args={"query_string": content_text_non_utf8["sha1"]} | ||||
) | |||||
resp = check_http_get_response( | resp = check_http_get_response( | ||||
client, url, status_code=200, content_type="text/plain" | client, url, status_code=200, content_type="text/plain" | ||||
) | ) | ||||
_, encoding = get_mimetype_and_encoding_for_content(resp.content) | _, encoding = get_mimetype_and_encoding_for_content(resp.content) | ||||
assert encoding == content["encoding"] | assert encoding == content_text_non_utf8["encoding"] | ||||
@given(content_image_type()) | def test_content_raw_bin(client, archive_data, content_image_type): | ||||
def test_content_raw_bin(client, archive_data, content): | url = reverse( | ||||
url = reverse("browse-content-raw", url_args={"query_string": content["sha1"]}) | "browse-content-raw", url_args={"query_string": content_image_type["sha1"]} | ||||
) | |||||
resp = check_http_get_response( | resp = check_http_get_response( | ||||
client, url, status_code=200, content_type="application/octet-stream" | client, url, status_code=200, content_type="application/octet-stream" | ||||
) | ) | ||||
filename = content["path"].split("/")[-1] | filename = content_image_type["path"].split("/")[-1] | ||||
content_data = archive_data.content_get_data(content["sha1"])["data"] | content_data = archive_data.content_get_data(content_image_type["sha1"])["data"] | ||||
assert resp["Content-Type"] == "application/octet-stream" | assert resp["Content-Type"] == "application/octet-stream" | ||||
assert resp["Content-disposition"] == "attachment; filename=%s_%s" % ( | assert resp["Content-disposition"] == "attachment; filename=%s_%s" % ( | ||||
"sha1", | "sha1", | ||||
content["sha1"], | content_image_type["sha1"], | ||||
) | ) | ||||
assert resp.content == content_data | assert resp.content == content_data | ||||
url = reverse( | url = reverse( | ||||
"browse-content-raw", | "browse-content-raw", | ||||
url_args={"query_string": content["sha1"]}, | url_args={"query_string": content_image_type["sha1"]}, | ||||
query_params={"filename": filename}, | query_params={"filename": filename}, | ||||
) | ) | ||||
resp = check_http_get_response( | resp = check_http_get_response( | ||||
client, url, status_code=200, content_type="application/octet-stream" | client, url, status_code=200, content_type="application/octet-stream" | ||||
) | ) | ||||
assert resp["Content-Type"] == "application/octet-stream" | assert resp["Content-Type"] == "application/octet-stream" | ||||
assert resp["Content-disposition"] == "attachment; filename=%s" % filename | assert resp["Content-disposition"] == "attachment; filename=%s" % filename | ||||
assert resp.content == content_data | assert resp.content == content_data | ||||
@given(invalid_sha1(), unknown_content()) | @given(invalid_sha1(), unknown_content()) | ||||
def test_content_request_errors(client, invalid_sha1, unknown_content): | def test_content_request_errors(client, invalid_sha1, unknown_content): | ||||
url = reverse("browse-content", url_args={"query_string": invalid_sha1}) | url = reverse("browse-content", url_args={"query_string": invalid_sha1}) | ||||
check_html_get_response(client, url, status_code=400, template_used="error.html") | check_html_get_response(client, url, status_code=400, template_used="error.html") | ||||
url = reverse("browse-content", url_args={"query_string": unknown_content["sha1"]}) | url = reverse("browse-content", url_args={"query_string": unknown_content["sha1"]}) | ||||
check_html_get_response( | check_html_get_response( | ||||
client, url, status_code=404, template_used="browse/content.html" | client, url, status_code=404, template_used="browse/content.html" | ||||
) | ) | ||||
@given(content()) | |||||
def test_content_bytes_missing(client, archive_data, mocker, content): | def test_content_bytes_missing(client, archive_data, mocker, content): | ||||
mock_archive = mocker.patch("swh.web.browse.utils.archive") | mock_archive = mocker.patch("swh.web.browse.utils.archive") | ||||
content_data = archive_data.content_get(content["sha1"]) | content_data = archive_data.content_get(content["sha1"]) | ||||
mock_archive.lookup_content.return_value = content_data | mock_archive.lookup_content.return_value = content_data | ||||
mock_archive.lookup_content_filetype.side_effect = Exception() | mock_archive.lookup_content_filetype.side_effect = Exception() | ||||
mock_archive.lookup_content_raw.side_effect = NotFoundExc( | mock_archive.lookup_content_raw.side_effect = NotFoundExc( | ||||
"Content bytes not available!" | "Content bytes not available!" | ||||
▲ Show 20 Lines • Show All 41 Lines • ▼ Show 20 Lines | def test_content_too_large(client, mocker): | ||||
resp = check_html_get_response( | resp = check_html_get_response( | ||||
client, url, status_code=200, template_used="browse/content.html" | client, url, status_code=200, template_used="browse/content.html" | ||||
) | ) | ||||
assert_contains(resp, "Content is too large to be displayed") | assert_contains(resp, "Content is too large to be displayed") | ||||
assert_contains(resp, url_raw) | assert_contains(resp, url_raw) | ||||
@given(content()) | |||||
def test_content_uppercase(client, content): | def test_content_uppercase(client, content): | ||||
url = reverse( | url = reverse( | ||||
"browse-content-uppercase-checksum", | "browse-content-uppercase-checksum", | ||||
url_args={"query_string": content["sha1"].upper()}, | url_args={"query_string": content["sha1"].upper()}, | ||||
) | ) | ||||
resp = check_html_get_response(client, url, status_code=302) | resp = check_html_get_response(client, url, status_code=302) | ||||
redirect_url = reverse("browse-content", url_args={"query_string": content["sha1"]}) | redirect_url = reverse("browse-content", url_args={"query_string": content["sha1"]}) | ||||
assert resp["location"] == redirect_url | assert resp["location"] == redirect_url | ||||
@given(content_utf8_detected_as_binary()) | def test_content_utf8_detected_as_binary_display( | ||||
def test_content_utf8_detected_as_binary_display(client, archive_data, content): | client, archive_data, content_utf8_detected_as_binary | ||||
url = reverse("browse-content", url_args={"query_string": content["sha1"]}) | ): | ||||
url = reverse( | |||||
"browse-content", | |||||
url_args={"query_string": content_utf8_detected_as_binary["sha1"]}, | |||||
) | |||||
resp = check_html_get_response( | resp = check_html_get_response( | ||||
client, url, status_code=200, template_used="browse/content.html" | client, url, status_code=200, template_used="browse/content.html" | ||||
) | ) | ||||
content_display = _process_content_for_display(archive_data, content) | content_display = _process_content_for_display( | ||||
archive_data, content_utf8_detected_as_binary | |||||
) | |||||
assert_contains(resp, escape(content_display["content_data"])) | assert_contains(resp, escape(content_display["content_data"])) | ||||
@given(origin_with_multiple_visits()) | @given(origin_with_multiple_visits()) | ||||
def test_content_origin_snapshot_branch_browse(client, archive_data, origin): | def test_content_origin_snapshot_branch_browse(client, archive_data, origin): | ||||
visits = archive_data.origin_visit_get(origin["url"]) | visits = archive_data.origin_visit_get(origin["url"]) | ||||
visit = random.choice(visits) | visit = random.choice(visits) | ||||
▲ Show 20 Lines • Show All 199 Lines • Show Last 20 Lines |