search_service_spec.rb 8.2 KB
Newer Older
1 2
require 'spec_helper'

3
describe SearchService do
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
4
  let(:user) { create(:user) }
5

Dongqing Hu's avatar
Dongqing Hu committed
6 7 8 9
  let(:accessible_group) { create(:group, :private) }
  let(:inaccessible_group) { create(:group, :private) }
  let!(:group_member) { create(:group_member, group: accessible_group, user: user) }

10 11
  let!(:accessible_project) { create(:project, :private, name: 'accessible_project') }
  let!(:inaccessible_project) { create(:project, :private, name: 'inaccessible_project') }
Dongqing Hu's avatar
Dongqing Hu committed
12 13 14
  let(:note) { create(:note_on_issue, project: accessible_project) }

  let(:snippet) { create(:snippet, author: user) }
15 16
  let(:group_project) { create(:project, group: accessible_group, name: 'group_project') }
  let(:public_project) { create(:project, :public, name: 'public_project') }
17

Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
18
  before do
19
    accessible_project.add_maintainer(user)
Dongqing Hu's avatar
Dongqing Hu committed
20 21 22 23 24
  end

  describe '#project' do
    context 'when the project is accessible' do
      it 'returns the project' do
25
        project = described_class.new(user, project_id: accessible_project.id).project
Dongqing Hu's avatar
Dongqing Hu committed
26 27 28

        expect(project).to eq accessible_project
      end
29 30

      it 'returns the project for guests' do
31
        search_project = create :project
32
        search_project.add_guest(user)
33

34
        project = described_class.new(user, project_id: search_project.id).project
35 36 37

        expect(project).to eq search_project
      end
Dongqing Hu's avatar
Dongqing Hu committed
38 39 40 41
    end

    context 'when the project is not accessible' do
      it 'returns nil' do
42
        project = described_class.new(user, project_id: inaccessible_project.id).project
Dongqing Hu's avatar
Dongqing Hu committed
43 44 45 46 47 48 49

        expect(project).to be_nil
      end
    end

    context 'when there is no project_id' do
      it 'returns nil' do
50
        project = described_class.new(user).project
Dongqing Hu's avatar
Dongqing Hu committed
51 52 53 54

        expect(project).to be_nil
      end
    end
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
55
  end
56

Dongqing Hu's avatar
Dongqing Hu committed
57 58 59
  describe '#group' do
    context 'when the group is accessible' do
      it 'returns the group' do
60
        group = described_class.new(user, group_id: accessible_group.id).group
Dongqing Hu's avatar
Dongqing Hu committed
61 62

        expect(group).to eq accessible_group
63
      end
64 65
    end

Dongqing Hu's avatar
Dongqing Hu committed
66 67
    context 'when the group is not accessible' do
      it 'returns nil' do
68
        group = described_class.new(user, group_id: inaccessible_group.id).group
Dongqing Hu's avatar
Dongqing Hu committed
69 70

        expect(group).to be_nil
71
      end
Dongqing Hu's avatar
Dongqing Hu committed
72 73 74 75
    end

    context 'when there is no group_id' do
      it 'returns nil' do
76
        group = described_class.new(user).group
77

Dongqing Hu's avatar
Dongqing Hu committed
78
        expect(group).to be_nil
79
      end
Dongqing Hu's avatar
Dongqing Hu committed
80 81 82 83 84 85
    end
  end

  describe '#show_snippets?' do
    context 'when :snippets is \'true\'' do
      it 'returns true' do
86
        show_snippets = described_class.new(user, snippets: 'true').show_snippets?
87

Dongqing Hu's avatar
Dongqing Hu committed
88
        expect(show_snippets).to be_truthy
89
      end
Dongqing Hu's avatar
Dongqing Hu committed
90
    end
91

Dongqing Hu's avatar
Dongqing Hu committed
92 93
    context 'when :snippets is not \'true\'' do
      it 'returns false' do
94
        show_snippets = described_class.new(user, snippets: 'tru').show_snippets?
Dongqing Hu's avatar
Dongqing Hu committed
95 96 97 98

        expect(show_snippets).to be_falsey
      end
    end
99

Dongqing Hu's avatar
Dongqing Hu committed
100 101
    context 'when :snippets is missing' do
      it 'returns false' do
102
        show_snippets = described_class.new(user).show_snippets?
103

Dongqing Hu's avatar
Dongqing Hu committed
104 105 106 107 108 109 110 111 112
        expect(show_snippets).to be_falsey
      end
    end
  end

  describe '#scope' do
    context 'with accessible project_id' do
      context 'and allowed scope' do
        it 'returns the specified scope' do
113
          scope = described_class.new(user, project_id: accessible_project.id, scope: 'notes').scope
Dongqing Hu's avatar
Dongqing Hu committed
114 115

          expect(scope).to eq 'notes'
116
        end
Dongqing Hu's avatar
Dongqing Hu committed
117 118 119 120
      end

      context 'and disallowed scope' do
        it 'returns the default scope' do
121
          scope = described_class.new(user, project_id: accessible_project.id, scope: 'projects').scope
122

Dongqing Hu's avatar
Dongqing Hu committed
123
          expect(scope).to eq 'blobs'
124 125
        end
      end
Dongqing Hu's avatar
Dongqing Hu committed
126 127 128

      context 'and no scope' do
        it 'returns the default scope' do
129
          scope = described_class.new(user, project_id: accessible_project.id).scope
Dongqing Hu's avatar
Dongqing Hu committed
130 131 132 133 134 135 136 137 138

          expect(scope).to eq 'blobs'
        end
      end
    end

    context 'with \'true\' snippets' do
      context 'and allowed scope' do
        it 'returns the specified scope' do
139
          scope = described_class.new(user, snippets: 'true', scope: 'snippet_titles').scope
Dongqing Hu's avatar
Dongqing Hu committed
140 141 142 143 144 145 146

          expect(scope).to eq 'snippet_titles'
        end
      end

      context 'and disallowed scope' do
        it 'returns the default scope' do
147
          scope = described_class.new(user, snippets: 'true', scope: 'projects').scope
Dongqing Hu's avatar
Dongqing Hu committed
148 149 150 151 152 153 154

          expect(scope).to eq 'snippet_blobs'
        end
      end

      context 'and no scope' do
        it 'returns the default scope' do
155
          scope = described_class.new(user, snippets: 'true').scope
Dongqing Hu's avatar
Dongqing Hu committed
156 157 158 159 160 161 162 163 164

          expect(scope).to eq 'snippet_blobs'
        end
      end
    end

    context 'with no project_id, no snippets' do
      context 'and allowed scope' do
        it 'returns the specified scope' do
165
          scope = described_class.new(user, scope: 'issues').scope
Dongqing Hu's avatar
Dongqing Hu committed
166 167 168 169 170 171 172

          expect(scope).to eq 'issues'
        end
      end

      context 'and disallowed scope' do
        it 'returns the default scope' do
173
          scope = described_class.new(user, scope: 'blobs').scope
Dongqing Hu's avatar
Dongqing Hu committed
174 175 176 177 178 179 180

          expect(scope).to eq 'projects'
        end
      end

      context 'and no scope' do
        it 'returns the default scope' do
181
          scope = described_class.new(user).scope
Dongqing Hu's avatar
Dongqing Hu committed
182 183 184 185 186 187 188 189 190 191

          expect(scope).to eq 'projects'
        end
      end
    end
  end

  describe '#search_results' do
    context 'with accessible project_id' do
      it 'returns an instance of Gitlab::ProjectSearchResults' do
192
        search_results = described_class.new(
Dongqing Hu's avatar
Dongqing Hu committed
193 194 195 196 197 198 199 200 201 202 203
          user,
          project_id: accessible_project.id,
          scope: 'notes',
          search: note.note).search_results

        expect(search_results).to be_a Gitlab::ProjectSearchResults
      end
    end

    context 'with accessible project_id and \'true\' snippets' do
      it 'returns an instance of Gitlab::ProjectSearchResults' do
204
        search_results = described_class.new(
Dongqing Hu's avatar
Dongqing Hu committed
205 206 207 208 209 210 211 212 213 214 215 216
          user,
          project_id: accessible_project.id,
          snippets: 'true',
          scope: 'notes',
          search: note.note).search_results

        expect(search_results).to be_a Gitlab::ProjectSearchResults
      end
    end

    context 'with \'true\' snippets' do
      it 'returns an instance of Gitlab::SnippetSearchResults' do
217
        search_results = described_class.new(
Dongqing Hu's avatar
Dongqing Hu committed
218 219 220 221 222 223 224 225 226 227
          user,
          snippets: 'true',
          search: snippet.content).search_results

        expect(search_results).to be_a Gitlab::SnippetSearchResults
      end
    end

    context 'with no project_id and no snippets' do
      it 'returns an instance of Gitlab::SearchResults' do
228
        search_results = described_class.new(
Dongqing Hu's avatar
Dongqing Hu committed
229 230 231 232 233 234 235 236 237 238 239
          user,
          search: public_project.name).search_results

        expect(search_results).to be_a Gitlab::SearchResults
      end
    end
  end

  describe '#search_objects' do
    context 'with accessible project_id' do
      it 'returns objects in the project' do
240
        search_objects = described_class.new(
Dongqing Hu's avatar
Dongqing Hu committed
241 242 243 244 245 246 247 248 249 250 251
          user,
          project_id: accessible_project.id,
          scope: 'notes',
          search: note.note).search_objects

        expect(search_objects.first).to eq note
      end
    end

    context 'with accessible project_id and \'true\' snippets' do
      it 'returns objects in the project' do
252
        search_objects = described_class.new(
Dongqing Hu's avatar
Dongqing Hu committed
253 254 255 256 257 258 259 260 261 262 263 264
          user,
          project_id: accessible_project.id,
          snippets: 'true',
          scope: 'notes',
          search: note.note).search_objects

        expect(search_objects.first).to eq note
      end
    end

    context 'with \'true\' snippets' do
      it 'returns objects in snippets' do
265
        search_objects = described_class.new(
Dongqing Hu's avatar
Dongqing Hu committed
266 267 268 269 270 271 272 273 274 275
          user,
          snippets: 'true',
          search: snippet.content).search_objects

        expect(search_objects.first).to eq snippet
      end
    end

    context 'with accessible group_id' do
      it 'returns objects in the group' do
276
        search_objects = described_class.new(
Dongqing Hu's avatar
Dongqing Hu committed
277 278 279 280 281 282 283 284 285 286
          user,
          group_id: accessible_group.id,
          search: group_project.name).search_objects

        expect(search_objects.first).to eq group_project
      end
    end

    context 'with no project_id, group_id or snippets' do
      it 'returns objects in global' do
287
        search_objects = described_class.new(
Dongqing Hu's avatar
Dongqing Hu committed
288 289 290 291 292
          user,
          search: public_project.name).search_objects

        expect(search_objects.first).to eq public_project
      end
293 294 295
    end
  end
end