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/work_items/related_work_item_link_spec.rb')
-rw-r--r--spec/models/work_items/related_work_item_link_spec.rb73
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