Changeset View
Changeset View
Standalone View
Standalone View
swh/web/tests/browse/views/test_content.py
# Copyright (C) 2017-2018 The Software Heritage developers | # Copyright (C) 2017-2018 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 base64 | import base64 | ||||
from unittest.mock import patch | from unittest.mock import patch | ||||
from nose.tools import istest | |||||
from django.utils.html import escape | from django.utils.html import escape | ||||
from django.utils.encoding import DjangoUnicodeDecodeError | from django.utils.encoding import DjangoUnicodeDecodeError | ||||
from swh.web.browse.utils import get_mimetype_and_encoding_for_content | from swh.web.browse.utils import get_mimetype_and_encoding_for_content | ||||
from swh.web.common.exc import NotFoundExc | from swh.web.common.exc import NotFoundExc | ||||
from swh.web.common.utils import reverse, get_swh_persistent_id | from swh.web.common.utils import reverse, get_swh_persistent_id | ||||
from swh.web.common.utils import gen_path_info | from swh.web.common.utils import gen_path_info | ||||
Show All 10 Lines | from .data.content_test_data import ( | ||||
non_utf8_encoding, | non_utf8_encoding, | ||||
stub_content_too_large_data | stub_content_too_large_data | ||||
) | ) | ||||
class SwhBrowseContentTest(SWHWebTestCase): | class SwhBrowseContentTest(SWHWebTestCase): | ||||
@patch('swh.web.browse.views.content.request_content') | @patch('swh.web.browse.views.content.request_content') | ||||
@istest | def test_content_view_text(self, mock_request_content): | ||||
def content_view_text(self, mock_request_content): | |||||
mock_request_content.return_value = stub_content_text_data | mock_request_content.return_value = stub_content_text_data | ||||
sha1_git = stub_content_text_data['checksums']['sha1_git'] | sha1_git = stub_content_text_data['checksums']['sha1_git'] | ||||
url = reverse('browse-content', | url = reverse('browse-content', | ||||
kwargs={'query_string': stub_content_text_data['checksums']['sha1']}) # noqa | kwargs={'query_string': stub_content_text_data['checksums']['sha1']}) # noqa | ||||
url_raw = reverse('browse-content-raw', | url_raw = reverse('browse-content-raw', | ||||
Show All 10 Lines | def test_content_view_text(self, mock_request_content): | ||||
swh_cnt_id = get_swh_persistent_id('content', sha1_git) | swh_cnt_id = get_swh_persistent_id('content', sha1_git) | ||||
swh_cnt_id_url = reverse('browse-swh-id', | swh_cnt_id_url = reverse('browse-swh-id', | ||||
kwargs={'swh_id': swh_cnt_id}) | kwargs={'swh_id': swh_cnt_id}) | ||||
self.assertContains(resp, swh_cnt_id) | self.assertContains(resp, swh_cnt_id) | ||||
self.assertContains(resp, swh_cnt_id_url) | self.assertContains(resp, swh_cnt_id_url) | ||||
@patch('swh.web.browse.views.content.request_content') | @patch('swh.web.browse.views.content.request_content') | ||||
@istest | def test_content_view_text_no_highlight(self, mock_request_content): | ||||
def content_view_text_no_highlight(self, mock_request_content): | |||||
mock_request_content.return_value = stub_content_text_no_highlight_data | mock_request_content.return_value = stub_content_text_no_highlight_data | ||||
sha1_git = stub_content_text_no_highlight_data['checksums']['sha1_git'] | sha1_git = stub_content_text_no_highlight_data['checksums']['sha1_git'] | ||||
url = reverse('browse-content', | url = reverse('browse-content', | ||||
kwargs={'query_string': stub_content_text_no_highlight_data['checksums']['sha1']}) # noqa | kwargs={'query_string': stub_content_text_no_highlight_data['checksums']['sha1']}) # noqa | ||||
url_raw = reverse('browse-content-raw', | url_raw = reverse('browse-content-raw', | ||||
Show All 11 Lines | def test_content_view_text_no_highlight(self, mock_request_content): | ||||
swh_cnt_id = get_swh_persistent_id('content', sha1_git) | swh_cnt_id = get_swh_persistent_id('content', sha1_git) | ||||
swh_cnt_id_url = reverse('browse-swh-id', | swh_cnt_id_url = reverse('browse-swh-id', | ||||
kwargs={'swh_id': swh_cnt_id}) | kwargs={'swh_id': swh_cnt_id}) | ||||
self.assertContains(resp, swh_cnt_id) | self.assertContains(resp, swh_cnt_id) | ||||
self.assertContains(resp, swh_cnt_id_url) | self.assertContains(resp, swh_cnt_id_url) | ||||
@patch('swh.web.browse.utils.service') | @patch('swh.web.browse.utils.service') | ||||
@istest | def test_content_view_no_utf8_text(self, mock_service): | ||||
def content_view_no_utf8_text(self, mock_service): | |||||
mock_service.lookup_content.return_value = \ | mock_service.lookup_content.return_value = \ | ||||
non_utf8_encoded_content_data | non_utf8_encoded_content_data | ||||
mock_service.lookup_content_raw.return_value = \ | mock_service.lookup_content_raw.return_value = \ | ||||
{'data': non_utf8_encoded_content} | {'data': non_utf8_encoded_content} | ||||
mock_service.lookup_content_filetype.return_value = None | mock_service.lookup_content_filetype.return_value = None | ||||
mock_service.lookup_content_language.return_value = None | mock_service.lookup_content_language.return_value = None | ||||
Show All 12 Lines | def test_content_view_no_utf8_text(self, mock_service): | ||||
swh_cnt_id_url = reverse('browse-swh-id', | swh_cnt_id_url = reverse('browse-swh-id', | ||||
kwargs={'swh_id': swh_cnt_id}) | kwargs={'swh_id': swh_cnt_id}) | ||||
self.assertContains(resp, swh_cnt_id_url) | self.assertContains(resp, swh_cnt_id_url) | ||||
self.assertContains(resp, escape(non_utf8_encoded_content.decode(non_utf8_encoding).encode('utf-8'))) # noqa | self.assertContains(resp, escape(non_utf8_encoded_content.decode(non_utf8_encoding).encode('utf-8'))) # noqa | ||||
except DjangoUnicodeDecodeError: | except DjangoUnicodeDecodeError: | ||||
self.fail('Textual content is not encoded in utf-8') | self.fail('Textual content is not encoded in utf-8') | ||||
@patch('swh.web.browse.views.content.request_content') | @patch('swh.web.browse.views.content.request_content') | ||||
@istest | def test_content_view_image(self, mock_request_content): | ||||
def content_view_image(self, mock_request_content): | |||||
mime_type = 'image/png' | mime_type = 'image/png' | ||||
mock_request_content.return_value = stub_content_bin_data | mock_request_content.return_value = stub_content_bin_data | ||||
url = reverse('browse-content', | url = reverse('browse-content', | ||||
kwargs={'query_string': stub_content_bin_data['checksums']['sha1']}) # noqa | kwargs={'query_string': stub_content_bin_data['checksums']['sha1']}) # noqa | ||||
url_raw = reverse('browse-content-raw', | url_raw = reverse('browse-content-raw', | ||||
kwargs={'query_string': stub_content_bin_data['checksums']['sha1']}) # noqa | kwargs={'query_string': stub_content_bin_data['checksums']['sha1']}) # noqa | ||||
resp = self.client.get(url) | resp = self.client.get(url) | ||||
self.assertEquals(resp.status_code, 200) | self.assertEquals(resp.status_code, 200) | ||||
self.assertTemplateUsed('browse/content.html') | self.assertTemplateUsed('browse/content.html') | ||||
pngEncoded = base64.b64encode(stub_content_bin_data['raw_data']) \ | png_encoded = base64.b64encode(stub_content_bin_data['raw_data']) \ | ||||
.decode('utf-8') | .decode('utf-8') | ||||
self.assertContains(resp, '<img src="data:%s;base64,%s"/>' | self.assertContains(resp, '<img src="data:%s;base64,%s"/>' | ||||
% (mime_type, pngEncoded)) | % (mime_type, png_encoded)) | ||||
self.assertContains(resp, url_raw) | self.assertContains(resp, url_raw) | ||||
@patch('swh.web.browse.views.content.request_content') | @patch('swh.web.browse.views.content.request_content') | ||||
@istest | def test_content_view_with_path(self, mock_request_content): | ||||
def content_view_with_path(self, mock_request_content): | |||||
mock_request_content.return_value = stub_content_text_data | mock_request_content.return_value = stub_content_text_data | ||||
url = reverse('browse-content', | url = reverse('browse-content', | ||||
kwargs={'query_string': stub_content_text_data['checksums']['sha1']}, # noqa | kwargs={'query_string': stub_content_text_data['checksums']['sha1']}, # noqa | ||||
query_params={'path': stub_content_text_path_with_root_dir}) # noqa | query_params={'path': stub_content_text_path_with_root_dir}) # noqa | ||||
resp = self.client.get(url) | resp = self.client.get(url) | ||||
self.assertEquals(resp.status_code, 200) | self.assertEquals(resp.status_code, 200) | ||||
Show All 31 Lines | def test_content_view_with_path(self, mock_request_content): | ||||
self.assertContains(resp, '<li>' + filename + '</li>') | self.assertContains(resp, '<li>' + filename + '</li>') | ||||
url_raw = reverse('browse-content-raw', | url_raw = reverse('browse-content-raw', | ||||
kwargs={'query_string': stub_content_text_data['checksums']['sha1']}, # noqa | kwargs={'query_string': stub_content_text_data['checksums']['sha1']}, # noqa | ||||
query_params={'filename': filename}) | query_params={'filename': filename}) | ||||
self.assertContains(resp, url_raw) | self.assertContains(resp, url_raw) | ||||
@patch('swh.web.browse.views.content.request_content') | @patch('swh.web.browse.views.content.request_content') | ||||
@istest | def test_content_raw_text(self, mock_request_content): | ||||
def content_raw_text(self, mock_request_content): | |||||
mock_request_content.return_value = stub_content_text_data | mock_request_content.return_value = stub_content_text_data | ||||
url = reverse('browse-content-raw', | url = reverse('browse-content-raw', | ||||
kwargs={'query_string': stub_content_text_data['checksums']['sha1']}) # noqa | kwargs={'query_string': stub_content_text_data['checksums']['sha1']}) # noqa | ||||
resp = self.client.get(url) | resp = self.client.get(url) | ||||
self.assertEquals(resp.status_code, 200) | self.assertEquals(resp.status_code, 200) | ||||
Show All 12 Lines | def test_content_raw_text(self, mock_request_content): | ||||
self.assertEquals(resp.status_code, 200) | self.assertEquals(resp.status_code, 200) | ||||
self.assertEqual(resp['Content-Type'], 'text/plain') | self.assertEqual(resp['Content-Type'], 'text/plain') | ||||
self.assertEqual(resp['Content-disposition'], | self.assertEqual(resp['Content-disposition'], | ||||
'filename=%s' % filename) | 'filename=%s' % filename) | ||||
self.assertEqual(resp.content, stub_content_text_data['raw_data']) | self.assertEqual(resp.content, stub_content_text_data['raw_data']) | ||||
@patch('swh.web.browse.utils.service') | @patch('swh.web.browse.utils.service') | ||||
@istest | |||||
def test_content_raw_no_utf8_text(self, mock_service): | def test_content_raw_no_utf8_text(self, mock_service): | ||||
mock_service.lookup_content.return_value = \ | mock_service.lookup_content.return_value = \ | ||||
non_utf8_encoded_content_data | non_utf8_encoded_content_data | ||||
mock_service.lookup_content_raw.return_value = \ | mock_service.lookup_content_raw.return_value = \ | ||||
{'data': non_utf8_encoded_content} | {'data': non_utf8_encoded_content} | ||||
mock_service.lookup_content_filetype.return_value = None | mock_service.lookup_content_filetype.return_value = None | ||||
mock_service.lookup_content_language.return_value = None | mock_service.lookup_content_language.return_value = None | ||||
mock_service.lookup_content_license.return_value = None | mock_service.lookup_content_license.return_value = None | ||||
url = reverse('browse-content-raw', | url = reverse('browse-content-raw', | ||||
kwargs={'query_string': non_utf8_encoded_content_data['checksums']['sha1']}) # noqa | kwargs={'query_string': non_utf8_encoded_content_data['checksums']['sha1']}) # noqa | ||||
resp = self.client.get(url) | resp = self.client.get(url) | ||||
self.assertEquals(resp.status_code, 200) | self.assertEquals(resp.status_code, 200) | ||||
_, encoding = get_mimetype_and_encoding_for_content(resp.content) | _, encoding = get_mimetype_and_encoding_for_content(resp.content) | ||||
self.assertEqual(encoding, non_utf8_encoding) | self.assertEqual(encoding, non_utf8_encoding) | ||||
@patch('swh.web.browse.views.content.request_content') | @patch('swh.web.browse.views.content.request_content') | ||||
@istest | def test_content_raw_bin(self, mock_request_content): | ||||
def content_raw_bin(self, mock_request_content): | |||||
mock_request_content.return_value = stub_content_bin_data | mock_request_content.return_value = stub_content_bin_data | ||||
url = reverse('browse-content-raw', | url = reverse('browse-content-raw', | ||||
kwargs={'query_string': stub_content_bin_data['checksums']['sha1']}) # noqa | kwargs={'query_string': stub_content_bin_data['checksums']['sha1']}) # noqa | ||||
resp = self.client.get(url) | resp = self.client.get(url) | ||||
self.assertEquals(resp.status_code, 200) | self.assertEquals(resp.status_code, 200) | ||||
Show All 11 Lines | def test_content_raw_bin(self, mock_request_content): | ||||
self.assertEquals(resp.status_code, 200) | self.assertEquals(resp.status_code, 200) | ||||
self.assertEqual(resp['Content-Type'], 'application/octet-stream') | self.assertEqual(resp['Content-Type'], 'application/octet-stream') | ||||
self.assertEqual(resp['Content-disposition'], | self.assertEqual(resp['Content-disposition'], | ||||
'attachment; filename=%s' % stub_content_bin_filename) | 'attachment; filename=%s' % stub_content_bin_filename) | ||||
self.assertEqual(resp.content, stub_content_bin_data['raw_data']) | self.assertEqual(resp.content, stub_content_bin_data['raw_data']) | ||||
@patch('swh.web.browse.views.content.request_content') | @patch('swh.web.browse.views.content.request_content') | ||||
@istest | def test_content_request_errors(self, mock_request_content): | ||||
def content_request_errors(self, mock_request_content): | |||||
url = reverse('browse-content', kwargs={'query_string': '123456'}) | url = reverse('browse-content', kwargs={'query_string': '123456'}) | ||||
resp = self.client.get(url) | resp = self.client.get(url) | ||||
self.assertEquals(resp.status_code, 400) | self.assertEquals(resp.status_code, 400) | ||||
self.assertTemplateUsed('error.html') | self.assertTemplateUsed('error.html') | ||||
mock_request_content.side_effect = NotFoundExc('content not found') | mock_request_content.side_effect = NotFoundExc('content not found') | ||||
url = reverse('browse-content', | url = reverse('browse-content', | ||||
kwargs={'query_string': stub_content_text_data['checksums']['sha1']}) # noqa | kwargs={'query_string': stub_content_text_data['checksums']['sha1']}) # noqa | ||||
resp = self.client.get(url) | resp = self.client.get(url) | ||||
self.assertEquals(resp.status_code, 404) | self.assertEquals(resp.status_code, 404) | ||||
self.assertTemplateUsed('error.html') | self.assertTemplateUsed('error.html') | ||||
@patch('swh.web.browse.utils.service') | @patch('swh.web.browse.utils.service') | ||||
@istest | def test_content_bytes_missing(self, mock_service): | ||||
def content_bytes_missing(self, mock_service): | |||||
content_data = dict(stub_content_text_data) | content_data = dict(stub_content_text_data) | ||||
content_data['raw_data'] = None | content_data['raw_data'] = None | ||||
mock_service.lookup_content.return_value = content_data | mock_service.lookup_content.return_value = content_data | ||||
mock_service.lookup_content_raw.side_effect = NotFoundExc('Content bytes not available!') # noqa | mock_service.lookup_content_raw.side_effect = NotFoundExc('Content bytes not available!') # noqa | ||||
url = reverse('browse-content', | url = reverse('browse-content', | ||||
kwargs={'query_string': content_data['checksums']['sha1']}) # noqa | kwargs={'query_string': content_data['checksums']['sha1']}) # noqa | ||||
resp = self.client.get(url) | resp = self.client.get(url) | ||||
self.assertEquals(resp.status_code, 404) | self.assertEquals(resp.status_code, 404) | ||||
self.assertTemplateUsed('browse/content.html') | self.assertTemplateUsed('browse/content.html') | ||||
@patch('swh.web.browse.views.content.request_content') | @patch('swh.web.browse.views.content.request_content') | ||||
@istest | def test_content_too_large(self, mock_request_content): | ||||
def content_too_large(self, mock_request_content): | |||||
mock_request_content.return_value = stub_content_too_large_data | mock_request_content.return_value = stub_content_too_large_data | ||||
url = reverse('browse-content', | url = reverse('browse-content', | ||||
kwargs={'query_string': stub_content_too_large_data['checksums']['sha1']}) # noqa | kwargs={'query_string': stub_content_too_large_data['checksums']['sha1']}) # noqa | ||||
url_raw = reverse('browse-content-raw', | url_raw = reverse('browse-content-raw', | ||||
kwargs={'query_string': stub_content_too_large_data['checksums']['sha1']}) # noqa | kwargs={'query_string': stub_content_too_large_data['checksums']['sha1']}) # noqa | ||||
resp = self.client.get(url) | resp = self.client.get(url) | ||||
self.assertEquals(resp.status_code, 200) | self.assertEquals(resp.status_code, 200) | ||||
self.assertTemplateUsed('browse/content.html') | self.assertTemplateUsed('browse/content.html') | ||||
self.assertContains(resp, 'Content is too large to be displayed') | self.assertContains(resp, 'Content is too large to be displayed') | ||||
self.assertContains(resp, url_raw) | self.assertContains(resp, url_raw) |