diff options
Diffstat (limited to 'spec/models/work_items/related_work_item_link_spec.rb')
-rw-r--r-- | spec/models/work_items/related_work_item_link_spec.rb | 73 |
1 files changed, 36 insertions, 37 deletions
diff --git a/spec/models/work_items/related_work_item_link_spec.rb b/spec/models/work_items/related_work_item_link_spec.rb index 3217ac52489..d4a07997052 100644 --- a/spec/models/work_items/related_work_item_link_spec.rb +++ b/spec/models/work_items/related_work_item_link_spec.rb @@ -9,6 +9,8 @@ RSpec.describe WorkItems::RelatedWorkItemLink, type: :model, feature_category: : it_behaves_like 'issuable link' do let_it_be_with_reload(:issuable_link) { create(:work_item_link) } let_it_be(:issuable) { issue } + let_it_be(:issuable2) { create(:work_item, :issue, project: project) } + let_it_be(:issuable3) { create(:work_item, :issue, project: project) } let(:issuable_class) { 'WorkItem' } let(:issuable_link_factory) { :work_item_link } end @@ -21,51 +23,48 @@ RSpec.describe WorkItems::RelatedWorkItemLink, type: :model, feature_category: : let_it_be(:item_type) { described_class.issuable_name } end - describe 'validations' do - let_it_be(:task1) { create(:work_item, :task, project: project) } - let_it_be(:task2) { create(:work_item, :task, project: project) } - let_it_be(:task3) { create(:work_item, :task, project: project) } - - subject(:link) { build(:work_item_link, source_id: task1.id, target_id: task2.id) } + describe '.issuable_type' do + it { expect(described_class.issuable_type).to eq(:issue) } + end - describe '#validate_max_number_of_links' do - shared_examples 'invalid due to exceeding max number of links' do - let(:error_msg) { 'This work item would exceed the maximum number of linked items.' } + describe '.issuable_name' do + it { expect(described_class.issuable_name).to eq('work item') } + end - before do - create(:work_item_link, source: source, target: target) - stub_const("#{described_class}::MAX_LINKS_COUNT", 1) - end + describe 'validations' do + describe '#validate_related_link_restrictions' do + using RSpec::Parameterized::TableSyntax - specify do - is_expected.to be_invalid - expect(link.errors.messages[error_item]).to include(error_msg) - end + where(:source_type_sym, :target_types, :valid) do + :incident | [:incident, :test_case, :issue, :task, :ticket] | false + :ticket | [:incident, :test_case, :issue, :task, :ticket] | false + :test_case | [:incident, :test_case, :issue, :task, :ticket] | false + :task | [:incident, :test_case, :ticket] | false + :issue | [:incident, :test_case, :ticket] | false + :task | [:task, :issue] | true + :issue | [:task, :issue] | true end - context 'when source exceeds max' do - let(:source) { task1 } - let(:target) { task3 } - let(:error_item) { :source } + with_them do + it 'validates the related link' do + target_types.each do |target_type_sym| + source_type = WorkItems::Type.default_by_type(source_type_sym) + target_type = WorkItems::Type.default_by_type(target_type_sym) + source = build(:work_item, work_item_type: source_type, project: project) + target = build(:work_item, work_item_type: target_type, project: project) + link = build(:work_item_link, source: source, target: target) + opposite_link = build(:work_item_link, source: target, target: source) - it_behaves_like 'invalid due to exceeding max number of links' - end - - context 'when target exceeds max' do - let(:source) { task2 } - let(:target) { task3 } - let(:error_item) { :target } + expect(link.valid?).to eq(valid) + expect(opposite_link.valid?).to eq(valid) + next if valid - it_behaves_like 'invalid due to exceeding max number of links' + expect(link.errors.messages[:source]).to contain_exactly( + "#{source_type.name.downcase.pluralize} cannot be related to #{target_type.name.downcase.pluralize}" + ) + end + end end end end - - describe '.issuable_type' do - it { expect(described_class.issuable_type).to eq(:issue) } - end - - describe '.issuable_name' do - it { expect(described_class.issuable_name).to eq('work item') } - end end |