PageRenderTime 45ms CodeModel.GetById 16ms RepoModel.GetById 0ms app.codeStats 0ms

/spec/controllers/import/bitbucket_server_controller_spec.rb

https://gitlab.com/dusek/gitlab-ce
Ruby | 161 lines | 139 code | 22 blank | 0 comment | 0 complexity | eda80c2d8c6cc9e53ead05059916ae07 MD5 | raw file
  1. require 'spec_helper'
  2. describe Import::BitbucketServerController do
  3. let(:user) { create(:user) }
  4. let(:project_key) { 'test-project' }
  5. let(:repo_slug) { 'some-repo' }
  6. let(:client) { instance_double(BitbucketServer::Client) }
  7. def assign_session_tokens
  8. session[:bitbucket_server_url] = 'http://localhost:7990'
  9. session[:bitbucket_server_username] = 'bitbucket'
  10. session[:bitbucket_server_personal_access_token] = 'some-token'
  11. end
  12. before do
  13. sign_in(user)
  14. allow(controller).to receive(:bitbucket_server_import_enabled?).and_return(true)
  15. end
  16. describe 'GET new' do
  17. render_views
  18. it 'shows the input form' do
  19. get :new
  20. expect(response.body).to have_text('Bitbucket Server URL')
  21. end
  22. end
  23. describe 'POST create' do
  24. before do
  25. allow(controller).to receive(:bitbucket_client).and_return(client)
  26. repo = double(name: 'my-project')
  27. allow(client).to receive(:repo).with(project_key, repo_slug).and_return(repo)
  28. assign_session_tokens
  29. end
  30. set(:project) { create(:project) }
  31. it 'returns the new project' do
  32. allow(Gitlab::BitbucketServerImport::ProjectCreator)
  33. .to receive(:new).with(project_key, repo_slug, anything, 'my-project', user.namespace, user, anything)
  34. .and_return(double(execute: project))
  35. post :create, params: { project: project_key, repository: repo_slug }, format: :json
  36. expect(response).to have_gitlab_http_status(200)
  37. end
  38. it 'returns an error when an invalid project key is used' do
  39. post :create, params: { project: 'some&project' }
  40. expect(response).to have_gitlab_http_status(422)
  41. end
  42. it 'returns an error when an invalid repository slug is used' do
  43. post :create, params: { project: 'some-project', repository: 'try*this' }
  44. expect(response).to have_gitlab_http_status(422)
  45. end
  46. it 'returns an error when the project cannot be found' do
  47. allow(client).to receive(:repo).with(project_key, repo_slug).and_return(nil)
  48. post :create, params: { project: project_key, repository: repo_slug }, format: :json
  49. expect(response).to have_gitlab_http_status(422)
  50. end
  51. it 'returns an error when the project cannot be saved' do
  52. allow(Gitlab::BitbucketServerImport::ProjectCreator)
  53. .to receive(:new).with(project_key, repo_slug, anything, 'my-project', user.namespace, user, anything)
  54. .and_return(double(execute: build(:project)))
  55. post :create, params: { project: project_key, repository: repo_slug }, format: :json
  56. expect(response).to have_gitlab_http_status(422)
  57. end
  58. it "returns an error when the server can't be contacted" do
  59. expect(client).to receive(:repo).with(project_key, repo_slug).and_raise(BitbucketServer::Client::ServerError)
  60. post :create, params: { project: project_key, repository: repo_slug }, format: :json
  61. expect(response).to have_gitlab_http_status(422)
  62. end
  63. end
  64. describe 'POST configure' do
  65. let(:token) { 'token' }
  66. let(:username) { 'bitbucket-user' }
  67. let(:url) { 'http://localhost:7990/bitbucket' }
  68. it 'clears out existing session' do
  69. post :configure
  70. expect(session[:bitbucket_server_url]).to be_nil
  71. expect(session[:bitbucket_server_username]).to be_nil
  72. expect(session[:bitbucket_server_personal_access_token]).to be_nil
  73. expect(response).to have_gitlab_http_status(302)
  74. expect(response).to redirect_to(status_import_bitbucket_server_path)
  75. end
  76. it 'sets the session variables' do
  77. post :configure, params: { personal_access_token: token, bitbucket_username: username, bitbucket_server_url: url }
  78. expect(session[:bitbucket_server_url]).to eq(url)
  79. expect(session[:bitbucket_server_username]).to eq(username)
  80. expect(session[:bitbucket_server_personal_access_token]).to eq(token)
  81. expect(response).to have_gitlab_http_status(302)
  82. expect(response).to redirect_to(status_import_bitbucket_server_path)
  83. end
  84. end
  85. describe 'GET status' do
  86. render_views
  87. before do
  88. allow(controller).to receive(:bitbucket_client).and_return(client)
  89. @repo = double(slug: 'vim', project_key: 'asd', full_name: 'asd/vim', "valid?" => true, project_name: 'asd', browse_url: 'http://test', name: 'vim')
  90. @invalid_repo = double(slug: 'invalid', project_key: 'foobar', full_name: 'asd/foobar', "valid?" => false, browse_url: 'http://bad-repo')
  91. @created_repo = double(slug: 'created', project_key: 'existing', full_name: 'group/created', "valid?" => true, browse_url: 'http://existing')
  92. assign_session_tokens
  93. end
  94. it 'assigns repository categories' do
  95. created_project = create(:project, :import_finished, import_type: 'bitbucket_server', creator_id: user.id, import_source: @created_repo.browse_url)
  96. repos = instance_double(BitbucketServer::Collection)
  97. expect(repos).to receive(:partition).and_return([[@repo, @created_repo], [@invalid_repo]])
  98. expect(repos).to receive(:current_page).and_return(1)
  99. expect(repos).to receive(:next_page).and_return(2)
  100. expect(repos).to receive(:prev_page).and_return(nil)
  101. expect(client).to receive(:repos).and_return(repos)
  102. get :status
  103. expect(assigns(:already_added_projects)).to eq([created_project])
  104. expect(assigns(:repos)).to eq([@repo])
  105. expect(assigns(:incompatible_repos)).to eq([@invalid_repo])
  106. end
  107. end
  108. describe 'GET jobs' do
  109. before do
  110. assign_session_tokens
  111. end
  112. it 'returns a list of imported projects' do
  113. created_project = create(:project, import_type: 'bitbucket_server', creator_id: user.id)
  114. get :jobs
  115. expect(json_response.count).to eq(1)
  116. expect(json_response.first['id']).to eq(created_project.id)
  117. expect(json_response.first['import_status']).to eq('none')
  118. end
  119. end
  120. end