1# frozen_string_literal: true 2 3require 'spec_helper' 4 5RSpec.describe IssueLinks::DestroyService do 6 describe '#execute' do 7 let(:project) { create(:project_empty_repo) } 8 let(:user) { create(:user) } 9 10 subject { described_class.new(issue_link, user).execute } 11 12 context 'when successfully removes an issue link' do 13 let(:issue_a) { create(:issue, project: project) } 14 let(:issue_b) { create(:issue, project: project) } 15 16 let!(:issue_link) { create(:issue_link, source: issue_a, target: issue_b) } 17 18 before do 19 project.add_reporter(user) 20 end 21 22 it 'removes related issue' do 23 expect { subject }.to change(IssueLink, :count).from(1).to(0) 24 end 25 26 it 'creates notes' do 27 # Two-way notes creation 28 expect(SystemNoteService).to receive(:unrelate_issue) 29 .with(issue_link.source, issue_link.target, user) 30 expect(SystemNoteService).to receive(:unrelate_issue) 31 .with(issue_link.target, issue_link.source, user) 32 33 subject 34 end 35 36 it 'returns success message' do 37 is_expected.to eq(message: 'Relation was removed', status: :success) 38 end 39 40 context 'target is an incident' do 41 let(:issue_b) { create(:incident, project: project) } 42 43 it_behaves_like 'an incident management tracked event', :incident_management_incident_unrelate do 44 let(:current_user) { user } 45 end 46 end 47 end 48 49 context 'when failing to remove an issue link' do 50 let(:unauthorized_project) { create(:project) } 51 let(:issue_a) { create(:issue, project: project) } 52 let(:issue_b) { create(:issue, project: unauthorized_project) } 53 54 let!(:issue_link) { create(:issue_link, source: issue_a, target: issue_b) } 55 56 it 'does not remove relation' do 57 expect { subject }.not_to change(IssueLink, :count).from(1) 58 end 59 60 it 'does not create notes' do 61 expect(SystemNoteService).not_to receive(:unrelate_issue) 62 end 63 64 it 'returns error message' do 65 is_expected.to eq(message: 'No Issue Link found', status: :error, http_status: 404) 66 end 67 end 68 end 69end 70