Paginate boards JSON

This commit is contained in:
Alp Keser
2026-02-17 10:37:23 +03:00
parent 608be1f155
commit 13d7cd4303
3 changed files with 24 additions and 10 deletions
+21 -7
View File
@@ -207,7 +207,7 @@ class BoardsControllerTest < ActionDispatch::IntegrationTest
assert_equal users(:kevin).boards.count, @response.parsed_body.count
end
test "index as JSON includes all boards ordered by recently accessed" do
test "index as JSON paginates and preserves recently-accessed order" do
account = accounts("37s")
kevin = users(:kevin)
baseline_accessed_at = 3.days.ago.change(usec: 0)
@@ -216,7 +216,7 @@ class BoardsControllerTest < ActionDispatch::IntegrationTest
access.update!(accessed_at: baseline_accessed_at + index.seconds)
end
35.times do |index|
200.times do |index|
board = Board.create!(
name: "Recent board #{index}",
creator: kevin,
@@ -226,14 +226,22 @@ class BoardsControllerTest < ActionDispatch::IntegrationTest
board.access_for(kevin).update!(accessed_at: baseline_accessed_at + (index + 1).minutes)
end
get boards_path, as: :json
assert_response :success
expected_ids = kevin.boards.ordered_by_recently_accessed.pluck(:id)
actual_ids = @response.parsed_body.map { |board| board["id"] }
actual_ids = []
next_page = boards_path(format: :json)
page_count = 0
while next_page
get next_page, as: :json
assert_response :success
page_count += 1
actual_ids.concat(@response.parsed_body.map { |board| board["id"] })
next_page = next_page_from_link_header(@response.headers["Link"])
end
assert_equal expected_ids, actual_ids
assert_operator page_count, :>, 1
end
test "show as JSON" do
@@ -269,4 +277,10 @@ class BoardsControllerTest < ActionDispatch::IntegrationTest
assert_response :no_content
end
private
def next_page_from_link_header(link_header)
url = link_header&.match(/<([^>]+)>;\s*rel="next"/)&.captures&.first
URI.parse(url).request_uri if url
end
end