Add Python 3 support in pagination.
authorBen Sturmfels <ben@sturm.com.au>
Sun, 7 Aug 2016 11:48:52 +0000 (21:48 +1000)
committerBoris Bobrov <breton@cynicmansion.ru>
Fri, 16 Sep 2016 06:24:56 +0000 (09:24 +0300)
This issue was visible when attempting to view the home page of a MediaGoblin site with more than a single page worth of items, under Python 3.

mediagoblin/tests/test_tools.py
mediagoblin/tools/pagination.py

index 6d3dd4758d87198e3c7df526176a40f2530b2225..30232e2418f5322c57e8973b0beae5ff91edf38e 100644 (file)
 
 from __future__ import absolute_import, unicode_literals
 
+try:
+    import mock
+except ImportError:
+    import unittest.mock as mock
+
 from werkzeug.wrappers import Request
 from werkzeug.test import EnvironBuilder
 
 from mediagoblin.tools.request import decode_request
+from mediagoblin.tools.pagination import Pagination
 
 class TestDecodeRequest(object):
     """Test the decode_request function."""
@@ -59,3 +65,28 @@ class TestDecodeRequest(object):
         request.form = {'foo': 'bar'}
         data = decode_request(request)
         assert data['foo'] == 'bar'
+
+
+class TestPagination(object):
+    def setup(self):
+        mock_cursor = mock.MagicMock()
+        mock_cursor.count.return_value = 1
+        self.paginator = Pagination(1, mock_cursor)
+
+    def test_creates_valid_page_url_from_explicit_base_url(self):
+        """Check that test_page_url_explicit runs.
+
+        This is a regression test for a Python 2/3 compatibility fix.
+
+        """
+        url = self.paginator.get_page_url_explicit(
+            'http://example.com', [], 1)
+        assert url == 'http://example.com?page=1'
+
+    def test_iter_pages_handes_single_page(self):
+        """Check that iter_pages produces the expected result for single page.
+
+        This is a regression test for a Python 2/3 compatibility fix.
+
+        """
+        assert list(self.paginator.iter_pages()) == [1]
index a525caf721d81f3bab4e3a6b3eb6114c6e880378..db5f69fb0f825a93a7ded2912e3f3359b5523942 100644 (file)
 # You should have received a copy of the GNU Affero General Public License
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
-import urllib
 import copy
 from math import ceil, floor
 from itertools import count
 from werkzeug.datastructures import MultiDict
 
-from six.moves import zip
+from six.moves import range, urllib, zip
 
 PAGINATION_DEFAULT_PER_PAGE = 30
 
@@ -86,7 +85,7 @@ class Pagination(object):
     def iter_pages(self, left_edge=2, left_current=2,
                    right_current=5, right_edge=2):
         last = 0
-        for num in xrange(1, self.pages + 1):
+        for num in range(1, self.pages + 1):
             if num <= left_edge or \
                (num > self.page - left_current - 1 and \
                 num < self.page + right_current) or \
@@ -107,7 +106,7 @@ class Pagination(object):
 
         new_get_params['page'] = page_no
         return "%s?%s" % (
-            base_url, urllib.urlencode(new_get_params))
+            base_url, urllib.parse.urlencode(new_get_params))
 
     def get_page_url(self, request, page_no):
         """