1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
|
# frozen_string_literal: true
require 'spec_helper'
RSpec.describe ErrorTracking::ListIssuesService, feature_category: :error_tracking do
include_context 'sentry error tracking context'
let(:params) { {} }
subject(:service) { described_class.new(project, user, params) }
describe '#execute' do
context 'with Sentry backend' do
let(:params) { { search_term: 'something', sort: 'last_seen', cursor: 'some-cursor' } }
let(:list_sentry_issues_args) do
{
issue_status: 'unresolved',
limit: 20,
search_term: 'something',
sort: 'last_seen',
cursor: 'some-cursor'
}
end
context 'with authorized user' do
let(:issues) { [] }
described_class::ISSUE_STATUS_VALUES.each do |status|
it "returns the issues with #{status} issue_status" do
params[:issue_status] = status
list_sentry_issues_args[:issue_status] = status
expect_list_sentry_issues_with(list_sentry_issues_args)
expect(result).to eq(status: :success, pagination: {}, issues: issues)
end
end
it 'returns the issues with no issue_status' do
expect_list_sentry_issues_with(list_sentry_issues_args)
expect(result).to eq(status: :success, pagination: {}, issues: issues)
end
it 'returns bad request with invalid issue_status' do
params[:issue_status] = 'assigned'
expect(error_tracking_setting).not_to receive(:list_sentry_issues)
expect(result).to eq(message: "Bad Request: Invalid issue_status", status: :error, http_status: :bad_request)
end
include_examples 'error tracking service data not ready', :list_sentry_issues
include_examples 'error tracking service sentry error handling', :list_sentry_issues
include_examples 'error tracking service http status handling', :list_sentry_issues
end
include_examples 'error tracking service unauthorized user'
include_examples 'error tracking service disabled'
def expect_list_sentry_issues_with(list_sentry_issues_args)
expect(error_tracking_setting)
.to receive(:list_sentry_issues)
.with(list_sentry_issues_args)
.and_return(issues: [], pagination: {})
end
end
context 'with integrated error tracking' do
let(:error_repository) { instance_double(Gitlab::ErrorTracking::ErrorRepository) }
let(:errors) { [] }
let(:pagination) { Gitlab::ErrorTracking::ErrorRepository::Pagination.new(nil, nil) }
let(:opts) { default_opts }
let(:default_opts) do
{
filters: { status: described_class::DEFAULT_ISSUE_STATUS },
query: nil,
sort: described_class::DEFAULT_SORT,
limit: described_class::DEFAULT_LIMIT,
cursor: nil
}
end
let(:params) { {} }
before do
error_tracking_setting.update!(integrated: true)
allow(service).to receive(:error_repository).and_return(error_repository)
end
context 'when errors are found' do
let(:error) { build_stubbed(:error_tracking_open_api_error, project_id: project.id) }
let(:errors) { [error] }
before do
allow(error_repository).to receive(:list_errors)
.with(**opts)
.and_return([errors, pagination])
end
context 'without params' do
it 'returns the errors without pagination' do
expect(result[:status]).to eq(:success)
expect(result[:issues]).to eq(errors)
expect(result[:pagination]).to eq({})
expect(error_repository).to have_received(:list_errors).with(**opts)
end
end
context 'with pagination' do
context 'with next page' do
before do
pagination.next = 'next cursor'
end
it 'has next cursor' do
expect(result[:pagination]).to eq(next: { cursor: 'next cursor' })
end
end
context 'with prev page' do
before do
pagination.prev = 'prev cursor'
end
it 'has prev cursor' do
expect(result[:pagination]).to eq(previous: { cursor: 'prev cursor' })
end
end
context 'with next and prev page' do
before do
pagination.next = 'next cursor'
pagination.prev = 'prev cursor'
end
it 'has both cursors' do
expect(result[:pagination]).to eq(
next: { cursor: 'next cursor' },
previous: { cursor: 'prev cursor' }
)
end
end
end
end
end
end
describe '#external_url' do
it 'calls the project setting sentry_external_url' do
expect(error_tracking_setting).to receive(:sentry_external_url).and_return(sentry_url)
expect(subject.external_url).to eql sentry_url
end
end
end
|