2013-10-08 14:21:40 +00:00
|
|
|
require 'spec_helper'
|
|
|
|
|
|
|
|
describe ProjectsHelper do
|
2018-01-22 21:33:54 +00:00
|
|
|
include ProjectForksHelper
|
|
|
|
|
2014-12-31 13:07:48 +00:00
|
|
|
describe "#project_status_css_class" do
|
|
|
|
it "returns appropriate class" do
|
2018-06-06 01:09:58 +00:00
|
|
|
expect(project_status_css_class("started")).to eq("table-active")
|
|
|
|
expect(project_status_css_class("failed")).to eq("table-danger")
|
|
|
|
expect(project_status_css_class("finished")).to eq("table-success")
|
2014-12-31 13:07:48 +00:00
|
|
|
end
|
|
|
|
end
|
2015-07-06 12:38:43 +00:00
|
|
|
|
|
|
|
describe "can_change_visibility_level?" do
|
2018-01-22 21:33:54 +00:00
|
|
|
let(:project) { create(:project) }
|
2016-09-19 18:28:41 +00:00
|
|
|
let(:user) { create(:project_member, :reporter, user: create(:user), project: project).user }
|
2018-01-22 21:33:54 +00:00
|
|
|
let(:forked_project) { fork_project(project, user) }
|
2015-07-06 12:38:43 +00:00
|
|
|
|
2015-07-24 06:52:21 +00:00
|
|
|
it "returns false if there are no appropriate permissions" do
|
2015-07-06 12:38:43 +00:00
|
|
|
allow(helper).to receive(:can?) { false }
|
|
|
|
|
|
|
|
expect(helper.can_change_visibility_level?(project, user)).to be_falsey
|
|
|
|
end
|
|
|
|
|
|
|
|
it "returns true if there are permissions and it is not fork" do
|
|
|
|
allow(helper).to receive(:can?) { true }
|
|
|
|
|
|
|
|
expect(helper.can_change_visibility_level?(project, user)).to be_truthy
|
|
|
|
end
|
|
|
|
|
2018-01-22 21:33:54 +00:00
|
|
|
it 'allows visibility level to be changed if the project is forked' do
|
|
|
|
allow(helper).to receive(:can?).with(user, :change_visibility_level, project) { true }
|
2018-01-22 22:01:48 +00:00
|
|
|
project.update!(visibility_level: Gitlab::VisibilityLevel::PRIVATE)
|
2018-01-22 21:33:54 +00:00
|
|
|
fork_project(project)
|
|
|
|
|
|
|
|
expect(helper.can_change_visibility_level?(project, user)).to be_truthy
|
|
|
|
end
|
|
|
|
|
2015-07-06 12:38:43 +00:00
|
|
|
context "forks" do
|
|
|
|
it "returns false if there are permissions and origin project is PRIVATE" do
|
|
|
|
allow(helper).to receive(:can?) { true }
|
|
|
|
|
2018-01-22 22:01:48 +00:00
|
|
|
project.update(visibility_level: Gitlab::VisibilityLevel::PRIVATE)
|
2015-07-06 12:38:43 +00:00
|
|
|
|
2018-01-22 21:33:54 +00:00
|
|
|
expect(helper.can_change_visibility_level?(forked_project, user)).to be_falsey
|
2015-07-06 12:38:43 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
it "returns true if there are permissions and origin project is INTERNAL" do
|
|
|
|
allow(helper).to receive(:can?) { true }
|
|
|
|
|
2018-01-22 22:01:48 +00:00
|
|
|
project.update(visibility_level: Gitlab::VisibilityLevel::INTERNAL)
|
2015-07-06 12:38:43 +00:00
|
|
|
|
2018-01-22 21:33:54 +00:00
|
|
|
expect(helper.can_change_visibility_level?(forked_project, user)).to be_truthy
|
2015-07-06 12:38:43 +00:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
2015-07-24 06:52:21 +00:00
|
|
|
|
|
|
|
describe "readme_cache_key" do
|
2017-08-01 18:51:52 +00:00
|
|
|
let(:project) { create(:project, :repository) }
|
2015-07-24 06:52:21 +00:00
|
|
|
|
|
|
|
before do
|
|
|
|
helper.instance_variable_set(:@project, project)
|
|
|
|
end
|
|
|
|
|
|
|
|
it "returns a valid cach key" do
|
2017-07-20 09:34:09 +00:00
|
|
|
expect(helper.send(:readme_cache_key)).to eq("#{project.full_path}-#{project.commit.id}-readme")
|
2015-07-24 06:52:21 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
it "returns a valid cache key if HEAD does not exist" do
|
|
|
|
allow(project).to receive(:commit) { nil }
|
|
|
|
|
2017-07-20 09:34:09 +00:00
|
|
|
expect(helper.send(:readme_cache_key)).to eq("#{project.full_path}-nil-readme")
|
2015-07-24 06:52:21 +00:00
|
|
|
end
|
|
|
|
end
|
2017-03-16 09:53:48 +00:00
|
|
|
|
2017-10-03 08:35:01 +00:00
|
|
|
describe "#project_list_cache_key", :clean_gitlab_redis_shared_state do
|
2017-08-01 18:51:52 +00:00
|
|
|
let(:project) { create(:project, :repository) }
|
2017-12-11 14:21:06 +00:00
|
|
|
let(:user) { create(:user) }
|
|
|
|
|
|
|
|
before do
|
|
|
|
allow(helper).to receive(:current_user).and_return(user)
|
|
|
|
allow(helper).to receive(:can?).with(user, :read_cross_project) { true }
|
|
|
|
end
|
2017-03-16 09:53:48 +00:00
|
|
|
|
2017-05-12 15:26:01 +00:00
|
|
|
it "includes the route" do
|
|
|
|
expect(helper.project_list_cache_key(project)).to include(project.route.cache_key)
|
2017-05-12 10:33:26 +00:00
|
|
|
end
|
|
|
|
|
2017-03-16 09:53:48 +00:00
|
|
|
it "includes the project" do
|
|
|
|
expect(helper.project_list_cache_key(project)).to include(project.cache_key)
|
|
|
|
end
|
|
|
|
|
2018-06-13 16:57:18 +00:00
|
|
|
it "includes the last activity date" do
|
|
|
|
expect(helper.project_list_cache_key(project)).to include(project.last_activity_date)
|
|
|
|
end
|
|
|
|
|
2017-03-16 09:53:48 +00:00
|
|
|
it "includes the controller name" do
|
|
|
|
expect(helper.controller).to receive(:controller_name).and_return("testcontroller")
|
|
|
|
|
|
|
|
expect(helper.project_list_cache_key(project)).to include("testcontroller")
|
|
|
|
end
|
|
|
|
|
|
|
|
it "includes the controller action" do
|
|
|
|
expect(helper.controller).to receive(:action_name).and_return("testaction")
|
|
|
|
|
|
|
|
expect(helper.project_list_cache_key(project)).to include("testaction")
|
|
|
|
end
|
|
|
|
|
|
|
|
it "includes the application settings" do
|
|
|
|
settings = Gitlab::CurrentSettings.current_application_settings
|
|
|
|
|
|
|
|
expect(helper.project_list_cache_key(project)).to include(settings.cache_key)
|
|
|
|
end
|
|
|
|
|
|
|
|
it "includes a version" do
|
2017-01-03 01:55:26 +00:00
|
|
|
expect(helper.project_list_cache_key(project).last).to start_with('v')
|
2017-03-16 09:53:48 +00:00
|
|
|
end
|
|
|
|
|
2017-12-11 14:21:06 +00:00
|
|
|
it 'includes wether or not the user can read cross project' do
|
|
|
|
expect(helper.project_list_cache_key(project)).to include('cross-project:true')
|
|
|
|
end
|
|
|
|
|
2017-03-16 09:53:48 +00:00
|
|
|
it "includes the pipeline status when there is a status" do
|
|
|
|
create(:ci_pipeline, :success, project: project, sha: project.commit.sha)
|
|
|
|
|
|
|
|
expect(helper.project_list_cache_key(project)).to include("pipeline-status/#{project.commit.sha}-success")
|
|
|
|
end
|
|
|
|
end
|
2015-10-12 15:22:22 +00:00
|
|
|
|
2017-04-26 12:04:22 +00:00
|
|
|
describe '#load_pipeline_status' do
|
|
|
|
it 'loads the pipeline status in batch' do
|
2017-08-02 19:55:11 +00:00
|
|
|
project = build(:project)
|
2017-04-26 12:04:22 +00:00
|
|
|
|
|
|
|
helper.load_pipeline_status([project])
|
|
|
|
# Skip lazy loading of the `pipeline_status` attribute
|
|
|
|
pipeline_status = project.instance_variable_get('@pipeline_status')
|
|
|
|
|
|
|
|
expect(pipeline_status).to be_a(Gitlab::Cache::Ci::ProjectPipelineStatus)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2017-06-12 16:13:22 +00:00
|
|
|
describe '#show_no_ssh_key_message?' do
|
|
|
|
let(:user) { create(:user) }
|
|
|
|
|
|
|
|
before do
|
|
|
|
allow(helper).to receive(:current_user).and_return(user)
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'user has no keys' do
|
|
|
|
it 'returns true' do
|
|
|
|
expect(helper.show_no_ssh_key_message?).to be_truthy
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'user has an ssh key' do
|
|
|
|
it 'returns false' do
|
|
|
|
create(:personal_key, user: user)
|
|
|
|
|
|
|
|
expect(helper.show_no_ssh_key_message?).to be_falsey
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe '#show_no_password_message?' do
|
|
|
|
let(:user) { create(:user) }
|
|
|
|
|
|
|
|
before do
|
|
|
|
allow(helper).to receive(:current_user).and_return(user)
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'user has password set' do
|
|
|
|
it 'returns false' do
|
|
|
|
expect(helper.show_no_password_message?).to be_falsey
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2017-11-23 13:16:14 +00:00
|
|
|
context 'user has hidden the message' do
|
|
|
|
it 'returns false' do
|
|
|
|
allow(helper).to receive(:cookies).and_return(hide_no_password_message: true)
|
|
|
|
|
|
|
|
expect(helper.show_no_password_message?).to be_falsey
|
|
|
|
end
|
|
|
|
end
|
2017-06-12 16:13:22 +00:00
|
|
|
|
2017-11-23 13:16:14 +00:00
|
|
|
context 'user requires a password for Git' do
|
2017-06-12 16:13:22 +00:00
|
|
|
it 'returns true' do
|
2017-11-23 13:16:14 +00:00
|
|
|
allow(user).to receive(:require_password_creation_for_git?).and_return(true)
|
|
|
|
|
2017-06-12 16:13:22 +00:00
|
|
|
expect(helper.show_no_password_message?).to be_truthy
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2017-11-23 13:16:14 +00:00
|
|
|
context 'user requires a personal access token for Git' do
|
2017-06-12 16:13:22 +00:00
|
|
|
it 'returns true' do
|
2017-11-23 13:16:14 +00:00
|
|
|
allow(user).to receive(:require_password_creation_for_git?).and_return(false)
|
|
|
|
allow(user).to receive(:require_personal_access_token_creation_for_git_auth?).and_return(true)
|
2017-06-12 16:13:22 +00:00
|
|
|
|
|
|
|
expect(helper.show_no_password_message?).to be_truthy
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe '#link_to_set_password' do
|
2017-11-23 13:16:14 +00:00
|
|
|
let(:user) { create(:user, password_automatically_set: true) }
|
|
|
|
|
2017-06-12 16:13:22 +00:00
|
|
|
before do
|
|
|
|
allow(helper).to receive(:current_user).and_return(user)
|
|
|
|
end
|
|
|
|
|
2017-11-23 13:16:14 +00:00
|
|
|
context 'password authentication is enabled for Git' do
|
2017-06-12 16:13:22 +00:00
|
|
|
it 'returns link to set a password' do
|
2017-11-23 13:16:14 +00:00
|
|
|
stub_application_setting(password_authentication_enabled_for_git?: true)
|
|
|
|
|
2017-06-12 16:13:22 +00:00
|
|
|
expect(helper.link_to_set_password).to match %r{<a href="#{edit_profile_password_path}">set a password</a>}
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2017-11-23 13:16:14 +00:00
|
|
|
context 'password authentication is disabled for Git' do
|
2017-06-12 16:13:22 +00:00
|
|
|
it 'returns link to create a personal access token' do
|
2017-11-23 13:16:14 +00:00
|
|
|
stub_application_setting(password_authentication_enabled_for_git?: false)
|
2017-06-12 16:13:22 +00:00
|
|
|
|
|
|
|
expect(helper.link_to_set_password).to match %r{<a href="#{profile_personal_access_tokens_path}">create a personal access token</a>}
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2017-08-31 21:43:13 +00:00
|
|
|
describe '#link_to_member_avatar' do
|
2017-09-05 20:17:53 +00:00
|
|
|
let(:user) { build_stubbed(:user) }
|
2017-09-06 16:26:01 +00:00
|
|
|
let(:expected) { double }
|
2017-08-31 21:43:13 +00:00
|
|
|
|
2017-09-07 10:27:23 +00:00
|
|
|
before do
|
2018-02-09 10:43:12 +00:00
|
|
|
expect(helper).to receive(:avatar_icon_for_user).with(user, 16).and_return(expected)
|
2017-09-07 10:27:23 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
it 'returns image tag for member avatar' do
|
2017-09-20 16:18:10 +00:00
|
|
|
expect(helper).to receive(:image_tag).with(expected, { width: 16, class: ["avatar", "avatar-inline", "s16"], alt: "", "data-src" => anything })
|
2017-09-05 20:17:53 +00:00
|
|
|
|
|
|
|
helper.link_to_member_avatar(user)
|
2017-08-31 21:43:13 +00:00
|
|
|
end
|
2017-09-06 16:26:01 +00:00
|
|
|
|
|
|
|
it 'returns image tag with avatar class' do
|
2017-09-20 16:18:10 +00:00
|
|
|
expect(helper).to receive(:image_tag).with(expected, { width: 16, class: ["avatar", "avatar-inline", "s16", "any-avatar-class"], alt: "", "data-src" => anything })
|
2017-09-06 16:26:01 +00:00
|
|
|
|
|
|
|
helper.link_to_member_avatar(user, avatar_class: "any-avatar-class")
|
|
|
|
end
|
2017-08-31 21:43:13 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
describe '#link_to_member' do
|
2017-09-05 20:17:53 +00:00
|
|
|
let(:group) { build_stubbed(:group) }
|
|
|
|
let(:project) { build_stubbed(:project, group: group) }
|
2018-06-15 08:44:59 +00:00
|
|
|
let(:user) { build_stubbed(:user, name: '<h1>Administrator</h1>') }
|
2015-10-12 15:22:22 +00:00
|
|
|
|
|
|
|
describe 'using the default options' do
|
|
|
|
it 'returns an HTML link to the user' do
|
|
|
|
link = helper.link_to_member(project, user)
|
|
|
|
|
2016-10-06 12:14:24 +00:00
|
|
|
expect(link).to match(%r{/#{user.username}})
|
2015-10-12 15:22:22 +00:00
|
|
|
end
|
2018-06-15 08:44:59 +00:00
|
|
|
|
|
|
|
it 'HTML escapes the name of the user' do
|
|
|
|
link = helper.link_to_member(project, user)
|
|
|
|
|
|
|
|
expect(link).to include(ERB::Util.html_escape(user.name))
|
|
|
|
expect(link).not_to include(user.name)
|
|
|
|
end
|
2015-10-12 15:22:22 +00:00
|
|
|
end
|
|
|
|
end
|
2016-03-19 19:30:00 +00:00
|
|
|
|
|
|
|
describe 'default_clone_protocol' do
|
2016-05-04 21:05:16 +00:00
|
|
|
context 'when user is not logged in and gitlab protocol is HTTP' do
|
2016-03-19 19:30:00 +00:00
|
|
|
it 'returns HTTP' do
|
2016-05-04 21:05:16 +00:00
|
|
|
allow(helper).to receive(:current_user).and_return(nil)
|
2016-03-19 19:30:00 +00:00
|
|
|
|
|
|
|
expect(helper.send(:default_clone_protocol)).to eq('http')
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2016-05-04 21:05:16 +00:00
|
|
|
context 'when user is not logged in and gitlab protocol is HTTPS' do
|
2016-03-19 19:30:00 +00:00
|
|
|
it 'returns HTTPS' do
|
2016-05-04 21:05:16 +00:00
|
|
|
stub_config_setting(protocol: 'https')
|
|
|
|
allow(helper).to receive(:current_user).and_return(nil)
|
2016-03-19 19:30:00 +00:00
|
|
|
|
|
|
|
expect(helper.send(:default_clone_protocol)).to eq('https')
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
2016-04-22 13:03:54 +00:00
|
|
|
|
2018-04-13 10:57:19 +00:00
|
|
|
describe '#sanitizerepo_repo_path' do
|
2017-08-01 18:51:52 +00:00
|
|
|
let(:project) { create(:project, :repository) }
|
2018-06-14 11:18:25 +00:00
|
|
|
let(:storage_path) do
|
|
|
|
Gitlab::GitalyClient::StorageSettings.allow_disk_access do
|
|
|
|
Gitlab.config.repositories.storages.default.legacy_disk_path
|
|
|
|
end
|
|
|
|
end
|
2016-06-22 21:04:51 +00:00
|
|
|
|
|
|
|
before do
|
2017-04-05 21:55:19 +00:00
|
|
|
allow(Settings.shared).to receive(:[]).with('path').and_return('/base/repo/export/path')
|
2016-06-22 21:04:51 +00:00
|
|
|
end
|
|
|
|
|
2016-05-04 04:32:49 +00:00
|
|
|
it 'removes the repo path' do
|
2018-05-09 10:28:16 +00:00
|
|
|
repo = File.join(storage_path, 'namespace/test.git')
|
2016-05-04 04:32:49 +00:00
|
|
|
import_error = "Could not clone #{repo}\n"
|
|
|
|
|
2016-06-22 21:04:51 +00:00
|
|
|
expect(sanitize_repo_path(project, import_error)).to eq('Could not clone [REPOS PATH]/namespace/test.git')
|
2016-05-04 04:32:49 +00:00
|
|
|
end
|
2017-04-05 21:55:19 +00:00
|
|
|
|
|
|
|
it 'removes the temporary repo path used for uploads/exports' do
|
|
|
|
repo = '/base/repo/export/path/tmp/project_exports/uploads/test.tar.gz'
|
|
|
|
import_error = "Unable to decompress #{repo}\n"
|
|
|
|
|
|
|
|
expect(sanitize_repo_path(project, import_error)).to eq('Unable to decompress [REPO EXPORT PATH]/uploads/test.tar.gz')
|
|
|
|
end
|
2016-05-04 04:32:49 +00:00
|
|
|
end
|
2016-08-24 11:13:26 +00:00
|
|
|
|
|
|
|
describe '#last_push_event' do
|
|
|
|
let(:user) { double(:user, fork_of: nil) }
|
|
|
|
let(:project) { double(:project, id: 1) }
|
|
|
|
|
|
|
|
before do
|
|
|
|
allow(helper).to receive(:current_user).and_return(user)
|
|
|
|
helper.instance_variable_set(:@project, project)
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'when there is no current_user' do
|
|
|
|
let(:user) { nil }
|
|
|
|
|
|
|
|
it 'returns nil' do
|
|
|
|
expect(helper.last_push_event).to eq(nil)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'returns recent push on the current project' do
|
|
|
|
event = double(:event)
|
2017-09-01 10:50:14 +00:00
|
|
|
expect(user).to receive(:recent_push).with(project).and_return(event)
|
2016-08-24 11:13:26 +00:00
|
|
|
|
|
|
|
expect(helper.last_push_event).to eq(event)
|
|
|
|
end
|
|
|
|
end
|
2016-09-02 15:30:54 +00:00
|
|
|
|
2017-06-07 10:32:16 +00:00
|
|
|
describe '#get_project_nav_tabs' do
|
2017-08-02 19:55:11 +00:00
|
|
|
let(:project) { create(:project) }
|
2017-06-07 10:32:16 +00:00
|
|
|
let(:user) { create(:user) }
|
|
|
|
|
|
|
|
before do
|
|
|
|
allow(helper).to receive(:can?) { true }
|
|
|
|
end
|
|
|
|
|
|
|
|
subject do
|
|
|
|
helper.send(:get_project_nav_tabs, project, user)
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'when builds feature is enabled' do
|
|
|
|
before do
|
|
|
|
allow(project).to receive(:builds_enabled?).and_return(true)
|
|
|
|
end
|
|
|
|
|
|
|
|
it "does include pipelines tab" do
|
|
|
|
is_expected.to include(:pipelines)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'when builds feature is disabled' do
|
|
|
|
before do
|
|
|
|
allow(project).to receive(:builds_enabled?).and_return(false)
|
|
|
|
end
|
|
|
|
|
|
|
|
it "do not include pipelines tab" do
|
|
|
|
is_expected.not_to include(:pipelines)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
2017-08-04 13:40:33 +00:00
|
|
|
|
2017-09-21 10:03:14 +00:00
|
|
|
describe '#show_projects' do
|
2017-08-04 13:40:33 +00:00
|
|
|
let(:projects) do
|
|
|
|
create(:project)
|
|
|
|
Project.all
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'returns true when there are projects' do
|
2017-09-21 10:03:14 +00:00
|
|
|
expect(helper.show_projects?(projects, {})).to eq(true)
|
2017-08-04 13:40:33 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
it 'returns true when there are no projects but a name is given' do
|
2017-09-21 10:03:14 +00:00
|
|
|
expect(helper.show_projects?(Project.none, name: 'foo')).to eq(true)
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'returns true when there are no projects but personal is present' do
|
|
|
|
expect(helper.show_projects?(Project.none, personal: 'true')).to eq(true)
|
2017-08-04 13:40:33 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
it 'returns false when there are no projects and there is no name' do
|
2017-09-21 10:03:14 +00:00
|
|
|
expect(helper.show_projects?(Project.none, {})).to eq(false)
|
2017-08-04 13:40:33 +00:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2018-02-23 09:00:19 +00:00
|
|
|
describe('#push_to_create_project_command') do
|
|
|
|
let(:user) { create(:user, username: 'john') }
|
|
|
|
|
|
|
|
it 'returns the command to push to create project over HTTP' do
|
|
|
|
allow(Gitlab::CurrentSettings.current_application_settings).to receive(:enabled_git_access_protocol) { 'http' }
|
|
|
|
|
|
|
|
expect(helper.push_to_create_project_command(user)).to eq('git push --set-upstream http://test.host/john/$(git rev-parse --show-toplevel | xargs basename).git $(git rev-parse --abbrev-ref HEAD)')
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'returns the command to push to create project over SSH' do
|
|
|
|
allow(Gitlab::CurrentSettings.current_application_settings).to receive(:enabled_git_access_protocol) { 'ssh' }
|
|
|
|
|
|
|
|
expect(helper.push_to_create_project_command(user)).to eq('git push --set-upstream git@localhost:john/$(git rev-parse --show-toplevel | xargs basename).git $(git rev-parse --abbrev-ref HEAD)')
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2017-08-04 13:40:33 +00:00
|
|
|
describe '#any_projects?' do
|
2017-08-15 10:33:07 +00:00
|
|
|
let!(:project) { create(:project) }
|
2017-08-04 13:40:33 +00:00
|
|
|
|
|
|
|
it 'returns true when projects will be returned' do
|
|
|
|
expect(helper.any_projects?(Project.all)).to eq(true)
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'returns false when no projects will be returned' do
|
|
|
|
expect(helper.any_projects?(Project.none)).to eq(false)
|
|
|
|
end
|
|
|
|
|
2017-08-15 10:33:07 +00:00
|
|
|
it 'returns true when using a non-empty Array' do
|
|
|
|
expect(helper.any_projects?([project])).to eq(true)
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'returns false when using an empty Array' do
|
|
|
|
expect(helper.any_projects?([])).to eq(false)
|
|
|
|
end
|
|
|
|
|
2017-08-04 13:40:33 +00:00
|
|
|
it 'only executes a single query when a LIMIT is applied' do
|
|
|
|
relation = Project.limit(1)
|
|
|
|
recorder = ActiveRecord::QueryRecorder.new do
|
|
|
|
2.times do
|
|
|
|
helper.any_projects?(relation)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
expect(recorder.count).to eq(1)
|
|
|
|
end
|
|
|
|
end
|
2017-09-13 12:39:50 +00:00
|
|
|
|
|
|
|
describe '#git_user_name' do
|
|
|
|
let(:user) { double(:user, name: 'John "A" Doe53') }
|
|
|
|
before do
|
|
|
|
allow(helper).to receive(:current_user).and_return(user)
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'parses quotes in name' do
|
|
|
|
expect(helper.send(:git_user_name)).to eq('John \"A\" Doe53')
|
|
|
|
end
|
|
|
|
end
|
2018-06-05 10:10:34 +00:00
|
|
|
|
|
|
|
describe 'show_xcode_link' do
|
|
|
|
let!(:project) { create(:project) }
|
|
|
|
let(:mac_ua) { 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36' }
|
|
|
|
let(:ios_ua) { 'Mozilla/5.0 (iPad; CPU OS 5_1_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9B206 Safari/7534.48.3' }
|
|
|
|
|
|
|
|
context 'when the repository is xcode compatible' do
|
|
|
|
before do
|
|
|
|
allow(project.repository).to receive(:xcode_project?).and_return(true)
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'returns false if the visitor is not using macos' do
|
|
|
|
allow(helper).to receive(:browser).and_return(Browser.new(ios_ua))
|
|
|
|
|
|
|
|
expect(helper.show_xcode_link?(project)).to eq(false)
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'returns true if the visitor is using macos' do
|
|
|
|
allow(helper).to receive(:browser).and_return(Browser.new(mac_ua))
|
|
|
|
|
|
|
|
expect(helper.show_xcode_link?(project)).to eq(true)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'when the repository is not xcode compatible' do
|
|
|
|
before do
|
|
|
|
allow(project.repository).to receive(:xcode_project?).and_return(false)
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'returns false if the visitor is not using macos' do
|
|
|
|
allow(helper).to receive(:browser).and_return(Browser.new(ios_ua))
|
|
|
|
|
|
|
|
expect(helper.show_xcode_link?(project)).to eq(false)
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'returns false if the visitor is using macos' do
|
|
|
|
allow(helper).to receive(:browser).and_return(Browser.new(mac_ua))
|
|
|
|
|
|
|
|
expect(helper.show_xcode_link?(project)).to eq(false)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
2013-10-08 14:21:40 +00:00
|
|
|
end
|