diff options
Diffstat (limited to 'spec/services/packages/npm/deprecate_package_service_spec.rb')
-rw-r--r-- | spec/services/packages/npm/deprecate_package_service_spec.rb | 115 |
1 files changed, 115 insertions, 0 deletions
diff --git a/spec/services/packages/npm/deprecate_package_service_spec.rb b/spec/services/packages/npm/deprecate_package_service_spec.rb new file mode 100644 index 00000000000..a3686e3a8b5 --- /dev/null +++ b/spec/services/packages/npm/deprecate_package_service_spec.rb @@ -0,0 +1,115 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe Packages::Npm::DeprecatePackageService, feature_category: :package_registry do + let_it_be(:namespace) { create(:namespace) } + let_it_be(:project) { create(:project, namespace: namespace) } + + let_it_be(:package_name) { "@#{namespace.path}/my-app" } + let_it_be_with_reload(:package_1) do + create(:npm_package, project: project, name: package_name, version: '1.0.1').tap do |package| + create(:npm_metadatum, package: package) + end + end + + let_it_be(:package_2) do + create(:npm_package, project: project, name: package_name, version: '1.0.2').tap do |package| + create(:npm_metadatum, package: package) + end + end + + let(:service) { described_class.new(project, params) } + + subject(:execute) { service.execute } + + describe '#execute' do + context 'when passing deprecatation message' do + let(:params) do + { + 'package_name' => package_name, + 'versions' => { + '1.0.1' => { + 'name' => package_name, + 'deprecated' => 'This version is deprecated' + }, + '1.0.2' => { + 'name' => package_name, + 'deprecated' => 'This version is deprecated' + } + } + } + end + + before do + package_json = package_2.npm_metadatum.package_json + package_2.npm_metadatum.update!(package_json: package_json.merge('deprecated' => 'old deprecation message')) + end + + it 'adds or updates the deprecated field' do + expect { execute } + .to change { package_1.reload.npm_metadatum.package_json['deprecated'] }.to('This version is deprecated') + .and change { package_2.reload.npm_metadatum.package_json['deprecated'] } + .from('old deprecation message').to('This version is deprecated') + end + + it 'executes 5 queries' do + queries = ActiveRecord::QueryRecorder.new do + execute + end + + # 1. each_batch lower bound + # 2. each_batch upper bound + # 3. SELECT packages_packages.id, packages_packages.version FROM packages_packages + # 4. SELECT packages_npm_metadata.* FROM packages_npm_metadata + # 5. UPDATE packages_npm_metadata SET package_json = + expect(queries.count).to eq(5) + end + end + + context 'when passing deprecated as empty string' do + let(:params) do + { + 'package_name' => package_name, + 'versions' => { + '1.0.1' => { + 'name' => package_name, + 'deprecated' => '' + } + } + } + end + + before do + package_json = package_1.npm_metadatum.package_json + package_1.npm_metadatum.update!(package_json: package_json.merge('deprecated' => 'This version is deprecated')) + end + + it 'removes the deprecation warning' do + expect { execute } + .to change { package_1.reload.npm_metadatum.package_json['deprecated'] } + .from('This version is deprecated').to(nil) + end + end + + context 'when passing async: true to execute' do + let(:params) do + { + package_name: package_name, + versions: { + '1.0.1': { + deprecated: 'This version is deprecated' + } + } + } + end + + it 'calls the worker and return' do + expect(::Packages::Npm::DeprecatePackageWorker).to receive(:perform_async).with(project.id, params) + expect(service).not_to receive(:packages) + + service.execute(async: true) + end + end + end +end |