# 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