33 lines
1.1 KiB
Elixir
33 lines
1.1 KiB
Elixir
defmodule WhoNeedHelp.PaginationTest do
|
|
use ExUnit.Case, async: true
|
|
|
|
alias WhoNeedHelp.Pagination
|
|
|
|
test "cursor round-trips a UTC timestamp and UUID" do
|
|
timestamp = ~U[2026-07-19 01:30:00Z]
|
|
id = Ecto.UUID.generate()
|
|
|
|
assert {:ok, {^timestamp, ^id}} = timestamp |> Pagination.encode(id) |> Pagination.decode()
|
|
end
|
|
|
|
test "invalid cursors never become query values" do
|
|
assert :error = Pagination.decode("not-a-cursor")
|
|
assert Pagination.cursor(after: "not-a-cursor") == nil
|
|
end
|
|
|
|
test "page exposes a cursor only when another row exists" do
|
|
rows = [
|
|
%{id: Ecto.UUID.generate(), inserted_at: ~U[2026-07-19 01:30:03Z]},
|
|
%{id: Ecto.UUID.generate(), inserted_at: ~U[2026-07-19 01:30:02Z]},
|
|
%{id: Ecto.UUID.generate(), inserted_at: ~U[2026-07-19 01:30:01Z]}
|
|
]
|
|
|
|
page = Pagination.page(rows, 2, &{&1.inserted_at, &1.id})
|
|
assert page.entries == Enum.take(rows, 2)
|
|
assert is_binary(page.next_cursor)
|
|
|
|
last_page = Pagination.page(Enum.take(rows, 2), 2, &{&1.inserted_at, &1.id})
|
|
assert last_page.next_cursor == nil
|
|
end
|
|
end
|