1# frozen_string_literal: true
2
3require 'spec_helper'
4
5RSpec.describe CommitPolicy do
6  describe '#rules' do
7    let(:user) { create(:user) }
8    let(:commit) { project.repository.head_commit }
9    let(:policy) { described_class.new(user, commit) }
10
11    shared_examples 'can read commit and create a note' do
12      it 'can read commit' do
13        expect(policy).to be_allowed(:read_commit)
14      end
15
16      it 'can create a note' do
17        expect(policy).to be_allowed(:create_note)
18      end
19    end
20
21    shared_examples 'cannot read commit nor create a note' do
22      it 'can not read commit' do
23        expect(policy).to be_disallowed(:read_commit)
24      end
25
26      it 'can not create a note' do
27        expect(policy).to be_disallowed(:create_note)
28      end
29    end
30
31    context 'when project is public' do
32      let(:project) { create(:project, :public, :repository) }
33
34      it_behaves_like 'can read commit and create a note'
35
36      context 'when repository access level is private' do
37        let(:project) { create(:project, :public, :repository, :repository_private) }
38
39        it_behaves_like 'cannot read commit nor create a note'
40
41        context 'when the user is a project member' do
42          before do
43            project.add_developer(user)
44          end
45
46          it_behaves_like 'can read commit and create a note'
47        end
48      end
49    end
50
51    context 'when project is private' do
52      let(:project) { create(:project, :private, :repository) }
53
54      it_behaves_like 'cannot read commit nor create a note'
55
56      context 'when the user is a project member' do
57        before do
58          project.add_developer(user)
59        end
60
61        it 'can read commit and create a note' do
62          expect(policy).to be_allowed(:read_commit)
63        end
64      end
65
66      context 'when the user is a guest' do
67        before do
68          project.add_guest(user)
69        end
70
71        it_behaves_like 'cannot read commit nor create a note'
72
73        it 'cannot download code' do
74          expect(policy).to be_disallowed(:download_code)
75        end
76      end
77    end
78  end
79end
80