Skip to content

Commit 92e9a66

Browse files
Amend tests to always include all pagination keys
1 parent 16e5204 commit 92e9a66

File tree

3 files changed

+32
-8
lines changed

3 files changed

+32
-8
lines changed

lib/active_model_serializers/adapter/json_api/pagination_links.rb

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ module Adapter
33
class JsonApi < Base
44
class PaginationLinks
55
MissingSerializationContextError = Class.new(KeyError)
6+
FIRST_PAGE = 1
67

78
attr_reader :collection, :context
89

@@ -42,20 +43,36 @@ def first_page_url
4243
url_for_page(1)
4344
end
4445

46+
def last_page_url
47+
if collection.total_pages == 0
48+
url_for_page(FIRST_PAGE)
49+
else
50+
url_for_page(collection.total_pages)
51+
end
52+
end
53+
4554
def prev_page_url
46-
return nil if collection.first_page?
47-
url_for_page(collection.prev_page)
55+
return nil if collection.current_page == FIRST_PAGE
56+
url_for_page(collection.current_page - FIRST_PAGE)
4857
end
4958

5059
def next_page_url
51-
return nil if collection.last_page? || collection.out_of_range?
60+
return nil if (collection.total_pages == 0 || collection.current_page == collection.total_pages)
5261
url_for_page(collection.next_page)
5362
end
5463

5564
def url_for_page(number)
5665
params = query_parameters.dup
57-
params[:page] = { page: per_page, number: number }
58-
context.url_for(action: :index, params: params)
66+
params[:page] = { size: per_page, number: number }
67+
"#{url(adapter_options)}?#{params.to_query}"
68+
end
69+
70+
def url(options = {})
71+
@url ||= options.fetch(:links, {}).fetch(:self, nil) || request_url
72+
end
73+
74+
def request_url
75+
@request_url ||= context.request_url
5976
end
6077

6178
def query_parameters

test/action_controller/json_api/pagination_test.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ def test_render_pagination_links_with_will_paginate
6161
def test_render_only_first_last_and_next_pagination_links
6262
expected_links = { 'self' => "#{WILL_PAGINATE_URI}?page%5Bnumber%5D=1&page%5Bsize%5D=2",
6363
'first' => "#{WILL_PAGINATE_URI}?page%5Bnumber%5D=1&page%5Bsize%5D=2",
64+
'prev' => nil,
6465
'next' => "#{WILL_PAGINATE_URI}?page%5Bnumber%5D=2&page%5Bsize%5D=2",
6566
'last' => "#{WILL_PAGINATE_URI}?page%5Bnumber%5D=2&page%5Bsize%5D=2" }
6667
get :render_pagination_using_will_paginate, params: { page: { number: 1, size: 2 } }
@@ -83,6 +84,7 @@ def test_render_only_prev_first_and_last_pagination_links
8384
expected_links = { 'self' => "#{KAMINARI_URI}?page%5Bnumber%5D=3&page%5Bsize%5D=1",
8485
'first' => "#{KAMINARI_URI}?page%5Bnumber%5D=1&page%5Bsize%5D=1",
8586
'prev' => "#{KAMINARI_URI}?page%5Bnumber%5D=2&page%5Bsize%5D=1",
87+
'next' => nil,
8688
'last' => "#{KAMINARI_URI}?page%5Bnumber%5D=3&page%5Bsize%5D=1" }
8789
get :render_pagination_using_kaminari, params: { page: { number: 3, size: 1 } }
8890
response = JSON.parse(@response.body)
@@ -92,6 +94,7 @@ def test_render_only_prev_first_and_last_pagination_links
9294
def test_render_only_first_last_and_next_pagination_links_with_additional_params
9395
expected_links = { 'self' => "#{WILL_PAGINATE_URI}?page%5Bnumber%5D=1&page%5Bsize%5D=2&teste=additional",
9496
'first' => "#{WILL_PAGINATE_URI}?page%5Bnumber%5D=1&page%5Bsize%5D=2&teste=additional",
97+
'prev' => nil,
9598
'next' => "#{WILL_PAGINATE_URI}?page%5Bnumber%5D=2&page%5Bsize%5D=2&teste=additional",
9699
'last' => "#{WILL_PAGINATE_URI}?page%5Bnumber%5D=2&page%5Bsize%5D=2&teste=additional" }
97100
get :render_pagination_using_will_paginate, params: { page: { number: 1, size: 2 }, teste: 'additional' }
@@ -103,6 +106,7 @@ def test_render_only_prev_first_and_last_pagination_links_with_additional_params
103106
expected_links = { 'self' => "#{KAMINARI_URI}?page%5Bnumber%5D=3&page%5Bsize%5D=1&teste=additional",
104107
'first' => "#{KAMINARI_URI}?page%5Bnumber%5D=1&page%5Bsize%5D=1&teste=additional",
105108
'prev' => "#{KAMINARI_URI}?page%5Bnumber%5D=2&page%5Bsize%5D=1&teste=additional",
109+
'next' => nil,
106110
'last' => "#{KAMINARI_URI}?page%5Bnumber%5D=3&page%5Bsize%5D=1&teste=additional" }
107111
get :render_pagination_using_kaminari, params: { page: { number: 3, size: 1 }, teste: 'additional' }
108112
response = JSON.parse(@response.body)

test/adapter/json_api/pagination_links_test.rb

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,9 @@ def empty_collection_links
5858
{
5959
self: "#{URI}?page%5Bnumber%5D=1&page%5Bsize%5D=2",
6060
first: "#{URI}?page%5Bnumber%5D=1&page%5Bsize%5D=2",
61-
last: "#{URI}?page%5Bnumber%5D=1&page%5Bsize%5D=2"
61+
prev: nil,
62+
next: nil,
63+
last: "#{URI}?page%5Bnumber%5D=1&page%5Bsize%5D=2",
6264
}
6365
end
6466

@@ -79,8 +81,9 @@ def last_page_links
7981
links: {
8082
self: "#{URI}?page%5Bnumber%5D=3&page%5Bsize%5D=2",
8183
first: "#{URI}?page%5Bnumber%5D=1&page%5Bsize%5D=2",
82-
last: "#{URI}?page%5Bnumber%5D=3&page%5Bsize%5D=2",
83-
prev: "#{URI}?page%5Bnumber%5D=2&page%5Bsize%5D=2"
84+
prev: "#{URI}?page%5Bnumber%5D=2&page%5Bsize%5D=2",
85+
next: nil,
86+
last: "#{URI}?page%5Bnumber%5D=3&page%5Bsize%5D=2"
8487
}
8588
}
8689
end

0 commit comments

Comments
 (0)