| defmodule Plausible.PaginationTest do |
| use Plausible.DataCase, async: true |
|
|
| alias Plausible.Pagination |
| import Ecto.Query |
|
|
| setup do |
| sites = insert_list(12, :site) |
| {:ok, %{sites: sites, query: from(s in Plausible.Site, order_by: [desc: :id])}} |
| end |
|
|
| test "default page size", %{query: q} do |
| pagination = Pagination.paginate(q, %{}, cursor_fields: [id: :desc]) |
|
|
| assert Enum.count(pagination.entries) == 10 |
| assert pagination.metadata.after |
| assert pagination.metadata.limit == 10 |
| refute pagination.metadata.before |
| end |
|
|
| test "limit can be overridden", %{query: q} do |
| pagination = Pagination.paginate(q, %{"limit" => 3}, cursor_fields: [id: :desc]) |
|
|
| assert Enum.count(pagination.entries) == 3 |
| assert pagination.metadata.limit == 3 |
| end |
|
|
| test "limit exceeds all entries count", %{query: q, sites: sites} do |
| pagination = Pagination.paginate(q, %{"limit" => 100}, cursor_fields: [id: :desc]) |
|
|
| assert Enum.count(pagination.entries) == Enum.count(sites) |
| end |
|
|
| test "user provided limit exceeds maximum limit", %{query: q} do |
| pagination = Pagination.paginate(q, %{"limit" => 200}, cursor_fields: [id: :desc]) |
| assert pagination.metadata.limit == 10 |
| end |
|
|
| test "limit supplied as a string", %{query: q} do |
| pagination = Pagination.paginate(q, %{"limit" => "3"}, cursor_fields: [id: :desc]) |
|
|
| assert Enum.count(pagination.entries) == 3 |
| assert pagination.metadata.limit == 3 |
| end |
|
|
| test "next/prev page", %{query: q} do |
| page1 = Pagination.paginate(q, %{"limit" => 3}, cursor_fields: [id: :desc]) |
|
|
| page_after = page1.metadata.after |
|
|
| page2 = |
| Pagination.paginate(q, %{"limit" => 3, "after" => page_after}, cursor_fields: [id: :desc]) |
|
|
| assert page1.entries != page2.entries |
| assert Enum.count(page1.entries) == Enum.count(page2.entries) |
|
|
| page_before = page2.metadata.before |
|
|
| assert ^page1 = |
| Pagination.paginate(q, %{"limit" => 3, "before" => page_before}, |
| cursor_fields: [id: :desc] |
| ) |
| end |
| end |
|
|