diff options
Diffstat (limited to 'spec/lib/gitlab/pages_transfer_spec.rb')
-rw-r--r-- | spec/lib/gitlab/pages_transfer_spec.rb | 137 |
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 |