Commit 94bc7284 authored by Kamil Trzciński's avatar Kamil Trzciński Committed by Aleksei Lipniagov

Refactor Project Restore

Improves where we store test JSONs.
parent eafd98ec
...@@ -12,8 +12,7 @@ describe Gitlab::ImportExport::ProjectTreeRestorer do ...@@ -12,8 +12,7 @@ describe Gitlab::ImportExport::ProjectTreeRestorer do
let(:restored_project_json) { project_tree_restorer.restore } let(:restored_project_json) { project_tree_restorer.restore }
before do before do
allow(shared).to receive(:export_path).and_return('spec/fixtures/lib/gitlab/import_export/') setup_import_export_config('designs', 'ee')
project_tree_restorer.instance_variable_set(:@path, 'ee/spec/fixtures/lib/gitlab/import_export/project.designs.json')
end end
describe 'restoring design management data' do describe 'restoring design management data' do
......
...@@ -2,6 +2,8 @@ require 'spec_helper' ...@@ -2,6 +2,8 @@ require 'spec_helper'
include ImportExport::CommonUtil include ImportExport::CommonUtil
describe Gitlab::ImportExport::ProjectTreeRestorer do describe Gitlab::ImportExport::ProjectTreeRestorer do
include ImportExport::CommonUtil
let(:shared) { project.import_export_shared } let(:shared) { project.import_export_shared }
describe 'restore project tree' do describe 'restore project tree' do
...@@ -16,7 +18,8 @@ describe Gitlab::ImportExport::ProjectTreeRestorer do ...@@ -16,7 +18,8 @@ describe Gitlab::ImportExport::ProjectTreeRestorer do
RSpec::Mocks.with_temporary_scope do RSpec::Mocks.with_temporary_scope do
@project = create(:project, :builds_enabled, :issues_disabled, name: 'project', path: 'project') @project = create(:project, :builds_enabled, :issues_disabled, name: 'project', path: 'project')
@shared = @project.import_export_shared @shared = @project.import_export_shared
allow(@shared).to receive(:export_path).and_return('spec/fixtures/lib/gitlab/import_export/')
setup_import_export_config('complex')
allow_any_instance_of(Repository).to receive(:fetch_source_branch!).and_return(true) allow_any_instance_of(Repository).to receive(:fetch_source_branch!).and_return(true)
allow_any_instance_of(Gitlab::Git::Repository).to receive(:branch_exists?).and_return(false) allow_any_instance_of(Gitlab::Git::Repository).to receive(:branch_exists?).and_return(false)
...@@ -314,21 +317,33 @@ describe Gitlab::ImportExport::ProjectTreeRestorer do ...@@ -314,21 +317,33 @@ describe Gitlab::ImportExport::ProjectTreeRestorer do
end end
end end
context 'Light JSON' do context 'project.json file access check' do
let(:user) { create(:user) } let(:user) { create(:user) }
let!(:project) { create(:project, :builds_disabled, :issues_disabled, name: 'project', path: 'project') } let!(:project) { create(:project, :builds_disabled, :issues_disabled, name: 'project', path: 'project') }
let(:project_tree_restorer) { described_class.new(user: user, shared: shared, project: project) } let(:project_tree_restorer) { described_class.new(user: user, shared: shared, project: project) }
let(:restored_project_json) { project_tree_restorer.restore } let(:restored_project_json) { project_tree_restorer.restore }
before do it 'does not read a symlink' do
allow(shared).to receive(:export_path).and_return('spec/fixtures/lib/gitlab/import_export/') Dir.mktmpdir do |tmpdir|
setup_symlink(tmpdir, 'project.json')
allow(shared).to receive(:export_path).and_call_original
expect(project_tree_restorer.restore).to eq(false)
expect(shared.errors).to include('Incorrect JSON format')
end
end end
end
context 'Light JSON' do
let(:user) { create(:user) }
let!(:project) { create(:project, :builds_disabled, :issues_disabled, name: 'project', path: 'project') }
let(:project_tree_restorer) { described_class.new(user: user, shared: shared, project: project) }
let(:restored_project_json) { project_tree_restorer.restore }
context 'with a simple project' do context 'with a simple project' do
before do before do
project_tree_restorer.instance_variable_set(:@path, "spec/fixtures/lib/gitlab/import_export/project.light.json") setup_import_export_config('light')
expect(restored_project_json).to eq(true)
restored_project_json
end end
it_behaves_like 'restores project correctly', it_behaves_like 'restores project correctly',
...@@ -339,19 +354,6 @@ describe Gitlab::ImportExport::ProjectTreeRestorer do ...@@ -339,19 +354,6 @@ describe Gitlab::ImportExport::ProjectTreeRestorer do
first_issue_labels: 1, first_issue_labels: 1,
services: 1 services: 1
context 'project.json file access check' do
it 'does not read a symlink' do
Dir.mktmpdir do |tmpdir|
setup_symlink(tmpdir, 'project.json')
allow(shared).to receive(:export_path).and_call_original
restored_project_json
expect(shared.errors).to be_empty
end
end
end
context 'when there is an existing build with build token' do context 'when there is an existing build with build token' do
before do before do
create(:ci_build, token: 'abcd') create(:ci_build, token: 'abcd')
...@@ -367,6 +369,10 @@ describe Gitlab::ImportExport::ProjectTreeRestorer do ...@@ -367,6 +369,10 @@ describe Gitlab::ImportExport::ProjectTreeRestorer do
end end
context 'when the project has overridden params in import data' do context 'when the project has overridden params in import data' do
before do
setup_import_export_config('light')
end
it 'handles string versions of visibility_level' do it 'handles string versions of visibility_level' do
# Project needs to be in a group for visibility level comparison # Project needs to be in a group for visibility level comparison
# to happen # to happen
...@@ -375,24 +381,21 @@ describe Gitlab::ImportExport::ProjectTreeRestorer do ...@@ -375,24 +381,21 @@ describe Gitlab::ImportExport::ProjectTreeRestorer do
project.create_import_data(data: { override_params: { visibility_level: Gitlab::VisibilityLevel::INTERNAL.to_s } }) project.create_import_data(data: { override_params: { visibility_level: Gitlab::VisibilityLevel::INTERNAL.to_s } })
restored_project_json expect(restored_project_json).to eq(true)
expect(project.visibility_level).to eq(Gitlab::VisibilityLevel::INTERNAL) expect(project.visibility_level).to eq(Gitlab::VisibilityLevel::INTERNAL)
end end
it 'overwrites the params stored in the JSON' do it 'overwrites the params stored in the JSON' do
project.create_import_data(data: { override_params: { description: "Overridden" } }) project.create_import_data(data: { override_params: { description: "Overridden" } })
restored_project_json expect(restored_project_json).to eq(true)
expect(project.description).to eq("Overridden") expect(project.description).to eq("Overridden")
end end
it 'does not allow setting params that are excluded from import_export settings' do it 'does not allow setting params that are excluded from import_export settings' do
project.create_import_data(data: { override_params: { lfs_enabled: true } }) project.create_import_data(data: { override_params: { lfs_enabled: true } })
restored_project_json expect(restored_project_json).to eq(true)
expect(project.lfs_enabled).to be_falsey expect(project.lfs_enabled).to be_falsey
end end
...@@ -408,7 +411,7 @@ describe Gitlab::ImportExport::ProjectTreeRestorer do ...@@ -408,7 +411,7 @@ describe Gitlab::ImportExport::ProjectTreeRestorer do
project.create_import_data(data: { override_params: disabled_access_levels }) project.create_import_data(data: { override_params: disabled_access_levels })
restored_project_json expect(restored_project_json).to eq(true)
aggregate_failures do aggregate_failures do
access_level_keys.each do |key| access_level_keys.each do |key|
...@@ -429,9 +432,8 @@ describe Gitlab::ImportExport::ProjectTreeRestorer do ...@@ -429,9 +432,8 @@ describe Gitlab::ImportExport::ProjectTreeRestorer do
end end
before do before do
project_tree_restorer.instance_variable_set(:@path, "spec/fixtures/lib/gitlab/import_export/project.group.json") setup_import_export_config('group')
expect(restored_project_json).to eq(true)
restored_project_json
end end
it_behaves_like 'restores project correctly', it_behaves_like 'restores project correctly',
...@@ -463,11 +465,11 @@ describe Gitlab::ImportExport::ProjectTreeRestorer do ...@@ -463,11 +465,11 @@ describe Gitlab::ImportExport::ProjectTreeRestorer do
end end
before do before do
project_tree_restorer.instance_variable_set(:@path, "spec/fixtures/lib/gitlab/import_export/project.light.json") setup_import_export_config('light')
end end
it 'does not import any templated services' do it 'does not import any templated services' do
restored_project_json expect(restored_project_json).to eq(true)
expect(project.services.where(template: true).count).to eq(0) expect(project.services.where(template: true).count).to eq(0)
end end
...@@ -477,8 +479,7 @@ describe Gitlab::ImportExport::ProjectTreeRestorer do ...@@ -477,8 +479,7 @@ describe Gitlab::ImportExport::ProjectTreeRestorer do
expect_any_instance_of(Gitlab::ImportExport::Shared).not_to receive(:error) expect_any_instance_of(Gitlab::ImportExport::Shared).not_to receive(:error)
restored_project_json expect(restored_project_json).to eq(true)
expect(project.labels.count).to eq(1) expect(project.labels.count).to eq(1)
end end
...@@ -487,8 +488,7 @@ describe Gitlab::ImportExport::ProjectTreeRestorer do ...@@ -487,8 +488,7 @@ describe Gitlab::ImportExport::ProjectTreeRestorer do
expect_any_instance_of(Gitlab::ImportExport::Shared).not_to receive(:error) expect_any_instance_of(Gitlab::ImportExport::Shared).not_to receive(:error)
restored_project_json expect(restored_project_json).to eq(true)
expect(project.group.milestones.count).to eq(1) expect(project.group.milestones.count).to eq(1)
expect(project.milestones.count).to eq(0) expect(project.milestones.count).to eq(0)
end end
...@@ -504,13 +504,14 @@ describe Gitlab::ImportExport::ProjectTreeRestorer do ...@@ -504,13 +504,14 @@ describe Gitlab::ImportExport::ProjectTreeRestorer do
group: create(:group)) group: create(:group))
end end
it 'preserves the project milestone IID' do before do
project_tree_restorer.instance_variable_set(:@path, "spec/fixtures/lib/gitlab/import_export/project.milestone-iid.json") setup_import_export_config('milestone-iid')
end
it 'preserves the project milestone IID' do
expect_any_instance_of(Gitlab::ImportExport::Shared).not_to receive(:error) expect_any_instance_of(Gitlab::ImportExport::Shared).not_to receive(:error)
restored_project_json expect(restored_project_json).to eq(true)
expect(project.milestones.count).to eq(2) expect(project.milestones.count).to eq(2)
expect(Milestone.find_by_title('Another milestone').iid).to eq(1) expect(Milestone.find_by_title('Another milestone').iid).to eq(1)
expect(Milestone.find_by_title('Group-level milestone').iid).to eq(2) expect(Milestone.find_by_title('Group-level milestone').iid).to eq(2)
...@@ -518,19 +519,21 @@ describe Gitlab::ImportExport::ProjectTreeRestorer do ...@@ -518,19 +519,21 @@ describe Gitlab::ImportExport::ProjectTreeRestorer do
end end
context 'with external authorization classification labels' do context 'with external authorization classification labels' do
before do
setup_import_export_config('light')
end
it 'converts empty external classification authorization labels to nil' do it 'converts empty external classification authorization labels to nil' do
project.create_import_data(data: { override_params: { external_authorization_classification_label: "" } }) project.create_import_data(data: { override_params: { external_authorization_classification_label: "" } })
restored_project_json expect(restored_project_json).to eq(true)
expect(project.external_authorization_classification_label).to be_nil expect(project.external_authorization_classification_label).to be_nil
end end
it 'preserves valid external classification authorization labels' do it 'preserves valid external classification authorization labels' do
project.create_import_data(data: { override_params: { external_authorization_classification_label: "foobar" } }) project.create_import_data(data: { override_params: { external_authorization_classification_label: "foobar" } })
restored_project_json expect(restored_project_json).to eq(true)
expect(project.external_authorization_classification_label).to eq("foobar") expect(project.external_authorization_classification_label).to eq("foobar")
end end
end end
......
...@@ -3,6 +3,8 @@ ...@@ -3,6 +3,8 @@
require 'spec_helper' require 'spec_helper'
describe Gitlab::ImportExport::RelationRenameService do describe Gitlab::ImportExport::RelationRenameService do
include ImportExport::CommonUtil
let(:renames) do let(:renames) do
{ {
'example_relation1' => 'new_example_relation1', 'example_relation1' => 'new_example_relation1',
...@@ -21,12 +23,12 @@ describe Gitlab::ImportExport::RelationRenameService do ...@@ -21,12 +23,12 @@ describe Gitlab::ImportExport::RelationRenameService do
context 'when importing' do context 'when importing' do
let(:project_tree_restorer) { Gitlab::ImportExport::ProjectTreeRestorer.new(user: user, shared: shared, project: project) } let(:project_tree_restorer) { Gitlab::ImportExport::ProjectTreeRestorer.new(user: user, shared: shared, project: project) }
let(:import_path) { 'spec/fixtures/lib/gitlab/import_export' } let(:file_content) { IO.read(File.join(shared.export_path, 'project.json')) }
let(:file_content) { IO.read("#{import_path}/project.json") } let(:json_file) { ActiveSupport::JSON.decode(file_content) }
let!(:json_file) { ActiveSupport::JSON.decode(file_content) }
before do before do
allow(shared).to receive(:export_path).and_return(import_path) setup_import_export_config('complex')
allow(ActiveSupport::JSON).to receive(:decode).and_call_original allow(ActiveSupport::JSON).to receive(:decode).and_call_original
allow(ActiveSupport::JSON).to receive(:decode).with(file_content).and_return(json_file) allow(ActiveSupport::JSON).to receive(:decode).with(file_content).and_return(json_file)
end end
......
...@@ -8,5 +8,12 @@ module ImportExport ...@@ -8,5 +8,12 @@ module ImportExport
File.open("#{tmpdir}/test", 'w') { |file| file.write("test") } File.open("#{tmpdir}/test", 'w') { |file| file.write("test") }
FileUtils.ln_s("#{tmpdir}/test", "#{tmpdir}/#{symlink_name}") FileUtils.ln_s("#{tmpdir}/test", "#{tmpdir}/#{symlink_name}")
end end
def setup_import_export_config(name, prefix = nil)
export_path = [prefix, 'spec', 'fixtures', 'lib', 'gitlab', 'import_export', name].compact
export_path = File.join(*export_path)
allow_any_instance_of(Gitlab::ImportExport).to receive(:export_path) { export_path }
end
end end
end end
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment