# frozen_string_literal: true

require 'spec_helper'

RSpec.describe Gitlab::PaginationDelegate do
  context 'no data' do
    let(:delegate) do
      described_class.new(page: 1,
                          per_page: 10,
                          count: 0)
    end

    it 'shows the correct total count' do
      expect(delegate.total_count).to eq(0)
    end

    it 'shows the correct total pages' do
      expect(delegate.total_pages).to eq(0)
    end

    it 'shows the correct next page' do
      expect(delegate.next_page).to be_nil
    end

    it 'shows the correct previous page' do
      expect(delegate.prev_page).to be_nil
    end

    it 'shows the correct current page' do
      expect(delegate.current_page).to eq(1)
    end

    it 'shows the correct limit value' do
      expect(delegate.limit_value).to eq(10)
    end

    it 'shows the correct first page' do
      expect(delegate.first_page?).to be true
    end

    it 'shows the correct last page' do
      expect(delegate.last_page?).to be true
    end

    it 'shows the correct offset' do
      expect(delegate.offset).to eq(0)
    end
  end

  context 'with data' do
    let(:delegate) do
      described_class.new(page: 5,
                          per_page: 100,
                          count: 1000)
    end

    it 'shows the correct total count' do
      expect(delegate.total_count).to eq(1000)
    end

    it 'shows the correct total pages' do
      expect(delegate.total_pages).to eq(10)
    end

    it 'shows the correct next page' do
      expect(delegate.next_page).to eq(6)
    end

    it 'shows the correct previous page' do
      expect(delegate.prev_page).to eq(4)
    end

    it 'shows the correct current page' do
      expect(delegate.current_page).to eq(5)
    end

    it 'shows the correct limit value' do
      expect(delegate.limit_value).to eq(100)
    end

    it 'shows the correct first page' do
      expect(delegate.first_page?).to be false
    end

    it 'shows the correct last page' do
      expect(delegate.last_page?).to be false
    end

    it 'shows the correct offset' do
      expect(delegate.offset).to eq(400)
    end
  end

  context 'last page' do
    let(:delegate) do
      described_class.new(page: 10,
                          per_page: 100,
                          count: 1000)
    end

    it 'shows the correct total count' do
      expect(delegate.total_count).to eq(1000)
    end

    it 'shows the correct total pages' do
      expect(delegate.total_pages).to eq(10)
    end

    it 'shows the correct next page' do
      expect(delegate.next_page).to be_nil
    end

    it 'shows the correct previous page' do
      expect(delegate.prev_page).to eq(9)
    end

    it 'shows the correct current page' do
      expect(delegate.current_page).to eq(10)
    end

    it 'shows the correct limit value' do
      expect(delegate.limit_value).to eq(100)
    end

    it 'shows the correct first page' do
      expect(delegate.first_page?).to be false
    end

    it 'shows the correct last page' do
      expect(delegate.last_page?).to be true
    end

    it 'shows the correct offset' do
      expect(delegate.offset).to eq(900)
    end
  end

  context 'limits and defaults' do
    it 'has a maximum limit per page' do
      expect(described_class.new(page: nil,
                                 per_page: 1000,
                                 count: 0).limit_value).to eq(described_class::MAX_PER_PAGE)
    end

    it 'has a default per page' do
      expect(described_class.new(page: nil,
                                 per_page: nil,
                                 count: 0).limit_value).to eq(described_class::DEFAULT_PER_PAGE)
    end

    it 'has a maximum page' do
      expect(described_class.new(page: 100,
                                 per_page: 10,
                                 count: 1).current_page).to eq(1)
    end
  end
end
