Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'spec/models/issue_spec.rb')
-rw-r--r--spec/models/issue_spec.rb158
1 files changed, 155 insertions, 3 deletions
diff --git a/spec/models/issue_spec.rb b/spec/models/issue_spec.rb
index 4e217e3a9f7..e7a5a53c6a0 100644
--- a/spec/models/issue_spec.rb
+++ b/spec/models/issue_spec.rb
@@ -69,8 +69,7 @@ RSpec.describe Issue, feature_category: :team_planning do
end
describe 'validations' do
- it { is_expected.not_to allow_value(nil).for(:confidential) }
- it { is_expected.to allow_value(true, false).for(:confidential) }
+ it { is_expected.to validate_inclusion_of(:confidential).in_array([true, false]) }
end
describe 'custom validations' do
@@ -302,7 +301,7 @@ RSpec.describe Issue, feature_category: :team_planning do
let(:issue) { create(:issue) }
let(:project) { issue.project }
let(:user) { issue.author }
- let(:action) { Gitlab::UsageDataCounters::IssueActivityUniqueCounter::ISSUE_CREATED }
+ let(:event) { Gitlab::UsageDataCounters::IssueActivityUniqueCounter::ISSUE_CREATED }
let(:namespace) { project.namespace }
subject(:service_action) { issue }
@@ -867,6 +866,29 @@ RSpec.describe Issue, feature_category: :team_planning do
.to contain_exactly(authorized_issue_b, authorized_incident_a)
end
end
+
+ context 'when authorize argument is false' do
+ it 'returns all related issues' do
+ expect(authorized_issue_a.related_issues(authorize: false))
+ .to contain_exactly(authorized_issue_b, authorized_issue_c, authorized_incident_a, unauthorized_issue)
+ end
+ end
+
+ context 'when current_user argument is nil' do
+ let_it_be(:public_issue) { create(:issue, project: create(:project, :public)) }
+
+ it 'returns public linked issues only' do
+ create(:issue_link, source: authorized_issue_a, target: public_issue)
+
+ expect(authorized_issue_a.related_issues).to contain_exactly(public_issue)
+ end
+ end
+
+ context 'when issue is a new record' do
+ let(:new_issue) { build(:issue, project: authorized_project) }
+
+ it { expect(new_issue.related_issues(user)).to be_empty }
+ end
end
describe '#can_move?' do
@@ -2038,4 +2060,134 @@ RSpec.describe Issue, feature_category: :team_planning do
expect(issue.search_data.namespace_id).to eq(issue.namespace_id)
end
end
+
+ describe '#linked_items_count' do
+ let_it_be(:issue1) { create(:issue, project: reusable_project) }
+ let_it_be(:issue2) { create(:issue, project: reusable_project) }
+ let_it_be(:issue3) { create(:issue, project: reusable_project) }
+ let_it_be(:issue4) { build(:issue, project: reusable_project) }
+
+ it 'returns number of issues linked to the issue' do
+ create(:issue_link, source: issue1, target: issue2)
+ create(:issue_link, source: issue1, target: issue3)
+
+ expect(issue1.linked_items_count).to eq(2)
+ expect(issue2.linked_items_count).to eq(1)
+ expect(issue3.linked_items_count).to eq(1)
+ expect(issue4.linked_items_count).to eq(0)
+ end
+ end
+
+ describe '#readable_by?' do
+ let_it_be(:admin_user) { create(:user, :admin) }
+
+ subject { issue_subject.readable_by?(user) }
+
+ context 'when issue belongs directly to a project' do
+ let_it_be_with_reload(:project_issue) { create(:issue, project: reusable_project) }
+ let_it_be(:project_reporter) { create(:user).tap { |u| reusable_project.add_reporter(u) } }
+ let_it_be(:project_guest) { create(:user).tap { |u| reusable_project.add_guest(u) } }
+
+ let(:issue_subject) { project_issue }
+
+ context 'when user is in admin mode', :enable_admin_mode do
+ let(:user) { admin_user }
+
+ it { is_expected.to be_truthy }
+ end
+
+ context 'when user is a reporter' do
+ let(:user) { project_reporter }
+
+ it { is_expected.to be_truthy }
+
+ context 'when issues project feature is not enabled' do
+ before do
+ reusable_project.project_feature.update!(issues_access_level: ProjectFeature::DISABLED)
+ end
+
+ it { is_expected.to be_falsey }
+ end
+
+ context 'when issue is hidden (banned author)' do
+ before do
+ issue_subject.author.ban!
+ end
+
+ it { is_expected.to be_falsey }
+ end
+ end
+
+ context 'when user is a guest' do
+ let(:user) { project_guest }
+
+ context 'when issue is confidential' do
+ before do
+ issue_subject.update!(confidential: true)
+ end
+
+ it { is_expected.to be_falsey }
+
+ context 'when user is assignee of the issue' do
+ before do
+ issue_subject.update!(assignees: [user])
+ end
+
+ it { is_expected.to be_truthy }
+ end
+ end
+ end
+ end
+
+ context 'when issue belongs directly to the group' do
+ let_it_be(:group) { create(:group) }
+ let_it_be_with_reload(:group_issue) { create(:issue, :group_level, namespace: group) }
+ let_it_be(:group_reporter) { create(:user).tap { |u| group.add_reporter(u) } }
+ let_it_be(:group_guest) { create(:user).tap { |u| group.add_guest(u) } }
+
+ let(:issue_subject) { group_issue }
+
+ context 'when user is in admin mode', :enable_admin_mode do
+ let(:user) { admin_user }
+
+ it { is_expected.to be_truthy }
+ end
+
+ context 'when user is a reporter' do
+ let(:user) { group_reporter }
+
+ it { is_expected.to be_truthy }
+
+ context 'when issue is hidden (banned author)' do
+ before do
+ issue_subject.author.ban!
+ end
+
+ it { is_expected.to be_falsey }
+ end
+ end
+
+ context 'when user is a guest' do
+ let(:user) { group_guest }
+
+ it { is_expected.to be_truthy }
+
+ context 'when issue is confidential' do
+ before do
+ issue_subject.update!(confidential: true)
+ end
+
+ it { is_expected.to be_falsey }
+
+ context 'when user is assignee of the issue' do
+ before do
+ issue_subject.update!(assignees: [user])
+ end
+
+ it { is_expected.to be_truthy }
+ end
+ end
+ end
+ end
+ end
end