Add pager tests.
This commit is contained in:
parent
2d78c2814d
commit
dcb0849d26
74
tests/test_pager.py
Normal file
74
tests/test_pager.py
Normal file
|
|
@ -0,0 +1,74 @@
|
||||||
|
"""Unit tests for pagination helpers in ``depicts.pager``.
|
||||||
|
|
||||||
|
Covers page counting, slicing, page iteration, URL building, and Jinja init.
|
||||||
|
"""
|
||||||
|
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
from depicts.pager import Pagination, init_pager, url_for_other_page
|
||||||
|
from flask import Flask
|
||||||
|
|
||||||
|
|
||||||
|
def _make_app() -> Flask:
|
||||||
|
"""Create a minimal Flask app with a paging route."""
|
||||||
|
app = Flask(__name__)
|
||||||
|
|
||||||
|
@app.get("/items/<int:category_id>")
|
||||||
|
def items(category_id: int) -> str: # noqa: ARG001 - used via request
|
||||||
|
# Return a URL for a different page while preserving args.
|
||||||
|
return url_for_other_page(5)
|
||||||
|
|
||||||
|
return app
|
||||||
|
|
||||||
|
|
||||||
|
def test_pagination_basic_properties() -> None:
|
||||||
|
"""Compute total pages and prev/next boundaries."""
|
||||||
|
p = Pagination(page=1, per_page=10, total_count=95)
|
||||||
|
assert p.pages == 10
|
||||||
|
assert p.has_prev is False
|
||||||
|
assert p.has_next is True
|
||||||
|
|
||||||
|
p2 = Pagination(page=10, per_page=10, total_count=95)
|
||||||
|
assert p2.pages == 10
|
||||||
|
assert p2.has_prev is True
|
||||||
|
assert p2.has_next is False
|
||||||
|
|
||||||
|
|
||||||
|
def test_pagination_slice() -> None:
|
||||||
|
"""Return the correct slice for a page window."""
|
||||||
|
items = list(range(25))
|
||||||
|
p = Pagination(page=2, per_page=10, total_count=len(items))
|
||||||
|
assert p.slice(items) == list(range(10, 20))
|
||||||
|
|
||||||
|
|
||||||
|
def test_iter_pages_first_middle_last() -> None:
|
||||||
|
"""Iterate pages with ellipses represented by ``None`` when skipping."""
|
||||||
|
p = Pagination(page=1, per_page=10, total_count=100)
|
||||||
|
pages = list(p.iter_pages())
|
||||||
|
# First page shows early pages, ellipsis, then tail pages
|
||||||
|
assert pages == [1, 2, 3, 4, 5, 6, None, 9, 10]
|
||||||
|
|
||||||
|
mid = Pagination(page=5, per_page=10, total_count=100)
|
||||||
|
# In the middle, defaults show all pages without gaps
|
||||||
|
assert list(mid.iter_pages()) == list(range(1, 11))
|
||||||
|
|
||||||
|
last = Pagination(page=10, per_page=10, total_count=100)
|
||||||
|
# Near the end, elide the early middle (3), keep a window around current
|
||||||
|
assert list(last.iter_pages()) == [1, 2, None, 4, 5, 6, 7, 8, 9, 10]
|
||||||
|
|
||||||
|
|
||||||
|
def test_url_for_other_page_preserves_args_and_view_args() -> None:
|
||||||
|
"""Build a URL for another page preserving args."""
|
||||||
|
app = _make_app()
|
||||||
|
with app.test_client() as client:
|
||||||
|
resp = client.get("/items/42?q=abc&page=3")
|
||||||
|
assert resp.status_code == 200
|
||||||
|
# The route returns the URL generated for page=5
|
||||||
|
assert resp.get_data(as_text=True) == "/items/42?q=abc&page=5"
|
||||||
|
|
||||||
|
|
||||||
|
def test_init_pager_registers_jinja_helper() -> None:
|
||||||
|
"""Register the helper in the Jinja environment globals."""
|
||||||
|
app = Flask(__name__)
|
||||||
|
init_pager(app)
|
||||||
|
assert app.jinja_env.globals["url_for_other_page"] is url_for_other_page
|
||||||
Loading…
Reference in a new issue