diff options
Diffstat (limited to 'spec/views')
19 files changed, 482 insertions, 122 deletions
diff --git a/spec/views/admin/dashboard/index.html.haml_spec.rb b/spec/views/admin/dashboard/index.html.haml_spec.rb index 43a6fcc2adc..9fa95613d1c 100644 --- a/spec/views/admin/dashboard/index.html.haml_spec.rb +++ b/spec/views/admin/dashboard/index.html.haml_spec.rb @@ -52,4 +52,12 @@ RSpec.describe 'admin/dashboard/index.html.haml' do expect(rendered).not_to have_content "Maximum Users" expect(rendered).not_to have_content "Users over License" end + + it 'links to the GitLab Changelog' do + stub_application_setting(version_check_enabled: true) + + render + + expect(rendered).to have_link(href: 'https://gitlab.com/gitlab-org/gitlab/-/blob/master/CHANGELOG.md') + end end diff --git a/spec/views/admin/sessions/new.html.haml_spec.rb b/spec/views/admin/sessions/new.html.haml_spec.rb index 94870f0bdba..97528b6e782 100644 --- a/spec/views/admin/sessions/new.html.haml_spec.rb +++ b/spec/views/admin/sessions/new.html.haml_spec.rb @@ -19,9 +19,9 @@ RSpec.describe 'admin/sessions/new.html.haml' do it 'shows enter password form' do render - expect(rendered).to have_selector('[data-qa-selector="sign_in_tab"]') + expect(rendered).to have_selector('[data-qa-selector="sign_in_tab"]') # rubocop:disable QA/SelectorUsage expect(rendered).to have_css('#login-pane.active') - expect(rendered).to have_selector('[data-qa-selector="password_field"]') + expect(rendered).to have_selector('[data-qa-selector="password_field"]') # rubocop:disable QA/SelectorUsage end it 'warns authentication not possible if password not set' do @@ -60,7 +60,7 @@ RSpec.describe 'admin/sessions/new.html.haml' do it 'is shown when enabled' do render - expect(rendered).to have_selector('[data-qa-selector="ldap_tab"]') + expect(rendered).to have_selector('[data-qa-selector="ldap_tab"]') # rubocop:disable QA/SelectorUsage expect(rendered).to have_css('.login-box#ldapmain') expect(rendered).to have_field('LDAP Username') expect(rendered).not_to have_content('No authentication methods configured') @@ -71,7 +71,7 @@ RSpec.describe 'admin/sessions/new.html.haml' do render - expect(rendered).not_to have_selector('[data-qa-selector="ldap_tab"]') + expect(rendered).not_to have_selector('[data-qa-selector="ldap_tab"]') # rubocop:disable QA/SelectorUsage expect(rendered).not_to have_field('LDAP Username') expect(rendered).to have_content('No authentication methods configured') end diff --git a/spec/views/devise/sessions/new.html.haml_spec.rb b/spec/views/devise/sessions/new.html.haml_spec.rb index d3552bf2e5a..0109d05abe4 100644 --- a/spec/views/devise/sessions/new.html.haml_spec.rb +++ b/spec/views/devise/sessions/new.html.haml_spec.rb @@ -48,7 +48,7 @@ RSpec.describe 'devise/sessions/new' do render expect(rendered).to have_selector('.new-session-tabs') - expect(rendered).to have_selector('[data-qa-selector="ldap_tab"]') + expect(rendered).to have_selector('[data-qa-selector="ldap_tab"]') # rubocop:disable QA/SelectorUsage expect(rendered).to have_field('LDAP Username') end @@ -58,7 +58,7 @@ RSpec.describe 'devise/sessions/new' do render expect(rendered).to have_content('No authentication methods configured') - expect(rendered).not_to have_selector('[data-qa-selector="ldap_tab"]') + expect(rendered).not_to have_selector('[data-qa-selector="ldap_tab"]') # rubocop:disable QA/SelectorUsage expect(rendered).not_to have_field('LDAP Username') end end diff --git a/spec/views/groups/edit.html.haml_spec.rb b/spec/views/groups/edit.html.haml_spec.rb index f40b03fda2a..43e11d31611 100644 --- a/spec/views/groups/edit.html.haml_spec.rb +++ b/spec/views/groups/edit.html.haml_spec.rb @@ -25,7 +25,7 @@ RSpec.describe 'groups/edit.html.haml' do 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_content('help text here') expect(rendered).to have_field('group_share_with_group_lock', **checkbox_options) end end diff --git a/spec/views/groups/runners/_sort_dropdown.html.haml_spec.rb b/spec/views/groups/runners/_sort_dropdown.html.haml_spec.rb new file mode 100644 index 00000000000..4b5027a5a56 --- /dev/null +++ b/spec/views/groups/runners/_sort_dropdown.html.haml_spec.rb @@ -0,0 +1,31 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe 'groups/runners/sort_dropdown.html.haml' do + describe 'render' do + let_it_be(:sort_options_hash) { { by_title: 'Title' } } + let_it_be(:sort_title_created_date) { 'Created date' } + + before do + allow(view).to receive(:sort).and_return('by_title') + end + + describe 'when a sort option is not selected' do + it 'renders a default sort option' do + render 'groups/runners/sort_dropdown', sort_options_hash: sort_options_hash, sort_title_created_date: sort_title_created_date + + expect(rendered).to have_content 'Created date' + end + end + + describe 'when a sort option is selected' do + it 'renders the selected sort option' do + @sort = :by_title + render 'groups/runners/sort_dropdown', sort_options_hash: sort_options_hash, sort_title_created_date: sort_title_created_date + + expect(rendered).to have_content 'Title' + end + end + end +end diff --git a/spec/views/groups/settings/_transfer.html.haml_spec.rb b/spec/views/groups/settings/_transfer.html.haml_spec.rb index aeb70251a62..b557c989eae 100644 --- a/spec/views/groups/settings/_transfer.html.haml_spec.rb +++ b/spec/views/groups/settings/_transfer.html.haml_spec.rb @@ -9,8 +9,8 @@ RSpec.describe 'groups/settings/_transfer.html.haml' do render 'groups/settings/transfer', group: group - expect(rendered).to have_selector '[data-qa-selector="select_group_dropdown"]' - expect(rendered).not_to have_selector '[data-qa-selector="select_group_dropdown"][disabled]' + expect(rendered).to have_selector '[data-qa-selector="select_group_dropdown"]' # rubocop:disable QA/SelectorUsage + expect(rendered).not_to have_selector '[data-qa-selector="select_group_dropdown"][disabled]' # rubocop:disable QA/SelectorUsage expect(rendered).not_to have_selector '[data-testid="group-to-transfer-has-linked-subscription-alert"]' end end diff --git a/spec/views/groups/show.html.haml_spec.rb b/spec/views/groups/show.html.haml_spec.rb index f40b03fda2a..43e11d31611 100644 --- a/spec/views/groups/show.html.haml_spec.rb +++ b/spec/views/groups/show.html.haml_spec.rb @@ -25,7 +25,7 @@ RSpec.describe 'groups/edit.html.haml' do 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_content('help text here') expect(rendered).to have_field('group_share_with_group_lock', **checkbox_options) 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 319e7b55fc3..47abfff87bb 100644 --- a/spec/views/layouts/header/_new_dropdown.haml_spec.rb +++ b/spec/views/layouts/header/_new_dropdown.haml_spec.rb @@ -71,7 +71,7 @@ RSpec.describe 'layouts/header/_new_dropdown' do before do allow(view).to receive(:can?).with(user, :create_projects, group).and_return(true) allow(view).to receive(:can?).with(user, :admin_group_member, group).and_return(invite_member) - allow(view).to receive(:can_import_members?).and_return(invite_member) + allow(view).to receive(:can_admin_project_member?).and_return(invite_member) allow(view).to receive(:experiment_enabled?) end @@ -142,7 +142,7 @@ RSpec.describe 'layouts/header/_new_dropdown' do let(:href) { project_project_members_path(project) } before do - allow(view).to receive(:can_import_members?).and_return(invite_member) + allow(view).to receive(:can_admin_project_member?).and_return(invite_member) stub_current_user(user) allow(view).to receive(:experiment_enabled?) end 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 7df076d35c4..8c9d1b32671 100644 --- a/spec/views/layouts/nav/sidebar/_group.html.haml_spec.rb +++ b/spec/views/layouts/nav/sidebar/_group.html.haml_spec.rb @@ -3,10 +3,17 @@ require 'spec_helper' RSpec.describe 'layouts/nav/sidebar/_group' do - let_it_be(:group) { create(:group) } + let_it_be(:owner) { create(:user) } + let_it_be(:group) do + create(:group).tap do |g| + g.add_owner(owner) + end + end before do assign(:group, group) + + allow(view).to receive(:current_user).and_return(owner) end it_behaves_like 'has nav sidebar' @@ -27,11 +34,154 @@ RSpec.describe 'layouts/nav/sidebar/_group' do expect(rendered).to have_link('Group information', href: activity_group_path(group)) end + it 'has a link to the group labels path' do + render + + expect(rendered).to have_link('Labels', href: group_labels_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 end + + describe 'Issues' do + it 'has a default link to the issue list path' do + render + + expect(rendered).to have_link('Issues', href: issues_group_path(group)) + end + + it 'has a link to the issue list page' do + render + + expect(rendered).to have_link('List', href: issues_group_path(group)) + end + + it 'has a link to the boards page' do + render + + expect(rendered).to have_link('Board', href: group_boards_path(group)) + end + + it 'has a link to the milestones page' do + render + + expect(rendered).to have_link('Milestones', href: group_milestones_path(group)) + 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: merge_requests_group_path(group)) + end + + it 'shows pill with the number of merge requests' do + render + + expect(rendered).to have_css('span.badge.badge-pill.merge_counter.js-merge-counter') + end + end + + describe 'CI/CD' do + it 'has a default link to the runners list path' do + render + + expect(rendered).to have_link('CI/CD', href: group_runners_path(group)) + end + + it 'has a link to the runners list page' do + render + + expect(rendered).to have_link('Runners', href: group_runners_path(group)) + end + end + + describe 'Kubernetes menu' do + it 'has a link to the group cluster list path' do + render + + expect(rendered).to have_link('Kubernetes', href: group_clusters_path(group)) + end + end + + describe 'Packages & Registries' do + it 'has a link to the package registry page' do + stub_config(packages: { enabled: true }) + + render + + expect(rendered).to have_link('Package Registry', href: group_packages_path(group)) + end + + it 'has a link to the container registry page' do + stub_container_registry_config(enabled: true) + + render + + expect(rendered).to have_link('Container Registry', href: group_container_registries_path(group)) + end + + it 'has a link to the dependency proxy page' do + stub_config(dependency_proxy: { enabled: true }) + + render + + expect(rendered).to have_link('Dependency Proxy', href: group_dependency_proxy_path(group)) + end + end + + describe 'Settings' do + it 'default link points to edit group page' do + render + + expect(rendered).to have_link('Settings', href: edit_group_path(group)) + end + + it 'has a link to the General settings page' do + render + + expect(rendered).to have_link('General', href: edit_group_path(group)) + end + + it 'has a link to the Integrations settings page' do + render + + expect(rendered).to have_link('Integrations', href: group_settings_integrations_path(group)) + end + + it 'has a link to the group Projects settings page' do + render + + expect(rendered).to have_link('Projects', href: projects_group_path(group)) + end + + it 'has a link to the Repository settings page' do + render + + expect(rendered).to have_link('Repository', href: group_settings_repository_path(group)) + end + + it 'has a link to the CI/CD settings page' do + render + + expect(rendered).to have_link('CI/CD', href: group_settings_ci_cd_path(group)) + end + + it 'has a link to the Applications settings page' do + render + + expect(rendered).to have_link('Applications', href: group_settings_applications_path(group)) + end + + it 'has a link to the Package & Registries settings page' do + render + + expect(rendered).to have_link('Packages & Registries', href: group_settings_packages_and_registries_path(group)) + 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 f2de43dfd19..3afebfbedab 100644 --- a/spec/views/layouts/nav/sidebar/_project.html.haml_spec.rb +++ b/spec/views/layouts/nav/sidebar/_project.html.haml_spec.rb @@ -640,9 +640,9 @@ RSpec.describe 'layouts/nav/sidebar/_project' do 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 + context 'when package registry config is disabled' do it 'does not show link to package registry page' do - stub_feature_flags(infrastructure_registry_page: false) + stub_config(packages: { enabled: false }) render diff --git a/spec/views/projects/commits/show.html.haml_spec.rb b/spec/views/projects/commits/show.html.haml_spec.rb new file mode 100644 index 00000000000..e5e9906a798 --- /dev/null +++ b/spec/views/projects/commits/show.html.haml_spec.rb @@ -0,0 +1,35 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe 'projects/commits/show.html.haml' do + let(:project) { create(:project, :repository) } + let(:commits) { [project.commit] } + let(:path) { 'path/to/doc.md' } + + before do + assign(:project, project) + assign(:id, path) + assign(:repository, project.repository) + assign(:commits, commits) + assign(:hidden_commit_count, 0) + + controller.params[:controller] = 'projects/commits' + controller.params[:action] = 'show' + controller.params[:namespace_id] = project.namespace.to_param + controller.params[:project_id] = project.to_param + + allow(view).to receive(:current_user).and_return(nil) + allow(view).to receive(:namespace_project_signatures_path).and_return("/") + end + + context 'tree controls' do + before do + render + end + + it 'renders atom feed button with matching path' do + expect(rendered).to have_link(href: "#{project_commits_path(project, path)}?format=atom") + end + end +end diff --git a/spec/views/projects/deployments/_confirm_rollback_modal_spec.html_spec.rb b/spec/views/projects/deployments/_confirm_rollback_modal_spec.html_spec.rb deleted file mode 100644 index 2fb7b6187eb..00000000000 --- a/spec/views/projects/deployments/_confirm_rollback_modal_spec.html_spec.rb +++ /dev/null @@ -1,63 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' - -RSpec.describe 'projects/deployments/_confirm_rollback_modal' do - let(:environment) { create(:environment, :with_review_app) } - let(:deployments) { environment.deployments } - let(:project) { environment.project } - - before do - assign(:environment, environment) - assign(:deployments, deployments) - assign(:project, project) - end - - context 'when re-deploying last deployment' do - let(:deployment) { deployments.first } - - before do - allow(view).to receive(:deployment).and_return(deployment) - end - - it 'shows "re-deploy"' do - render - - expect(rendered).to have_selector('h4', text: "Re-deploy environment #{environment.name}?") - expect(rendered).to have_selector('p', text: "This action will relaunch the job for commit #{deployment.short_sha}, putting the environment in a previous version. Are you sure you want to continue?") - expect(rendered).to have_selector('a.btn-danger', text: 'Re-deploy') - end - - it 'links to re-deploying the environment' do - expected_link = retry_project_job_path(environment.project, deployment.deployable) - - render - - expect(rendered).to have_selector("a[href='#{expected_link}']", text: 'Re-deploy') - end - end - - context 'when rolling back to previous deployment' do - let(:deployment) { create(:deployment, environment: environment) } - - before do - allow(view).to receive(:deployment).and_return(deployment) - end - - it 'shows "rollback"' do - render - - expect(rendered).to have_selector('h4', text: "Rollback environment #{environment.name}?") - expect(rendered).to have_selector('p', text: "This action will run the job defined by #{environment.name} for commit #{deployment.short_sha}, putting the environment in a previous version. You can revert it by re-deploying the latest version of your application. Are you sure you want to continue?") - expect(rendered).to have_selector('a.btn-danger', text: 'Rollback') - end - - it 'links to re-deploying the environment' do - expected_link = retry_project_job_path(environment.project, deployment.deployable) - - render - - expect(rendered).to have_selector("a[href='#{expected_link}']", text: 'Rollback') - end - end -end diff --git a/spec/views/projects/empty.html.haml_spec.rb b/spec/views/projects/empty.html.haml_spec.rb index 0fb0ae5ff29..70da4fc9e27 100644 --- a/spec/views/projects/empty.html.haml_spec.rb +++ b/spec/views/projects/empty.html.haml_spec.rb @@ -6,7 +6,10 @@ RSpec.describe 'projects/empty' do let_it_be(:user) { create(:user) } let_it_be(:project) { ProjectPresenter.new(create(:project, :empty_repo), current_user: user) } + let(:can_admin_project_member) { true } + before do + allow(view).to receive(:can_admin_project_member?).and_return(can_admin_project_member) allow(view).to receive(:experiment_enabled?).and_return(true) allow(view).to receive(:current_user).and_return(user) assign(:project, project) @@ -47,12 +50,6 @@ RSpec.describe 'projects/empty' do end context 'with invite button on empty projects' do - let(:can_import_members) { true } - - before do - allow(view).to receive(:can_import_members?).and_return(can_import_members) - end - it 'shows invite members info', :aggregate_failures do render @@ -68,7 +65,7 @@ RSpec.describe 'projects/empty' do end context 'when user does not have permissions to invite members' do - let(:can_import_members) { false } + let(:can_admin_project_member) { false } it 'does not show invite member info', :aggregate_failures do render diff --git a/spec/views/projects/merge_requests/show.html.haml_spec.rb b/spec/views/projects/merge_requests/show.html.haml_spec.rb index 40d11342ec4..6b6bc1f0b14 100644 --- a/spec/views/projects/merge_requests/show.html.haml_spec.rb +++ b/spec/views/projects/merge_requests/show.html.haml_spec.rb @@ -3,6 +3,8 @@ require 'spec_helper' RSpec.describe 'projects/merge_requests/show.html.haml', :aggregate_failures do + using RSpec::Parameterized::TableSyntax + include_context 'merge request show action' before do @@ -43,4 +45,32 @@ RSpec.describe 'projects/merge_requests/show.html.haml', :aggregate_failures do end end end + + describe 'gitpod modal' do + let(:gitpod_modal_selector) { '#modal-enable-gitpod' } + let(:user) { create(:user) } + let(:user_gitpod_enabled) { create(:user).tap { |x| x.update!(gitpod_enabled: true) } } + + where(:site_enabled, :current_user, :should_show) do + false | ref(:user) | false + true | ref(:user) | true + true | nil | true + true | ref(:user_gitpod_enabled) | false + end + + with_them do + it 'handles rendering gitpod user enable modal' do + allow(Gitlab::CurrentSettings).to receive(:gitpod_enabled).and_return(site_enabled) + allow(view).to receive(:current_user).and_return(current_user) + + render + + if should_show + expect(rendered).to have_css(gitpod_modal_selector) + else + expect(rendered).to have_no_css(gitpod_modal_selector) + end + end + end + end end diff --git a/spec/views/projects/tree/show.html.haml_spec.rb b/spec/views/projects/tree/show.html.haml_spec.rb index bdf9b08d8f5..62a52bcf83f 100644 --- a/spec/views/projects/tree/show.html.haml_spec.rb +++ b/spec/views/projects/tree/show.html.haml_spec.rb @@ -15,7 +15,6 @@ RSpec.describe 'projects/tree/show' do before do assign(:project, project) assign(:repository, repository) - assign(:lfs_blob_ids, []) allow(view).to receive(:can?).and_return(true) allow(view).to receive(:can_collaborate_with_project?).and_return(true) diff --git a/spec/views/registrations/welcome/show.html.haml_spec.rb b/spec/views/registrations/welcome/show.html.haml_spec.rb index ecdef7918de..d9c5d348e15 100644 --- a/spec/views/registrations/welcome/show.html.haml_spec.rb +++ b/spec/views/registrations/welcome/show.html.haml_spec.rb @@ -3,8 +3,6 @@ require 'spec_helper' RSpec.describe 'registrations/welcome/show' do - let(:is_gitlab_com) { false } - let_it_be(:user) { create(:user) } before do @@ -13,7 +11,6 @@ RSpec.describe 'registrations/welcome/show' do allow(view).to receive(:in_trial_flow?).and_return(false) allow(view).to receive(:user_has_memberships?).and_return(false) allow(view).to receive(:in_oauth_flow?).and_return(false) - allow(Gitlab).to receive(:com?).and_return(is_gitlab_com) render end @@ -22,24 +19,5 @@ RSpec.describe 'registrations/welcome/show' do it { is_expected.not_to have_selector('label[for="user_setup_for_company"]') } it { is_expected.to have_button('Get started!') } - it { is_expected.to have_selector('input[name="user[email_opted_in]"]') } - - describe 'email opt in' do - context 'when on gitlab.com' do - let(:is_gitlab_com) { true } - - it 'hides the email-opt in by default' do - expect(subject).to have_css('.js-email-opt-in.hidden') - end - end - - context 'when not on gitlab.com' do - let(:is_gitlab_com) { false } - - it 'hides the email-opt in by default' do - expect(subject).not_to have_css('.js-email-opt-in.hidden') - expect(subject).to have_css('.js-email-opt-in') - end - end - end + it { is_expected.not_to have_selector('input[name="user[email_opted_in]"]') } end diff --git a/spec/views/search/show.html.haml_spec.rb b/spec/views/search/show.html.haml_spec.rb index eb763d424d3..a336ec91ff2 100644 --- a/spec/views/search/show.html.haml_spec.rb +++ b/spec/views/search/show.html.haml_spec.rb @@ -48,21 +48,50 @@ RSpec.describe 'search/show' do assign(:group, group) end - it 'renders meta tags for a group' do - render + context 'search with full count' do + before do + assign(:without_count, false) + end + + it 'renders meta tags for a group' do + render + + expect(view.page_description).to match(/\d+ issues for term '#{search_term}'/) + expect(view.page_card_attributes).to eq("Namespace" => group.full_path) + end - expect(view.page_description).to match(/\d+ issues for term '#{search_term}'/) - expect(view.page_card_attributes).to eq("Namespace" => group.full_path) + it 'renders meta tags for both group and project' do + project = build(:project, group: group) + assign(:project, project) + + render + + expect(view.page_description).to match(/\d+ issues for term '#{search_term}'/) + expect(view.page_card_attributes).to eq("Namespace" => group.full_path, "Project" => project.full_path) + end end - it 'renders meta tags for both group and project' do - project = build(:project, group: group) - assign(:project, project) + context 'search without full count' do + before do + assign(:without_count, true) + end + + it 'renders meta tags for a group' do + render + + expect(view.page_description).to match(/issues results for term '#{search_term}'/) + expect(view.page_card_attributes).to eq("Namespace" => group.full_path) + end + + it 'renders meta tags for both group and project' do + project = build(:project, group: group) + assign(:project, project) - render + render - expect(view.page_description).to match(/\d+ issues for term '#{search_term}'/) - expect(view.page_card_attributes).to eq("Namespace" => group.full_path, "Project" => project.full_path) + expect(view.page_description).to match(/issues results for term '#{search_term}'/) + expect(view.page_card_attributes).to eq("Namespace" => group.full_path, "Project" => project.full_path) + end end end end diff --git a/spec/views/shared/access_tokens/_table.html.haml_spec.rb b/spec/views/shared/access_tokens/_table.html.haml_spec.rb new file mode 100644 index 00000000000..489675b5683 --- /dev/null +++ b/spec/views/shared/access_tokens/_table.html.haml_spec.rb @@ -0,0 +1,166 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe 'shared/access_tokens/_table.html.haml' do + let(:type) { 'token' } + let(:type_plural) { 'tokens' } + let(:empty_message) { nil } + let(:token_expiry_enforced?) { false } + let(:impersonation) { false } + + let_it_be(:user) { create(:user) } + let_it_be(:tokens) { [create(:personal_access_token, user: user)] } + let_it_be(:project) { false } + + before do + stub_licensed_features(enforce_personal_access_token_expiration: true) + allow(Gitlab::CurrentSettings).to receive(:enforce_pat_expiration?).and_return(false) + + allow(view).to receive(:personal_access_token_expiration_enforced?).and_return(token_expiry_enforced?) + allow(view).to receive(:show_profile_token_expiry_notification?).and_return(true) + allow(view).to receive(:distance_of_time_in_words_to_now).and_return('4 days') + + if project + project.add_maintainer(user) + end + + # Forcibly removing scopes from one token as it's not possible to do with the current modal on creation + # But the check exists in the template (it may be there for legacy reasons), so we should test the outcome + if tokens.size > 1 + tokens[1].scopes = [] + end + + locals = { + type: type, + type_plural: type_plural, + active_tokens: tokens, + project: project, + impersonation: impersonation, + revoke_route_helper: ->(token) { 'path/' } + } + + if empty_message + locals[:no_active_tokens_message] = empty_message + end + + render partial: 'shared/access_tokens/table', locals: locals + end + + context 'if personal' do + it 'does not show non-personal content', :aggregate_failures do + expect(rendered).not_to have_content 'To see all the user\'s personal access tokens you must impersonate them first.' + expect(rendered).not_to have_selector 'th', text: 'Role' + end + + context 'if token expiration is enforced' do + let(:token_expiry_enforced?) { true } + + it 'does not show the subtext' do + expect(rendered).not_to have_content 'Personal access tokens are not revoked upon expiration.' + end + end + + context 'if token expiration is not enforced' do + let(:token_expiry_enforced?) { false } + + it 'does show the subtext' do + expect(rendered).to have_content 'Personal access tokens are not revoked upon expiration.' + end + end + end + + context 'if impersonation' do + let(:impersonation) { true } + + it 'shows the impersonation content', :aggregate_failures do + expect(rendered).to have_content 'To see all the user\'s personal access tokens you must impersonate them first.' + + expect(rendered).not_to have_content 'Personal access tokens are not revoked upon expiration.' + expect(rendered).not_to have_selector 'th', text: 'Role' + end + end + + context 'if project' do + let_it_be(:project) { create(:project) } + + it 'shows the project content', :aggregate_failures do + expect(rendered).to have_selector 'th', text: 'Role' + expect(rendered).to have_selector 'td', text: 'Maintainer' + + expect(rendered).not_to have_content 'Personal access tokens are not revoked upon expiration.' + expect(rendered).not_to have_content 'To see all the user\'s personal access tokens you must impersonate them first.' + end + end + + context 'without tokens' do + let_it_be(:tokens) { [] } + + it 'has the correct content', :aggregate_failures do + expect(rendered).to have_content 'Active tokens (0)' + expect(rendered).to have_content 'This user has no active tokens.' + end + + context 'with a custom empty text' do + let(:empty_message) { 'Custom empty message' } + + it 'shows the custom empty text' do + expect(rendered).to have_content empty_message + end + end + end + + context 'with tokens' do + let_it_be(:tokens) do + [ + create(:personal_access_token, user: user, name: 'Access token', last_used_at: 1.day.ago, expires_at: nil), + create(:personal_access_token, user: user, expires_at: 5.days.ago), + create(:personal_access_token, user: user, expires_at: Time.now), + create(:personal_access_token, user: user, expires_at: 5.days.from_now, scopes: [:read_api, :read_user]) + ] + end + + it 'has the correct content', :aggregate_failures do + # Heading content + expect(rendered).to have_content 'Active tokens (4)' + + # Table headers + expect(rendered).to have_selector 'th', text: 'Token name' + expect(rendered).to have_selector 'th', text: 'Scopes' + expect(rendered).to have_selector 'th', text: 'Created' + expect(rendered).to have_selector 'th', text: 'Last Used' + expect(rendered).to have_selector 'th', text: 'Expires' + + # Table contents + expect(rendered).to have_content 'Access token' + expect(rendered).to have_content 'read_api, read_user' + expect(rendered).to have_content 'no scopes selected' + expect(rendered).to have_content Time.now.to_date.to_s(:medium) + expect(rendered).to have_content l(1.day.ago, format: "%b %d, %Y") + + # Expiry + expect(rendered).to have_content 'Expired', count: 2 + expect(rendered).to have_content 'In 4 days' + + # Revoke buttons + expect(rendered).to have_link 'Revoke', href: 'path/', class: 'btn-danger-secondary', count: 1 + expect(rendered).to have_link 'Revoke', href: 'path/', count: 4 + end + + context 'without the last used time' do + let_it_be(:tokens) { [create(:personal_access_token, user: user, expires_at: 5.days.ago)] } + + it 'shows the last used empty text' do + expect(rendered).to have_content 'Never' + end + end + + context 'without expired at' do + let_it_be(:tokens) { [create(:personal_access_token, user: user, expires_at: nil, last_used_at: 1.day.ago)] } + + it 'shows the expired at empty text' do + expect(rendered).to have_content 'Never' + end + end + end +end diff --git a/spec/views/shared/deploy_tokens/_form.html.haml_spec.rb b/spec/views/shared/deploy_tokens/_form.html.haml_spec.rb index 3508ba8cca9..5ac42952f78 100644 --- a/spec/views/shared/deploy_tokens/_form.html.haml_spec.rb +++ b/spec/views/shared/deploy_tokens/_form.html.haml_spec.rb @@ -19,9 +19,9 @@ RSpec.describe 'shared/deploy_tokens/_form.html.haml' do render 'shared/deploy_tokens/form', token: token, group_or_project: subject if shows_package_registry_permissions - expect(rendered).to have_content('Allows read access to the package registry') + expect(rendered).to have_content('Allows read-only access to the package registry.') else - expect(rendered).not_to have_content('Allows read access to the package registry') + expect(rendered).not_to have_content('Allows read-only access to the package registry.') end end end |