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