gitlab-ce/spec/services/ci/parse_annotations_artifact_...

183 lines
5.5 KiB
Ruby

# frozen_string_literal: true
require 'spec_helper'
RSpec.describe Ci::ParseAnnotationsArtifactService, feature_category: :job_artifacts do
let_it_be(:project) { create(:project) }
let_it_be_with_reload(:build) { create(:ci_build, project: project) }
let(:service) { described_class.new(project, nil) }
describe '#execute' do
subject { service.execute(artifact) }
context 'when build has an annotations artifact' do
let_it_be(:artifact) { create(:ci_job_artifact, :annotations, job: build) }
context 'when artifact does not have the specified blob' do
before do
allow(artifact).to receive(:each_blob)
end
it 'parses nothing' do
expect(subject[:status]).to eq(:success)
expect(build.job_annotations).to be_empty
end
end
context 'when artifact has the specified blob' do
let(:blob) { data.to_json }
before do
allow(artifact).to receive(:each_blob).and_yield(blob)
end
context 'when valid annotations are given' do
let(:data) do
{
external_links: [
{
external_link: {
label: 'URL 1',
url: 'https://url1.example.com/'
}
},
{
external_link: {
label: 'URL 2',
url: 'https://url2.example.com/'
}
}
]
}
end
it 'parses the artifact' do
subject
expect(build.job_annotations.as_json).to contain_exactly(
hash_including('name' => 'external_links', 'data' => [
hash_including('external_link' => hash_including('label' => 'URL 1', 'url' => 'https://url1.example.com/')),
hash_including('external_link' => hash_including('label' => 'URL 2', 'url' => 'https://url2.example.com/'))
])
)
end
end
context 'when valid annotations are given and annotation list name is the same' do
before do
build.job_annotations.create!(name: 'external_links', data: [
{
external_link: {
label: 'URL 1',
url: 'https://url1.example.com/'
}
}
])
end
let(:data) do
{
external_links: [
{
external_link: {
label: 'URL 2',
url: 'https://url2.example.com/'
}
}
]
}
end
it 'parses the artifact' do
subject
expect(build.job_annotations.as_json).to contain_exactly(
hash_including('name' => 'external_links', 'data' => [
hash_including('external_link' => hash_including('label' => 'URL 2', 'url' => 'https://url2.example.com/'))
])
)
end
end
context 'when invalid JSON is given' do
let(:blob) { 'Invalid JSON!' }
it 'returns error' do
expect(subject[:status]).to eq(:error)
expect(subject[:http_status]).to eq(:bad_request)
end
end
context 'when root is not an object' do
let(:data) { [] }
it 'returns error' do
expect(subject[:status]).to eq(:error)
expect(subject[:message]).to eq('Annotations files must be a JSON object')
expect(subject[:http_status]).to eq(:bad_request)
end
end
context 'when item is not a valid annotation list' do
let(:data) { { external_links: {} } }
it 'returns error' do
expect(subject[:status]).to eq(:error)
expect(subject[:message]).to eq('Validation failed: Data must be a valid json schema')
expect(subject[:http_status]).to eq(:bad_request)
end
end
context 'when more than limitated annotations are specified in annotations' do
let(:data) do
{
external_links_1: [
{
external_link: {
label: 'URL',
url: 'https://example.com/'
}
}
],
external_links_2: [
{
external_link: {
label: 'URL',
url: 'https://example.com/'
}
}
]
}
end
before do
allow(service).to receive(:annotations_num_limit).and_return(1)
end
it 'returns error' do
expect(subject[:status]).to eq(:error)
expect(subject[:message]).to eq(
"Annotations files cannot have more than #{service.send(:annotations_num_limit)} annotation lists")
expect(subject[:http_status]).to eq(:bad_request)
end
end
end
context 'when artifact size is too big' do
before do
allow(artifact.file).to receive(:size) { service.send(:annotations_size_limit) + 1.kilobyte }
end
it 'returns error' do
expect(subject[:status]).to eq(:error)
expect(subject[:message]).to eq(
"Annotations Artifact Too Big. Maximum Allowable Size: #{service.send(:annotations_size_limit)}")
expect(subject[:http_status]).to eq(:bad_request)
end
end
end
end
end