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/lib/bulk_imports')
-rw-r--r--spec/lib/bulk_imports/common/extractors/json_extractor_spec.rb58
-rw-r--r--spec/lib/bulk_imports/common/extractors/ndjson_extractor_spec.rb29
-rw-r--r--spec/lib/bulk_imports/groups/pipelines/group_attributes_pipeline_spec.rb80
-rw-r--r--spec/lib/bulk_imports/groups/pipelines/group_pipeline_spec.rb2
-rw-r--r--spec/lib/bulk_imports/groups/pipelines/namespace_settings_pipeline_spec.rb75
-rw-r--r--spec/lib/bulk_imports/groups/pipelines/subgroup_entities_pipeline_spec.rb12
-rw-r--r--spec/lib/bulk_imports/groups/stage_spec.rb2
-rw-r--r--spec/lib/bulk_imports/groups/transformers/group_attributes_transformer_spec.rb26
-rw-r--r--spec/lib/bulk_imports/groups/transformers/subgroup_to_entity_transformer_spec.rb8
-rw-r--r--spec/lib/bulk_imports/ndjson_pipeline_spec.rb2
-rw-r--r--spec/lib/bulk_imports/pipeline_spec.rb4
-rw-r--r--spec/lib/bulk_imports/projects/pipelines/project_attributes_pipeline_spec.rb5
-rw-r--r--spec/lib/bulk_imports/projects/pipelines/releases_pipeline_spec.rb122
-rw-r--r--spec/lib/bulk_imports/projects/stage_spec.rb3
14 files changed, 390 insertions, 38 deletions
diff --git a/spec/lib/bulk_imports/common/extractors/json_extractor_spec.rb b/spec/lib/bulk_imports/common/extractors/json_extractor_spec.rb
new file mode 100644
index 00000000000..2c167cc485c
--- /dev/null
+++ b/spec/lib/bulk_imports/common/extractors/json_extractor_spec.rb
@@ -0,0 +1,58 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+require 'zlib'
+
+RSpec.describe BulkImports::Common::Extractors::JsonExtractor do
+ subject { described_class.new(relation: 'self') }
+
+ let_it_be(:tmpdir) { Dir.mktmpdir }
+ let_it_be(:import) { create(:bulk_import) }
+ let_it_be(:config) { create(:bulk_import_configuration, bulk_import: import) }
+ let_it_be(:entity) { create(:bulk_import_entity, bulk_import: import) }
+ let_it_be(:tracker) { create(:bulk_import_tracker, entity: entity) }
+ let_it_be(:context) { BulkImports::Pipeline::Context.new(tracker) }
+
+ before do
+ allow(FileUtils).to receive(:remove_entry).with(any_args).and_call_original
+
+ subject.instance_variable_set(:@tmpdir, tmpdir)
+ end
+
+ after(:all) do
+ FileUtils.remove_entry(tmpdir) if File.directory?(tmpdir)
+ end
+
+ describe '#extract' do
+ before do
+ Zlib::GzipWriter.open(File.join(tmpdir, 'self.json.gz')) do |gz|
+ gz.write '{"name": "Name","description": "Description","avatar":{"url":null}}'
+ end
+
+ expect(BulkImports::FileDownloadService).to receive(:new)
+ .with(
+ configuration: context.configuration,
+ relative_url: entity.relation_download_url_path('self'),
+ tmpdir: tmpdir,
+ filename: 'self.json.gz')
+ .and_return(instance_double(BulkImports::FileDownloadService, execute: nil))
+ end
+
+ it 'returns ExtractedData', :aggregate_failures do
+ extracted_data = subject.extract(context)
+
+ expect(extracted_data).to be_instance_of(BulkImports::Pipeline::ExtractedData)
+ expect(extracted_data.data).to contain_exactly(
+ { 'name' => 'Name', 'description' => 'Description', 'avatar' => { 'url' => nil } }
+ )
+ end
+ end
+
+ describe '#remove_tmpdir' do
+ it 'removes tmp dir' do
+ expect(FileUtils).to receive(:remove_entry).with(tmpdir).once
+
+ subject.remove_tmpdir
+ end
+ end
+end
diff --git a/spec/lib/bulk_imports/common/extractors/ndjson_extractor_spec.rb b/spec/lib/bulk_imports/common/extractors/ndjson_extractor_spec.rb
index d6e19a5fc85..8b63234ba50 100644
--- a/spec/lib/bulk_imports/common/extractors/ndjson_extractor_spec.rb
+++ b/spec/lib/bulk_imports/common/extractors/ndjson_extractor_spec.rb
@@ -1,10 +1,10 @@
# frozen_string_literal: true
require 'spec_helper'
+require 'zlib'
RSpec.describe BulkImports::Common::Extractors::NdjsonExtractor do
let_it_be(:tmpdir) { Dir.mktmpdir }
- let_it_be(:filepath) { 'spec/fixtures/bulk_imports/gz/labels.ndjson.gz' }
let_it_be(:import) { create(:bulk_import) }
let_it_be(:config) { create(:bulk_import_configuration, bulk_import: import) }
let_it_be(:entity) { create(:bulk_import_entity, bulk_import: import) }
@@ -25,21 +25,30 @@ RSpec.describe BulkImports::Common::Extractors::NdjsonExtractor do
describe '#extract' do
before do
- FileUtils.copy_file(filepath, File.join(tmpdir, 'labels.ndjson.gz'))
-
- allow_next_instance_of(BulkImports::FileDownloadService) do |service|
- allow(service).to receive(:execute)
+ Zlib::GzipWriter.open(File.join(tmpdir, 'labels.ndjson.gz')) do |gz|
+ gz.write [
+ '{"title": "Title 1","description": "Description 1","type":"GroupLabel"}',
+ '{"title": "Title 2","description": "Description 2","type":"GroupLabel"}'
+ ].join("\n")
end
+
+ expect(BulkImports::FileDownloadService).to receive(:new)
+ .with(
+ configuration: context.configuration,
+ relative_url: entity.relation_download_url_path('labels'),
+ tmpdir: tmpdir,
+ filename: 'labels.ndjson.gz')
+ .and_return(instance_double(BulkImports::FileDownloadService, execute: nil))
end
- it 'returns ExtractedData' do
+ it 'returns ExtractedData', :aggregate_failures do
extracted_data = subject.extract(context)
- label = extracted_data.data.first.first
expect(extracted_data).to be_instance_of(BulkImports::Pipeline::ExtractedData)
- expect(label['title']).to include('Label')
- expect(label['description']).to include('Label')
- expect(label['type']).to eq('GroupLabel')
+ expect(extracted_data.data.to_a).to contain_exactly(
+ [{ "title" => "Title 1", "description" => "Description 1", "type" => "GroupLabel" }, 0],
+ [{ "title" => "Title 2", "description" => "Description 2", "type" => "GroupLabel" }, 1]
+ )
end
end
diff --git a/spec/lib/bulk_imports/groups/pipelines/group_attributes_pipeline_spec.rb b/spec/lib/bulk_imports/groups/pipelines/group_attributes_pipeline_spec.rb
new file mode 100644
index 00000000000..7ac417afa0b
--- /dev/null
+++ b/spec/lib/bulk_imports/groups/pipelines/group_attributes_pipeline_spec.rb
@@ -0,0 +1,80 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe BulkImports::Groups::Pipelines::GroupAttributesPipeline do
+ subject(:pipeline) { described_class.new(context) }
+
+ let_it_be(:user) { create(:user) }
+ let_it_be(:group) { create(:group) }
+ let_it_be(:bulk_import) { create(:bulk_import, user: user) }
+ let_it_be(:entity) { create(:bulk_import_entity, :group_entity, group: group, bulk_import: bulk_import) }
+ let_it_be(:tracker) { create(:bulk_import_tracker, entity: entity) }
+ let_it_be(:context) { BulkImports::Pipeline::Context.new(tracker) }
+
+ let(:group_attributes) do
+ {
+ 'id' => 1,
+ 'name' => 'Group name',
+ 'path' => 'group-path',
+ 'description' => 'description',
+ 'avatar' => {
+ 'url' => nil
+ },
+ 'membership_lock' => true,
+ 'traversal_ids' => [
+ 2
+ ]
+ }
+ end
+
+ describe '#run' do
+ before do
+ allow_next_instance_of(BulkImports::Common::Extractors::JsonExtractor) do |extractor|
+ allow(extractor).to receive(:extract).and_return(
+ BulkImports::Pipeline::ExtractedData.new(data: group_attributes)
+ )
+ end
+ end
+
+ it 'imports allowed group attributes' do
+ expect(Groups::UpdateService).to receive(:new).with(group, user, { membership_lock: true }).and_call_original
+
+ pipeline.run
+
+ expect(group).to have_attributes(membership_lock: true)
+ end
+ end
+
+ describe '#transform' do
+ it 'fetches only allowed attributes and symbolize keys' do
+ transformed_data = pipeline.transform(context, group_attributes)
+
+ expect(transformed_data).to eq({ membership_lock: true })
+ end
+
+ context 'when there is no data to transform' do
+ let(:group_attributes) { nil }
+
+ it do
+ transformed_data = pipeline.transform(context, group_attributes)
+
+ expect(transformed_data).to eq(nil)
+ end
+ end
+ end
+
+ describe '#after_run' do
+ it 'calls extractor#remove_tmpdir' do
+ expect_next_instance_of(BulkImports::Common::Extractors::JsonExtractor) do |extractor|
+ expect(extractor).to receive(:remove_tmpdir)
+ end
+
+ pipeline.after_run(nil)
+ end
+ end
+
+ describe '.relation' do
+ it { expect(described_class.relation).to eq('self') }
+ end
+end
diff --git a/spec/lib/bulk_imports/groups/pipelines/group_pipeline_spec.rb b/spec/lib/bulk_imports/groups/pipelines/group_pipeline_spec.rb
index 39e782dc093..441a34b0c74 100644
--- a/spec/lib/bulk_imports/groups/pipelines/group_pipeline_spec.rb
+++ b/spec/lib/bulk_imports/groups/pipelines/group_pipeline_spec.rb
@@ -23,7 +23,7 @@ RSpec.describe BulkImports::Groups::Pipelines::GroupPipeline do
let(:group_data) do
{
- 'name' => 'source_name',
+ 'name' => 'Source Group Name',
'full_path' => 'source/full/path',
'visibility' => 'private',
'project_creation_level' => 'developer',
diff --git a/spec/lib/bulk_imports/groups/pipelines/namespace_settings_pipeline_spec.rb b/spec/lib/bulk_imports/groups/pipelines/namespace_settings_pipeline_spec.rb
new file mode 100644
index 00000000000..90b63453b88
--- /dev/null
+++ b/spec/lib/bulk_imports/groups/pipelines/namespace_settings_pipeline_spec.rb
@@ -0,0 +1,75 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe BulkImports::Groups::Pipelines::NamespaceSettingsPipeline do
+ subject(:pipeline) { described_class.new(context) }
+
+ let_it_be(:user) { create(:user) }
+ let_it_be(:group) { create(:group, namespace_settings: create(:namespace_settings) ) }
+ let_it_be(:bulk_import) { create(:bulk_import, user: user) }
+ let_it_be(:entity) { create(:bulk_import_entity, :group_entity, group: group, bulk_import: bulk_import) }
+ let_it_be(:tracker) { create(:bulk_import_tracker, entity: entity) }
+ let_it_be(:context) { BulkImports::Pipeline::Context.new(tracker) }
+
+ before do
+ group.add_owner(user)
+ end
+
+ describe '#run' do
+ before do
+ allow_next_instance_of(BulkImports::Common::Extractors::NdjsonExtractor) do |extractor|
+ namespace_settings_attributes = {
+ 'namespace_id' => 22,
+ 'prevent_forking_outside_group' => true,
+ 'prevent_sharing_groups_outside_hierarchy' => true
+ }
+ allow(extractor).to receive(:extract).and_return(
+ BulkImports::Pipeline::ExtractedData.new(data: [[namespace_settings_attributes, 0]])
+ )
+ end
+ end
+
+ it 'imports allowed namespace settings attributes' do
+ expect(Groups::UpdateService).to receive(:new).with(
+ group, user, { prevent_sharing_groups_outside_hierarchy: true }
+ ).and_call_original
+
+ pipeline.run
+
+ expect(group.namespace_settings).to have_attributes(prevent_sharing_groups_outside_hierarchy: true)
+ end
+ end
+
+ describe '#transform' do
+ it 'fetches only allowed attributes and symbolize keys' do
+ all_model_attributes = NamespaceSetting.new.attributes
+
+ transformed_data = pipeline.transform(context, [all_model_attributes, 0])
+
+ expect(transformed_data.keys).to match_array([:prevent_sharing_groups_outside_hierarchy])
+ end
+
+ context 'when there is no data to transform' do
+ it do
+ namespace_settings_attributes = nil
+
+ transformed_data = pipeline.transform(context, namespace_settings_attributes)
+
+ expect(transformed_data).to eq(nil)
+ end
+ end
+ end
+
+ describe '#after_run' do
+ it 'calls extractor#remove_tmpdir' do
+ expect_next_instance_of(BulkImports::Common::Extractors::NdjsonExtractor) do |extractor|
+ expect(extractor).to receive(:remove_tmpdir)
+ end
+
+ context = instance_double(BulkImports::Pipeline::Context)
+
+ pipeline.after_run(context)
+ end
+ end
+end
diff --git a/spec/lib/bulk_imports/groups/pipelines/subgroup_entities_pipeline_spec.rb b/spec/lib/bulk_imports/groups/pipelines/subgroup_entities_pipeline_spec.rb
index e4a41428dd2..6949ac59948 100644
--- a/spec/lib/bulk_imports/groups/pipelines/subgroup_entities_pipeline_spec.rb
+++ b/spec/lib/bulk_imports/groups/pipelines/subgroup_entities_pipeline_spec.rb
@@ -5,7 +5,7 @@ require 'spec_helper'
RSpec.describe BulkImports::Groups::Pipelines::SubgroupEntitiesPipeline do
let_it_be(:user) { create(:user) }
let_it_be(:group) { create(:group, path: 'group') }
- let_it_be(:parent) { create(:group, name: 'imported-group', path: 'imported-group') }
+ let_it_be(:parent) { create(:group, name: 'Imported Group', path: 'imported-group') }
let_it_be(:parent_entity) { create(:bulk_import_entity, destination_namespace: parent.full_path, group: parent) }
let_it_be(:tracker) { create(:bulk_import_tracker, entity: parent_entity) }
let_it_be(:context) { BulkImports::Pipeline::Context.new(tracker) }
@@ -14,8 +14,8 @@ RSpec.describe BulkImports::Groups::Pipelines::SubgroupEntitiesPipeline do
let(:extracted_data) do
BulkImports::Pipeline::ExtractedData.new(data: {
- 'name' => 'subgroup',
- 'full_path' => 'parent/subgroup'
+ 'path' => 'sub-group',
+ 'full_path' => 'parent/sub-group'
})
end
@@ -33,9 +33,9 @@ RSpec.describe BulkImports::Groups::Pipelines::SubgroupEntitiesPipeline do
subgroup_entity = BulkImports::Entity.last
- expect(subgroup_entity.source_full_path).to eq 'parent/subgroup'
+ expect(subgroup_entity.source_full_path).to eq 'parent/sub-group'
expect(subgroup_entity.destination_namespace).to eq 'imported-group'
- expect(subgroup_entity.destination_name).to eq 'subgroup'
+ expect(subgroup_entity.destination_name).to eq 'sub-group'
expect(subgroup_entity.parent_id).to eq parent_entity.id
end
end
@@ -51,9 +51,7 @@ RSpec.describe BulkImports::Groups::Pipelines::SubgroupEntitiesPipeline do
destination_namespace: parent_entity.group.full_path,
parent_id: parent_entity.id
}
-
expect { subject.load(context, data) }.to change(BulkImports::Entity, :count).by(1)
-
subgroup_entity = BulkImports::Entity.last
expect(subgroup_entity.source_full_path).to eq 'parent/subgroup'
diff --git a/spec/lib/bulk_imports/groups/stage_spec.rb b/spec/lib/bulk_imports/groups/stage_spec.rb
index 645dee4a6f1..8ce25ff87d7 100644
--- a/spec/lib/bulk_imports/groups/stage_spec.rb
+++ b/spec/lib/bulk_imports/groups/stage_spec.rb
@@ -11,7 +11,9 @@ RSpec.describe BulkImports::Groups::Stage do
let(:pipelines) do
[
[0, BulkImports::Groups::Pipelines::GroupPipeline],
+ [1, BulkImports::Groups::Pipelines::GroupAttributesPipeline],
[1, BulkImports::Groups::Pipelines::SubgroupEntitiesPipeline],
+ [1, BulkImports::Groups::Pipelines::NamespaceSettingsPipeline],
[1, BulkImports::Common::Pipelines::MembersPipeline],
[1, BulkImports::Common::Pipelines::LabelsPipeline],
[1, BulkImports::Common::Pipelines::MilestonesPipeline],
diff --git a/spec/lib/bulk_imports/groups/transformers/group_attributes_transformer_spec.rb b/spec/lib/bulk_imports/groups/transformers/group_attributes_transformer_spec.rb
index 75d8c15088a..c42ca9bef3b 100644
--- a/spec/lib/bulk_imports/groups/transformers/group_attributes_transformer_spec.rb
+++ b/spec/lib/bulk_imports/groups/transformers/group_attributes_transformer_spec.rb
@@ -6,7 +6,6 @@ RSpec.describe BulkImports::Groups::Transformers::GroupAttributesTransformer do
describe '#transform' do
let_it_be(:user) { create(:user) }
let_it_be(:parent) { create(:group) }
- let_it_be(:group) { create(:group, name: 'My Source Group', parent: parent) }
let_it_be(:bulk_import) { create(:bulk_import, user: user) }
let_it_be(:entity) do
@@ -14,7 +13,7 @@ RSpec.describe BulkImports::Groups::Transformers::GroupAttributesTransformer do
:bulk_import_entity,
bulk_import: bulk_import,
source_full_path: 'source/full/path',
- destination_name: group.name,
+ destination_name: 'destination-name-path',
destination_namespace: parent.full_path
)
end
@@ -24,7 +23,8 @@ RSpec.describe BulkImports::Groups::Transformers::GroupAttributesTransformer do
let(:data) do
{
- 'name' => 'source_name',
+ 'name' => 'Source Group Name',
+ 'path' => 'source-group-path',
'full_path' => 'source/full/path',
'visibility' => 'private',
'project_creation_level' => 'developer',
@@ -34,23 +34,27 @@ RSpec.describe BulkImports::Groups::Transformers::GroupAttributesTransformer do
subject { described_class.new }
- it 'transforms name to destination name' do
- transformed_data = subject.transform(context, data)
+ it 'returns original data with some keys transformed' do
+ transformed_data = subject.transform(context, { 'name' => 'Name', 'description' => 'Description' })
- expect(transformed_data['name']).not_to eq('source_name')
- expect(transformed_data['name']).to eq(group.name)
+ expect(transformed_data).to eq({
+ 'name' => 'Name',
+ 'description' => 'Description',
+ 'parent_id' => parent.id,
+ 'path' => 'destination-name-path'
+ })
end
- it 'removes full path' do
+ it 'transforms path from destination_name' do
transformed_data = subject.transform(context, data)
- expect(transformed_data).not_to have_key('full_path')
+ expect(transformed_data['path']).to eq(entity.destination_name)
end
- it 'transforms path to parameterized name' do
+ it 'removes full path' do
transformed_data = subject.transform(context, data)
- expect(transformed_data['path']).to eq(group.name.parameterize)
+ expect(transformed_data).not_to have_key('full_path')
end
it 'transforms visibility level' do
diff --git a/spec/lib/bulk_imports/groups/transformers/subgroup_to_entity_transformer_spec.rb b/spec/lib/bulk_imports/groups/transformers/subgroup_to_entity_transformer_spec.rb
index 2f97a5721e7..6450d90ec0f 100644
--- a/spec/lib/bulk_imports/groups/transformers/subgroup_to_entity_transformer_spec.rb
+++ b/spec/lib/bulk_imports/groups/transformers/subgroup_to_entity_transformer_spec.rb
@@ -9,14 +9,14 @@ RSpec.describe BulkImports::Groups::Transformers::SubgroupToEntityTransformer do
parent_entity = instance_double(BulkImports::Entity, group: parent, id: 1)
context = instance_double(BulkImports::Pipeline::Context, entity: parent_entity)
subgroup_data = {
- "name" => "subgroup",
- "full_path" => "parent/subgroup"
+ "path" => "sub-group",
+ "full_path" => "parent/sub-group"
}
expect(subject.transform(context, subgroup_data)).to eq(
source_type: :group_entity,
- source_full_path: "parent/subgroup",
- destination_name: "subgroup",
+ source_full_path: "parent/sub-group",
+ destination_name: "sub-group",
destination_namespace: parent.full_path,
parent_id: 1
)
diff --git a/spec/lib/bulk_imports/ndjson_pipeline_spec.rb b/spec/lib/bulk_imports/ndjson_pipeline_spec.rb
index 8ea6ceb7619..25edc9feea8 100644
--- a/spec/lib/bulk_imports/ndjson_pipeline_spec.rb
+++ b/spec/lib/bulk_imports/ndjson_pipeline_spec.rb
@@ -29,7 +29,7 @@ RSpec.describe BulkImports::NdjsonPipeline do
subject { NdjsonPipelineClass.new(group, user) }
it 'marks pipeline as ndjson' do
- expect(NdjsonPipelineClass.ndjson_pipeline?).to eq(true)
+ expect(NdjsonPipelineClass.file_extraction_pipeline?).to eq(true)
end
describe '#deep_transform_relation!' do
diff --git a/spec/lib/bulk_imports/pipeline_spec.rb b/spec/lib/bulk_imports/pipeline_spec.rb
index 48c265d6118..e4ecf99dab0 100644
--- a/spec/lib/bulk_imports/pipeline_spec.rb
+++ b/spec/lib/bulk_imports/pipeline_spec.rb
@@ -63,7 +63,7 @@ RSpec.describe BulkImports::Pipeline do
BulkImports::MyPipeline.transformer(klass, options)
BulkImports::MyPipeline.loader(klass, options)
BulkImports::MyPipeline.abort_on_failure!
- BulkImports::MyPipeline.ndjson_pipeline!
+ BulkImports::MyPipeline.file_extraction_pipeline!
expect(BulkImports::MyPipeline.get_extractor).to eq({ klass: klass, options: options })
@@ -75,7 +75,7 @@ RSpec.describe BulkImports::Pipeline do
expect(BulkImports::MyPipeline.get_loader).to eq({ klass: klass, options: options })
expect(BulkImports::MyPipeline.abort_on_failure?).to eq(true)
- expect(BulkImports::MyPipeline.ndjson_pipeline?).to eq(true)
+ expect(BulkImports::MyPipeline.file_extraction_pipeline?).to eq(true)
end
end
end
diff --git a/spec/lib/bulk_imports/projects/pipelines/project_attributes_pipeline_spec.rb b/spec/lib/bulk_imports/projects/pipelines/project_attributes_pipeline_spec.rb
index df7ff5b8062..aa9c7486c27 100644
--- a/spec/lib/bulk_imports/projects/pipelines/project_attributes_pipeline_spec.rb
+++ b/spec/lib/bulk_imports/projects/pipelines/project_attributes_pipeline_spec.rb
@@ -23,7 +23,6 @@ RSpec.describe BulkImports::Projects::Pipelines::ProjectAttributesPipeline do
'merge_requests_ff_only_enabled' => true,
'issues_template' => 'test',
'shared_runners_enabled' => true,
- 'build_coverage_regex' => 'build_coverage_regex',
'build_allow_git_fetch' => true,
'build_timeout' => 3600,
'pending_delete' => false,
@@ -177,4 +176,8 @@ RSpec.describe BulkImports::Projects::Pipelines::ProjectAttributesPipeline do
end
end
end
+
+ describe '.relation' do
+ it { expect(described_class.relation).to eq('self') }
+ end
end
diff --git a/spec/lib/bulk_imports/projects/pipelines/releases_pipeline_spec.rb b/spec/lib/bulk_imports/projects/pipelines/releases_pipeline_spec.rb
new file mode 100644
index 00000000000..2279e66720e
--- /dev/null
+++ b/spec/lib/bulk_imports/projects/pipelines/releases_pipeline_spec.rb
@@ -0,0 +1,122 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe BulkImports::Projects::Pipelines::ReleasesPipeline do
+ let_it_be(:user) { create(:user) }
+ let_it_be(:group) { create(:group) }
+ let_it_be(:project) { create(:project, group: group) }
+ let_it_be(:bulk_import) { create(:bulk_import, user: user) }
+ let_it_be(:entity) do
+ create(
+ :bulk_import_entity,
+ :project_entity,
+ project: project,
+ bulk_import: bulk_import,
+ source_full_path: 'source/full/path',
+ destination_name: 'My Destination Project',
+ destination_namespace: group.full_path
+ )
+ end
+
+ let_it_be(:tracker) { create(:bulk_import_tracker, entity: entity) }
+ let_it_be(:context) { BulkImports::Pipeline::Context.new(tracker) }
+
+ let(:attributes) { {} }
+ let(:release) do
+ {
+ 'tag' => '1.1',
+ 'name' => 'release 1.1',
+ 'description' => 'Release notes',
+ 'created_at' => '2019-12-26T10:17:14.621Z',
+ 'updated_at' => '2019-12-26T10:17:14.621Z',
+ 'released_at' => '2019-12-26T10:17:14.615Z',
+ 'sha' => '901de3a8bd5573f4a049b1457d28bc1592ba6bf9'
+ }.merge(attributes)
+ end
+
+ subject(:pipeline) { described_class.new(context) }
+
+ describe '#run' do
+ before do
+ group.add_owner(user)
+ with_index = [release, 0]
+
+ allow_next_instance_of(BulkImports::Common::Extractors::NdjsonExtractor) do |extractor|
+ allow(extractor).to receive(:extract).and_return(BulkImports::Pipeline::ExtractedData.new(data: [with_index]))
+ end
+
+ pipeline.run
+ end
+
+ it 'imports release into destination project' do
+ expect(project.releases.count).to eq(1)
+
+ imported_release = project.releases.last
+
+ aggregate_failures do
+ expect(imported_release.tag).to eq(release['tag'])
+ expect(imported_release.name).to eq(release['name'])
+ expect(imported_release.description).to eq(release['description'])
+ expect(imported_release.created_at.to_s).to eq('2019-12-26 10:17:14 UTC')
+ expect(imported_release.updated_at.to_s).to eq('2019-12-26 10:17:14 UTC')
+ expect(imported_release.released_at.to_s).to eq('2019-12-26 10:17:14 UTC')
+ expect(imported_release.sha).to eq(release['sha'])
+ end
+ end
+
+ context 'links' do
+ let(:link) do
+ {
+ 'url' => 'http://localhost/namespace6/project6/-/jobs/140463678/artifacts/download',
+ 'name' => 'release-1.1.dmg',
+ 'created_at' => '2019-12-26T10:17:14.621Z',
+ 'updated_at' => '2019-12-26T10:17:14.621Z'
+ }
+ end
+
+ let(:attributes) {{ 'links' => [link] }}
+
+ it 'restores release links' do
+ release_link = project.releases.last.links.first
+
+ aggregate_failures do
+ expect(release_link.url).to eq(link['url'])
+ expect(release_link.name).to eq(link['name'])
+ expect(release_link.created_at.to_s).to eq('2019-12-26 10:17:14 UTC')
+ expect(release_link.updated_at.to_s).to eq('2019-12-26 10:17:14 UTC')
+ end
+ end
+ end
+
+ context 'milestones' do
+ let(:milestone) do
+ {
+ 'iid' => 1,
+ 'state' => 'closed',
+ 'title' => 'test milestone',
+ 'description' => 'test milestone',
+ 'due_date' => '2016-06-14',
+ 'created_at' => '2016-06-14T15:02:04.415Z',
+ 'updated_at' => '2016-06-14T15:02:04.415Z'
+ }
+ end
+
+ let(:attributes) {{ 'milestone_releases' => [{ 'milestone' => milestone }] }}
+
+ it 'restores release milestone' do
+ release_milestone = project.releases.last.milestone_releases.first.milestone
+
+ aggregate_failures do
+ expect(release_milestone.iid).to eq(milestone['iid'])
+ expect(release_milestone.state).to eq(milestone['state'])
+ expect(release_milestone.title).to eq(milestone['title'])
+ expect(release_milestone.description).to eq(milestone['description'])
+ expect(release_milestone.due_date.to_s).to eq('2016-06-14')
+ expect(release_milestone.created_at.to_s).to eq('2016-06-14 15:02:04 UTC')
+ expect(release_milestone.updated_at.to_s).to eq('2016-06-14 15:02:04 UTC')
+ end
+ end
+ end
+ end
+end
diff --git a/spec/lib/bulk_imports/projects/stage_spec.rb b/spec/lib/bulk_imports/projects/stage_spec.rb
index 9fce30f3a81..e81d9cc5fb4 100644
--- a/spec/lib/bulk_imports/projects/stage_spec.rb
+++ b/spec/lib/bulk_imports/projects/stage_spec.rb
@@ -20,10 +20,11 @@ RSpec.describe BulkImports::Projects::Stage do
[4, BulkImports::Projects::Pipelines::MergeRequestsPipeline],
[4, BulkImports::Projects::Pipelines::ExternalPullRequestsPipeline],
[4, BulkImports::Projects::Pipelines::ProtectedBranchesPipeline],
- [4, BulkImports::Projects::Pipelines::CiPipelinesPipeline],
[4, BulkImports::Projects::Pipelines::ProjectFeaturePipeline],
[4, BulkImports::Projects::Pipelines::ContainerExpirationPolicyPipeline],
[4, BulkImports::Projects::Pipelines::ServiceDeskSettingPipeline],
+ [4, BulkImports::Projects::Pipelines::ReleasesPipeline],
+ [5, BulkImports::Projects::Pipelines::CiPipelinesPipeline],
[5, BulkImports::Common::Pipelines::WikiPipeline],
[5, BulkImports::Common::Pipelines::UploadsPipeline],
[5, BulkImports::Common::Pipelines::LfsObjectsPipeline],