from types import SimpleNamespace from enhanced_drf_jsonapi.pagination import NgxJsonApiPageNumberPagination def make_page(*, number, pages, count, per_page, next_page=None, previous_page=None): return SimpleNamespace( number=number, paginator=SimpleNamespace(num_pages=pages, count=count, per_page=per_page), has_next=lambda: next_page is not None, has_previous=lambda: previous_page is not None, next_page_number=lambda: next_page, previous_page_number=lambda: previous_page, ) def test_pagination_response_preserves_ngx_jsonapi_contract(): pagination = NgxJsonApiPageNumberPagination() pagination.page = make_page( number=2, pages=4, count=37, per_page=10, next_page=3, previous_page=1, ) pagination.build_link = lambda page: None if page is None else f"/items?page={page}" response = pagination.get_paginated_response([{"id": "one"}]) assert response.data == { "results": [{"id": "one"}], "meta": { "page": 2, "pages": 4, "total_resources": 37, "resources_per_page": 10, }, "links": { "first": "/items?page=1", "last": "/items?page=4", "next": "/items?page=3", "prev": "/items?page=1", }, } def test_pagination_uses_null_links_at_the_boundaries(): pagination = NgxJsonApiPageNumberPagination() pagination.page = make_page(number=1, pages=1, count=0, per_page=25) pagination.build_link = lambda page: None if page is None else f"/items?page={page}" response = pagination.get_paginated_response([]) assert response.data["links"]["next"] is None assert response.data["links"]["prev"] is None