summaryrefslogtreecommitdiff
path: root/spec/views
diff options
context:
space:
mode:
Diffstat (limited to 'spec/views')
-rw-r--r--spec/views/admin/application_settings/repository.html.haml_spec.rb32
-rw-r--r--spec/views/devise/shared/_signup_box.html.haml_spec.rb71
-rw-r--r--spec/views/groups/show.html.haml_spec.rb118
-rw-r--r--spec/views/help/index.html.haml_spec.rb9
-rw-r--r--spec/views/layouts/header/_new_dropdown.haml_spec.rb1
-rw-r--r--spec/views/layouts/nav/sidebar/_group.html.haml_spec.rb68
-rw-r--r--spec/views/layouts/nav/sidebar/_project.html.haml_spec.rb1169
-rw-r--r--spec/views/layouts/nav/sidebar/_project_security_link.html.haml_spec.rb29
-rw-r--r--spec/views/notify/change_in_merge_request_draft_status_email.html.haml_spec.rb3
-rw-r--r--spec/views/profiles/keys/_form.html.haml_spec.rb2
-rw-r--r--spec/views/projects/pipelines/new.html.haml_spec.rb34
-rw-r--r--spec/views/projects/pipelines/show.html.haml_spec.rb2
-rw-r--r--spec/views/projects/settings/operations/show.html.haml_spec.rb2
-rw-r--r--spec/views/projects/tags/index.html.haml_spec.rb6
-rw-r--r--spec/views/registrations/welcome/show.html.haml_spec.rb2
-rw-r--r--spec/views/shared/nav/_sidebar.html.haml_spec.rb4
-rw-r--r--spec/views/shared/runners/_runner_details.html.haml_spec.rb (renamed from spec/views/shared/runners/show.html.haml_spec.rb)8
17 files changed, 1305 insertions, 255 deletions
diff --git a/spec/views/admin/application_settings/repository.html.haml_spec.rb b/spec/views/admin/application_settings/repository.html.haml_spec.rb
index b110bc277ac..47cadd29e33 100644
--- a/spec/views/admin/application_settings/repository.html.haml_spec.rb
+++ b/spec/views/admin/application_settings/repository.html.haml_spec.rb
@@ -12,35 +12,17 @@ RSpec.describe 'admin/application_settings/repository.html.haml' do
end
describe 'default initial branch name' do
- context 'when the feature flag is disabled' do
- before do
- stub_feature_flags(global_default_branch_name: false)
- end
+ it 'has the setting section' do
+ render
- it 'does not show the setting section' do
- render
-
- expect(rendered).not_to have_css("#js-default-branch-name")
- end
+ expect(rendered).to have_css("#js-default-branch-name")
end
- context 'when the feature flag is enabled' do
- before do
- stub_feature_flags(global_default_branch_name: true)
- end
-
- it 'has the setting section' do
- render
-
- expect(rendered).to have_css("#js-default-branch-name")
- end
-
- it 'renders the correct setting section content' do
- render
+ it 'renders the correct setting section content' do
+ render
- expect(rendered).to have_content("Default initial branch name")
- expect(rendered).to have_content("Set the default name of the initial branch when creating new repositories through the user interface.")
- end
+ expect(rendered).to have_content("Default initial branch name")
+ expect(rendered).to have_content("Set the default name of the initial branch when creating new repositories through the user interface.")
end
end
end
diff --git a/spec/views/devise/shared/_signup_box.html.haml_spec.rb b/spec/views/devise/shared/_signup_box.html.haml_spec.rb
new file mode 100644
index 00000000000..b73e32fa765
--- /dev/null
+++ b/spec/views/devise/shared/_signup_box.html.haml_spec.rb
@@ -0,0 +1,71 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'devise/shared/_signup_box' do
+ before do
+ stub_devise
+ allow(view).to receive(:show_omniauth_providers).and_return(false)
+ allow(view).to receive(:url).and_return('_url_')
+ allow(view).to receive(:terms_path).and_return('_terms_path_')
+ allow(view).to receive(:button_text).and_return('_button_text_')
+ allow(view).to receive(:suggestion_path).and_return('_suggestion_path_')
+ stub_template 'devise/shared/_error_messages.html.haml' => ''
+ end
+
+ context 'when terms are enforced' do
+ before do
+ allow(Gitlab::CurrentSettings.current_application_settings).to receive(:enforce_terms?).and_return(true)
+ end
+
+ it 'shows expected text with placeholders' do
+ render
+
+ expect(rendered).to have_content('By clicking _button_text_')
+ expect(rendered).to have_link('Terms of Use and Privacy Policy')
+ end
+
+ context 'when on .com' do
+ before do
+ allow(Gitlab).to receive(:dev_env_or_com?).and_return(true)
+ end
+
+ it 'shows expected GitLab text' do
+ render
+
+ expect(rendered).to have_content('I have read and accepted the GitLab Terms')
+ end
+ end
+
+ context 'when not on .com' do
+ before do
+ allow(Gitlab).to receive(:dev_env_or_com?).and_return(false)
+ end
+
+ it 'shows expected text without GitLab' do
+ render
+
+ expect(rendered).to have_content('I have read and accepted the Terms')
+ end
+ end
+ end
+
+ context 'when terms are not enforced' do
+ before do
+ allow(Gitlab::CurrentSettings.current_application_settings).to receive(:enforce_terms?).and_return(false)
+ allow(Gitlab).to receive(:dev_env_or_com?).and_return(true)
+ end
+
+ it 'shows expected text with placeholders' do
+ render
+
+ expect(rendered).not_to have_content('By clicking')
+ end
+ end
+
+ def stub_devise
+ allow(view).to receive(:devise_mapping).and_return(Devise.mappings[:user])
+ allow(view).to receive(:resource).and_return(spy)
+ allow(view).to receive(:resource_name).and_return(:user)
+ end
+end
diff --git a/spec/views/groups/show.html.haml_spec.rb b/spec/views/groups/show.html.haml_spec.rb
new file mode 100644
index 00000000000..f40b03fda2a
--- /dev/null
+++ b/spec/views/groups/show.html.haml_spec.rb
@@ -0,0 +1,118 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'groups/edit.html.haml' do
+ include Devise::Test::ControllerHelpers
+
+ describe '"Share with group lock" setting' do
+ let(:root_owner) { create(:user) }
+ let(:root_group) { create(:group) }
+
+ before do
+ root_group.add_owner(root_owner)
+ end
+
+ shared_examples_for '"Share with group lock" setting' do |checkbox_options|
+ it 'has the correct label, help text, and checkbox options' do
+ assign(:group, test_group)
+ allow(view).to receive(:can?).with(test_user, :admin_group, test_group).and_return(true)
+ allow(view).to receive(:can_change_group_visibility_level?).and_return(false)
+ allow(view).to receive(:current_user).and_return(test_user)
+ expect(view).to receive(:can_change_share_with_group_lock?).and_return(!checkbox_options[:disabled])
+ expect(view).to receive(:share_with_group_lock_help_text).and_return('help text here')
+
+ render
+
+ expect(rendered).to have_content("Prevent sharing a project within #{test_group.name} with other groups")
+ expect(rendered).to have_css('.js-descr', text: 'help text here')
+ expect(rendered).to have_field('group_share_with_group_lock', **checkbox_options)
+ end
+ end
+
+ context 'for a root group' do
+ let(:test_group) { root_group }
+ let(:test_user) { root_owner }
+
+ it_behaves_like '"Share with group lock" setting', { disabled: false, checked: false }
+ end
+
+ context 'for a subgroup' do
+ let!(:subgroup) { create(:group, parent: root_group) }
+ let(:sub_owner) { create(:user) }
+ let(:test_group) { subgroup }
+
+ context 'when the root_group has "Share with group lock" disabled' do
+ context 'when the subgroup has "Share with group lock" disabled' do
+ context 'as the root_owner' do
+ let(:test_user) { root_owner }
+
+ it_behaves_like '"Share with group lock" setting', { disabled: false, checked: false }
+ end
+
+ context 'as the sub_owner' do
+ let(:test_user) { sub_owner }
+
+ it_behaves_like '"Share with group lock" setting', { disabled: false, checked: false }
+ end
+ end
+
+ context 'when the subgroup has "Share with group lock" enabled' do
+ before do
+ subgroup.update_column(:share_with_group_lock, true)
+ end
+
+ context 'as the root_owner' do
+ let(:test_user) { root_owner }
+
+ it_behaves_like '"Share with group lock" setting', { disabled: false, checked: true }
+ end
+
+ context 'as the sub_owner' do
+ let(:test_user) { sub_owner }
+
+ it_behaves_like '"Share with group lock" setting', { disabled: false, checked: true }
+ end
+ end
+ end
+
+ context 'when the root_group has "Share with group lock" enabled' do
+ before do
+ root_group.update_column(:share_with_group_lock, true)
+ end
+
+ context 'when the subgroup has "Share with group lock" disabled (parent overridden)' do
+ context 'as the root_owner' do
+ let(:test_user) { root_owner }
+
+ it_behaves_like '"Share with group lock" setting', { disabled: false, checked: false }
+ end
+
+ context 'as the sub_owner' do
+ let(:test_user) { sub_owner }
+
+ it_behaves_like '"Share with group lock" setting', { disabled: false, checked: false }
+ end
+ end
+
+ context 'when the subgroup has "Share with group lock" enabled (same as parent)' do
+ before do
+ subgroup.update_column(:share_with_group_lock, true)
+ end
+
+ context 'as the root_owner' do
+ let(:test_user) { root_owner }
+
+ it_behaves_like '"Share with group lock" setting', { disabled: false, checked: true }
+ end
+
+ context 'as the sub_owner' do
+ let(:test_user) { sub_owner }
+
+ it_behaves_like '"Share with group lock" setting', { disabled: true, checked: true }
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/spec/views/help/index.html.haml_spec.rb b/spec/views/help/index.html.haml_spec.rb
index c59790a346e..600e431b7ef 100644
--- a/spec/views/help/index.html.haml_spec.rb
+++ b/spec/views/help/index.html.haml_spec.rb
@@ -21,6 +21,11 @@ RSpec.describe 'help/index' do
end
context 'when logged in' do
+ def version_link_regexp(path)
+ base_url = "#{view.source_host_url}/#{view.source_code_group}"
+ %r{#{Regexp.escape(base_url)}/(gitlab|gitlab\-foss)/#{Regexp.escape(path)}}
+ end
+
before do
stub_user
end
@@ -31,7 +36,7 @@ RSpec.describe 'help/index' do
render
expect(rendered).to match '8.0.2'
- expect(rendered).to have_link('8.0.2', href: %r{https://gitlab.com/gitlab-org/(gitlab|gitlab-foss)/-/tags/v8.0.2})
+ expect(rendered).to have_link('8.0.2', href: version_link_regexp('-/tags/v8.0.2'))
end
it 'shows a link to the commit for pre-releases' do
@@ -40,7 +45,7 @@ RSpec.describe 'help/index' do
render
expect(rendered).to match '8.0.2'
- expect(rendered).to have_link('abcdefg', href: %r{https://gitlab.com/gitlab-org/(gitlab|gitlab-foss)/-/commits/abcdefg})
+ expect(rendered).to have_link('abcdefg', href: version_link_regexp('-/commits/abcdefg'))
end
end
end
diff --git a/spec/views/layouts/header/_new_dropdown.haml_spec.rb b/spec/views/layouts/header/_new_dropdown.haml_spec.rb
index cec095f93ad..bf81ab577f7 100644
--- a/spec/views/layouts/header/_new_dropdown.haml_spec.rb
+++ b/spec/views/layouts/header/_new_dropdown.haml_spec.rb
@@ -52,6 +52,7 @@ RSpec.describe 'layouts/header/_new_dropdown' do
end
it 'has a "New project" link' do
+ render('layouts/header/new_repo_experiment')
render
expect(rendered).to have_link('New project', href: new_project_path(namespace_id: group.id))
diff --git a/spec/views/layouts/nav/sidebar/_group.html.haml_spec.rb b/spec/views/layouts/nav/sidebar/_group.html.haml_spec.rb
index 640f463b45d..d96052d4c03 100644
--- a/spec/views/layouts/nav/sidebar/_group.html.haml_spec.rb
+++ b/spec/views/layouts/nav/sidebar/_group.html.haml_spec.rb
@@ -3,7 +3,7 @@
require 'spec_helper'
RSpec.describe 'layouts/nav/sidebar/_group' do
- let(:group) { create(:group) }
+ let_it_be(:group) { create(:group) }
before do
assign(:group, group)
@@ -11,4 +11,70 @@ RSpec.describe 'layouts/nav/sidebar/_group' do
it_behaves_like 'has nav sidebar'
it_behaves_like 'sidebar includes snowplow attributes', 'render', 'groups_side_navigation', 'groups_side_navigation'
+
+ describe 'Group information' do
+ it 'has a link to the group path' do
+ render
+
+ expect(rendered).to have_link('Group information', href: group_path(group))
+ end
+
+ it 'does not have a link to the details menu item' do
+ render
+
+ expect(rendered).not_to have_link('Details', href: details_group_path(group))
+ end
+
+ it 'has a link to the members page' do
+ render
+
+ expect(rendered).to have_selector('.sidebar-top-level-items > li.home a[title="Members"]')
+ expect(rendered).to have_link('Members', href: group_group_members_path(group))
+ end
+
+ context 'when feature flag :sidebar_refactor is disabled' do
+ before do
+ stub_feature_flags(sidebar_refactor: false)
+ end
+
+ it 'has a link to the group path with the "Group overview" title' do
+ render
+
+ expect(rendered).to have_link('Group overview', href: group_path(group))
+ end
+
+ it 'has a link to the details menu item' do
+ render
+
+ expect(rendered).to have_link('Details', href: details_group_path(group))
+ end
+
+ it 'does not have a link to the members page' do
+ render
+
+ expect(rendered).not_to have_selector('.sidebar-top-level-items > li.home a[title="Members"]')
+ end
+ end
+ end
+
+ describe 'Members' do
+ it 'does not have a Members menu' do
+ render
+
+ expect(rendered).not_to have_selector('.nav-item-name', text: 'Members')
+ end
+
+ context 'when feature flag :sidebar_refactor is disabled' do
+ before do
+ stub_feature_flags(sidebar_refactor: false)
+ end
+
+ it 'has a Member menu' do
+ render
+
+ expect(rendered).to have_selector('.nav-item-name', text: 'Members')
+ expect(rendered).to have_link('Members', href: group_group_members_path(group))
+ end
+ end
+ end
end
diff --git a/spec/views/layouts/nav/sidebar/_project.html.haml_spec.rb b/spec/views/layouts/nav/sidebar/_project.html.haml_spec.rb
index bc5b3b7bfc6..7cb49f635af 100644
--- a/spec/views/layouts/nav/sidebar/_project.html.haml_spec.rb
+++ b/spec/views/layouts/nav/sidebar/_project.html.haml_spec.rb
@@ -19,20 +19,41 @@ RSpec.describe 'layouts/nav/sidebar/_project' do
it_behaves_like 'has nav sidebar'
- describe 'Project Overview' do
+ describe 'Project information' do
it 'has a link to the project path' do
render
- expect(rendered).to have_link('Project overview', href: project_path(project), class: %w(shortcuts-project rspec-project-link))
- expect(rendered).to have_selector('[aria-label="Project overview"]')
+ expect(rendered).to have_link('Project information', href: project_path(project), class: %w(shortcuts-project rspec-project-link))
+ expect(rendered).to have_selector('[aria-label="Project information"]')
+ end
+
+ context 'when feature flag :sidebar_refactor is disabled' do
+ it 'has a link to the project path' do
+ stub_feature_flags(sidebar_refactor: false)
+
+ render
+
+ expect(rendered).to have_link('Project overview', href: project_path(project), class: %w(shortcuts-project rspec-project-link))
+ expect(rendered).to have_selector('[aria-label="Project overview"]')
+ end
end
describe 'Details' do
- it 'has a link to the projects path' do
+ it 'does not have a link to the details menu' do
render
- expect(rendered).to have_link('Details', href: project_path(project), class: 'shortcuts-project')
- expect(rendered).to have_selector('[aria-label="Project details"]')
+ expect(rendered).not_to have_link('Details', href: project_path(project))
+ end
+
+ context 'when feature flag :sidebar_refactor is disabled' do
+ it 'has a link to the projects path' do
+ stub_feature_flags(sidebar_refactor: false)
+
+ render
+
+ expect(rendered).to have_link('Details', href: project_path(project), class: 'shortcuts-project')
+ expect(rendered).to have_selector('[aria-label="Project details"]')
+ end
end
end
@@ -45,10 +66,62 @@ RSpec.describe 'layouts/nav/sidebar/_project' do
end
describe 'Releases' do
- it 'has a link to the project releases path' do
+ it 'does not have a link to the project releases path' do
+ render
+
+ expect(rendered).not_to have_link('Releases', href: project_releases_path(project), class: 'shortcuts-project-releases')
+ end
+
+ context 'when feature flag :sidebar refactor is disabled' do
+ it 'has a link to the project releases path' do
+ stub_feature_flags(sidebar_refactor: false)
+
+ render
+
+ expect(rendered).to have_link('Releases', href: project_releases_path(project), class: 'shortcuts-project-releases')
+ end
+ end
+ end
+
+ describe 'Labels' do
+ let(:page) { Nokogiri::HTML.parse(rendered) }
+
+ it 'has a link to the labels path' do
render
- expect(rendered).to have_link('Releases', href: project_releases_path(project), class: 'shortcuts-project-releases')
+ expect(page.at_css('.shortcuts-project').parent.css('[aria-label="Labels"]')).not_to be_empty
+ expect(rendered).to have_link('Labels', href: project_labels_path(project))
+ end
+
+ context 'when feature flag :sidebar_refactor is disabled' do
+ it 'does not have the labels menu item' do
+ stub_feature_flags(sidebar_refactor: false)
+
+ render
+
+ expect(page.at_css('.shortcuts-project').parent.css('[aria-label="Labels"]')).to be_empty
+ end
+ end
+ end
+
+ describe 'Members' do
+ let(:page) { Nokogiri::HTML.parse(rendered) }
+
+ it 'has a link to the members page' do
+ render
+
+ expect(page.at_css('.shortcuts-project').parent.css('[aria-label="Members"]')).not_to be_empty
+ expect(rendered).to have_link('Members', href: project_project_members_path(project))
+ end
+
+ context 'when feature flag :sidebar_refactor is disabled' do
+ it 'does not have a link to the members page' do
+ stub_feature_flags(sidebar_refactor: false)
+
+ render
+
+ expect(page.at_css('.shortcuts-project').parent.css('[aria-label="Members"]')).to be_empty
+ end
end
end
end
@@ -56,6 +129,9 @@ RSpec.describe 'layouts/nav/sidebar/_project' do
describe 'Learn GitLab' do
it 'has a link to the learn GitLab experiment' do
allow(view).to receive(:learn_gitlab_experiment_enabled?).and_return(true)
+ allow_next_instance_of(LearnGitlab::Onboarding) do |onboarding|
+ expect(onboarding).to receive(:completed_percentage).and_return(20)
+ end
render
@@ -127,145 +203,797 @@ RSpec.describe 'layouts/nav/sidebar/_project' do
end
end
- describe 'issue boards' do
- it 'has board tab' do
+ describe 'Issues' do
+ it 'has a link to the issue list path' do
+ render
+
+ expect(rendered).to have_link('Issues', href: project_issues_path(project))
+ end
+
+ it 'shows pill with the number of open issues' do
render
- expect(rendered).to have_css('a[title="Boards"]')
+ expect(rendered).to have_css('span.badge.badge-pill.issue_counter')
+ end
+
+ describe 'Issue List' do
+ it 'has a link to the issue list path' do
+ render
+
+ expect(rendered).to have_link('List', href: project_issues_path(project))
+ end
+ end
+
+ describe 'Issue Boards' do
+ it 'has a link to the issue boards path' do
+ render
+
+ expect(rendered).to have_link('Boards', href: project_boards_path(project))
+ end
+ end
+
+ describe 'Labels' do
+ let(:page) { Nokogiri::HTML.parse(rendered) }
+
+ it 'does not have a link to the labels page' do
+ render
+
+ expect(page.at_css('.shortcuts-issues').parent.css('[aria-label="Labels"]')).to be_empty
+ end
+
+ context 'when feature flag :sidebar_refactor is disabled' do
+ it 'has a link to the labels page' do
+ stub_feature_flags(sidebar_refactor: false)
+
+ render
+
+ expect(page.at_css('.shortcuts-issues').parent.css('[aria-label="Labels"]')).not_to be_empty
+ expect(rendered).to have_link('Labels', href: project_labels_path(project))
+ end
+ end
+ end
+
+ describe 'Service Desk' do
+ it 'has a link to the service desk path' do
+ render
+
+ expect(rendered).to have_link('Service Desk', href: service_desk_project_issues_path(project))
+ end
+ end
+
+ describe 'Milestones' do
+ it 'has a link to the milestones path' do
+ render
+
+ expect(rendered).to have_link('Milestones', href: project_milestones_path(project))
+ end
end
end
- describe 'packages tab' do
- before do
- stub_container_registry_config(enabled: true)
+ describe 'External Issue Tracker' do
+ let_it_be_with_refind(:project) { create(:project, has_external_issue_tracker: true) }
+
+ context 'with custom external issue tracker' do
+ let(:external_issue_tracker_url) { 'http://test.com' }
+
+ let!(:external_issue_tracker) do
+ create(:custom_issue_tracker_service, active: external_issue_tracker_active, project: project, project_url: external_issue_tracker_url)
+ end
+
+ context 'when external issue tracker is configured and active' do
+ let(:external_issue_tracker_active) { true }
+
+ it 'has a link to the external issue tracker' do
+ render
+
+ expect(rendered).to have_link(external_issue_tracker.title, href: external_issue_tracker_url)
+ end
+ end
+
+ context 'when external issue tracker is not configured and active' do
+ let(:external_issue_tracker_active) { false }
+
+ it 'does not have a link to the external issue tracker' do
+ render
+
+ expect(rendered).not_to have_link(external_issue_tracker.title)
+ end
+ end
+ end
+
+ context 'with Jira issue tracker' do
+ let_it_be(:jira) { create(:jira_service, project: project, issues_enabled: false) }
+
+ it 'has a link to the Jira issue tracker' do
+ render
- allow(controller).to receive(:controller_name)
- .and_return('repositories')
- allow(controller).to receive(:controller_path)
- .and_return('projects/registry/repositories')
+ expect(rendered).to have_link('Jira', href: project.external_issue_tracker.issue_tracker_path)
+ end
end
+ end
+
+ describe 'Labels' do
+ it 'does not show the labels menu' do
+ project.project_feature.update!(issues_access_level: ProjectFeature::DISABLED)
- it 'highlights sidebar item and flyout' do
render
- expect(rendered).to have_css('.sidebar-top-level-items > li.active', count: 1)
- expect(rendered).to have_css('.sidebar-sub-level-items > li.fly-out-top-item.active', count: 1)
+ expect(rendered).not_to have_link('Labels', href: project_labels_path(project), class: 'shortcuts-labels')
end
- it 'highlights container registry tab' do
+ context 'when feature flag :sidebar_refactor is disabled' do
+ before do
+ stub_feature_flags(sidebar_refactor: false)
+ end
+
+ context 'when issues are not enabled' do
+ it 'has a link to the labels path' do
+ project.project_feature.update!(issues_access_level: ProjectFeature::DISABLED)
+
+ render
+
+ expect(rendered).to have_link('Labels', href: project_labels_path(project), class: 'shortcuts-labels')
+ end
+ end
+
+ context 'when issues are enabled' do
+ it 'does not have a link to the labels path' do
+ render
+
+ expect(rendered).not_to have_link('Labels', href: project_labels_path(project), class: 'shortcuts-labels')
+ end
+ end
+ end
+ end
+
+ describe 'Merge Requests' do
+ it 'has a link to the merge request list path' do
+ render
+
+ expect(rendered).to have_link('Merge requests', href: project_merge_requests_path(project), class: 'shortcuts-merge_requests')
+ end
+
+ it 'shows pill with the number of merge requests' do
render
- expect(rendered).to have_css('.sidebar-sub-level-items > li:not(.fly-out-top-item).active', text: 'Container Registry')
+ expect(rendered).to have_css('span.badge.badge-pill.merge_counter.js-merge-counter')
end
end
- describe 'Packages' do
- let_it_be(:user) { create(:user) }
+ describe 'CI/CD' do
+ it 'has a link to pipelines page' do
+ render
- let_it_be(:package_menu_name) { 'Packages & Registries' }
- let_it_be(:package_entry_name) { 'Package Registry' }
+ expect(rendered).to have_link('CI/CD', href: project_pipelines_path(project))
+ end
- before do
- project.team.add_developer(user)
- sign_in(user)
- stub_container_registry_config(enabled: true)
+ 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
- context 'when packages is enabled' do
- it 'packages link is visible' do
+ describe 'Jobs' do
+ it 'has a link to the jobs page' do
render
- expect(rendered).to have_link(package_menu_name, href: project_packages_path(project))
+ expect(rendered).to have_link('Jobs', href: project_jobs_path(project))
end
+ end
- it 'packages list link is visible' do
+ describe 'Pipeline Schedules' do
+ it 'has a link to the pipeline schedules page' do
render
- expect(rendered).to have_link(package_entry_name, href: project_packages_path(project))
+ expect(rendered).to have_link('Schedules', href: pipeline_schedules_path(project))
end
+ end
- it 'container registry link is visible' do
+ describe 'Pipelines' do
+ it 'has a link to the pipelines page' do
render
- expect(rendered).to have_link('Container Registry', href: project_container_registry_index_path(project))
+ 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 'Security and Compliance' do
+ describe 'when user does not have permissions' do
+ before do
+ allow(view).to receive(:current_user).and_return(nil)
+ end
+
+ it 'top level navigation link is not visible' do
+ render
+
+ expect(rendered).not_to have_link('Security & Compliance')
end
end
- context 'when container registry is disabled' do
+ context 'when user has permissions' do
before do
- stub_container_registry_config(enabled: false)
+ allow(view).to receive(:current_user).and_return(user)
+
+ render
+ end
+
+ it 'top level navigation link is visible' do
+ expect(rendered).to have_link('Security & Compliance')
+ end
+
+ it 'security configuration link is visible' do
+ expect(rendered).to have_link('Configuration', href: project_security_configuration_path(project))
end
+ end
+ end
- it 'packages top level and list link are visible' do
+ describe 'Deployments' do
+ let(:page) { Nokogiri::HTML.parse(rendered) }
+
+ describe 'Feature Flags' do
+ it 'has a link to the feature flags page' do
render
- expect(rendered).to have_link(package_menu_name, href: project_packages_path(project))
- expect(rendered).to have_link(package_entry_name, href: project_packages_path(project))
+ expect(page.at_css('.shortcuts-deployments').parent.css('[aria-label="Feature Flags"]')).not_to be_empty
+ expect(rendered).to have_link('Feature Flags', href: project_feature_flags_path(project))
+ end
+
+ describe 'when the user does not have access' do
+ let(:user) { nil }
+
+ it 'does not have a link to the feature flags page' do
+ render
+
+ expect(rendered).not_to have_link('Feature Flags')
+ end
+ end
+
+ context 'when feature flag :sidebar_refactor is disabled' do
+ it 'does not have a Feature Flags menu item' do
+ stub_feature_flags(sidebar_refactor: false)
+
+ render
+
+ expect(rendered).not_to have_selector('.shortcuts-deployments')
+ end
end
+ end
- it 'container registry link is not visible' do
+ describe 'Environments' do
+ it 'has a link to the environments page' do
render
- expect(rendered).not_to have_link('Container Registry', href: project_container_registry_index_path(project))
+ expect(page.at_css('.shortcuts-deployments').parent.css('[aria-label="Environments"]')).not_to be_empty
+ expect(rendered).to have_link('Environments', href: project_environments_path(project))
+ end
+
+ describe 'when the user does not have access' do
+ let(:user) { nil }
+
+ it 'does not have a link to the environments page' do
+ render
+
+ expect(rendered).not_to have_link('Environments')
+ end
+ end
+
+ context 'when feature flag :sidebar_refactor is disabled' do
+ it 'does not have a Environments menu item' do
+ stub_feature_flags(sidebar_refactor: false)
+
+ render
+
+ expect(rendered).not_to have_selector('.shortcuts-deployments')
+ end
+ end
+ end
+
+ describe 'Releases' do
+ it 'has a link to the project releases path' do
+ render
+
+ expect(rendered).to have_link('Releases', href: project_releases_path(project), class: 'shortcuts-deployments-releases')
+ end
+
+ context 'when feature flag :sidebar refactor is disabled' do
+ it 'does not have a link to the project releases path' do
+ stub_feature_flags(sidebar_refactor: false)
+
+ render
+
+ expect(rendered).not_to have_link('Releases', href: project_releases_path(project), class: 'shortcuts-deployments-releases')
+ end
end
end
end
- describe 'wiki entry tab' do
- let(:can_read_wiki) { true }
+ describe 'Monitor' do
+ it 'top level navigation link is visible for user with permissions' do
+ render
- before do
- allow(view).to receive(:can?).with(user, :read_wiki, project).and_return(can_read_wiki)
+ expect(rendered).to have_link('Monitor')
end
- describe 'when wiki is enabled' do
- it 'shows the wiki tab with the wiki internal link' do
+ describe 'Metrics Dashboard' do
+ it 'has a link to the metrics dashboard page' do
render
- expect(rendered).to have_link('Wiki', href: wiki_path(project.wiki))
+ expect(rendered).to have_link('Metrics', href: project_metrics_dashboard_path(project))
+ end
+
+ describe 'when the user does not have access' do
+ let(:user) { nil }
+
+ it 'does not have a link to the metrics page' do
+ render
+
+ expect(rendered).not_to have_link('Metrics')
+ end
end
end
- describe 'when wiki is disabled' do
- let(:can_read_wiki) { false }
+ describe 'Logs' do
+ it 'has a link to the pod logs page' do
+ render
+
+ expect(rendered).to have_link('Logs', href: project_logs_path(project))
+ end
+
+ describe 'when the user does not have access' do
+ let(:user) { nil }
+
+ it 'does not have a link to the pod logs page' do
+ render
+
+ expect(rendered).not_to have_link('Logs')
+ end
+ end
+ end
- it 'does not show the wiki tab' do
+ describe 'Tracing' do
+ it 'has a link to the tracing page' do
render
- expect(rendered).not_to have_link('Wiki')
+ expect(rendered).to have_link('Tracing', href: project_tracing_path(project))
+ end
+
+ context 'without project.tracing_external_url' do
+ it 'has a link to the tracing page' do
+ render
+
+ expect(rendered).to have_link('Tracing', href: project_tracing_path(project))
+ end
+ end
+
+ describe 'when the user does not have access' do
+ let(:user) { nil }
+
+ it 'does not have a link to the tracing page' do
+ render
+
+ expect(rendered).not_to have_text 'Tracing'
+ end
+ end
+ end
+
+ describe 'Error Tracking' do
+ it 'has a link to the error tracking page' do
+ render
+
+ expect(rendered).to have_link('Error Tracking', href: project_error_tracking_index_path(project))
+ end
+
+ describe 'when the user does not have access' do
+ let(:user) { nil }
+
+ it 'does not have a link to the error tracking page' do
+ render
+
+ expect(rendered).not_to have_link('Error Tracking')
+ end
+ end
+ end
+
+ describe 'Alert Management' do
+ it 'has a link to the alert management page' do
+ render
+
+ expect(rendered).to have_link('Alerts', href: project_alert_management_index_path(project))
+ end
+
+ describe 'when the user does not have access' do
+ let(:user) { nil }
+
+ it 'does not have a link to the alert management page' do
+ render
+
+ expect(rendered).not_to have_link('Alerts')
+ end
+ end
+ end
+
+ describe 'Incidents' do
+ it 'has a link to the incidents page' do
+ render
+
+ expect(rendered).to have_link('Incidents', href: project_incidents_path(project))
+ end
+
+ describe 'when the user does not have access' do
+ let(:user) { nil }
+
+ it 'does not have a link to the incidents page' do
+ render
+
+ expect(rendered).not_to have_link('Incidents')
+ end
+ end
+ end
+
+ context 'when feature flag :sidebar_refactor is disabled' do
+ before do
+ stub_feature_flags(sidebar_refactor: false)
+ end
+
+ describe 'Serverless' do
+ it 'has a link to the serverless page' do
+ render
+
+ page = Nokogiri::HTML.parse(rendered)
+
+ expect(page.at_css('.shortcuts-operations').parent.css('[aria-label="Serverless"]')).not_to be_empty
+ expect(rendered).to have_link('Serverless', href: project_serverless_functions_path(project))
+ end
+
+ describe 'when the user does not have access' do
+ let(:user) { nil }
+
+ it 'does not have a link to the serverless page' do
+ render
+
+ expect(rendered).not_to have_link('Serverless')
+ end
+ end
+ end
+
+ describe 'Terraform' do
+ it 'has a link to the terraform page' do
+ render
+
+ page = Nokogiri::HTML.parse(rendered)
+
+ expect(page.at_css('.shortcuts-operations').parent.css('[aria-label="Terraform"]')).not_to be_empty
+ expect(rendered).to have_link('Terraform', href: project_terraform_index_path(project))
+ end
+
+ describe 'when the user does not have access' do
+ let(:user) { nil }
+
+ it 'does not have a link to the terraform page' do
+ render
+
+ expect(rendered).not_to have_link('Terraform')
+ end
+ end
+ end
+
+ describe 'Kubernetes' do
+ it 'has a link to the kubernetes page' do
+ render
+
+ page = Nokogiri::HTML.parse(rendered)
+
+ expect(page.at_css('.shortcuts-operations').parent.css('[aria-label="Kubernetes"]')).not_to be_empty
+ expect(rendered).to have_link('Kubernetes', href: project_clusters_path(project))
+ end
+
+ describe 'when the user does not have access' do
+ let(:user) { nil }
+
+ it 'does not have a link to the kubernetes page' do
+ render
+
+ expect(rendered).not_to have_link('Kubernetes')
+ end
+ end
+ end
+ end
+
+ describe 'Environments' do
+ let(:page) { Nokogiri::HTML.parse(rendered) }
+
+ it 'does not have a link to the environments page' do
+ render
+
+ expect(page.at_css('.shortcuts-monitor').parent.css('[aria-label="Environments"]')).to be_empty
+ end
+
+ context 'when feature flag :sidebar_refactor is disabled' do
+ before do
+ stub_feature_flags(sidebar_refactor: false)
+ end
+
+ it 'has a link to the environments page' do
+ render
+
+ expect(page.at_css('.shortcuts-operations').parent.css('[aria-label="Environments"]')).not_to be_empty
+ expect(rendered).to have_link('Environments', href: project_environments_path(project))
+ end
+
+ describe 'when the user does not have access' do
+ let(:user) { nil }
+
+ it 'does not have a link to the environments page' do
+ render
+
+ expect(rendered).not_to have_link('Environments')
+ end
+ end
+ end
+ end
+
+ describe 'Feature Flags' do
+ let(:page) { Nokogiri::HTML.parse(rendered) }
+
+ it 'does not have a link to the feature flags page' do
+ render
+
+ expect(page.at_css('.shortcuts-monitor').parent.css('[aria-label="Feature Flags"]')).to be_empty
+ end
+
+ context 'when feature flag :sidebar_refactor is disabled' do
+ before do
+ stub_feature_flags(sidebar_refactor: false)
+ end
+
+ it 'has a link to the feature flags page' do
+ render
+
+ expect(page.at_css('.shortcuts-operations').parent.css('[aria-label="Feature Flags"]')).not_to be_empty
+ expect(rendered).to have_link('Feature Flags', href: project_feature_flags_path(project))
+ end
+
+ describe 'when the user does not have access' do
+ let(:user) { nil }
+
+ it 'does not have a link to the feature flags page' do
+ render
+
+ expect(rendered).not_to have_link('Feature Flags')
+ end
+ end
+ end
+ end
+
+ describe 'Product Analytics' do
+ it 'has a link to the product analytics page' do
+ render
+
+ expect(rendered).to have_link('Product Analytics', href: project_product_analytics_path(project))
+ end
+
+ describe 'when feature flag :product_analytics is disabled' do
+ it 'does not have a link to the feature flags page' do
+ stub_feature_flags(product_analytics: false)
+
+ render
+
+ expect(rendered).not_to have_link('Product Analytics')
+ end
end
end
end
- describe 'external wiki entry tab' do
- let(:properties) { { 'external_wiki_url' => 'https://gitlab.com' } }
- let(:service_status) { true }
+ describe 'Infrastructure' do
+ describe 'Serverless platform' do
+ it 'has a link to the serverless page' do
+ render
+
+ expect(rendered).to have_link('Serverless platform', href: project_serverless_functions_path(project))
+ end
+
+ describe 'when the user does not have access' do
+ let(:user) { nil }
+
+ it 'does not have a link to the serverless page' do
+ render
+
+ expect(rendered).not_to have_link('Serverless platform')
+ end
+ end
+ end
+
+ describe 'Terraform' do
+ it 'has a link to the terraform page' do
+ render
+
+ expect(rendered).to have_link('Terraform', href: project_terraform_index_path(project))
+ end
+
+ describe 'when the user does not have access' do
+ let(:user) { nil }
+
+ it 'does not have a link to the terraform page' do
+ render
+
+ expect(rendered).not_to have_link('Terraform')
+ end
+ end
+ end
+
+ describe 'Kubernetes clusters' do
+ it 'has a link to the kubernetes page' do
+ render
+
+ expect(rendered).to have_link('Kubernetes clusters', href: project_clusters_path(project))
+ end
+
+ describe 'when the user does not have access' do
+ let(:user) { nil }
+
+ it 'does not have a link to the kubernetes page' do
+ render
+
+ expect(rendered).not_to have_link('Kubernetes clusters')
+ end
+ end
+ end
+ end
+
+ describe 'Packages and Registries' do
+ let(:registry_enabled) { true }
+ let(:packages_enabled) { true }
before do
- project.create_external_wiki_service(active: service_status, properties: properties)
- project.reload
+ stub_container_registry_config(enabled: registry_enabled)
+ stub_config(packages: { enabled: packages_enabled })
end
- context 'when it is active' do
- it 'shows the external wiki tab with the external wiki service link' do
+ it 'top level navigation link is visible and points to package registry page' do
+ render
+
+ expect(rendered).to have_link('Packages & Registries', href: project_packages_path(project))
+ end
+
+ describe 'Packages Registry' do
+ it 'shows link to package registry page' do
render
- expect(rendered).to have_link('External wiki', href: properties['external_wiki_url'])
+ expect(rendered).to have_link('Package Registry', href: project_packages_path(project))
+ end
+
+ context 'when packages config setting is not enabled' do
+ let(:packages_enabled) { false }
+
+ it 'does not show link to package registry page' do
+ render
+
+ expect(rendered).not_to have_link('Package Registry', href: project_packages_path(project))
+ end
end
end
- context 'when it is disabled' do
- let(:service_status) { false }
+ describe 'Container Registry' do
+ it 'shows link to container registry page' do
+ render
- it 'does not show the external wiki tab' do
+ expect(rendered).to have_link('Container Registry', href: project_container_registry_index_path(project))
+ end
+
+ context 'when container config setting is not enabled' do
+ let(:registry_enabled) { false }
+
+ it 'does not show link to package registry page' do
+ render
+
+ expect(rendered).not_to have_link('Container Registry', href: project_container_registry_index_path(project))
+ end
+ end
+ end
+
+ describe 'Infrastructure Registry' do
+ it 'shows link to infrastructure registry page' do
render
- expect(rendered).not_to have_link('External wiki')
+ expect(rendered).to have_link('Infrastructure Registry', href: project_infrastructure_registry_index_path(project))
+ end
+
+ context 'when feature flag :infrastructure_registry_page is disabled' do
+ it 'does not show link to package registry page' do
+ stub_feature_flags(infrastructure_registry_page: false)
+
+ render
+
+ expect(rendered).not_to have_link('Infrastructure Registry', href: project_infrastructure_registry_index_path(project))
+ end
end
end
end
- describe 'confluence tab' do
+ describe 'Analytics' do
+ it 'top level navigation link is visible points to the value stream page' do
+ render
+
+ expect(rendered).to have_link('Analytics', href: project_cycle_analytics_path(project))
+ end
+
+ describe 'CI/CD' do
+ it 'has a link to the CI/CD analytics page' do
+ render
+
+ expect(rendered).to have_link('CI/CD', href: charts_project_pipelines_path(project))
+ end
+
+ context 'when user does not have access' do
+ let(:user) { nil }
+
+ it 'does not have a link to the CI/CD analytics page' do
+ render
+
+ expect(rendered).not_to have_link('CI/CD', href: charts_project_pipelines_path(project))
+ end
+ end
+ end
+
+ describe 'Repository' do
+ it 'has a link to the repository analytics page' do
+ render
+
+ expect(rendered).to have_link('Repository', href: charts_project_graph_path(project, 'master'))
+ end
+
+ context 'when user does not have access' do
+ let(:user) { nil }
+
+ it 'does not have a link to the repository analytics page' do
+ render
+
+ expect(rendered).not_to have_link('Repository', href: charts_project_graph_path(project, 'master'))
+ end
+ end
+ end
+
+ describe 'Value Stream' do
+ it 'has a link to the value stream page' do
+ render
+
+ expect(rendered).to have_link('Value Stream', href: project_cycle_analytics_path(project))
+ end
+
+ context 'when user does not have access' do
+ let(:user) { nil }
+
+ it 'does not have a link to the value stream page' do
+ render
+
+ expect(rendered).not_to have_link('Value Stream', href: project_cycle_analytics_path(project))
+ end
+ end
+ end
+ end
+
+ describe 'Confluence' do
let!(:service) { create(:confluence_service, project: project, active: active) }
before do
@@ -275,11 +1003,11 @@ RSpec.describe 'layouts/nav/sidebar/_project' do
context 'when the Confluence integration is active' do
let(:active) { true }
- it 'shows the Confluence tab' do
+ it 'shows the Confluence link' do
expect(rendered).to have_link('Confluence', href: project_wikis_confluence_path(project))
end
- it 'does not show the GitLab wiki tab' do
+ it 'does not show the GitLab wiki link' do
expect(rendered).not_to have_link('Wiki')
end
end
@@ -287,167 +1015,314 @@ RSpec.describe 'layouts/nav/sidebar/_project' do
context 'when it is disabled' do
let(:active) { false }
- it 'does not show the Confluence tab' do
+ it 'does not show the Confluence link' do
expect(rendered).not_to have_link('Confluence')
end
- it 'shows the GitLab wiki tab' do
+ it 'shows the GitLab wiki link' do
expect(rendered).to have_link('Wiki', href: wiki_path(project.wiki))
end
end
end
- describe 'ci/cd settings tab' do
- before do
- project.update!(archived: project_archived)
+ describe 'Wiki' do
+ describe 'when wiki is enabled' do
+ it 'shows the wiki tab with the wiki internal link' do
+ render
+
+ expect(rendered).to have_link('Wiki', href: wiki_path(project.wiki))
+ end
end
- context 'when project is archived' do
- let(:project_archived) { true }
+ describe 'when wiki is disabled' do
+ let(:user) { nil }
- it 'does not show the ci/cd settings tab' do
+ it 'does not show the wiki link' do
render
- expect(rendered).not_to have_link('CI/CD', href: project_settings_ci_cd_path(project))
+ expect(rendered).not_to have_link('Wiki')
end
end
+ end
- context 'when project is active' do
- let(:project_archived) { false }
+ describe 'External Wiki' do
+ let(:properties) { { 'external_wiki_url' => 'https://gitlab.com' } }
+ let(:service_status) { true }
+
+ before do
+ project.create_external_wiki_service(active: service_status, properties: properties)
+ project.reload
+ end
- it 'shows the ci/cd settings tab' do
+ context 'when it is active' do
+ it 'shows the external wiki tab with the external wiki service link' do
render
- expect(rendered).to have_link('CI/CD', href: project_settings_ci_cd_path(project))
+ expect(rendered).to have_link('External wiki', href: properties['external_wiki_url'])
+ end
+ end
+
+ context 'when it is disabled' do
+ let(:service_status) { false }
+
+ it 'does not show the external wiki link' do
+ render
+
+ expect(rendered).not_to have_link('External wiki')
end
end
end
- describe 'pipeline editor link' do
- it 'shows the pipeline editor link' do
+ describe 'Snippets' do
+ before 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)
+ context 'when user can access snippets' do
+ it 'shows Snippets link' do
+ expect(rendered).to have_link('Snippets', href: project_snippets_path(project))
+ end
+ end
- render
+ context 'when user cannot access snippets' do
+ let(:user) { nil }
- expect(rendered).not_to have_link('Editor', href: project_ci_pipeline_editor_path(project))
+ it 'does not show Snippets link' do
+ expect(rendered).not_to have_link('Snippets')
+ end
end
end
- describe 'operations settings tab' do
- describe 'archive projects' do
- before do
- project.update!(archived: project_archived)
- end
+ describe 'Members' do
+ it 'does not show the Member menu item' do
+ expect(rendered).not_to have_selector('.sidebar-top-level-items > li > a[aria-label="Members"]')
+ end
- context 'when project is archived' do
- let(:project_archived) { true }
+ context 'when feature flag :sidebar_refactor is disabled' do
+ before do
+ stub_feature_flags(sidebar_refactor: false)
- it 'does not show the operations settings tab' do
- render
+ render
+ end
- expect(rendered).not_to have_link('Operations', href: project_settings_operations_path(project))
+ context 'when user can access members' do
+ it 'show Members link' do
+ expect(rendered).to have_selector('.sidebar-top-level-items > li > a[aria-label="Members"]')
+ expect(rendered).to have_link('Members', href: project_project_members_path(project))
end
end
- context 'when project is active' do
- let(:project_archived) { false }
+ context 'when user cannot access members' do
+ let(:user) { nil }
- it 'shows the operations settings tab' do
- render
-
- expect(rendered).to have_link('Operations', href: project_settings_operations_path(project))
+ it 'show Members link' do
+ expect(rendered).not_to have_link('Members')
end
end
end
+ end
- describe 'Tracing' do
- it 'is not visible to unauthorized user' do
- allow(view).to receive(:can?).and_return(false)
+ describe 'Settings' do
+ describe 'General' do
+ it 'has a link to the General settings' do
+ render
+ expect(rendered).to have_link('General', href: edit_project_path(project))
+ end
+ end
+
+ describe 'Integrations' do
+ it 'has a link to the Integrations settings' do
render
- expect(rendered).not_to have_text 'Tracing'
+ expect(rendered).to have_link('Integrations', href: project_settings_integrations_path(project))
end
+ end
- it 'links to Tracing page' do
+ describe 'WebHooks' do
+ it 'has a link to the WebHooks settings' do
render
- expect(rendered).to have_link('Tracing', href: project_tracing_path(project))
+ expect(rendered).to have_link('Webhooks', href: project_hooks_path(project))
end
+ end
- context 'without project.tracing_external_url' do
- it 'links to Tracing page' do
+ describe 'Access Tokens' do
+ context 'self-managed instance' do
+ before do
+ allow(Gitlab).to receive(:com?).and_return(false)
+ end
+
+ it 'has a link to the Access Tokens settings' do
render
- expect(rendered).to have_link('Tracing', href: project_tracing_path(project))
+ expect(rendered).to have_link('Access Tokens', href: project_settings_access_tokens_path(project))
+ end
+ end
+
+ context 'gitlab.com' do
+ before do
+ allow(Gitlab).to receive(:com?).and_return(true)
+ end
+
+ it 'has a link to the Access Tokens settings' do
+ render
+
+ expect(rendered).to have_link('Access Tokens', href: project_settings_access_tokens_path(project))
end
end
end
- describe 'Alert Management' do
- it 'shows the Alerts sidebar entry' do
+ describe 'Repository' do
+ it 'has a link to the Repository settings' do
render
- expect(rendered).to have_css('a[title="Alerts"]')
+ expect(rendered).to have_link('Repository', href: project_settings_repository_path(project))
end
end
- end
- describe 'value stream analytics entry' do
- let(:read_cycle_analytics) { true }
+ describe 'CI/CD' do
+ context 'when project is archived' do
+ before do
+ project.update!(archived: true)
+ end
- before do
- allow(view).to receive(:can?).with(user, :read_cycle_analytics, project).and_return(read_cycle_analytics)
- end
+ it 'does not have a link to the CI/CD settings' do
+ render
- describe 'when value stream analytics is enabled' do
- it 'shows the value stream analytics entry' do
- render
+ expect(rendered).not_to have_link('CI/CD', href: project_settings_ci_cd_path(project))
+ end
+ end
- expect(rendered).to have_link('Value Stream', href: project_cycle_analytics_path(project))
+ context 'when project is not archived' do
+ it 'has a link to the CI/CD settings' do
+ render
+
+ expect(rendered).to have_link('CI/CD', href: project_settings_ci_cd_path(project))
+ end
end
end
- describe 'when value stream analytics is disabled' do
- let(:read_cycle_analytics) { false }
+ describe 'Monitor' do
+ context 'when project is archived' do
+ before do
+ project.update!(archived: true)
+ end
- it 'does not show the value stream analytics entry' do
- render
+ it 'does not have a link to the Monitor settings' do
+ render
- expect(rendered).not_to have_link('Value Stream', href: project_cycle_analytics_path(project))
+ expect(rendered).not_to have_link('Monitor', href: project_settings_operations_path(project))
+ end
+ end
+
+ context 'when project is not archived active' do
+ it 'has a link to the Monitor settings' do
+ render
+
+ expect(rendered).to have_link('Monitor', href: project_settings_operations_path(project))
+ end
end
end
- end
- describe 'project access tokens' do
- context 'self-managed instance' do
+ describe 'Pages' do
before do
- allow(Gitlab).to receive(:com?).and_return(false)
+ stub_config(pages: { enabled: pages_enabled })
end
- it 'displays "Access Tokens" nav item' do
- render
+ context 'when pages are enabled' do
+ let(:pages_enabled) { true }
+
+ it 'has a link to the Pages settings' do
+ render
- expect(rendered).to have_link('Access Tokens', href: project_settings_access_tokens_path(project))
+ expect(rendered).to have_link('Pages', href: project_pages_path(project))
+ end
+ end
+
+ context 'when pages are not enabled' do
+ let(:pages_enabled) { false }
+
+ it 'does not have a link to the Pages settings' do
+ render
+
+ expect(rendered).not_to have_link('Pages', href: project_pages_path(project))
+ end
end
end
- context 'gitlab.com' do
+ describe 'Packages & Registries' do
before do
- allow(Gitlab).to receive(:com?).and_return(true)
+ stub_container_registry_config(enabled: registry_enabled)
end
- it 'displays "Access Tokens" nav item' do
- render
+ context 'when registry is enabled' do
+ let(:registry_enabled) { true }
+
+ it 'has a link to the Packages & Registries settings' do
+ render
+
+ expect(rendered).to have_link('Packages & Registries', href: project_settings_packages_and_registries_path(project))
+ end
+
+ context 'when feature flag :sidebar_refactor is disabled' do
+ it 'does not have a link to the Packages & Registries settings' do
+ stub_feature_flags(sidebar_refactor: false)
+
+ render
- expect(rendered).to have_link('Access Tokens', href: project_settings_access_tokens_path(project))
+ expect(rendered).not_to have_link('Packages & Registries', href: project_settings_packages_and_registries_path(project))
+ end
+ end
end
+
+ context 'when registry is not enabled' do
+ let(:registry_enabled) { false }
+
+ it 'does not have a link to the Packages & Registries settings' do
+ render
+
+ expect(rendered).not_to have_link('Packages & Registries', href: project_settings_packages_and_registries_path(project))
+ end
+ end
+ end
+ end
+
+ describe 'Hidden menus' do
+ it 'has a link to the Activity page' do
+ render
+
+ expect(rendered).to have_link('Activity', href: activity_project_path(project), class: 'shortcuts-project-activity', visible: false)
+ end
+
+ it 'has a link to the Graph page' do
+ render
+
+ expect(rendered).to have_link('Graph', href: project_network_path(project, current_ref), class: 'shortcuts-network', visible: false)
+ end
+
+ it 'has a link to the New Issue page' do
+ render
+
+ expect(rendered).to have_link('Create a new issue', href: new_project_issue_path(project), class: 'shortcuts-new-issue', visible: false)
+ end
+
+ it 'has a link to the Jobs page' do
+ render
+
+ expect(rendered).to have_link('Jobs', href: project_jobs_path(project), class: 'shortcuts-builds', visible: false)
+ end
+
+ it 'has a link to the Commits page' do
+ render
+
+ expect(rendered).to have_link('Commits', href: project_commits_path(project), class: 'shortcuts-commits', visible: false)
+ end
+
+ it 'has a link to the Issue Boards page' do
+ render
+
+ expect(rendered).to have_link('Issue Boards', href: project_boards_path(project), class: 'shortcuts-issue-boards', visible: false)
end
end
diff --git a/spec/views/layouts/nav/sidebar/_project_security_link.html.haml_spec.rb b/spec/views/layouts/nav/sidebar/_project_security_link.html.haml_spec.rb
deleted file mode 100644
index d3fb35bff6d..00000000000
--- a/spec/views/layouts/nav/sidebar/_project_security_link.html.haml_spec.rb
+++ /dev/null
@@ -1,29 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe 'layouts/nav/sidebar/_project_security_link' do
- let_it_be_with_reload(:project) { create(:project) }
- context 'on security configuration' do
- before do
- assign(:project, project)
- allow(controller).to receive(:controller_name).and_return('configuration')
- allow(controller).to receive(:controller_path).and_return('projects/security/configuration')
- allow(controller).to receive(:action_name).and_return('show')
- allow(view).to receive(:any_project_nav_tab?).and_return(true)
- allow(view).to receive(:project_nav_tab?).and_return(true)
- end
-
- it 'activates Security & Compliance tab' do
- render
-
- expect(rendered).to have_css('li.active', text: 'Security & Compliance')
- end
-
- it 'activates Configuration sub tab' do
- render
-
- expect(rendered).to have_css('.sidebar-sub-level-items > li.active', text: 'Configuration')
- end
- end
-end
diff --git a/spec/views/notify/change_in_merge_request_draft_status_email.html.haml_spec.rb b/spec/views/notify/change_in_merge_request_draft_status_email.html.haml_spec.rb
index 6c25eba03b9..6d56145144f 100644
--- a/spec/views/notify/change_in_merge_request_draft_status_email.html.haml_spec.rb
+++ b/spec/views/notify/change_in_merge_request_draft_status_email.html.haml_spec.rb
@@ -5,6 +5,7 @@ require 'spec_helper'
RSpec.describe 'notify/change_in_merge_request_draft_status_email.html.haml' do
let(:user) { create(:user) }
let(:merge_request) { create(:merge_request) }
+ let(:merge_request_link) { merge_request_url(merge_request) }
before do
assign(:updated_by_user, user)
@@ -15,5 +16,7 @@ RSpec.describe 'notify/change_in_merge_request_draft_status_email.html.haml' do
render
expect(rendered).to have_content("#{user.name} changed the draft status of merge request #{merge_request.to_reference}")
+ expect(rendered).to have_link(user.name, href: user_url(user))
+ expect(rendered).to have_link(merge_request.to_reference, href: merge_request_link)
end
end
diff --git a/spec/views/profiles/keys/_form.html.haml_spec.rb b/spec/views/profiles/keys/_form.html.haml_spec.rb
index 62bb271bd9c..0f4d7ecc699 100644
--- a/spec/views/profiles/keys/_form.html.haml_spec.rb
+++ b/spec/views/profiles/keys/_form.html.haml_spec.rb
@@ -29,7 +29,7 @@ RSpec.describe 'profiles/keys/_form.html.haml' do
it 'has the title field', :aggregate_failures do
expect(rendered).to have_field('Title', type: 'text', placeholder: 'e.g. My MacBook key')
- expect(rendered).to have_text('Give your individual key a title.')
+ expect(rendered).to have_text('Give your individual key a title. This will be publicly visible.')
end
it 'has the expires at field', :aggregate_failures do
diff --git a/spec/views/projects/pipelines/new.html.haml_spec.rb b/spec/views/projects/pipelines/new.html.haml_spec.rb
deleted file mode 100644
index 9c5e46b6a17..00000000000
--- a/spec/views/projects/pipelines/new.html.haml_spec.rb
+++ /dev/null
@@ -1,34 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe 'projects/pipelines/new' do
- include Devise::Test::ControllerHelpers
- let_it_be(:project) { create(:project, :repository) }
- let(:pipeline) { create(:ci_pipeline, project: project) }
-
- before do
- assign(:project, project)
- assign(:pipeline, pipeline)
-
- stub_feature_flags(new_pipeline_form: false)
- end
-
- describe 'warning messages' do
- let(:warning_messages) do
- [double(content: 'warning 1'), double(content: 'warning 2')]
- end
-
- before do
- allow(pipeline).to receive(:warning_messages).and_return(warning_messages)
- end
-
- it 'displays the warnings' do
- render
-
- expect(rendered).to have_css('div.bs-callout-warning')
- expect(rendered).to have_content('warning 1')
- expect(rendered).to have_content('warning 2')
- end
- end
-end
diff --git a/spec/views/projects/pipelines/show.html.haml_spec.rb b/spec/views/projects/pipelines/show.html.haml_spec.rb
index b998023b40e..5b5c05527de 100644
--- a/spec/views/projects/pipelines/show.html.haml_spec.rb
+++ b/spec/views/projects/pipelines/show.html.haml_spec.rb
@@ -12,8 +12,6 @@ RSpec.describe 'projects/pipelines/show' do
before do
assign(:project, project)
assign(:pipeline, presented_pipeline)
-
- stub_feature_flags(new_pipeline_form: false)
end
context 'when pipeline has errors' do
diff --git a/spec/views/projects/settings/operations/show.html.haml_spec.rb b/spec/views/projects/settings/operations/show.html.haml_spec.rb
index e6d53c526e2..ab868eb78b8 100644
--- a/spec/views/projects/settings/operations/show.html.haml_spec.rb
+++ b/spec/views/projects/settings/operations/show.html.haml_spec.rb
@@ -47,7 +47,7 @@ RSpec.describe 'projects/settings/operations/show' do
render
expect(rendered).to have_content _('Error tracking')
- expect(rendered).to have_content _('To link Sentry to GitLab, enter your Sentry URL and Auth Token')
+ expect(rendered).to have_content _('Link Sentry to GitLab to discover and view the errors your application generates.')
end
end
end
diff --git a/spec/views/projects/tags/index.html.haml_spec.rb b/spec/views/projects/tags/index.html.haml_spec.rb
index 18b42f98e0b..2702ab9e2a9 100644
--- a/spec/views/projects/tags/index.html.haml_spec.rb
+++ b/spec/views/projects/tags/index.html.haml_spec.rb
@@ -20,12 +20,6 @@ RSpec.describe 'projects/tags/index.html.haml' do
allow(view).to receive(:current_user).and_return(project.namespace.owner)
end
- it 'defaults sort dropdown toggle to last updated' do
- stub_feature_flags(gldropdown_tags: false)
- render
- expect(rendered).to have_button('Last updated')
- end
-
it 'renders links to the Releases page for tags associated with a release' do
render
expect(rendered).to have_link(release.name, href: project_releases_path(project, anchor: release.tag))
diff --git a/spec/views/registrations/welcome/show.html.haml_spec.rb b/spec/views/registrations/welcome/show.html.haml_spec.rb
index 639759ae095..ecdef7918de 100644
--- a/spec/views/registrations/welcome/show.html.haml_spec.rb
+++ b/spec/views/registrations/welcome/show.html.haml_spec.rb
@@ -5,7 +5,7 @@ require 'spec_helper'
RSpec.describe 'registrations/welcome/show' do
let(:is_gitlab_com) { false }
- let_it_be(:user) { User.new }
+ let_it_be(:user) { create(:user) }
before do
allow(view).to receive(:current_user).and_return(user)
diff --git a/spec/views/shared/nav/_sidebar.html.haml_spec.rb b/spec/views/shared/nav/_sidebar.html.haml_spec.rb
index 268d2952683..cf9452ba68c 100644
--- a/spec/views/shared/nav/_sidebar.html.haml_spec.rb
+++ b/spec/views/shared/nav/_sidebar.html.haml_spec.rb
@@ -4,7 +4,7 @@ require 'spec_helper'
RSpec.describe 'shared/nav/_sidebar.html.haml' do
let(:project) { build(:project, id: non_existing_record_id) }
- let(:context) { Sidebars::Projects::Context.new(current_user: nil, container: project)}
+ let(:context) { Sidebars::Projects::Context.new(current_user: nil, container: project) }
let(:sidebar) { Sidebars::Projects::Panel.new(context) }
before do
@@ -32,7 +32,7 @@ RSpec.describe 'shared/nav/_sidebar.html.haml' do
context 'when sidebar has a custom scope menu partial defined' do
it 'renders the custom partial' do
allow(sidebar).to receive(:render_raw_scope_menu_partial).and_return(scope_menu_view)
- allow(sidebar).to receive(:scope_menu).and_return(nil)
+ allow(view).to receive(:scope_menu).and_return(nil)
stub_template(scope_menu_partial => content)
render
diff --git a/spec/views/shared/runners/show.html.haml_spec.rb b/spec/views/shared/runners/_runner_details.html.haml_spec.rb
index 91a6a31daae..f9f93c8160b 100644
--- a/spec/views/shared/runners/show.html.haml_spec.rb
+++ b/spec/views/shared/runners/_runner_details.html.haml_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'shared/runners/show.html.haml' do
+RSpec.describe 'shared/runners/_runner_details.html.haml' do
include PageLayoutHelper
let(:runner) do
@@ -14,7 +14,7 @@ RSpec.describe 'shared/runners/show.html.haml' do
end
before do
- assign(:runner, runner)
+ allow(view).to receive(:runner) { runner }
end
subject do
@@ -24,7 +24,7 @@ RSpec.describe 'shared/runners/show.html.haml' do
describe 'Page title' do
before do
- expect_any_instance_of(PageLayoutHelper).to receive(:page_title).with("#{runner.description} ##{runner.id}", 'Runners')
+ expect(view).to receive(:page_title).with("##{runner.id} (#{runner.short_sha})")
end
it 'sets proper page title' do
@@ -147,7 +147,7 @@ RSpec.describe 'shared/runners/show.html.haml' do
context 'when runner have already contacted' do
let(:runner) { create(:ci_runner, contacted_at: DateTime.now - 6.days) }
- let(:expected_contacted_at) { I18n.localize(runner.contacted_at, format: "%b %d, %Y") }
+ let(:expected_contacted_at) { I18n.l(runner.contacted_at, format: "%b %d, %Y") }
it { is_expected.to have_content("Last contact #{expected_contacted_at}") }
end