83 lines
		
	
	
	
		
			2.3 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			83 lines
		
	
	
	
		
			2.3 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
# frozen_string_literal: true
 | 
						|
 | 
						|
require 'spec_helper'
 | 
						|
 | 
						|
describe ProjectStatisticsPolicy do
 | 
						|
  using RSpec::Parameterized::TableSyntax
 | 
						|
 | 
						|
  describe '#rules' do
 | 
						|
    let(:external)   { create(:user, :external) }
 | 
						|
    let(:guest)      { create(:user) }
 | 
						|
    let(:reporter)   { create(:user) }
 | 
						|
    let(:developer)  { create(:user) }
 | 
						|
    let(:maintainer) { create(:user) }
 | 
						|
 | 
						|
    let(:users) do
 | 
						|
      {
 | 
						|
        unauthenticated: nil,
 | 
						|
        non_member: create(:user),
 | 
						|
        guest: guest,
 | 
						|
        reporter: reporter,
 | 
						|
        developer: developer,
 | 
						|
        maintainer: maintainer
 | 
						|
      }
 | 
						|
    end
 | 
						|
 | 
						|
    where(:project_type, :user_type, :outcome) do
 | 
						|
      [
 | 
						|
        # Public projects
 | 
						|
        [:public, :unauthenticated, false],
 | 
						|
        [:public, :non_member, false],
 | 
						|
        [:public, :guest, false],
 | 
						|
        [:public, :reporter, true],
 | 
						|
        [:public, :developer, true],
 | 
						|
        [:public, :maintainer, true],
 | 
						|
 | 
						|
        # Private project
 | 
						|
        [:private, :unauthenticated, false],
 | 
						|
        [:private, :non_member, false],
 | 
						|
        [:private, :guest, false],
 | 
						|
        [:private, :reporter, true],
 | 
						|
        [:private, :developer, true],
 | 
						|
        [:private, :maintainer, true],
 | 
						|
 | 
						|
        # Internal projects
 | 
						|
        [:internal, :unauthenticated, false],
 | 
						|
        [:internal, :non_member, false],
 | 
						|
        [:internal, :guest, false],
 | 
						|
        [:internal, :reporter, true],
 | 
						|
        [:internal, :developer, true],
 | 
						|
        [:internal, :maintainer, true]
 | 
						|
      ]
 | 
						|
    end
 | 
						|
 | 
						|
    with_them do
 | 
						|
      let(:user) { users[user_type] }
 | 
						|
      let(:project) { create(:project, visibility_level: Gitlab::VisibilityLevel.level_value(project_type.to_s)) }
 | 
						|
      let(:project_statistics) { create(:project_statistics, project: project) }
 | 
						|
 | 
						|
      subject { Ability.allowed?(user, :read_statistics, project_statistics) }
 | 
						|
 | 
						|
      before do
 | 
						|
        project.add_guest(guest)
 | 
						|
        project.add_reporter(reporter)
 | 
						|
        project.add_developer(developer)
 | 
						|
        project.add_maintainer(maintainer)
 | 
						|
      end
 | 
						|
 | 
						|
      it { is_expected.to eq(outcome) }
 | 
						|
 | 
						|
      context 'when the user is external' do
 | 
						|
        let(:user) { external }
 | 
						|
 | 
						|
        before do
 | 
						|
          unless [:unauthenticated, :non_member].include?(user_type)
 | 
						|
            project.add_user(external, user_type)
 | 
						|
          end
 | 
						|
        end
 | 
						|
 | 
						|
        it { is_expected.to eq(outcome) }
 | 
						|
      end
 | 
						|
    end
 | 
						|
  end
 | 
						|
end
 |