gitlab-ce/spec/services/packages/npm/check_manifest_coherence_se...

117 lines
4.2 KiB
Ruby

# frozen_string_literal: true
require 'spec_helper'
RSpec.describe Packages::Npm::CheckManifestCoherenceService, :aggregate_failures, feature_category: :package_registry do
let_it_be(:package) { build(:npm_package) }
let_it_be(:package_metadata) { build(:npm_metadatum, package: package) }
let(:tar_header) { Gem::Package::TarHeader.new(name: 'json', size: package_json.size, mode: 0o644, prefix: '') }
let(:package_json_entry) { Gem::Package::TarReader::Entry.new(tar_header, StringIO.new(package_json)) }
let(:service) { described_class.new(package, package_json_entry) }
describe '#execute' do
using RSpec::Parameterized::TableSyntax
subject(:execute_service) { service.execute }
let(:package_name) { package.name }
let(:package_version) { package.version }
let(:package_scripts) { package_metadata.package_json_scripts }
where(:name, :version, :scripts, :coherent) do
ref(:package_name) | ref(:package_version) | ref(:package_scripts) | true
'foo' | ref(:package_version) | ref(:package_scripts) | false
ref(:package_name) | '5.0.3' | ref(:package_scripts) | false
ref(:package_name) | ref(:package_version) | { test: 'different script' } | false
'foo' | '5.0.3' | { test: 'different script' } | false
end
with_them do
let(:package_json) do
{
name: name,
version: version,
scripts: scripts
}.to_json
end
if params[:coherent]
it { is_expected.to be_success }
else
it 'raises a mismatch error' do
expect { execute_service }
.to raise_error(described_class::MismatchError, 'Package manifest is not coherent')
end
end
end
%i[name version scripts].each do |field|
context "with field #{field} present in sub key" do
let(:package_json) do
{
name: package.name,
version: package.version,
subkey: { field => 'test' },
scripts: package_metadata.package_json_scripts
}.to_json
end
it { is_expected.to be_success }
end
end
context 'with auto corrected version' do
where(:version_in_payload, :version_in_tarball, :coherent, :error_message) do
'5.0.3' | '5.0.3' | true | nil
'5.0.3' | '5.0.4' | false | described_class::MANIFEST_NOT_COHERENT_ERROR
'5.0.3' | 'v5.0.3' | true | nil
'5.0.3' | '5.0.3+build' | true | nil
'5.0.3' | 'v5.0.3+build' | true | nil
'5.0.3-test' | '5.0.3-test+build' | true | nil
'5.0.3-test' | 'v5.0.3-test+build' | true | nil
'5.0.3-test' | 'v5.0.3+build-test' | false | described_class::MANIFEST_NOT_COHERENT_ERROR
'5.0.3' | 'v5.0.3+build-test' | true | nil
'5.0.3' | '=5.0.3' | false | described_class::VERSION_NOT_COMPLIANT_ERROR
'5.1.3' | '05.01.03' | true | nil
'5.1.3-beta.1' | '5.1.3-beta.01' | true | nil
'5.0.3' | ' =5.0.3' | false | described_class::VERSION_NOT_COMPLIANT_ERROR
'5.0.3-beta' | '5.0.3beta' | false | described_class::VERSION_NOT_COMPLIANT_ERROR
end
with_them do
let(:package_json) do
{
name: package.name,
version: version_in_tarball,
scripts: package_metadata.package_json_scripts
}.to_json
end
before do
package.version = version_in_payload
end
if params[:coherent]
it { is_expected.to be_success }
else
it 'raises a mismatch error' do
expect { execute_service }
.to raise_error(described_class::MismatchError, error_message)
end
end
end
end
context 'when the package metadata is missing' do
let(:package_json) { { name: package_name, version: package_version, scripts: {} }.to_json }
before do
package.npm_metadatum = nil
end
it { is_expected.to be_success }
end
end
end