From 8b573c94895dc0ac0e1d9d59cf3e8745e8b539ca Mon Sep 17 00:00:00 2001 From: GitLab Bot Date: Thu, 17 Dec 2020 11:59:07 +0000 Subject: Add latest changes from gitlab-org/gitlab@13-7-stable-ee --- .../import/bulk_imports_controller_spec.rb | 23 +++++-- spec/controllers/import/github_controller_spec.rb | 74 +++++++++++++++++----- .../import/google_code_controller_spec.rb | 65 ------------------- 3 files changed, 78 insertions(+), 84 deletions(-) delete mode 100644 spec/controllers/import/google_code_controller_spec.rb (limited to 'spec/controllers/import') diff --git a/spec/controllers/import/bulk_imports_controller_spec.rb b/spec/controllers/import/bulk_imports_controller_spec.rb index dd850a86227..436daed0af6 100644 --- a/spec/controllers/import/bulk_imports_controller_spec.rb +++ b/spec/controllers/import/bulk_imports_controller_spec.rb @@ -57,8 +57,8 @@ RSpec.describe Import::BulkImportsController do let(:client_response) do double( parsed_response: [ - { 'id' => 1, 'full_name' => 'group1', 'full_path' => 'full/path/group1' }, - { 'id' => 2, 'full_name' => 'group2', 'full_path' => 'full/path/group2' } + { 'id' => 1, 'full_name' => 'group1', 'full_path' => 'full/path/group1', 'web_url' => 'http://demo.host/full/path/group1' }, + { 'id' => 2, 'full_name' => 'group2', 'full_path' => 'full/path/group2', 'web_url' => 'http://demo.host/full/path/group1' } ] ) end @@ -132,12 +132,27 @@ RSpec.describe Import::BulkImportsController do end describe 'POST create' do + let(:instance_url) { "http://fake-intance" } + let(:pat) { "fake-pat" } + + before do + session[:bulk_import_gitlab_access_token] = pat + session[:bulk_import_gitlab_url] = instance_url + end + it 'executes BulkImportService' do - expect_next_instance_of(BulkImportService) do |service| + bulk_import_params = [{ "source_type" => "group_entity", + "source_full_path" => "full_path", + "destination_name" => + "destination_name", + "destination_namespace" => "root" }] + + expect_next_instance_of( + BulkImportService, user, bulk_import_params, { url: instance_url, access_token: pat }) do |service| expect(service).to receive(:execute) end - post :create + post :create, params: { bulk_import: bulk_import_params } expect(response).to have_gitlab_http_status(:ok) end diff --git a/spec/controllers/import/github_controller_spec.rb b/spec/controllers/import/github_controller_spec.rb index a408d821833..d82fff1f7ae 100644 --- a/spec/controllers/import/github_controller_spec.rb +++ b/spec/controllers/import/github_controller_spec.rb @@ -123,26 +123,33 @@ RSpec.describe Import::GithubController do end it 'fetches repos using latest github client' do - expect_next_instance_of(Gitlab::GithubImport::Client) do |client| - expect(client).to receive(:each_page).with(:repos).and_return([].to_enum) + expect_next_instance_of(Octokit::Client) do |client| + expect(client).to receive(:repos).and_return([].to_enum) end get :status end - it 'concatenates list of repos from multiple pages' do - repo_1 = OpenStruct.new(login: 'emacs', full_name: 'asd/emacs', name: 'emacs', owner: { login: 'owner' }) - repo_2 = OpenStruct.new(login: 'vim', full_name: 'asd/vim', name: 'vim', owner: { login: 'owner' }) - repos = [OpenStruct.new(objects: [repo_1]), OpenStruct.new(objects: [repo_2])].to_enum + context 'pagination' do + context 'when no page is specified' do + it 'requests first page' do + expect_next_instance_of(Octokit::Client) do |client| + expect(client).to receive(:repos).with(nil, { page: 1, per_page: 25 }).and_return([].to_enum) + end - allow(stub_client).to receive(:each_page).and_return(repos) + get :status + end + end - get :status, format: :json + context 'when page is specified' do + it 'requests repos with specified page' do + expect_next_instance_of(Octokit::Client) do |client| + expect(client).to receive(:repos).with(nil, { page: 2, per_page: 25 }).and_return([].to_enum) + end - expect(response).to have_gitlab_http_status(:ok) - expect(json_response.dig('provider_repos').count).to eq(2) - expect(json_response.dig('provider_repos', 0, 'id')).to eq(repo_1.id) - expect(json_response.dig('provider_repos', 1, 'id')).to eq(repo_2.id) + get :status, params: { page: 2 } + end + end end context 'when filtering' do @@ -150,6 +157,7 @@ RSpec.describe Import::GithubController do let(:user_login) { 'user' } let(:collaborations_subquery) { 'repo:repo1 repo:repo2' } let(:organizations_subquery) { 'org:org1 org:org2' } + let(:search_query) { "test in:name is:public,private user:#{user_login} #{collaborations_subquery} #{organizations_subquery}" } before do allow_next_instance_of(Octokit::Client) do |client| @@ -158,20 +166,56 @@ RSpec.describe Import::GithubController do end it 'makes request to github search api' do - expected_query = "test in:name is:public,private user:#{user_login} #{collaborations_subquery} #{organizations_subquery}" + expect_next_instance_of(Octokit::Client) do |client| + expect(client).to receive(:user).and_return(double(login: user_login)) + expect(client).to receive(:search_repositories).with(search_query, { page: 1, per_page: 25 }).and_return({ items: [].to_enum }) + end expect_next_instance_of(Gitlab::GithubImport::Client) do |client| expect(client).to receive(:collaborations_subquery).and_return(collaborations_subquery) expect(client).to receive(:organizations_subquery).and_return(organizations_subquery) - expect(client).to receive(:each_page).with(:search_repositories, expected_query).and_return([].to_enum) end get :status, params: { filter: filter }, format: :json end + context 'pagination' do + context 'when no page is specified' do + it 'requests first page' do + expect_next_instance_of(Octokit::Client) do |client| + expect(client).to receive(:user).and_return(double(login: user_login)) + expect(client).to receive(:search_repositories).with(search_query, { page: 1, per_page: 25 }).and_return({ items: [].to_enum }) + end + + expect_next_instance_of(Gitlab::GithubImport::Client) do |client| + expect(client).to receive(:collaborations_subquery).and_return(collaborations_subquery) + expect(client).to receive(:organizations_subquery).and_return(organizations_subquery) + end + + get :status, params: { filter: filter }, format: :json + end + end + + context 'when page is specified' do + it 'requests repos with specified page' do + expect_next_instance_of(Octokit::Client) do |client| + expect(client).to receive(:user).and_return(double(login: user_login)) + expect(client).to receive(:search_repositories).with(search_query, { page: 2, per_page: 25 }).and_return({ items: [].to_enum }) + end + + expect_next_instance_of(Gitlab::GithubImport::Client) do |client| + expect(client).to receive(:collaborations_subquery).and_return(collaborations_subquery) + expect(client).to receive(:organizations_subquery).and_return(organizations_subquery) + end + + get :status, params: { filter: filter, page: 2 }, format: :json + end + end + end + context 'when user input contains colons and spaces' do before do - stub_client(search_repos_by_name: []) + allow(controller).to receive(:client_repos).and_return([]) end it 'sanitizes user input' do diff --git a/spec/controllers/import/google_code_controller_spec.rb b/spec/controllers/import/google_code_controller_spec.rb deleted file mode 100644 index 0fda111c029..00000000000 --- a/spec/controllers/import/google_code_controller_spec.rb +++ /dev/null @@ -1,65 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' - -RSpec.describe Import::GoogleCodeController do - include ImportSpecHelper - - let(:user) { create(:user) } - let(:dump_file) { fixture_file_upload('spec/fixtures/GoogleCodeProjectHosting.json', 'application/json') } - - before do - sign_in(user) - end - - describe "POST callback" do - it "stores Google Takeout dump list in session" do - post :callback, params: { dump_file: dump_file } - - expect(session[:google_code_dump]).to be_a(Hash) - expect(session[:google_code_dump]["kind"]).to eq("projecthosting#user") - expect(session[:google_code_dump]).to have_key("projects") - end - end - - describe "GET status" do - before do - @repo = OpenStruct.new(name: 'vim') - stub_client(valid?: true) - end - - it "assigns variables" do - @project = create(:project, import_type: 'google_code', creator_id: user.id) - stub_client(repos: [@repo], incompatible_repos: []) - - get :status - - expect(assigns(:already_added_projects)).to eq([@project]) - expect(assigns(:repos)).to eq([@repo]) - expect(assigns(:incompatible_repos)).to eq([]) - end - - it "does not show already added project" do - @project = create(:project, import_type: 'google_code', creator_id: user.id, import_source: 'vim') - stub_client(repos: [@repo], incompatible_repos: []) - - get :status - - expect(assigns(:already_added_projects)).to eq([@project]) - expect(assigns(:repos)).to eq([]) - end - - it "does not show any invalid projects" do - stub_client(repos: [], incompatible_repos: [@repo]) - - get :status - - expect(assigns(:repos)).to be_empty - expect(assigns(:incompatible_repos)).to eq([@repo]) - end - end - - describe "POST create" do - it_behaves_like 'project import rate limiter' - end -end -- cgit v1.2.3