diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2021-10-20 11:43:02 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2021-10-20 11:43:02 +0300 |
commit | d9ab72d6080f594d0b3cae15f14b3ef2c6c638cb (patch) | |
tree | 2341ef426af70ad1e289c38036737e04b0aa5007 /spec/lib/bulk_imports | |
parent | d6e514dd13db8947884cd58fe2a9c2a063400a9b (diff) |
Add latest changes from gitlab-org/gitlab@14-4-stable-eev14.4.0-rc42
Diffstat (limited to 'spec/lib/bulk_imports')
-rw-r--r-- | spec/lib/bulk_imports/clients/graphql_spec.rb | 2 | ||||
-rw-r--r-- | spec/lib/bulk_imports/clients/http_spec.rb | 34 | ||||
-rw-r--r-- | spec/lib/bulk_imports/common/pipelines/boards_pipeline_spec.rb | 98 | ||||
-rw-r--r-- | spec/lib/bulk_imports/common/pipelines/labels_pipeline_spec.rb (renamed from spec/lib/bulk_imports/groups/pipelines/labels_pipeline_spec.rb) | 2 | ||||
-rw-r--r-- | spec/lib/bulk_imports/groups/pipelines/boards_pipeline_spec.rb | 49 | ||||
-rw-r--r-- | spec/lib/bulk_imports/groups/stage_spec.rb | 18 | ||||
-rw-r--r-- | spec/lib/bulk_imports/ndjson_pipeline_spec.rb | 16 | ||||
-rw-r--r-- | spec/lib/bulk_imports/network_error_spec.rb | 72 | ||||
-rw-r--r-- | spec/lib/bulk_imports/projects/graphql/get_repository_query_spec.rb | 21 | ||||
-rw-r--r-- | spec/lib/bulk_imports/projects/pipelines/issues_pipeline_spec.rb | 168 | ||||
-rw-r--r-- | spec/lib/bulk_imports/projects/pipelines/repository_pipeline_spec.rb | 73 | ||||
-rw-r--r-- | spec/lib/bulk_imports/projects/stage_spec.rb | 16 |
12 files changed, 505 insertions, 64 deletions
diff --git a/spec/lib/bulk_imports/clients/graphql_spec.rb b/spec/lib/bulk_imports/clients/graphql_spec.rb index 2f212458c4a..a5b5e96e594 100644 --- a/spec/lib/bulk_imports/clients/graphql_spec.rb +++ b/spec/lib/bulk_imports/clients/graphql_spec.rb @@ -34,7 +34,7 @@ RSpec.describe BulkImports::Clients::Graphql do let(:version) { '13.0.0' } it 'raises an error' do - expect { subject.execute('test') }.to raise_error(::BulkImports::Error, "Unsupported GitLab Version. Minimum Supported Gitlab Version #{BulkImport::MINIMUM_GITLAB_MAJOR_VERSION}.") + expect { subject.execute('test') }.to raise_error(::BulkImports::Error, "Unsupported GitLab Version. Minimum Supported Gitlab Version #{BulkImport::MIN_MAJOR_VERSION}.") end end end diff --git a/spec/lib/bulk_imports/clients/http_spec.rb b/spec/lib/bulk_imports/clients/http_spec.rb index c36cb80851a..623f9aa453a 100644 --- a/spec/lib/bulk_imports/clients/http_spec.rb +++ b/spec/lib/bulk_imports/clients/http_spec.rb @@ -8,7 +8,7 @@ RSpec.describe BulkImports::Clients::HTTP do let(:url) { 'http://gitlab.example' } let(:token) { 'token' } let(:resource) { 'resource' } - let(:version) { "#{BulkImport::MINIMUM_GITLAB_MAJOR_VERSION}.0.0" } + let(:version) { "#{BulkImport::MIN_MAJOR_VERSION}.0.0" } let(:response_double) { double(code: 200, success?: true, parsed_response: {}) } let(:version_response) { double(code: 200, success?: true, parsed_response: { 'version' => version }) } @@ -32,7 +32,7 @@ RSpec.describe BulkImports::Clients::HTTP do it 'raises BulkImports::Error' do allow(Gitlab::HTTP).to receive(method).and_raise(Errno::ECONNREFUSED) - expect { subject.public_send(method, resource) }.to raise_exception(BulkImports::Error) + expect { subject.public_send(method, resource) }.to raise_exception(BulkImports::NetworkError) end end @@ -42,7 +42,7 @@ RSpec.describe BulkImports::Clients::HTTP do allow(Gitlab::HTTP).to receive(method).and_return(response_double) - expect { subject.public_send(method, resource) }.to raise_exception(BulkImports::Error) + expect { subject.public_send(method, resource) }.to raise_exception(BulkImports::NetworkError) end end end @@ -176,11 +176,37 @@ RSpec.describe BulkImports::Clients::HTTP do end end + describe '#instance_version' do + it 'returns version as an instance of Gitlab::VersionInfo' do + expect(subject.instance_version).to eq(Gitlab::VersionInfo.parse(version)) + end + end + + describe '#compatible_for_project_migration?' do + context 'when instance version is lower the the expected minimum' do + it 'returns false' do + expect(subject.compatible_for_project_migration?).to be false + end + end + + context 'when instance version is at least the expected minimum' do + let(:version) { "14.4.4" } + + it 'returns true' do + expect(subject.compatible_for_project_migration?).to be true + end + end + end + context 'when source instance is incompatible' do let(:version) { '13.0.0' } it 'raises an error' do - expect { subject.get(resource) }.to raise_error(::BulkImports::Error, "Unsupported GitLab Version. Minimum Supported Gitlab Version #{BulkImport::MINIMUM_GITLAB_MAJOR_VERSION}.") + expect { subject.get(resource) } + .to raise_error( + ::BulkImports::Error, + "Unsupported GitLab Version. Minimum Supported Gitlab Version #{BulkImport::MIN_MAJOR_VERSION}." + ) end end diff --git a/spec/lib/bulk_imports/common/pipelines/boards_pipeline_spec.rb b/spec/lib/bulk_imports/common/pipelines/boards_pipeline_spec.rb new file mode 100644 index 00000000000..241bd694a2c --- /dev/null +++ b/spec/lib/bulk_imports/common/pipelines/boards_pipeline_spec.rb @@ -0,0 +1,98 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe BulkImports::Common::Pipelines::BoardsPipeline 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(:board_data) do + { + "name" => "Test Board", + "lists" => [ + { + "list_type" => "backlog", + "position" => 0 + }, + { + "list_type" => "closed", + "position" => 1 + }, + { + "list_type" => "label", + "position" => 2, + "label" => { + "title" => "test", + "type" => "GroupLabel", + "group_id" => group.id + } + } + ] + } + end + + let(:tracker) { create(:bulk_import_tracker, entity: entity) } + let(:context) { BulkImports::Pipeline::Context.new(tracker) } + + subject { described_class.new(context) } + + before do + allow_next_instance_of(BulkImports::Common::Extractors::NdjsonExtractor) do |extractor| + allow(extractor).to receive(:extract).and_return(BulkImports::Pipeline::ExtractedData.new(data: board_data)) + end + group.add_owner(user) + end + + context 'when issue board belongs to a project' do + let_it_be(:entity) do + create( + :bulk_import_entity, + source_type: :project_entity, + project: project, + bulk_import: bulk_import, + source_full_path: 'source/full/path', + destination_name: 'My Destination Group', + destination_namespace: group.full_path + ) + end + + describe '#run' do + it 'imports issue boards into destination project' do + expect { subject.run }.to change(::Board, :count).by(1) + board = project.boards.find_by(name: board_data["name"]) + expect(board).to be + expect(board.project.id).to eq(project.id) + expect(board.lists.count).to eq(3) + expect(board.lists.map(&:list_type).sort).to match_array(%w(backlog closed label)) + expect(board.lists.find_by(list_type: "label").label.title).to eq("test") + end + end + end + + context 'when issue board belongs to a group' do + let_it_be(:entity) do + create( + :bulk_import_entity, + group: group, + bulk_import: bulk_import, + source_full_path: 'source/full/path', + destination_name: 'My Destination Group', + destination_namespace: group.full_path + ) + end + + describe '#run' do + it 'imports issue boards into destination group' do + expect { subject.run }.to change(::Board, :count).by(1) + board = group.boards.find_by(name: board_data["name"]) + expect(board).to be + expect(board.group.id).to eq(group.id) + expect(board.lists.count).to eq(3) + expect(board.lists.map(&:list_type).sort).to match_array(%w(backlog closed label)) + expect(board.lists.find_by(list_type: "label").label.title).to eq("test") + end + end + end +end diff --git a/spec/lib/bulk_imports/groups/pipelines/labels_pipeline_spec.rb b/spec/lib/bulk_imports/common/pipelines/labels_pipeline_spec.rb index 6344dae0fb7..9e3a6d5b8df 100644 --- a/spec/lib/bulk_imports/groups/pipelines/labels_pipeline_spec.rb +++ b/spec/lib/bulk_imports/common/pipelines/labels_pipeline_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe BulkImports::Groups::Pipelines::LabelsPipeline do +RSpec.describe BulkImports::Common::Pipelines::LabelsPipeline do let_it_be(:user) { create(:user) } let_it_be(:group) { create(:group) } let_it_be(:bulk_import) { create(:bulk_import, user: user) } diff --git a/spec/lib/bulk_imports/groups/pipelines/boards_pipeline_spec.rb b/spec/lib/bulk_imports/groups/pipelines/boards_pipeline_spec.rb deleted file mode 100644 index 8b2f03ca15f..00000000000 --- a/spec/lib/bulk_imports/groups/pipelines/boards_pipeline_spec.rb +++ /dev/null @@ -1,49 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' - -RSpec.describe BulkImports::Groups::Pipelines::BoardsPipeline do - 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(:filepath) { 'spec/fixtures/bulk_imports/gz/boards.ndjson.gz' } - let_it_be(:entity) do - create( - :bulk_import_entity, - group: group, - bulk_import: bulk_import, - source_full_path: 'source/full/path', - destination_name: 'My Destination Group', - 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(:tmpdir) { Dir.mktmpdir } - - before do - FileUtils.copy_file(filepath, File.join(tmpdir, 'boards.ndjson.gz')) - group.add_owner(user) - end - - subject { described_class.new(context) } - - describe '#run' do - it 'imports group boards into destination group and removes tmpdir' do - allow(Dir).to receive(:mktmpdir).and_return(tmpdir) - allow_next_instance_of(BulkImports::FileDownloadService) do |service| - allow(service).to receive(:execute) - end - - expect { subject.run }.to change(Board, :count).by(1) - - lists = group.boards.find_by(name: 'first board').lists - - expect(lists.count).to eq(3) - expect(lists.first.label.title).to eq('TSL') - expect(lists.second.label.title).to eq('Sosync') - end - end -end diff --git a/spec/lib/bulk_imports/groups/stage_spec.rb b/spec/lib/bulk_imports/groups/stage_spec.rb index 81c0ffc14d4..b322b7b0edf 100644 --- a/spec/lib/bulk_imports/groups/stage_spec.rb +++ b/spec/lib/bulk_imports/groups/stage_spec.rb @@ -3,36 +3,42 @@ require 'spec_helper' RSpec.describe BulkImports::Groups::Stage do + let(:bulk_import) { build(:bulk_import) } + let(:pipelines) do [ [0, BulkImports::Groups::Pipelines::GroupPipeline], [1, BulkImports::Groups::Pipelines::GroupAvatarPipeline], [1, BulkImports::Groups::Pipelines::SubgroupEntitiesPipeline], [1, BulkImports::Groups::Pipelines::MembersPipeline], - [1, BulkImports::Groups::Pipelines::LabelsPipeline], + [1, BulkImports::Common::Pipelines::LabelsPipeline], [1, BulkImports::Groups::Pipelines::MilestonesPipeline], [1, BulkImports::Groups::Pipelines::BadgesPipeline], - [2, BulkImports::Groups::Pipelines::BoardsPipeline] + [2, BulkImports::Common::Pipelines::BoardsPipeline] ] end + it 'raises error when initialized without a BulkImport' do + expect { described_class.new({}) }.to raise_error(ArgumentError, 'Expected an argument of type ::BulkImport') + end + describe '.pipelines' do it 'list all the pipelines with their stage number, ordered by stage' do - expect(described_class.pipelines & pipelines).to eq(pipelines) - expect(described_class.pipelines.last.last).to eq(BulkImports::Common::Pipelines::EntityFinisher) + expect(described_class.new(bulk_import).pipelines & pipelines).to eq(pipelines) + expect(described_class.new(bulk_import).pipelines.last.last).to eq(BulkImports::Common::Pipelines::EntityFinisher) end it 'includes project entities pipeline' do stub_feature_flags(bulk_import_projects: true) - expect(described_class.pipelines).to include([1, BulkImports::Groups::Pipelines::ProjectEntitiesPipeline]) + expect(described_class.new(bulk_import).pipelines).to include([1, BulkImports::Groups::Pipelines::ProjectEntitiesPipeline]) end context 'when bulk_import_projects feature flag is disabled' do it 'does not include project entities pipeline' do stub_feature_flags(bulk_import_projects: false) - expect(described_class.pipelines.flatten).not_to include(BulkImports::Groups::Pipelines::ProjectEntitiesPipeline) + expect(described_class.new(bulk_import).pipelines.flatten).not_to include(BulkImports::Groups::Pipelines::ProjectEntitiesPipeline) end end end diff --git a/spec/lib/bulk_imports/ndjson_pipeline_spec.rb b/spec/lib/bulk_imports/ndjson_pipeline_spec.rb index 57a258b0d9f..7d156c2c3df 100644 --- a/spec/lib/bulk_imports/ndjson_pipeline_spec.rb +++ b/spec/lib/bulk_imports/ndjson_pipeline_spec.rb @@ -186,4 +186,20 @@ RSpec.describe BulkImports::NdjsonPipeline do end end end + + describe '#relation_factory' do + context 'when portable is group' do + it 'returns group relation factory' do + expect(subject.relation_factory).to eq(Gitlab::ImportExport::Group::RelationFactory) + end + end + + context 'when portable is project' do + subject { NdjsonPipelineClass.new(project, user) } + + it 'returns project relation factory' do + expect(subject.relation_factory).to eq(Gitlab::ImportExport::Project::RelationFactory) + end + end + end end diff --git a/spec/lib/bulk_imports/network_error_spec.rb b/spec/lib/bulk_imports/network_error_spec.rb new file mode 100644 index 00000000000..11f555fee09 --- /dev/null +++ b/spec/lib/bulk_imports/network_error_spec.rb @@ -0,0 +1,72 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe BulkImports::NetworkError, :clean_gitlab_redis_cache do + let(:tracker) { double(id: 1, stage: 2, entity: double(id: 3)) } + + describe '.new' do + it 'requires either a message or a HTTP response' do + expect { described_class.new } + .to raise_error(ArgumentError, 'message or response required') + end + end + + describe '#retriable?' do + it 'returns true for MAX_RETRIABLE_COUNT times when cause if one of RETRIABLE_EXCEPTIONS' do + raise described_class::RETRIABLE_EXCEPTIONS.sample + rescue StandardError => cause + begin + raise described_class, cause + rescue StandardError => exception + described_class::MAX_RETRIABLE_COUNT.times do + expect(exception.retriable?(tracker)).to eq(true) + end + + expect(exception.retriable?(tracker)).to eq(false) + end + end + + it 'returns true for MAX_RETRIABLE_COUNT times when response is one of RETRIABLE_CODES' do + exception = described_class.new(response: double(code: 429)) + + described_class::MAX_RETRIABLE_COUNT.times do + expect(exception.retriable?(tracker)).to eq(true) + end + + expect(exception.retriable?(tracker)).to eq(false) + end + + it 'returns false for other exceptions' do + raise StandardError + rescue StandardError => cause + begin + raise described_class, cause + rescue StandardError => exception + expect(exception.retriable?(tracker)).to eq(false) + end + end + end + + describe '#retry_delay' do + it 'returns the default value when there is not a rate limit error' do + exception = described_class.new('foo') + + expect(exception.retry_delay).to eq(described_class::DEFAULT_RETRY_DELAY_SECONDS.seconds) + end + + context 'when the exception is a rate limit error' do + it 'returns the "Retry-After"' do + exception = described_class.new(response: double(code: 429, headers: { 'Retry-After' => 20 })) + + expect(exception.retry_delay).to eq(20.seconds) + end + + it 'returns the default value when there is no "Retry-After" header' do + exception = described_class.new(response: double(code: 429, headers: {})) + + expect(exception.retry_delay).to eq(described_class::DEFAULT_RETRY_DELAY_SECONDS.seconds) + end + end + end +end diff --git a/spec/lib/bulk_imports/projects/graphql/get_repository_query_spec.rb b/spec/lib/bulk_imports/projects/graphql/get_repository_query_spec.rb new file mode 100644 index 00000000000..4dba81dc0d2 --- /dev/null +++ b/spec/lib/bulk_imports/projects/graphql/get_repository_query_spec.rb @@ -0,0 +1,21 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe BulkImports::Projects::Graphql::GetRepositoryQuery do + describe 'query repository based on full_path' do + let(:entity) { double(source_full_path: 'test', bulk_import: nil) } + let(:tracker) { double(entity: entity) } + let(:context) { BulkImports::Pipeline::Context.new(tracker) } + + it 'returns project repository url' do + expect(described_class.to_s).to include('httpUrlToRepo') + end + + it 'queries project based on source_full_path' do + expected = { full_path: entity.source_full_path } + + expect(described_class.variables(context)).to eq(expected) + end + end +end diff --git a/spec/lib/bulk_imports/projects/pipelines/issues_pipeline_spec.rb b/spec/lib/bulk_imports/projects/pipelines/issues_pipeline_spec.rb new file mode 100644 index 00000000000..97fcddefd42 --- /dev/null +++ b/spec/lib/bulk_imports/projects/pipelines/issues_pipeline_spec.rb @@ -0,0 +1,168 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe BulkImports::Projects::Pipelines::IssuesPipeline 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(:issue_attributes) { {} } + let(:issue) do + { + 'iid' => 7, + 'title' => 'Imported Issue', + 'description' => 'Description', + 'state' => 'opened', + 'updated_at' => '2016-06-14T15:02:47.967Z', + 'author_id' => 22 + }.merge(issue_attributes) + end + + subject(:pipeline) { described_class.new(context) } + + describe '#run' do + before do + group.add_owner(user) + issue_with_index = [issue, 0] + + allow_next_instance_of(BulkImports::Common::Extractors::NdjsonExtractor) do |extractor| + allow(extractor).to receive(:extract).and_return(BulkImports::Pipeline::ExtractedData.new(data: [issue_with_index])) + end + + pipeline.run + end + + it 'imports issue into destination project' do + expect(project.issues.count).to eq(1) + + imported_issue = project.issues.last + + aggregate_failures do + expect(imported_issue.iid).to eq(7) + expect(imported_issue.title).to eq(issue['title']) + expect(imported_issue.description).to eq(issue['description']) + expect(imported_issue.author).to eq(user) + expect(imported_issue.state).to eq('opened') + expect(imported_issue.updated_at.to_s).to eq('2016-06-14 15:02:47 UTC') + end + end + + context 'zoom meetings' do + let(:issue_attributes) { { 'zoom_meetings' => [{ 'url' => 'https://zoom.us/j/123456789' }] } } + + it 'restores zoom meetings' do + expect(project.issues.last.zoom_meetings.first.url).to eq('https://zoom.us/j/123456789') + end + end + + context 'sentry issue' do + let(:issue_attributes) { { 'sentry_issue' => { 'sentry_issue_identifier' => '1234567891' } } } + + it 'restores sentry issue information' do + expect(project.issues.last.sentry_issue.sentry_issue_identifier).to eq(1234567891) + end + end + + context 'award emoji' do + let(:issue_attributes) { { 'award_emoji' => [{ 'name' => 'musical_keyboard', 'user_id' => 22 }] } } + + it 'has award emoji on an issue' do + award_emoji = project.issues.last.award_emoji.first + + expect(award_emoji.name).to eq('musical_keyboard') + expect(award_emoji.user).to eq(user) + end + end + context 'issue state' do + let(:issue_attributes) { { 'state' => 'closed' } } + + it 'restores issue state' do + expect(project.issues.last.state).to eq('closed') + end + end + + context 'labels' do + let(:issue_attributes) do + { + 'label_links' => [ + { 'label' => { 'title' => 'imported label 1', 'type' => 'ProjectLabel' } }, + { 'label' => { 'title' => 'imported label 2', 'type' => 'ProjectLabel' } } + ] + } + end + + it 'restores issue labels' do + expect(project.issues.last.labels.pluck(:title)).to contain_exactly('imported label 1', 'imported label 2') + end + end + + context 'milestone' do + let(:issue_attributes) { { 'milestone' => { 'title' => 'imported milestone' } } } + + it 'restores issue milestone' do + expect(project.issues.last.milestone.title).to eq('imported milestone') + end + end + + context 'timelogs' do + let(:issue_attributes) { { 'timelogs' => [{ 'time_spent' => 72000, 'spent_at' => '2019-12-27T00:00:00.000Z', 'user_id' => 22 }] } } + + it 'restores issue timelogs' do + timelog = project.issues.last.timelogs.first + + aggregate_failures do + expect(timelog.time_spent).to eq(72000) + expect(timelog.spent_at).to eq("2019-12-27T00:00:00.000Z") + end + end + end + + context 'notes' do + let(:issue_attributes) do + { + 'notes' => [ + { + 'note' => 'Issue note', + 'author_id' => 22, + 'author' => { + 'name' => 'User 22' + }, + 'updated_at' => '2016-06-14T15:02:47.770Z', + 'award_emoji' => [ + { + 'name' => 'clapper', + 'user_id' => 22 + } + ] + } + ] + } + end + + it 'restores issue notes and their award emoji' do + note = project.issues.last.notes.first + + aggregate_failures do + expect(note.note).to eq("Issue note\n\n *By User 22 on 2016-06-14T15:02:47 (imported from GitLab)*") + expect(note.award_emoji.first.name).to eq('clapper') + end + end + end + end +end diff --git a/spec/lib/bulk_imports/projects/pipelines/repository_pipeline_spec.rb b/spec/lib/bulk_imports/projects/pipelines/repository_pipeline_spec.rb new file mode 100644 index 00000000000..af39ec7a11c --- /dev/null +++ b/spec/lib/bulk_imports/projects/pipelines/repository_pipeline_spec.rb @@ -0,0 +1,73 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe BulkImports::Projects::Pipelines::RepositoryPipeline do + describe '#run' do + let_it_be(:user) { create(:user) } + let_it_be(:parent) { create(:project) } + let_it_be(:bulk_import) { create(:bulk_import, user: user) } + let_it_be(:bulk_import_configuration) { create(:bulk_import_configuration, bulk_import: bulk_import) } + + let_it_be(:entity) do + create( + :bulk_import_entity, + :project_entity, + bulk_import: bulk_import, + source_full_path: 'source/full/path', + destination_name: 'My Destination Repository', + destination_namespace: parent.full_path, + project: parent + ) + end + + let_it_be(:tracker) { create(:bulk_import_tracker, entity: entity) } + let_it_be(:context) { BulkImports::Pipeline::Context.new(tracker) } + + context 'successfully imports repository' do + let(:project_data) do + { + 'httpUrlToRepo' => 'http://test.git' + } + end + + subject { described_class.new(context) } + + it 'imports new repository into destination project' do + allow_next_instance_of(BulkImports::Common::Extractors::GraphqlExtractor) do |extractor| + allow(extractor).to receive(:extract).and_return(BulkImports::Pipeline::ExtractedData.new(data: project_data)) + end + + expect_next_instance_of(Gitlab::GitalyClient::RepositoryService) do |repository_service| + url = project_data['httpUrlToRepo'].sub("://", "://oauth2:#{bulk_import_configuration.access_token}@") + expect(repository_service).to receive(:import_repository).with(url).and_return 0 + end + + subject.run + end + end + + context 'blocked local networks' do + let(:project_data) do + { + 'httpUrlToRepo' => 'http://localhost/foo.git' + } + end + + before do + allow(Gitlab.config.gitlab).to receive(:host).and_return('notlocalhost.gitlab.com') + allow(Gitlab::CurrentSettings).to receive(:allow_local_requests_from_web_hooks_and_services?).and_return(false) + allow_next_instance_of(BulkImports::Common::Extractors::GraphqlExtractor) do |extractor| + allow(extractor).to receive(:extract).and_return(BulkImports::Pipeline::ExtractedData.new(data: project_data)) + end + end + + subject { described_class.new(context) } + + it 'imports new repository into destination project' do + subject.run + expect(context.entity.failed?).to be_truthy + 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 428812a34ef..c606cf7c556 100644 --- a/spec/lib/bulk_imports/projects/stage_spec.rb +++ b/spec/lib/bulk_imports/projects/stage_spec.rb @@ -6,13 +6,23 @@ RSpec.describe BulkImports::Projects::Stage do let(:pipelines) do [ [0, BulkImports::Projects::Pipelines::ProjectPipeline], - [1, BulkImports::Common::Pipelines::EntityFinisher] + [1, BulkImports::Projects::Pipelines::RepositoryPipeline], + [2, BulkImports::Common::Pipelines::LabelsPipeline], + [3, BulkImports::Projects::Pipelines::IssuesPipeline], + [4, BulkImports::Common::Pipelines::BoardsPipeline], + [5, BulkImports::Common::Pipelines::EntityFinisher] ] end - describe '.pipelines' do + subject do + bulk_import = build(:bulk_import) + + described_class.new(bulk_import) + end + + describe '#pipelines' do it 'list all the pipelines with their stage number, ordered by stage' do - expect(described_class.pipelines).to eq(pipelines) + expect(subject.pipelines).to eq(pipelines) end end end |