316 lines
6.9 KiB
Ruby
316 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
|