Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'spec/services/packages/nuget/symbols/create_symbol_files_service_spec.rb')
-rw-r--r--spec/services/packages/nuget/symbols/create_symbol_files_service_spec.rb103
1 files changed, 103 insertions, 0 deletions
diff --git a/spec/services/packages/nuget/symbols/create_symbol_files_service_spec.rb b/spec/services/packages/nuget/symbols/create_symbol_files_service_spec.rb
new file mode 100644
index 00000000000..97bfc3e06a8
--- /dev/null
+++ b/spec/services/packages/nuget/symbols/create_symbol_files_service_spec.rb
@@ -0,0 +1,103 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Packages::Nuget::Symbols::CreateSymbolFilesService, feature_category: :package_registry do
+ let_it_be(:package) { create(:nuget_package) }
+ let_it_be(:package_file) do
+ create(:package_file, :snupkg, package: package,
+ file_fixture: expand_fixture_path('packages/nuget/package_with_symbols.snupkg'))
+ end
+
+ let(:package_zip_file) { Zip::File.new(package_file.file) }
+ let(:service) { described_class.new(package, package_zip_file) }
+
+ describe '#execute' do
+ subject { service.execute }
+
+ shared_examples 'logs an error' do |error_class|
+ it 'logs an error' do
+ expect(Gitlab::ErrorTracking).to receive(:log_exception).with(
+ an_instance_of(error_class),
+ class: described_class.name,
+ package_id: package.id
+ )
+
+ subject
+ end
+ end
+
+ context 'when symbol files are found' do
+ it 'creates a symbol record and extracts the signature' do
+ expect_next_instance_of(Packages::Nuget::Symbols::ExtractSymbolSignatureService,
+ instance_of(String)) do |service|
+ expect(service).to receive(:execute).and_call_original
+ end
+
+ expect { subject }.to change { package.nuget_symbols.count }.by(1)
+ end
+ end
+
+ context 'when symbol files hit the limit' do
+ before do
+ stub_const("#{described_class}::SYMBOL_ENTRIES_LIMIT", 0)
+ end
+
+ it 'does not create a symbol record' do
+ expect { subject }.not_to change { package.nuget_symbols.count }
+ end
+
+ it_behaves_like 'logs an error', described_class::ExtractionError
+ end
+
+ context 'when creating a symbol record without a signature' do
+ before do
+ allow_next_instance_of(Packages::Nuget::Symbols::ExtractSymbolSignatureService) do |instance|
+ allow(instance).to receive(:execute).and_return(ServiceResponse.success(payload: nil))
+ end
+ end
+
+ it 'does not call create! on the symbol record' do
+ expect(::Packages::Nuget::Symbol).not_to receive(:create!)
+
+ subject
+ end
+ end
+
+ context 'when creating duplicate symbol records' do
+ let_it_be(:symbol) { create(:nuget_symbol, package: package) }
+
+ before do
+ allow_next_instance_of(Packages::Nuget::Symbols::ExtractSymbolSignatureService) do |instance|
+ allow(instance).to receive(:execute).and_return(ServiceResponse.success(payload: symbol.signature))
+ end
+ end
+
+ it 'does not create a symbol record' do
+ expect { subject }.not_to change { package.nuget_symbols.count }
+ end
+
+ it_behaves_like 'logs an error', ActiveRecord::RecordInvalid
+ end
+
+ context 'when a symbol file has the wrong entry size' do
+ before do
+ allow_next_instance_of(Zip::Entry) do |instance|
+ allow(instance).to receive(:extract).and_raise(Zip::EntrySizeError)
+ end
+ end
+
+ it_behaves_like 'logs an error', described_class::ExtractionError
+ end
+
+ context 'when a symbol file has the wrong entry name' do
+ before do
+ allow_next_instance_of(Zip::Entry) do |instance|
+ allow(instance).to receive(:extract).and_raise(Zip::EntryNameError)
+ end
+ end
+
+ it_behaves_like 'logs an error', described_class::ExtractionError
+ end
+ end
+end