debian-mirror-gitlab/spec/controllers/projects/commit_controller_spec.rb

398 lines
12 KiB
Ruby
Raw Normal View History

2016-08-24 12:49:21 +05:30
require 'spec_helper'
2016-04-02 18:10:28 +05:30
describe Projects::CommitController do
2018-03-17 18:26:18 +05:30
set(:project) { create(:project, :repository) }
set(:user) { create(:user) }
2017-08-17 22:00:37 +05:30
let(:commit) { project.commit("master") }
2016-08-24 12:49:21 +05:30
let(:master_pickable_sha) { '7d3b0f7cff5f37573aea97cebfd5692ea1689924' }
let(:master_pickable_commit) { project.commit(master_pickable_sha) }
before do
sign_in(user)
2018-03-17 18:26:18 +05:30
project.add_master(user)
2016-08-24 12:49:21 +05:30
end
2016-04-02 18:10:28 +05:30
describe 'GET show' do
render_views
2016-08-24 12:49:21 +05:30
def go(extra_params = {})
params = {
2017-08-17 22:00:37 +05:30
namespace_id: project.namespace,
project_id: project
2016-08-24 12:49:21 +05:30
}
get :show, params.merge(extra_params)
end
2016-04-02 18:10:28 +05:30
context 'with valid id' do
it 'responds with 200' do
2016-08-24 12:49:21 +05:30
go(id: commit.id)
2016-04-02 18:10:28 +05:30
expect(response).to be_ok
end
end
context 'with invalid id' do
it 'responds with 404' do
2016-08-24 12:49:21 +05:30
go(id: commit.id.reverse)
2016-04-02 18:10:28 +05:30
expect(response).to be_not_found
end
end
it 'handles binary files' do
2016-08-24 12:49:21 +05:30
go(id: TestEnv::BRANCH_SHA['binary-encoding'], format: 'html')
expect(response).to be_success
end
shared_examples "export as" do |format|
2016-09-13 17:45:13 +05:30
it "does generally work" do
2016-08-24 12:49:21 +05:30
go(id: commit.id, format: format)
expect(response).to be_success
end
2016-09-13 17:45:13 +05:30
it "generates it" do
2016-08-24 12:49:21 +05:30
expect_any_instance_of(Commit).to receive(:"to_#{format}")
go(id: commit.id, format: format)
end
2016-09-13 17:45:13 +05:30
it "renders it" do
2016-08-24 12:49:21 +05:30
go(id: commit.id, format: format)
expect(response.body).to eq(commit.send(:"to_#{format}"))
end
2016-09-13 17:45:13 +05:30
it "does not escape Html" do
2017-09-10 17:25:29 +05:30
allow_any_instance_of(Commit).to receive(:"to_#{format}")
.and_return('HTML entities &<>" ')
2016-08-24 12:49:21 +05:30
go(id: commit.id, format: format)
expect(response.body).not_to include('&amp;')
expect(response.body).not_to include('&gt;')
expect(response.body).not_to include('&lt;')
expect(response.body).not_to include('&quot;')
end
end
describe "as diff" do
include_examples "export as", :diff
let(:format) { :diff }
it "should really only be a git diff" do
2016-09-13 17:45:13 +05:30
go(id: '66eceea0db202bb39c4e445e8ca28689645366c5', format: format)
2016-08-24 12:49:21 +05:30
expect(response.body).to start_with("diff --git")
end
2016-09-13 17:45:13 +05:30
it "is only be a git diff without whitespace changes" do
2016-08-24 12:49:21 +05:30
go(id: '66eceea0db202bb39c4e445e8ca28689645366c5', format: format, w: 1)
expect(response.body).to start_with("diff --git")
2016-09-13 17:45:13 +05:30
# without whitespace option, there are more than 2 diff_splits for other formats
diff_splits = assigns(:diffs).diff_files.first.diff.diff.split("\n")
2016-08-24 12:49:21 +05:30
expect(diff_splits.length).to be <= 2
end
end
describe "as patch" do
include_examples "export as", :patch
let(:format) { :patch }
2016-11-03 12:29:30 +05:30
let(:commit2) { project.commit('498214de67004b1da3d820901307bed2a68a8ef6') }
2016-08-24 12:49:21 +05:30
2016-09-13 17:45:13 +05:30
it "is a git email patch" do
2016-11-03 12:29:30 +05:30
go(id: commit2.id, format: format)
2016-08-24 12:49:21 +05:30
2016-11-03 12:29:30 +05:30
expect(response.body).to start_with("From #{commit2.id}")
2016-08-24 12:49:21 +05:30
end
2016-09-13 17:45:13 +05:30
it "contains a git diff" do
2016-11-03 12:29:30 +05:30
go(id: commit2.id, format: format)
2016-08-24 12:49:21 +05:30
expect(response.body).to match(/^diff --git/)
end
end
context 'commit that removes a submodule' do
render_views
let(:fork_project) { create(:forked_project_with_submodules, visibility_level: 20) }
let(:commit) { fork_project.commit('remove-submodule') }
it 'renders it' do
get(:show,
2017-08-17 22:00:37 +05:30
namespace_id: fork_project.namespace,
project_id: fork_project,
2016-08-24 12:49:21 +05:30
id: commit.id)
expect(response).to be_success
end
end
2018-03-17 18:26:18 +05:30
context 'in the context of a merge_request' do
let(:merge_request) { create(:merge_request, source_project: project) }
let(:commit) { merge_request.commits.first }
it 'prepare diff notes in the context of the merge request' do
go(id: commit.id, merge_request_iid: merge_request.iid)
expect(assigns(:new_diff_note_attrs)).to eq({
noteable_type: 'MergeRequest',
noteable_id: merge_request.id,
commit_id: commit.id
})
expect(response).to be_ok
end
end
2016-08-24 12:49:21 +05:30
end
2018-03-17 18:26:18 +05:30
describe 'GET branches' do
it 'contains branch and tags information' do
commit = project.commit('5937ac0a7beb003549fc5fd26fc247adbce4a52e')
get(:branches,
namespace_id: project.namespace,
project_id: project,
id: commit.id)
expect(assigns(:branches)).to include('master', 'feature_conflict')
expect(assigns(:branches_limit_exceeded)).to be_falsey
expect(assigns(:tags)).to include('v1.1.0')
expect(assigns(:tags_limit_exceeded)).to be_falsey
end
it 'returns :limit_exceeded when number of branches/tags reach a threshhold' do
2016-11-03 12:29:30 +05:30
commit = project.commit('5937ac0a7beb003549fc5fd26fc247adbce4a52e')
2018-03-17 18:26:18 +05:30
allow_any_instance_of(Repository).to receive(:branch_count).and_return(1001)
allow_any_instance_of(Repository).to receive(:tag_count).and_return(1001)
2016-11-03 12:29:30 +05:30
2016-08-24 12:49:21 +05:30
get(:branches,
2017-08-17 22:00:37 +05:30
namespace_id: project.namespace,
project_id: project,
2016-08-24 12:49:21 +05:30
id: commit.id)
2018-03-17 18:26:18 +05:30
expect(assigns(:branches)).to eq([])
expect(assigns(:branches_limit_exceeded)).to be_truthy
expect(assigns(:tags)).to eq([])
expect(assigns(:tags_limit_exceeded)).to be_truthy
2016-08-24 12:49:21 +05:30
end
end
describe 'POST revert' do
context 'when target branch is not provided' do
2016-09-13 17:45:13 +05:30
it 'renders the 404 page' do
2016-08-24 12:49:21 +05:30
post(:revert,
2017-08-17 22:00:37 +05:30
namespace_id: project.namespace,
project_id: project,
2016-08-24 12:49:21 +05:30
id: commit.id)
expect(response).not_to be_success
2018-03-17 18:26:18 +05:30
expect(response).to have_gitlab_http_status(404)
2016-08-24 12:49:21 +05:30
end
end
context 'when the revert was successful' do
2016-09-13 17:45:13 +05:30
it 'redirects to the commits page' do
2016-08-24 12:49:21 +05:30
post(:revert,
2017-08-17 22:00:37 +05:30
namespace_id: project.namespace,
project_id: project,
start_branch: 'master',
2016-08-24 12:49:21 +05:30
id: commit.id)
2017-09-10 17:25:29 +05:30
expect(response).to redirect_to project_commits_path(project, 'master')
2016-08-24 12:49:21 +05:30
expect(flash[:notice]).to eq('The commit has been successfully reverted.')
end
end
context 'when the revert failed' do
before do
post(:revert,
2017-08-17 22:00:37 +05:30
namespace_id: project.namespace,
project_id: project,
start_branch: 'master',
2016-08-24 12:49:21 +05:30
id: commit.id)
end
2016-09-13 17:45:13 +05:30
it 'redirects to the commit page' do
2016-08-24 12:49:21 +05:30
# Reverting a commit that has been already reverted.
post(:revert,
2017-08-17 22:00:37 +05:30
namespace_id: project.namespace,
project_id: project,
start_branch: 'master',
2016-08-24 12:49:21 +05:30
id: commit.id)
2017-09-10 17:25:29 +05:30
expect(response).to redirect_to project_commit_path(project, commit.id)
2016-08-24 12:49:21 +05:30
expect(flash[:alert]).to match('Sorry, we cannot revert this commit automatically.')
end
end
end
describe 'POST cherry_pick' do
context 'when target branch is not provided' do
2016-09-13 17:45:13 +05:30
it 'renders the 404 page' do
2016-08-24 12:49:21 +05:30
post(:cherry_pick,
2017-08-17 22:00:37 +05:30
namespace_id: project.namespace,
project_id: project,
2016-08-24 12:49:21 +05:30
id: master_pickable_commit.id)
expect(response).not_to be_success
2018-03-17 18:26:18 +05:30
expect(response).to have_gitlab_http_status(404)
2016-08-24 12:49:21 +05:30
end
end
context 'when the cherry-pick was successful' do
2016-09-13 17:45:13 +05:30
it 'redirects to the commits page' do
2016-08-24 12:49:21 +05:30
post(:cherry_pick,
2017-08-17 22:00:37 +05:30
namespace_id: project.namespace,
project_id: project,
start_branch: 'master',
2016-08-24 12:49:21 +05:30
id: master_pickable_commit.id)
2017-09-10 17:25:29 +05:30
expect(response).to redirect_to project_commits_path(project, 'master')
2016-08-24 12:49:21 +05:30
expect(flash[:notice]).to eq('The commit has been successfully cherry-picked.')
end
end
2016-08-24 12:49:21 +05:30
context 'when the cherry_pick failed' do
before do
post(:cherry_pick,
2017-08-17 22:00:37 +05:30
namespace_id: project.namespace,
project_id: project,
start_branch: 'master',
2016-08-24 12:49:21 +05:30
id: master_pickable_commit.id)
end
2016-09-13 17:45:13 +05:30
it 'redirects to the commit page' do
2016-08-24 12:49:21 +05:30
# Cherry-picking a commit that has been already cherry-picked.
post(:cherry_pick,
2017-08-17 22:00:37 +05:30
namespace_id: project.namespace,
project_id: project,
start_branch: 'master',
2016-08-24 12:49:21 +05:30
id: master_pickable_commit.id)
2017-09-10 17:25:29 +05:30
expect(response).to redirect_to project_commit_path(project, master_pickable_commit.id)
2016-08-24 12:49:21 +05:30
expect(flash[:alert]).to match('Sorry, we cannot cherry-pick this commit automatically.')
end
end
end
describe 'GET diff_for_path' do
def diff_for_path(extra_params = {})
params = {
2017-08-17 22:00:37 +05:30
namespace_id: project.namespace,
project_id: project
2016-08-24 12:49:21 +05:30
}
get :diff_for_path, params.merge(extra_params)
end
let(:existing_path) { '.gitmodules' }
2016-11-03 12:29:30 +05:30
let(:commit2) { project.commit('5937ac0a7beb003549fc5fd26fc247adbce4a52e') }
2016-08-24 12:49:21 +05:30
context 'when the commit exists' do
context 'when the user has access to the project' do
context 'when the path exists in the diff' do
it 'enables diff notes' do
2016-11-03 12:29:30 +05:30
diff_for_path(id: commit2.id, old_path: existing_path, new_path: existing_path)
2016-08-24 12:49:21 +05:30
expect(assigns(:diff_notes_disabled)).to be_falsey
2017-08-17 22:00:37 +05:30
expect(assigns(:new_diff_note_attrs)).to eq(noteable_type: 'Commit',
commit_id: commit2.id)
2016-08-24 12:49:21 +05:30
end
it 'only renders the diffs for the path given' do
2016-09-13 17:45:13 +05:30
expect(controller).to receive(:render_diff_for_path).and_wrap_original do |meth, diffs|
expect(diffs.diff_files.map(&:new_path)).to contain_exactly(existing_path)
meth.call(diffs)
2016-08-24 12:49:21 +05:30
end
2016-11-03 12:29:30 +05:30
diff_for_path(id: commit2.id, old_path: existing_path, new_path: existing_path)
2016-08-24 12:49:21 +05:30
end
end
context 'when the path does not exist in the diff' do
2017-09-10 17:25:29 +05:30
before do
diff_for_path(id: commit.id, old_path: existing_path.succ, new_path: existing_path.succ)
end
2016-08-24 12:49:21 +05:30
it 'returns a 404' do
2018-03-17 18:26:18 +05:30
expect(response).to have_gitlab_http_status(404)
2016-08-24 12:49:21 +05:30
end
end
end
context 'when the user does not have access to the project' do
before do
project.team.truncate
diff_for_path(id: commit.id, old_path: existing_path, new_path: existing_path)
end
it 'returns a 404' do
2018-03-17 18:26:18 +05:30
expect(response).to have_gitlab_http_status(404)
2016-08-24 12:49:21 +05:30
end
end
end
context 'when the commit does not exist' do
2017-09-10 17:25:29 +05:30
before do
2018-03-17 18:26:18 +05:30
diff_for_path(id: commit.id.reverse, old_path: existing_path, new_path: existing_path)
2017-09-10 17:25:29 +05:30
end
2016-08-24 12:49:21 +05:30
it 'returns a 404' do
2018-03-17 18:26:18 +05:30
expect(response).to have_gitlab_http_status(404)
2016-08-24 12:49:21 +05:30
end
2016-04-02 18:10:28 +05:30
end
end
2017-08-17 22:00:37 +05:30
describe 'GET pipelines' do
def get_pipelines(extra_params = {})
params = {
namespace_id: project.namespace,
project_id: project
}
get :pipelines, params.merge(extra_params)
end
context 'when the commit exists' do
context 'when the commit has pipelines' do
before do
create(:ci_pipeline, project: project, sha: commit.id)
end
context 'when rendering a HTML format' do
it 'shows pipelines' do
get_pipelines(id: commit.id)
expect(response).to be_ok
end
end
context 'when rendering a JSON format' do
it 'responds with serialized pipelines' do
get_pipelines(id: commit.id, format: :json)
expect(response).to be_ok
2017-09-10 17:25:29 +05:30
expect(JSON.parse(response.body)['pipelines']).not_to be_empty
expect(JSON.parse(response.body)['count']['all']).to eq 1
2017-08-17 22:00:37 +05:30
end
end
end
end
context 'when the commit does not exist' do
before do
get_pipelines(id: 'e7a412c8da9f6d0081a633a4a402dde1c4694ebd')
end
it 'returns a 404' do
2018-03-17 18:26:18 +05:30
expect(response).to have_gitlab_http_status(404)
2017-08-17 22:00:37 +05:30
end
end
end
2016-04-02 18:10:28 +05:30
end