summaryrefslogtreecommitdiff
path: root/spec/models/issue_spec.rb
diff options
context:
space:
mode:
Diffstat (limited to 'spec/models/issue_spec.rb')
-rw-r--r--spec/models/issue_spec.rb132
1 files changed, 125 insertions, 7 deletions
diff --git a/spec/models/issue_spec.rb b/spec/models/issue_spec.rb
index e8103be0682..dd5ff3dbdde 100644
--- a/spec/models/issue_spec.rb
+++ b/spec/models/issue_spec.rb
@@ -7,13 +7,30 @@ describe Issue do
describe "Associations" do
it { is_expected.to belong_to(:milestone) }
+ it { is_expected.to belong_to(:iteration) }
it { is_expected.to belong_to(:project) }
it { is_expected.to belong_to(:moved_to).class_name('Issue') }
+ it { is_expected.to have_one(:moved_from).class_name('Issue') }
it { is_expected.to belong_to(:duplicated_to).class_name('Issue') }
it { is_expected.to belong_to(:closed_by).class_name('User') }
it { is_expected.to have_many(:assignees) }
it { is_expected.to have_many(:user_mentions).class_name("IssueUserMention") }
+ it { is_expected.to have_many(:designs) }
+ it { is_expected.to have_many(:design_versions) }
it { is_expected.to have_one(:sentry_issue) }
+ it { is_expected.to have_one(:alert_management_alert) }
+ it { is_expected.to have_many(:resource_milestone_events) }
+ it { is_expected.to have_many(:resource_state_events) }
+
+ describe 'versions.most_recent' do
+ it 'returns the most recent version' do
+ issue = create(:issue)
+ create_list(:design_version, 2, issue: issue)
+ last_version = create(:design_version, issue: issue)
+
+ expect(issue.design_versions.most_recent).to eq(last_version)
+ end
+ end
end
describe 'modules' do
@@ -23,6 +40,8 @@ describe Issue do
it { is_expected.to include_module(Referable) }
it { is_expected.to include_module(Sortable) }
it { is_expected.to include_module(Taskable) }
+ it { is_expected.to include_module(MilestoneEventable) }
+ it { is_expected.to include_module(StateEventable) }
it_behaves_like 'AtomicInternalId' do
let(:internal_id_attribute) { :iid }
@@ -61,6 +80,18 @@ describe Issue do
end
end
+ describe '.with_alert_management_alerts' do
+ subject { described_class.with_alert_management_alerts }
+
+ it 'gets only issues with alerts' do
+ alert = create(:alert_management_alert, issue: create(:issue))
+ issue = create(:issue)
+
+ expect(subject).to contain_exactly(alert.issue)
+ expect(subject).not_to include(issue)
+ end
+ end
+
describe 'locking' do
using RSpec::Parameterized::TableSyntax
@@ -593,8 +624,15 @@ describe Issue do
context 'with an admin user' do
let(:user) { build(:admin) }
- it_behaves_like 'issue readable by user'
- it_behaves_like 'confidential issue readable by user'
+ context 'when admin mode is enabled', :enable_admin_mode do
+ it_behaves_like 'issue readable by user'
+ it_behaves_like 'confidential issue readable by user'
+ end
+
+ context 'when admin mode is disabled' do
+ it_behaves_like 'issue not readable by user'
+ it_behaves_like 'confidential issue not readable by user'
+ end
end
context 'with an owner' do
@@ -713,13 +751,29 @@ describe Issue do
expect(issue.visible_to_user?(user)).to be_falsy
end
- it 'does not check the external webservice for admins' do
- issue = build(:issue)
- user = build(:admin)
+ context 'with an admin' do
+ context 'when admin mode is enabled', :enable_admin_mode do
+ it 'does not check the external webservice' do
+ issue = build(:issue)
+ user = build(:admin)
- expect(::Gitlab::ExternalAuthorization).not_to receive(:access_allowed?)
+ expect(::Gitlab::ExternalAuthorization).not_to receive(:access_allowed?)
- issue.visible_to_user?(user)
+ issue.visible_to_user?(user)
+ end
+ end
+
+ context 'when admin mode is disabled' do
+ it 'checks the external service to determine if an issue is readable by the admin' do
+ project = build(:project, :public,
+ external_authorization_classification_label: 'a-label')
+ issue = build(:issue, project: project)
+ user = build(:admin)
+
+ expect(::Gitlab::ExternalAuthorization).to receive(:access_allowed?).with(user, 'a-label') { false }
+ expect(issue.visible_to_user?(user)).to be_falsy
+ end
+ end
end
end
@@ -967,4 +1021,68 @@ describe Issue do
expect(issue.previous_updated_at).to eq(Time.new(2013, 02, 06))
end
end
+
+ describe '#design_collection' do
+ it 'returns a design collection' do
+ issue = build(:issue)
+ collection = issue.design_collection
+
+ expect(collection).to be_a(DesignManagement::DesignCollection)
+ expect(collection.issue).to eq(issue)
+ end
+ end
+
+ describe 'current designs' do
+ let(:issue) { create(:issue) }
+
+ subject { issue.designs.current }
+
+ context 'an issue has no designs' do
+ it { is_expected.to be_empty }
+ end
+
+ context 'an issue only has current designs' do
+ let!(:design_a) { create(:design, :with_file, issue: issue) }
+ let!(:design_b) { create(:design, :with_file, issue: issue) }
+ let!(:design_c) { create(:design, :with_file, issue: issue) }
+
+ it { is_expected.to include(design_a, design_b, design_c) }
+ end
+
+ context 'an issue only has deleted designs' do
+ let!(:design_a) { create(:design, :with_file, issue: issue, deleted: true) }
+ let!(:design_b) { create(:design, :with_file, issue: issue, deleted: true) }
+ let!(:design_c) { create(:design, :with_file, issue: issue, deleted: true) }
+
+ it { is_expected.to be_empty }
+ end
+
+ context 'an issue has a mixture of current and deleted designs' do
+ let!(:design_a) { create(:design, :with_file, issue: issue) }
+ let!(:design_b) { create(:design, :with_file, issue: issue, deleted: true) }
+ let!(:design_c) { create(:design, :with_file, issue: issue) }
+
+ it { is_expected.to contain_exactly(design_a, design_c) }
+ end
+ end
+
+ describe '.with_label_attributes' do
+ subject { described_class.with_label_attributes(label_attributes) }
+
+ let(:label_attributes) { { title: 'hello world', description: 'hi' } }
+
+ it 'gets issues with given label attributes' do
+ label = create(:label, **label_attributes)
+ labeled_issue = create(:labeled_issue, project: label.project, labels: [label])
+
+ expect(subject).to include(labeled_issue)
+ end
+
+ it 'excludes issues without given label attributes' do
+ label = create(:label, title: 'GitLab', description: 'tanuki')
+ labeled_issue = create(:labeled_issue, project: label.project, labels: [label])
+
+ expect(subject).not_to include(labeled_issue)
+ end
+ end
end