@@ -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