require 'spec_helper'

RSpec.describe(Jekyll::Paginate::Pager) do

  it "calculate number of pages" do
    expect(described_class.calculate_pages([], '2')).to eql(0)
    expect(described_class.calculate_pages([1], '2')).to eql(1)
    expect(described_class.calculate_pages([1,2], '2')).to eql(1)
    expect(described_class.calculate_pages([1,2,3], '2')).to eql(2)
    expect(described_class.calculate_pages([1,2,3,4], '2')).to eql(2)
    expect(described_class.calculate_pages([1,2,3,4,5], '2')).to eql(3)
  end

  context "with the default paginate_path" do
    let(:site) { build_site }

    it "determines the correct pagination path for each page" do
      if Jekyll::VERSION < '3.0.0'
        expect(described_class.paginate_path(site, 1)).to eql("/index.html")
      else
        expect(described_class.paginate_path(site, 1)).to eql("/")
      end

      expect(described_class.paginate_path(site, 2)).to eql("/page2")
    end
  end

  context "with paginate_path set to a subdirectory with no index.html" do
    let(:site) { build_site({'paginate_path' => '/blog/page-:num'}) }

    it "determines the correct pagination path for each page" do
      if Jekyll::VERSION < '3.0.0'
        expect(described_class.paginate_path(site, 1)).to eql("/index.html")
      else
        expect(described_class.paginate_path(site, 1)).to eql("/")
      end

      expect(described_class.paginate_path(site, 2)).to eql("/blog/page-2")
    end
  end

  context "with paginate_path set to a subdirectory with no index.html with num pages being in subdirectories" do
    let(:site) { build_site({'paginate_path' => '/blog/page/:num'}) }

    it "determines the correct pagination path for each page" do
      if Jekyll::VERSION < '3.0.0'
        expect(described_class.paginate_path(site, 1)).to eql("/index.html")
      else
        expect(described_class.paginate_path(site, 1)).to eql("/")
      end

      expect(described_class.paginate_path(site, 2)).to eql("/blog/page/2")
    end
  end

  context "with paginate_path set to a subdirectory wherein an index.html exists" do
    let(:site) { build_site({'paginate_path' => '/contacts/page:num'}) }

    it "determines the correct pagination path for each page" do
      if Jekyll::VERSION < '3.0.0'
        expect(described_class.paginate_path(site, 1)).to eql("/contacts/index.html")
      else
        expect(described_class.paginate_path(site, 1)).to eql("/contacts/")
      end

      expect(described_class.paginate_path(site, 2)).to eql("/contacts/page2")
    end
  end

  context "with paginate_path set to a subdir wherein an index.html exists with pages in subdirs" do
    let(:site) { build_site({'paginate_path' => '/contacts/page/:num'}) }

    it "determines the correct pagination path for each page" do
      if Jekyll::VERSION < '3.0.0'
        expect(described_class.paginate_path(site, 1)).to eql("/contacts/index.html")
      else
        expect(described_class.paginate_path(site, 1)).to eql("/contacts/")
      end

      expect(described_class.paginate_path(site, 2)).to eql("/contacts/page/2")
    end
  end

  context "with an paginate_path devoid of :num" do
    let(:site) { build_site({'paginate_path' => '/blog/page'}) }

    it "determines the correct pagination path for each page" do
      expect(-> { described_class.paginate_path(site, 1) }).to raise_error
    end
  end

  context "pagination disabled" do
    let(:site) { build_site('paginate' => nil) }

    it "report that pagination is disabled" do
      expect(described_class.pagination_enabled?(site)).to be_falsey
    end
  end

  context "pagination enabled for 2" do
    let(:site)  { build_site('paginate' => 2) }
    if Jekyll::VERSION < '3.0.0'
      let(:posts) { site.posts }
    else
      let(:posts) { site.posts.docs }
    end

    it "report that pagination is enabled" do
      expect(described_class.pagination_enabled?(site)).to be_truthy
    end
  
    context "with 4 posts" do
      if Jekyll::VERSION < '3.0.0'
        let(:posts) { site.posts[1..4] }
      else
        let(:posts) { site.posts.docs[1..4] }
      end
  
      it "create first pager" do
        pager = described_class.new(site, 1, posts)
        expect(pager.posts.size).to eql(2)
        expect(pager.total_pages).to eql(2)
        expect(pager.previous_page).to be_nil
        expect(pager.next_page).to eql(2)
      end
  
      it "create second pager" do
        pager = described_class.new(site, 2, posts)
        expect(pager.posts.size).to eql(2)
        expect(pager.total_pages).to eql(2)
        expect(pager.previous_page).to eql(1)
        expect(pager.next_page).to be_nil
      end
  
      it "not create third pager" do
        expect { described_class.new(site, 3, posts) }.to raise_error
      end
    end

    context "with 5 posts" do
      if Jekyll::VERSION < '3.0.0'
        let(:posts) { site.posts[1..5] }
      else
        let(:posts) { site.posts.docs[1..5] }
      end
  
      it "create first pager" do
        pager = described_class.new(site, 1, posts)
        expect(pager.posts.size).to eql(2)
        expect(pager.total_pages).to eql(3)
        expect(pager.previous_page).to be_nil
        expect(pager.next_page).to eql(2)
      end
  
      it "create second pager" do
        pager = described_class.new(site, 2, posts)
        expect(pager.posts.size).to eql(2)
        expect(pager.total_pages).to eql(3)
        expect(pager.previous_page).to eql(1)
        expect(pager.next_page).to eql(3)
      end
  
      it "create third pager" do
        pager = described_class.new(site, 3, posts)
        expect(pager.posts.size).to eql(1)
        expect(pager.total_pages).to eql(3)
        expect(pager.previous_page).to eql(2)
        expect(pager.next_page).to be_nil
      end
  
      it "not create fourth pager" do
        expect { described_class.new(site, 4, posts) }.to raise_error(RuntimeError)
      end

    end
  end

end
