labels_finder_spec.rb 6.29 KB
Newer Older
1 2 3 4 5 6 7
require 'spec_helper'

describe LabelsFinder do
  describe '#execute' do
    let(:group_1) { create(:group) }
    let(:group_2) { create(:group) }
    let(:group_3) { create(:group) }
Jan Provaznik's avatar
Jan Provaznik committed
8 9
    let(:private_group_1) { create(:group, :private) }
    let(:private_subgroup_1) { create(:group, :private, parent: private_group_1) }
10

11 12 13 14 15
    let(:project_1) { create(:project, namespace: group_1) }
    let(:project_2) { create(:project, namespace: group_2) }
    let(:project_3) { create(:project) }
    let(:project_4) { create(:project, :public) }
    let(:project_5) { create(:project, namespace: group_1) }
16 17 18 19 20 21

    let!(:project_label_1) { create(:label, project: project_1, title: 'Label 1') }
    let!(:project_label_2) { create(:label, project: project_2, title: 'Label 2') }
    let!(:project_label_4) { create(:label, project: project_4, title: 'Label 4') }
    let!(:project_label_5) { create(:label, project: project_5, title: 'Label 5') }

22
    let!(:group_label_1) { create(:group_label, group: group_1, title: 'Label 1 (group)') }
23 24
    let!(:group_label_2) { create(:group_label, group: group_1, title: 'Group Label 2') }
    let!(:group_label_3) { create(:group_label, group: group_2, title: 'Group Label 3') }
Jan Provaznik's avatar
Jan Provaznik committed
25 26
    let!(:private_group_label_1) { create(:group_label, group: private_group_1, title: 'Private Group Label 1') }
    let!(:private_subgroup_label_1) { create(:group_label, group: private_subgroup_1, title: 'Private Sub Group Label 1') }
27 28 29 30 31 32 33

    let(:user) { create(:user) }

    before do
      create(:label, project: project_3, title: 'Label 3')
      create(:group_label, group: group_3, title: 'Group Label 4')

34
      project_1.add_developer(user)
35 36 37 38 39 40 41 42 43 44
    end

    context 'with no filter' do
      it 'returns labels from projects the user have access' do
        group_2.add_developer(user)

        finder = described_class.new(user)

        expect(finder.execute).to eq [group_label_2, group_label_3, project_label_1, group_label_1, project_label_2, project_label_4]
      end
45 46 47 48 49 50 51 52

      it 'returns labels available if nil title is supplied' do
        group_2.add_developer(user)
        # params[:title] will return `nil` regardless whether it is specified
        finder = described_class.new(user, title: nil)

        expect(finder.execute).to eq [group_label_2, group_label_3, project_label_1, group_label_1, project_label_2, project_label_4]
      end
53 54 55
    end

    context 'filtering by group_id' do
56
      it 'returns labels available for any non-archived project within the group' do
57
        group_1.add_developer(user)
58
        project_1.archive!
59 60
        finder = described_class.new(user, group_id: group_1.id)

61
        expect(finder.execute).to eq [group_label_2, group_label_1, project_label_5]
62
      end
63 64 65 66 67 68 69 70 71 72

      context 'when only_group_labels is true' do
        it 'returns only group labels' do
          group_1.add_developer(user)

          finder = described_class.new(user, group_id: group_1.id, only_group_labels: true)

          expect(finder.execute).to eq [group_label_2, group_label_1]
        end
      end
Jan Provaznik's avatar
Jan Provaznik committed
73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91

      context 'when including labels from group ancestors', :nested_groups do
        it 'returns labels from group and its ancestors' do
          private_group_1.add_developer(user)
          private_subgroup_1.add_developer(user)

          finder = described_class.new(user, group_id: private_subgroup_1.id, only_group_labels: true, include_ancestor_groups: true)

          expect(finder.execute).to eq [private_group_label_1, private_subgroup_label_1]
        end

        it 'ignores labels from groups which user can not read' do
          private_subgroup_1.add_developer(user)

          finder = described_class.new(user, group_id: private_subgroup_1.id, only_group_labels: true, include_ancestor_groups: true)

          expect(finder.execute).to eq [private_subgroup_label_1]
        end
      end
92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110

      context 'when including labels from group descendants', :nested_groups do
        it 'returns labels from group and its descendants' do
          private_group_1.add_developer(user)
          private_subgroup_1.add_developer(user)

          finder = described_class.new(user, group_id: private_group_1.id, only_group_labels: true, include_descendant_groups: true)

          expect(finder.execute).to eq [private_group_label_1, private_subgroup_label_1]
        end

        it 'ignores labels from groups which user can not read' do
          private_subgroup_1.add_developer(user)

          finder = described_class.new(user, group_id: private_group_1.id, only_group_labels: true, include_descendant_groups: true)

          expect(finder.execute).to eq [private_subgroup_label_1]
        end
      end
111 112 113 114 115 116 117 118
    end

    context 'filtering by project_id' do
      it 'returns labels available for the project' do
        finder = described_class.new(user, project_id: project_1.id)

        expect(finder.execute).to eq [group_label_2, project_label_1, group_label_1]
      end
119 120 121 122

      context 'as an administrator' do
        it 'does not return labels from another project' do
          # Purposefully creating a project with _nothing_ associated to it
123
          isolated_project = create(:project)
124 125 126 127
          admin = create(:admin)

          # project_3 has a label associated to it, which we don't want coming
          # back when we ask for the isolated project's labels
128
          project_3.add_reporter(admin)
129 130 131 132 133
          finder = described_class.new(admin, project_id: isolated_project.id)

          expect(finder.execute).to be_empty
        end
      end
134 135 136 137 138 139 140 141
    end

    context 'filtering by title' do
      it 'returns label with that title' do
        finder = described_class.new(user, title: 'Group Label 2')

        expect(finder.execute).to eq [group_label_2]
      end
142

143 144 145 146 147 148
      it 'returns label with title alias' do
        finder = described_class.new(user, name: 'Group Label 2')

        expect(finder.execute).to eq [group_label_2]
      end

149
      it 'returns no labels if empty title is supplied' do
150 151 152 153
        finder = described_class.new(user, title: [])

        expect(finder.execute).to be_empty
      end
154

155 156 157 158 159 160 161
      it 'returns no labels if blank title is supplied' do
        finder = described_class.new(user, title: '')

        expect(finder.execute).to be_empty
      end

      it 'returns no labels if empty name is supplied' do
162 163 164 165
        finder = described_class.new(user, name: [])

        expect(finder.execute).to be_empty
      end
166 167 168
    end
  end
end