Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2020-03-06 21:08:08 +0300
committerGitLab Bot <gitlab-bot@gitlab.com>2020-03-06 21:08:08 +0300
commit83731155d997ae24c7e0cd5ffa6f0dba41bec6dc (patch)
tree31f785012137fda4ac9a470f4f07c961b42d0299 /spec/lib/gitlab/import_export
parent57a37ce99f297cddae12cb4d982b6d572f932bb4 (diff)
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'spec/lib/gitlab/import_export')
-rw-r--r--spec/lib/gitlab/import_export/import_export_spec.rb8
-rw-r--r--spec/lib/gitlab/import_export/importer_spec.rb3
-rw-r--r--spec/lib/gitlab/import_export/snippet_repo_restorer_spec.rb70
-rw-r--r--spec/lib/gitlab/import_export/snippet_repo_saver_spec.rb48
-rw-r--r--spec/lib/gitlab/import_export/snippets_repo_restorer_spec.rb55
-rw-r--r--spec/lib/gitlab/import_export/snippets_repo_saver_spec.rb56
6 files changed, 239 insertions, 1 deletions
diff --git a/spec/lib/gitlab/import_export/import_export_spec.rb b/spec/lib/gitlab/import_export/import_export_spec.rb
index 2ece0dd4b56..300ba66ee5b 100644
--- a/spec/lib/gitlab/import_export/import_export_spec.rb
+++ b/spec/lib/gitlab/import_export/import_export_spec.rb
@@ -21,4 +21,12 @@ describe Gitlab::ImportExport do
expect(described_class.export_filename(exportable: project).length).to be < 70
end
end
+
+ describe '#snippet_repo_bundle_filename_for' do
+ let(:snippet) { build(:snippet, id: 1) }
+
+ it 'generates the snippet bundle name' do
+ expect(described_class.snippet_repo_bundle_filename_for(snippet)).to eq "#{snippet.hexdigest}.bundle"
+ end
+ end
end
diff --git a/spec/lib/gitlab/import_export/importer_spec.rb b/spec/lib/gitlab/import_export/importer_spec.rb
index 07857269004..e03c95525df 100644
--- a/spec/lib/gitlab/import_export/importer_spec.rb
+++ b/spec/lib/gitlab/import_export/importer_spec.rb
@@ -50,7 +50,8 @@ describe Gitlab::ImportExport::Importer do
Gitlab::ImportExport::WikiRestorer,
Gitlab::ImportExport::UploadsRestorer,
Gitlab::ImportExport::LfsRestorer,
- Gitlab::ImportExport::StatisticsRestorer
+ Gitlab::ImportExport::StatisticsRestorer,
+ Gitlab::ImportExport::SnippetsRepoRestorer
].each do |restorer|
it "calls the #{restorer}" do
fake_restorer = double(restorer.to_s)
diff --git a/spec/lib/gitlab/import_export/snippet_repo_restorer_spec.rb b/spec/lib/gitlab/import_export/snippet_repo_restorer_spec.rb
new file mode 100644
index 00000000000..d72d41ddf38
--- /dev/null
+++ b/spec/lib/gitlab/import_export/snippet_repo_restorer_spec.rb
@@ -0,0 +1,70 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe Gitlab::ImportExport::SnippetRepoRestorer do
+ let_it_be(:user) { create(:user) }
+ let_it_be(:project) { create(:project, namespace: user.namespace) }
+ let(:snippet) { create(:project_snippet, project: project, author: user) }
+
+ let(:shared) { project.import_export_shared }
+ let(:exporter) { Gitlab::ImportExport::SnippetsRepoSaver.new(project: project, shared: shared, current_user: user) }
+ let(:restorer) do
+ described_class.new(user: user,
+ shared: shared,
+ snippet: snippet,
+ path_to_bundle: snippet_bundle_path)
+ end
+
+ after do
+ FileUtils.rm_rf(shared.export_path)
+ end
+
+ shared_examples 'no bundle file present' do
+ it 'creates the repository from the database content' do
+ expect(snippet.repository_exists?).to be_falsey
+
+ aggregate_failures do
+ expect(restorer.restore).to be_truthy
+
+ expect(snippet.repository_exists?).to be_truthy
+ expect(snippet.snippet_repository).not_to be_nil
+
+ blob = snippet.repository.blob_at('HEAD', snippet.file_name)
+ expect(blob).not_to be_nil
+ expect(blob.data).to eq(snippet.content)
+ end
+ end
+ end
+
+ context 'when the snippet does not have a bundle file path' do
+ let(:snippet_bundle_path) { nil }
+
+ it_behaves_like 'no bundle file present'
+ end
+
+ context 'when the snippet bundle path is not present' do
+ let(:snippet_bundle_path) { 'foo' }
+
+ it_behaves_like 'no bundle file present'
+ end
+
+ context 'when the snippet bundle exists' do
+ let!(:snippet_with_repo) { create(:project_snippet, :repository, project: project) }
+ let(:bundle_path) { ::Gitlab::ImportExport.snippets_repo_bundle_path(shared.export_path) }
+ let(:snippet_bundle_path) { File.join(bundle_path, "#{snippet_with_repo.hexdigest}.bundle") }
+ let(:result) { exporter.save }
+
+ it 'creates the repository from the bundle' do
+ expect(exporter.save).to be_truthy
+
+ expect(snippet.repository_exists?).to be_falsey
+ expect(snippet.snippet_repository).to be_nil
+ expect(snippet.repository).to receive(:create_from_bundle).and_call_original
+
+ expect(restorer.restore).to be_truthy
+ expect(snippet.repository_exists?).to be_truthy
+ expect(snippet.snippet_repository).not_to be_nil
+ end
+ end
+end
diff --git a/spec/lib/gitlab/import_export/snippet_repo_saver_spec.rb b/spec/lib/gitlab/import_export/snippet_repo_saver_spec.rb
new file mode 100644
index 00000000000..7ad1ff213a1
--- /dev/null
+++ b/spec/lib/gitlab/import_export/snippet_repo_saver_spec.rb
@@ -0,0 +1,48 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe Gitlab::ImportExport::SnippetRepoSaver do
+ describe 'bundle a project Git repo' do
+ let_it_be(:user) { create(:user) }
+ let_it_be(:project) { create(:project, namespace: user.namespace) }
+ let_it_be(:snippet) { create(:project_snippet, :repository, project: project, author: user) }
+ let(:shared) { project.import_export_shared }
+ let(:bundler) { described_class.new(project: project, shared: shared, repository: snippet.repository) }
+ let(:bundle_path) { ::Gitlab::ImportExport.snippets_repo_bundle_path(shared.export_path) }
+
+ around do |example|
+ FileUtils.mkdir_p(bundle_path)
+ example.run
+ ensure
+ FileUtils.rm_rf(bundle_path)
+ end
+
+ context 'with project snippet' do
+ it 'bundles the repo successfully' do
+ aggregate_failures do
+ expect(bundler.save).to be_truthy
+ expect(Dir.empty?(bundle_path)).to be_falsey
+ end
+ end
+
+ context 'when snippet does not have a repository' do
+ let(:snippet) { build(:personal_snippet) }
+
+ it 'returns true' do
+ expect(bundler.save).to be_truthy
+ end
+
+ it 'does not create any file' do
+ aggregate_failures do
+ expect(snippet.repository).not_to receive(:bundle_to_disk)
+
+ bundler.save
+
+ expect(Dir.empty?(bundle_path)).to be_truthy
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/import_export/snippets_repo_restorer_spec.rb b/spec/lib/gitlab/import_export/snippets_repo_restorer_spec.rb
new file mode 100644
index 00000000000..242f6f6b58c
--- /dev/null
+++ b/spec/lib/gitlab/import_export/snippets_repo_restorer_spec.rb
@@ -0,0 +1,55 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe Gitlab::ImportExport::SnippetsRepoRestorer do
+ include GitHelpers
+
+ describe 'bundle a snippet Git repo' do
+ let_it_be(:user) { create(:user) }
+ let_it_be(:project) { create(:project, namespace: user.namespace) }
+ let_it_be(:snippet_with_repo) { create(:project_snippet, :repository, project: project, author: user) }
+ let_it_be(:snippet_without_repo) { create(:project_snippet, project: project, author: user) }
+
+ let(:shared) { project.import_export_shared }
+ let(:exporter) { Gitlab::ImportExport::SnippetsRepoSaver.new(current_user: user, project: project, shared: shared) }
+ let(:bundle_dir) { ::Gitlab::ImportExport.snippets_repo_bundle_path(shared.export_path) }
+ let(:restorer) do
+ described_class.new(user: user,
+ shared: shared,
+ project: project)
+ end
+ let(:service) { instance_double(Gitlab::ImportExport::SnippetRepoRestorer) }
+
+ before do
+ exporter.save
+ end
+
+ after do
+ FileUtils.rm_rf(shared.export_path)
+ end
+
+ it 'calls SnippetRepoRestorer per each snippet with the bundle path' do
+ allow(service).to receive(:restore).and_return(true)
+
+ expect(Gitlab::ImportExport::SnippetRepoRestorer).to receive(:new).with(hash_including(snippet: snippet_with_repo, path_to_bundle: bundle_path(snippet_with_repo))).and_return(service)
+ expect(Gitlab::ImportExport::SnippetRepoRestorer).to receive(:new).with(hash_including(snippet: snippet_without_repo, path_to_bundle: bundle_path(snippet_without_repo))).and_return(service)
+
+ expect(restorer.restore).to be_truthy
+ end
+
+ context 'when one snippet cannot be saved' do
+ it 'returns false and do not process other snippets' do
+ allow(Gitlab::ImportExport::SnippetRepoRestorer).to receive(:new).with(hash_including(snippet: snippet_with_repo)).and_return(service)
+ allow(service).to receive(:restore).and_return(false)
+
+ expect(Gitlab::ImportExport::SnippetRepoRestorer).not_to receive(:new).with(hash_including(snippet: snippet_without_repo))
+ expect(restorer.restore).to be_falsey
+ end
+ end
+
+ def bundle_path(snippet)
+ File.join(bundle_dir, ::Gitlab::ImportExport.snippet_repo_bundle_filename_for(snippet))
+ end
+ end
+end
diff --git a/spec/lib/gitlab/import_export/snippets_repo_saver_spec.rb b/spec/lib/gitlab/import_export/snippets_repo_saver_spec.rb
new file mode 100644
index 00000000000..5332990a975
--- /dev/null
+++ b/spec/lib/gitlab/import_export/snippets_repo_saver_spec.rb
@@ -0,0 +1,56 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe Gitlab::ImportExport::SnippetsRepoSaver do
+ describe 'bundle a project Git repo' do
+ let_it_be(:user) { create(:user) }
+ let!(:project) { create(:project) }
+ let(:shared) { project.import_export_shared }
+ let(:bundler) { described_class.new(current_user: user, project: project, shared: shared) }
+
+ after do
+ FileUtils.rm_rf(shared.export_path)
+ end
+
+ it 'creates the snippet bundles dir if not exists' do
+ snippets_dir = ::Gitlab::ImportExport.snippets_repo_bundle_path(shared.export_path)
+ expect(Dir.exist?(snippets_dir)).to be_falsey
+
+ bundler.save
+
+ expect(Dir.exist?(snippets_dir)).to be_truthy
+ end
+
+ context 'when project does not have any snippet' do
+ it 'does not perform any action' do
+ expect(Gitlab::ImportExport::SnippetRepoSaver).not_to receive(:new)
+
+ bundler.save
+ end
+ end
+
+ context 'when project has snippets' do
+ let!(:snippet1) { create(:project_snippet, :repository, project: project, author: user) }
+ let!(:snippet2) { create(:project_snippet, project: project, author: user) }
+ let(:service) { instance_double(Gitlab::ImportExport::SnippetRepoSaver) }
+
+ it 'calls the SnippetRepoSaver for each snippet' do
+ allow(Gitlab::ImportExport::SnippetRepoSaver).to receive(:new).and_return(service)
+ expect(service).to receive(:save).and_return(true).twice
+
+ bundler.save
+ end
+
+ context 'when one snippet cannot be saved' do
+ it 'returns false and do not process other snippets' do
+ allow(Gitlab::ImportExport::SnippetRepoSaver).to receive(:new).with(hash_including(repository: snippet1.repository)).and_return(service)
+ allow(service).to receive(:save).and_return(false)
+
+ expect(Gitlab::ImportExport::SnippetRepoSaver).not_to receive(:new).with(hash_including(repository: snippet2.repository))
+ expect(bundler.save).to be_falsey
+ end
+ end
+ end
+ end
+end