From 7881eb30eaa8b01dbcfe87faa09927c75c7d6e45 Mon Sep 17 00:00:00 2001 From: GitLab Bot Date: Fri, 20 Dec 2019 09:07:57 +0000 Subject: Add latest changes from gitlab-org/gitlab@12-6-stable-ee --- .../gitlab/generate_sample_prometheus_data_spec.rb | 34 +++++++ .../tasks/gitlab/import_export/import_rake_spec.rb | 112 +++++++++++++++++++++ 2 files changed, 146 insertions(+) create mode 100644 spec/tasks/gitlab/generate_sample_prometheus_data_spec.rb create mode 100644 spec/tasks/gitlab/import_export/import_rake_spec.rb (limited to 'spec/tasks') diff --git a/spec/tasks/gitlab/generate_sample_prometheus_data_spec.rb b/spec/tasks/gitlab/generate_sample_prometheus_data_spec.rb new file mode 100644 index 00000000000..72e61f5c524 --- /dev/null +++ b/spec/tasks/gitlab/generate_sample_prometheus_data_spec.rb @@ -0,0 +1,34 @@ +# frozen_string_literal: true + +require 'rake_helper' + +describe 'gitlab:generate_sample_prometheus_data rake task' do + let(:cluster) { create(:cluster, :provided_by_user, :project) } + let(:environment) { create(:environment, project: cluster.project) } + let(:sample_query_file) { File.join(Rails.root, Metrics::SampleMetricsService::DIRECTORY, 'test_query_result.yml') } + let!(:metric) { create(:prometheus_metric, project: cluster.project, identifier: 'test_query_result') } + + around do |example| + example.run + ensure + FileUtils.rm(sample_query_file) + end + + it 'creates the file correctly' do + Rake.application.rake_require 'tasks/gitlab/generate_sample_prometheus_data' + allow(Environment).to receive(:find).and_return(environment) + allow(environment).to receive_message_chain(:prometheus_adapter, :prometheus_client, :query_range) { sample_query_result } + run_rake_task('gitlab:generate_sample_prometheus_data', [environment.id]) + + expect(File.exist?(sample_query_file)).to be true + + query_file_content = YAML.load_file(sample_query_file) + + expect(query_file_content).to eq(sample_query_result) + end +end + +def sample_query_result + file = File.join(Rails.root, 'spec/fixtures/gitlab/sample_metrics', 'sample_metric_query_result.yml') + YAML.load_file(File.expand_path(file, __dir__)) +end diff --git a/spec/tasks/gitlab/import_export/import_rake_spec.rb b/spec/tasks/gitlab/import_export/import_rake_spec.rb new file mode 100644 index 00000000000..18b89912b9f --- /dev/null +++ b/spec/tasks/gitlab/import_export/import_rake_spec.rb @@ -0,0 +1,112 @@ +# frozen_string_literal: true + +require 'rake_helper' + +describe 'gitlab:import_export:import rake task', :sidekiq do + let(:username) { 'root' } + let(:namespace_path) { username } + let!(:user) { create(:user, username: username) } + let(:task_params) { [username, namespace_path, project_name, archive_path] } + let(:project) { Project.find_by_full_path("#{namespace_path}/#{project_name}") } + + before do + Rake.application.rake_require('tasks/gitlab/import_export/import') + allow(Settings.uploads.object_store).to receive(:[]=).and_call_original + allow_any_instance_of(GitlabProjectImport).to receive(:exit) + .and_raise(RuntimeError, 'exit not handled') + end + + around do |example| + old_direct_upload_setting = Settings.uploads.object_store['direct_upload'] + old_background_upload_setting = Settings.uploads.object_store['background_upload'] + + Settings.uploads.object_store['direct_upload'] = true + Settings.uploads.object_store['background_upload'] = true + + example.run + + Settings.uploads.object_store['direct_upload'] = old_direct_upload_setting + Settings.uploads.object_store['background_upload'] = old_background_upload_setting + end + + subject { run_rake_task('gitlab:import_export:import', task_params) } + + context 'when project import is valid' do + let(:project_name) { 'import_rake_test_project' } + let(:archive_path) { 'spec/fixtures/gitlab/import_export/lightweight_project_export.tar.gz' } + + it 'performs project import successfully' do + expect { subject }.to output(/Done!/).to_stdout + expect { subject }.not_to raise_error + + expect(project.merge_requests.count).to be > 0 + expect(project.issues.count).to be > 0 + expect(project.milestones.count).to be > 0 + expect(project.import_state.status).to eq('finished') + end + + it 'disables direct & background upload only during project creation' do + expect_next_instance_of(Projects::GitlabProjectsImportService) do |service| + expect(service).to receive(:execute).and_wrap_original do |m| + expect(Settings.uploads.object_store['background_upload']).to eq(false) + expect(Settings.uploads.object_store['direct_upload']).to eq(false) + + m.call + end + end + + expect_next_instance_of(GitlabProjectImport) do |importer| + expect(importer).to receive(:execute_sidekiq_job).and_wrap_original do |m| + expect(Settings.uploads.object_store['background_upload']).to eq(true) + expect(Settings.uploads.object_store['direct_upload']).to eq(true) + expect(Settings.uploads.object_store).not_to receive(:[]=).with('backgroud_upload', false) + expect(Settings.uploads.object_store).not_to receive(:[]=).with('direct_upload', false) + + m.call + end + end + + subject + end + end + + context 'when project import is invalid' do + let(:project_name) { 'import_rake_invalid_test_project' } + let(:archive_path) { 'spec/fixtures/gitlab/import_export/corrupted_project_export.tar.gz' } + let(:not_imported_message) { /Total number of not imported relations: 1/ } + let(:error) { /Validation failed: Notes is invalid/ } + + context 'when import_graceful_failures feature flag is enabled' do + before do + stub_feature_flags(import_graceful_failures: true) + end + + it 'performs project import successfully' do + expect { subject }.to output(not_imported_message).to_stdout + expect { subject }.not_to raise_error + + expect(project.merge_requests).to be_empty + expect(project.import_state.last_error).to be_nil + expect(project.import_state.status).to eq('finished') + end + end + + context 'when import_graceful_failures feature flag is disabled' do + before do + stub_feature_flags(import_graceful_failures: false) + end + + it 'fails project import with an error' do + # Catch exit call, and raise exception instead + expect_any_instance_of(GitlabProjectImport).to receive(:exit) + .with(1).and_raise(SystemExit) + + expect { subject }.to raise_error(SystemExit).and output(error).to_stdout + + expect(project.merge_requests).to be_empty + expect(project.import_state.last_error).to match(error) + expect(project.import_state.status).to eq('failed') + end + end + end +end -- cgit v1.2.1