gitlab-org--gitlab-foss/spec/features/projects/commits/user_browses_commits_spec.rb

316 lines
9.6 KiB
Ruby

# frozen_string_literal: true
require 'spec_helper'
RSpec.describe 'User browses commits' do
include RepoHelpers
let(:user) { create(:user) }
let(:project) { create(:project, :public, :repository, namespace: user.namespace) }
before do
sign_in(user)
end
it 'renders commit', :js do
visit project_commit_path(project, sample_commit.id)
expect(page).to have_content(sample_commit.message.gsub(/\s+/, ' '))
.and have_content("Showing #{sample_commit.files_changed_count} changed files")
.and have_content('Side-by-side')
end
it 'fill commit sha when click new tag from commit page', :js do
dropdown_selector = '[data-testid="commit-options-dropdown"]'
visit project_commit_path(project, sample_commit.id)
find(dropdown_selector).click
page.within(dropdown_selector) do
click_link 'Tag'
end
expect(page).to have_selector("input[value='#{sample_commit.id}']", visible: false)
end
it 'renders inline diff button when click side-by-side diff button' do
visit project_commit_path(project, sample_commit.id)
find('#parallel-diff-btn').click
expect(page).to have_content 'Inline'
end
it 'renders breadcrumbs on specific commit path' do
visit project_commits_path(project, project.repository.root_ref + '/files/ruby/regex.rb', limit: 5)
expect(page).to have_selector('ul.breadcrumb')
.and have_selector('ul.breadcrumb a', count: 4)
end
it 'renders diff links to both the previous and current image', :js do
visit project_commit_path(project, sample_image_commit.id)
links = page.all('.file-actions a')
expect(links[0]['href']).to match %r{blob/#{sample_image_commit.old_blob_id}}
expect(links[1]['href']).to match %r{blob/#{sample_image_commit.new_blob_id}}
end
context 'when commit has ci status' do
let(:pipeline) { create(:ci_pipeline, project: project, sha: sample_commit.id) }
before do
project.enable_ci
create(:ci_build, pipeline: pipeline)
end
it 'renders commit ci info' do
visit project_commit_path(project, sample_commit.id)
expect(page).to have_content "Pipeline ##{pipeline.id} pending"
end
end
context 'primary email' do
it 'finds a commit by a primary email' do
user = create(:user, email: 'dmitriy.zaporozhets@gmail.com')
visit(project_commit_path(project, sample_commit.id))
check_author_link(sample_commit.author_email, user)
end
end
context 'secondary email' do
let(:user) { create(:user) }
it 'finds a commit by a secondary email' do
create(:email, :confirmed, user: user, email: 'dmitriy.zaporozhets@gmail.com')
visit(project_commit_path(project, sample_commit.parent_id))
check_author_link(sample_commit.author_email, user)
end
it 'links to an unverified e-mail address instead of the user' do
create(:email, user: user, email: 'dmitriy.zaporozhets@gmail.com')
visit(project_commit_path(project, sample_commit.parent_id))
check_author_email(sample_commit.author_email)
end
end
context 'when the blob does not exist' do
let(:commit) { create(:commit, project: project) }
it 'renders successfully', :js do
allow_next_instance_of(Gitlab::Diff::File) do |instance|
allow(instance).to receive(:blob).and_return(nil)
end
allow_next_instance_of(Gitlab::Diff::File) do |instance|
allow(instance).to receive(:binary?).and_return(true)
end
visit(project_commit_path(project, commit))
click_button '2 changed files'
expect(find('[data-testid="diff-stats-dropdown"]')).to have_content('files/ruby/popen.rb')
end
end
describe 'commits list' do
let(:visit_commits_page) do
visit project_commits_path(project, project.repository.root_ref, limit: 5)
end
it 'searches commit', :js do
visit_commits_page
fill_in 'commits-search', with: 'submodules'
expect(page).to have_content 'More submodules'
expect(page).not_to have_content 'Change some files'
end
it 'renders commits atom feed' do
visit_commits_page
click_link('Commits feed')
commit = project.repository.commit
expect(response_headers['Content-Type']).to have_content("application/atom+xml")
expect(body).to have_selector('title', text: "#{project.name}:master commits")
.and have_selector('author email', text: commit.author_email)
.and have_selector('entry summary', text: commit.description[0..10].delete("\r\n"))
end
context "when commit has a filename with pathspec characters" do
let(:path) { ':wq' }
let(:filename) { File.join(path, 'test.txt') }
let(:ref) { project.repository.root_ref }
let(:newrev) { project.repository.commit('master').sha }
let(:short_newrev) { project.repository.commit('master').short_id }
let(:message) { 'Glob characters' }
before do
create_file_in_repo(project, ref, ref, filename, 'Test file', commit_message: message)
visit project_commits_path(project, "#{ref}/#{path}", limit: 1)
wait_for_requests
end
it 'searches commit', :js do
expect(page).to have_content(message)
fill_in 'commits-search', with: 'bogus12345'
expect(page).to have_content "Your search didn't match any commits"
fill_in 'commits-search', with: 'Glob'
expect(page).to have_content message
end
end
context 'when a commit links to a confidential issue' do
let(:confidential_issue) { create(:issue, confidential: true, title: 'Secret issue!', project: project) }
before do
project.repository.create_file(user, 'dummy-file', 'dummy content',
branch_name: 'feature',
message: "Linking #{confidential_issue.to_reference}")
end
context 'when the user cannot see confidential issues but was cached with a link', :use_clean_rails_memory_store_fragment_caching do
it 'does not render the confidential issue' do
visit project_commits_path(project, 'feature')
sign_in(create(:user))
visit project_commits_path(project, 'feature')
expect(page).not_to have_link(href: project_issue_path(project, confidential_issue))
end
end
end
context 'master branch' do
before do
visit_commits_page
end
it 'renders project commits' do
commit = project.repository.commit
expect(page).to have_content(project.name)
.and have_content(commit.message[0..20])
.and have_content(commit.short_id)
end
it 'does not render create merge request button' do
expect(page).not_to have_link 'Create merge request'
end
context 'when click the compare tab' do
before do
wait_for_requests
click_link('Compare')
end
it 'does not render create merge request button', :js do
expect(page).not_to have_link 'Create merge request'
end
end
end
context 'feature branch' do
let(:visit_commits_page) do
visit project_commits_path(project, 'feature')
end
context 'when project does not have open merge requests' do
before do
visit_commits_page
end
it 'renders project commits' do
commit = project.repository.commit('0b4bc9a')
expect(page).to have_content(project.name)
.and have_content(commit.message[0..12])
.and have_content(commit.short_id)
end
it 'renders create merge request button' do
expect(page).to have_link 'Create merge request'
end
context 'when click the compare tab' do
before do
wait_for_requests
click_link('Compare')
end
it 'renders create merge request button', :js do
expect(page).to have_link 'Create merge request'
end
end
end
context 'when project have open merge request' do
let!(:merge_request) do
create(
:merge_request,
title: 'Feature',
source_project: project,
source_branch: 'feature',
target_branch: 'master',
author: project.users.first
)
end
before do
visit_commits_page
end
it 'renders project commits' do
commit = project.repository.commit('0b4bc9a')
expect(page).to have_content(project.name)
.and have_content(commit.message[0..12])
.and have_content(commit.short_id)
end
it 'renders button to the merge request' do
expect(page).not_to have_link 'Create merge request'
expect(page).to have_link 'View open merge request', href: project_merge_request_path(project, merge_request)
end
context 'when click the compare tab' do
before do
wait_for_requests
click_link('Compare')
end
it 'renders button to the merge request', :js do
expect(page).not_to have_link 'Create merge request'
expect(page).to have_link 'View open merge request', href: project_merge_request_path(project, merge_request)
end
end
end
end
end
end
private
def check_author_link(email, author)
author_link = find('.commit-author-link')
expect(author_link['href']).to eq(user_path(author))
expect(find('.commit-author-name').text).to eq(author.name)
end
def check_author_email(email)
author_link = find('.commit-author-link')
expect(author_link['href']).to eq("mailto:#{email}")
end