diff --git a/swh/web/browse/views/utils/snapshot_context.py b/swh/web/browse/views/utils/snapshot_context.py --- a/swh/web/browse/views/utils/snapshot_context.py +++ b/swh/web/browse/views/utils/snapshot_context.py @@ -807,7 +807,7 @@ prev_branches_url = reverse(browse_view_name, url_args=url_args, query_params=query_params) - if len(displayed_branches) > PER_PAGE: + if snapshot['next_branch'] is not None: query_params_next = dict(query_params) next_branch = displayed_branches[-1]['name'] del displayed_branches[-1] @@ -906,7 +906,7 @@ prev_releases_url = reverse(browse_view_name, url_args=url_args, query_params=query_params) - if len(displayed_releases) > PER_PAGE: + if snapshot['next_branch'] is not None: query_params_next = dict(query_params) next_rel = displayed_releases[-1]['branch_name'] del displayed_releases[-1] 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 @@ -5,6 +5,7 @@ import random import re +import string import swh.web.browse.utils @@ -20,11 +21,12 @@ reverse, gen_path_info, format_utc_iso_date, parse_timestamp, get_swh_persistent_id ) -from swh.web.tests.data import get_content +from swh.web.tests.data import get_content, random_sha1 from swh.web.tests.django_asserts import assert_contains, assert_template_used from swh.web.tests.strategies import ( origin, origin_with_multiple_visits, new_origin, - new_snapshot, visit_dates, revisions, origin_with_releases + new_snapshot, visit_dates, revisions, origin_with_releases, + release as existing_release ) @@ -903,3 +905,46 @@ escape(browse_release_url)) assert_contains(resp, '' % escape(browse_revision_url)) + + +@given(new_origin(), visit_dates(), revisions(min_size=10, max_size=10), + existing_release()) +def test_origin_branches_pagination_with_alias(client, archive_data, mocker, + new_origin, visit_dates, + revisions, existing_release): + """ + When a snapshot contains a branch or a release alias, pagination links + in the branches / releases view should be displayed. + """ + mocker.patch('swh.web.browse.views.utils.snapshot_context.PER_PAGE', + len(revisions) / 2) + snp_dict = {'branches': {}, 'id': hash_to_bytes(random_sha1())} + for i in range(len(revisions)): + branch = ''.join(random.choices(string.ascii_lowercase, k=8)) + snp_dict['branches'][branch.encode()] = { + 'target_type': 'revision', + 'target': hash_to_bytes(revisions[i]), + } + release = ''.join(random.choices(string.ascii_lowercase, k=8)) + snp_dict['branches'][b'RELEASE_ALIAS'] = { + 'target_type': 'alias', + 'target': release.encode() + } + snp_dict['branches'][release.encode()] = { + 'target_type': 'release', + 'target': hash_to_bytes(existing_release) + } + new_origin = archive_data.origin_add([new_origin])[0] + archive_data.snapshot_add([Snapshot.from_dict(snp_dict)]) + visit = archive_data.origin_visit_add( + new_origin['url'], visit_dates[0], type='git') + archive_data.origin_visit_update(new_origin['url'], visit.visit, + status='full', + snapshot=snp_dict['id']) + + url = reverse('browse-origin-branches', + url_args={'origin_url': new_origin['url']}) + resp = client.get(url) + assert resp.status_code == 200 + assert_template_used(resp, 'browse/branches.html') + assert_contains(resp, '