Exemplo n.º 1
0
    def test_from_headers(self, paging_resp: PagingResp):

        headers = dict()
        paging_resp.to_headers(headers)

        from_headers = PagingResp.from_headers(headers)

        assert from_headers == paging_resp
Exemplo n.º 2
0
def _adjust_paging_totals(paging: PagingResp) -> None:
    """
    Adjusts total pages based on total items supplied by route. Removes url to next page
    if necessary.
    """
    if paging.total_items is not None:
        if paging.offset + paging.limit >= paging.total_items:
            paging.next = None
        paging.total_pages = math.ceil(paging.total_items / paging.limit)
Exemplo n.º 3
0
    def test_to_headers(self, paging_resp: PagingResp):

        headers = dict()
        paging_resp.to_headers(headers)

        assert headers["paging-offset"] == str(paging_resp.offset)
        assert headers["paging-limit"] == str(paging_resp.limit)
        assert headers["paging-current-page"] == str(paging_resp.current_page)
        assert headers["paging-next"] == paging_resp.next
        assert headers["paging-previous"] == paging_resp.previous
        assert headers["paging-total-items"] == str(paging_resp.total_items)
        assert headers["paging-total-pages"] == str(paging_resp.total_pages)
Exemplo n.º 4
0
def _set_up_paging_resp(req: Request, app_limit: int) -> PagingResp:
    """Sets up paging info based on request."""
    offset = int(req.params.get("paging-offset", 0))
    user_limit = int(req.params.get("paging-limit", app_limit))

    if user_limit > app_limit:
        raise APILimitError(
            f"item limit for {req.method} {req.full_url} is {app_limit}."
            f" {user_limit} requested.")

    next_url = _replace_paging_info(req.full_url,
                                    offset=offset + user_limit,
                                    limit=user_limit)
    if offset - user_limit >= 0:
        previous_url = _replace_paging_info(req.full_url,
                                            offset=offset - user_limit,
                                            limit=user_limit)
    else:
        previous_url = None

    current = math.floor(offset / user_limit) + 1

    paging = PagingResp(
        previous=previous_url,
        next=next_url,
        current_page=current,
        offset=offset,
        limit=user_limit,
        total_items=None,
        total_pages=None,
    )
    return paging
Exemplo n.º 5
0
def _validate_paging(
    response: requests.Response,
    expected_paging: Optional[PagingResp] = None,
    paging_urls: bool = True,
) -> None:
    if expected_paging is not None:
        received_paging = PagingResp.from_headers(response.headers)

        expected_values = dataclasses.asdict(expected_paging)
        received_values = dataclasses.asdict(received_paging)

        if not paging_urls:
            expected_values.pop("next")
            expected_values.pop("previous")

            received_values.pop("next")
            received_values.pop("previous")

        if expected_values != received_values:
            raise PagingMismatchError(
                f"Received values do not match expected values.\n"
                f"Received:\n"
                f"{received_values}\n"
                f"Expected:\n"
                f"{expected_values}")
Exemplo n.º 6
0
    def test_validate_paging_no_urls_raises(self):
        r = Response()
        r.status_code = 200
        r.headers = {
            "paging-next": "www.url.com/next",
            "paging-previous": "www.url.com/previous",
            "paging-offset": 5,
            "paging-limit": 5,
            "paging-current-page": 2,
            "paging-total-pages": 10,
            "paging-total-items": 50,
        }

        expected_paging = PagingResp(
            next=None,
            previous=None,
            offset=5,
            limit=5,
            current_page=2,
            total_pages=10,
            total_items=50,
        )

        with pytest.raises(test_utils.PagingMismatchError):
            test_utils.validate_response(r, expected_paging=expected_paging)
Exemplo n.º 7
0
def paging_resp() -> PagingResp:
    return PagingResp(
        previous="www.someapi.com/items?offset=10&limit=10",
        next="www.someapi.com/items?offset=30&limit=10",
        current_page=3,
        offset=20,
        limit=10,
        total_pages=5,
        total_items=50,
    )
Exemplo n.º 8
0
    def test_headers_round_trip_optionals(self, paging_resp: PagingResp):

        paging_resp.previous = None
        paging_resp.next = None
        paging_resp.total_items = None
        paging_resp.total_pages = None

        headers = dict()
        paging_resp.to_headers(headers)

        from_headers = PagingResp.from_headers(headers)

        assert "paging-previous" not in headers
        assert "paging-next" not in headers
        assert "paging-total-items" not in headers
        assert "paging-total-pages" not in headers

        assert from_headers == paging_resp
Exemplo n.º 9
0
    def test_validate_paging(self):
        r = Response()
        r.status_code = 200
        r.headers = {
            "paging-next": "www.url.com/next",
            "paging-previous": "www.url.com/previous",
            "paging-offset": 5,
            "paging-limit": 5,
            "paging-current-page": 2,
            "paging-total-pages": 10,
            "paging-total-items": 50,
        }

        expected_paging = PagingResp(
            next="www.url.com/next",
            previous="www.url.com/previous",
            offset=5,
            limit=5,
            current_page=2,
            total_pages=10,
            total_items=50,
        )

        test_utils.validate_response(r, expected_paging=expected_paging)