Mercurial > piecrust2
diff tests/test_data_paginator.py @ 6:f5ca5c5bed85
More Python 3 fixes, modularization, and new unit tests.
author | Ludovic Chabant <ludovic@chabant.com> |
---|---|
date | Sat, 16 Aug 2014 08:15:30 -0700 |
parents | |
children | f130365568ff |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/test_data_paginator.py Sat Aug 16 08:15:30 2014 -0700 @@ -0,0 +1,127 @@ +import math +import pytest +from piecrust.data.base import IPaginationSource +from piecrust.data.paginator import Paginator + + +class MockSource(list, IPaginationSource): + def __init__(self, count): + for i in range(count): + self.append('item %d' % i) + + def getItemsPerPage(self): + return 5 + + def getSourceIterator(self): + return None + + def getSorterIterator(self, it): + return None + + def getTailIterator(self, it): + return None + + def getPaginationFilter(self, page): + return None + + +@pytest.mark.parametrize('uri, page_num, count', [ + ('', 1, 0), + ('', 1, 4), + ('', 1, 5), + ('', 1, 8), + ('', 1, 14), + ('', 2, 8), + ('', 2, 14), + ('', 3, 14), + ('blog', 1, 0), + ('blog', 1, 4), + ('blog', 1, 5), + ('blog', 1, 8), + ('blog', 1, 14), + ('blog', 2, 8), + ('blog', 2, 14), + ('blog', 3, 14) + ]) +def test_paginator(uri, page_num, count): + source = MockSource(count) + p = Paginator(None, source, uri, page_num) + + if count <= 5: + # All posts fit on the page + assert p.prev_page_number is None + assert p.prev_page is None + assert p.this_page_number == 1 + assert p.this_page == uri + assert p.next_page_number is None + assert p.next_page is None + elif page_num == 1: + # First page in many + assert p.prev_page_number is None + assert p.prev_page is None + assert p.this_page_number == 1 + assert p.this_page == uri + assert p.next_page_number == 2 + np = '2' if uri == '' else (uri + '/2') + assert p.next_page == np + else: + # Page in the middle of it all + assert p.prev_page_number == page_num - 1 + if page_num == 2: + assert p.prev_page == uri + else: + pp = str(page_num - 1) if uri == '' else ( + '%s/%d' % (uri, page_num - 1)) + assert p.prev_page == pp + + assert p.this_page_number == page_num + tp = str(page_num) if uri == '' else ( + '%s/%d' % (uri, page_num)) + assert p.this_page == tp + + if page_num * 5 > count: + assert p.next_page_number is None + assert p.next_page is None + else: + assert p.next_page_number == page_num + 1 + np = str(page_num + 1) if uri == '' else ( + '%s/%d' % (uri, page_num + 1)) + assert p.next_page == np + + assert p.total_post_count == count + page_count = math.ceil(count / 5.0) + assert p.total_page_count == page_count + assert p.all_page_numbers() == list(range(1, page_count + 1)) + + for radius in range(1, 8): + width = radius * 2 + 1 + if page_count == 0: + nums = [] + else: + nums = list(filter( + lambda i: i >= 1 and i <= page_count, + range(page_num - radius, page_num + radius + 1))) + if len(nums) < width: + to_add = width - len(nums) + if nums[0] > 1: + to_add = min(to_add, nums[0] - 1) + nums = list(range(1, to_add + 1)) + nums + else: + to_add = min(to_add, page_count - nums[-1]) + nums = nums + list(range(nums[-1] + 1, nums[-1] + to_add + 1)) + assert nums == p.all_page_numbers(radius) + + itp = count + if count > 5: + if page_num * 5 < count: + itp = 5 + else: + itp = count % 5 + assert p.items_this_page == itp + + indices = list(range(count)) + indices = indices[(page_num - 1) * 5 : (page_num - 1) * 5 + itp] + expected = list(['item %d' % i for i in indices]) + items = list(p.items) + assert items == expected +