diff options
Diffstat (limited to 'spec/models/issue_spec.rb')
-rw-r--r-- | spec/models/issue_spec.rb | 132 |
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 |