summaryrefslogtreecommitdiff
path: root/spec/lib/gitlab/pages_transfer_spec.rb
diff options
context:
space:
mode:
Diffstat (limited to 'spec/lib/gitlab/pages_transfer_spec.rb')
-rw-r--r--spec/lib/gitlab/pages_transfer_spec.rb137
1 files changed, 137 insertions, 0 deletions
diff --git a/spec/lib/gitlab/pages_transfer_spec.rb b/spec/lib/gitlab/pages_transfer_spec.rb
new file mode 100644
index 00000000000..4f0ee76b244
--- /dev/null
+++ b/spec/lib/gitlab/pages_transfer_spec.rb
@@ -0,0 +1,137 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::PagesTransfer do
+ describe '#async' do
+ let(:async) { subject.async }
+
+ context 'when receiving an allowed method' do
+ it 'schedules a PagesTransferWorker', :aggregate_failures do
+ described_class::Async::METHODS.each do |meth|
+ expect(PagesTransferWorker)
+ .to receive(:perform_async).with(meth, %w[foo bar])
+
+ async.public_send(meth, 'foo', 'bar')
+ end
+ end
+ end
+
+ context 'when receiving a private method' do
+ it 'raises NoMethodError' do
+ expect { async.move('foo', 'bar') }.to raise_error(NoMethodError)
+ end
+ end
+
+ context 'when receiving a non-existent method' do
+ it 'raises NoMethodError' do
+ expect { async.foo('bar') }.to raise_error(NoMethodError)
+ end
+ end
+ end
+
+ RSpec.shared_examples 'moving a pages directory' do |parameter|
+ let!(:pages_path_before) { project.pages_path }
+ let(:config_path_before) { File.join(pages_path_before, 'config.json') }
+ let(:pages_path_after) { project.reload.pages_path }
+ let(:config_path_after) { File.join(pages_path_after, 'config.json') }
+
+ before do
+ FileUtils.mkdir_p(pages_path_before)
+ FileUtils.touch(config_path_before)
+ end
+
+ after do
+ FileUtils.remove_entry(pages_path_before, true)
+ FileUtils.remove_entry(pages_path_after, true)
+ end
+
+ it 'moves the directory' do
+ subject.public_send(meth, *args)
+
+ expect(File.exist?(config_path_before)).to be(false)
+ expect(File.exist?(config_path_after)).to be(true)
+ end
+
+ it 'returns false if it fails to move the directory' do
+ # Move the directory once, so it can't be moved again
+ subject.public_send(meth, *args)
+
+ expect(subject.public_send(meth, *args)).to be(false)
+ end
+ end
+
+ describe '#move_namespace' do
+ # Can't use let_it_be because we change the path
+ let(:group_1) { create(:group) }
+ let(:group_2) { create(:group) }
+ let(:subgroup) { create(:group, parent: group_1) }
+ let(:project) { create(:project, group: subgroup) }
+ let(:new_path) { "#{group_2.path}/#{subgroup.path}" }
+ let(:meth) { 'move_namespace' }
+
+ # Store the path before we change it
+ let!(:args) { [project.path, subgroup.full_path, new_path] }
+
+ before do
+ # We need to skip hooks, otherwise the directory will be moved
+ # via an ActiveRecord callback
+ subgroup.update_columns(parent_id: group_2.id)
+ subgroup.route.update!(path: new_path)
+ end
+
+ include_examples 'moving a pages directory'
+ end
+
+ describe '#move_project' do
+ # Can't use let_it_be because we change the path
+ let(:group_1) { create(:group) }
+ let(:group_2) { create(:group) }
+ let(:project) { create(:project, group: group_1) }
+ let(:new_path) { group_2.path }
+ let(:meth) { 'move_project' }
+ let(:args) { [project.path, group_1.full_path, group_2.full_path] }
+
+ include_examples 'moving a pages directory' do
+ before do
+ project.update!(group: group_2)
+ end
+ end
+ end
+
+ describe '#rename_project' do
+ # Can't use let_it_be because we change the path
+ let(:project) { create(:project) }
+ let(:new_path) { project.path.succ }
+ let(:meth) { 'rename_project' }
+
+ # Store the path before we change it
+ let!(:args) { [project.path, new_path, project.namespace.full_path] }
+
+ include_examples 'moving a pages directory' do
+ before do
+ project.update!(path: new_path)
+ end
+ end
+ end
+
+ describe '#rename_namespace' do
+ # Can't use let_it_be because we change the path
+ let(:group) { create(:group) }
+ let(:project) { create(:project, group: group) }
+ let(:new_path) { project.namespace.full_path.succ }
+ let(:meth) { 'rename_namespace' }
+
+ # Store the path before we change it
+ let!(:args) { [project.namespace.full_path, new_path] }
+
+ before do
+ # We need to skip hooks, otherwise the directory will be moved
+ # via an ActiveRecord callback
+ group.update_columns(path: new_path)
+ group.route.update!(path: new_path)
+ end
+
+ include_examples 'moving a pages directory'
+ end
+end