X-Git-Url: https://git.mdrn.pl/django-pagination.git/blobdiff_plain/cc09a6ef903c38873717ae435843adfce4dba6e6..5432e8fe148352116ca3c7cbdc96d8cf7e677dc5:/linaro_django_pagination/tests/test_main.py diff --git a/linaro_django_pagination/tests/test_main.py b/linaro_django_pagination/tests/test_main.py new file mode 100644 index 0000000..2409b0f --- /dev/null +++ b/linaro_django_pagination/tests/test_main.py @@ -0,0 +1,399 @@ +# Copyright (c) 2008, Eric Florenzano +# Copyright (c) 2010, 2011 Linaro Limited +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided +# with the distribution. +# * Neither the name of the author nor the names of other +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +from django.core.paginator import Paginator +from django.http import HttpRequest as DjangoHttpRequest +from django.template import Template, Context + +try: + from django.test import SimpleTestCase +except ImportError: # Django 1.2 compatible + from django.test import TestCase as SimpleTestCase + +from linaro_django_pagination.paginator import InfinitePaginator, FinitePaginator +from linaro_django_pagination.templatetags.pagination_tags import paginate +from linaro_django_pagination.middleware import PaginationMiddleware + + +class HttpRequest(DjangoHttpRequest): + page = lambda self, suffix: 1 + + +class CommonTestCase(SimpleTestCase): + def test_records_for_the_first_page(self): + p = Paginator(range(15), 2) + pg = paginate({'paginator': p, 'page_obj': p.page(1)}) + self.assertListEqual(pg['pages'], [1, 2, 3, 4, 5, 6, 7, 8]) + self.assertEqual(pg['records']['first'], 1) + self.assertEqual(pg['records']['last'], 2) + + def test_records_for_the_last_page(self): + p = Paginator(range(15), 2) + pg = paginate({'paginator': p, 'page_obj': p.page(8)}) + self.assertListEqual(pg['pages'], [1, 2, 3, 4, 5, 6, 7, 8]) + self.assertEqual(pg['records']['first'], 15) + self.assertEqual(pg['records']['last'], 15) + + def test_pages_list(self): + p = Paginator(range(17), 2) + self.assertEqual(paginate({'paginator': p, 'page_obj': p.page(1)})['pages'], [1, 2, 3, 4, 5, 6, 7, 8, 9]) + + def test_page_with_empty_objects_list(self): + p = Paginator(range(0), 2) + self.assertListEqual(paginate({'paginator': p, 'page_obj': p.page(1)})['pages'], [1]) + + +class DefaultWindowTestCase(SimpleTestCase): + """ + Test paginate using default window setting + moving the window from 1 ... to end + window size = 2, margin = 2 + window = 2 -> show 5 pages + """ + def setUp(self): + self.p = Paginator(range(31), 2) + + def test_on_start_page_1(self): + # [1] 2 3 4 5 ... 15, 16 + self.assertListEqual( + paginate({'paginator': self.p, 'page_obj': self.p.page(1)}, 2, 2)['pages'], + [1, 2, 3, 4, 5, None, 15, 16] + ) + + def test_on_start_page_2(self): + # 1 [2] 3 4 5 ... 15, 16 + self.assertListEqual( + paginate({'paginator': self.p, 'page_obj': self.p.page(2)}, 2, 2)['pages'], + [1, 2, 3, 4, 5, None, 15, 16] + ) + + def test_on_start_page_3(self): + # 1 2 [3] 4 5 ... 15, 16 + self.assertListEqual( + paginate({'paginator': self.p, 'page_obj': self.p.page(3)}, 2, 2)['pages'], + [1, 2, 3, 4, 5, None, 15, 16] + ) + + def test_on_start_page_4(self): + # 1 2 3 [4] 5 6 ... 15, 16 + self.assertListEqual( + paginate({'paginator': self.p, 'page_obj': self.p.page(4)}, 2, 2)['pages'], + [1, 2, 3, 4, 5, 6, None, 15, 16]) + + def test_on_start_page_5(self): + # 1 2 3 4 [5] 6 7 ... 15, 16 + self.assertListEqual( + paginate({'paginator': self.p, 'page_obj': self.p.page(5)}, 2, 2)['pages'], + [1, 2, 3, 4, 5, 6, 7, None, 15, 16] + ) + + def test_in_middle(self): + # 1 2 ... 5 6 [7] 8 9 ... 15, 16 + self.assertListEqual( + paginate({'paginator': self.p, 'page_obj': self.p.page(7)}, 2, 2)['pages'], + [1, 2, None, 5, 6, 7, 8, 9, None, 15, 16] + ) + + def test_on_end_page_13(self): + # 1 2 ... 12 [13] 14 15 16 + self.assertListEqual( + paginate({'paginator': self.p, 'page_obj': self.p.page(13)}, 2, 2)['pages'], + [1, 2, None, 11, 12, 13, 14, 15, 16], + ) + + def test_on_end(self): + # 1 2 ... 12 13 14 15 [16 + self.assertListEqual( + paginate({'paginator': self.p, 'page_obj': self.p.page(16)}, 2, 2)['pages'], + [1, 2, None, 12, 13, 14, 15, 16] + ) + + +class NoMarginTestCase(SimpleTestCase): + def setUp(self): + self.p = Paginator(range(31), 2) + + def test_on_start(self): + self.assertListEqual( + paginate({'paginator': self.p, 'page_obj': self.p.page(3)}, 2, 0)['pages'], + [1, 2, 3, 4, 5, None], + ) + + def test_in_middle(self): + self.assertListEqual( + paginate({'paginator': self.p, 'page_obj': self.p.page(5)}, 2, 0)['pages'], + [None, 3, 4, 5, 6, 7, None], + ) + + def test_on_end(self): + self.assertListEqual( + paginate({'paginator': self.p, 'page_obj': self.p.page(16)}, 2, 0)['pages'], + [None, 12, 13, 14, 15, 16], + ) + + +class ZeroWindowZeroMarginTestCase(SimpleTestCase): + """ + Test paginate using window=0 and margin=0 + """ + def setUp(self): + self.p = Paginator(range(31), 2) + + def test_on_start_page_1(self): + self.assertListEqual( + paginate({'paginator': self.p, 'page_obj': self.p.page(1)}, 0, 0)['pages'], + [1, None], + ) + + def test_in_middle_page_2(self): + self.assertListEqual( + paginate({'paginator': self.p, 'page_obj': self.p.page(2)}, 0, 0)['pages'], + [None, 2, None], + ) + + def test_in_middle_page_3(self): + self.assertListEqual( + paginate({'paginator': self.p, 'page_obj': self.p.page(3)}, 0, 0)['pages'], + [None, 3, None], + ) + + def test_in_middle_page_10(self): + self.assertListEqual( + paginate({'paginator': self.p, 'page_obj': self.p.page(10)}, 0, 0)['pages'], + [None, 10, None], + ) + + def test_in_middle_page_14(self): + self.assertListEqual( + paginate({'paginator': self.p, 'page_obj': self.p.page(14)}, 0, 0)['pages'], + [None, 14, None], + ) + + def test_in_middle_page_15(self): + self.assertListEqual( + paginate({'paginator': self.p, 'page_obj': self.p.page(15)}, 0, 0)['pages'], + [None, 15, None], + ) + + def test_on_end_page_16(self): + self.assertListEqual( + paginate({'paginator': self.p, 'page_obj': self.p.page(16)}, 0, 0)['pages'], + [None, 16], + ) + + +class NoEllipsisTestCase(SimpleTestCase): + """ + Tests a case where should be no any ellipsis pages. + """ + def setUp(self): + self.p = Paginator(range(100), 25) + + def test_on_start(self): + self.assertListEqual( + paginate({'paginator': self.p, 'page_obj': self.p.page(1)}, 2, 0)['pages'], + [1, 2, 3, 4], + ) + + def test_in_middle_page_2(self): + self.assertListEqual( + paginate({'paginator': self.p, 'page_obj': self.p.page(2)}, 2, 0)['pages'], + [1, 2, 3, 4], + ) + + def test_in_middle_page_3(self): + self.assertListEqual( + paginate({'paginator': self.p, 'page_obj': self.p.page(3)}, 2, 0)['pages'], + [1, 2, 3, 4], + ) + + def test_on_end(self): + self.assertListEqual( + paginate({'paginator': self.p, 'page_obj': self.p.page(4)}, 2, 0)['pages'], + [1, 2, 3, 4], + ) + + +class SpecialTestCase(SimpleTestCase): + def test_middle_with_no_window_and_margin_1(self): + p = Paginator(range(31), 2) + self.assertListEqual( + paginate({'paginator': p, 'page_obj': p.page(5)}, 0, 1)['pages'], + [1, None, 5, None, 16], + ) + + def test_middle_with_no_window_and_margin_4(self): + p = Paginator(range(21), 2, 1) + self.assertListEqual( + paginate({'paginator': p, 'page_obj': p.page(1)}, 0, 4)['pages'], + [1, 2, 3, 4, None, 7, 8, 9, 10], + ) + + +class TemplateRenderingTestCase(SimpleTestCase): + def test_default_tag_options(self): + t = Template("{% load pagination_tags %}{% autopaginate var %}{% paginate %}") + self.assertIn( + '