Added ssh_button helper specs and addressed ruby code observations

This commit is contained in:
Jose Ivan Vargas 2017-11-15 13:47:22 -06:00
parent 2e2f0675c9
commit 349e3622f9
3 changed files with 67 additions and 36 deletions

View File

@ -409,6 +409,10 @@
.clone-options-dropdown { .clone-options-dropdown {
min-width: 240px; min-width: 240px;
.dropdown-menu-inner-content {
min-width: 320px;
}
} }
} }

View File

@ -58,34 +58,34 @@ module ButtonHelper
def http_clone_button(project, append_link: true) def http_clone_button(project, append_link: true)
protocol = gitlab_config.protocol.upcase protocol = gitlab_config.protocol.upcase
dropdown_description = http_dropdown_description(protocol)
append_url = project.http_url_to_repo if append_link
protocol_description = dropdown_item_with_description(protocol, dropdown_description, href: append_url)
if current_user.try(:require_password_creation?) end
def http_dropdown_description(protocol)
if current_user.try(:require_password_creation_for_git?)
_("Set a password on your account to pull or push via %{protocol}.") % { protocol: protocol } _("Set a password on your account to pull or push via %{protocol}.") % { protocol: protocol }
else else
_("Create a personal access token on your account to pull or push via %{protocol}.") % { protocol: protocol } _("Create a personal access token on your account to pull or push via %{protocol}.") % { protocol: protocol }
end end
protocol_element_output = content_tag(:strong, protocol, class: 'dropdown-menu-inner-title')
if current_user.try(:require_password_creation?) || current_user.try(:require_personal_access_token_creation_for_git_auth?)
protocol_element_output << content_tag(:span, protocol_description, class: 'dropdown-menu-inner-content')
end
content_tag (append_link ? :a : :span),
protocol_element_output,
class: 'http-selector',
href: (project.http_url_to_repo if append_link)
end end
def ssh_clone_button(project, append_link: true) def ssh_clone_button(project, append_link: true)
ssh_description = _("You won't be able to pull or push project code via SSH until you add an SSH key to your profile") dropdown_description = _("You won't be able to pull or push project code via SSH until you add an SSH key to your profile") if current_user.try(:require_ssh_key?)
ssh_element_output = content_tag(:strong, 'SSH', class: 'dropdown-menu-inner-title') append_url = project.ssh_url_to_repo if append_link
ssh_element_output << content_tag(:span, ssh_description, class: 'dropdown-menu-inner-content') if current_user.try(:require_ssh_key?)
content_tag (append_link ? :a : :span), dropdown_item_with_description('SSH', dropdown_description, href: append_url)
ssh_element_output, end
class: 'ssh-selector',
href: (project.ssh_url_to_repo if append_link) def dropdown_item_with_description(title, description, href: nil)
button_content = content_tag(:strong, title, class: 'dropdown-menu-inner-title')
button_content << content_tag(:span, description, class: 'dropdown-menu-inner-content') if description
content_tag (href ? :a : :span),
button_content,
class: "#{title.downcase}-selector",
href: (href if href)
end end
end end

View File

@ -27,9 +27,9 @@ describe ButtonHelper do
let(:user) { create(:user, password_automatically_set: true) } let(:user) { create(:user, password_automatically_set: true) }
it 'shows the password text on the dropdown' do it 'shows the password text on the dropdown' do
expect(element.children.length).to eq(2) description = element.search('.dropdown-menu-inner-content').first
expect(element.children[1].name).to eq('span')
expect(element.children[1].children[0].text).to eq('Set a password on your account to pull or push via HTTP.') expect(description.inner_text).to eq 'Set a password on your account to pull or push via HTTP.'
end end
end end
end end
@ -40,18 +40,10 @@ describe ButtonHelper do
end end
context 'when user has no personal access tokens' do context 'when user has no personal access tokens' do
it 'has a personal access token tooltip ' do it 'has a personal access token text on the dropdown description ' do
expect(element.children.length).to eq(2) description = element.search('.dropdown-menu-inner-content').first
expect(element.children[1].name).to eq('span')
expect(element.children[1].children[0].text).to eq('Create a personal access token on your account to pull or push via HTTP.')
end
end
context 'when user has a personal access token' do expect(description.inner_text).to eq 'Create a personal access token on your account to pull or push via HTTP.'
it 'shows no tooltip' do
create(:personal_access_token, user: user)
expect(element.attr('class')).not_to include(has_tooltip_class)
end end
end end
end end
@ -65,6 +57,41 @@ describe ButtonHelper do
end end
end end
describe 'ssh_button' do
let(:user) { create(:user) }
let(:project) { build_stubbed(:project) }
def element
element = helper.ssh_clone_button(project)
Nokogiri::HTML::DocumentFragment.parse(element).first_element_child
end
before do
allow(helper).to receive(:current_user).and_return(user)
end
context 'without an ssh key on the user' do
it 'shows a warning on the dropdown description' do
description = element.search('.dropdown-menu-inner-content').first
expect(description.inner_text).to eq "You won't be able to pull or push project code via SSH until you add an SSH key to your profile"
end
end
context 'with an ssh key on the user' do
before do
create(:key, user: user)
end
it 'there is no warning on the dropdown description' do
description = element.search('.dropdown-menu-inner-content').first
expect(description).to eq nil
end
end
end
describe 'clipboard_button' do describe 'clipboard_button' do
let(:user) { create(:user) } let(:user) { create(:user) }
let(:project) { build_stubbed(:project) } let(:project) { build_stubbed(:project) }