Merge "Include next link when default limit is reached"
This commit is contained in:
commit
673ecaea39
@ -538,10 +538,18 @@ class ViewBuilder(object):
|
||||
items,
|
||||
collection_name,
|
||||
id_key="uuid"):
|
||||
"""Retrieve 'next' link, if applicable."""
|
||||
"""Retrieve 'next' link, if applicable. This is included if:
|
||||
1) 'limit' param is specified and equals the number of items.
|
||||
2) 'limit' param is specified but it exceeds CONF.osapi_max_limit,
|
||||
in this case the number of items is CONF.osapi_max_limit.
|
||||
3) 'limit' param is NOT specified but the number of items is
|
||||
CONF.osapi_max_limit.
|
||||
"""
|
||||
links = []
|
||||
limit = int(request.params.get("limit", 0))
|
||||
if limit and limit == len(items):
|
||||
max_items = min(
|
||||
int(request.params.get("limit", CONF.osapi_max_limit)),
|
||||
CONF.osapi_max_limit)
|
||||
if max_items and max_items == len(items):
|
||||
last_item = items[-1]
|
||||
if id_key in last_item:
|
||||
last_item_id = last_item[id_key]
|
||||
|
@ -18,6 +18,8 @@ Test suites for 'common' code used throughout the OpenStack HTTP API.
|
||||
"""
|
||||
|
||||
from lxml import etree
|
||||
import mock
|
||||
from testtools import matchers
|
||||
import webob
|
||||
import webob.exc
|
||||
import xml.dom.minidom as minidom
|
||||
@ -375,6 +377,82 @@ class MiscFunctionsTest(test.TestCase):
|
||||
self.assertEqual(expected, actual)
|
||||
|
||||
|
||||
class TestCollectionLinks(test.NoDBTestCase):
|
||||
"""Tests the _get_collection_links method."""
|
||||
|
||||
@mock.patch('nova.api.openstack.common.ViewBuilder._get_next_link')
|
||||
def test_items_less_than_limit(self, href_link_mock):
|
||||
items = [
|
||||
{"uuid": "123"}
|
||||
]
|
||||
req = mock.MagicMock()
|
||||
params = mock.PropertyMock(return_value=dict(limit=10))
|
||||
type(req).params = params
|
||||
|
||||
builder = common.ViewBuilder()
|
||||
results = builder._get_collection_links(req, items, "ignored", "uuid")
|
||||
|
||||
href_link_mock.assert_not_called()
|
||||
self.assertThat(results, matchers.HasLength(0))
|
||||
|
||||
@mock.patch('nova.api.openstack.common.ViewBuilder._get_next_link')
|
||||
def test_items_equals_given_limit(self, href_link_mock):
|
||||
items = [
|
||||
{"uuid": "123"}
|
||||
]
|
||||
req = mock.MagicMock()
|
||||
params = mock.PropertyMock(return_value=dict(limit=1))
|
||||
type(req).params = params
|
||||
|
||||
builder = common.ViewBuilder()
|
||||
results = builder._get_collection_links(req, items,
|
||||
mock.sentinel.coll_key,
|
||||
"uuid")
|
||||
|
||||
href_link_mock.assert_called_once_with(req, "123",
|
||||
mock.sentinel.coll_key)
|
||||
self.assertThat(results, matchers.HasLength(1))
|
||||
|
||||
@mock.patch('nova.api.openstack.common.ViewBuilder._get_next_link')
|
||||
def test_items_equals_default_limit(self, href_link_mock):
|
||||
items = [
|
||||
{"uuid": "123"}
|
||||
]
|
||||
req = mock.MagicMock()
|
||||
params = mock.PropertyMock(return_value=dict())
|
||||
type(req).params = params
|
||||
self.flags(osapi_max_limit=1)
|
||||
|
||||
builder = common.ViewBuilder()
|
||||
results = builder._get_collection_links(req, items,
|
||||
mock.sentinel.coll_key,
|
||||
"uuid")
|
||||
|
||||
href_link_mock.assert_called_once_with(req, "123",
|
||||
mock.sentinel.coll_key)
|
||||
self.assertThat(results, matchers.HasLength(1))
|
||||
|
||||
@mock.patch('nova.api.openstack.common.ViewBuilder._get_next_link')
|
||||
def test_items_equals_default_limit_with_given(self, href_link_mock):
|
||||
items = [
|
||||
{"uuid": "123"}
|
||||
]
|
||||
req = mock.MagicMock()
|
||||
# Given limit is greater then default max, only return default max
|
||||
params = mock.PropertyMock(return_value=dict(limit=2))
|
||||
type(req).params = params
|
||||
self.flags(osapi_max_limit=1)
|
||||
|
||||
builder = common.ViewBuilder()
|
||||
results = builder._get_collection_links(req, items,
|
||||
mock.sentinel.coll_key,
|
||||
"uuid")
|
||||
|
||||
href_link_mock.assert_called_once_with(req, "123",
|
||||
mock.sentinel.coll_key)
|
||||
self.assertThat(results, matchers.HasLength(1))
|
||||
|
||||
|
||||
class MetadataXMLDeserializationTest(test.TestCase):
|
||||
|
||||
deserializer = common.MetadataXMLDeserializer()
|
||||
|
Loading…
Reference in New Issue
Block a user