from sqlalchemy.orm import Query from sqlalchemy.schema import Column from atlas_um.helpers.pagination import APIQueryPagination from tests.atlas_um.pytest_helpers import UrlForThisMixin class TestAPIQueryPagination(UrlForThisMixin): ENDPOINT = "common.health" def test_pagination(self, app, faker): columns = [ Column(faker.pystr()) for _ in range(faker.pyint(min_value=1, max_value=10)) ] limit = faker.pyint( APIQueryPagination.DEFAULT_LIMIT, APIQueryPagination.MAX_LIMIT ) offset = faker.pyint() expected_query = Query(columns).limit(limit).offset(offset) with app.test_request_context(self.url_for_this(app)): pagination = APIQueryPagination(Query(columns), limit, offset) assert str(pagination.query) == str(expected_query) def test_pagination_max_limit(self, app, faker): columns = [ Column(faker.pystr()) for _ in range(faker.pyint(min_value=1, max_value=10)) ] limit = faker.pyint( APIQueryPagination.DEFAULT_LIMIT, APIQueryPagination.MAX_LIMIT + 1 ) offset = faker.pyint() expected_query = ( Query(columns).limit(APIQueryPagination.MAX_LIMIT).offset(offset) ) with app.test_request_context(self.url_for_this(app)): pagination = APIQueryPagination(Query(columns), limit, offset) assert str(pagination.query) == str(expected_query) def test_pagination_default_limit(self, app, faker): columns = [ Column(faker.pystr()) for _ in range(faker.pyint(min_value=1, max_value=10)) ] offset = faker.pyint() expected_query = ( Query(columns) .limit(APIQueryPagination.DEFAULT_LIMIT) .offset(offset) ) with app.test_request_context(self.url_for_this(app)): pagination = APIQueryPagination( Query(columns), limit=None, offset=offset ) assert str(pagination.query) == str(expected_query) def test_pagination_no_offset(self, app, faker): columns = [ Column(faker.pystr()) for _ in range(faker.pyint(min_value=1, max_value=10)) ] expected_query = ( Query(columns).limit(APIQueryPagination.DEFAULT_LIMIT).offset(0) ) with app.test_request_context(self.url_for_this(app)): pagination = APIQueryPagination(Query(columns)) assert str(pagination.query) == str(expected_query) def test_pagination_negative_params(self, app, faker): columns = [ Column(faker.pystr()) for _ in range(faker.pyint(min_value=1, max_value=10)) ] expected_query = ( Query(columns).limit(APIQueryPagination.DEFAULT_LIMIT).offset(0) ) with app.test_request_context(self.url_for_this(app)): pagination = APIQueryPagination( Query(columns), limit=-100, offset=-10 ) assert str(pagination.query) == str(expected_query)