gitlab-org--gitlab-foss/spec/lib/bitbucket_server/paginator_spec.rb
Stan Hu a06b7a7d5d Fix Bitbucket Server import only including first 25 pull requests
The change to paginate repos in
https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/22825 caused the
paginator to stop after 25 pull requests because the limit was set to 25
if none was defined. To fix this, we should only stop if the limit has
actually been set and use the limit parameter to determine the maximum
number of items to process per page.

Closes https://gitlab.com/gitlab-org/gitlab-ce/issues/55914
2019-01-06 21:13:00 -08:00

56 lines
2.3 KiB
Ruby

require 'spec_helper'
describe BitbucketServer::Paginator do
let(:last_page) { double(:page, next?: false, items: ['item_2']) }
let(:first_page) { double(:page, next?: true, next: last_page, items: ['item_1']) }
let(:connection) { instance_double(BitbucketServer::Connection) }
describe '#items' do
let(:paginator) { described_class.new(connection, 'http://more-data', :pull_request) }
let(:page_attrs) { { 'isLastPage' => false, 'nextPageStart' => 1 } }
it 'returns items and raises StopIteration in the end' do
allow(paginator).to receive(:fetch_next_page).and_return(first_page)
expect(paginator.items).to match(['item_1'])
allow(paginator).to receive(:fetch_next_page).and_return(last_page)
expect(paginator.items).to match(['item_2'])
allow(paginator).to receive(:fetch_next_page).and_return(nil)
expect { paginator.items }.to raise_error(StopIteration)
end
it 'obeys limits' do
limited = described_class.new(connection, 'http://more-data', :pull_request, page_offset: 0, limit: 1)
allow(limited).to receive(:fetch_next_page).and_return(first_page)
expect(limited.has_next_page?).to be_truthy
expect(limited.items).to match(['item_1'])
expect(limited.has_next_page?).to be_truthy
expect { limited.items }.to raise_error(StopIteration)
end
it 'does not stop if limit is unspecified' do
stub_const("BitbucketServer::Paginator::PAGE_LENGTH", 1)
paginator = described_class.new(connection, 'http://more-data', :pull_request, page_offset: 0, limit: nil)
allow(paginator).to receive(:fetch_next_page).and_return(first_page, last_page)
expect(paginator.has_next_page?).to be_truthy
expect(paginator.items).to match(['item_1'])
expect(paginator.has_next_page?).to be_truthy
expect(paginator.items).to match(['item_2'])
end
it 'calls the connection with different offsets' do
expect(connection).to receive(:get).with('http://more-data', start: 0, limit: BitbucketServer::Paginator::PAGE_LENGTH).and_return(page_attrs)
expect(paginator.items).to eq([])
expect(connection).to receive(:get).with('http://more-data', start: 1, limit: BitbucketServer::Paginator::PAGE_LENGTH).and_return({})
expect(paginator.items).to eq([])
expect { paginator.items }.to raise_error(StopIteration)
end
end
end