summaryrefslogtreecommitdiff
path: root/spec/lib/gitlab/multi_collection_paginator_spec.rb
blob: f2049884b834f3bc8a94b12f5a9de89fe426150d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# frozen_string_literal: true

require 'spec_helper'

describe Gitlab::MultiCollectionPaginator do
  subject(:paginator) { described_class.new(Project.all.order(:id), Group.all.order(:id), per_page: 3) }

  it 'combines both collections' do
    project = create(:project)
    group = create(:group)

    expect(paginator.paginate(1)).to eq([project, group])
  end

  it 'includes elements second collection if first collection is empty' do
    group = create(:group)

    expect(paginator.paginate(1)).to eq([group])
  end

  context 'with a full first page' do
    let!(:all_groups) { create_list(:group, 4) }
    let!(:all_projects) { create_list(:project, 4) }

    it 'knows the total count of the collection' do
      expect(paginator.total_count).to eq(8)
    end

    it 'fills the first page with elements of the first collection' do
      expect(paginator.paginate(1)).to eq(all_projects.take(3))
    end

    it 'fils the second page with a mixture of the first & second collection' do
      first_collection_element = all_projects.last
      second_collection_elements = all_groups.take(2)

      expected_collection = [first_collection_element] + second_collection_elements

      expect(paginator.paginate(2)).to eq(expected_collection)
    end

    it 'fils the last page with elements from the second collection' do
      expected_collection = all_groups[-2..-1]

      expect(paginator.paginate(3)).to eq(expected_collection)
    end
  end
end