diff options
Diffstat (limited to 'spec/lib/bulk_imports')
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], |