2019-07-25 01:24:42 -04:00
|
|
|
# frozen_string_literal: true
|
|
|
|
|
2019-08-29 03:56:52 -04:00
|
|
|
require 'spec_helper'
|
2016-07-12 08:29:26 -04:00
|
|
|
|
2020-06-16 14:09:01 -04:00
|
|
|
RSpec.describe 'Merge request > User sees diff', :js do
|
2017-09-29 04:04:50 -04:00
|
|
|
include ProjectForksHelper
|
2018-08-11 16:33:15 -04:00
|
|
|
include RepoHelpers
|
2017-09-29 04:04:50 -04:00
|
|
|
|
2017-07-26 17:52:10 -04:00
|
|
|
let(:project) { create(:project, :public, :repository) }
|
2017-04-20 10:47:32 -04:00
|
|
|
let(:merge_request) { create(:merge_request, source_project: project) }
|
2016-07-12 08:29:26 -04:00
|
|
|
|
2017-05-17 15:58:47 -04:00
|
|
|
context 'when linking to note' do
|
|
|
|
describe 'with unresolved note' do
|
|
|
|
let(:note) { create :diff_note_on_merge_request, project: project, noteable: merge_request }
|
|
|
|
let(:fragment) { "#note_#{note.id}" }
|
|
|
|
|
|
|
|
before do
|
2017-07-06 12:20:50 -04:00
|
|
|
visit "#{diffs_project_merge_request_path(project, merge_request)}#{fragment}"
|
2017-05-17 15:58:47 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
it 'shows expanded note' do
|
|
|
|
expect(page).to have_selector(fragment, visible: true)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe 'with resolved note' do
|
|
|
|
let(:note) { create :diff_note_on_merge_request, :resolved, project: project, noteable: merge_request }
|
|
|
|
let(:fragment) { "#note_#{note.id}" }
|
|
|
|
|
|
|
|
before do
|
2017-07-06 12:20:50 -04:00
|
|
|
visit "#{diffs_project_merge_request_path(project, merge_request)}#{fragment}"
|
2017-05-17 15:58:47 -04:00
|
|
|
end
|
|
|
|
|
2017-10-10 11:36:32 -04:00
|
|
|
it 'shows expanded note' do
|
|
|
|
expect(page).to have_selector(fragment, visible: true)
|
2017-05-17 15:58:47 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2016-12-30 14:16:25 -05:00
|
|
|
context 'when merge request has overflow' do
|
|
|
|
it 'displays warning' do
|
2017-04-20 10:47:32 -04:00
|
|
|
allow(Commit).to receive(:max_diff_options).and_return(max_files: 3)
|
2018-06-21 08:22:40 -04:00
|
|
|
allow_any_instance_of(DiffHelper).to receive(:render_overflow_warning?).and_return(true)
|
2016-12-30 14:16:25 -05:00
|
|
|
|
2017-07-06 12:20:50 -04:00
|
|
|
visit diffs_project_merge_request_path(project, merge_request)
|
2016-12-30 14:16:25 -05:00
|
|
|
|
|
|
|
page.within('.alert') do
|
2019-04-26 11:51:05 -04:00
|
|
|
expect(page).to have_text("Too many changes to show. Plain diff Email patch To preserve performance only 3 of 3+ files are displayed.")
|
2017-04-22 01:54:03 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2017-04-20 10:47:32 -04:00
|
|
|
context 'when editing file' do
|
|
|
|
let(:author_user) { create(:user) }
|
|
|
|
let(:user) { create(:user) }
|
2017-09-29 04:04:50 -04:00
|
|
|
let(:forked_project) { fork_project(project, author_user, repository: true) }
|
2017-04-20 10:47:32 -04:00
|
|
|
let(:merge_request) { create(:merge_request_with_diffs, source_project: forked_project, target_project: project, author: author_user) }
|
|
|
|
let(:changelog_id) { Digest::SHA1.hexdigest("CHANGELOG") }
|
2017-04-22 01:54:03 -04:00
|
|
|
|
|
|
|
context 'as author' do
|
2019-10-23 05:06:03 -04:00
|
|
|
it 'shows direct edit link', :sidekiq_might_not_need_inline do
|
2017-06-21 19:44:10 -04:00
|
|
|
sign_in(author_user)
|
2017-07-06 12:20:50 -04:00
|
|
|
visit diffs_project_merge_request_path(project, merge_request)
|
2017-04-22 01:54:03 -04:00
|
|
|
|
|
|
|
# Throws `Capybara::Poltergeist::InvalidSelector` if we try to use `#hash` syntax
|
2020-09-24 08:09:37 -04:00
|
|
|
expect(page).to have_selector("[id=\"#{changelog_id}\"] .js-edit-blob", visible: false)
|
2017-04-22 01:54:03 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'as user who needs to fork' do
|
2020-09-15 02:09:32 -04:00
|
|
|
it 'shows fork/cancel confirmation', :sidekiq_might_not_need_inline do
|
2017-06-21 19:44:10 -04:00
|
|
|
sign_in(user)
|
2017-07-06 12:20:50 -04:00
|
|
|
visit diffs_project_merge_request_path(project, merge_request)
|
2017-04-22 01:54:03 -04:00
|
|
|
|
|
|
|
# Throws `Capybara::Poltergeist::InvalidSelector` if we try to use `#hash` syntax
|
2020-09-24 08:09:37 -04:00
|
|
|
find("[id=\"#{changelog_id}\"] .js-diff-more-actions").click
|
|
|
|
find("[id=\"#{changelog_id}\"] .js-edit-blob").click
|
2017-04-22 01:54:03 -04:00
|
|
|
|
|
|
|
expect(page).to have_selector('.js-fork-suggestion-button', count: 1)
|
|
|
|
expect(page).to have_selector('.js-cancel-fork-suggestion-button', count: 1)
|
2016-12-30 14:16:25 -05:00
|
|
|
end
|
|
|
|
end
|
2018-08-11 16:33:15 -04:00
|
|
|
|
|
|
|
context 'when file contains html' do
|
|
|
|
let(:current_user) { project.owner }
|
|
|
|
let(:branch_name) {"test_branch"}
|
|
|
|
|
|
|
|
it 'escapes any HTML special characters in the diff chunk header' do
|
|
|
|
file_content =
|
|
|
|
<<~CONTENT
|
|
|
|
function foo<input> {
|
|
|
|
let a = 1;
|
|
|
|
let b = 2;
|
|
|
|
let c = 3;
|
|
|
|
let d = 3;
|
|
|
|
}
|
2020-08-25 08:04:30 -04:00
|
|
|
CONTENT
|
2018-08-11 16:33:15 -04:00
|
|
|
|
|
|
|
new_file_content =
|
|
|
|
<<~CONTENT
|
|
|
|
function foo<input> {
|
|
|
|
let a = 1;
|
|
|
|
let b = 2;
|
|
|
|
let c = 3;
|
|
|
|
let x = 3;
|
|
|
|
}
|
2020-08-25 08:04:30 -04:00
|
|
|
CONTENT
|
2018-08-11 16:33:15 -04:00
|
|
|
|
2018-08-29 05:27:38 -04:00
|
|
|
file_name = 'xss_file.rs'
|
2018-08-11 16:33:15 -04:00
|
|
|
|
|
|
|
create_file('master', file_name, file_content)
|
|
|
|
merge_request = create(:merge_request, source_project: project)
|
|
|
|
create_file(merge_request.source_branch, file_name, new_file_content)
|
|
|
|
|
|
|
|
project.commit(merge_request.source_branch)
|
|
|
|
|
|
|
|
visit diffs_project_merge_request_path(project, merge_request)
|
|
|
|
|
|
|
|
expect(page).to have_text("function foo<input> {")
|
2018-08-29 05:27:38 -04:00
|
|
|
expect(page).to have_css(".line[lang='rust'] .k")
|
2018-08-11 16:33:15 -04:00
|
|
|
end
|
|
|
|
end
|
2018-12-13 12:49:05 -05:00
|
|
|
|
|
|
|
context 'when file is stored in LFS' do
|
|
|
|
let(:merge_request) { create(:merge_request, source_project: project) }
|
|
|
|
let(:current_user) { project.owner }
|
|
|
|
|
|
|
|
context 'when LFS is enabled on the project' do
|
|
|
|
before do
|
|
|
|
allow(Gitlab.config.lfs).to receive(:enabled).and_return(true)
|
|
|
|
project.update_attribute(:lfs_enabled, true)
|
|
|
|
|
|
|
|
create_file('master', file_name, project.repository.blob_at('master', 'files/lfs/lfs_object.iso').data)
|
|
|
|
|
|
|
|
visit diffs_project_merge_request_path(project, merge_request)
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'when file is an image', :js do
|
|
|
|
let(:file_name) { 'files/lfs/image.png' }
|
|
|
|
|
|
|
|
it 'shows an error message' do
|
|
|
|
expect(page).not_to have_content('could not be displayed because it is stored in LFS')
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'when file is not an image' do
|
|
|
|
let(:file_name) { 'files/lfs/ruby.rb' }
|
|
|
|
|
|
|
|
it 'shows an error message' do
|
|
|
|
expect(page).to have_content('This source diff could not be displayed because it is stored in LFS')
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'when LFS is not enabled' do
|
|
|
|
before do
|
|
|
|
visit diffs_project_merge_request_path(project, merge_request)
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'displays the diff' do
|
|
|
|
expect(page).to have_content('size 1575078')
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def create_file(branch_name, file_name, content)
|
|
|
|
Files::CreateService.new(
|
|
|
|
project,
|
|
|
|
current_user,
|
|
|
|
start_branch: branch_name,
|
|
|
|
branch_name: branch_name,
|
|
|
|
commit_message: "Create file",
|
|
|
|
file_path: file_name,
|
|
|
|
file_content: content
|
|
|
|
).execute
|
|
|
|
|
|
|
|
project.commit(branch_name)
|
|
|
|
end
|
2016-12-30 14:16:25 -05:00
|
|
|
end
|
2016-07-12 08:29:26 -04:00
|
|
|
end
|