58 lines
1.5 KiB
Python
58 lines
1.5 KiB
Python
"""Unit tests for platform cursor pagination helpers."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import datetime
|
|
|
|
import pytest
|
|
from fastapi import HTTPException
|
|
|
|
from backend.api.platform._pagination import (
|
|
decode_cursor,
|
|
encode_cursor,
|
|
page_meta,
|
|
)
|
|
|
|
|
|
def test_encode_decode_roundtrip() -> None:
|
|
created_at = datetime.datetime(2026, 3, 15, 12, 30, 45, 123000)
|
|
row_id = "01HXY9C5B8N3K4P7Q6RT2V0J8D"
|
|
cursor = encode_cursor(created_at, row_id)
|
|
decoded_ts, decoded_id = decode_cursor(cursor)
|
|
assert decoded_ts == created_at
|
|
assert decoded_id == row_id
|
|
|
|
|
|
def test_decode_strips_timezone() -> None:
|
|
created_at = datetime.datetime(2026, 1, 1, 0, 0, 0, tzinfo=datetime.timezone.utc)
|
|
cursor = encode_cursor(created_at, "abc")
|
|
decoded_ts, decoded_id = decode_cursor(cursor)
|
|
assert decoded_ts.tzinfo is None
|
|
assert decoded_id == "abc"
|
|
|
|
|
|
def test_decode_invalid_cursor_raises_400() -> None:
|
|
with pytest.raises(HTTPException) as exc_info:
|
|
decode_cursor("not-a-valid-cursor!!!")
|
|
assert exc_info.value.status_code == 400
|
|
|
|
|
|
def test_page_meta_has_more() -> None:
|
|
meta = page_meta(
|
|
limit=10,
|
|
page_count=10,
|
|
total_count=25,
|
|
next_cursor="abc",
|
|
)
|
|
assert meta["has_more"] is True
|
|
assert meta["next_cursor"] == "abc"
|
|
assert meta["total_count"] == 25
|
|
|
|
meta_end = page_meta(
|
|
limit=10,
|
|
page_count=5,
|
|
total_count=25,
|
|
next_cursor=None,
|
|
)
|
|
assert meta_end["has_more"] is False
|