Previously the page-based (numbered) paginator would always count the total_pages, even in API calls when it wasn't needed. This could be very slow in some cases. Refactor so that total_pages isn't calculated unless it's called. While we're at it, refactor to condense all the sequential vs. numbered pagination logic into one module. This incidentally fixes a couple more bugs: * "page=b0" returned all pages rather than nothing. * Bad parameters like "page=blaha123" and "page=a123blah" were accepted.
65 lines
2.0 KiB
Ruby
65 lines
2.0 KiB
Ruby
require 'test_helper'
|
|
|
|
class PaginatorTest < ActiveSupport::TestCase
|
|
setup do
|
|
@posts = FactoryBot.create_list(:post, 5)
|
|
end
|
|
|
|
context "sequential pagination (before)" do
|
|
should "return the correct set of records" do
|
|
expected_posts = Post.limit(3).order(id: :desc)
|
|
posts = Post.paginate("b9999999", limit: 3)
|
|
|
|
assert_equal(expected_posts.map(&:id), posts.map(&:id))
|
|
end
|
|
|
|
should "return nothing for b0" do
|
|
posts = Post.paginate("b0")
|
|
assert_empty(posts.map(&:id))
|
|
end
|
|
end
|
|
|
|
context "sequential pagination (after)" do
|
|
should "return the correct set of records" do
|
|
expected_posts = Post.limit(3).order(id: :asc).reverse
|
|
posts = Post.paginate("a0", limit: 3)
|
|
|
|
assert_equal(expected_posts.map(&:id), posts.map(&:id))
|
|
end
|
|
end
|
|
|
|
context "numbered pagination" do
|
|
should "return the correct set of records" do
|
|
expected_posts = Post.limit(3).order(id: :desc)
|
|
posts = Post.order(id: :desc).paginate("1", limit: 3)
|
|
|
|
assert_equal(expected_posts.map(&:id), posts.map(&:id))
|
|
end
|
|
|
|
should "raise an error when exceeding the page limit" do
|
|
Danbooru.config.stubs(:max_numbered_pages).returns(5)
|
|
assert_raises(PaginationExtension::PaginationError) do
|
|
Post.paginate(10)
|
|
end
|
|
end
|
|
|
|
should "count pages correctly" do
|
|
assert_equal(5, Post.paginate(1, limit: 1).total_pages)
|
|
assert_equal(3, Post.paginate(1, limit: 2).total_pages)
|
|
assert_equal(2, Post.paginate(1, limit: 3).total_pages)
|
|
assert_equal(2, Post.paginate(1, limit: 4).total_pages)
|
|
assert_equal(1, Post.paginate(1, limit: 5).total_pages)
|
|
end
|
|
|
|
should "detect the first and last page correctly" do
|
|
assert(Post.paginate(0, limit: 1).is_first_page?)
|
|
assert(Post.paginate(1, limit: 1).is_first_page?)
|
|
refute(Post.paginate(1, limit: 1).is_last_page?)
|
|
|
|
refute(Post.paginate(5, limit: 1).is_first_page?)
|
|
assert(Post.paginate(5, limit: 1).is_last_page?)
|
|
assert(Post.paginate(6, limit: 1).is_last_page?)
|
|
end
|
|
end
|
|
end
|