debian-mirror-gitlab/elasticsearch-model/spec/elasticsearch/model/adapters/active_record/pagination_spec.rb
2020-03-13 15:44:24 +05:30

315 lines
6.9 KiB
Ruby

require 'spec_helper'
describe 'Elasticsearch::Model::Adapter::ActiveRecord Pagination' do
before(:all) do
ActiveRecord::Schema.define(:version => 1) do
create_table ArticleForPagination.table_name do |t|
t.string :title
t.datetime :created_at, :default => 'NOW()'
t.boolean :published
end
end
Kaminari::Hooks.init if defined?(Kaminari::Hooks)
ArticleForPagination.__elasticsearch__.create_index! force: true
68.times do |i|
ArticleForPagination.create! title: "Test #{i}", published: (i % 2 == 0)
end
ArticleForPagination.import
ArticleForPagination.__elasticsearch__.refresh_index!
end
context 'when no other page is specified' do
let(:records) do
ArticleForPagination.search('title:test').page(1).records
end
describe '#size' do
it 'returns the correct size' do
expect(records.size).to eq(25)
end
end
describe '#current_page' do
it 'returns the correct current page' do
expect(records.current_page).to eq(1)
end
end
describe '#prev_page' do
it 'returns the correct previous page' do
expect(records.prev_page).to be_nil
end
end
describe '#next_page' do
it 'returns the correct next page' do
expect(records.next_page).to eq(2)
end
end
describe '#total_pages' do
it 'returns the correct total pages' do
expect(records.total_pages).to eq(3)
end
end
describe '#first_page?' do
it 'returns the correct first page' do
expect(records.first_page?).to be(true)
end
end
describe '#last_page?' do
it 'returns the correct last page' do
expect(records.last_page?).to be(false)
end
end
describe '#out_of_range?' do
it 'returns whether the pagination is out of range' do
expect(records.out_of_range?).to be(false)
end
end
end
context 'when a specific page is specified' do
let(:records) do
ArticleForPagination.search('title:test').page(2).records
end
describe '#size' do
it 'returns the correct size' do
expect(records.size).to eq(25)
end
end
describe '#current_page' do
it 'returns the correct current page' do
expect(records.current_page).to eq(2)
end
end
describe '#prev_page' do
it 'returns the correct previous page' do
expect(records.prev_page).to eq(1)
end
end
describe '#next_page' do
it 'returns the correct next page' do
expect(records.next_page).to eq(3)
end
end
describe '#total_pages' do
it 'returns the correct total pages' do
expect(records.total_pages).to eq(3)
end
end
describe '#first_page?' do
it 'returns the correct first page' do
expect(records.first_page?).to be(false)
end
end
describe '#last_page?' do
it 'returns the correct last page' do
expect(records.last_page?).to be(false)
end
end
describe '#out_of_range?' do
it 'returns whether the pagination is out of range' do
expect(records.out_of_range?).to be(false)
end
end
end
context 'when a the last page is specified' do
let(:records) do
ArticleForPagination.search('title:test').page(3).records
end
describe '#size' do
it 'returns the correct size' do
expect(records.size).to eq(18)
end
end
describe '#current_page' do
it 'returns the correct current page' do
expect(records.current_page).to eq(3)
end
end
describe '#prev_page' do
it 'returns the correct previous page' do
expect(records.prev_page).to eq(2)
end
end
describe '#next_page' do
it 'returns the correct next page' do
expect(records.next_page).to be_nil
end
end
describe '#total_pages' do
it 'returns the correct total pages' do
expect(records.total_pages).to eq(3)
end
end
describe '#first_page?' do
it 'returns the correct first page' do
expect(records.first_page?).to be(false)
end
end
describe '#last_page?' do
it 'returns the correct last page' do
expect(records.last_page?).to be(true)
end
end
describe '#out_of_range?' do
it 'returns whether the pagination is out of range' do
expect(records.out_of_range?).to be(false)
end
end
end
context 'when an invalid page is specified' do
let(:records) do
ArticleForPagination.search('title:test').page(6).records
end
describe '#size' do
it 'returns the correct size' do
expect(records.size).to eq(0)
end
end
describe '#current_page' do
it 'returns the correct current page' do
expect(records.current_page).to eq(6)
end
end
describe '#next_page' do
it 'returns the correct next page' do
expect(records.next_page).to be_nil
end
end
describe '#total_pages' do
it 'returns the correct total pages' do
expect(records.total_pages).to eq(3)
end
end
describe '#first_page?' do
it 'returns the correct first page' do
expect(records.first_page?).to be(false)
end
end
describe '#last_page?' do
it 'returns whether it is the last page', if: !(Kaminari::VERSION < '1') do
expect(records.last_page?).to be(false)
end
it 'returns whether it is the last page', if: Kaminari::VERSION < '1' do
expect(records.last_page?).to be(true) # Kaminari returns current_page >= total_pages in version < 1.0
end
end
describe '#out_of_range?' do
it 'returns whether the pagination is out of range' do
expect(records.out_of_range?).to be(true)
end
end
end
context 'when a scope is also specified' do
let(:records) do
ArticleForPagination.search('title:test').page(2).records.published
end
describe '#size' do
it 'returns the correct size' do
expect(records.size).to eq(12)
end
end
end
context 'when a sorting is specified' do
let(:search) do
ArticleForPagination.search({ query: { match: { title: 'test' } }, sort: [ { id: 'desc' } ] })
end
it 'applies the sort' do
expect(search.page(2).records.first.id).to eq(43)
expect(search.page(3).records.first.id).to eq(18)
expect(search.page(2).per(5).records.first.id).to eq(63)
end
end
context 'when the model has a specific default per page set' do
around do |example|
original_default = ArticleForPagination.instance_variable_get(:@_default_per_page)
ArticleForPagination.paginates_per 50
example.run
ArticleForPagination.paginates_per original_default
end
it 'uses the default per page setting' do
expect(ArticleForPagination.search('*').page(1).records.size).to eq(50)
end
end
end