project_policy_spec.rb 6.9 KB
Newer Older
1 2
require 'spec_helper'

3
describe ProjectPolicy do
4
  include_context 'ProjectPolicy context'
5

6
  it 'does not include the read_issue permission when the issue author is not a member of the private project' do
7
    project = create(:project, :private)
8
    issue   = create(:issue, project: project, author: create(:user))
9 10
    user    = issue.author

11
    expect(project.team.member?(issue.author)).to be false
12

13
    expect(Ability).not_to be_allowed(user, :read_issue, project)
14
  end
A
Alejandro Rodríguez 已提交
15

16 17 18
  context 'wiki feature' do
    let(:permissions) { %i(read_wiki create_wiki update_wiki admin_wiki download_wiki_code) }

19
    subject { described_class.new(owner, project) }
20

21 22 23 24
    context 'when the feature is disabled' do
      before do
        project.project_feature.update_attribute(:wiki_access_level, ProjectFeature::DISABLED)
      end
25

26 27 28 29 30 31 32 33 34 35 36
      it 'does not include the wiki permissions' do
        expect_disallowed(*permissions)
      end

      context 'when there is an external wiki' do
        it 'does not include the wiki permissions' do
          allow(project).to receive(:has_external_wiki?).and_return(true)

          expect_disallowed(*permissions)
        end
      end
37
    end
38 39
  end

40 41 42 43
  context 'issues feature' do
    subject { described_class.new(owner, project) }

    context 'when the feature is disabled' do
44
      before do
45 46
        project.issues_enabled = false
        project.save!
47
      end
48

49
      it 'does not include the issues permissions' do
S
Sean McGivern 已提交
50
        expect_disallowed :read_issue, :read_issue_iid, :create_issue, :update_issue, :admin_issue
51 52
      end

53
      it 'disables boards and lists permissions' do
54
        expect_disallowed :read_board, :create_board, :update_board
55 56
        expect_disallowed :read_list, :create_list, :update_list, :admin_list
      end
57

58 59 60
      context 'when external tracker configured' do
        it 'does not include the issues permissions' do
          create(:jira_service, project: project)
61

62 63
          expect_disallowed :read_issue, :read_issue_iid, :create_issue, :update_issue, :admin_issue
        end
64 65 66 67
      end
    end
  end

68 69 70 71 72 73
  context 'merge requests feature' do
    subject { described_class.new(owner, project) }

    it 'disallows all permissions when the feature is disabled' do
      project.project_feature.update(merge_requests_access_level: ProjectFeature::DISABLED)

74
      mr_permissions = [:create_merge_request_from, :read_merge_request,
75
                        :update_merge_request, :admin_merge_request,
76
                        :create_merge_request_in]
77 78 79 80 81

      expect_disallowed(*mr_permissions)
    end
  end

82 83 84 85 86 87 88 89 90 91
  context 'for a guest in a private project' do
    let(:project) { create(:project, :private) }
    subject { described_class.new(guest, project) }

    it 'disallows the guest from reading the merge request and merge request iid' do
      expect_disallowed(:read_merge_request)
      expect_disallowed(:read_merge_request_iid)
    end
  end

92
  context 'builds feature' do
93 94
    context 'when builds are disabled' do
      subject { described_class.new(owner, project) }
95

96 97 98
      before do
        project.project_feature.update(builds_access_level: ProjectFeature::DISABLED)
      end
99

100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118
      it 'disallows all permissions except pipeline when the feature is disabled' do
        builds_permissions = [
          :create_build, :read_build, :update_build, :admin_build, :destroy_build,
          :create_pipeline_schedule, :read_pipeline_schedule, :update_pipeline_schedule, :admin_pipeline_schedule, :destroy_pipeline_schedule,
          :create_environment, :read_environment, :update_environment, :admin_environment, :destroy_environment,
          :create_cluster, :read_cluster, :update_cluster, :admin_cluster, :destroy_cluster,
          :create_deployment, :read_deployment, :update_deployment, :admin_deployment, :destroy_deployment
        ]

        expect_disallowed(*builds_permissions)
      end
    end

    context 'when builds are disabled only for some users' do
      subject { described_class.new(guest, project) }

      before do
        project.project_feature.update(builds_access_level: ProjectFeature::PRIVATE)
      end
119

120 121 122 123 124 125 126 127
      it 'disallows pipeline and commit_status permissions' do
        builds_permissions = [
          :create_pipeline, :update_pipeline, :admin_pipeline, :destroy_pipeline,
          :create_commit_status, :update_commit_status, :admin_commit_status, :destroy_commit_status
        ]

        expect_disallowed(*builds_permissions)
      end
128 129 130 131 132 133 134 135 136 137 138 139 140 141
    end
  end

  context 'repository feature' do
    subject { described_class.new(owner, project) }

    it 'disallows all permissions when the feature is disabled' do
      project.project_feature.update(repository_access_level: ProjectFeature::DISABLED)

      repository_permissions = [
        :create_pipeline, :update_pipeline, :admin_pipeline, :destroy_pipeline,
        :create_build, :read_build, :update_build, :admin_build, :destroy_build,
        :create_pipeline_schedule, :read_pipeline_schedule, :update_pipeline_schedule, :admin_pipeline_schedule, :destroy_pipeline_schedule,
        :create_environment, :read_environment, :update_environment, :admin_environment, :destroy_environment,
142
        :create_cluster, :read_cluster, :update_cluster, :admin_cluster,
A
Alessio Caiazza 已提交
143
        :create_deployment, :read_deployment, :update_deployment, :admin_deployment, :destroy_deployment,
S
Shinya Maeda 已提交
144
        :destroy_release
145 146 147 148 149 150
      ]

      expect_disallowed(*repository_permissions)
    end
  end

151 152 153 154
  it_behaves_like 'project policies as anonymous'
  it_behaves_like 'project policies as guest'
  it_behaves_like 'project policies as reporter'
  it_behaves_like 'project policies as developer'
155
  it_behaves_like 'project policies as maintainer'
156 157
  it_behaves_like 'project policies as owner'
  it_behaves_like 'project policies as admin'
158 159 160 161 162 163 164 165 166 167 168

  context 'when a public project has merge requests allowing access' do
    include ProjectForksHelper
    let(:user) { create(:user) }
    let(:target_project) { create(:project, :public) }
    let(:project) { fork_project(target_project) }
    let!(:merge_request) do
      create(
        :merge_request,
        target_project: target_project,
        source_project: project,
169
        allow_collaboration: true
170 171 172
      )
    end
    let(:maintainer_abilities) do
173
      %w(create_build create_pipeline)
174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194
    end

    subject { described_class.new(user, project) }

    it 'does not allow pushing code' do
      expect_disallowed(*maintainer_abilities)
    end

    it 'allows pushing if the user is a member with push access to the target project' do
      target_project.add_developer(user)

      expect_allowed(*maintainer_abilities)
    end

    it 'dissallows abilities to a maintainer if the merge request was closed' do
      target_project.add_developer(user)
      merge_request.close!

      expect_disallowed(*maintainer_abilities)
    end
  end
195 196 197 198 199 200 201 202 203 204

  it_behaves_like 'clusterable policies' do
    let(:clusterable) { create(:project, :repository) }
    let(:cluster) do
      create(:cluster,
             :provided_by_gcp,
             :project,
             projects: [clusterable])
    end
  end
205
end