Skip to content

Commit 82dbfbd

Browse files
committed
test; return before / after on empty results
1 parent 06a773b commit 82dbfbd

File tree

2 files changed

+95
-0
lines changed

2 files changed

+95
-0
lines changed

lib/paginator.ex

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -255,6 +255,11 @@ defmodule Paginator do
255255
Map.get(schema, field)
256256
end
257257

258+
defp before_cursor([], [], %Config{before: c_before, page_booleans: true} = config)
259+
when not is_nil(c_before) do
260+
c_before
261+
end
262+
258263
defp before_cursor([], [], _config), do: nil
259264

260265
defp before_cursor(_paginated_entries, _sorted_entries, %Config{after: nil, before: nil}),
@@ -285,6 +290,11 @@ defmodule Paginator do
285290
end
286291
end
287292

293+
defp after_cursor([], [], %Config{after: c_after, page_booleans: true} = config)
294+
when not is_nil(c_after) do
295+
c_after
296+
end
297+
288298
defp after_cursor([], [], _config), do: nil
289299

290300
defp after_cursor(paginated_entries, _sorted_entries, %Config{before: c_before} = config)

test/paginator_test.exs

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,42 @@ defmodule PaginatorTest do
2626
assert page.metadata.after == nil
2727
end
2828

29+
test "paginates forward with page_booleans", %{
30+
payments: {p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12}
31+
} do
32+
opts = [cursor_fields: [:charged_at, :id], sort_direction: :asc, limit: 4, page_booleans: true]
33+
34+
page = payments_by_charged_at() |> Repo.paginate(opts)
35+
assert to_ids(page.entries) == to_ids([p5, p4, p1, p6])
36+
assert page.metadata.before == nil
37+
# Question: Should this return a value?
38+
# assert page.metadata.before == encode_cursor(%{charged_at: p5.charged_at, id: p5.id})
39+
assert page.metadata.after == encode_cursor(%{charged_at: p6.charged_at, id: p6.id})
40+
assert page.metadata.has_previous_page == false
41+
assert page.metadata.has_next_page == true
42+
43+
page = payments_by_charged_at() |> Repo.paginate(opts ++ [after: page.metadata.after])
44+
assert to_ids(page.entries) == to_ids([p7, p3, p10, p2])
45+
assert page.metadata.before == encode_cursor(%{charged_at: p7.charged_at, id: p7.id})
46+
assert page.metadata.after == encode_cursor(%{charged_at: p2.charged_at, id: p2.id})
47+
assert page.metadata.has_next_page == true
48+
assert page.metadata.has_previous_page == true
49+
50+
page = payments_by_charged_at() |> Repo.paginate(opts ++ [after: page.metadata.after])
51+
assert to_ids(page.entries) == to_ids([p12, p8, p9, p11])
52+
assert page.metadata.before == encode_cursor(%{charged_at: p12.charged_at, id: p12.id})
53+
assert page.metadata.after == encode_cursor(%{charged_at: p11.charged_at, id: p11.id})
54+
assert page.metadata.has_next_page == false
55+
assert page.metadata.has_previous_page == true
56+
57+
page = payments_by_charged_at() |> Repo.paginate(opts ++ [after: page.metadata.after])
58+
assert to_ids(page.entries) == to_ids([])
59+
assert page.metadata.before == nil
60+
assert page.metadata.after == encode_cursor(%{charged_at: p11.charged_at, id: p11.id})
61+
assert page.metadata.has_next_page == false
62+
assert page.metadata.has_previous_page == false
63+
end
64+
2965
test "paginates forward with legacy cursor", %{
3066
payments: {p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12}
3167
} do
@@ -74,6 +110,43 @@ defmodule PaginatorTest do
74110
assert page.metadata.before == nil
75111
end
76112

113+
test "paginates backward with page_booleans", %{
114+
payments: {p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12}
115+
} do
116+
opts = [cursor_fields: [:charged_at, :id], sort_direction: :asc, limit: 4, page_booleans: true]
117+
118+
page =
119+
payments_by_charged_at()
120+
|> Repo.paginate(opts ++ [before: encode_cursor(%{charged_at: p11.charged_at, id: p11.id})])
121+
122+
assert to_ids(page.entries) == to_ids([p2, p12, p8, p9])
123+
assert page.metadata.before == encode_cursor(%{charged_at: p2.charged_at, id: p2.id})
124+
assert page.metadata.after == encode_cursor(%{charged_at: p9.charged_at, id: p9.id})
125+
assert page.metadata.has_next_page == true
126+
assert page.metadata.has_previous_page == true
127+
128+
page = payments_by_charged_at() |> Repo.paginate(opts ++ [before: page.metadata.before])
129+
assert to_ids(page.entries) == to_ids([p6, p7, p3, p10])
130+
assert page.metadata.before == encode_cursor(%{charged_at: p6.charged_at, id: p6.id})
131+
assert page.metadata.after == encode_cursor(%{charged_at: p10.charged_at, id: p10.id})
132+
assert page.metadata.has_next_page == true
133+
assert page.metadata.has_previous_page == true
134+
135+
page = payments_by_charged_at() |> Repo.paginate(opts ++ [before: page.metadata.before])
136+
assert to_ids(page.entries) == to_ids([p5, p4, p1])
137+
assert page.metadata.before == encode_cursor(%{charged_at: p5.charged_at, id: p5.id})
138+
assert page.metadata.after == encode_cursor(%{charged_at: p1.charged_at, id: p1.id})
139+
assert page.metadata.has_next_page == true
140+
assert page.metadata.has_previous_page == false
141+
142+
page = payments_by_charged_at() |> Repo.paginate(opts ++ [before: page.metadata.before])
143+
assert to_ids(page.entries) == to_ids([])
144+
assert page.metadata.before == encode_cursor(%{charged_at: p5.charged_at, id: p5.id})
145+
assert page.metadata.after == nil
146+
assert page.metadata.has_next_page == false
147+
assert page.metadata.has_previous_page == false
148+
end
149+
77150
test "returns an empty page when there are no results" do
78151
page =
79152
payments_by_status("failed")
@@ -84,6 +157,18 @@ defmodule PaginatorTest do
84157
assert page.metadata.before == nil
85158
end
86159

160+
test "returns an empty page when there are no results with page_booleans" do
161+
page =
162+
payments_by_status("failed")
163+
|> Repo.paginate(cursor_fields: [:charged_at, :id], limit: 10, page_booleans: true)
164+
165+
assert page.entries == []
166+
assert page.metadata.after == nil
167+
assert page.metadata.before == nil
168+
assert page.metadata.has_next_page == false
169+
assert page.metadata.has_previous_page == false
170+
end
171+
87172
describe "paginate a collection of payments, sorting by charged_at" do
88173
test "sorts ascending without cursors", %{
89174
payments: {p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12}

0 commit comments

Comments
 (0)