diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2021-03-16 03:09:44 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2021-03-16 03:09:44 +0300 |
commit | e512af1d82777b8bcf0bc678b8aeb3b96ef406a2 (patch) | |
tree | ebff9b5da0ca2e789502a91f7582985cf4ae091f /spec/services/packages | |
parent | e8c01bc6a16cc4aa934ac42cccb7b287527c93f0 (diff) |
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'spec/services/packages')
3 files changed, 287 insertions, 108 deletions
diff --git a/spec/services/packages/maven/metadata/create_plugins_xml_service_spec.rb b/spec/services/packages/maven/metadata/create_plugins_xml_service_spec.rb new file mode 100644 index 00000000000..6fc1087940d --- /dev/null +++ b/spec/services/packages/maven/metadata/create_plugins_xml_service_spec.rb @@ -0,0 +1,124 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe ::Packages::Maven::Metadata::CreatePluginsXmlService do + let_it_be(:group_id) { 'my/test' } + let_it_be(:package) { create(:maven_package, name: group_id, version: nil) } + + let(:plugins_in_database) { %w[one-maven-plugin two three-maven-plugin] } + let(:plugins_in_xml) { %w[one-maven-plugin two three-maven-plugin] } + let(:service) { described_class.new(metadata_content: metadata_xml, package: package) } + + describe '#execute' do + subject { service.execute } + + before do + next unless package + + plugins_in_database.each do |plugin| + create( + :maven_package, + name: "#{group_id}/#{plugin}", + version: '1.0.0', + project: package.project, + maven_metadatum_attributes: { + app_group: group_id.tr('/', '.'), + app_name: plugin, + app_version: '1.0.0' + } + ) + end + end + + shared_examples 'returning an xml with plugins from the database' do + it 'returns an metadata versions xml with versions in the database', :aggregate_failures do + expect(subject).to be_success + expect(subject.payload[:changes_exist]).to eq(true) + expect(subject.payload[:empty_versions]).to eq(false) + expect(plugins_from(subject.payload[:metadata_content])).to match_array(plugins_in_database) + end + end + + shared_examples 'returning no changes' do + it 'returns no changes', :aggregate_failures do + expect(subject).to be_success + expect(subject.payload).to eq(changes_exist: false, empty_versions: false) + end + end + + context 'with same plugins on both sides' do + it_behaves_like 'returning no changes' + end + + context 'with more plugins' do + let(:additional_plugins) { %w[four-maven-plugin five] } + + context 'in database' do + let(:plugins_in_database) { plugins_in_xml + additional_plugins } + + # we can't distinguish that the additional plugin are actually maven plugins + it_behaves_like 'returning no changes' + end + + context 'in xml' do + let(:plugins_in_xml) { plugins_in_database + additional_plugins } + + it_behaves_like 'returning an xml with plugins from the database' + end + end + + context 'with no versions in the database' do + let(:plugins_in_database) { [] } + + it 'returns a success', :aggregate_failures do + result = subject + + expect(result).to be_success + expect(result.payload).to eq(changes_exist: true, empty_plugins: true) + end + end + + context 'with an incomplete metadata content' do + let(:metadata_xml) { '<metadata></metadata>' } + + it_behaves_like 'returning an error service response', message: 'metadata_content is invalid' + end + + context 'with an invalid metadata content' do + let(:metadata_xml) { '<meta></metadata>' } + + it_behaves_like 'returning an error service response', message: 'metadata_content is invalid' + end + + it_behaves_like 'handling metadata content pointing to a file for the create xml service' + + it_behaves_like 'handling invalid parameters for create xml service' + end + + def metadata_xml + Nokogiri::XML::Builder.new do |xml| + xml.metadata do + xml.plugins do + plugins_in_xml.each do |plugin| + xml.plugin do + xml.name(plugin) + xml.prefix(prefix_from(plugin)) + xml.artifactId(plugin) + end + end + end + end + end.to_xml + end + + def prefix_from(artifact_id) + artifact_id.gsub(/-?maven-?/, '') + .gsub(/-?plugin-?/, '') + end + + def plugins_from(xml_content) + doc = Nokogiri::XML(xml_content) + doc.xpath('//metadata/plugins/plugin/artifactId').map(&:content) + end +end diff --git a/spec/services/packages/maven/metadata/create_versions_xml_service_spec.rb b/spec/services/packages/maven/metadata/create_versions_xml_service_spec.rb index 109f7adab4e..39c6feb5d12 100644 --- a/spec/services/packages/maven/metadata/create_versions_xml_service_spec.rb +++ b/spec/services/packages/maven/metadata/create_versions_xml_service_spec.rb @@ -181,59 +181,9 @@ RSpec.describe ::Packages::Maven::Metadata::CreateVersionsXmlService do it_behaves_like 'returning an error service response', message: 'metadata_content is invalid' end - context 'with metadata content pointing to a file' do - let(:service) { described_class.new(metadata_content: file, package: package) } - let(:file) do - Tempfile.new('metadata').tap do |file| - if file_contents - file.write(file_contents) - file.flush - file.rewind - end - end - end - - after do - file.close - file.unlink - end - - context 'with valid content' do - let(:file_contents) { metadata_xml } - - it 'returns no changes' do - result = subject - - expect(result).to be_success - expect(result.payload).to eq(changes_exist: false, empty_versions: false) - end - end + it_behaves_like 'handling metadata content pointing to a file for the create xml service' - context 'with invalid content' do - let(:file_contents) { '<meta></metadata>' } - - it_behaves_like 'returning an error service response', message: 'metadata_content is invalid' - end - - context 'with no content' do - let(:file_contents) { nil } - - it_behaves_like 'returning an error service response', message: 'metadata_content is invalid' - end - end - - context 'with no package' do - let(:metadata_xml) { '' } - let(:package) { nil } - - it_behaves_like 'returning an error service response', message: 'package not set' - end - - context 'with no metadata content' do - let(:metadata_xml) { nil } - - it_behaves_like 'returning an error service response', message: 'metadata_content not set' - end + it_behaves_like 'handling invalid parameters for create xml service' end def metadata_xml diff --git a/spec/services/packages/maven/metadata/sync_service_spec.rb b/spec/services/packages/maven/metadata/sync_service_spec.rb index be298e95236..f5634159e6d 100644 --- a/spec/services/packages/maven/metadata/sync_service_spec.rb +++ b/spec/services/packages/maven/metadata/sync_service_spec.rb @@ -57,97 +57,202 @@ RSpec.describe ::Packages::Maven::Metadata::SyncService do project.add_maintainer(user) end - context 'with no changes' do - let(:create_versions_xml_service_response) { ServiceResponse.success(payload: { changes_exist: false }) } - + context 'with a jar package' do before do - expect(::Packages::Maven::Metadata::AppendPackageFileService).not_to receive(:new) + expect(::Packages::Maven::Metadata::CreatePluginsXmlService).not_to receive(:new) end - it_behaves_like 'returning a success service response', message: 'No changes for versions xml' - end + context 'with no changes' do + let(:create_versions_xml_service_response) { ServiceResponse.success(payload: { changes_exist: false }) } + + before do + expect(::Packages::Maven::Metadata::AppendPackageFileService).not_to receive(:new) + end + + it_behaves_like 'returning a success service response', message: 'No changes for versions xml' + end + + context 'with changes' do + let(:create_versions_xml_service_response) { ServiceResponse.success(payload: { changes_exist: true, empty_versions: false, metadata_content: 'new metadata' }) } + + it_behaves_like 'returning a success service response', message: 'New metadata package files created' - context 'with changes' do - let(:create_versions_xml_service_response) { ServiceResponse.success(payload: { changes_exist: true, empty_versions: false, metadata_content: 'new metadata' }) } + context 'with empty versions' do + let(:create_versions_xml_service_response) { ServiceResponse.success(payload: { changes_exist: true, empty_versions: true }) } - it_behaves_like 'returning a success service response', message: 'New metadata package files created' + before do + expect(service.send(:versionless_package_for_versions)).to receive(:destroy!) + expect(::Packages::Maven::Metadata::AppendPackageFileService).not_to receive(:new) + end - context 'with empty versions' do - let(:create_versions_xml_service_response) { ServiceResponse.success(payload: { changes_exist: true, empty_versions: true }) } + it_behaves_like 'returning a success service response', message: 'Versionless package for versions destroyed' + end + end + context 'with a too big maven metadata file for versions' do before do - expect(service.send(:versionless_package_for_versions)).to receive(:destroy!) - expect(::Packages::Maven::Metadata::AppendPackageFileService).not_to receive(:new) + metadata_file_for_versions.update!(size: 100.megabytes) end - it_behaves_like 'returning a success service response', message: 'Versionless package for versions destroyed' + it_behaves_like 'returning an error service response', message: 'Metadata file for versions is too big' end - end - context 'with a too big maven metadata file for versions' do - before do - metadata_file_for_versions.update!(size: 100.megabytes) - end + context 'an error from the create versions xml service' do + let(:create_versions_xml_service_response) { ServiceResponse.error(message: 'metadata_content is invalid') } - it_behaves_like 'returning an error service response', message: 'Metadata file for versions is too big' - end + before do + expect(::Packages::Maven::Metadata::AppendPackageFileService).not_to receive(:new) + end - context 'an error from the create versions xml service' do - let(:create_versions_xml_service_response) { ServiceResponse.error(message: 'metadata_content is invalid') } + it_behaves_like 'returning an error service response', message: 'metadata_content is invalid' + end - before do - expect(::Packages::Maven::Metadata::AppendPackageFileService).not_to receive(:new) + context 'an error from the append package file service' do + let(:append_package_file_service_response) { ServiceResponse.error(message: 'metadata content is not set') } + + it_behaves_like 'returning an error service response', message: 'metadata content is not set' end - it_behaves_like 'returning an error service response', message: 'metadata_content is invalid' - end + context 'without a package name' do + let(:service) { described_class.new(container: project, current_user: user, params: { package_name: nil }) } - context 'an error from the append package file service' do - let(:append_package_file_service_response) { ServiceResponse.error(message: 'metadata content is not set') } + before do + expect(::Packages::Maven::Metadata::AppendPackageFileService).not_to receive(:new) + expect(::Packages::Maven::Metadata::CreateVersionsXmlService).not_to receive(:new) + end - it_behaves_like 'returning an error service response', message: 'metadata content is not set' - end + it_behaves_like 'returning an error service response', message: 'Blank package name' + end - context 'without a package name' do - let(:service) { described_class.new(container: project, current_user: user, params: { package_name: nil }) } + context 'without a versionless package for version' do + before do + versionless_package_for_versions.update!(version: '2.2.2') + expect(::Packages::Maven::Metadata::AppendPackageFileService).not_to receive(:new) + expect(::Packages::Maven::Metadata::CreateVersionsXmlService).not_to receive(:new) + end - before do - expect(::Packages::Maven::Metadata::AppendPackageFileService).not_to receive(:new) - expect(::Packages::Maven::Metadata::CreateVersionsXmlService).not_to receive(:new) + it_behaves_like 'returning an error service response', message: 'Non existing versionless package' end - it_behaves_like 'returning an error service response', message: 'Blank package name' - end + context 'without a metadata package file for versions' do + before do + versionless_package_for_versions.package_files.update_all(file_name: 'test.txt') + expect(::Packages::Maven::Metadata::AppendPackageFileService).not_to receive(:new) + expect(::Packages::Maven::Metadata::CreateVersionsXmlService).not_to receive(:new) + end - context 'without a versionless package for version' do - before do - versionless_package_for_versions.update!(version: '2.2.2') - expect(::Packages::Maven::Metadata::AppendPackageFileService).not_to receive(:new) - expect(::Packages::Maven::Metadata::CreateVersionsXmlService).not_to receive(:new) + it_behaves_like 'returning an error service response', message: 'Non existing metadata file for versions' end - it_behaves_like 'returning an error service response', message: 'Non existing versionless package' + context 'without a project' do + let(:service) { described_class.new(container: nil, current_user: user, params: { package_name: versionless_package_for_versions.name }) } + + before do + expect(::Packages::Maven::Metadata::AppendPackageFileService).not_to receive(:new) + expect(::Packages::Maven::Metadata::CreateVersionsXmlService).not_to receive(:new) + end + + it_behaves_like 'returning an error service response', message: 'Not allowed' + end end - context 'without a metadata package file for versions' do + context 'with a maven plugin package' do + let_it_be(:versionless_package_name_for_plugins) { versionless_package_for_versions.maven_metadatum.app_group.tr('.', '/') } + let_it_be_with_reload(:versionless_package_for_plugins) { create(:maven_package, name: versionless_package_name_for_plugins, version: nil, project: project) } + let_it_be_with_reload(:metadata_file_for_plugins) { create(:package_file, :xml, package: versionless_package_for_plugins) } + + let(:create_plugins_xml_service_double) { double(::Packages::Maven::Metadata::CreatePluginsXmlService, execute: create_plugins_xml_service_response) } + let(:create_plugins_xml_service_response) { ServiceResponse.success(payload: { changes_exist: false }) } + before do - versionless_package_for_versions.package_files.update_all(file_name: 'test.txt') - expect(::Packages::Maven::Metadata::AppendPackageFileService).not_to receive(:new) - expect(::Packages::Maven::Metadata::CreateVersionsXmlService).not_to receive(:new) + allow(::Packages::Maven::Metadata::CreatePluginsXmlService) + .to receive(:new).with(metadata_content: an_instance_of(ObjectStorage::Concern::OpenFile), package: versionless_package_for_plugins).and_return(create_plugins_xml_service_double) + allow(::Packages::Maven::Metadata::AppendPackageFileService) + .to receive(:new).with(metadata_content: an_instance_of(String), package: versionless_package_for_plugins).and_return(append_package_file_service_double) end - it_behaves_like 'returning an error service response', message: 'Non existing metadata file for versions' - end + context 'with no changes' do + let(:create_versions_xml_service_response) { ServiceResponse.success(payload: { changes_exist: false }) } - context 'without a project' do - let(:service) { described_class.new(container: nil, current_user: user, params: { package_name: versionless_package_for_versions.name }) } + before do + expect(::Packages::Maven::Metadata::AppendPackageFileService).not_to receive(:new) + end - before do - expect(::Packages::Maven::Metadata::AppendPackageFileService).not_to receive(:new) - expect(::Packages::Maven::Metadata::CreateVersionsXmlService).not_to receive(:new) + it_behaves_like 'returning a success service response', message: 'No changes for versions xml' end - it_behaves_like 'returning an error service response', message: 'Not allowed' + context 'with changes in the versions xml' do + let(:create_versions_xml_service_response) { ServiceResponse.success(payload: { changes_exist: true, empty_versions: false, metadata_content: 'new metadata' }) } + + it_behaves_like 'returning a success service response', message: 'New metadata package files created' + + context 'with changes in the plugin xml' do + let(:create_plugins_xml_service_response) { ServiceResponse.success(payload: { changes_exist: true, empty_plugins: false, metadata_content: 'new metadata' }) } + + it_behaves_like 'returning a success service response', message: 'New metadata package files created' + end + + context 'with empty versions' do + let(:create_versions_xml_service_response) { ServiceResponse.success(payload: { changes_exist: true, empty_versions: true }) } + let(:create_plugins_xml_service_response) { ServiceResponse.success(payload: { changes_exist: true, empty_plugins: true }) } + + before do + expect(service.send(:versionless_package_for_versions)).to receive(:destroy!) + expect(service.send(:metadata_package_file_for_plugins).package).to receive(:destroy!) + expect(::Packages::Maven::Metadata::AppendPackageFileService).not_to receive(:new) + end + + it_behaves_like 'returning a success service response', message: 'Versionless package for versions destroyed' + end + + context 'with a too big maven metadata file for versions' do + before do + metadata_file_for_plugins.update!(size: 100.megabytes) + end + + it_behaves_like 'returning an error service response', message: 'Metadata file for plugins is too big' + end + + context 'an error from the create versions xml service' do + let(:create_plugins_xml_service_response) { ServiceResponse.error(message: 'metadata_content is invalid') } + + before do + expect(::Packages::Maven::Metadata::CreateVersionsXmlService).not_to receive(:new) + expect(::Packages::Maven::Metadata::AppendPackageFileService).not_to receive(:new) + end + + it_behaves_like 'returning an error service response', message: 'metadata_content is invalid' + end + + context 'an error from the append package file service' do + let(:create_plugins_xml_service_response) { ServiceResponse.success(payload: { changes_exist: true, empty_plugins: false, metadata_content: 'new metadata' }) } + let(:append_package_file_service_response) { ServiceResponse.error(message: 'metadata content is not set') } + + before do + expect(::Packages::Maven::Metadata::CreateVersionsXmlService).not_to receive(:new) + end + + it_behaves_like 'returning an error service response', message: 'metadata content is not set' + end + + context 'without a versionless package for plugins' do + before do + versionless_package_for_plugins.package_files.update_all(file_name: 'test.txt') + expect(::Packages::Maven::Metadata::CreatePluginsXmlService).not_to receive(:new) + end + + it_behaves_like 'returning a success service response', message: 'New metadata package files created' + end + + context 'without a metadata package file for plugins' do + before do + versionless_package_for_plugins.package_files.update_all(file_name: 'test.txt') + expect(::Packages::Maven::Metadata::CreatePluginsXmlService).not_to receive(:new) + end + + it_behaves_like 'returning a success service response', message: 'New metadata package files created' + end + end end end end |