1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113
|
# -------------------------------------------------------------------------
# Copyright (c) Microsoft Corporation. All rights reserved.
# Licensed under the MIT License. See LICENSE.txt in the project root for
# license information.
# -------------------------------------------------------------------------
import re
from corehttp.paging import ItemPaged
from corehttp.exceptions import HttpResponseError
import pytest
class TestPaging(object):
def test_basic_paging(self):
def get_next(continuation_token=None):
"""Simplify my life and return JSON and not response, but should be response."""
if not continuation_token:
return {"nextLink": "page2", "value": ["value1.0", "value1.1"]}
else:
return {"nextLink": None, "value": ["value2.0", "value2.1"]}
def extract_data(response):
return response["nextLink"], iter(response["value"])
pager = ItemPaged(get_next, extract_data)
result_iterated = list(pager)
assert ["value1.0", "value1.1", "value2.0", "value2.1"] == result_iterated
def test_by_page_paging(self):
def get_next(continuation_token=None):
"""Simplify my life and return JSON and not response, but should be response."""
if not continuation_token:
return {"nextLink": "page2", "value": ["value1.0", "value1.1"]}
else:
return {"nextLink": None, "value": ["value2.0", "value2.1"]}
def extract_data(response):
return response["nextLink"], iter(response["value"])
pager = ItemPaged(get_next, extract_data).by_page()
page1 = next(pager)
assert list(page1) == ["value1.0", "value1.1"]
page2 = next(pager)
assert list(page2) == ["value2.0", "value2.1"]
with pytest.raises(StopIteration):
next(pager)
def test_advance_paging(self):
def get_next(continuation_token=None):
"""Simplify my life and return JSON and not response, but should be response."""
if not continuation_token:
return {"nextLink": "page2", "value": ["value1.0", "value1.1"]}
else:
return {"nextLink": None, "value": ["value2.0", "value2.1"]}
def extract_data(response):
return response["nextLink"], iter(response["value"])
pager = ItemPaged(get_next, extract_data)
page1 = next(pager)
assert page1 == "value1.0"
page1 = next(pager)
assert page1 == "value1.1"
page2 = next(pager)
assert page2 == "value2.0"
page2 = next(pager)
assert page2 == "value2.1"
with pytest.raises(StopIteration):
next(pager)
def test_none_value(self):
def get_next(continuation_token=None):
return {"nextLink": None, "value": None}
def extract_data(response):
return response["nextLink"], iter(response["value"] or [])
pager = ItemPaged(get_next, extract_data)
result_iterated = list(pager)
assert len(result_iterated) == 0
def test_print(self):
def get_next(continuation_token=None):
return {"nextLink": None, "value": None}
def extract_data(response):
return response["nextLink"], iter(response["value"] or [])
pager = ItemPaged(get_next, extract_data)
output = repr(pager)
assert re.match("<iterator object .*\\.ItemPaged at", output)
def test_paging_continue_on_error(self):
def get_next(continuation_token=None):
if not continuation_token:
return {"nextLink": "foo", "value": ["bar"]}
else:
raise HttpResponseError()
def extract_data(response):
return response["nextLink"], iter(response["value"] or [])
pager = ItemPaged(get_next, extract_data)
assert next(pager) == "bar"
with pytest.raises(HttpResponseError) as err:
next(pager)
assert err.value.continuation_token == "foo"
|