debian-mirror-gitlab/elasticsearch-model/spec/elasticsearch/model/response/pagination/will_paginate_spec.rb
2020-03-13 15:44:24 +05:30

262 lines
6.1 KiB
Ruby

require 'spec_helper'
describe 'Elasticsearch::Model::Response::Response WillPaginate' do
before(:all) do
class ModelClass
def self.index_name; 'foo'; end
def self.document_type; 'bar'; end
def self.per_page
33
end
end
# Subclass Response so we can include WillPaginate module without conflicts with Kaminari.
class WillPaginateResponse < Elasticsearch::Model::Response::Response
include Elasticsearch::Model::Response::Pagination::WillPaginate
end
end
after(:all) do
remove_classes(ModelClass, WillPaginateResponse)
end
let(:response_document) do
{ 'took' => '5', 'timed_out' => false, '_shards' => {'one' => 'OK'},
'hits' => { 'total' => 100, 'hits' => (1..100).to_a.map { |i| { _id: i } } } }
end
let(:search) do
Elasticsearch::Model::Searching::SearchRequest.new(model, '*')
end
let(:response) do
allow(model).to receive(:client).and_return(client)
WillPaginateResponse.new(model, search, response_document).tap do |resp|
allow(resp).to receive(:client).and_return(client)
end
end
let(:client) do
double('client')
end
shared_examples_for 'a search request that can be paginated' do
describe '#offset' do
context 'when per_page and page are set' do
before do
response.per_page(3).page(3)
end
it 'sets the correct offset' do
expect(response.offset).to eq(6)
end
end
end
describe '#length' do
context 'when per_page and page are set' do
before do
response.per_page(3).page(3)
end
it 'sets the correct offset' do
expect(response.length).to eq(3)
end
end
end
describe '#paginate' do
context 'when there are no settings' do
context 'when page is set to nil' do
before do
response.paginate(page: nil)
end
it 'uses the defaults' do
expect(response.search.definition[:size]).to eq(default_per_page)
expect(response.search.definition[:from]).to eq(0)
end
end
context 'when page is set to a value' do
before do
response.paginate(page: 2)
end
it 'uses the defaults' do
expect(response.search.definition[:size]).to eq(default_per_page)
expect(response.search.definition[:from]).to eq(default_per_page)
end
end
context 'when a custom page and per_page is set' do
before do
response.paginate(page: 3, per_page: 9)
end
it 'uses the custom values' do
expect(response.search.definition[:size]).to eq(9)
expect(response.search.definition[:from]).to eq(18)
end
end
context 'fall back to first page if invalid value is provided' do
before do
response.paginate(page: -1)
end
it 'uses the custom values' do
expect(response.search.definition[:size]).to eq(default_per_page)
expect(response.search.definition[:from]).to eq(0)
end
end
end
end
describe '#page' do
context 'when a value is provided for page' do
before do
response.page(5)
end
it 'calculates the correct :size and :from' do
expect(response.search.definition[:size]).to eq(default_per_page)
expect(response.search.definition[:from]).to eq(default_per_page * 4)
end
end
context 'when a value is provided for page and per_page' do
before do
response.page(5).per_page(3)
end
it 'calculates the correct :size and :from' do
expect(response.search.definition[:size]).to eq(3)
expect(response.search.definition[:from]).to eq(12)
end
end
context 'when a value is provided for per_page and page' do
before do
response.per_page(3).page(5)
end
it 'calculates the correct :size and :from' do
expect(response.search.definition[:size]).to eq(3)
expect(response.search.definition[:from]).to eq(12)
end
end
end
describe '#current_page' do
context 'when no values are set' do
before do
response.paginate({})
end
it 'returns the first page' do
expect(response.current_page).to eq(1)
end
end
context 'when values are provided for per_page and page' do
before do
response.paginate(page: 3, per_page: 9)
end
it 'calculates the correct current page' do
expect(response.current_page).to eq(3)
end
end
context 'when #paginate has not been called on the response' do
it 'returns nil' do
expect(response.current_page).to be_nil
end
end
end
describe '#per_page' do
context 'when a value is set via the #paginate method' do
before do
response.paginate(per_page: 8)
end
it 'returns the per_page value' do
expect(response.per_page).to eq(8)
end
end
context 'when a value is set via the #per_page method' do
before do
response.per_page(8)
end
it 'returns the per_page value' do
expect(response.per_page).to eq(8)
end
end
end
describe '#total_entries' do
before do
allow(response).to receive(:results).and_return(double('results', total: 100))
end
it 'returns the total results' do
expect(response.total_entries).to eq(100)
end
end
end
context 'when the model is a single one' do
let(:model) do
ModelClass
end
let(:default_per_page) do
33
end
it_behaves_like 'a search request that can be paginated'
end
context 'when the model is a multimodel' do
let(:model) do
Elasticsearch::Model::Multimodel.new(ModelClass)
end
let(:default_per_page) do
::WillPaginate.per_page
end
it_behaves_like 'a search request that can be paginated'
end
end