diff options
Diffstat (limited to 'spec/models')
-rw-r--r-- | spec/models/group_spec.rb | 13 | ||||
-rw-r--r-- | spec/models/note_spec.rb | 66 | ||||
-rw-r--r-- | spec/models/project_team_spec.rb | 95 |
3 files changed, 156 insertions, 18 deletions
diff --git a/spec/models/group_spec.rb b/spec/models/group_spec.rb index 3a3b5e4bdf6..15972f66fd6 100644 --- a/spec/models/group_spec.rb +++ b/spec/models/group_spec.rb @@ -653,6 +653,19 @@ RSpec.describe Group do expect(shared_group.max_member_access_for_user(user)).to eq(Gitlab::Access::MAINTAINER) end end + + context 'evaluating admin access level' do + let_it_be(:admin) { create(:admin) } + + it 'returns OWNER by default' do + expect(group.max_member_access_for_user(admin)).to eq(Gitlab::Access::OWNER) + end + + it 'returns NO_ACCESS when only concrete membership should be considered' do + expect(group.max_member_access_for_user(admin, only_concrete_membership: true)) + .to eq(Gitlab::Access::NO_ACCESS) + end + end end describe '#members_with_parents' do diff --git a/spec/models/note_spec.rb b/spec/models/note_spec.rb index 3b453a11090..a3417ee5fc7 100644 --- a/spec/models/note_spec.rb +++ b/spec/models/note_spec.rb @@ -286,6 +286,56 @@ RSpec.describe Note do end end + describe "noteable_author?" do + let(:user1) { create(:user) } + let(:user2) { create(:user) } + let(:project) { create(:project, :public, :repository) } + + context 'when note is on commit' do + let(:noteable) { create(:commit, project: project, author: user1) } + + context 'if user is the noteable author' do + let(:note) { create(:discussion_note_on_commit, commit_id: noteable.id, project: project, author: user1) } + let(:diff_note) { create(:diff_note_on_commit, commit_id: noteable.id, project: project, author: user1) } + + it 'returns true' do + expect(note.noteable_author?(noteable)).to be true + expect(diff_note.noteable_author?(noteable)).to be true + end + end + + context 'if user is not the noteable author' do + let(:note) { create(:discussion_note_on_commit, commit_id: noteable.id, project: project, author: user2) } + let(:diff_note) { create(:diff_note_on_commit, commit_id: noteable.id, project: project, author: user2) } + + it 'returns false' do + expect(note.noteable_author?(noteable)).to be false + expect(diff_note.noteable_author?(noteable)).to be false + end + end + end + + context 'when note is on issue' do + let(:noteable) { create(:issue, project: project, author: user1) } + + context 'if user is the noteable author' do + let(:note) { create(:note, noteable: noteable, author: user1, project: project) } + + it 'returns true' do + expect(note.noteable_author?(noteable)).to be true + end + end + + context 'if user is not the noteable author' do + let(:note) { create(:note, noteable: noteable, author: user2, project: project) } + + it 'returns false' do + expect(note.noteable_author?(noteable)).to be false + end + end + end + end + describe "edited?" do let(:note) { build(:note, updated_by_id: nil, created_at: Time.current, updated_at: Time.current + 5.hours) } @@ -1228,22 +1278,6 @@ RSpec.describe Note do end end - describe '#special_role=' do - let(:role) { Note::SpecialRole::FIRST_TIME_CONTRIBUTOR } - - it 'assigns role' do - subject.special_role = role - - expect(subject.special_role).to eq(role) - end - - it 'does not assign unknown role' do - expect { subject.special_role = :bogus }.to raise_error(/Role is undefined/) - - expect(subject.special_role).to be_nil - end - end - describe '#parent' do it 'returns project for project notes' do project = create(:project) diff --git a/spec/models/project_team_spec.rb b/spec/models/project_team_spec.rb index 34ec856459c..bbc056889d6 100644 --- a/spec/models/project_team_spec.rb +++ b/spec/models/project_team_spec.rb @@ -3,6 +3,8 @@ require "spec_helper" RSpec.describe ProjectTeam do + include ProjectForksHelper + let(:maintainer) { create(:user) } let(:reporter) { create(:user) } let(:guest) { create(:user) } @@ -237,6 +239,35 @@ RSpec.describe ProjectTeam do end end + describe '#contributor?' do + let(:project) { create(:project, :public, :repository) } + + context 'when user is a member of project' do + before do + project.add_maintainer(maintainer) + project.add_reporter(reporter) + project.add_guest(guest) + end + + it { expect(project.team.contributor?(maintainer.id)).to be false } + it { expect(project.team.contributor?(reporter.id)).to be false } + it { expect(project.team.contributor?(guest.id)).to be false } + end + + context 'when user has at least one merge request merged into default_branch' do + let(:contributor) { create(:user) } + let(:user_without_access) { create(:user) } + let(:first_fork_project) { fork_project(project, contributor, repository: true) } + + before do + create(:merge_request, :merged, author: contributor, target_project: project, source_project: first_fork_project, target_branch: project.default_branch.to_s) + end + + it { expect(project.team.contributor?(contributor.id)).to be true } + it { expect(project.team.contributor?(user_without_access.id)).to be false } + end + end + describe '#max_member_access' do let(:requester) { create(:user) } @@ -366,6 +397,66 @@ RSpec.describe ProjectTeam do end end + describe '#contribution_check_for_user_ids', :request_store do + let(:project) { create(:project, :public, :repository) } + let(:contributor) { create(:user) } + let(:second_contributor) { create(:user) } + let(:user_without_access) { create(:user) } + let(:first_fork_project) { fork_project(project, contributor, repository: true) } + let(:second_fork_project) { fork_project(project, second_contributor, repository: true) } + + let(:users) do + [contributor, second_contributor, user_without_access].map(&:id) + end + + let(:expected) do + { + contributor.id => true, + second_contributor.id => true, + user_without_access.id => false + } + end + + before do + create(:merge_request, :merged, author: contributor, target_project: project, source_project: first_fork_project, target_branch: project.default_branch.to_s) + create(:merge_request, :merged, author: second_contributor, target_project: project, source_project: second_fork_project, target_branch: project.default_branch.to_s) + end + + def contributors(users) + project.team.contribution_check_for_user_ids(users) + end + + it 'does not perform extra queries when asked for users who have already been found' do + contributors(users) + + expect { contributors([contributor.id]) }.not_to exceed_query_limit(0) + + expect(contributors([contributor.id])).to eq(expected) + end + + it 'only requests the extra users when uncached users are passed' do + new_contributor = create(:user) + new_fork_project = fork_project(project, new_contributor, repository: true) + second_new_user = create(:user) + all_users = users + [new_contributor.id, second_new_user.id] + create(:merge_request, :merged, author: new_contributor, target_project: project, source_project: new_fork_project, target_branch: project.default_branch.to_s) + + expected_all = expected.merge(new_contributor.id => true, + second_new_user.id => false) + + contributors(users) + + queries = ActiveRecord::QueryRecorder.new { contributors(all_users) } + + expect(queries.count).to eq(1) + expect(contributors([new_contributor.id])).to eq(expected_all) + end + + it 'returns correct contributors' do + expect(contributors(users)).to eq(expected) + end + end + shared_examples 'max member access for users' do let(:project) { create(:project) } let(:group) { create(:group) } @@ -438,9 +529,9 @@ RSpec.describe ProjectTeam do it 'does not perform extra queries when asked for users who have already been found' do access_levels(users) - expect { access_levels(users) }.not_to exceed_query_limit(0) + expect { access_levels([maintainer.id]) }.not_to exceed_query_limit(0) - expect(access_levels(users)).to eq(expected) + expect(access_levels([maintainer.id])).to eq(expected) end it 'only requests the extra users when uncached users are passed' do |