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
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)
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)
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
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}")
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)
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, )
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
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)