130 lines
3 KiB
Ruby
130 lines
3 KiB
Ruby
|
# frozen_string_literal: true
|
||
|
|
||
|
require 'spec_helper'
|
||
|
|
||
|
RSpec.describe Projects::BlameService, :aggregate_failures do
|
||
|
subject(:service) { described_class.new(blob, commit, params) }
|
||
|
|
||
|
let_it_be(:project) { create(:project, :repository) }
|
||
|
let_it_be(:commit) { project.repository.commit }
|
||
|
let_it_be(:blob) { project.repository.blob_at('HEAD', 'README.md') }
|
||
|
|
||
|
let(:params) { { page: page } }
|
||
|
let(:page) { nil }
|
||
|
|
||
|
before do
|
||
|
stub_const("#{described_class.name}::PER_PAGE", 2)
|
||
|
end
|
||
|
|
||
|
describe '#blame' do
|
||
|
subject { service.blame }
|
||
|
|
||
|
it 'returns a correct Gitlab::Blame object' do
|
||
|
is_expected.to be_kind_of(Gitlab::Blame)
|
||
|
|
||
|
expect(subject.blob).to eq(blob)
|
||
|
expect(subject.commit).to eq(commit)
|
||
|
expect(subject.range).to eq(1..2)
|
||
|
end
|
||
|
|
||
|
describe 'Pagination range calculation' do
|
||
|
subject { service.blame.range }
|
||
|
|
||
|
context 'with page = 1' do
|
||
|
let(:page) { 1 }
|
||
|
|
||
|
it { is_expected.to eq(1..2) }
|
||
|
end
|
||
|
|
||
|
context 'with page = 2' do
|
||
|
let(:page) { 2 }
|
||
|
|
||
|
it { is_expected.to eq(3..4) }
|
||
|
end
|
||
|
|
||
|
context 'with page = 3 (overlimit)' do
|
||
|
let(:page) { 3 }
|
||
|
|
||
|
it { is_expected.to eq(1..2) }
|
||
|
end
|
||
|
|
||
|
context 'with page = 0 (incorrect)' do
|
||
|
let(:page) { 0 }
|
||
|
|
||
|
it { is_expected.to eq(1..2) }
|
||
|
end
|
||
|
|
||
|
context 'when feature flag disabled' do
|
||
|
before do
|
||
|
stub_feature_flags(blame_page_pagination: false)
|
||
|
end
|
||
|
|
||
|
it { is_expected.to be_nil }
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
describe '#pagination' do
|
||
|
subject { service.pagination }
|
||
|
|
||
|
it 'returns a pagination object' do
|
||
|
is_expected.to be_kind_of(Kaminari::PaginatableArray)
|
||
|
|
||
|
expect(subject.current_page).to eq(1)
|
||
|
expect(subject.total_pages).to eq(2)
|
||
|
expect(subject.total_count).to eq(4)
|
||
|
end
|
||
|
|
||
|
context 'when feature flag disabled' do
|
||
|
before do
|
||
|
stub_feature_flags(blame_page_pagination: false)
|
||
|
end
|
||
|
|
||
|
it { is_expected.to be_nil }
|
||
|
end
|
||
|
|
||
|
context 'when per_page is above the global max per page limit' do
|
||
|
before do
|
||
|
stub_const("#{described_class.name}::PER_PAGE", 1000)
|
||
|
allow(blob).to receive_message_chain(:data, :lines, :count) { 500 }
|
||
|
end
|
||
|
|
||
|
it 'returns a correct pagination object' do
|
||
|
is_expected.to be_kind_of(Kaminari::PaginatableArray)
|
||
|
|
||
|
expect(subject.current_page).to eq(1)
|
||
|
expect(subject.total_pages).to eq(1)
|
||
|
expect(subject.total_count).to eq(500)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
describe 'Current page' do
|
||
|
subject { service.pagination.current_page }
|
||
|
|
||
|
context 'with page = 1' do
|
||
|
let(:page) { 1 }
|
||
|
|
||
|
it { is_expected.to eq(1) }
|
||
|
end
|
||
|
|
||
|
context 'with page = 2' do
|
||
|
let(:page) { 2 }
|
||
|
|
||
|
it { is_expected.to eq(2) }
|
||
|
end
|
||
|
|
||
|
context 'with page = 3 (overlimit)' do
|
||
|
let(:page) { 3 }
|
||
|
|
||
|
it { is_expected.to eq(1) }
|
||
|
end
|
||
|
|
||
|
context 'with page = 0 (incorrect)' do
|
||
|
let(:page) { 0 }
|
||
|
|
||
|
it { is_expected.to eq(1) }
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|