diff options
author | Alexandru Croitor <acroitor@gitlab.com> | 2019-09-18 11:26:20 +0300 |
---|---|---|
committer | Yorick Peterse <yorick@yorickpeterse.com> | 2019-09-30 15:22:05 +0300 |
commit | c99402c05f18c6ca8dd7b64c59527abe1e6e80d4 (patch) | |
tree | 486679c27fb41fdf9d729b7277b98237841590ab /spec/policies | |
parent | e5fdd91318c590753cf0f920a2cf9b1a530e96f8 (diff) |
Add policy check if cross reference system notes are accessible
Diffstat (limited to 'spec/policies')
-rw-r--r-- | spec/policies/note_policy_spec.rb | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/spec/policies/note_policy_spec.rb b/spec/policies/note_policy_spec.rb index bcf021f1dfd..d18ded8bce9 100644 --- a/spec/policies/note_policy_spec.rb +++ b/spec/policies/note_policy_spec.rb @@ -152,6 +152,89 @@ describe NotePolicy do it_behaves_like 'a discussion with a private noteable' end end + + context 'when it is a system note' do + let(:developer) { create(:user) } + let(:any_user) { create(:user) } + + shared_examples_for 'user can read the note' do + it 'allows the user to read the note' do + expect(policy).to be_allowed(:read_note) + end + end + + shared_examples_for 'user can act on the note' do + it 'allows the user to read the note' do + expect(policy).not_to be_allowed(:admin_note) + expect(policy).to be_allowed(:resolve_note) + expect(policy).to be_allowed(:award_emoji) + end + end + + shared_examples_for 'user cannot read or act on the note' do + it 'allows user to read the note' do + expect(policy).not_to be_allowed(:admin_note) + expect(policy).not_to be_allowed(:resolve_note) + expect(policy).not_to be_allowed(:read_note) + expect(policy).not_to be_allowed(:award_emoji) + end + end + + context 'when noteable is a public issue' do + let(:note) { create(:note, system: true, noteable: noteable, author: user, project: project) } + + before do + project.add_developer(developer) + end + + context 'when user is project member' do + let(:policy) { described_class.new(developer, note) } + + it_behaves_like 'user can read the note' + it_behaves_like 'user can act on the note' + end + + context 'when user is not project member' do + let(:policy) { described_class.new(any_user, note) } + + it_behaves_like 'user can read the note' + end + + context 'when user is anonymous' do + let(:policy) { described_class.new(nil, note) } + + it_behaves_like 'user can read the note' + end + end + + context 'when it is a system note referencing a confidential issue' do + let(:confidential_issue) { create(:issue, :confidential, project: project) } + let(:note) { create(:note, system: true, noteable: issue, author: user, project: project, note: "mentioned in issue #{confidential_issue.to_reference(project)}") } + + before do + project.add_developer(developer) + end + + context 'when user is project member' do + let(:policy) { described_class.new(developer, note) } + + it_behaves_like 'user can read the note' + it_behaves_like 'user can act on the note' + end + + context 'when user is not project member' do + let(:policy) { described_class.new(any_user, note) } + + it_behaves_like 'user cannot read or act on the note' + end + + context 'when user is anonymous' do + let(:policy) { described_class.new(nil, note) } + + it_behaves_like 'user cannot read or act on the note' + end + end + end end end end |