Changeset View
Changeset View
Standalone View
Standalone View
swh/web/tests/browse/views/test_revision.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 | ||||
# flake8: noqa | # flake8: noqa | ||||
from unittest.mock import patch | from unittest.mock import patch, MagicMock | ||||
from django.utils.html import escape | from django.utils.html import escape | ||||
from swh.web.common.exc import NotFoundExc | from swh.web.common.exc import NotFoundExc | ||||
from swh.web.common.utils import ( | from swh.web.common.utils import ( | ||||
reverse, format_utc_iso_date, get_swh_persistent_id | reverse, format_utc_iso_date, get_swh_persistent_id, | ||||
parse_timestamp | |||||
) | ) | ||||
from swh.web.tests.testcase import SWHWebTestCase | from swh.web.tests.testcase import SWHWebTestCase | ||||
from .data.revision_test_data import ( | from .data.revision_test_data import ( | ||||
revision_id_test, revision_metadata_test, | revision_id_test, revision_metadata_test, | ||||
revision_history_log_test | revision_history_log_test | ||||
) | ) | ||||
▲ Show 20 Lines • Show All 68 Lines • ▼ Show 20 Lines | def test_revision_browse(self, mock_service_common, mock_service_utils, | ||||
mock_get_origin_visit_snapshot.return_value = stub_origin_snapshot | mock_get_origin_visit_snapshot.return_value = stub_origin_snapshot | ||||
mock_service_utils.lookup_snapshot_size.return_value = { | mock_service_utils.lookup_snapshot_size.return_value = { | ||||
'revision': len(stub_origin_snapshot[0]), | 'revision': len(stub_origin_snapshot[0]), | ||||
'release': len(stub_origin_snapshot[1]) | 'release': len(stub_origin_snapshot[1]) | ||||
} | } | ||||
mock_service_common.MAX_LIMIT = 20 | mock_service_common.MAX_LIMIT = 20 | ||||
origin_directory_url = reverse('browse-origin-directory', | origin_directory_url = reverse('browse-origin-directory', | ||||
url_args={'origin_type': origin_info['type'], | url_args={'origin_url': origin_info['url']}, | ||||
'origin_url': origin_info['url']}, | |||||
query_params={'revision': revision_id_test}) | query_params={'revision': revision_id_test}) | ||||
origin_revision_log_url = reverse('browse-origin-log', | origin_revision_log_url = reverse('browse-origin-log', | ||||
url_args={'origin_type': origin_info['type'], | url_args={'origin_url': origin_info['url']}, | ||||
'origin_url': origin_info['url']}, | |||||
query_params={'revision': revision_id_test}) | query_params={'revision': revision_id_test}) | ||||
url = reverse('browse-revision', | url = reverse('browse-revision', | ||||
url_args={'sha1_git': revision_id_test}, | url_args={'sha1_git': revision_id_test}, | ||||
query_params={'origin_type': origin_info['type'], | query_params={'origin': origin_info['url']}) | ||||
'origin': origin_info['url']}) | |||||
resp = self.client.get(url) | resp = self.client.get(url) | ||||
self.assertContains(resp, origin_directory_url) | self.assertContains(resp, origin_directory_url) | ||||
self.assertContains(resp, origin_revision_log_url) | self.assertContains(resp, origin_revision_log_url) | ||||
for parent in revision_metadata_test['parents']: | for parent in revision_metadata_test['parents']: | ||||
parent_url = reverse('browse-revision', | parent_url = reverse('browse-revision', | ||||
url_args={'sha1_git': parent}, | url_args={'sha1_git': parent}, | ||||
query_params={'origin_type': origin_info['type'], | query_params={'origin': origin_info['url']}) | ||||
'origin': origin_info['url']}) | |||||
self.assertContains(resp, '<a href="%s">%s</a>' % | self.assertContains(resp, '<a href="%s">%s</a>' % | ||||
(parent_url, parent)) | (parent_url, parent)) | ||||
self.assertContains(resp, 'vault-cook-directory') | self.assertContains(resp, 'vault-cook-directory') | ||||
self.assertContains(resp, 'vault-cook-revision') | self.assertContains(resp, 'vault-cook-revision') | ||||
swh_rev_id = get_swh_persistent_id('revision', revision_id_test) | swh_rev_id = get_swh_persistent_id('revision', revision_id_test) | ||||
swh_rev_id_url = reverse('browse-swh-id', | swh_rev_id_url = reverse('browse-swh-id', | ||||
url_args={'swh_id': swh_rev_id}) | url_args={'swh_id': swh_rev_id}) | ||||
self.assertContains(resp, swh_rev_id) | self.assertContains(resp, swh_rev_id) | ||||
self.assertContains(resp, swh_rev_id_url) | self.assertContains(resp, swh_rev_id_url) | ||||
swh_dir_id = get_swh_persistent_id('directory', dir_id) | swh_dir_id = get_swh_persistent_id('directory', dir_id) | ||||
swh_dir_id_url = reverse('browse-swh-id', | swh_dir_id_url = reverse('browse-swh-id', | ||||
url_args={'swh_id': swh_dir_id}) | url_args={'swh_id': swh_dir_id}) | ||||
self.assertContains(resp, swh_dir_id) | self.assertContains(resp, swh_dir_id) | ||||
self.assertContains(resp, swh_dir_id_url) | self.assertContains(resp, swh_dir_id_url) | ||||
@patch('swh.web.browse.views.revision.service') | @patch('swh.web.browse.views.revision.service') | ||||
def test_revision_log_browse(self, mock_service): | def test_revision_log_browse(self, mock_service): | ||||
per_page = 10 | per_page = 10 | ||||
mock_service.lookup_revision_log.return_value = \ | revision_history_log_test_sorted = \ | ||||
revision_history_log_test[:per_page+1] | sorted(revision_history_log_test, | ||||
key=lambda rev: -parse_timestamp(rev['committer_date']).timestamp()) | |||||
mock_revs_walker = MagicMock() | |||||
mock_revs_walker.__iter__.return_value = revision_history_log_test_sorted | |||||
mock_revs_walker.export_state.return_value = {} | |||||
mock_service.get_revisions_walker.return_value = mock_revs_walker | |||||
url = reverse('browse-revision-log', | url = reverse('browse-revision-log', | ||||
url_args={'sha1_git': revision_id_test}, | url_args={'sha1_git': revision_id_test}, | ||||
query_params={'per_page': per_page}) | query_params={'per_page': per_page}) | ||||
resp = self.client.get(url) | resp = self.client.get(url) | ||||
prev_rev = revision_history_log_test[per_page]['id'] | |||||
next_page_url = reverse('browse-revision-log', | next_page_url = reverse('browse-revision-log', | ||||
url_args={'sha1_git': prev_rev}, | url_args={'sha1_git': revision_id_test}, | ||||
query_params={'revs_breadcrumb': revision_id_test, | query_params={'offset': per_page, | ||||
'per_page': per_page}) | 'per_page': per_page}) | ||||
self.assertEqual(resp.status_code, 200) | self.assertEqual(resp.status_code, 200) | ||||
self.assertTemplateUsed('browse/revision-log.html') | self.assertTemplateUsed('browse/revision-log.html') | ||||
self.assertContains(resp, '<tr class="swh-revision-log-entry">', | self.assertContains(resp, '<tr class="swh-revision-log-entry"', | ||||
count=per_page) | count=per_page) | ||||
self.assertContains(resp, '<li class="page-item disabled"><a class="page-link">Newer</a></li>') | self.assertContains(resp, '<a class="page-link">Newer</a>') | ||||
self.assertContains(resp, '<li class="page-item"><a class="page-link" href="%s">Older</a></li>' % | self.assertContains(resp, '<a class="page-link" href="%s">Older</a>' % | ||||
escape(next_page_url)) | escape(next_page_url)) | ||||
for log in revision_history_log_test[:per_page]: | for log in revision_history_log_test_sorted[:per_page]: | ||||
author_url = reverse('browse-person', | author_url = reverse('browse-person', | ||||
url_args={'person_id': log['author']['id']}) | url_args={'person_id': log['author']['id']}) | ||||
revision_url = reverse('browse-revision', | revision_url = reverse('browse-revision', | ||||
url_args={'sha1_git': log['id']}) | url_args={'sha1_git': log['id']}) | ||||
directory_url = reverse('browse-directory', | self.assertContains(resp, log['id'][:7]) | ||||
url_args={'sha1_git': log['directory']}) | self.assertContains(resp, log['author']['name']) | ||||
self.assertContains(resp, '<a href="%s">%s</a>' % | self.assertContains(resp, format_utc_iso_date(log['date'])) | ||||
(author_url, log['author']['name'])) | self.assertContains(resp, escape(log['message'])) | ||||
self.assertContains(resp, '<a href="%s">%s</a>' % | self.assertContains(resp, format_utc_iso_date(log['committer_date'])) | ||||
(revision_url, log['id'][:7])) | self.assertContains(resp, revision_url) | ||||
self.assertContains(resp, directory_url) | |||||
mock_service.lookup_revision_log.return_value = \ | |||||
revision_history_log_test[per_page:2*per_page+1] | |||||
resp = self.client.get(next_page_url) | resp = self.client.get(next_page_url) | ||||
prev_prev_rev = revision_history_log_test[2*per_page]['id'] | |||||
prev_page_url = reverse('browse-revision-log', | prev_page_url = reverse('browse-revision-log', | ||||
url_args={'sha1_git': revision_id_test}, | url_args={'sha1_git': revision_id_test}, | ||||
query_params={'per_page': per_page}) | query_params={'per_page': per_page}) | ||||
next_page_url = reverse('browse-revision-log', | next_page_url = reverse('browse-revision-log', | ||||
url_args={'sha1_git': prev_prev_rev}, | url_args={'sha1_git': revision_id_test}, | ||||
query_params={'revs_breadcrumb': revision_id_test + '/' + prev_rev, | query_params={'offset': 2 * per_page, | ||||
'per_page': per_page}) | 'per_page': per_page}) | ||||
self.assertEqual(resp.status_code, 200) | self.assertEqual(resp.status_code, 200) | ||||
self.assertTemplateUsed('browse/revision-log.html') | self.assertTemplateUsed('browse/revision-log.html') | ||||
self.assertContains(resp, '<tr class="swh-revision-log-entry">', | self.assertContains(resp, '<tr class="swh-revision-log-entry"', | ||||
count=per_page) | count=per_page) | ||||
self.assertContains(resp, '<li class="page-item"><a class="page-link" href="%s">Newer</a></li>' % | self.assertContains(resp, '<a class="page-link" href="%s">Newer</a>' % | ||||
escape(prev_page_url)) | escape(prev_page_url)) | ||||
self.assertContains(resp, '<li class="page-item"><a class="page-link" href="%s">Older</a></li>' % | self.assertContains(resp, '<a class="page-link" href="%s">Older</a>' % | ||||
escape(next_page_url)) | escape(next_page_url)) | ||||
mock_service.lookup_revision_log.return_value = \ | |||||
revision_history_log_test[2*per_page:3*per_page+1] | |||||
resp = self.client.get(next_page_url) | resp = self.client.get(next_page_url) | ||||
prev_prev_prev_rev = revision_history_log_test[3*per_page]['id'] | |||||
prev_page_url = reverse('browse-revision-log', | prev_page_url = reverse('browse-revision-log', | ||||
url_args={'sha1_git': prev_rev}, | url_args={'sha1_git': revision_id_test}, | ||||
query_params={'revs_breadcrumb': revision_id_test, | query_params={'offset': per_page, | ||||
'per_page': per_page}) | 'per_page': per_page}) | ||||
next_page_url = reverse('browse-revision-log', | next_page_url = reverse('browse-revision-log', | ||||
url_args={'sha1_git': prev_prev_prev_rev}, | url_args={'sha1_git': revision_id_test}, | ||||
query_params={'revs_breadcrumb': revision_id_test + '/' + prev_rev + '/' + prev_prev_rev, | query_params={'offset': 3 * per_page, | ||||
'per_page': per_page}) | 'per_page': per_page}) | ||||
self.assertEqual(resp.status_code, 200) | self.assertEqual(resp.status_code, 200) | ||||
self.assertTemplateUsed('browse/revision-log.html') | self.assertTemplateUsed('browse/revision-log.html') | ||||
self.assertContains(resp, '<tr class="swh-revision-log-entry">', | self.assertContains(resp, '<tr class="swh-revision-log-entry"', | ||||
count=per_page) | count=per_page) | ||||
self.assertContains(resp, '<li class="page-item"><a class="page-link" href="%s">Newer</a></li>' % | self.assertContains(resp, '<a class="page-link" href="%s">Newer</a>' % | ||||
escape(prev_page_url)) | escape(prev_page_url)) | ||||
self.assertContains(resp, '<li class="page-item"><a class="page-link" href="%s">Older</a></li>' % | self.assertContains(resp, '<a class="page-link" href="%s">Older</a>' % | ||||
escape(next_page_url)) | escape(next_page_url)) | ||||
mock_service.lookup_revision_log.return_value = \ | |||||
revision_history_log_test[3*per_page:3*per_page+per_page//2] | |||||
resp = self.client.get(next_page_url) | |||||
prev_page_url = reverse('browse-revision-log', | |||||
url_args={'sha1_git': prev_prev_rev}, | |||||
query_params={'revs_breadcrumb': revision_id_test + '/' + prev_rev, | |||||
'per_page': per_page}) | |||||
self.assertEqual(resp.status_code, 200) | |||||
self.assertTemplateUsed('browse/revision-log.html') | |||||
self.assertContains(resp, '<tr class="swh-revision-log-entry">', | |||||
count=per_page//2) | |||||
self.assertContains(resp, '<li class="page-item disabled"><a class="page-link">Older</a></li>') | |||||
self.assertContains(resp, '<li class="page-item"><a class="page-link" href="%s">Newer</a></li>' % | |||||
escape(prev_page_url)) | |||||
@patch('swh.web.browse.utils.service') | @patch('swh.web.browse.utils.service') | ||||
@patch('swh.web.browse.views.revision.service') | @patch('swh.web.browse.views.revision.service') | ||||
def test_revision_request_errors(self, mock_service, mock_utils_service): | def test_revision_request_errors(self, mock_service, mock_utils_service): | ||||
mock_service.lookup_revision.side_effect = \ | mock_service.lookup_revision.side_effect = \ | ||||
NotFoundExc('Revision not found') | NotFoundExc('Revision not found') | ||||
url = reverse('browse-revision', | url = reverse('browse-revision', | ||||
url_args={'sha1_git': revision_id_test}) | url_args={'sha1_git': revision_id_test}) | ||||
resp = self.client.get(url) | resp = self.client.get(url) | ||||
self.assertEqual(resp.status_code, 404) | self.assertEqual(resp.status_code, 404) | ||||
self.assertTemplateUsed('error.html') | self.assertTemplateUsed('error.html') | ||||
self.assertContains(resp, 'Revision not found', status_code=404) | self.assertContains(resp, 'Revision not found', status_code=404) | ||||
mock_service.lookup_revision_log.side_effect = \ | mock_service.get_revisions_walker.side_effect = \ | ||||
NotFoundExc('Revision not found') | NotFoundExc('Revision not found') | ||||
url = reverse('browse-revision-log', | url = reverse('browse-revision-log', | ||||
url_args={'sha1_git': revision_id_test}) | url_args={'sha1_git': revision_id_test}) | ||||
resp = self.client.get(url) | resp = self.client.get(url) | ||||
self.assertEqual(resp.status_code, 404) | self.assertEqual(resp.status_code, 404) | ||||
self.assertTemplateUsed('error.html') | self.assertTemplateUsed('error.html') | ||||
self.assertContains(resp, 'Revision not found', status_code=404) | self.assertContains(resp, 'Revision not found', status_code=404) | ||||
Show All 13 Lines |