1# frozen_string_literal: true 2 3require 'spec_helper' 4 5RSpec.describe BulkImports::Projects::Pipelines::ProjectPipeline do 6 describe '#run' do 7 let_it_be(:user) { create(:user) } 8 let_it_be(:group) { create(:group) } 9 let_it_be(:bulk_import) { create(:bulk_import, user: user) } 10 11 let_it_be(:entity) do 12 create( 13 :bulk_import_entity, 14 source_type: :project_entity, 15 bulk_import: bulk_import, 16 source_full_path: 'source/full/path', 17 destination_name: 'My Destination Project', 18 destination_namespace: group.full_path 19 ) 20 end 21 22 let_it_be(:tracker) { create(:bulk_import_tracker, entity: entity) } 23 let_it_be(:context) { BulkImports::Pipeline::Context.new(tracker) } 24 25 let(:project_data) do 26 { 27 'visibility' => 'private', 28 'created_at' => 10.days.ago, 29 'archived' => false, 30 'shared_runners_enabled' => true, 31 'container_registry_enabled' => true, 32 'only_allow_merge_if_pipeline_succeeds' => true, 33 'only_allow_merge_if_all_discussions_are_resolved' => true, 34 'request_access_enabled' => true, 35 'printing_merge_request_link_enabled' => true, 36 'remove_source_branch_after_merge' => true, 37 'autoclose_referenced_issues' => true, 38 'suggestion_commit_message' => 'message', 39 'wiki_enabled' => true 40 } 41 end 42 43 subject(:project_pipeline) { described_class.new(context) } 44 45 before do 46 allow_next_instance_of(BulkImports::Common::Extractors::GraphqlExtractor) do |extractor| 47 allow(extractor).to receive(:extract).and_return(BulkImports::Pipeline::ExtractedData.new(data: project_data)) 48 end 49 50 group.add_owner(user) 51 end 52 53 it 'imports new project into destination group', :aggregate_failures do 54 expect { project_pipeline.run }.to change { Project.count }.by(1) 55 56 project_path = 'my-destination-project' 57 imported_project = Project.find_by_path(project_path) 58 59 expect(imported_project).not_to be_nil 60 expect(imported_project.group).to eq(group) 61 expect(imported_project.suggestion_commit_message).to eq('message') 62 expect(imported_project.archived?).to eq(project_data['archived']) 63 expect(imported_project.shared_runners_enabled?).to eq(project_data['shared_runners_enabled']) 64 expect(imported_project.container_registry_enabled?).to eq(project_data['container_registry_enabled']) 65 expect(imported_project.only_allow_merge_if_pipeline_succeeds?).to eq(project_data['only_allow_merge_if_pipeline_succeeds']) 66 expect(imported_project.only_allow_merge_if_all_discussions_are_resolved?).to eq(project_data['only_allow_merge_if_all_discussions_are_resolved']) 67 expect(imported_project.request_access_enabled?).to eq(project_data['request_access_enabled']) 68 expect(imported_project.printing_merge_request_link_enabled?).to eq(project_data['printing_merge_request_link_enabled']) 69 expect(imported_project.remove_source_branch_after_merge?).to eq(project_data['remove_source_branch_after_merge']) 70 expect(imported_project.autoclose_referenced_issues?).to eq(project_data['autoclose_referenced_issues']) 71 expect(imported_project.wiki_enabled?).to eq(project_data['wiki_enabled']) 72 end 73 end 74 75 describe 'pipeline parts' do 76 it { expect(described_class).to include_module(BulkImports::Pipeline) } 77 it { expect(described_class).to include_module(BulkImports::Pipeline::Runner) } 78 79 it 'has extractors' do 80 expect(described_class.get_extractor) 81 .to eq( 82 klass: BulkImports::Common::Extractors::GraphqlExtractor, 83 options: { query: BulkImports::Projects::Graphql::GetProjectQuery } 84 ) 85 end 86 87 it 'has transformers' do 88 expect(described_class.transformers) 89 .to contain_exactly( 90 { klass: BulkImports::Common::Transformers::ProhibitedAttributesTransformer, options: nil }, 91 { klass: BulkImports::Projects::Transformers::ProjectAttributesTransformer, options: nil } 92 ) 93 end 94 end 95end 96