Add Ci/CD menu to new sidebar refactor

This commits move the CI/CD menu from the
HAML view to the new refactor.
parent 23675d9d
......@@ -40,7 +40,8 @@ module SidebarsHelper
container: project,
learn_gitlab_experiment_enabled: learn_gitlab_experiment_enabled?(project),
current_ref: current_ref,
jira_issues_integration: project_jira_issues_integration?
jira_issues_integration: project_jira_issues_integration?,
can_view_pipeline_editor: can_view_pipeline_editor?(project)
}
end
end
- if project_nav_tab? :pipelines
= nav_link(controller: [:pipelines, :builds, :jobs, :pipeline_schedules, :artifacts, :test_cases, :pipeline_editor], unless: -> { current_path?('projects/pipelines#charts') }) do
= link_to project_pipelines_path(@project), class: 'shortcuts-pipelines qa-link-pipelines rspec-link-pipelines', data: { qa_selector: 'ci_cd_link' } do
.nav-icon-container
= sprite_icon('rocket')
%span.nav-item-name#js-onboarding-pipelines-link
= _('CI/CD')
%ul.sidebar-sub-level-items
= nav_link(controller: [:pipelines, :builds, :jobs, :pipeline_schedules, :artifacts, :test_cases, :pipeline_editor], html_options: { class: "fly-out-top-item" }) do
= link_to project_pipelines_path(@project) do
%strong.fly-out-top-item-name
= _('CI/CD')
%li.divider.fly-out-top-item
- if project_nav_tab? :pipelines
= nav_link(path: ['pipelines#index', 'pipelines#show']) do
= link_to project_pipelines_path(@project), title: _('Pipelines'), class: 'shortcuts-pipelines' do
%span
= _('Pipelines')
- if can_view_pipeline_editor?(@project)
= nav_link(controller: :pipeline_editor, action: :show) do
= link_to project_ci_pipeline_editor_path(@project), title: s_('Pipelines|Editor') do
%span
= s_('Pipelines|Editor')
- if project_nav_tab? :builds
= nav_link(controller: :jobs) do
= link_to project_jobs_path(@project), title: _('Jobs'), class: 'shortcuts-builds' do
%span
= _('Jobs')
- if Feature.enabled?(:artifacts_management_page, @project)
= nav_link(controller: :artifacts, action: :index) do
= link_to project_artifacts_path(@project), title: _('Artifacts'), class: 'shortcuts-builds' do
%span
= _('Artifacts')
- if project_nav_tab?(:pipelines)
= nav_link(controller: :pipeline_schedules) do
= link_to pipeline_schedules_path(@project), title: _('Schedules'), class: 'shortcuts-builds' do
%span
= _('Schedules')
= render_if_exists "layouts/nav/test_cases_link", project: @project
- if project_nav_tab? :security_and_compliance
= render_if_exists 'layouts/nav/sidebar/project_security_link' # EE-specific
......
- return unless project.feature_available?(:quality_management)
- return unless can?(current_user, :read_issue, project)
- if project_nav_tab?(:pipelines)
= nav_link(controller: :test_cases) do
= link_to project_quality_test_cases_path(project), title: _('Test Cases'), class: 'shortcuts-test-cases' do
%span
= _('Test Cases')
# frozen_string_literal: true
module EE
module Sidebars
module Projects
module Menus
module CiCdMenu
extend ::Gitlab::Utils::Override
override :configure_menu_items
def configure_menu_items
return false unless super
add_item(test_cases_menu_item)
true
end
private
def test_cases_menu_item
return unless context.project.licensed_feature_available?(:quality_management)
return unless can?(context.current_user, :read_issue, context.project)
::Sidebars::MenuItem.new(
title: _('Test Cases'),
link: project_quality_test_cases_path(context.project),
container_html_options: { class: 'shortcuts-test-cases' },
active_routes: { controller: :test_cases },
item_id: :test_cases
)
end
end
end
end
end
end
# frozen_string_literal: true
require 'spec_helper'
RSpec.describe Sidebars::Projects::Menus::CiCdMenu do
let(:project) { build(:project) }
let(:user) { project.owner }
let(:context) { Sidebars::Projects::Context.new(current_user: user, container: project, can_view_pipeline_editor: true) }
describe 'Test Cases' do
subject { described_class.new(context).items.index { |e| e.item_id == :test_cases} }
context 'when licensed feature quality_management is not enabled' do
before do
stub_licensed_features(quality_management: false)
end
it 'does not include test cases menu item' do
is_expected.to be_nil
end
end
context 'when licensed feature quality_management is enabled' do
before do
stub_licensed_features(quality_management: true)
end
context 'when user can read issues' do
it 'includes test cases menu item' do
is_expected.to be_present
end
end
context 'when user cannot read issues' do
let(:user) { nil }
it 'does not include test cases menu item' do
is_expected.to be_nil
end
end
end
end
end
......@@ -122,6 +122,33 @@ RSpec.describe 'layouts/nav/sidebar/_project' do
end
end
describe 'CI/CD' do
describe 'Test Cases' do
let(:license_feature_status) { true }
before do
stub_licensed_features(quality_management: license_feature_status)
allow(view).to receive(:current_user).and_return(user)
end
it 'has a link to the test cases page' do
render
expect(rendered).to have_link('Test Cases', href: project_quality_test_cases_path(project))
end
context 'when license feature :quality_management is not enabled' do
let(:license_feature_status) { false }
it 'does not have a link to the test cases page' do
render
expect(rendered).not_to have_link('Test Cases', href: project_quality_test_cases_path(project))
end
end
end
end
describe 'Operations main link' do
let(:user) { create(:user) }
......
# frozen_string_literal: true
module Sidebars
module Projects
module Menus
class CiCdMenu < ::Sidebars::Menu
override :configure_menu_items
def configure_menu_items
return unless can?(context.current_user, :read_build, context.project)
add_item(pipelines_menu_item)
add_item(pipelines_editor_menu_item)
add_item(jobs_menu_item)
add_item(artifacts_menu_item)
add_item(pipeline_schedules_menu_item)
end
override :link
def link
project_pipelines_path(context.project)
end
override :extra_container_html_options
def extra_container_html_options
{
class: 'shortcuts-pipelines rspec-link-pipelines'
}
end
override :title
def title
_('CI/CD')
end
override :title_html_options
def title_html_options
{
id: 'js-onboarding-pipelines-link'
}
end
override :sprite_icon
def sprite_icon
'rocket'
end
private
def pipelines_menu_item
::Sidebars::MenuItem.new(
title: _('Pipelines'),
link: project_pipelines_path(context.project),
container_html_options: { class: 'shortcuts-pipelines' },
active_routes: { path: pipelines_routes },
item_id: :pipelines
)
end
def pipelines_routes
%w[
pipelines#index
pipelines#show
pipelines#new
]
end
def pipelines_editor_menu_item
return unless context.can_view_pipeline_editor
::Sidebars::MenuItem.new(
title: s_('Pipelines|Editor'),
link: project_ci_pipeline_editor_path(context.project),
active_routes: { path: 'projects/ci/pipeline_editor#show' },
item_id: :pipelines_editor
)
end
def jobs_menu_item
::Sidebars::MenuItem.new(
title: _('Jobs'),
link: project_jobs_path(context.project),
container_html_options: { class: 'shortcuts-builds' },
active_routes: { controller: :jobs },
item_id: :jobs
)
end
def artifacts_menu_item
return unless Feature.enabled?(:artifacts_management_page, context.project)
::Sidebars::MenuItem.new(
title: _('Artifacts'),
link: project_artifacts_path(context.project),
container_html_options: { class: 'shortcuts-builds' },
active_routes: { path: 'artifacts#index' },
item_id: :artifacts
)
end
def pipeline_schedules_menu_item
::Sidebars::MenuItem.new(
title: _('Schedules'),
link: pipeline_schedules_path(context.project),
container_html_options: { class: 'shortcuts-builds' },
active_routes: { controller: :pipeline_schedules },
item_id: :pipeline_schedules
)
end
end
end
end
end
Sidebars::Projects::Menus::CiCdMenu.prepend_if_ee('EE::Sidebars::Projects::Menus::CiCdMenu')
......@@ -14,6 +14,7 @@ module Sidebars
add_menu(Sidebars::Projects::Menus::ExternalIssueTrackerMenu.new(context))
add_menu(Sidebars::Projects::Menus::LabelsMenu.new(context))
add_menu(Sidebars::Projects::Menus::MergeRequestsMenu.new(context))
add_menu(Sidebars::Projects::Menus::CiCdMenu.new(context))
end
override :render_raw_menus_partial
......
......@@ -12,16 +12,12 @@ module QA
base.class_eval do
include QA::Page::Project::SubMenus::Common
view 'app/views/layouts/nav/sidebar/_project_menus.html.haml' do
element :link_pipelines
end
end
end
def click_ci_cd_pipelines
within_sidebar do
click_element :link_pipelines
click_element(:sidebar_menu_link, menu_item: 'CI/CD')
end
end
end
......
# frozen_string_literal: true
require 'spec_helper'
RSpec.describe Sidebars::Projects::Menus::CiCdMenu do
let(:project) { build(:project) }
let(:user) { project.owner }
let(:can_view_pipeline_editor) { true }
let(:context) { Sidebars::Projects::Context.new(current_user: user, container: project, current_ref: 'master', can_view_pipeline_editor: can_view_pipeline_editor) }
subject { described_class.new(context) }
describe '#render?' do
context 'when user cannot read builds' do
let(:user) { nil }
it 'returns false' do
expect(subject.render?).to eq false
end
end
context 'when user can read builds' do
it 'returns true' do
expect(subject.render?).to eq true
end
end
end
describe 'Pipelines Editor' do
subject { described_class.new(context).items.index { |e| e.item_id == :pipelines_editor } }
context 'when user cannot view pipeline editor' do
let(:can_view_pipeline_editor) { false }
it 'does not include pipeline editor menu item' do
is_expected.to be_nil
end
end
context 'when user can view pipeline editor' do
it 'includes pipeline editor menu item' do
is_expected.not_to be_nil
end
end
end
describe 'Artifacts' do
subject { described_class.new(context).items.index { |e| e.item_id == :artifacts } }
context 'when feature flag :artifacts_management_page is disabled' do
it 'does not include artifacts menu item' do
stub_feature_flags(artifacts_management_page: false)
is_expected.to be_nil
end
end
context 'when feature flag :artifacts_management_page is enabled' do
it 'includes artifacts menu item' do
stub_feature_flags(artifacts_management_page: true)
is_expected.not_to be_nil
end
end
end
end
......@@ -257,6 +257,64 @@ RSpec.describe 'layouts/nav/sidebar/_project' do
end
end
describe 'CI/CD' do
it 'has a link to pipelines page' do
render
expect(rendered).to have_link('CI/CD', href: project_pipelines_path(project))
end
describe 'Artifacts' do
it 'has a link to the artifacts page' do
render
expect(rendered).to have_link('Artifacts', href: project_artifacts_path(project))
end
end
describe 'Jobs' do
it 'has a link to the jobs page' do
render
expect(rendered).to have_link('Jobs', href: project_jobs_path(project))
end
end
describe 'Pipeline Schedules' do
it 'has a link to the pipeline schedules page' do
render
expect(rendered).to have_link('Schedules', href: pipeline_schedules_path(project))
end
end
describe 'Pipelines' do
it 'has a link to the pipelines page' do
render
expect(rendered).to have_link('Pipelines', href: project_pipelines_path(project))
end
end
describe 'Pipeline Editor' do
it 'has a link to the pipeline editor' do
render
expect(rendered).to have_link('Editor', href: project_ci_pipeline_editor_path(project))
end
context 'when user cannot access pipeline editor' do
it 'does not has a link to the pipeline editor' do
allow(view).to receive(:can_view_pipeline_editor?).and_return(false)
render
expect(rendered).not_to have_link('Editor', href: project_ci_pipeline_editor_path(project))
end
end
end
end
describe 'packages tab' do
before do
stub_container_registry_config(enabled: true)
......@@ -419,48 +477,6 @@ RSpec.describe 'layouts/nav/sidebar/_project' do
end
end
describe 'ci/cd settings tab' do
before do
project.update!(archived: project_archived)
end
context 'when project is archived' do
let(:project_archived) { true }
it 'does not show the ci/cd settings tab' do
render
expect(rendered).not_to have_link('CI/CD', href: project_settings_ci_cd_path(project))
end
end
context 'when project is active' do
let(:project_archived) { false }
it 'shows the ci/cd settings tab' do
render
expect(rendered).to have_link('CI/CD', href: project_settings_ci_cd_path(project))
end
end
end
describe 'pipeline editor link' do
it 'shows the pipeline editor link' do
render
expect(rendered).to have_link('Editor', href: project_ci_pipeline_editor_path(project))
end
it 'does not show the pipeline editor link' do
allow(view).to receive(:can_view_pipeline_editor?).and_return(false)
render
expect(rendered).not_to have_link('Editor', href: project_ci_pipeline_editor_path(project))
end
end
describe 'operations settings tab' do
describe 'archive projects' do
before do
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment