File: contributed_projects_finder_spec.rb

package info (click to toggle)
gitlab 17.6.5-19
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 629,368 kB
  • sloc: ruby: 1,915,304; javascript: 557,307; sql: 60,639; xml: 6,509; sh: 4,567; makefile: 1,239; python: 406
file content (136 lines) | stat: -rw-r--r-- 4,249 bytes parent folder | download
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
# frozen_string_literal: true

require 'spec_helper'

RSpec.describe ContributedProjectsFinder, feature_category: :groups_and_projects do
  let_it_be(:user) { create(:user) }
  let_it_be(:user_2) { create(:user) }
  let_it_be(:public_project) { create(:project, :public, name: 'foo') }
  let_it_be(:private_project) { create(:project, :private, name: 'bar') }
  let_it_be(:internal_project) { create(:project, :internal, name: 'baz') }

  let(:params) { {} }
  let(:source_user) { user }
  let(:current_user) { user_2 }
  let(:finder) { described_class.new(user: source_user, current_user: current_user, params: params) }

  let(:default_ordering) { [internal_project, private_project, public_project] }

  before_all do
    private_project.add_maintainer(user)
    private_project.add_developer(user_2)
    public_project.add_maintainer(user)

    travel_to(4.hours.from_now) { create(:push_event, project: private_project, author: user) }
    travel_to(3.hours.from_now) { create(:push_event, project: internal_project, author: user) }
    travel_to(2.hours.from_now) { create(:push_event, project: public_project, author: user) }
  end

  context 'when sort is specified' do
    let(:params) { { sort: 'latest_activity_desc' } }

    subject { finder.execute }

    it { is_expected.to eq([private_project, internal_project, public_project]) }
  end

  describe 'activity without a current user' do
    let(:current_user) { nil }

    it 'does only return public projects' do
      projects = finder.execute
      expect(projects).to match_array([public_project])
    end

    context 'when ignore_visibility is true' do
      let(:params) { { ignore_visibility: true } }

      it 'returns all projects' do
        projects = finder.execute
        expect(projects).to eq(default_ordering)
      end
    end
  end

  describe 'activity with a current user' do
    subject { finder.execute }

    it { is_expected.to eq(default_ordering) }
  end

  context 'user with private profile' do
    let_it_be(:private_user) { create(:user, private_profile: true) }
    let_it_be(:push_event) { create(:push_event, project: public_project, author: private_user) }

    let(:source_user) { private_user }

    before_all do
      public_project.add_maintainer(private_user)
    end

    it 'does not return contributed projects' do
      projects = finder.execute

      expect(projects).to be_empty
    end
  end

  describe 'with search param' do
    let(:params) { { search: 'foo' } }

    subject { finder.execute }

    it { is_expected.to eq([public_project]) }
  end

  describe 'with min_access_level param' do
    let_it_be(:project_with_owner_access) { create(:project, :private) }

    before_all do
      project_with_owner_access.add_owner(user)
      project_with_owner_access.add_owner(user_2)
      travel_to(4.hours.from_now) { create(:push_event, project: project_with_owner_access, author: user) }
    end

    context 'when min_access_level is OWNER' do
      let(:params) { { min_access_level: Gitlab::Access::OWNER } }

      it 'returns only projects user has owner access to' do
        projects = finder.execute

        expect(projects).to eq([project_with_owner_access])
      end
    end

    context 'when min_access_level is DEVELOPER' do
      let(:params) { { min_access_level: Gitlab::Access::DEVELOPER } }

      it 'returns only projects user has developer or higher access to' do
        projects = finder.execute

        expect(projects).to eq([project_with_owner_access, private_project])
      end
    end
  end

  context 'with programming_language_name param' do
    let_it_be(:ruby) { create(:programming_language, name: 'Ruby') }
    let_it_be(:repository_language) do
      create(:repository_language, project: internal_project, programming_language: ruby)
    end

    subject { finder.execute }

    context 'when programming_language_name is set to an existing language' do
      let(:params) { { programming_language_name: 'ruby' } }

      it { is_expected.to match_array([internal_project]) }
    end

    context 'when programming_language_name is an empty string' do
      let(:params) { { programming_language_name: '' } }

      it { is_expected.to match_array(default_ordering) }
    end
  end
end