123 lines
3.8 KiB
Ruby
123 lines
3.8 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
require 'spec_helper'
|
|
|
|
RSpec.describe ErrorTracking::IssueUpdateService do
|
|
include_context 'sentry error tracking context'
|
|
|
|
let(:arguments) { { issue_id: non_existing_record_id, status: 'resolved' } }
|
|
|
|
subject(:update_service) { described_class.new(project, user, arguments) }
|
|
|
|
shared_examples 'does not perform close issue flow' do
|
|
it 'does not call the close issue service' do
|
|
update_service.execute
|
|
|
|
expect(issue_close_service)
|
|
.not_to have_received(:execute)
|
|
end
|
|
|
|
it 'does not create system note' do
|
|
expect(SystemNoteService).not_to receive(:close_after_error_tracking_resolve)
|
|
update_service.execute
|
|
end
|
|
end
|
|
|
|
describe '#execute' do
|
|
context 'with authorized user' do
|
|
context 'when update_issue returns success' do
|
|
let(:update_issue_response) { { updated: true } }
|
|
|
|
before do
|
|
expect(error_tracking_setting)
|
|
.to receive(:update_issue).and_return(update_issue_response)
|
|
end
|
|
|
|
it 'returns the response' do
|
|
expect(update_service.execute).to eq(update_issue_response.merge(status: :success, closed_issue_iid: nil))
|
|
end
|
|
|
|
it 'updates any related issue' do
|
|
expect(update_service).to receive(:update_related_issue)
|
|
|
|
update_service.execute
|
|
end
|
|
|
|
it 'clears the reactive cache' do
|
|
expect(error_tracking_setting).to receive(:expire_issues_cache)
|
|
|
|
result
|
|
end
|
|
|
|
context 'related issue and resolving' do
|
|
let(:issue) { create(:issue, project: project) }
|
|
let(:sentry_issue) { create(:sentry_issue, issue: issue) }
|
|
let(:arguments) { { issue_id: sentry_issue.sentry_issue_identifier, status: 'resolved' } }
|
|
|
|
let(:issue_close_service) { spy(:issue_close_service) }
|
|
|
|
before do
|
|
allow_next_instance_of(SentryIssueFinder) do |finder|
|
|
allow(finder).to receive(:execute).and_return(sentry_issue)
|
|
end
|
|
|
|
allow(Issues::CloseService)
|
|
.to receive(:new)
|
|
.and_return(issue_close_service)
|
|
|
|
allow(issue_close_service)
|
|
.to receive(:execute)
|
|
.and_return(issue)
|
|
end
|
|
|
|
it 'closes the issue' do
|
|
update_service.execute
|
|
|
|
expect(issue_close_service)
|
|
.to have_received(:execute)
|
|
.with(issue, system_note: false)
|
|
end
|
|
|
|
context 'issues gets closed' do
|
|
let(:closed_issue) { create(:issue, :closed, project: project) }
|
|
|
|
before do
|
|
expect(issue_close_service)
|
|
.to receive(:execute)
|
|
.with(issue, system_note: false)
|
|
.and_return(closed_issue)
|
|
end
|
|
|
|
it 'creates a system note' do
|
|
expect(SystemNoteService).to receive(:close_after_error_tracking_resolve)
|
|
|
|
update_service.execute
|
|
end
|
|
|
|
it 'returns a response with closed issue' do
|
|
expect(update_service.execute).to eq(status: :success, updated: true, closed_issue_iid: closed_issue.iid)
|
|
end
|
|
end
|
|
|
|
context 'issue is already closed' do
|
|
let(:issue) { create(:issue, :closed, project: project) }
|
|
|
|
include_examples 'does not perform close issue flow'
|
|
end
|
|
|
|
context 'status is not resolving' do
|
|
let(:arguments) { { issue_id: sentry_issue.sentry_issue_identifier, status: 'ignored' } }
|
|
|
|
include_examples 'does not perform close issue flow'
|
|
end
|
|
end
|
|
end
|
|
|
|
include_examples 'error tracking service sentry error handling', :update_issue
|
|
end
|
|
|
|
include_examples 'error tracking service unauthorized user'
|
|
include_examples 'error tracking service disabled'
|
|
end
|
|
end
|