diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2020-03-13 18:09:39 +0000 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2020-03-13 18:09:39 +0000 |
commit | 00fa950a34b1c94617110b150b8b2517d5241249 (patch) | |
tree | 8f2d8683879079da8f520f7867ebd49b8beaadef /spec | |
parent | c36152ff8c41fad2f413f253eb7ac5c927e47c56 (diff) | |
download | gitlab-ce-00fa950a34b1c94617110b150b8b2517d5241249.tar.gz |
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'spec')
-rw-r--r-- | spec/controllers/search_controller_spec.rb | 8 | ||||
-rw-r--r-- | spec/features/projects/snippets/create_snippet_spec.rb | 2 | ||||
-rw-r--r-- | spec/features/snippets/search_snippets_spec.rb | 41 | ||||
-rw-r--r-- | spec/models/concerns/bulk_insert_safe_spec.rb | 22 | ||||
-rw-r--r-- | spec/requests/api/project_import_spec.rb | 162 |
5 files changed, 112 insertions, 123 deletions
diff --git a/spec/controllers/search_controller_spec.rb b/spec/controllers/search_controller_spec.rb index 19786417d76..1fe313452fe 100644 --- a/spec/controllers/search_controller_spec.rb +++ b/spec/controllers/search_controller_spec.rb @@ -140,6 +140,14 @@ describe SearchController do end end + context 'snippet search' do + it 'forces title search' do + get :show, params: { scope: 'snippet_blobs', snippets: 'true', search: 'foo' } + + expect(assigns[:scope]).to eq('snippet_titles') + end + end + it 'finds issue comments' do project = create(:project, :public) note = create(:note_on_issue, project: project) diff --git a/spec/features/projects/snippets/create_snippet_spec.rb b/spec/features/projects/snippets/create_snippet_spec.rb index 28d24073b79..b55a42e07a9 100644 --- a/spec/features/projects/snippets/create_snippet_spec.rb +++ b/spec/features/projects/snippets/create_snippet_spec.rb @@ -32,6 +32,8 @@ shared_examples_for 'snippet editor' do visit project_snippets_path(project) + # Wait for the SVG to ensure the button location doesn't shift + within('.empty-state') { find('img.js-lazy-loaded') } click_on('New snippet') wait_for_requests end diff --git a/spec/features/snippets/search_snippets_spec.rb b/spec/features/snippets/search_snippets_spec.rb index dce790e5708..691716d3576 100644 --- a/spec/features/snippets/search_snippets_spec.rb +++ b/spec/features/snippets/search_snippets_spec.rb @@ -16,45 +16,4 @@ describe 'Search Snippets' do expect(page).to have_link(public_snippet.title) expect(page).to have_link(private_snippet.title) end - - it 'User searches for snippet contents' do - create(:personal_snippet, - :public, - title: 'Many lined snippet', - content: <<-CONTENT.strip_heredoc - |line one - |line two - |line three - |line four - |line five - |line six - |line seven - |line eight - |line nine - |line ten - |line eleven - |line twelve - |line thirteen - |line fourteen - CONTENT - ) - - sign_in create(:user) - visit dashboard_snippets_path - submit_search('line seven') - - expect(page).to have_content('line seven') - - # 3 lines before the matched line should be visible - expect(page).to have_content('line six') - expect(page).to have_content('line five') - expect(page).to have_content('line four') - expect(page).not_to have_content('line three') - - # 3 lines after the matched line should be visible - expect(page).to have_content('line eight') - expect(page).to have_content('line nine') - expect(page).to have_content('line ten') - expect(page).not_to have_content('line eleven') - end end diff --git a/spec/models/concerns/bulk_insert_safe_spec.rb b/spec/models/concerns/bulk_insert_safe_spec.rb index 4969327132a..0cc355ea694 100644 --- a/spec/models/concerns/bulk_insert_safe_spec.rb +++ b/spec/models/concerns/bulk_insert_safe_spec.rb @@ -5,13 +5,16 @@ require 'spec_helper' describe BulkInsertSafe do class BulkInsertItem < ApplicationRecord include BulkInsertSafe + include ShaAttribute - validates :name, :enum_value, :secret_value, presence: true + validates :name, :enum_value, :secret_value, :sha_value, presence: true ENUM_VALUES = { case_1: 1 }.freeze + sha_attribute :sha_value + enum enum_value: ENUM_VALUES attr_encrypted :secret_value, @@ -44,6 +47,7 @@ describe BulkInsertSafe do t.integer :enum_value, null: false t.text :encrypted_secret_value, null: false t.string :encrypted_secret_value_iv, null: false + t.binary :sha_value, null: false, limit: 20 end end @@ -61,7 +65,8 @@ describe BulkInsertSafe do BulkInsertItem.new( name: "item-#{n}", enum_value: 'case_1', - secret_value: "my-secret" + secret_value: 'my-secret', + sha_value: '2fd4e1c67a2d28fced849ee1bb76e7391b93eb12' ) end end @@ -71,7 +76,8 @@ describe BulkInsertSafe do BulkInsertItem.new( name: nil, # requires `name` to be set enum_value: 'case_1', - secret_value: "my-secret" + secret_value: 'my-secret', + sha_value: '2fd4e1c67a2d28fced849ee1bb76e7391b93eb12' ) end end @@ -112,6 +118,16 @@ describe BulkInsertSafe do BulkInsertItem.bulk_insert!(items, batch_size: 5) end + it 'items can be properly fetched from database' do + items = build_valid_items_for_bulk_insertion + + BulkInsertItem.bulk_insert!(items) + + attribute_names = BulkInsertItem.attribute_names - %w[id] + expect(BulkInsertItem.last(items.size).pluck(*attribute_names)).to eq( + items.pluck(*attribute_names)) + end + it 'rolls back the transaction when any item is invalid' do # second batch is bad all_items = build_valid_items_for_bulk_insertion + build_invalid_items_for_bulk_insertion diff --git a/spec/requests/api/project_import_spec.rb b/spec/requests/api/project_import_spec.rb index f4aa8b2e19b..563acd0ece4 100644 --- a/spec/requests/api/project_import_spec.rb +++ b/spec/requests/api/project_import_spec.rb @@ -5,7 +5,6 @@ require 'spec_helper' describe API::ProjectImport do include WorkhorseHelpers - let(:export_path) { "#{Dir.tmpdir}/project_export_spec" } let(:user) { create(:user) } let(:file) { File.join('spec', 'features', 'projects', 'import_export', 'test_project_export.tar.gz') } let(:namespace) { create(:group) } @@ -14,29 +13,39 @@ describe API::ProjectImport do let(:workhorse_headers) { { 'GitLab-Workhorse' => '1.0', Gitlab::Workhorse::INTERNAL_API_REQUEST_HEADER => workhorse_token } } before do - allow_any_instance_of(Gitlab::ImportExport).to receive(:storage_path).and_return(export_path) - stub_uploads_object_storage(FileUploader) - namespace.add_owner(user) end - after do - FileUtils.rm_rf(export_path, secure: true) - end - describe 'POST /projects/import' do + subject { upload_archive(file_upload, workhorse_headers, params) } + + let(:file_upload) { fixture_file_upload(file) } + + let(:params) do + { + path: 'test-import', + 'file.size' => file_upload.size + } + end + + before do + allow(ImportExportUploader).to receive(:workhorse_upload_path).and_return('/') + end + it 'schedules an import using a namespace' do stub_import(namespace) + params[:namespace] = namespace.id - post api('/projects/import', user), params: { path: 'test-import', file: fixture_file_upload(file), namespace: namespace.id } + subject expect(response).to have_gitlab_http_status(:created) end it 'schedules an import using the namespace path' do stub_import(namespace) + params[:namespace] = namespace.full_path - post api('/projects/import', user), params: { path: 'test-import', file: fixture_file_upload(file), namespace: namespace.full_path } + subject expect(response).to have_gitlab_http_status(:created) end @@ -46,24 +55,30 @@ describe API::ProjectImport do it 'schedules an import using a namespace and a different name' do stub_import(namespace) + params[:name] = expected_name + params[:namespace] = namespace.id - post api('/projects/import', user), params: { path: 'test-import', file: fixture_file_upload(file), namespace: namespace.id, name: expected_name } + subject expect(response).to have_gitlab_http_status(:created) end it 'schedules an import using the namespace path and a different name' do stub_import(namespace) + params[:name] = expected_name + params[:namespace] = namespace.full_path - post api('/projects/import', user), params: { path: 'test-import', file: fixture_file_upload(file), namespace: namespace.full_path, name: expected_name } + subject expect(response).to have_gitlab_http_status(:created) end it 'sets name correctly' do stub_import(namespace) + params[:name] = expected_name + params[:namespace] = namespace.full_path - post api('/projects/import', user), params: { path: 'test-import', file: fixture_file_upload(file), namespace: namespace.full_path, name: expected_name } + subject project = Project.find(json_response['id']) expect(project.name).to eq(expected_name) @@ -71,8 +86,11 @@ describe API::ProjectImport do it 'sets name correctly with an overwrite' do stub_import(namespace) + params[:name] = 'new project name' + params[:namespace] = namespace.full_path + params[:overwrite] = true - post api('/projects/import', user), params: { path: 'test-import', file: fixture_file_upload(file), namespace: namespace.full_path, name: 'new project name', overwrite: true } + subject project = Project.find(json_response['id']) expect(project.name).to eq('new project name') @@ -80,8 +98,10 @@ describe API::ProjectImport do it 'schedules an import using the path and name explicitly set to nil' do stub_import(namespace) + params[:name] = nil + params[:namespace] = namespace.full_path - post api('/projects/import', user), params: { path: 'test-import', file: fixture_file_upload(file), namespace: namespace.full_path, name: nil } + subject project = Project.find(json_response['id']) expect(project.name).to eq('test-import') @@ -90,8 +110,9 @@ describe API::ProjectImport do it 'schedules an import at the user namespace level' do stub_import(user.namespace) + params[:path] = 'test-import2' - post api('/projects/import', user), params: { path: 'test-import2', file: fixture_file_upload(file) } + subject expect(response).to have_gitlab_http_status(:created) end @@ -100,7 +121,10 @@ describe API::ProjectImport do expect_any_instance_of(ProjectImportState).not_to receive(:schedule) expect(::Projects::CreateService).not_to receive(:new) - post api('/projects/import', user), params: { namespace: 'nonexistent', path: 'test-import2', file: fixture_file_upload(file) } + params[:namespace] = 'nonexistent' + params[:path] = 'test-import2' + + subject expect(response).to have_gitlab_http_status(:not_found) expect(json_response['message']).to eq('404 Namespace Not Found') @@ -109,37 +133,40 @@ describe API::ProjectImport do it 'does not schedule an import if the user has no permission to the namespace' do expect_any_instance_of(ProjectImportState).not_to receive(:schedule) - post(api('/projects/import', create(:user)), - params: { - path: 'test-import3', - file: fixture_file_upload(file), - namespace: namespace.full_path - }) + new_namespace = create(:group) + params[:path] = 'test-import3' + params[:namespace] = new_namespace.full_path + + subject expect(response).to have_gitlab_http_status(:not_found) expect(json_response['message']).to eq('404 Namespace Not Found') end - it 'does not schedule an import if the user uploads no valid file' do - expect_any_instance_of(ProjectImportState).not_to receive(:schedule) + context 'if user uploads no valid file' do + let(:file) { 'README.md' } - post api('/projects/import', user), params: { path: 'test-import3', file: './random/test' } + it 'does not schedule an import if the user uploads no valid file' do + expect_any_instance_of(ProjectImportState).not_to receive(:schedule) + + params[:path] = 'test-import3' + + subject - expect(response).to have_gitlab_http_status(:bad_request) - expect(json_response['error']).to eq('file is invalid') + expect(response).to have_gitlab_http_status(:unprocessable_entity) + expect(json_response['message']['error']).to eq('You need to upload a GitLab project export archive (ending in .gz).') + end end it 'stores params that can be overridden' do stub_import(namespace) override_params = { 'description' => 'Hello world' } - post api('/projects/import', user), - params: { - path: 'test-import', - file: fixture_file_upload(file), - namespace: namespace.id, - override_params: override_params - } + params[:namespace] = namespace.id + params[:override_params] = override_params + + subject + import_project = Project.find(json_response['id']) expect(import_project.import_data.data['override_params']).to eq(override_params) @@ -149,33 +176,14 @@ describe API::ProjectImport do stub_import(namespace) override_params = { 'not_allowed' => 'Hello world' } - post api('/projects/import', user), - params: { - path: 'test-import', - file: fixture_file_upload(file), - namespace: namespace.id, - override_params: override_params - } - import_project = Project.find(json_response['id']) - - expect(import_project.import_data.data['override_params']).to be_empty - end + params[:namespace] = namespace.id + params[:override_params] = override_params - it 'correctly overrides params during the import', :sidekiq_might_not_need_inline do - override_params = { 'description' => 'Hello world' } + subject - perform_enqueued_jobs do - post api('/projects/import', user), - params: { - path: 'test-import', - file: fixture_file_upload(file), - namespace: namespace.id, - override_params: override_params - } - end import_project = Project.find(json_response['id']) - expect(import_project.description).to eq('Hello world') + expect(import_project.import_data.data['override_params']).to be_empty end context 'when target path already exists in namespace' do @@ -184,7 +192,9 @@ describe API::ProjectImport do it 'does not schedule an import' do expect_any_instance_of(ProjectImportState).not_to receive(:schedule) - post api('/projects/import', user), params: { path: existing_project.path, file: fixture_file_upload(file) } + params[:path] = existing_project.path + + subject expect(response).to have_gitlab_http_status(:bad_request) expect(json_response['message']).to eq('Name has already been taken') @@ -194,7 +204,10 @@ describe API::ProjectImport do it 'schedules an import' do stub_import(user.namespace) - post api('/projects/import', user), params: { path: existing_project.path, file: fixture_file_upload(file), overwrite: true } + params[:path] = existing_project.path + params[:overwrite] = true + + subject expect(response).to have_gitlab_http_status(:created) end @@ -207,16 +220,16 @@ describe API::ProjectImport do end it 'prevents users from importing projects' do - post api('/projects/import', user), params: { path: 'test-import', file: fixture_file_upload(file), namespace: namespace.id } + params[:namespace] = namespace.id + + subject expect(response).to have_gitlab_http_status(:too_many_requests) expect(json_response['message']['error']).to eq('This endpoint has been requested too many times. Try again later.') end end - context 'with direct upload enabled' do - subject { upload_archive(file_upload, workhorse_headers, params) } - + context 'when using remote storage' do let(:file_name) { 'project_export.tar.gz' } let!(:fog_connection) do @@ -232,21 +245,11 @@ describe API::ProjectImport do let(:file_upload) { fog_to_uploaded_file(tmp_object) } - let(:params) do - { - path: 'test-import-project', - namespace: namespace.id, - 'file.remote_id' => file_name, - 'file.size' => file_upload.size - } - end - - before do - allow(ImportExportUploader).to receive(:workhorse_upload_path).and_return('/') - end + it 'schedules an import' do + stub_import(namespace) + params[:namespace] = namespace.id - it 'accepts the request and stores the file' do - expect { subject }.to change { Project.count }.by(1) + subject expect(response).to have_gitlab_http_status(:created) end @@ -257,7 +260,7 @@ describe API::ProjectImport do api("/projects/import", user), method: :post, file_key: :file, - params: params.merge(file: file_upload), + params: params.merge(file: file), headers: headers, send_rewritten_field: true ) @@ -301,6 +304,7 @@ describe API::ProjectImport do expect(response).to have_gitlab_http_status(:ok) expect(response.content_type.to_s).to eq(Gitlab::Workhorse::INTERNAL_API_CONTENT_TYPE) + expect(json_response['TempPath']).to eq(ImportExportUploader.workhorse_local_upload_path) end it 'rejects requests that bypassed gitlab-workhorse' do |