summaryrefslogtreecommitdiff
path: root/spec/lib/gitlab/import_export
diff options
context:
space:
mode:
Diffstat (limited to 'spec/lib/gitlab/import_export')
-rw-r--r--spec/lib/gitlab/import_export/base_object_builder_spec.rb53
-rw-r--r--spec/lib/gitlab/import_export/base_relation_factory_spec.rb145
-rw-r--r--spec/lib/gitlab/import_export/project_relation_factory_spec.rb (renamed from spec/lib/gitlab/import_export/relation_factory_spec.rb)11
-rw-r--r--spec/lib/gitlab/import_export/relation_tree_restorer_spec.rb4
-rw-r--r--spec/lib/gitlab/import_export/safe_model_attributes.yml1
5 files changed, 208 insertions, 6 deletions
diff --git a/spec/lib/gitlab/import_export/base_object_builder_spec.rb b/spec/lib/gitlab/import_export/base_object_builder_spec.rb
new file mode 100644
index 00000000000..fbb3b08cf56
--- /dev/null
+++ b/spec/lib/gitlab/import_export/base_object_builder_spec.rb
@@ -0,0 +1,53 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe Gitlab::ImportExport::BaseObjectBuilder do
+ let(:project) do
+ create(:project, :repository,
+ :builds_disabled,
+ :issues_disabled,
+ name: 'project',
+ path: 'project')
+ end
+ let(:klass) { Milestone }
+ let(:attributes) { { 'title' => 'Test BaseObjectBuilder Milestone', 'project' => project } }
+
+ subject { described_class.build(klass, attributes) }
+
+ describe '#build' do
+ context 'when object exists' do
+ context 'when where_clauses are implemented' do
+ before do
+ allow_next_instance_of(described_class) do |object_builder|
+ allow(object_builder).to receive(:where_clauses).and_return([klass.arel_table['title'].eq(attributes['title'])])
+ end
+ end
+
+ let!(:milestone) { create(:milestone, title: attributes['title'], project: project) }
+
+ it 'finds existing object instead of creating one' do
+ expect(subject).to eq(milestone)
+ end
+ end
+
+ context 'when where_clauses are not implemented' do
+ it 'raises NotImplementedError' do
+ expect { subject }.to raise_error(NotImplementedError)
+ end
+ end
+ end
+
+ context 'when object does not exist' do
+ before do
+ allow_next_instance_of(described_class) do |object_builder|
+ allow(object_builder).to receive(:find_object).and_return(nil)
+ end
+ end
+
+ it 'creates new object' do
+ expect { subject }.to change { Milestone.count }.from(0).to(1)
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/import_export/base_relation_factory_spec.rb b/spec/lib/gitlab/import_export/base_relation_factory_spec.rb
new file mode 100644
index 00000000000..def3e43de9b
--- /dev/null
+++ b/spec/lib/gitlab/import_export/base_relation_factory_spec.rb
@@ -0,0 +1,145 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe Gitlab::ImportExport::BaseRelationFactory do
+ let(:user) { create(:admin) }
+ let(:project) { create(:project) }
+ let(:members_mapper) { double('members_mapper').as_null_object }
+ let(:relation_sym) { :project_snippets }
+ let(:merge_requests_mapping) { {} }
+ let(:relation_hash) { {} }
+ let(:excluded_keys) { [] }
+
+ subject do
+ described_class.create(relation_sym: relation_sym,
+ relation_hash: relation_hash,
+ object_builder: Gitlab::ImportExport::GroupProjectObjectBuilder,
+ members_mapper: members_mapper,
+ merge_requests_mapping: merge_requests_mapping,
+ user: user,
+ importable: project,
+ excluded_keys: excluded_keys)
+ end
+
+ describe '#create' do
+ context 'when relation is invalid' do
+ before do
+ expect_next_instance_of(described_class) do |relation_factory|
+ expect(relation_factory).to receive(:invalid_relation?).and_return(true)
+ end
+ end
+
+ it 'returns without creating new relations' do
+ expect(subject).to be_nil
+ end
+ end
+
+ context 'when #setup_models is not implemented' do
+ it 'raises NotImplementedError' do
+ expect { subject }.to raise_error(NotImplementedError)
+ end
+ end
+
+ context 'when #setup_models is implemented' do
+ let(:relation_sym) { :notes }
+ let(:relation_hash) do
+ {
+ "id" => 4947,
+ "note" => "merged",
+ "noteable_type" => "MergeRequest",
+ "author_id" => 999,
+ "created_at" => "2016-11-18T09:29:42.634Z",
+ "updated_at" => "2016-11-18T09:29:42.634Z",
+ "project_id" => 1,
+ "attachment" => {
+ "url" => nil
+ },
+ "noteable_id" => 377,
+ "system" => true,
+ "events" => []
+ }
+ end
+
+ before do
+ expect_next_instance_of(described_class) do |relation_factory|
+ expect(relation_factory).to receive(:setup_models).and_return(true)
+ end
+ end
+
+ it 'creates imported object' do
+ expect(subject).to be_instance_of(Note)
+ end
+
+ context 'when relation contains user references' do
+ let(:new_user) { create(:user) }
+ let(:exported_member) do
+ {
+ "id" => 111,
+ "access_level" => 30,
+ "source_id" => 1,
+ "source_type" => "Project",
+ "user_id" => 3,
+ "notification_level" => 3,
+ "created_at" => "2016-11-18T09:29:42.634Z",
+ "updated_at" => "2016-11-18T09:29:42.634Z",
+ "user" => {
+ "id" => 999,
+ "email" => new_user.email,
+ "username" => new_user.username
+ }
+ }
+ end
+
+ let(:members_mapper) do
+ Gitlab::ImportExport::MembersMapper.new(
+ exported_members: [exported_member],
+ user: user,
+ importable: project)
+ end
+
+ it 'maps the right author to the imported note' do
+ expect(subject.author).to eq(new_user)
+ end
+ end
+
+ context 'when relation contains token attributes' do
+ let(:relation_sym) { 'ProjectHook' }
+ let(:relation_hash) { { token: 'secret' } }
+
+ it 'removes token attributes' do
+ expect(subject.token).to be_nil
+ end
+ end
+
+ context 'when relation contains encrypted attributes' do
+ let(:relation_sym) { 'Ci::Variable' }
+ let(:relation_hash) do
+ create(:ci_variable).as_json
+ end
+
+ it 'removes encrypted attributes' do
+ expect(subject.value).to be_nil
+ end
+ end
+ end
+ end
+
+ describe '.relation_class' do
+ context 'when relation name is pluralized' do
+ let(:relation_name) { 'MergeRequest::Metrics' }
+
+ it 'returns constantized class' do
+ expect(described_class.relation_class(relation_name)).to eq(MergeRequest::Metrics)
+ end
+ end
+
+ context 'when relation name is singularized' do
+ let(:relation_name) { 'Badge' }
+
+ it 'returns constantized class' do
+ expect(described_class.relation_class(relation_name)).to eq(Badge)
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/import_export/relation_factory_spec.rb b/spec/lib/gitlab/import_export/project_relation_factory_spec.rb
index 5704f823b93..0ade7ac4fc7 100644
--- a/spec/lib/gitlab/import_export/relation_factory_spec.rb
+++ b/spec/lib/gitlab/import_export/project_relation_factory_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-describe Gitlab::ImportExport::RelationFactory do
+describe Gitlab::ImportExport::ProjectRelationFactory do
let(:group) { create(:group) }
let(:project) { create(:project, :repository, group: group) }
let(:members_mapper) { double('members_mapper').as_null_object }
@@ -12,10 +12,11 @@ describe Gitlab::ImportExport::RelationFactory do
let(:created_object) do
described_class.create(relation_sym: relation_sym,
relation_hash: relation_hash,
+ object_builder: Gitlab::ImportExport::GroupProjectObjectBuilder,
members_mapper: members_mapper,
merge_requests_mapping: merge_requests_mapping,
user: user,
- project: project,
+ importable: project,
excluded_keys: excluded_keys)
end
@@ -97,7 +98,7 @@ describe Gitlab::ImportExport::RelationFactory do
end
end
- context 'merge_requset object' do
+ context 'merge_request object' do
let(:relation_sym) { :merge_requests }
let(:exported_member) do
@@ -244,11 +245,11 @@ describe Gitlab::ImportExport::RelationFactory do
context 'Project references' do
let(:relation_sym) { :project_foo_model }
let(:relation_hash) do
- Gitlab::ImportExport::RelationFactory::PROJECT_REFERENCES.map { |ref| { ref => 99 } }.inject(:merge)
+ Gitlab::ImportExport::ProjectRelationFactory::PROJECT_REFERENCES.map { |ref| { ref => 99 } }.inject(:merge)
end
class ProjectFooModel < FooModel
- attr_accessor(*Gitlab::ImportExport::RelationFactory::PROJECT_REFERENCES)
+ attr_accessor(*Gitlab::ImportExport::ProjectRelationFactory::PROJECT_REFERENCES)
end
before do
diff --git a/spec/lib/gitlab/import_export/relation_tree_restorer_spec.rb b/spec/lib/gitlab/import_export/relation_tree_restorer_spec.rb
index c761f9652ab..edb2c0a131a 100644
--- a/spec/lib/gitlab/import_export/relation_tree_restorer_spec.rb
+++ b/spec/lib/gitlab/import_export/relation_tree_restorer_spec.rb
@@ -27,6 +27,7 @@ describe Gitlab::ImportExport::RelationTreeRestorer do
shared: shared,
tree_hash: tree_hash,
importable: importable,
+ object_builder: object_builder,
members_mapper: members_mapper,
relation_factory: relation_factory,
reader: reader
@@ -38,7 +39,8 @@ describe Gitlab::ImportExport::RelationTreeRestorer do
context 'when restoring a project' do
let(:path) { 'spec/fixtures/lib/gitlab/import_export/complex/project.json' }
let(:importable) { create(:project, :builds_enabled, :issues_disabled, name: 'project', path: 'project') }
- let(:relation_factory) { Gitlab::ImportExport::RelationFactory }
+ let(:object_builder) { Gitlab::ImportExport::GroupProjectObjectBuilder }
+ let(:relation_factory) { Gitlab::ImportExport::ProjectRelationFactory }
let(:reader) { Gitlab::ImportExport::Reader.new(shared: shared) }
let(:tree_hash) { importable_hash }
diff --git a/spec/lib/gitlab/import_export/safe_model_attributes.yml b/spec/lib/gitlab/import_export/safe_model_attributes.yml
index 01beb5ba33c..ad363233bfe 100644
--- a/spec/lib/gitlab/import_export/safe_model_attributes.yml
+++ b/spec/lib/gitlab/import_export/safe_model_attributes.yml
@@ -545,6 +545,7 @@ ProjectFeature:
- id
- project_id
- merge_requests_access_level
+- forking_access_level
- issues_access_level
- wiki_access_level
- snippets_access_level