debian-mirror-gitlab/spec/lib/sentry/client_spec.rb

222 lines
7.4 KiB
Ruby
Raw Normal View History

2019-02-15 15:39:39 +05:30
# frozen_string_literal: true
require 'spec_helper'
describe Sentry::Client do
2020-01-01 13:55:28 +05:30
include SentryClientHelpers
2019-02-15 15:39:39 +05:30
let(:sentry_url) { 'https://sentrytest.gitlab.com/api/0/projects/sentry-org/sentry-project' }
let(:token) { 'test-token' }
2020-01-01 13:55:28 +05:30
let(:default_httparty_options) do
{
follow_redirects: false,
headers: { "Authorization" => "Bearer test-token" }
}
end
2019-02-15 15:39:39 +05:30
2019-03-02 22:35:43 +05:30
let(:issues_sample_response) do
2019-02-15 15:39:39 +05:30
Gitlab::Utils.deep_indifferent_access(
2019-03-02 22:35:43 +05:30
JSON.parse(fixture_file('sentry/issues_sample_response.json'))
)
end
2019-02-15 15:39:39 +05:30
subject(:client) { described_class.new(sentry_url, token) }
2020-01-01 13:55:28 +05:30
shared_examples 'issues has correct return type' do |klass|
2019-03-02 22:35:43 +05:30
it "returns objects of type #{klass}" do
2020-01-01 13:55:28 +05:30
expect(subject[:issues]).to all( be_a(klass) )
2019-02-15 15:39:39 +05:30
end
2019-03-02 22:35:43 +05:30
end
2020-01-01 13:55:28 +05:30
shared_examples 'issues has correct length' do |length|
it { expect(subject[:issues].length).to eq(length) }
2019-07-07 11:18:12 +05:30
end
2019-03-02 22:35:43 +05:30
describe '#list_issues' do
let(:issue_status) { 'unresolved' }
let(:limit) { 20 }
2020-01-01 13:55:28 +05:30
let(:search_term) { '' }
let(:cursor) { nil }
let(:sort) { 'last_seen' }
2019-07-07 11:18:12 +05:30
let(:sentry_api_response) { issues_sample_response }
let(:sentry_request_url) { sentry_url + '/issues/?limit=20&query=is:unresolved' }
2019-03-02 22:35:43 +05:30
2019-07-07 11:18:12 +05:30
let!(:sentry_api_request) { stub_sentry_request(sentry_request_url, body: sentry_api_response) }
2019-03-02 22:35:43 +05:30
2020-01-01 13:55:28 +05:30
subject { client.list_issues(issue_status: issue_status, limit: limit, search_term: search_term, sort: sort, cursor: cursor) }
2019-03-02 22:35:43 +05:30
it_behaves_like 'calls sentry api'
2020-01-01 13:55:28 +05:30
it_behaves_like 'issues has correct return type', Gitlab::ErrorTracking::Error
it_behaves_like 'issues has correct length', 1
2019-02-15 15:39:39 +05:30
2019-07-07 11:18:12 +05:30
shared_examples 'has correct external_url' do
context 'external_url' do
it 'is constructed correctly' do
2020-01-01 13:55:28 +05:30
expect(subject[:issues][0].external_url).to eq('https://sentrytest.gitlab.com/sentry-org/sentry-project/issues/11')
2019-07-07 11:18:12 +05:30
end
end
end
2020-01-01 13:55:28 +05:30
context 'when response has a pagination info' do
let(:headers) do
{
link: '<https://sentrytest.gitlab.com>; rel="previous"; results="true"; cursor="1573556671000:0:1", <https://sentrytest.gitlab.com>; rel="next"; results="true"; cursor="1572959139000:0:0"'
}
end
let!(:sentry_api_request) { stub_sentry_request(sentry_request_url, body: sentry_api_response, headers: headers) }
it 'parses the pagination' do
expect(subject[:pagination]).to eq(
'previous' => { 'cursor' => '1573556671000:0:1' },
'next' => { 'cursor' => '1572959139000:0:0' }
)
end
end
2019-02-15 15:39:39 +05:30
context 'error object created from sentry response' do
using RSpec::Parameterized::TableSyntax
where(:error_object, :sentry_response) do
:id | :id
:first_seen | :firstSeen
:last_seen | :lastSeen
:title | :title
:type | :type
:user_count | :userCount
:count | :count
:message | [:metadata, :value]
:culprit | :culprit
:short_id | :shortId
:status | :status
:frequency | [:stats, '24h']
:project_id | [:project, :id]
:project_name | [:project, :name]
:project_slug | [:project, :slug]
end
with_them do
2020-01-01 13:55:28 +05:30
it { expect(subject[:issues][0].public_send(error_object)).to eq(sentry_api_response[0].dig(*sentry_response)) }
2019-02-15 15:39:39 +05:30
end
2019-07-07 11:18:12 +05:30
it_behaves_like 'has correct external_url'
2019-02-15 15:39:39 +05:30
end
context 'redirects' do
2019-03-02 22:35:43 +05:30
let(:sentry_api_url) { sentry_url + '/issues/?limit=20&query=is:unresolved' }
2019-02-15 15:39:39 +05:30
2020-01-01 13:55:28 +05:30
it_behaves_like 'no Sentry redirects'
2019-02-15 15:39:39 +05:30
end
# Sentry API returns 404 if there are extra slashes in the URL!
context 'extra slashes in URL' do
let(:sentry_url) { 'https://sentrytest.gitlab.com/api/0/projects//sentry-org/sentry-project/' }
2019-07-07 11:18:12 +05:30
let(:sentry_request_url) do
'https://sentrytest.gitlab.com/api/0/projects/sentry-org/sentry-project/' \
2019-02-15 15:39:39 +05:30
'issues/?limit=20&query=is:unresolved'
end
it 'removes extra slashes in api url' do
2019-07-07 11:18:12 +05:30
expect(client.url).to eq(sentry_url)
2019-02-15 15:39:39 +05:30
expect(Gitlab::HTTP).to receive(:get).with(
URI('https://sentrytest.gitlab.com/api/0/projects/sentry-org/sentry-project/issues/'),
anything
).and_call_original
2019-03-02 22:35:43 +05:30
subject
2019-07-07 11:18:12 +05:30
expect(sentry_api_request).to have_been_requested
2019-05-18 00:54:41 +05:30
end
end
2019-07-07 11:18:12 +05:30
2020-01-01 13:55:28 +05:30
context 'requests with sort parameter in sentry api' do
let(:sentry_request_url) do
'https://sentrytest.gitlab.com/api/0/projects/sentry-org/sentry-project/' \
'issues/?limit=20&query=is:unresolved&sort=freq'
end
let!(:sentry_api_request) { stub_sentry_request(sentry_request_url, body: sentry_api_response) }
subject { client.list_issues(issue_status: issue_status, limit: limit, sort: 'frequency') }
it 'calls the sentry api with sort params' do
expect(Gitlab::HTTP).to receive(:get).with(
URI("#{sentry_url}/issues/"),
default_httparty_options.merge(query: { limit: 20, query: "is:unresolved", sort: "freq" })
).and_call_original
subject
expect(sentry_api_request).to have_been_requested
end
end
context 'with invalid sort params' do
subject { client.list_issues(issue_status: issue_status, limit: limit, sort: 'fish') }
it 'throws an error' do
expect { subject }.to raise_error(Sentry::Client::BadRequestError, 'Invalid value for sort param')
end
end
2019-07-07 11:18:12 +05:30
context 'Older sentry versions where keys are not present' do
let(:sentry_api_response) do
issues_sample_response[0...1].map do |issue|
issue[:project].delete(:id)
issue
end
end
it_behaves_like 'calls sentry api'
2020-01-01 13:55:28 +05:30
it_behaves_like 'issues has correct return type', Gitlab::ErrorTracking::Error
it_behaves_like 'issues has correct length', 1
2019-07-07 11:18:12 +05:30
it_behaves_like 'has correct external_url'
end
context 'essential keys missing in API response' do
let(:sentry_api_response) do
issues_sample_response[0...1].map do |issue|
issue.except(:id)
end
end
it 'raises exception' do
expect { subject }.to raise_error(Sentry::Client::MissingKeysError, 'Sentry API response is missing keys. key not found: "id"')
end
end
2019-12-26 22:10:19 +05:30
context 'sentry api response too large' do
it 'raises exception' do
deep_size = double('Gitlab::Utils::DeepSize', valid?: false)
allow(Gitlab::Utils::DeepSize).to receive(:new).with(sentry_api_response).and_return(deep_size)
expect { subject }.to raise_error(Sentry::Client::ResponseInvalidSizeError, 'Sentry API response is too big. Limit is 1 MB.')
end
end
2020-01-01 13:55:28 +05:30
it_behaves_like 'maps Sentry exceptions'
2019-05-18 00:54:41 +05:30
2020-01-01 13:55:28 +05:30
context 'when search term is present' do
let(:search_term) { 'NoMethodError' }
let(:sentry_request_url) { "#{sentry_url}/issues/?limit=20&query=is:unresolved NoMethodError" }
2019-07-07 11:18:12 +05:30
it_behaves_like 'calls sentry api'
2020-01-01 13:55:28 +05:30
it_behaves_like 'issues has correct return type', Gitlab::ErrorTracking::Error
it_behaves_like 'issues has correct length', 1
2019-03-02 22:35:43 +05:30
end
2020-01-01 13:55:28 +05:30
context 'when cursor is present' do
let(:cursor) { '1572959139000:0:0' }
let(:sentry_request_url) { "#{sentry_url}/issues/?limit=20&cursor=#{cursor}&query=is:unresolved" }
2019-03-02 22:35:43 +05:30
2020-01-01 13:55:28 +05:30
it_behaves_like 'calls sentry api'
2019-07-07 11:18:12 +05:30
2020-01-01 13:55:28 +05:30
it_behaves_like 'issues has correct return type', Gitlab::ErrorTracking::Error
it_behaves_like 'issues has correct length', 1
2019-07-07 11:18:12 +05:30
end
2019-02-15 15:39:39 +05:30
end
end