Project import generated by Copybara.

GitOrigin-RevId: d9e9e3fb4e31372ec1fb43b178994ca78fa8fe70
diff --git a/api/v3/test/paginator_test.py b/api/v3/test/paginator_test.py
new file mode 100644
index 0000000..ca0b713
--- /dev/null
+++ b/api/v3/test/paginator_test.py
@@ -0,0 +1,78 @@
+# Copyright 2020 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style
+# license that can be found in the LICENSE file.
+"""Tests for the Paginator class."""
+
+from __future__ import print_function
+from __future__ import division
+from __future__ import absolute_import
+
+import unittest
+
+from google.appengine.ext import testbed
+
+from api.v3 import paginator
+from api.v3.api_proto import hotlists_pb2
+from framework import exceptions
+from framework import paginate
+
+class PaginatorTest(unittest.TestCase):
+
+  def setUp(self):
+    self.testbed = testbed.Testbed()
+    self.testbed.activate()
+    self.testbed.init_memcache_stub()
+    self.testbed.init_datastore_v3_stub()
+
+    self.paginator = paginator.Paginator(
+        parent='animal/goose/sound/honks', query='chaos')
+
+  def testGetStart(self):
+    """We can get the start index from a page_token."""
+    start = 5
+    page_token = paginate.GeneratePageToken(
+        self.paginator.request_contents, start)
+    self.assertEqual(self.paginator.GetStart(page_token), start)
+
+  def testGetStart_EmptyPageToken(self):
+    """We return the default start for an empty page_token."""
+    request = hotlists_pb2.ListHotlistItemsRequest()
+    self.assertEqual(0, self.paginator.GetStart(request.page_token))
+
+  def testGenerateNextPageToken(self):
+    """We return the next page token."""
+    next_start = 10
+    expected_page_token = paginate.GeneratePageToken(
+        self.paginator.request_contents, next_start)
+    self.assertEqual(
+        self.paginator.GenerateNextPageToken(next_start), expected_page_token)
+
+  def testGenerateNextPageToken_NoStart(self):
+    """We return None if start is not provided."""
+    next_start = None
+    self.assertEqual(self.paginator.GenerateNextPageToken(next_start), None)
+
+  def testCoercePageSize(self):
+    """A valid page_size is used when provided."""
+    self.assertEqual(1, paginator.CoercePageSize(1, 5))
+
+  def testCoercePageSize_Negative(self):
+    """An exception is raised for a negative page_size."""
+    with self.assertRaises(exceptions.InputException):
+      paginator.CoercePageSize(-1, 5)
+
+  def testCoercePageSize_TooBig(self):
+    """A page_size above the max is coerced to the max."""
+    self.assertEqual(5, paginator.CoercePageSize(6, 5, 2))
+
+  def testCoercePageSize_Default(self):
+    """A default page_size different from max_size is used when provided."""
+    self.assertEqual(2, paginator.CoercePageSize(None, 5, 2))
+
+  def testCoercePageSize_NotProvided(self):
+    """max_size is used if no page_size or default_size provided."""
+    self.assertEqual(5, paginator.CoercePageSize(None, 5))
+
+  def testCoercePageSize_Zero(self):
+    """Handles zero equivalently to None."""
+    self.assertEqual(5, paginator.CoercePageSize(0, 5))
\ No newline at end of file