diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2020-12-17 11:59:07 +0000 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2020-12-17 11:59:07 +0000 |
commit | 8b573c94895dc0ac0e1d9d59cf3e8745e8b539ca (patch) | |
tree | 544930fb309b30317ae9797a9683768705d664c4 /spec/features/admin | |
parent | 4b1de649d0168371549608993deac953eb692019 (diff) | |
download | gitlab-ce-8b573c94895dc0ac0e1d9d59cf3e8745e8b539ca.tar.gz |
Add latest changes from gitlab-org/gitlab@13-7-stable-eev13.7.0-rc42
Diffstat (limited to 'spec/features/admin')
37 files changed, 636 insertions, 446 deletions
diff --git a/spec/features/admin/admin_abuse_reports_spec.rb b/spec/features/admin/admin_abuse_reports_spec.rb index 845e186dd5b..192182adddc 100644 --- a/spec/features/admin/admin_abuse_reports_spec.rb +++ b/spec/features/admin/admin_abuse_reports_spec.rb @@ -7,7 +7,9 @@ RSpec.describe "Admin::AbuseReports", :js do context 'as an admin' do before do - sign_in(create(:admin)) + admin = create(:admin) + sign_in(admin) + gitlab_enable_admin_mode_sign_in(admin) end describe 'if a user has been reported for abuse' do diff --git a/spec/features/admin/admin_appearance_spec.rb b/spec/features/admin/admin_appearance_spec.rb index 48aaec6e6df..cd136af8d69 100644 --- a/spec/features/admin/admin_appearance_spec.rb +++ b/spec/features/admin/admin_appearance_spec.rb @@ -4,9 +4,11 @@ require 'spec_helper' RSpec.describe 'Admin Appearance' do let!(:appearance) { create(:appearance) } + let(:admin) { create(:admin) } - it 'Create new appearance' do - sign_in(create(:admin)) + it 'create new appearance' do + sign_in(admin) + gitlab_enable_admin_mode_sign_in(admin) visit admin_appearances_path fill_in 'appearance_title', with: 'MyCompany' @@ -25,8 +27,9 @@ RSpec.describe 'Admin Appearance' do expect(page).to have_content 'Last edit' end - it 'Preview sign-in page appearance' do - sign_in(create(:admin)) + it 'preview sign-in page appearance' do + sign_in(admin) + gitlab_enable_admin_mode_sign_in(admin) visit admin_appearances_path click_link "Sign-in page" @@ -34,8 +37,9 @@ RSpec.describe 'Admin Appearance' do expect_custom_sign_in_appearance(appearance) end - it 'Preview new project page appearance' do - sign_in(create(:admin)) + it 'preview new project page appearance' do + sign_in(admin) + gitlab_enable_admin_mode_sign_in(admin) visit admin_appearances_path click_link "New project page" @@ -45,7 +49,8 @@ RSpec.describe 'Admin Appearance' do context 'Custom system header and footer' do before do - sign_in(create(:admin)) + sign_in(admin) + gitlab_enable_admin_mode_sign_in(admin) end context 'when system header and footer messages are empty' do @@ -75,14 +80,15 @@ RSpec.describe 'Admin Appearance' do end end - it 'Custom sign-in page' do + it 'custom sign-in page' do visit new_user_session_path expect_custom_sign_in_appearance(appearance) end - it 'Custom new project page' do - sign_in create(:user) + it 'custom new project page' do + sign_in(admin) + gitlab_enable_admin_mode_sign_in(admin) visit new_project_path expect_custom_new_project_appearance(appearance) @@ -91,6 +97,7 @@ RSpec.describe 'Admin Appearance' do context 'Profile page with custom profile image guidelines' do before do sign_in(create(:admin)) + gitlab_enable_admin_mode_sign_in(admin) visit admin_appearances_path fill_in 'appearance_profile_image_guidelines', with: 'Custom profile image guidelines, please :smile:!' click_button 'Update appearance settings' @@ -104,8 +111,9 @@ RSpec.describe 'Admin Appearance' do end end - it 'Appearance logo' do - sign_in(create(:admin)) + it 'appearance logo' do + sign_in(admin) + gitlab_enable_admin_mode_sign_in(admin) visit admin_appearances_path attach_file(:appearance_logo, logo_fixture) @@ -116,8 +124,9 @@ RSpec.describe 'Admin Appearance' do expect(page).not_to have_css(logo_selector) end - it 'Header logos' do - sign_in(create(:admin)) + it 'header logos' do + sign_in(admin) + gitlab_enable_admin_mode_sign_in(admin) visit admin_appearances_path attach_file(:appearance_header_logo, logo_fixture) @@ -129,7 +138,8 @@ RSpec.describe 'Admin Appearance' do end it 'Favicon' do - sign_in(create(:admin)) + sign_in(admin) + gitlab_enable_admin_mode_sign_in(admin) visit admin_appearances_path attach_file(:appearance_favicon, logo_fixture) diff --git a/spec/features/admin/admin_broadcast_messages_spec.rb b/spec/features/admin/admin_broadcast_messages_spec.rb index 091ed0a3396..476dd4469bc 100644 --- a/spec/features/admin/admin_broadcast_messages_spec.rb +++ b/spec/features/admin/admin_broadcast_messages_spec.rb @@ -4,12 +4,14 @@ require 'spec_helper' RSpec.describe 'Admin Broadcast Messages' do before do - sign_in(create(:admin)) + admin = create(:admin) + sign_in(admin) + gitlab_enable_admin_mode_sign_in(admin) create(:broadcast_message, :expired, message: 'Migration to new server') visit admin_broadcast_messages_path end - it 'See broadcast messages list' do + it 'see broadcast messages list' do expect(page).to have_content 'Migration to new server' end @@ -42,7 +44,7 @@ RSpec.describe 'Admin Broadcast Messages' do expect(page).to have_selector 'strong', text: '4:00 CST to 5:00 CST' end - it 'Edit an existing broadcast message' do + it 'edit an existing broadcast message' do click_link 'Edit' fill_in 'broadcast_message_message', with: 'Application update RIGHT NOW' click_button 'Update broadcast message' @@ -51,7 +53,7 @@ RSpec.describe 'Admin Broadcast Messages' do expect(page).to have_content 'Application update RIGHT NOW' end - it 'Remove an existing broadcast message' do + it 'remove an existing broadcast message' do click_link 'Remove' expect(current_path).to eq admin_broadcast_messages_path diff --git a/spec/features/admin/admin_browse_spam_logs_spec.rb b/spec/features/admin/admin_browse_spam_logs_spec.rb index 65847876c11..471a7e8f0ab 100644 --- a/spec/features/admin/admin_browse_spam_logs_spec.rb +++ b/spec/features/admin/admin_browse_spam_logs_spec.rb @@ -6,10 +6,12 @@ RSpec.describe 'Admin browse spam logs' do let!(:spam_log) { create(:spam_log, description: 'abcde ' * 20) } before do - sign_in(create(:admin)) + admin = create(:admin) + sign_in(admin) + gitlab_enable_admin_mode_sign_in(admin) end - it 'Browse spam logs' do + it 'browse spam logs' do visit admin_spam_logs_path expect(page).to have_content('Spam Logs') diff --git a/spec/features/admin/admin_builds_spec.rb b/spec/features/admin/admin_builds_spec.rb index 166fde0f37a..42827dd5b49 100644 --- a/spec/features/admin/admin_builds_spec.rb +++ b/spec/features/admin/admin_builds_spec.rb @@ -4,7 +4,9 @@ require 'spec_helper' RSpec.describe 'Admin Builds' do before do - sign_in(create(:admin)) + admin = create(:admin) + sign_in(admin) + gitlab_enable_admin_mode_sign_in(admin) end describe 'GET /admin/builds' do diff --git a/spec/features/admin/admin_cohorts_spec.rb b/spec/features/admin/admin_cohorts_spec.rb index f91446ed222..982a9333275 100644 --- a/spec/features/admin/admin_cohorts_spec.rb +++ b/spec/features/admin/admin_cohorts_spec.rb @@ -4,7 +4,9 @@ require 'spec_helper' RSpec.describe 'Cohorts page' do before do - sign_in(create(:admin)) + admin = create(:admin) + sign_in(admin) + gitlab_enable_admin_mode_sign_in(admin) end context 'with usage ping enabled' do diff --git a/spec/features/admin/admin_deploy_keys_spec.rb b/spec/features/admin/admin_deploy_keys_spec.rb index 2039a6ff1ee..c326d0fd741 100644 --- a/spec/features/admin/admin_deploy_keys_spec.rb +++ b/spec/features/admin/admin_deploy_keys_spec.rb @@ -7,7 +7,9 @@ RSpec.describe 'admin deploy keys' do let!(:another_deploy_key) { create(:another_deploy_key, public: true) } before do - sign_in(create(:admin)) + admin = create(:admin) + sign_in(admin) + gitlab_enable_admin_mode_sign_in(admin) end it 'show all public deploy keys' do diff --git a/spec/features/admin/admin_dev_ops_report_spec.rb b/spec/features/admin/admin_dev_ops_report_spec.rb index 3b2c9d75870..a05fa0640d8 100644 --- a/spec/features/admin/admin_dev_ops_report_spec.rb +++ b/spec/features/admin/admin_dev_ops_report_spec.rb @@ -4,7 +4,9 @@ require 'spec_helper' RSpec.describe 'DevOps Report page', :js do before do - sign_in(create(:admin)) + admin = create(:admin) + sign_in(admin) + gitlab_enable_admin_mode_sign_in(admin) end context 'with devops_adoption feature flag disabled' do diff --git a/spec/features/admin/admin_disables_git_access_protocol_spec.rb b/spec/features/admin/admin_disables_git_access_protocol_spec.rb index d7feb21a8b3..f7f0592a315 100644 --- a/spec/features/admin/admin_disables_git_access_protocol_spec.rb +++ b/spec/features/admin/admin_disables_git_access_protocol_spec.rb @@ -12,6 +12,7 @@ RSpec.describe 'Admin disables Git access protocol', :js do before do stub_env('IN_MEMORY_APPLICATION_SETTINGS', 'false') sign_in(admin) + gitlab_enable_admin_mode_sign_in(admin) end context 'with HTTP disabled' do diff --git a/spec/features/admin/admin_disables_two_factor_spec.rb b/spec/features/admin/admin_disables_two_factor_spec.rb index 216c8ae36c7..1f34c4ed17c 100644 --- a/spec/features/admin/admin_disables_two_factor_spec.rb +++ b/spec/features/admin/admin_disables_two_factor_spec.rb @@ -4,7 +4,9 @@ require 'spec_helper' RSpec.describe 'Admin disables 2FA for a user' do it 'successfully', :js do - sign_in(create(:admin)) + admin = create(:admin) + sign_in(admin) + gitlab_enable_admin_mode_sign_in(admin) user = create(:user, :two_factor) edit_user(user) @@ -19,7 +21,9 @@ RSpec.describe 'Admin disables 2FA for a user' do end it 'for a user without 2FA enabled' do - sign_in(create(:admin)) + admin = create(:admin) + sign_in(admin) + gitlab_enable_admin_mode_sign_in(admin) user = create(:user) edit_user(user) diff --git a/spec/features/admin/admin_groups_spec.rb b/spec/features/admin/admin_groups_spec.rb index 96709cf8a12..0e350a5e12e 100644 --- a/spec/features/admin/admin_groups_spec.rb +++ b/spec/features/admin/admin_groups_spec.rb @@ -7,12 +7,14 @@ RSpec.describe 'Admin Groups' do include Spec::Support::Helpers::Features::MembersHelpers let(:internal) { Gitlab::VisibilityLevel::INTERNAL } - let(:user) { create :user } - let!(:group) { create :group } - let!(:current_user) { create(:admin) } + + let_it_be(:user) { create :user } + let_it_be(:group) { create :group } + let_it_be(:current_user) { create(:admin) } before do sign_in(current_user) + gitlab_enable_admin_mode_sign_in(current_user) stub_application_setting(default_group_visibility: internal) end @@ -25,6 +27,17 @@ RSpec.describe 'Admin Groups' do end describe 'create a group' do + describe 'with expected fields' do + it 'renders from as expected', :aggregate_failures do + visit new_admin_group_path + + expect(page).to have_field('name') + expect(page).to have_field('group_path') + expect(page).to have_field('group_visibility_level_0') + expect(page).to have_field('description') + end + end + it 'creates new group' do visit admin_groups_path diff --git a/spec/features/admin/admin_health_check_spec.rb b/spec/features/admin/admin_health_check_spec.rb index dfc7f5f6f84..0f6cba6c105 100644 --- a/spec/features/admin/admin_health_check_spec.rb +++ b/spec/features/admin/admin_health_check_spec.rb @@ -9,6 +9,7 @@ RSpec.describe "Admin Health Check", :feature do before do stub_env('IN_MEMORY_APPLICATION_SETTINGS', 'false') sign_in(admin) + gitlab_enable_admin_mode_sign_in(admin) end describe '#show' do diff --git a/spec/features/admin/admin_hook_logs_spec.rb b/spec/features/admin/admin_hook_logs_spec.rb index f4a70621cee..3f63bf9a15c 100644 --- a/spec/features/admin/admin_hook_logs_spec.rb +++ b/spec/features/admin/admin_hook_logs_spec.rb @@ -8,7 +8,9 @@ RSpec.describe 'Admin::HookLogs' do let(:hook_log) { create(:web_hook_log, web_hook: system_hook, internal_error_message: 'some error') } before do - sign_in(create(:admin)) + admin = create(:admin) + sign_in(admin) + gitlab_enable_admin_mode_sign_in(admin) end it 'show list of hook logs' do diff --git a/spec/features/admin/admin_hooks_spec.rb b/spec/features/admin/admin_hooks_spec.rb index 1c14d65a1cd..3fed402267c 100644 --- a/spec/features/admin/admin_hooks_spec.rb +++ b/spec/features/admin/admin_hooks_spec.rb @@ -7,6 +7,7 @@ RSpec.describe 'Admin::Hooks' do before do sign_in(user) + gitlab_enable_admin_mode_sign_in(user) end describe 'GET /admin/hooks' do diff --git a/spec/features/admin/admin_labels_spec.rb b/spec/features/admin/admin_labels_spec.rb index 35638e0829b..815a73b1450 100644 --- a/spec/features/admin/admin_labels_spec.rb +++ b/spec/features/admin/admin_labels_spec.rb @@ -7,7 +7,9 @@ RSpec.describe 'admin issues labels' do let!(:feature_label) { Label.create(title: 'feature', template: true) } before do - sign_in(create(:admin)) + admin = create(:admin) + sign_in(admin) + gitlab_enable_admin_mode_sign_in(admin) end describe 'list' do diff --git a/spec/features/admin/admin_manage_applications_spec.rb b/spec/features/admin/admin_manage_applications_spec.rb index 7a9a6f2ccb8..e54837ede11 100644 --- a/spec/features/admin/admin_manage_applications_spec.rb +++ b/spec/features/admin/admin_manage_applications_spec.rb @@ -4,7 +4,9 @@ require 'spec_helper' RSpec.describe 'admin manage applications' do before do - sign_in(create(:admin)) + admin = create(:admin) + sign_in(admin) + gitlab_enable_admin_mode_sign_in(admin) end it 'creates new oauth application' do diff --git a/spec/features/admin/admin_mode/login_spec.rb b/spec/features/admin/admin_mode/login_spec.rb index 7cbba9ec674..f1dee075925 100644 --- a/spec/features/admin/admin_mode/login_spec.rb +++ b/spec/features/admin/admin_mode/login_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Admin Mode Login', :clean_gitlab_redis_shared_state, :do_not_mock_admin_mode do +RSpec.describe 'Admin Mode Login' do include TermsHelper include UserLoginHelper include LdapHelpers diff --git a/spec/features/admin/admin_mode/logout_spec.rb b/spec/features/admin/admin_mode/logout_spec.rb index b4d49fe760f..b7fa59bbfb7 100644 --- a/spec/features/admin/admin_mode/logout_spec.rb +++ b/spec/features/admin/admin_mode/logout_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Admin Mode Logout', :js, :clean_gitlab_redis_shared_state, :do_not_mock_admin_mode do +RSpec.describe 'Admin Mode Logout', :js do include TermsHelper include UserLoginHelper diff --git a/spec/features/admin/admin_mode/workers_spec.rb b/spec/features/admin/admin_mode/workers_spec.rb index d037f5555dc..fbbcf19063b 100644 --- a/spec/features/admin/admin_mode/workers_spec.rb +++ b/spec/features/admin/admin_mode/workers_spec.rb @@ -3,7 +3,7 @@ require 'spec_helper' # Test an operation that triggers background jobs requiring administrative rights -RSpec.describe 'Admin mode for workers', :do_not_mock_admin_mode, :request_store, :clean_gitlab_redis_shared_state do +RSpec.describe 'Admin mode for workers', :request_store do let(:user) { create(:user) } let(:user_to_delete) { create(:user) } diff --git a/spec/features/admin/admin_mode_spec.rb b/spec/features/admin/admin_mode_spec.rb index 3b4edbc1a07..8169b3a20db 100644 --- a/spec/features/admin/admin_mode_spec.rb +++ b/spec/features/admin/admin_mode_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Admin mode', :clean_gitlab_redis_shared_state, :do_not_mock_admin_mode do +RSpec.describe 'Admin mode' do include MobileHelpers include StubENV diff --git a/spec/features/admin/admin_projects_spec.rb b/spec/features/admin/admin_projects_spec.rb index 522da760062..ff4e592234b 100644 --- a/spec/features/admin/admin_projects_spec.rb +++ b/spec/features/admin/admin_projects_spec.rb @@ -11,6 +11,7 @@ RSpec.describe "Admin::Projects" do before do sign_in(current_user) + gitlab_enable_admin_mode_sign_in(current_user) end describe "GET /admin/projects" do diff --git a/spec/features/admin/admin_requests_profiles_spec.rb b/spec/features/admin/admin_requests_profiles_spec.rb index c649fdd8e19..e92528d431d 100644 --- a/spec/features/admin/admin_requests_profiles_spec.rb +++ b/spec/features/admin/admin_requests_profiles_spec.rb @@ -7,7 +7,9 @@ RSpec.describe 'Admin::RequestsProfilesController' do before do stub_const('Gitlab::RequestProfiler::PROFILES_DIR', tmpdir) - sign_in(create(:admin)) + admin = create(:admin) + sign_in(admin) + gitlab_enable_admin_mode_sign_in(admin) end after do diff --git a/spec/features/admin/admin_runners_spec.rb b/spec/features/admin/admin_runners_spec.rb index 0e20ccf6bec..e16cde3fa1c 100644 --- a/spec/features/admin/admin_runners_spec.rb +++ b/spec/features/admin/admin_runners_spec.rb @@ -9,7 +9,9 @@ RSpec.describe "Admin Runners" do before do stub_env('IN_MEMORY_APPLICATION_SETTINGS', 'false') - sign_in(create(:admin)) + admin = create(:admin) + sign_in(admin) + gitlab_enable_admin_mode_sign_in(admin) end describe "Runners page" do @@ -282,6 +284,12 @@ RSpec.describe "Admin Runners" do visit admin_runner_path(runner) end + describe 'runner page breadcrumbs' do + it 'contains the current runner’s short sha' do + expect(page.find('h2')).to have_content(runner.short_sha) + end + end + describe 'projects' do it 'contains project names' do expect(page).to have_content(@project1.full_name) diff --git a/spec/features/admin/admin_sees_project_statistics_spec.rb b/spec/features/admin/admin_sees_project_statistics_spec.rb index d94889b825a..be781730924 100644 --- a/spec/features/admin/admin_sees_project_statistics_spec.rb +++ b/spec/features/admin/admin_sees_project_statistics_spec.rb @@ -7,6 +7,7 @@ RSpec.describe "Admin > Admin sees project statistics" do before do sign_in(current_user) + gitlab_enable_admin_mode_sign_in(current_user) visit admin_project_path(project) end @@ -15,7 +16,7 @@ RSpec.describe "Admin > Admin sees project statistics" do let(:project) { create(:project, :repository) } it "shows project statistics" do - expect(page).to have_content("Storage: 0 Bytes (Repository: 0 Bytes / Wikis: 0 Bytes / Build Artifacts: 0 Bytes / LFS: 0 Bytes / Snippets: 0 Bytes)") + expect(page).to have_content("Storage: 0 Bytes (Repository: 0 Bytes / Wikis: 0 Bytes / Build Artifacts: 0 Bytes / LFS: 0 Bytes / Snippets: 0 Bytes / Packages: 0 Bytes / Uploads: 0 Bytes)") end end diff --git a/spec/features/admin/admin_sees_projects_statistics_spec.rb b/spec/features/admin/admin_sees_projects_statistics_spec.rb index 786fa98255c..2e96814d1e9 100644 --- a/spec/features/admin/admin_sees_projects_statistics_spec.rb +++ b/spec/features/admin/admin_sees_projects_statistics_spec.rb @@ -10,6 +10,7 @@ RSpec.describe "Admin > Admin sees projects statistics" do create(:project, :repository) { |project| project.statistics.destroy } sign_in(current_user) + gitlab_enable_admin_mode_sign_in(current_user) visit admin_projects_path end diff --git a/spec/features/admin/admin_serverless_domains_spec.rb b/spec/features/admin/admin_serverless_domains_spec.rb index 256887f425f..0312e82e1ba 100644 --- a/spec/features/admin/admin_serverless_domains_spec.rb +++ b/spec/features/admin/admin_serverless_domains_spec.rb @@ -7,10 +7,12 @@ RSpec.describe 'Admin Serverless Domains', :js do before do allow(Gitlab.config.pages).to receive(:enabled).and_return(true) - sign_in(create(:admin)) + admin = create(:admin) + sign_in(admin) + gitlab_enable_admin_mode_sign_in(admin) end - it 'Add domain with certificate' do + it 'add domain with certificate' do visit admin_serverless_domains_path fill_in 'pages_domain[domain]', with: 'foo.com' @@ -30,7 +32,7 @@ RSpec.describe 'Admin Serverless Domains', :js do expect(page).to have_content '/CN=test-certificate' end - it 'Update domain certificate' do + it 'update domain certificate' do visit admin_serverless_domains_path fill_in 'pages_domain[domain]', with: 'foo.com' @@ -60,7 +62,7 @@ RSpec.describe 'Admin Serverless Domains', :js do context 'when domain exists' do let!(:domain) { create(:pages_domain, :instance_serverless) } - it 'Displays a modal when attempting to delete a domain' do + it 'displays a modal when attempting to delete a domain' do visit admin_serverless_domains_path click_button 'Delete domain' @@ -71,7 +73,7 @@ RSpec.describe 'Admin Serverless Domains', :js do end end - it 'Displays a modal with disabled button if unable to delete a domain' do + it 'displays a modal with disabled button if unable to delete a domain' do create(:serverless_domain_cluster, pages_domain: domain) visit admin_serverless_domains_path diff --git a/spec/features/admin/admin_settings_spec.rb b/spec/features/admin/admin_settings_spec.rb index 8929abc7edc..06d31b544ea 100644 --- a/spec/features/admin/admin_settings_spec.rb +++ b/spec/features/admin/admin_settings_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Admin updates settings', :clean_gitlab_redis_shared_state, :do_not_mock_admin_mode do +RSpec.describe 'Admin updates settings' do include StubENV include TermsHelper include UsageDataHelpers @@ -24,7 +24,7 @@ RSpec.describe 'Admin updates settings', :clean_gitlab_redis_shared_state, :do_n visit general_admin_application_settings_path end - it 'Change visibility settings' do + it 'change visibility settings' do page.within('.as-visibility-access') do choose "application_setting_default_project_visibility_20" click_button 'Save changes' @@ -33,7 +33,7 @@ RSpec.describe 'Admin updates settings', :clean_gitlab_redis_shared_state, :do_n expect(page).to have_content "Application settings saved successfully" end - it 'Uncheck all restricted visibility levels' do + it 'uncheck all restricted visibility levels' do page.within('.as-visibility-access') do find('#application_setting_visibility_level_0').set(false) find('#application_setting_visibility_level_10').set(false) @@ -47,7 +47,7 @@ RSpec.describe 'Admin updates settings', :clean_gitlab_redis_shared_state, :do_n expect(find('#application_setting_visibility_level_20')).not_to be_checked end - it 'Modify import sources' do + it 'modify import sources' do expect(current_settings.import_sources).not_to be_empty page.within('.as-visibility-access') do @@ -70,7 +70,7 @@ RSpec.describe 'Admin updates settings', :clean_gitlab_redis_shared_state, :do_n expect(current_settings.import_sources).to eq(['git']) end - it 'Change Visibility and Access Controls' do + it 'change Visibility and Access Controls' do page.within('.as-visibility-access') do uncheck 'Project export enabled' click_button 'Save changes' @@ -80,7 +80,7 @@ RSpec.describe 'Admin updates settings', :clean_gitlab_redis_shared_state, :do_n expect(page).to have_content "Application settings saved successfully" end - it 'Change Keys settings' do + it 'change Keys settings' do page.within('.as-visibility-access') do select 'Are forbidden', from: 'RSA SSH keys' select 'Are allowed', from: 'DSA SSH keys' @@ -98,7 +98,7 @@ RSpec.describe 'Admin updates settings', :clean_gitlab_redis_shared_state, :do_n expect(find_field('ED25519 SSH keys').value).to eq(forbidden) end - it 'Change Account and Limit Settings' do + it 'change Account and Limit Settings' do page.within('.as-account-limit') do uncheck 'Gravatar enabled' click_button 'Save changes' @@ -108,7 +108,7 @@ RSpec.describe 'Admin updates settings', :clean_gitlab_redis_shared_state, :do_n expect(page).to have_content "Application settings saved successfully" end - it 'Change Maximum import size' do + it 'change Maximum import size' do page.within('.as-account-limit') do fill_in 'Maximum import size (MB)', with: 15 click_button 'Save changes' @@ -118,7 +118,7 @@ RSpec.describe 'Admin updates settings', :clean_gitlab_redis_shared_state, :do_n expect(page).to have_content "Application settings saved successfully" end - it 'Change New users set to external', :js do + it 'change New users set to external', :js do user_internal_regex = find('#application_setting_user_default_internal_regex', visible: :all) expect(user_internal_regex).to be_readonly @@ -144,7 +144,7 @@ RSpec.describe 'Admin updates settings', :clean_gitlab_redis_shared_state, :do_n end end - it 'Change Sign-in restrictions' do + it 'change Sign-in restrictions' do page.within('.as-signin') do fill_in 'Home page URL', with: 'https://about.gitlab.com/' click_button 'Save changes' @@ -154,7 +154,7 @@ RSpec.describe 'Admin updates settings', :clean_gitlab_redis_shared_state, :do_n expect(page).to have_content "Application settings saved successfully" end - it 'Terms of Service' do + it 'terms of Service' do # Already have the admin accept terms, so they don't need to accept in this spec. _existing_terms = create(:term) accept_terms(admin) @@ -170,7 +170,7 @@ RSpec.describe 'Admin updates settings', :clean_gitlab_redis_shared_state, :do_n expect(page).to have_content 'Application settings saved successfully' end - it 'Modify oauth providers' do + it 'modify oauth providers' do expect(current_settings.disabled_oauth_sign_in_sources).to be_empty page.within('.as-signin') do @@ -190,7 +190,7 @@ RSpec.describe 'Admin updates settings', :clean_gitlab_redis_shared_state, :do_n expect(current_settings.disabled_oauth_sign_in_sources).not_to include('google_oauth2') end - it 'Oauth providers do not raise validation errors when saving unrelated changes' do + it 'oauth providers do not raise validation errors when saving unrelated changes' do expect(current_settings.disabled_oauth_sign_in_sources).to be_empty page.within('.as-signin') do @@ -213,7 +213,7 @@ RSpec.describe 'Admin updates settings', :clean_gitlab_redis_shared_state, :do_n expect(current_settings.disabled_oauth_sign_in_sources).to include('google_oauth2') end - it 'Configure web terminal' do + it 'configure web terminal' do page.within('.as-terminal') do fill_in 'Max session time', with: 15 click_button 'Save changes' @@ -255,7 +255,7 @@ RSpec.describe 'Admin updates settings', :clean_gitlab_redis_shared_state, :do_n visit general_admin_application_settings_path end - it 'Enable hiding third party offers' do + it 'enable hiding third party offers' do page.within('.as-third-party-offers') do check 'Do not display offers from third parties within GitLab' click_button 'Save changes' @@ -265,7 +265,7 @@ RSpec.describe 'Admin updates settings', :clean_gitlab_redis_shared_state, :do_n expect(current_settings.hide_third_party_offers).to be true end - it 'Change Slack Notifications Service template settings', :js do + it 'change Slack Notifications Service template settings', :js do first(:link, 'Service Templates').click click_link 'Slack notifications' fill_in 'Webhook', with: 'http://localhost' @@ -315,7 +315,7 @@ RSpec.describe 'Admin updates settings', :clean_gitlab_redis_shared_state, :do_n end context 'CI/CD page' do - it 'Change CI/CD settings' do + it 'change CI/CD settings' do visit ci_cd_admin_application_settings_path page.within('.as-ci-cd') do @@ -380,7 +380,7 @@ RSpec.describe 'Admin updates settings', :clean_gitlab_redis_shared_state, :do_n end context 'Repository page' do - it 'Change Repository storage settings' do + it 'change Repository storage settings' do visit repository_admin_application_settings_path page.within('.as-repository-storage') do @@ -393,7 +393,7 @@ RSpec.describe 'Admin updates settings', :clean_gitlab_redis_shared_state, :do_n end context 'Reporting page' do - it 'Change Spam settings' do + it 'change Spam settings' do visit reporting_admin_application_settings_path page.within('.as-spam') do @@ -421,7 +421,7 @@ RSpec.describe 'Admin updates settings', :clean_gitlab_redis_shared_state, :do_n visit metrics_and_profiling_admin_application_settings_path end - it 'Change Prometheus settings' do + it 'change Prometheus settings' do page.within('.as-prometheus') do check 'Enable Prometheus Metrics' click_button 'Save changes' @@ -431,7 +431,7 @@ RSpec.describe 'Admin updates settings', :clean_gitlab_redis_shared_state, :do_n expect(page).to have_content "Application settings saved successfully" end - it 'Change Performance bar settings' do + it 'change Performance bar settings' do group = create(:group) page.within('.as-performance-bar') do @@ -474,7 +474,7 @@ RSpec.describe 'Admin updates settings', :clean_gitlab_redis_shared_state, :do_n end context 'Network page' do - it 'Changes Outbound requests settings' do + it 'changes Outbound requests settings' do visit network_admin_application_settings_path page.within('.as-outbound') do @@ -492,7 +492,7 @@ RSpec.describe 'Admin updates settings', :clean_gitlab_redis_shared_state, :do_n expect(current_settings.dns_rebinding_protection_enabled).to be false end - it 'Changes Issues rate limits settings' do + it 'changes Issues rate limits settings' do visit network_admin_application_settings_path page.within('.as-issue-limits') do @@ -510,7 +510,7 @@ RSpec.describe 'Admin updates settings', :clean_gitlab_redis_shared_state, :do_n visit preferences_admin_application_settings_path end - it 'Change Help page' do + it 'change Help page' do stub_feature_flags(help_page_documentation_redirect: true) new_support_url = 'http://example.com/help' @@ -531,7 +531,7 @@ RSpec.describe 'Admin updates settings', :clean_gitlab_redis_shared_state, :do_n expect(page).to have_content "Application settings saved successfully" end - it 'Change Pages settings' do + it 'change Pages settings' do page.within('.as-pages') do fill_in 'Maximum size of pages (MB)', with: 15 check 'Require users to prove ownership of custom domains' @@ -543,7 +543,7 @@ RSpec.describe 'Admin updates settings', :clean_gitlab_redis_shared_state, :do_n expect(page).to have_content "Application settings saved successfully" end - it 'Change Real-time features settings' do + it 'change Real-time features settings' do page.within('.as-realtime') do fill_in 'Polling interval multiplier', with: 5.0 click_button 'Save changes' @@ -564,7 +564,7 @@ RSpec.describe 'Admin updates settings', :clean_gitlab_redis_shared_state, :do_n .to have_content "The form contains the following error: Polling interval multiplier must be greater than or equal to 0" end - it "Change Pages Let's Encrypt settings" do + it "change Pages Let's Encrypt settings" do visit preferences_admin_application_settings_path page.within('.as-pages') do fill_in 'Email', with: 'my@test.example.com' @@ -578,7 +578,7 @@ RSpec.describe 'Admin updates settings', :clean_gitlab_redis_shared_state, :do_n end context 'Nav bar' do - it 'Shows default help links in nav' do + it 'shows default help links in nav' do default_support_url = 'https://about.gitlab.com/getting-help/' visit root_dashboard_path @@ -591,7 +591,7 @@ RSpec.describe 'Admin updates settings', :clean_gitlab_redis_shared_state, :do_n end end - it 'Shows custom support url in nav when set' do + it 'shows custom support url in nav when set' do new_support_url = 'http://example.com/help' stub_application_setting(help_page_support_url: new_support_url) diff --git a/spec/features/admin/admin_system_info_spec.rb b/spec/features/admin/admin_system_info_spec.rb index 6a0448fd890..2225f25aa1e 100644 --- a/spec/features/admin/admin_system_info_spec.rb +++ b/spec/features/admin/admin_system_info_spec.rb @@ -4,7 +4,9 @@ require 'spec_helper' RSpec.describe 'Admin System Info' do before do - sign_in(create(:admin)) + admin = create(:admin) + sign_in(admin) + gitlab_enable_admin_mode_sign_in(admin) end describe 'GET /admin/system_info' do diff --git a/spec/features/admin/admin_users_impersonation_tokens_spec.rb b/spec/features/admin/admin_users_impersonation_tokens_spec.rb index ec3dd322f97..cae190e76b0 100644 --- a/spec/features/admin/admin_users_impersonation_tokens_spec.rb +++ b/spec/features/admin/admin_users_impersonation_tokens_spec.rb @@ -20,6 +20,7 @@ RSpec.describe 'Admin > Users > Impersonation Tokens', :js do before do sign_in(admin) + gitlab_enable_admin_mode_sign_in(admin) end describe "token creation" do diff --git a/spec/features/admin/admin_uses_repository_checks_spec.rb b/spec/features/admin/admin_uses_repository_checks_spec.rb index 0fb5124f673..0e448446085 100644 --- a/spec/features/admin/admin_uses_repository_checks_spec.rb +++ b/spec/features/admin/admin_uses_repository_checks_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Admin uses repository checks', :request_store, :clean_gitlab_redis_shared_state, :do_not_mock_admin_mode do +RSpec.describe 'Admin uses repository checks', :request_store do include StubENV let(:admin) { create(:admin) } diff --git a/spec/features/admin/clusters/applications_spec.rb b/spec/features/admin/clusters/applications_spec.rb index 3bcadfdbfc1..e083e4fee4c 100644 --- a/spec/features/admin/clusters/applications_spec.rb +++ b/spec/features/admin/clusters/applications_spec.rb @@ -10,6 +10,7 @@ RSpec.describe 'Instance-level Cluster Applications', :js do before do sign_in(user) + gitlab_enable_admin_mode_sign_in(user) end describe 'Installing applications' do diff --git a/spec/features/admin/clusters/eks_spec.rb b/spec/features/admin/clusters/eks_spec.rb index ad7122bf182..a1bac720349 100644 --- a/spec/features/admin/clusters/eks_spec.rb +++ b/spec/features/admin/clusters/eks_spec.rb @@ -7,6 +7,7 @@ RSpec.describe 'Instance-level AWS EKS Cluster', :js do before do sign_in(user) + gitlab_enable_admin_mode_sign_in(user) end context 'when user does not have a cluster and visits group clusters page' do diff --git a/spec/features/admin/dashboard_spec.rb b/spec/features/admin/dashboard_spec.rb index acb8fb54e11..c040811ada1 100644 --- a/spec/features/admin/dashboard_spec.rb +++ b/spec/features/admin/dashboard_spec.rb @@ -6,7 +6,9 @@ RSpec.describe 'admin visits dashboard' do include ProjectForksHelper before do - sign_in(create(:admin)) + admin = create(:admin) + sign_in(admin) + gitlab_enable_admin_mode_sign_in(admin) end context 'counting forks', :js do diff --git a/spec/features/admin/services/admin_activates_prometheus_spec.rb b/spec/features/admin/services/admin_activates_prometheus_spec.rb index 199eae59afc..a225de365c8 100644 --- a/spec/features/admin/services/admin_activates_prometheus_spec.rb +++ b/spec/features/admin/services/admin_activates_prometheus_spec.rb @@ -7,6 +7,7 @@ RSpec.describe 'Admin activates Prometheus', :js do before do sign_in(admin) + gitlab_enable_admin_mode_sign_in(admin) visit(admin_application_settings_services_path) diff --git a/spec/features/admin/services/admin_visits_service_templates_spec.rb b/spec/features/admin/services/admin_visits_service_templates_spec.rb index a37e57304aa..563bca8b32f 100644 --- a/spec/features/admin/services/admin_visits_service_templates_spec.rb +++ b/spec/features/admin/services/admin_visits_service_templates_spec.rb @@ -8,6 +8,7 @@ RSpec.describe 'Admin visits service templates' do before do sign_in(admin) + gitlab_enable_admin_mode_sign_in(admin) visit(admin_application_settings_services_path) end diff --git a/spec/features/admin/users/user_spec.rb b/spec/features/admin/users/user_spec.rb new file mode 100644 index 00000000000..e7dd50ed514 --- /dev/null +++ b/spec/features/admin/users/user_spec.rb @@ -0,0 +1,372 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe 'Admin::Users::User' do + let_it_be(:user) { create(:omniauth_user, provider: 'twitter', extern_uid: '123456') } + let_it_be(:current_user) { create(:admin, last_activity_on: 5.days.ago) } + + before do + sign_in(current_user) + gitlab_enable_admin_mode_sign_in(current_user) + stub_feature_flags(vue_admin_users: false) + end + + describe 'GET /admin/users/:id' do + it 'has user info', :aggregate_failures do + visit admin_users_path + click_link user.name + + expect(page).to have_content(user.email) + expect(page).to have_content(user.name) + expect(page).to have_content("ID: #{user.id}") + expect(page).to have_content("Namespace ID: #{user.namespace_id}") + expect(page).to have_button('Deactivate user') + expect(page).to have_button('Block user') + expect(page).to have_button('Delete user') + expect(page).to have_button('Delete user and contributions') + end + + context 'user pending approval' do + it 'shows user info', :aggregate_failures do + user = create(:user, :blocked_pending_approval) + + visit admin_users_path + click_link 'Pending approval' + click_link user.name + + expect(page).to have_content(user.name) + expect(page).to have_content('Pending approval') + expect(page).to have_link('Approve user') + expect(page).to have_link('Reject request') + end + end + + context 'when blocking/unblocking the user' do + it 'shows confirmation and allows blocking and unblocking', :js do + visit admin_user_path(user) + + find('button', text: 'Block user').click + + wait_for_requests + + expect(page).to have_content('Block user') + expect(page).to have_content('You can always unblock their account, their data will remain intact.') + + find('.modal-footer button', text: 'Block').click + + wait_for_requests + + expect(page).to have_content('Successfully blocked') + expect(page).to have_content('This user is blocked') + + find('button', text: 'Unblock user').click + + wait_for_requests + + expect(page).to have_content('Unblock user') + expect(page).to have_content('You can always block their account again if needed.') + + find('.modal-footer button', text: 'Unblock').click + + wait_for_requests + + expect(page).to have_content('Successfully unblocked') + expect(page).to have_content('Block this user') + end + end + + context 'when deactivating/re-activating the user' do + it 'shows confirmation and allows deactivating/re-activating', :js do + visit admin_user_path(user) + + find('button', text: 'Deactivate user').click + + wait_for_requests + + expect(page).to have_content('Deactivate user') + expect(page).to have_content('You can always re-activate their account, their data will remain intact.') + + find('.modal-footer button', text: 'Deactivate').click + + wait_for_requests + + expect(page).to have_content('Successfully deactivated') + expect(page).to have_content('Reactivate this user') + + find('button', text: 'Activate user').click + + wait_for_requests + + expect(page).to have_content('Activate user') + expect(page).to have_content('You can always deactivate their account again if needed.') + + find('.modal-footer button', text: 'Activate').click + + wait_for_requests + + expect(page).to have_content('Successfully activated') + expect(page).to have_content('Deactivate this user') + end + end + + describe 'Impersonation' do + let_it_be(:another_user) { create(:user) } + + context 'before impersonating' do + subject { visit admin_user_path(user_to_visit) } + + let(:user_to_visit) { another_user } + + context 'for other users' do + it 'shows impersonate button for other users' do + subject + + expect(page).to have_content('Impersonate') + end + end + + context 'for admin itself' do + let(:user_to_visit) { current_user } + + it 'does not show impersonate button for admin itself' do + subject + + expect(page).not_to have_content('Impersonate') + end + end + + context 'for blocked user' do + before do + another_user.block + end + + it 'does not show impersonate button for blocked user' do + subject + + expect(page).not_to have_content('Impersonate') + end + end + + context 'when impersonation is disabled' do + before do + stub_config_setting(impersonation_enabled: false) + end + + it 'does not show impersonate button' do + subject + + expect(page).not_to have_content('Impersonate') + end + end + end + + context 'when impersonating' do + subject { click_link 'Impersonate' } + + before do + visit admin_user_path(another_user) + end + + it 'logs in as the user when impersonate is clicked' do + subject + + expect(page.find(:css, '.header-user .profile-link')['data-user']).to eql(another_user.username) + end + + it 'sees impersonation log out icon' do + subject + + icon = first('[data-testid="incognito-icon"]') + expect(icon).not_to be nil + end + + context 'a user with an expired password' do + before do + another_user.update!(password_expires_at: Time.now - 5.minutes) + end + + it 'does not redirect to password change page' do + subject + + expect(current_path).to eq('/') + end + end + end + + context 'ending impersonation' do + subject { find(:css, 'li.impersonation a').click } + + before do + visit admin_user_path(another_user) + click_link 'Impersonate' + end + + it 'logs out of impersonated user back to original user' do + subject + + expect(page.find(:css, '.header-user .profile-link')['data-user']).to eq(current_user.username) + end + + it 'is redirected back to the impersonated users page in the admin after stopping' do + subject + + expect(current_path).to eq("/admin/users/#{another_user.username}") + end + + context 'a user with an expired password' do + before do + another_user.update!(password_expires_at: Time.now - 5.minutes) + end + + it 'is redirected back to the impersonated users page in the admin after stopping' do + subject + + expect(current_path).to eq("/admin/users/#{another_user.username}") + end + end + end + end + + describe 'Two-factor Authentication status' do + it 'shows when enabled' do + user.update!(otp_required_for_login: true) + + visit admin_user_path(user) + + expect_two_factor_status('Enabled') + end + + it 'shows when disabled' do + visit admin_user_path(user) + + expect_two_factor_status('Disabled') + end + + def expect_two_factor_status(status) + page.within('.two-factor-status') do + expect(page).to have_content(status) + end + end + end + + describe 'Email verification status' do + let!(:secondary_email) do + create :email, email: 'secondary@example.com', user: user + end + + it 'displays the correct status for an unverified email address', :aggregate_failures do + user.update!(confirmed_at: nil, unconfirmed_email: user.email) + visit admin_user_path(user) + + expect(page).to have_content("#{user.email} Unverified") + expect(page).to have_content("#{secondary_email.email} Unverified") + end + + it 'displays the correct status for a verified email address' do + visit admin_user_path(user) + expect(page).to have_content("#{user.email} Verified") + + secondary_email.confirm + expect(secondary_email.confirmed?).to be_truthy + + visit admin_user_path(user) + expect(page).to have_content("#{secondary_email.email} Verified") + end + end + end + + describe 'show user attributes' do + it 'has expected attributes', :aggregate_failures do + visit admin_users_path + + click_link user.name + + expect(page).to have_content 'Account' + expect(page).to have_content 'Personal projects limit' + end + end + + describe 'remove users secondary email', :js do + let!(:secondary_email) do + create :email, email: 'secondary@example.com', user: user + end + + it do + visit admin_user_path(user.username) + + expect(page).to have_content("Secondary email: #{secondary_email.email}") + + accept_confirm { find("#remove_email_#{secondary_email.id}").click } + + expect(page).not_to have_content(secondary_email.email) + end + end + + describe 'show user keys', :js do + it do + key1 = create(:key, user: user, title: 'ssh-rsa Key1', key: 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC4FIEBXGi4bPU8kzxMefudPIJ08/gNprdNTaO9BR/ndy3+58s2HCTw2xCHcsuBmq+TsAqgEidVq4skpqoTMB+Uot5Uzp9z4764rc48dZiI661izoREoKnuRQSsRqUTHg5wrLzwxlQbl1MVfRWQpqiz/5KjBC7yLEb9AbusjnWBk8wvC1bQPQ1uLAauEA7d836tgaIsym9BrLsMVnR4P1boWD3Xp1B1T/ImJwAGHvRmP/ycIqmKdSpMdJXwxcb40efWVj0Ibbe7ii9eeoLdHACqevUZi6fwfbymdow+FeqlkPoHyGg3Cu4vD/D8+8cRc7mE/zGCWcQ15Var83Tczour Key1') + key2 = create(:key, user: user, title: 'ssh-rsa Key2', key: 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDQSTWXhJAX/He+nG78MiRRRn7m0Pb0XbcgTxE0etArgoFoh9WtvDf36HG6tOSg/0UUNcp0dICsNAmhBKdncp6cIyPaXJTURPRAGvhI0/VDk4bi27bRnccGbJ/hDaUxZMLhhrzY0r22mjVf8PF6dvv5QUIQVm1/LeaWYsHHvLgiIjwrXirUZPnFrZw6VLREoBKG8uWvfSXw1L5eapmstqfsME8099oi+vWLR8MgEysZQmD28M73fgW4zek6LDQzKQyJx9nB+hJkKUDvcuziZjGmRFlNgSA2mguERwL1OXonD8WYUrBDGKroIvBT39zS5d9tQDnidEJZ9Y8gv5ViYP7x Key2') + + visit admin_users_path + + click_link user.name + click_link 'SSH keys' + + expect(page).to have_content(key1.title) + expect(page).to have_content(key2.title) + + click_link key2.title + + expect(page).to have_content(key2.title) + expect(page).to have_content(key2.key) + + click_button 'Delete' + + page.within('.modal') do + page.click_button('Delete') + end + + expect(page).not_to have_content(key2.title) + end + end + + describe 'show user identities' do + it 'shows user identities', :aggregate_failures do + visit admin_user_identities_path(user) + + expect(page).to have_content(user.name) + expect(page).to have_content('twitter') + end + end + + describe 'update user identities' do + before do + allow(Gitlab::Auth::OAuth::Provider).to receive(:providers).and_return([:twitter, :twitter_updated]) + end + + it 'modifies twitter identity', :aggregate_failures do + visit admin_user_identities_path(user) + + find('.table').find(:link, 'Edit').click + fill_in 'identity_extern_uid', with: '654321' + select 'twitter_updated', from: 'identity_provider' + click_button 'Save changes' + + expect(page).to have_content(user.name) + expect(page).to have_content('twitter_updated') + expect(page).to have_content('654321') + end + end + + describe 'remove user with identities' do + it 'removes user with twitter identity', :aggregate_failures do + visit admin_user_identities_path(user) + + click_link 'Delete' + + expect(page).to have_content(user.name) + expect(page).not_to have_content('twitter') + end + end +end diff --git a/spec/features/admin/admin_users_spec.rb b/spec/features/admin/users/users_spec.rb index 97a30143a59..9482b4f8603 100644 --- a/spec/features/admin/admin_users_spec.rb +++ b/spec/features/admin/users/users_spec.rb @@ -2,21 +2,20 @@ require 'spec_helper' -RSpec.describe "Admin::Users" do +RSpec.describe 'Admin::Users' do include Spec::Support::Helpers::Features::ResponsiveTableHelpers - let!(:user) do - create(:omniauth_user, provider: 'twitter', extern_uid: '123456') - end - - let!(:current_user) { create(:admin, last_activity_on: 5.days.ago) } + let_it_be(:user, reload: true) { create(:omniauth_user, provider: 'twitter', extern_uid: '123456') } + let_it_be(:current_user) { create(:admin, last_activity_on: 5.days.ago) } before do sign_in(current_user) + gitlab_enable_admin_mode_sign_in(current_user) end - describe "GET /admin/users" do + describe 'GET /admin/users' do before do + stub_feature_flags(vue_admin_users: false) visit admin_users_path end @@ -27,8 +26,8 @@ RSpec.describe "Admin::Users" do it "has users list" do expect(page).to have_content(current_user.email) expect(page).to have_content(current_user.name) - expect(page).to have_content(current_user.created_at.strftime("%e %b, %Y")) - expect(page).to have_content(current_user.last_activity_on.strftime("%e %b, %Y")) + expect(page).to have_content(current_user.created_at.strftime('%e %b, %Y')) + expect(page).to have_content(current_user.last_activity_on.strftime('%e %b, %Y')) expect(page).to have_content(user.email) expect(page).to have_content(user.name) expect(page).to have_content('Projects') @@ -38,7 +37,7 @@ RSpec.describe "Admin::Users" do expect(page).to have_button('Delete user and contributions') end - describe "view extra user information" do + describe 'view extra user information' do it 'shows the user popover on hover', :js, quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/11290' do expect(page).not_to have_selector('#__BV_popover_1__') @@ -86,7 +85,7 @@ RSpec.describe "Admin::Users" do end describe 'search and sort' do - before do + before_all do create(:user, name: 'Foo Bar', last_activity_on: 3.days.ago) create(:user, name: 'Foo Baz', last_activity_on: 2.days.ago) create(:user, name: 'Dmitriy') @@ -205,15 +204,11 @@ RSpec.describe "Admin::Users" do end end - context 'when blocking a user' do - it 'shows confirmation and allows blocking', :js do + context 'when blocking/unblocking a user' do + it 'shows confirmation and allows blocking and unblocking', :js do expect(page).to have_content(user.email) - find("[data-testid='user-action-button-#{user.id}']").click - - within find("[data-testid='user-action-dropdown-#{user.id}']") do - find('li button', text: 'Block').click - end + click_action_in_user_dropdown(user.id, 'Block') wait_for_requests @@ -228,26 +223,92 @@ RSpec.describe "Admin::Users" do expect(page).to have_content('Successfully blocked') expect(page).not_to have_content(user.email) + + click_link 'Blocked' + + wait_for_requests + + expect(page).to have_content(user.email) + + click_action_in_user_dropdown(user.id, 'Unblock') + + expect(page).to have_content('Unblock user') + expect(page).to have_content('You can always block their account again if needed.') + + find('.modal-footer button', text: 'Unblock').click + + wait_for_requests + + expect(page).to have_content('Successfully unblocked') + expect(page).not_to have_content(user.email) + end + end + + context 'when deactivating/re-activating a user' do + it 'shows confirmation and allows deactivating and re-activating', :js do + expect(page).to have_content(user.email) + + click_action_in_user_dropdown(user.id, 'Deactivate') + + expect(page).to have_content('Deactivate user') + expect(page).to have_content('Deactivating a user has the following effects') + expect(page).to have_content('The user will be logged out') + expect(page).to have_content('Personal projects, group and user history will be left intact') + + find('.modal-footer button', text: 'Deactivate').click + + wait_for_requests + + expect(page).to have_content('Successfully deactivated') + expect(page).not_to have_content(user.email) + + click_link 'Deactivated' + + wait_for_requests + + expect(page).to have_content(user.email) + + click_action_in_user_dropdown(user.id, 'Activate') + + expect(page).to have_content('Activate user') + expect(page).to have_content('You can always deactivate their account again if needed.') + + find('.modal-footer button', text: 'Activate').click + + wait_for_requests + + expect(page).to have_content('Successfully activated') + expect(page).not_to have_content(user.email) end end + + def click_action_in_user_dropdown(user_id, action) + find("[data-testid='user-action-button-#{user_id}']").click + + within find("[data-testid='user-action-dropdown-#{user_id}']") do + find('li button', text: action).click + end + + wait_for_requests + end end - describe "GET /admin/users/new" do + describe 'GET /admin/users/new' do let(:user_username) { 'bang' } before do visit new_admin_user_path - fill_in "user_name", with: "Big Bang" - fill_in "user_username", with: user_username - fill_in "user_email", with: "bigbang@mail.com" + fill_in 'user_name', with: 'Big Bang' + fill_in 'user_username', with: user_username + fill_in 'user_email', with: 'bigbang@mail.com' end - it "creates new user" do - expect { click_button "Create user" }.to change {User.count}.by(1) + it 'creates new user' do + expect { click_button 'Create user' }.to change {User.count}.by(1) end - it "applies defaults to user" do - click_button "Create user" + it 'applies defaults to user' do + click_button 'Create user' user = User.find_by(username: 'bang') expect(user.projects_limit) .to eq(Gitlab.config.gitlab.default_projects_limit) @@ -255,24 +316,24 @@ RSpec.describe "Admin::Users" do .to eq(Gitlab.config.gitlab.default_can_create_group) end - it "creates user with valid data" do - click_button "Create user" + it 'creates user with valid data' do + click_button 'Create user' user = User.find_by(username: 'bang') expect(user.name).to eq('Big Bang') expect(user.email).to eq('bigbang@mail.com') end - it "calls send mail" do + it 'calls send mail' do expect_next_instance_of(NotificationService) do |instance| expect(instance).to receive(:new_user) end - click_button "Create user" + click_button 'Create user' end - it "sends valid email to user with email & password" do + it 'sends valid email to user with email & password' do perform_enqueued_jobs do - click_button "Create user" + click_button 'Create user' end user = User.find_by(username: 'bang') @@ -286,7 +347,7 @@ RSpec.describe "Admin::Users" do let(:user_username) { 'Bing bang' } it "doesn't create the user and shows an error message" do - expect { click_button "Create user" }.to change {User.count}.by(0) + expect { click_button 'Create user' }.to change {User.count}.by(0) expect(page).to have_content('The form contains the following error') expect(page).to have_content('Username can contain only letters, digits') @@ -356,252 +417,34 @@ RSpec.describe "Admin::Users" do end end - describe "GET /admin/users/:id" do - it "has user info" do - visit admin_users_path - click_link user.name - - expect(page).to have_content(user.email) - expect(page).to have_content(user.name) - expect(page).to have_content("ID: #{user.id}") - expect(page).to have_content("Namespace ID: #{user.namespace_id}") - expect(page).to have_button('Deactivate user') - expect(page).to have_button('Block user') - expect(page).to have_button('Delete user') - expect(page).to have_button('Delete user and contributions') - end - - context 'user pending approval' do - it 'shows user info' do - user = create(:user, :blocked_pending_approval) - - visit admin_users_path - click_link 'Pending approval' - click_link user.name - - expect(page).to have_content(user.name) - expect(page).to have_content('Pending approval') - expect(page).to have_link('Approve user') - expect(page).to have_button('Block user') - expect(page).to have_button('Delete user') - expect(page).to have_button('Delete user and contributions') - end - end - - context 'when blocking the user' do - it 'shows confirmation and allows blocking', :js do - visit admin_user_path(user) - - find('button', text: 'Block user').click - - wait_for_requests - - expect(page).to have_content('Block user') - expect(page).to have_content('You can always unblock their account, their data will remain intact.') - - find('.modal-footer button', text: 'Block').click - - wait_for_requests - - expect(page).to have_content('Successfully blocked') - expect(page).to have_content('This user is blocked') - end - end - - describe 'Impersonation' do - let(:another_user) { create(:user) } - - context 'before impersonating' do - subject { visit admin_user_path(user_to_visit) } - - let(:user_to_visit) { another_user } - - context 'for other users' do - it 'shows impersonate button for other users' do - subject - - expect(page).to have_content('Impersonate') - end - end - - context 'for admin itself' do - let(:user_to_visit) { current_user } - - it 'does not show impersonate button for admin itself' do - subject - - expect(page).not_to have_content('Impersonate') - end - end - - context 'for blocked user' do - before do - another_user.block - end - - it 'does not show impersonate button for blocked user' do - subject - - expect(page).not_to have_content('Impersonate') - end - end - - context 'when impersonation is disabled' do - before do - stub_config_setting(impersonation_enabled: false) - end - - it 'does not show impersonate button' do - subject - - expect(page).not_to have_content('Impersonate') - end - end - end - - context 'when impersonating' do - subject { click_link 'Impersonate' } - - before do - visit admin_user_path(another_user) - end - - it 'logs in as the user when impersonate is clicked' do - subject - - expect(page.find(:css, '.header-user .profile-link')['data-user']).to eql(another_user.username) - end - - it 'sees impersonation log out icon' do - subject - - icon = first('[data-testid="incognito-icon"]') - expect(icon).not_to be nil - end - - context 'a user with an expired password' do - before do - another_user.update(password_expires_at: Time.now - 5.minutes) - end - - it 'does not redirect to password change page' do - subject - - expect(current_path).to eq('/') - end - end - end - - context 'ending impersonation' do - subject { find(:css, 'li.impersonation a').click } - - before do - visit admin_user_path(another_user) - click_link 'Impersonate' - end - - it 'logs out of impersonated user back to original user' do - subject - - expect(page.find(:css, '.header-user .profile-link')['data-user']).to eq(current_user.username) - end - - it 'is redirected back to the impersonated users page in the admin after stopping' do - subject - - expect(current_path).to eq("/admin/users/#{another_user.username}") - end - - context 'a user with an expired password' do - before do - another_user.update(password_expires_at: Time.now - 5.minutes) - end - - it 'is redirected back to the impersonated users page in the admin after stopping' do - subject - - expect(current_path).to eq("/admin/users/#{another_user.username}") - end - end - end - end - - describe 'Two-factor Authentication status' do - it 'shows when enabled' do - user.update_attribute(:otp_required_for_login, true) - - visit admin_user_path(user) - - expect_two_factor_status('Enabled') - end - - it 'shows when disabled' do - visit admin_user_path(user) - - expect_two_factor_status('Disabled') - end - - def expect_two_factor_status(status) - page.within('.two-factor-status') do - expect(page).to have_content(status) - end - end - end - - describe 'Email verification status' do - let!(:secondary_email) do - create :email, email: 'secondary@example.com', user: user - end - - it 'displays the correct status for an unverified email address' do - user.update(confirmed_at: nil, unconfirmed_email: user.email) - visit admin_user_path(user) - - expect(page).to have_content("#{user.email} Unverified") - - expect(page).to have_content("#{secondary_email.email} Unverified") - end - - it 'displays the correct status for a verified email address' do - visit admin_user_path(user) - expect(page).to have_content("#{user.email} Verified") - - secondary_email.confirm - expect(secondary_email.confirmed?).to be_truthy - - visit admin_user_path(user) - expect(page).to have_content("#{secondary_email.email} Verified") - end - end - end - - describe "GET /admin/users/:id/edit" do + describe 'GET /admin/users/:id/edit' do before do + stub_feature_flags(vue_admin_users: false) visit admin_users_path click_link "edit_user_#{user.id}" end - it "has user edit page" do + it 'has user edit page' do expect(page).to have_content('Name') expect(page).to have_content('Password') end - describe "Update user" do + describe 'Update user' do before do - fill_in "user_name", with: "Big Bang" - fill_in "user_email", with: "bigbang@mail.com" - fill_in "user_password", with: "AValidPassword1" - fill_in "user_password_confirmation", with: "AValidPassword1" - choose "user_access_level_admin" - click_button "Save changes" + fill_in 'user_name', with: 'Big Bang' + fill_in 'user_email', with: 'bigbang@mail.com' + fill_in 'user_password', with: 'AValidPassword1' + fill_in 'user_password_confirmation', with: 'AValidPassword1' + choose 'user_access_level_admin' + click_button 'Save changes' end - it "shows page with new data" do + it 'shows page with new data' do expect(page).to have_content('bigbang@mail.com') expect(page).to have_content('Big Bang') end - it "changes user entry" do + it 'changes user entry' do user.reload expect(user.name).to eq('Big Bang') expect(user.admin?).to be_truthy @@ -623,9 +466,9 @@ RSpec.describe "Admin::Users" do end end - describe "GET /admin/users/:id/projects" do - let(:group) { create(:group) } - let!(:project) { create(:project, group: group) } + describe 'GET /admin/users/:id/projects' do + let_it_be(:group) { create(:group) } + let_it_be(:project) { create(:project, group: group) } before do group.add_developer(user) @@ -633,7 +476,7 @@ RSpec.describe "Admin::Users" do visit projects_admin_user_path(user) end - it "lists group projects" do + it 'lists group projects' do within(:css, '.gl-mb-3 + .card') do expect(page).to have_content 'Group projects' expect(page).to have_link group.name, href: admin_group_path(group) @@ -690,112 +533,13 @@ RSpec.describe "Admin::Users" do visit new_admin_user_identity_path(user) - check_breadcrumb("New Identity") + check_breadcrumb('New Identity') visit admin_user_identities_path(user) find('.table').find(:link, 'Edit').click - check_breadcrumb("Edit Identity") - end - end - - describe 'show user attributes' do - it do - visit admin_users_path - - click_link user.name - - expect(page).to have_content 'Account' - expect(page).to have_content 'Personal projects limit' - end - end - - describe 'remove users secondary email', :js do - let!(:secondary_email) do - create :email, email: 'secondary@example.com', user: user - end - - it do - visit admin_user_path(user.username) - - expect(page).to have_content("Secondary email: #{secondary_email.email}") - - accept_confirm { find("#remove_email_#{secondary_email.id}").click } - - expect(page).not_to have_content(secondary_email.email) - end - end - - describe 'show user keys', :js do - let!(:key1) do - create(:key, user: user, title: "ssh-rsa Key1", key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC4FIEBXGi4bPU8kzxMefudPIJ08/gNprdNTaO9BR/ndy3+58s2HCTw2xCHcsuBmq+TsAqgEidVq4skpqoTMB+Uot5Uzp9z4764rc48dZiI661izoREoKnuRQSsRqUTHg5wrLzwxlQbl1MVfRWQpqiz/5KjBC7yLEb9AbusjnWBk8wvC1bQPQ1uLAauEA7d836tgaIsym9BrLsMVnR4P1boWD3Xp1B1T/ImJwAGHvRmP/ycIqmKdSpMdJXwxcb40efWVj0Ibbe7ii9eeoLdHACqevUZi6fwfbymdow+FeqlkPoHyGg3Cu4vD/D8+8cRc7mE/zGCWcQ15Var83Tczour Key1") - end - - let!(:key2) do - create(:key, user: user, title: "ssh-rsa Key2", key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDQSTWXhJAX/He+nG78MiRRRn7m0Pb0XbcgTxE0etArgoFoh9WtvDf36HG6tOSg/0UUNcp0dICsNAmhBKdncp6cIyPaXJTURPRAGvhI0/VDk4bi27bRnccGbJ/hDaUxZMLhhrzY0r22mjVf8PF6dvv5QUIQVm1/LeaWYsHHvLgiIjwrXirUZPnFrZw6VLREoBKG8uWvfSXw1L5eapmstqfsME8099oi+vWLR8MgEysZQmD28M73fgW4zek6LDQzKQyJx9nB+hJkKUDvcuziZjGmRFlNgSA2mguERwL1OXonD8WYUrBDGKroIvBT39zS5d9tQDnidEJZ9Y8gv5ViYP7x Key2") - end - - it do - visit admin_users_path - - click_link user.name - click_link 'SSH keys' - - expect(page).to have_content(key1.title) - expect(page).to have_content(key2.title) - - click_link key2.title - - expect(page).to have_content(key2.title) - expect(page).to have_content(key2.key) - - click_button 'Delete' - - page.within('.modal') do - page.click_button('Delete') - end - - expect(page).not_to have_content(key2.title) - end - end - - describe 'show user identities' do - it 'shows user identities' do - visit admin_user_identities_path(user) - - expect(page).to have_content(user.name) - expect(page).to have_content('twitter') - end - end - - describe 'update user identities' do - before do - allow(Gitlab::Auth::OAuth::Provider).to receive(:providers).and_return([:twitter, :twitter_updated]) - end - - it 'modifies twitter identity' do - visit admin_user_identities_path(user) - - find('.table').find(:link, 'Edit').click - fill_in 'identity_extern_uid', with: '654321' - select 'twitter_updated', from: 'identity_provider' - click_button 'Save changes' - - expect(page).to have_content(user.name) - expect(page).to have_content('twitter_updated') - expect(page).to have_content('654321') - end - end - - describe 'remove user with identities' do - it 'removes user with twitter identity' do - visit admin_user_identities_path(user) - - click_link 'Delete' - - expect(page).to have_content(user.name) - expect(page).not_to have_content('twitter') + check_breadcrumb('Edit Identity') end end |