Merge branch '26732-combine-deploy-keys-and-push-rules-and-mirror-repository-and-protect-branches-settings-pages' into 'master'
Resolve "Combine Deploy Keys and Push Rules and Mirror Repository and Protect Branches settings pages" Closes #26732 See merge request !8731
This commit is contained in:
commit
e84afa8bed
27 changed files with 328 additions and 114 deletions
|
@ -287,7 +287,7 @@ const UserCallout = require('./user_callout');
|
|||
case 'search:show':
|
||||
new Search();
|
||||
break;
|
||||
case 'projects:protected_branches:index':
|
||||
case 'projects:repository:show':
|
||||
new gl.ProtectedBranchCreate();
|
||||
new gl.ProtectedBranchEditList();
|
||||
break;
|
||||
|
|
|
@ -746,6 +746,8 @@ pre.light-well {
|
|||
}
|
||||
|
||||
.protected-branches-list {
|
||||
margin-bottom: 30px;
|
||||
|
||||
a {
|
||||
color: $gl-text-color;
|
||||
|
||||
|
|
7
app/controllers/concerns/repository_settings_redirect.rb
Normal file
7
app/controllers/concerns/repository_settings_redirect.rb
Normal file
|
@ -0,0 +1,7 @@
|
|||
module RepositorySettingsRedirect
|
||||
extend ActiveSupport::Concern
|
||||
|
||||
def redirect_to_repository_settings(project)
|
||||
redirect_to namespace_project_settings_repository_path(project.namespace, project)
|
||||
end
|
||||
end
|
|
@ -1,4 +1,5 @@
|
|||
class Projects::DeployKeysController < Projects::ApplicationController
|
||||
include RepositorySettingsRedirect
|
||||
respond_to :html
|
||||
|
||||
# Authorize
|
||||
|
@ -7,51 +8,36 @@ class Projects::DeployKeysController < Projects::ApplicationController
|
|||
layout "project_settings"
|
||||
|
||||
def index
|
||||
@key = DeployKey.new
|
||||
set_index_vars
|
||||
redirect_to_repository_settings(@project)
|
||||
end
|
||||
|
||||
def new
|
||||
redirect_to namespace_project_deploy_keys_path(@project.namespace, @project)
|
||||
redirect_to_repository_settings(@project)
|
||||
end
|
||||
|
||||
def create
|
||||
@key = DeployKey.new(deploy_key_params.merge(user: current_user))
|
||||
set_index_vars
|
||||
|
||||
if @key.valid? && @project.deploy_keys << @key
|
||||
redirect_to namespace_project_deploy_keys_path(@project.namespace, @project)
|
||||
else
|
||||
render "index"
|
||||
unless @key.valid? && @project.deploy_keys << @key
|
||||
flash[:alert] = @key.errors.full_messages.join(', ').html_safe
|
||||
end
|
||||
redirect_to_repository_settings(@project)
|
||||
end
|
||||
|
||||
def enable
|
||||
Projects::EnableDeployKeyService.new(@project, current_user, params).execute
|
||||
|
||||
redirect_to namespace_project_deploy_keys_path(@project.namespace, @project)
|
||||
redirect_to_repository_settings(@project)
|
||||
end
|
||||
|
||||
def disable
|
||||
@project.deploy_keys_projects.find_by(deploy_key_id: params[:id]).destroy
|
||||
|
||||
redirect_back_or_default(default: { action: 'index' })
|
||||
redirect_to_repository_settings(@project)
|
||||
end
|
||||
|
||||
protected
|
||||
|
||||
def set_index_vars
|
||||
@enabled_keys ||= @project.deploy_keys
|
||||
|
||||
@available_keys ||= current_user.accessible_deploy_keys - @enabled_keys
|
||||
@available_project_keys ||= current_user.project_deploy_keys - @enabled_keys
|
||||
@available_public_keys ||= DeployKey.are_public - @enabled_keys
|
||||
|
||||
# Public keys that are already used by another accessible project are already
|
||||
# in @available_project_keys.
|
||||
@available_public_keys -= @available_project_keys
|
||||
end
|
||||
|
||||
def deploy_key_params
|
||||
params.require(:deploy_key).permit(:key, :title, :can_push)
|
||||
end
|
||||
|
|
|
@ -1,26 +1,22 @@
|
|||
class Projects::ProtectedBranchesController < Projects::ApplicationController
|
||||
include RepositorySettingsRedirect
|
||||
# Authorize
|
||||
before_action :require_non_empty_project
|
||||
before_action :authorize_admin_project!
|
||||
before_action :load_protected_branch, only: [:show, :update, :destroy]
|
||||
before_action :load_protected_branches, only: [:index]
|
||||
|
||||
layout "project_settings"
|
||||
|
||||
def index
|
||||
@protected_branch = @project.protected_branches.new
|
||||
load_gon_index
|
||||
redirect_to_repository_settings(@project)
|
||||
end
|
||||
|
||||
def create
|
||||
@protected_branch = ::ProtectedBranches::CreateService.new(@project, current_user, protected_branch_params).execute
|
||||
if @protected_branch.persisted?
|
||||
redirect_to namespace_project_protected_branches_path(@project.namespace, @project)
|
||||
else
|
||||
load_protected_branches
|
||||
load_gon_index
|
||||
render :index
|
||||
unless @protected_branch.persisted?
|
||||
flash[:alert] = @protected_branches.errors.full_messages.join(', ').html_safe
|
||||
end
|
||||
redirect_to_repository_settings(@project)
|
||||
end
|
||||
|
||||
def show
|
||||
|
@ -45,7 +41,7 @@ class Projects::ProtectedBranchesController < Projects::ApplicationController
|
|||
@protected_branch.destroy
|
||||
|
||||
respond_to do |format|
|
||||
format.html { redirect_to namespace_project_protected_branches_path }
|
||||
format.html { redirect_to_repository_settings(@project) }
|
||||
format.js { head :ok }
|
||||
end
|
||||
end
|
||||
|
@ -61,24 +57,4 @@ class Projects::ProtectedBranchesController < Projects::ApplicationController
|
|||
merge_access_levels_attributes: [:access_level, :id],
|
||||
push_access_levels_attributes: [:access_level, :id])
|
||||
end
|
||||
|
||||
def load_protected_branches
|
||||
@protected_branches = @project.protected_branches.order(:name).page(params[:page])
|
||||
end
|
||||
|
||||
def access_levels_options
|
||||
{
|
||||
push_access_levels: {
|
||||
roles: ProtectedBranch::PushAccessLevel.human_access_levels.map { |id, text| { id: id, text: text, before_divider: true } },
|
||||
},
|
||||
merge_access_levels: {
|
||||
roles: ProtectedBranch::MergeAccessLevel.human_access_levels.map { |id, text| { id: id, text: text, before_divider: true } }
|
||||
}
|
||||
}
|
||||
end
|
||||
|
||||
def load_gon_index
|
||||
params = { open_branches: @project.open_branches.map { |br| { text: br.name, id: br.name, title: br.name } } }
|
||||
gon.push(params.merge(access_levels_options))
|
||||
end
|
||||
end
|
||||
|
|
50
app/controllers/projects/settings/repository_controller.rb
Normal file
50
app/controllers/projects/settings/repository_controller.rb
Normal file
|
@ -0,0 +1,50 @@
|
|||
module Projects
|
||||
module Settings
|
||||
class RepositoryController < Projects::ApplicationController
|
||||
before_action :authorize_admin_project!
|
||||
|
||||
def show
|
||||
@deploy_keys = DeployKeysPresenter
|
||||
.new(@project, current_user: current_user)
|
||||
|
||||
define_protected_branches
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def define_protected_branches
|
||||
load_protected_branches
|
||||
@protected_branch = @project.protected_branches.new
|
||||
load_gon_index
|
||||
end
|
||||
|
||||
def load_protected_branches
|
||||
@protected_branches = @project.protected_branches.order(:name).page(params[:page])
|
||||
end
|
||||
|
||||
def access_levels_options
|
||||
{
|
||||
push_access_levels: {
|
||||
roles: ProtectedBranch::PushAccessLevel.human_access_levels.map do |id, text|
|
||||
{ id: id, text: text, before_divider: true }
|
||||
end
|
||||
},
|
||||
merge_access_levels: {
|
||||
roles: ProtectedBranch::MergeAccessLevel.human_access_levels.map do |id, text|
|
||||
{ id: id, text: text, before_divider: true }
|
||||
end
|
||||
}
|
||||
}
|
||||
end
|
||||
|
||||
def open_branches
|
||||
branches = @project.open_branches.map { |br| { text: br.name, id: br.name, title: br.name } }
|
||||
{ open_branches: branches }
|
||||
end
|
||||
|
||||
def load_gon_index
|
||||
gon.push(open_branches.merge(access_levels_options))
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
60
app/presenters/projects/settings/deploy_keys_presenter.rb
Normal file
60
app/presenters/projects/settings/deploy_keys_presenter.rb
Normal file
|
@ -0,0 +1,60 @@
|
|||
module Projects
|
||||
module Settings
|
||||
class DeployKeysPresenter < Gitlab::View::Presenter::Simple
|
||||
presents :project
|
||||
delegate :size, to: :enabled_keys, prefix: true
|
||||
delegate :size, to: :available_project_keys, prefix: true
|
||||
delegate :size, to: :available_public_keys, prefix: true
|
||||
|
||||
def new_key
|
||||
@key ||= DeployKey.new
|
||||
end
|
||||
|
||||
def enabled_keys
|
||||
@enabled_keys ||= project.deploy_keys
|
||||
end
|
||||
|
||||
def any_keys_enabled?
|
||||
enabled_keys.any?
|
||||
end
|
||||
|
||||
def available_keys
|
||||
@available_keys ||= current_user.accessible_deploy_keys - enabled_keys
|
||||
end
|
||||
|
||||
def available_project_keys
|
||||
@available_project_keys ||= current_user.project_deploy_keys - enabled_keys
|
||||
end
|
||||
|
||||
def any_available_project_keys_enabled?
|
||||
available_project_keys.any?
|
||||
end
|
||||
|
||||
def key_available?(deploy_key)
|
||||
available_keys.include?(deploy_key)
|
||||
end
|
||||
|
||||
def available_public_keys
|
||||
return @available_public_keys if defined?(@available_public_keys)
|
||||
|
||||
@available_public_keys ||= DeployKey.are_public - enabled_keys
|
||||
|
||||
# Public keys that are already used by another accessible project are already
|
||||
# in @available_project_keys.
|
||||
@available_public_keys -= available_project_keys
|
||||
end
|
||||
|
||||
def any_available_public_keys_enabled?
|
||||
available_public_keys.any?
|
||||
end
|
||||
|
||||
def to_partial_path
|
||||
'projects/deploy_keys/index'
|
||||
end
|
||||
|
||||
def form_partial_path
|
||||
'projects/deploy_keys/form'
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
|
@ -4,18 +4,14 @@
|
|||
%span
|
||||
Members
|
||||
- if can_edit
|
||||
= nav_link(controller: :deploy_keys) do
|
||||
= link_to namespace_project_deploy_keys_path(@project.namespace, @project), title: 'Deploy Keys' do
|
||||
= nav_link(controller: :repository) do
|
||||
= link_to namespace_project_settings_repository_path(@project.namespace, @project), title: 'Repository' do
|
||||
%span
|
||||
Deploy Keys
|
||||
Repository
|
||||
= nav_link(controller: :integrations) do
|
||||
= link_to namespace_project_settings_integrations_path(@project.namespace, @project), title: 'Integrations' do
|
||||
%span
|
||||
Integrations
|
||||
= nav_link(controller: :protected_branches) do
|
||||
= link_to namespace_project_protected_branches_path(@project.namespace, @project), title: 'Protected Branches' do
|
||||
%span
|
||||
Protected Branches
|
||||
|
||||
- if @project.feature_available?(:builds, current_user)
|
||||
= nav_link(controller: :ci_cd) do
|
||||
|
|
|
@ -18,7 +18,7 @@
|
|||
%span.key-created-at
|
||||
created #{time_ago_with_tooltip(deploy_key.created_at)}
|
||||
.visible-xs-block.visible-sm-block
|
||||
- if @available_keys.include?(deploy_key)
|
||||
- if @deploy_keys.key_available?(deploy_key)
|
||||
= link_to enable_namespace_project_deploy_key_path(@project.namespace, @project, deploy_key), class: "btn btn-sm prepend-left-10", method: :put do
|
||||
Enable
|
||||
- else
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
= form_for [@project.namespace.becomes(Namespace), @project, @key], url: namespace_project_deploy_keys_path, html: { class: "js-requires-input" } do |f|
|
||||
= form_errors(@key)
|
||||
= form_for [@project.namespace.becomes(Namespace), @project, @deploy_keys.new_key], url: namespace_project_deploy_keys_path, html: { class: "js-requires-input" } do |f|
|
||||
= form_errors(@deploy_keys.new_key)
|
||||
.form-group
|
||||
= f.label :title, class: "label-light"
|
||||
= f.text_field :title, class: 'form-control', autofocus: true, required: true
|
||||
|
|
34
app/views/projects/deploy_keys/_index.html.haml
Normal file
34
app/views/projects/deploy_keys/_index.html.haml
Normal file
|
@ -0,0 +1,34 @@
|
|||
.row.prepend-top-default
|
||||
.col-lg-3.profile-settings-sidebar
|
||||
%h4.prepend-top-0
|
||||
Deploy Keys
|
||||
%p
|
||||
Deploy keys allow read-only access to your repository. Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one.
|
||||
.col-lg-9
|
||||
%h5.prepend-top-0
|
||||
Create a new deploy key for this project
|
||||
= render @deploy_keys.form_partial_path
|
||||
.col-lg-9.col-lg-offset-3
|
||||
%hr
|
||||
.col-lg-9.col-lg-offset-3.append-bottom-default.deploy-keys
|
||||
%h5.prepend-top-0
|
||||
Enabled deploy keys for this project (#{@deploy_keys.enabled_keys_size})
|
||||
- if @deploy_keys.any_keys_enabled?
|
||||
%ul.well-list
|
||||
= render partial: 'projects/deploy_keys/deploy_key', collection: @deploy_keys.enabled_keys, as: :deploy_key
|
||||
- else
|
||||
.settings-message.text-center
|
||||
No deploy keys found. Create one with the form above.
|
||||
%h5.prepend-top-default
|
||||
Deploy keys from projects you have access to (#{@deploy_keys.available_project_keys_size})
|
||||
- if @deploy_keys.any_available_project_keys_enabled?
|
||||
%ul.well-list
|
||||
= render partial: 'projects/deploy_keys/deploy_key', collection: @deploy_keys.available_project_keys, as: :deploy_key
|
||||
- else
|
||||
.settings-message.text-center
|
||||
No deploy keys from your projects could be found. Create one with the form above or add existing one below.
|
||||
- if @deploy_keys.any_available_public_keys_enabled?
|
||||
%h5.prepend-top-default
|
||||
Public deploy keys available to any project (#{@deploy_keys.available_public_keys_size})
|
||||
%ul.well-list
|
||||
= render partial: 'projects/deploy_keys/deploy_key', collection: @deploy_keys.available_public_keys, as: :deploy_key
|
|
@ -1,36 +0,0 @@
|
|||
- page_title "Deploy Keys"
|
||||
|
||||
.row.prepend-top-default
|
||||
.col-lg-3.profile-settings-sidebar
|
||||
%h4.prepend-top-0
|
||||
= page_title
|
||||
%p
|
||||
Deploy keys allow read-only access to your repository. Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one.
|
||||
.col-lg-9
|
||||
%h5.prepend-top-0
|
||||
Create a new deploy key for this project
|
||||
= render "form"
|
||||
.col-lg-9.col-lg-offset-3
|
||||
%hr
|
||||
.col-lg-9.col-lg-offset-3.append-bottom-default.deploy-keys
|
||||
%h5.prepend-top-0
|
||||
Enabled deploy keys for this project (#{@enabled_keys.size})
|
||||
- if @enabled_keys.any?
|
||||
%ul.well-list
|
||||
= render @enabled_keys
|
||||
- else
|
||||
.settings-message.text-center
|
||||
No deploy keys found. Create one with the form above or add existing one below.
|
||||
%h5.prepend-top-default
|
||||
Deploy keys from projects you have access to (#{@available_project_keys.size})
|
||||
- if @available_project_keys.any?
|
||||
%ul.well-list
|
||||
= render @available_project_keys
|
||||
- else
|
||||
.settings-message.text-center
|
||||
No deploy keys from your projects could be found. Create one with the form above or add existing one below.
|
||||
- if @available_public_keys.any?
|
||||
%h5.prepend-top-default
|
||||
Public deploy keys available to any project (#{@available_public_keys.size})
|
||||
%ul.well-list
|
||||
= render @available_public_keys
|
|
@ -23,6 +23,6 @@
|
|||
- if can_admin_project
|
||||
%th
|
||||
%tbody
|
||||
= render partial: @protected_branches, locals: { can_admin_project: can_admin_project }
|
||||
= render partial: 'projects/protected_branches/protected_branch', collection: @protected_branches, locals: { can_admin_project: can_admin_project}
|
||||
|
||||
= paginate @protected_branches, theme: 'gitlab'
|
||||
|
|
|
@ -10,7 +10,7 @@
|
|||
= f.label :name, class: 'col-md-2 text-right' do
|
||||
Branch:
|
||||
.col-md-10
|
||||
= render partial: "dropdown", locals: { f: f }
|
||||
= render partial: "projects/protected_branches/dropdown", locals: { f: f }
|
||||
.help-block
|
||||
= link_to 'Wildcards', help_page_path('user/project/protected_branches', anchor: 'wildcard-protected-branches')
|
||||
such as
|
||||
|
|
|
@ -1,11 +1,10 @@
|
|||
- page_title "Protected branches"
|
||||
- content_for :page_specific_javascripts do
|
||||
= page_specific_javascript_bundle_tag('protected_branches')
|
||||
|
||||
.row.prepend-top-default.append-bottom-default
|
||||
.col-lg-3
|
||||
%h4.prepend-top-0
|
||||
= page_title
|
||||
Protected Branches
|
||||
%p Keep stable branches secure and force developers to use merge requests.
|
||||
%p.prepend-top-20
|
||||
By default, protected branches are designed to:
|
||||
|
@ -17,6 +16,6 @@
|
|||
%p.append-bottom-0 Read more about #{link_to "protected branches", help_page_path("user/project/protected_branches"), class: "underlined-link"} and #{link_to "project permissions", help_page_path("user/permissions"), class: "underlined-link"}.
|
||||
.col-lg-9
|
||||
- if can? current_user, :admin_project, @project
|
||||
= render 'create_protected_branch'
|
||||
= render 'projects/protected_branches/create_protected_branch'
|
||||
|
||||
= render "branches_list"
|
||||
= render "projects/protected_branches/branches_list"
|
|
@ -14,7 +14,7 @@
|
|||
- else
|
||||
(branch was removed from repository)
|
||||
|
||||
= render partial: 'update_protected_branch', locals: { protected_branch: protected_branch }
|
||||
= render partial: 'projects/protected_branches/update_protected_branch', locals: { protected_branch: protected_branch }
|
||||
|
||||
- if can_admin_project
|
||||
%td
|
||||
|
|
4
app/views/projects/settings/repository/show.html.haml
Normal file
4
app/views/projects/settings/repository/show.html.haml
Normal file
|
@ -0,0 +1,4 @@
|
|||
- page_title "Repository"
|
||||
|
||||
= render @deploy_keys
|
||||
= render "projects/protected_branches/index"
|
|
@ -0,0 +1,5 @@
|
|||
---
|
||||
title: Combined deploy keys, push rules, protect branches and mirror repository settings options into a single one called
|
||||
Repository
|
||||
merge_request:
|
||||
author:
|
|
@ -329,6 +329,7 @@ constraints(ProjectUrlConstrainer.new) do
|
|||
resource :members, only: [:show]
|
||||
resource :ci_cd, only: [:show], controller: 'ci_cd'
|
||||
resource :integrations, only: [:show]
|
||||
resource :repository, only: [:show], controller: :repository
|
||||
end
|
||||
|
||||
# Since both wiki and repository routing contains wildcard characters
|
||||
|
|
|
@ -56,10 +56,10 @@ Feature: Project Active Tab
|
|||
And no other sub navs should be active
|
||||
And the active main tab should be Settings
|
||||
|
||||
Scenario: On Project Settings/Deploy Keys
|
||||
Scenario: On Project Settings/Repository
|
||||
Given I visit my project's settings page
|
||||
And I click the "Deploy Keys" tab
|
||||
Then the active sub nav should be Deploy Keys
|
||||
And I click the "Repository" tab
|
||||
Then the active sub nav should be Repository
|
||||
And no other sub navs should be active
|
||||
And the active main tab should be Settings
|
||||
|
||||
|
|
|
@ -31,8 +31,10 @@ class Spinach::Features::ProjectActiveTab < Spinach::FeatureSteps
|
|||
click_link('Integrations')
|
||||
end
|
||||
|
||||
step 'I click the "Deploy Keys" tab' do
|
||||
click_link('Deploy Keys')
|
||||
step 'I click the "Repository" tab' do
|
||||
page.within '.layout-nav .controls' do
|
||||
click_link('Repository')
|
||||
end
|
||||
end
|
||||
|
||||
step 'I click the "Pages" tab' do
|
||||
|
@ -53,8 +55,8 @@ class Spinach::Features::ProjectActiveTab < Spinach::FeatureSteps
|
|||
ensure_active_sub_nav('Integrations')
|
||||
end
|
||||
|
||||
step 'the active sub nav should be Deploy Keys' do
|
||||
ensure_active_sub_nav('Deploy Keys')
|
||||
step 'the active sub nav should be Repository' do
|
||||
ensure_active_sub_nav('Repository')
|
||||
end
|
||||
|
||||
step 'the active sub nav should be Pages' do
|
||||
|
|
|
@ -36,7 +36,7 @@ class Spinach::Features::ProjectDeployKeys < Spinach::FeatureSteps
|
|||
end
|
||||
|
||||
step 'I should be on deploy keys page' do
|
||||
expect(current_path).to eq namespace_project_deploy_keys_path(@project.namespace, @project)
|
||||
expect(current_path).to eq namespace_project_settings_repository_path(@project.namespace, @project)
|
||||
end
|
||||
|
||||
step 'I should see newly created deploy key' do
|
||||
|
|
|
@ -0,0 +1,20 @@
|
|||
require 'spec_helper'
|
||||
|
||||
describe Projects::Settings::RepositoryController do
|
||||
let(:project) { create(:project_empty_repo, :public) }
|
||||
let(:user) { create(:user) }
|
||||
|
||||
before do
|
||||
project.add_master(user)
|
||||
sign_in(user)
|
||||
end
|
||||
|
||||
describe 'GET show' do
|
||||
it 'renders show with 200 status code' do
|
||||
get :show, namespace_id: project.namespace, project_id: project
|
||||
|
||||
expect(response).to have_http_status(200)
|
||||
expect(response).to render_template(:show)
|
||||
end
|
||||
end
|
||||
end
|
|
@ -110,6 +110,20 @@ describe "Internal Project Access", feature: true do
|
|||
it { is_expected.to be_denied_for(:external) }
|
||||
end
|
||||
|
||||
describe "GET /:project_path/settings/repository" do
|
||||
subject { namespace_project_settings_repository_path(project.namespace, project) }
|
||||
|
||||
it { is_expected.to be_allowed_for(:admin) }
|
||||
it { is_expected.to be_allowed_for(:owner).of(project) }
|
||||
it { is_expected.to be_allowed_for(:master).of(project) }
|
||||
it { is_expected.to be_denied_for(:developer).of(project) }
|
||||
it { is_expected.to be_denied_for(:reporter).of(project) }
|
||||
it { is_expected.to be_denied_for(:guest).of(project) }
|
||||
it { is_expected.to be_denied_for(:user) }
|
||||
it { is_expected.to be_denied_for(:visitor) }
|
||||
it { is_expected.to be_denied_for(:external) }
|
||||
end
|
||||
|
||||
describe "GET /:project_path/blob" do
|
||||
let(:commit) { project.repository.commit }
|
||||
subject { namespace_project_blob_path(project.namespace, project, File.join(commit.id, '.gitignore')) }
|
||||
|
|
|
@ -110,6 +110,20 @@ describe "Private Project Access", feature: true do
|
|||
it { is_expected.to be_denied_for(:external) }
|
||||
end
|
||||
|
||||
describe "GET /:project_path/settings/repository" do
|
||||
subject { namespace_project_settings_repository_path(project.namespace, project) }
|
||||
|
||||
it { is_expected.to be_allowed_for(:admin) }
|
||||
it { is_expected.to be_allowed_for(:owner).of(project) }
|
||||
it { is_expected.to be_allowed_for(:master).of(project) }
|
||||
it { is_expected.to be_denied_for(:developer).of(project) }
|
||||
it { is_expected.to be_denied_for(:reporter).of(project) }
|
||||
it { is_expected.to be_denied_for(:guest).of(project) }
|
||||
it { is_expected.to be_denied_for(:user) }
|
||||
it { is_expected.to be_denied_for(:external) }
|
||||
it { is_expected.to be_denied_for(:visitor) }
|
||||
end
|
||||
|
||||
describe "GET /:project_path/blob" do
|
||||
let(:commit) { project.repository.commit }
|
||||
subject { namespace_project_blob_path(project.namespace, project, File.join(commit.id, '.gitignore'))}
|
||||
|
|
|
@ -110,6 +110,20 @@ describe "Public Project Access", feature: true do
|
|||
it { is_expected.to be_denied_for(:external) }
|
||||
end
|
||||
|
||||
describe "GET /:project_path/settings/repository" do
|
||||
subject { namespace_project_settings_repository_path(project.namespace, project) }
|
||||
|
||||
it { is_expected.to be_allowed_for(:admin) }
|
||||
it { is_expected.to be_allowed_for(:owner).of(project) }
|
||||
it { is_expected.to be_allowed_for(:master).of(project) }
|
||||
it { is_expected.to be_denied_for(:developer).of(project) }
|
||||
it { is_expected.to be_denied_for(:reporter).of(project) }
|
||||
it { is_expected.to be_denied_for(:guest).of(project) }
|
||||
it { is_expected.to be_denied_for(:user) }
|
||||
it { is_expected.to be_denied_for(:visitor) }
|
||||
it { is_expected.to be_denied_for(:external) }
|
||||
end
|
||||
|
||||
describe "GET /:project_path/pipelines" do
|
||||
subject { namespace_project_pipelines_path(project.namespace, project) }
|
||||
|
||||
|
|
|
@ -0,0 +1,66 @@
|
|||
require 'spec_helper'
|
||||
|
||||
describe Projects::Settings::DeployKeysPresenter do
|
||||
let(:project) { create(:empty_project) }
|
||||
let(:user) { create(:user) }
|
||||
let(:deploy_key) { create(:deploy_key, public: true) }
|
||||
|
||||
let!(:deploy_keys_project) do
|
||||
create(:deploy_keys_project, project: project, deploy_key: deploy_key)
|
||||
end
|
||||
|
||||
subject(:presenter) do
|
||||
described_class.new(project, current_user: user)
|
||||
end
|
||||
|
||||
it 'inherits from Gitlab::View::Presenter::Simple' do
|
||||
expect(described_class.superclass).to eq(Gitlab::View::Presenter::Simple)
|
||||
end
|
||||
|
||||
describe '#enabled_keys' do
|
||||
it 'returns currently enabled keys' do
|
||||
expect(presenter.enabled_keys).to eq [deploy_keys_project.deploy_key]
|
||||
end
|
||||
|
||||
it 'does not contain enabled_keys inside available_keys' do
|
||||
expect(presenter.available_keys).not_to include deploy_key
|
||||
end
|
||||
|
||||
it 'returns the enabled_keys size' do
|
||||
expect(presenter.enabled_keys_size).to eq(1)
|
||||
end
|
||||
|
||||
it 'returns true if there is any enabled_keys' do
|
||||
expect(presenter.any_keys_enabled?).to eq(true)
|
||||
end
|
||||
end
|
||||
|
||||
describe '#available_keys/#available_project_keys' do
|
||||
let(:other_deploy_key) { create(:another_deploy_key) }
|
||||
|
||||
before do
|
||||
project_key = create(:deploy_keys_project, deploy_key: other_deploy_key)
|
||||
project_key.project.add_developer(user)
|
||||
end
|
||||
|
||||
it 'returns the current available_keys' do
|
||||
expect(presenter.available_keys).not_to be_empty
|
||||
end
|
||||
|
||||
it 'returns the current available_project_keys' do
|
||||
expect(presenter.available_project_keys).not_to be_empty
|
||||
end
|
||||
|
||||
it 'returns false if any available_project_keys are enabled' do
|
||||
expect(presenter.any_available_project_keys_enabled?).to eq(true)
|
||||
end
|
||||
|
||||
it 'returns the available_project_keys size' do
|
||||
expect(presenter.available_project_keys_size).to eq(1)
|
||||
end
|
||||
|
||||
it 'shows if there is an available key' do
|
||||
expect(presenter.key_available?(deploy_key)).to eq(false)
|
||||
end
|
||||
end
|
||||
end
|
Loading…
Reference in a new issue