1# frozen_string_literal: true
2
3require 'spec_helper'
4
5RSpec.describe IssuablePolicy, models: true do
6  let(:user) { create(:user) }
7  let(:project) { create(:project, :public) }
8  let(:issue) { create(:issue, project: project) }
9  let(:policies) { described_class.new(user, issue) }
10
11  describe '#rules' do
12    context 'when user is author of issuable' do
13      let(:merge_request) { create(:merge_request, source_project: project, author: user) }
14      let(:policies) { described_class.new(user, merge_request) }
15
16      it 'allows resolving notes' do
17        expect(policies).to be_allowed(:resolve_note)
18      end
19
20      context 'when user is able to read project' do
21        it 'enables user to read and update issuables' do
22          expect(policies).to be_allowed(:read_issue, :update_issue, :reopen_issue, :read_merge_request, :update_merge_request, :reopen_merge_request)
23        end
24      end
25
26      context 'when project is private' do
27        let(:project) { create(:project, :private) }
28
29        context 'when user belongs to the projects team' do
30          it 'enables user to read and update issuables' do
31            project.add_maintainer(user)
32
33            expect(policies).to be_allowed(:read_issue, :update_issue, :reopen_issue, :read_merge_request, :update_merge_request, :reopen_merge_request)
34          end
35        end
36
37        it 'disallows user from reading and updating issuables from that project' do
38          expect(policies).to be_disallowed(:read_issue, :update_issue, :reopen_issue, :read_merge_request, :update_merge_request, :reopen_merge_request)
39        end
40      end
41    end
42
43    context 'when discussion is locked for the issuable' do
44      let(:issue) { create(:issue, project: project, discussion_locked: true) }
45
46      context 'when the user is not a project member' do
47        it 'can not create a note nor award emojis' do
48          expect(policies).to be_disallowed(:create_note, :award_emoji)
49        end
50
51        it 'does not allow resolving note' do
52          expect(policies).to be_disallowed(:resolve_note)
53        end
54      end
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 create a note and award emojis' do
62          expect(policies).to be_allowed(:create_note, :award_emoji)
63        end
64
65        it 'allows resolving notes' do
66          expect(policies).to be_allowed(:resolve_note)
67        end
68      end
69    end
70  end
71end
72