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:
authorGitLab Bot <gitlab-bot@gitlab.com>2021-03-16 03:09:44 +0300
committerGitLab Bot <gitlab-bot@gitlab.com>2021-03-16 03:09:44 +0300
commite512af1d82777b8bcf0bc678b8aeb3b96ef406a2 (patch)
treeebff9b5da0ca2e789502a91f7582985cf4ae091f /spec/services/packages
parente8c01bc6a16cc4aa934ac42cccb7b287527c93f0 (diff)
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'spec/services/packages')
-rw-r--r--spec/services/packages/maven/metadata/create_plugins_xml_service_spec.rb124
-rw-r--r--spec/services/packages/maven/metadata/create_versions_xml_service_spec.rb54
-rw-r--r--spec/services/packages/maven/metadata/sync_service_spec.rb217
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