diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2022-11-23 21:07:55 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2022-11-23 21:07:55 +0300 |
commit | 5421d61b1d5ffe11a9c7afbe2259b4e4d0e7c993 (patch) | |
tree | 093cfd5a5f80119f6e9c7ccd2c646ca2482cc3d2 /spec | |
parent | bc0f141f2f073a971aad1eb5349bb718747df028 (diff) |
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'spec')
57 files changed, 432 insertions, 231 deletions
diff --git a/spec/features/admin/admin_abuse_reports_spec.rb b/spec/features/admin/admin_abuse_reports_spec.rb index 3a02ce89aa9..10f12d7116f 100644 --- a/spec/features/admin/admin_abuse_reports_spec.rb +++ b/spec/features/admin/admin_abuse_reports_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe "Admin::AbuseReports", :js do +RSpec.describe "Admin::AbuseReports", :js, feature_category: :not_owned do let(:user) { create(:user) } context 'as an admin' do diff --git a/spec/features/admin/admin_appearance_spec.rb b/spec/features/admin/admin_appearance_spec.rb index b297d92b2fa..5fbe7039c1d 100644 --- a/spec/features/admin/admin_appearance_spec.rb +++ b/spec/features/admin/admin_appearance_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Admin Appearance' do +RSpec.describe 'Admin Appearance', feature_category: :not_owned do let!(:appearance) { create(:appearance) } let(:admin) { create(:admin) } diff --git a/spec/features/admin/admin_broadcast_messages_spec.rb b/spec/features/admin/admin_broadcast_messages_spec.rb index b5416f539f1..a6bbdd70fc3 100644 --- a/spec/features/admin/admin_broadcast_messages_spec.rb +++ b/spec/features/admin/admin_broadcast_messages_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Admin Broadcast Messages' do +RSpec.describe 'Admin Broadcast Messages', feature_category: :onboarding do before do admin = create(:admin) sign_in(admin) diff --git a/spec/features/admin/admin_browse_spam_logs_spec.rb b/spec/features/admin/admin_browse_spam_logs_spec.rb index 471a7e8f0ab..348b6db94fe 100644 --- a/spec/features/admin/admin_browse_spam_logs_spec.rb +++ b/spec/features/admin/admin_browse_spam_logs_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Admin browse spam logs' do +RSpec.describe 'Admin browse spam logs', feature_category: :not_owned do let!(:spam_log) { create(:spam_log, description: 'abcde ' * 20) } before do diff --git a/spec/features/admin/admin_deploy_keys_spec.rb b/spec/features/admin/admin_deploy_keys_spec.rb index 56b8c7fce14..e55e1cce6b9 100644 --- a/spec/features/admin/admin_deploy_keys_spec.rb +++ b/spec/features/admin/admin_deploy_keys_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'admin deploy keys', :js do +RSpec.describe 'admin deploy keys', :js, feature_category: :authentication_and_authorization do include Spec::Support::Helpers::ModalHelpers let_it_be(:admin) { create(:admin) } diff --git a/spec/features/admin/admin_dev_ops_reports_spec.rb b/spec/features/admin/admin_dev_ops_reports_spec.rb index f65862c568f..f290464b043 100644 --- a/spec/features/admin/admin_dev_ops_reports_spec.rb +++ b/spec/features/admin/admin_dev_ops_reports_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'DevOps Report page', :js do +RSpec.describe 'DevOps Report page', :js, feature_category: :devops_reports do before do admin = create(:admin) sign_in(admin) 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 b370b779afe..76620b93557 100644 --- a/spec/features/admin/admin_disables_git_access_protocol_spec.rb +++ b/spec/features/admin/admin_disables_git_access_protocol_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Admin disables Git access protocol', :js do +RSpec.describe 'Admin disables Git access protocol', :js, feature_category: :source_code_management do include StubENV include MobileHelpers diff --git a/spec/features/admin/admin_disables_two_factor_spec.rb b/spec/features/admin/admin_disables_two_factor_spec.rb index 4463dbb1eb0..eed20d449cd 100644 --- a/spec/features/admin/admin_disables_two_factor_spec.rb +++ b/spec/features/admin/admin_disables_two_factor_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Admin disables 2FA for a user' do +RSpec.describe 'Admin disables 2FA for a user', feature_category: :system_access do include Spec::Support::Helpers::ModalHelpers it 'successfully', :js do diff --git a/spec/features/admin/admin_groups_spec.rb b/spec/features/admin/admin_groups_spec.rb index 657dd52228e..c36a742af6b 100644 --- a/spec/features/admin/admin_groups_spec.rb +++ b/spec/features/admin/admin_groups_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Admin Groups' do +RSpec.describe 'Admin Groups', feature_category: :subgroups do include Select2Helper include Spec::Support::Helpers::Features::MembersHelpers include Spec::Support::Helpers::Features::InviteMembersModalHelper diff --git a/spec/features/admin/admin_health_check_spec.rb b/spec/features/admin/admin_health_check_spec.rb index 0f6cba6c105..de71a48d2dc 100644 --- a/spec/features/admin/admin_health_check_spec.rb +++ b/spec/features/admin/admin_health_check_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe "Admin Health Check", :feature do +RSpec.describe "Admin Health Check", feature_category: :continuous_verification do include StubENV let_it_be(:admin) { create(:admin) } diff --git a/spec/features/admin/admin_hook_logs_spec.rb b/spec/features/admin/admin_hook_logs_spec.rb index a2ee6343886..d6507e68692 100644 --- a/spec/features/admin/admin_hook_logs_spec.rb +++ b/spec/features/admin/admin_hook_logs_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Admin::HookLogs' do +RSpec.describe 'Admin::HookLogs', feature_category: :continuous_verification do let_it_be(:system_hook) { create(:system_hook) } let_it_be(:hook_log) { create(:web_hook_log, web_hook: system_hook, internal_error_message: 'some error') } let_it_be(:admin) { create(:admin) } diff --git a/spec/features/admin/admin_hooks_spec.rb b/spec/features/admin/admin_hooks_spec.rb index dc5b0ae009e..c4cd88817bc 100644 --- a/spec/features/admin/admin_hooks_spec.rb +++ b/spec/features/admin/admin_hooks_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Admin::Hooks' do +RSpec.describe 'Admin::Hooks', feature_category: :integrations do include Spec::Support::Helpers::ModalHelpers let_it_be(:user) { create(:admin) } diff --git a/spec/features/admin/admin_jobs_spec.rb b/spec/features/admin/admin_jobs_spec.rb index 36822f89c12..f0eaa83f05e 100644 --- a/spec/features/admin/admin_jobs_spec.rb +++ b/spec/features/admin/admin_jobs_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Admin Jobs' do +RSpec.describe 'Admin Jobs', feature_category: :continuous_integration do before do admin = create(:admin) sign_in(admin) diff --git a/spec/features/admin/admin_labels_spec.rb b/spec/features/admin/admin_labels_spec.rb index fa5c94aa66e..8d2813d26f7 100644 --- a/spec/features/admin/admin_labels_spec.rb +++ b/spec/features/admin/admin_labels_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'admin issues labels' do +RSpec.describe 'admin issues labels', feature_category: :team_planning do include Spec::Support::Helpers::ModalHelpers let!(:bug_label) { Label.create!(title: 'bug', template: true) } diff --git a/spec/features/admin/admin_manage_applications_spec.rb b/spec/features/admin/admin_manage_applications_spec.rb index 4cf290293bd..b4c77e802a8 100644 --- a/spec/features/admin/admin_manage_applications_spec.rb +++ b/spec/features/admin/admin_manage_applications_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'admin manage applications' do +RSpec.describe 'admin manage applications', feature_category: :system_access do let_it_be(:new_application_path) { new_admin_application_path } let_it_be(:applications_path) { admin_applications_path } let_it_be(:index_path) { admin_applications_path } diff --git a/spec/features/admin/admin_mode/login_spec.rb b/spec/features/admin/admin_mode/login_spec.rb index 6b4c9adb096..393721fe451 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' do +RSpec.describe 'Admin Mode Login', feature_category: :authentication_and_authorization 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 3ca66ef0d6a..f4e8941d25a 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 do +RSpec.describe 'Admin Mode Logout', :js, feature_category: :authentication_and_authorization do include TermsHelper include UserLoginHelper include Spec::Support::Helpers::Features::TopNavSpecHelpers diff --git a/spec/features/admin/admin_mode/workers_spec.rb b/spec/features/admin/admin_mode/workers_spec.rb index 8405e9132b6..f3639fd0800 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', :request_store do +RSpec.describe 'Admin mode for workers', :request_store, feature_category: :authentication_and_authorization do include Spec::Support::Helpers::Features::AdminUsersHelpers let(:user) { create(:user) } diff --git a/spec/features/admin/admin_mode_spec.rb b/spec/features/admin/admin_mode_spec.rb index 33cf0e8c4f8..769ff75b5a2 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', :js do +RSpec.describe 'Admin mode', :js, feature_category: :not_owned do include MobileHelpers include Spec::Support::Helpers::Features::TopNavSpecHelpers include StubENV diff --git a/spec/features/admin/admin_projects_spec.rb b/spec/features/admin/admin_projects_spec.rb index 6b147b01991..0cb813c40f4 100644 --- a/spec/features/admin/admin_projects_spec.rb +++ b/spec/features/admin/admin_projects_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe "Admin::Projects" do +RSpec.describe "Admin::Projects", feature_category: :projects do include Spec::Support::Helpers::Features::MembersHelpers include Spec::Support::Helpers::Features::InviteMembersModalHelper include Spec::Support::Helpers::ModalHelpers diff --git a/spec/features/admin/admin_runners_spec.rb b/spec/features/admin/admin_runners_spec.rb index 92a3b388994..342c4d55dd6 100644 --- a/spec/features/admin/admin_runners_spec.rb +++ b/spec/features/admin/admin_runners_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe "Admin Runners" do +RSpec.describe "Admin Runners", feature_category: :runner do include Spec::Support::Helpers::Features::RunnersHelpers include Spec::Support::Helpers::ModalHelpers diff --git a/spec/features/admin/admin_search_settings_spec.rb b/spec/features/admin/admin_search_settings_spec.rb index 989cb7cc787..3254bf75738 100644 --- a/spec/features/admin/admin_search_settings_spec.rb +++ b/spec/features/admin/admin_search_settings_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Admin searches application settings', :js do +RSpec.describe 'Admin searches application settings', :js, feature_category: :global_search do let_it_be(:admin) { create(:admin) } let_it_be(:application_settings) { create(:application_setting) } diff --git a/spec/features/admin/admin_sees_background_migrations_spec.rb b/spec/features/admin/admin_sees_background_migrations_spec.rb index d72259d91b3..e1746dad196 100644 --- a/spec/features/admin/admin_sees_background_migrations_spec.rb +++ b/spec/features/admin/admin_sees_background_migrations_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe "Admin > Admin sees background migrations" do +RSpec.describe "Admin > Admin sees background migrations", feature_category: :database do let_it_be(:admin) { create(:admin) } let(:job_class) { Gitlab::BackgroundMigration::CopyColumnUsingBackgroundMigrationJob } diff --git a/spec/features/admin/admin_sees_project_statistics_spec.rb b/spec/features/admin/admin_sees_project_statistics_spec.rb index 9d9217c4574..d3d0625ac43 100644 --- a/spec/features/admin/admin_sees_project_statistics_spec.rb +++ b/spec/features/admin/admin_sees_project_statistics_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe "Admin > Admin sees project statistics" do +RSpec.describe "Admin > Admin sees project statistics", feature_category: :projects do let(:current_user) { create(:admin) } before do diff --git a/spec/features/admin/admin_sees_projects_statistics_spec.rb b/spec/features/admin/admin_sees_projects_statistics_spec.rb index d340eb47f34..82361a985ae 100644 --- a/spec/features/admin/admin_sees_projects_statistics_spec.rb +++ b/spec/features/admin/admin_sees_projects_statistics_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe "Admin > Admin sees projects statistics" do +RSpec.describe "Admin > Admin sees projects statistics", feature_category: :projects do let(:current_user) { create(:admin) } before do diff --git a/spec/features/admin/admin_settings_spec.rb b/spec/features/admin/admin_settings_spec.rb index 72c9053ba49..3fdcf4151ed 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' do +RSpec.describe 'Admin updates settings', feature_category: :not_owned do include StubENV include TermsHelper include UsageDataHelpers diff --git a/spec/features/admin/admin_system_info_spec.rb b/spec/features/admin/admin_system_info_spec.rb index 8ff31dfded7..6c4a316ae77 100644 --- a/spec/features/admin/admin_system_info_spec.rb +++ b/spec/features/admin/admin_system_info_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Admin System Info' do +RSpec.describe 'Admin System Info', feature_category: :not_owned do before do admin = create(:admin) sign_in(admin) diff --git a/spec/features/admin/admin_users_impersonation_tokens_spec.rb b/spec/features/admin/admin_users_impersonation_tokens_spec.rb index d93dac4834e..5e6cc206883 100644 --- a/spec/features/admin/admin_users_impersonation_tokens_spec.rb +++ b/spec/features/admin/admin_users_impersonation_tokens_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Admin > Users > Impersonation Tokens', :js do +RSpec.describe 'Admin > Users > Impersonation Tokens', :js, feature_category: :authentication_and_authorization do include Spec::Support::Helpers::ModalHelpers include Spec::Support::Helpers::AccessTokenHelpers diff --git a/spec/features/admin/admin_users_spec.rb b/spec/features/admin/admin_users_spec.rb index f4b7fa45e4f..1f40f1f1bce 100644 --- a/spec/features/admin/admin_users_spec.rb +++ b/spec/features/admin/admin_users_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe "Admin::Users" do +RSpec.describe "Admin::Users", feature_category: :user_management do let(:current_user) { create(:admin) } before do diff --git a/spec/features/admin/admin_uses_repository_checks_spec.rb b/spec/features/admin/admin_uses_repository_checks_spec.rb index 2dffef93600..318572a7664 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 do +RSpec.describe 'Admin uses repository checks', :request_store, feature_category: :user_management do include StubENV include Spec::Support::Helpers::ModalHelpers diff --git a/spec/features/admin/dashboard_spec.rb b/spec/features/admin/dashboard_spec.rb index e7ff8c23a8c..baca60134b9 100644 --- a/spec/features/admin/dashboard_spec.rb +++ b/spec/features/admin/dashboard_spec.rb @@ -11,7 +11,7 @@ RSpec.describe 'admin visits dashboard' do gitlab_enable_admin_mode_sign_in(admin) end - context 'counting forks', :js do + context 'counting forks', :js, feature_category: :source_code_management do it 'correctly counts 2 forks of a project' do project = create(:project) project_fork = fork_project(project) @@ -28,7 +28,7 @@ RSpec.describe 'admin visits dashboard' do end end - describe 'Users statistic' do + describe 'Users statistic', feature_category: :user_management do let_it_be(:users_statistics) { create(:users_statistics) } it 'shows correct amounts of users', :aggregate_failures do @@ -54,7 +54,7 @@ RSpec.describe 'admin visits dashboard' do end end - describe 'Version check', :js do + describe 'Version check', :js, feature_category: :deployment_management do it 'shows badge on CE' do visit admin_root_path diff --git a/spec/features/admin/integrations/instance_integrations_spec.rb b/spec/features/admin/integrations/instance_integrations_spec.rb index 7b326ec161c..3b2ed1d9810 100644 --- a/spec/features/admin/integrations/instance_integrations_spec.rb +++ b/spec/features/admin/integrations/instance_integrations_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Instance integrations', :js do +RSpec.describe 'Instance integrations', :js, feature_category: :integrations do include_context 'instance integration activation' it_behaves_like 'integration settings form' do diff --git a/spec/features/admin/integrations/user_activates_mattermost_slash_command_spec.rb b/spec/features/admin/integrations/user_activates_mattermost_slash_command_spec.rb index 22a27b33671..d0ca5d76cc7 100644 --- a/spec/features/admin/integrations/user_activates_mattermost_slash_command_spec.rb +++ b/spec/features/admin/integrations/user_activates_mattermost_slash_command_spec.rb @@ -2,7 +2,8 @@ require 'spec_helper' -RSpec.describe 'User activates the instance-level Mattermost Slash Command integration', :js do +RSpec.describe 'User activates the instance-level Mattermost Slash Command integration', :js, +feature_category: :integrations do include_context 'instance integration activation' before do diff --git a/spec/features/admin/users/user_spec.rb b/spec/features/admin/users/user_spec.rb index 35b5c755b66..1552d4e6187 100644 --- a/spec/features/admin/users/user_spec.rb +++ b/spec/features/admin/users/user_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Admin::Users::User' do +RSpec.describe 'Admin::Users::User', feature_category: :user_management do include Spec::Support::Helpers::Features::AdminUsersHelpers include Spec::Support::Helpers::ModalHelpers diff --git a/spec/features/admin/users/users_spec.rb b/spec/features/admin/users/users_spec.rb index 9c59f0226e0..53d3aec9cff 100644 --- a/spec/features/admin/users/users_spec.rb +++ b/spec/features/admin/users/users_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Admin::Users' do +RSpec.describe 'Admin::Users', feature_category: :user_management do include Spec::Support::Helpers::Features::AdminUsersHelpers include Spec::Support::Helpers::ModalHelpers diff --git a/spec/features/alert_management/alert_details_spec.rb b/spec/features/alert_management/alert_details_spec.rb index 579b8221041..26233fbda64 100644 --- a/spec/features/alert_management/alert_details_spec.rb +++ b/spec/features/alert_management/alert_details_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Alert details', :js do +RSpec.describe 'Alert details', :js, feature_category: :incident_management do let_it_be(:project) { create(:project) } let_it_be(:developer) { create(:user) } let_it_be(:alert) { create(:alert_management_alert, project: project, status: 'triggered', title: 'Alert') } diff --git a/spec/features/alert_management/alert_management_list_spec.rb b/spec/features/alert_management/alert_management_list_spec.rb index 2fbce27033e..6ed3bdec5f5 100644 --- a/spec/features/alert_management/alert_management_list_spec.rb +++ b/spec/features/alert_management/alert_management_list_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Alert Management index', :js do +RSpec.describe 'Alert Management index', :js, feature_category: :incident_management do let_it_be(:project) { create(:project) } let_it_be(:developer) { create(:user) } diff --git a/spec/features/alert_management/user_filters_alerts_by_status_spec.rb b/spec/features/alert_management/user_filters_alerts_by_status_spec.rb index bebbbcbf5f7..c3dab05550e 100644 --- a/spec/features/alert_management/user_filters_alerts_by_status_spec.rb +++ b/spec/features/alert_management/user_filters_alerts_by_status_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'User filters Alert Management table by status', :js do +RSpec.describe 'User filters Alert Management table by status', :js, feature_category: :incident_management do let_it_be(:project) { create(:project) } let_it_be(:developer) { create(:user) } let_it_be(:alert1, reload: true) { create(:alert_management_alert, :triggered, project: project) } diff --git a/spec/features/alert_management/user_searches_alerts_spec.rb b/spec/features/alert_management/user_searches_alerts_spec.rb index 3bb1b260f36..d1e400f4145 100644 --- a/spec/features/alert_management/user_searches_alerts_spec.rb +++ b/spec/features/alert_management/user_searches_alerts_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'User searches Alert Management alerts', :js do +RSpec.describe 'User searches Alert Management alerts', :js, feature_category: :incident_management do let_it_be(:project) { create(:project) } let_it_be(:developer) { create(:user) } let_it_be(:alert) { create(:alert_management_alert, project: project, status: 'triggered') } diff --git a/spec/features/alert_management/user_updates_alert_status_spec.rb b/spec/features/alert_management/user_updates_alert_status_spec.rb index 2d7be3a0022..98fd7449c4f 100644 --- a/spec/features/alert_management/user_updates_alert_status_spec.rb +++ b/spec/features/alert_management/user_updates_alert_status_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'User updates Alert Management status', :js do +RSpec.describe 'User updates Alert Management status', :js, feature_category: :incident_management do let_it_be(:project) { create(:project) } let_it_be(:developer) { create(:user) } let_it_be(:alert) { create(:alert_management_alert, project: project, status: 'triggered') } diff --git a/spec/features/alert_management_spec.rb b/spec/features/alert_management_spec.rb index 3322c9c574f..de6b385b4cd 100644 --- a/spec/features/alert_management_spec.rb +++ b/spec/features/alert_management_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Alert management', :js do +RSpec.describe 'Alert management', :js, feature_category: :incident_management do let_it_be(:project) { create(:project) } let_it_be(:developer) { create(:user) } diff --git a/spec/features/alerts_settings/user_views_alerts_settings_spec.rb b/spec/features/alerts_settings/user_views_alerts_settings_spec.rb index 60f2f776595..70223b2c0d4 100644 --- a/spec/features/alerts_settings/user_views_alerts_settings_spec.rb +++ b/spec/features/alerts_settings/user_views_alerts_settings_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Alert integrations settings form', :js do +RSpec.describe 'Alert integrations settings form', :js, feature_category: :incident_management do let_it_be(:project) { create(:project) } let_it_be(:maintainer) { create(:user) } let_it_be(:developer) { create(:user) } diff --git a/spec/lib/gitlab/auth/current_user_mode_spec.rb b/spec/lib/gitlab/auth/current_user_mode_spec.rb index a21f0931b78..0a68a4a0ae2 100644 --- a/spec/lib/gitlab/auth/current_user_mode_spec.rb +++ b/spec/lib/gitlab/auth/current_user_mode_spec.rb @@ -194,10 +194,41 @@ RSpec.describe Gitlab::Auth::CurrentUserMode, :request_store do it 'creates a timestamp in the session' do subject.request_admin_mode! + subject.enable_admin_mode!(password: user.password) expect(session).to include(expected_session_entry(be_within(1.second).of(Time.now))) end + + it 'returns true after successful enable' do + subject.request_admin_mode! + + expect(subject.enable_admin_mode!(password: user.password)).to eq(true) + end + + it 'returns false after unsuccessful enable' do + subject.request_admin_mode! + + expect(subject.enable_admin_mode!(password: 'wrong password')).to eq(false) + end + + context 'when user is not an admin' do + let(:user) { build_stubbed(:user) } + + it 'returns false' do + subject.request_admin_mode! + + expect(subject.enable_admin_mode!(password: user.password)).to eq(false) + end + end + + context 'when admin mode is not requested' do + it 'raises error' do + expect do + subject.enable_admin_mode!(password: user.password) + end.to raise_error(Gitlab::Auth::CurrentUserMode::NotRequestedError) + end + end end describe '#disable_admin_mode!' do diff --git a/spec/lib/gitlab/ci/lint_spec.rb b/spec/lib/gitlab/ci/lint_spec.rb index cd3d4ee07bb..32afb893545 100644 --- a/spec/lib/gitlab/ci/lint_spec.rb +++ b/spec/lib/gitlab/ci/lint_spec.rb @@ -337,7 +337,7 @@ RSpec.describe Gitlab::Ci::Lint do end end - context 'pipeline logger' do + describe 'pipeline logger' do let(:counters) do { 'count' => a_kind_of(Numeric), @@ -346,7 +346,7 @@ RSpec.describe Gitlab::Ci::Lint do } end - let(:loggable_data) do + let(:expected_data) do { 'class' => 'Gitlab::Ci::Pipeline::Logger', 'config_build_context_duration_s' => counters, @@ -363,7 +363,7 @@ RSpec.describe Gitlab::Ci::Lint do 'pipeline_persisted' => false, 'pipeline_source' => 'unknown', 'project_id' => project&.id, - 'yaml_process_duration_s' => counters + 'yaml_process_duration_s' => a_kind_of(Numeric) } end @@ -401,7 +401,7 @@ RSpec.describe Gitlab::Ci::Lint do end it 'creates a log entry' do - expect(Gitlab::AppJsonLogger).to receive(:info).with(loggable_data) + expect(Gitlab::AppJsonLogger).to receive(:info).with(expected_data) validate end @@ -422,7 +422,7 @@ RSpec.describe Gitlab::Ci::Lint do let(:project) { nil } let(:project_nil_loggable_data) do - loggable_data.except('project_id') + expected_data.except('project_id') end it 'creates a log entry without project_id' do diff --git a/spec/lib/gitlab/ci/pipeline/chain/cancel_pending_pipelines_spec.rb b/spec/lib/gitlab/ci/pipeline/chain/cancel_pending_pipelines_spec.rb index fc3de2a14cd..16deeb6916f 100644 --- a/spec/lib/gitlab/ci/pipeline/chain/cancel_pending_pipelines_spec.rb +++ b/spec/lib/gitlab/ci/pipeline/chain/cancel_pending_pipelines_spec.rb @@ -173,21 +173,6 @@ RSpec.describe Gitlab::Ci::Pipeline::Chain::CancelPendingPipelines do expect(build_statuses(prev_pipeline)).to contain_exactly('running', 'success', 'created') expect(build_statuses(parent_pipeline)).to contain_exactly('running', 'running') end - - context 'when feature flag ci_skip_auto_cancelation_on_child_pipelines is disabled' do - before do - stub_feature_flags(ci_skip_auto_cancelation_on_child_pipelines: false) - end - - it 'does not cancel the parent pipeline' do - expect(build_statuses(parent_pipeline)).to contain_exactly('running', 'running') - - perform - - expect(build_statuses(prev_pipeline)).to contain_exactly('success', 'canceled', 'canceled') - expect(build_statuses(parent_pipeline)).to contain_exactly('running', 'running') - end - end end context 'when the previous pipeline source is webide' do diff --git a/spec/lib/gitlab/ci/pipeline/logger_spec.rb b/spec/lib/gitlab/ci/pipeline/logger_spec.rb index 049a9a416a0..4492ca716ae 100644 --- a/spec/lib/gitlab/ci/pipeline/logger_spec.rb +++ b/spec/lib/gitlab/ci/pipeline/logger_spec.rb @@ -22,55 +22,54 @@ RSpec.describe ::Gitlab::Ci::Pipeline::Logger do end it 'records durations of instrumented operations' do - loggable_data = { + logger.instrument(:expensive_operation) { 123 } + + expected_data = { 'expensive_operation_duration_s' => { 'count' => 1, 'max' => a_kind_of(Numeric), 'sum' => a_kind_of(Numeric) } } - - logger.instrument(:expensive_operation) { 123 } - expect(logger.observations_hash).to match(a_hash_including(loggable_data)) + expect(logger.observations_hash).to match(a_hash_including(expected_data)) end it 'raises an error when block is not provided' do expect { logger.instrument(:expensive_operation) } .to raise_error(ArgumentError, 'block not given') end + + context 'when once: true' do + it 'logs only one observation' do + logger.instrument(:expensive_operation, once: true) { 123 } + logger.instrument(:expensive_operation, once: true) { 123 } + + expected_data = { + 'expensive_operation_duration_s' => a_kind_of(Numeric) + } + expect(logger.observations_hash).to match(a_hash_including(expected_data)) + end + end end - describe '#instrument_with_sql', :request_store do - subject(:instrument_with_sql) do - logger.instrument_with_sql(:expensive_operation, &operation) + describe '#instrument_once_with_sql', :request_store do + subject(:instrument_once_with_sql) do + logger.instrument_once_with_sql(:expensive_operation, &operation) end - def loggable_data(count:, db_count: nil) + def expected_data(count:, db_count: nil) database_name = Ci::ApplicationRecord.connection.pool.db_config.name - keys = %W[ - expensive_operation_duration_s - expensive_operation_db_count - expensive_operation_db_primary_count - expensive_operation_db_primary_duration_s - expensive_operation_db_#{database_name}_count - expensive_operation_db_#{database_name}_duration_s - ] - - data = keys.each.with_object({}) do |key, accumulator| - accumulator[key] = { - 'count' => count, - 'max' => a_kind_of(Numeric), - 'sum' => a_kind_of(Numeric) - } - end + total_db_count = count * db_count if db_count - if db_count - data['expensive_operation_db_count']['max'] = db_count - data['expensive_operation_db_count']['sum'] = count * db_count - end - - data + { + "expensive_operation_duration_s" => a_kind_of(Numeric), + "expensive_operation_db_count" => total_db_count || a_kind_of(Numeric), + "expensive_operation_db_primary_count" => a_kind_of(Numeric), + "expensive_operation_db_primary_duration_s" => a_kind_of(Numeric), + "expensive_operation_db_#{database_name}_count" => a_kind_of(Numeric), + "expensive_operation_db_#{database_name}_duration_s" => a_kind_of(Numeric) + } end context 'with a single query' do @@ -79,10 +78,10 @@ RSpec.describe ::Gitlab::Ci::Pipeline::Logger do it { is_expected.to eq(operation.call) } it 'includes SQL metrics' do - instrument_with_sql + instrument_once_with_sql expect(logger.observations_hash) - .to match(a_hash_including(loggable_data(count: 1, db_count: 1))) + .to match(a_hash_including(expected_data(count: 1, db_count: 1))) end end @@ -92,21 +91,10 @@ RSpec.describe ::Gitlab::Ci::Pipeline::Logger do it { is_expected.to eq(operation.call) } it 'includes SQL metrics' do - instrument_with_sql - - expect(logger.observations_hash) - .to match(a_hash_including(loggable_data(count: 1, db_count: 2))) - end - end - - context 'with multiple observations' do - let(:operation) { -> { Ci::Build.count + Ci::Bridge.count } } - - it 'includes SQL metrics' do - 2.times { logger.instrument_with_sql(:expensive_operation, &operation) } + instrument_once_with_sql expect(logger.observations_hash) - .to match(a_hash_including(loggable_data(count: 2, db_count: 2))) + .to match(a_hash_including(expected_data(count: 1, db_count: 2))) end end @@ -116,7 +104,7 @@ RSpec.describe ::Gitlab::Ci::Pipeline::Logger do it { is_expected.to eq(operation.call) } it 'does not include SQL metrics' do - instrument_with_sql + instrument_once_with_sql expect(logger.observations_hash.keys) .to match_array(['expensive_operation_duration_s']) @@ -126,14 +114,40 @@ RSpec.describe ::Gitlab::Ci::Pipeline::Logger do describe '#observe' do it 'records durations of observed operations' do - loggable_data = { + expect(logger.observe(:pipeline_creation_duration_s, 30)).to be_truthy + + expected_data = { 'pipeline_creation_duration_s' => { 'sum' => 30, 'count' => 1, 'max' => 30 } } + expect(logger.observations_hash).to match(a_hash_including(expected_data)) + end - expect(logger.observe(:pipeline_creation_duration_s, 30)).to be_truthy - expect(logger.observations_hash).to match(a_hash_including(loggable_data)) + context 'when once: true' do + it 'records the latest observation' do + expect(logger.observe(:pipeline_creation_duration_s, 20, once: true)).to be_truthy + expect(logger.observe(:pipeline_creation_duration_s, 30, once: true)).to be_truthy + + expected_data = { + 'pipeline_creation_duration_s' => 30 + } + expect(logger.observations_hash).to match(a_hash_including(expected_data)) + end + + it 'logs data as expected' do + expect(logger.observe(:pipeline_creation_duration_s, 30, once: true)).to be_truthy + expect(logger.observe(:pipeline_operation_x_duration_s, 20)).to be_truthy + expect(logger.observe(:pipeline_operation_x_duration_s, 20)).to be_truthy + + expected_data = { + 'pipeline_creation_duration_s' => 30, + 'pipeline_operation_x_duration_s' => { + 'sum' => 40, 'count' => 2, 'max' => 20 + } + } + expect(logger.observations_hash).to match(a_hash_including(expected_data)) + end end end @@ -152,7 +166,7 @@ RSpec.describe ::Gitlab::Ci::Pipeline::Logger do context 'when the feature flag is enabled' do let(:flag) { true } - let(:loggable_data) do + let(:expected_data) do { 'class' => described_class.name.to_s, 'pipeline_id' => pipeline.id, @@ -173,7 +187,7 @@ RSpec.describe ::Gitlab::Ci::Pipeline::Logger do it 'logs to application.json' do expect(Gitlab::AppJsonLogger) .to receive(:info) - .with(a_hash_including(loggable_data)) + .with(a_hash_including(expected_data)) .and_call_original expect(commit).to be_truthy @@ -194,7 +208,7 @@ RSpec.describe ::Gitlab::Ci::Pipeline::Logger do expect(Gitlab::AppJsonLogger) .to receive(:info) - .with(a_hash_including(loggable_data)) + .with(a_hash_including(expected_data)) .and_call_original expect(commit).to be_truthy @@ -205,7 +219,7 @@ RSpec.describe ::Gitlab::Ci::Pipeline::Logger do let(:project) {} let(:pipeline) { build(:ci_pipeline) } - let(:loggable_data) do + let(:expected_data) do { 'class' => described_class.name.to_s, 'pipeline_persisted' => false, @@ -223,7 +237,7 @@ RSpec.describe ::Gitlab::Ci::Pipeline::Logger do it 'logs to application.json' do expect(Gitlab::AppJsonLogger) .to receive(:info) - .with(a_hash_including(loggable_data)) + .with(a_hash_including(expected_data)) .and_call_original expect(commit).to be_truthy diff --git a/spec/lib/gitlab/gfm/uploads_rewriter_spec.rb b/spec/lib/gitlab/gfm/uploads_rewriter_spec.rb index b1bff242f33..e1c0da69317 100644 --- a/spec/lib/gitlab/gfm/uploads_rewriter_spec.rb +++ b/spec/lib/gitlab/gfm/uploads_rewriter_spec.rb @@ -31,7 +31,7 @@ RSpec.describe Gitlab::Gfm::UploadsRewriter do referenced_files.compact.select(&:exists?) end - shared_examples "files are accessible" do + shared_examples 'files are accessible' do describe '#rewrite' do subject(:rewrite) { new_text } @@ -82,6 +82,18 @@ RSpec.describe Gitlab::Gfm::UploadsRewriter do rewrite expect(new_files).to be_empty + expect(new_text).to eq(text) + end + + it 'skips non-existant files' do + allow_next_instance_of(FileUploader) do |file| + allow(file).to receive(:exists?).and_return(false) + end + + rewrite + + expect(new_files).to be_empty + expect(new_text).to eq(text) end end end @@ -107,11 +119,11 @@ RSpec.describe Gitlab::Gfm::UploadsRewriter do end end - context "file are stored locally" do - include_examples "files are accessible" + context 'file are stored locally' do + include_examples 'files are accessible' end - context "files are stored remotely" do + context 'files are stored remotely' do before do stub_uploads_object_storage(FileUploader) @@ -120,7 +132,7 @@ RSpec.describe Gitlab::Gfm::UploadsRewriter do end end - include_examples "files are accessible" + include_examples 'files are accessible' end describe '#needs_rewrite?' do diff --git a/spec/lib/gitlab/git/repository_spec.rb b/spec/lib/gitlab/git/repository_spec.rb index 1984c1157fe..a00df3a7dda 100644 --- a/spec/lib/gitlab/git/repository_spec.rb +++ b/spec/lib/gitlab/git/repository_spec.rb @@ -1377,6 +1377,24 @@ RSpec.describe Gitlab::Git::Repository do expect(branch).to eq(nil) end + + context 'when branch is ambiguous' do + let(:ambiguous_branch) { 'prefix' } + let(:branch_with_prefix) { 'prefix/branch' } + + before do + repository.create_branch(branch_with_prefix) + end + + after do + repository.delete_branch(branch_with_prefix) + end + + it 'returns nil for ambiguous branch' do + expect(repository.find_branch(branch_with_prefix)).to be_a_kind_of(Gitlab::Git::Branch) + expect(repository.find_branch(ambiguous_branch)).to eq(nil) + end + end end describe '#branches' do diff --git a/spec/lib/gitlab/gitaly_client/ref_service_spec.rb b/spec/lib/gitlab/gitaly_client/ref_service_spec.rb index bd96e9baf1d..b413c47e033 100644 --- a/spec/lib/gitlab/gitaly_client/ref_service_spec.rb +++ b/spec/lib/gitlab/gitaly_client/ref_service_spec.rb @@ -102,6 +102,16 @@ RSpec.describe Gitlab::GitalyClient::RefService do client.find_branch('name') end + + context 'when Gitaly returns a ambiguios reference error' do + it 'raises an UnknownRef error' do + expect_any_instance_of(Gitaly::RefService::Stub) + .to receive(:find_branch) + .and_raise(GRPC::BadStatus.new(2, 'reference is ambiguous')) + + expect { client.find_branch('name') }.to raise_error(Gitlab::Git::AmbiguousRef, 'branch is ambiguous: name') + end + end end describe '#find_tag' do diff --git a/spec/lib/gitlab/memory/reporter_spec.rb b/spec/lib/gitlab/memory/reporter_spec.rb new file mode 100644 index 00000000000..7924b37cb4b --- /dev/null +++ b/spec/lib/gitlab/memory/reporter_spec.rb @@ -0,0 +1,77 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe Gitlab::Memory::Reporter, :aggregate_failures do + subject(:reporter) { described_class.new } + + let(:fake_report) do + Class.new do + attr_reader :did_run + + def name + 'fake_report' + end + + def run(report_id) + @did_run = true + '/path/to/report' + end + end + end + + let(:report) { fake_report.new } + + describe '#run_report' do + let(:report_duration_counter) { instance_double(::Prometheus::Client::Counter) } + let(:file_size) { 1_000_000 } + + before do + allow(Gitlab::Metrics).to receive(:counter).and_return(report_duration_counter) + allow(report_duration_counter).to receive(:increment) + + allow(::Prometheus::PidProvider).to receive(:worker_id).and_return('worker_1') + allow(File).to receive(:size).with('/path/to/report').and_return(file_size) + + allow(SecureRandom).to receive(:uuid).and_return('abc123') + end + + it 'runs the given report' do + expect { reporter.run_report(report) }.to change { report.did_run }.from(nil).to(true) + end + + it 'logs duration and other metrics' do + expect(Gitlab::AppLogger).to receive(:info).with( + hash_including( + :duration_s, + :cpu_s, + perf_report_size_bytes: file_size, + message: 'finished', + pid: Process.pid, + worker_id: 'worker_1', + perf_report_worker_uuid: 'abc123', + perf_report: 'fake_report' + )) + + reporter.run_report(report) + end + + it 'increments Prometheus duration counter' do + expect(report_duration_counter).to receive(:increment).with({ report: 'fake_report' }, an_instance_of(Float)) + + reporter.run_report(report) + end + + context 'when the report returns invalid file path' do + before do + allow(File).to receive(:size).with('/path/to/report').and_raise(Errno::ENOENT) + end + + it 'logs `0` as `perf_report_size_bytes`' do + expect(Gitlab::AppLogger).to receive(:info).with(hash_including(perf_report_size_bytes: 0)) + + reporter.run_report(report) + end + end + end +end diff --git a/spec/lib/gitlab/memory/reports/jemalloc_stats_spec.rb b/spec/lib/gitlab/memory/reports/jemalloc_stats_spec.rb index de27c8352f9..ee4c6004c52 100644 --- a/spec/lib/gitlab/memory/reports/jemalloc_stats_spec.rb +++ b/spec/lib/gitlab/memory/reports/jemalloc_stats_spec.rb @@ -5,8 +5,7 @@ require 'spec_helper' RSpec.describe Gitlab::Memory::Reports::JemallocStats do let_it_be(:outdir) { Dir.mktmpdir } - let(:filename_label) { SecureRandom.uuid } - let(:jemalloc_stats) { described_class.new(reports_path: outdir, filename_label: filename_label) } + let(:jemalloc_stats) { described_class.new(reports_path: outdir) } after do FileUtils.rm_f(outdir) @@ -27,14 +26,14 @@ RSpec.describe Gitlab::Memory::Reports::JemallocStats do .to receive(:dump_stats) .with(path: outdir, tmp_dir: File.join(outdir, '/tmp'), - filename_label: filename_label) + filename_label: 'test_report') .and_return(report_path) - expect(jemalloc_stats.run).to eq(report_path) + expect(jemalloc_stats.run('test_report')).to eq(report_path) end describe 'reports cleanup' do - let(:jemalloc_stats) { described_class.new(reports_path: outdir, filename_label: filename_label) } + let(:jemalloc_stats) { described_class.new(reports_path: outdir) } before do stub_env('GITLAB_DIAGNOSTIC_REPORTS_JEMALLOC_MAX_REPORTS_STORED', 3) @@ -62,7 +61,7 @@ RSpec.describe Gitlab::Memory::Reports::JemallocStats do end it 'keeps only `max_reports_stored` total newest files' do - expect { jemalloc_stats.run } + expect { jemalloc_stats.run('test_report') } .to change { Dir.entries(outdir).count { |e| e.match(/jemalloc_stats.*/) } } .from(5).to(3) @@ -90,7 +89,7 @@ RSpec.describe Gitlab::Memory::Reports::JemallocStats do end it 'does not remove any reports' do - expect { jemalloc_stats.run } + expect { jemalloc_stats.run('test_report') } .not_to change { Dir.entries(outdir).count { |e| e.match(/jemalloc_stats.*/) } } end end @@ -105,7 +104,7 @@ RSpec.describe Gitlab::Memory::Reports::JemallocStats do it 'does not run the report and returns nil' do expect(Gitlab::Memory::Jemalloc).not_to receive(:dump_stats) - expect(jemalloc_stats.run).to be_nil + expect(jemalloc_stats.run('test_report')).to be_nil end end end diff --git a/spec/lib/gitlab/memory/reports_daemon_spec.rb b/spec/lib/gitlab/memory/reports_daemon_spec.rb index ab616e92b00..b6be4eac919 100644 --- a/spec/lib/gitlab/memory/reports_daemon_spec.rb +++ b/spec/lib/gitlab/memory/reports_daemon_spec.rb @@ -3,85 +3,56 @@ require 'spec_helper' RSpec.describe Gitlab::Memory::ReportsDaemon, :aggregate_failures do - let(:daemon) { described_class.new } + let(:reporter) { instance_double(Gitlab::Memory::Reporter) } + let(:reports) { nil } let_it_be(:tmp_dir) { Dir.mktmpdir } + subject(:daemon) { described_class.new(reporter: reporter, reports: reports) } + after(:all) do FileUtils.remove_entry(tmp_dir) end describe '#run_thread' do - let(:report_duration_counter) { instance_double(::Prometheus::Client::Counter) } - let(:file_size) { 1_000_000 } - before do - allow(Gitlab::Metrics).to receive(:counter).and_return(report_duration_counter) - allow(report_duration_counter).to receive(:increment) - # make sleep no-op allow(daemon).to receive(:sleep) {} # let alive return 3 times: true, true, false allow(daemon).to receive(:alive).and_return(true, true, false) - - allow(File).to receive(:size).with(/#{daemon.reports_path}.*\.json/).and_return(file_size) - end - - it 'runs reports, logs and sets gauge' do - expect(daemon.send(:reports)) - .to all(receive(:run).twice { Tempfile.new("report.json", tmp_dir).path }) - - expect(::Prometheus::PidProvider).to receive(:worker_id).at_least(:once).and_return('worker_1') - - expect(Gitlab::AppLogger).to receive(:info).with( - hash_including( - :duration_s, - :cpu_s, - :perf_report_worker_uuid, - perf_report_size_bytes: file_size, - message: 'finished', - pid: Process.pid, - worker_id: 'worker_1', - perf_report: 'jemalloc_stats' - )).twice - - expect(report_duration_counter).to receive(:increment).with({ report: 'jemalloc_stats' }, an_instance_of(Float)) - - daemon.send(:run_thread) end - context 'when the report object returns invalid file path' do - before do - allow(File).to receive(:size).with(/#{daemon.reports_path}.*\.json/).and_raise(Errno::ENOENT) - end - - it 'logs `0` as `perf_report_size_bytes`' do - expect(daemon.send(:reports)) - .to all(receive(:run).twice { Tempfile.new("report.json", tmp_dir).path }) - - expect(Gitlab::AppLogger).to receive(:info).with(hash_including(perf_report_size_bytes: 0)).twice + context 'with default reports' do + it 'runs them using the given reporter' do + expect(reporter).to receive(:run_report).twice.with(an_instance_of(Gitlab::Memory::Reports::JemallocStats)) daemon.send(:run_thread) end end - it 'allows configure and run multiple reports' do + context 'with inactive reports' do # rubocop: disable RSpec/VerifiedDoubles # We test how ReportsDaemon could be extended in the future # We configure it with new reports classes which are not yet defined so we cannot make this an instance_double. - active_report_1 = double("Active Report 1", active?: true) - active_report_2 = double("Active Report 2", active?: true) - inactive_report = double("Inactive Report", active?: false) + let(:active_report_1) { double("Active Report 1", active?: true) } + let(:active_report_2) { double("Active Report 2", active?: true) } + let(:inactive_report) { double("Inactive Report", active?: false) } # rubocop: enable RSpec/VerifiedDoubles - allow(daemon).to receive(:reports).and_return([active_report_1, inactive_report, active_report_2]) + let(:reports) do + [active_report_1, active_report_2, inactive_report] + end - expect(active_report_1).to receive(:run).and_return(File.join(tmp_dir, 'report_1.json')).twice - expect(active_report_2).to receive(:run).and_return(File.join(tmp_dir, 'report_2.json')).twice - expect(inactive_report).not_to receive(:run) + it 'runs only active reports' do + expect(reporter).to receive(:run_report).ordered.with(active_report_1) + expect(reporter).to receive(:run_report).ordered.with(active_report_2) + expect(reporter).to receive(:run_report).ordered.with(active_report_1) + expect(reporter).to receive(:run_report).ordered.with(active_report_2) + expect(reporter).not_to receive(:run_report).with(inactive_report) - daemon.send(:run_thread) + daemon.send(:run_thread) + end end context 'sleep timers logic' do @@ -90,9 +61,6 @@ RSpec.describe Gitlab::Memory::ReportsDaemon, :aggregate_failures do daemon = described_class.new allow(daemon).to receive(:alive).and_return(true, true, false) - expect(daemon.send(:reports)) - .to all(receive(:run).twice { Tempfile.new("report.json", tmp_dir).path }) - expect(daemon).to receive(:sleep).with(described_class::DEFAULT_SLEEP_S).ordered expect(daemon).to receive(:sleep).with(described_class::DEFAULT_SLEEP_BETWEEN_REPORTS_S).ordered expect(daemon).to receive(:sleep).with(described_class::DEFAULT_SLEEP_S).ordered diff --git a/spec/models/member_spec.rb b/spec/models/member_spec.rb index 2ecd10cccc6..9b7a63bffdf 100644 --- a/spec/models/member_spec.rb +++ b/spec/models/member_spec.rb @@ -175,26 +175,31 @@ RSpec.describe Member do end context 'member role access level' do - let_it_be(:member) { create(:group_member, access_level: Gitlab::Access::DEVELOPER) } + let_it_be_with_reload(:member) { create(:group_member, access_level: Gitlab::Access::DEVELOPER) } - context 'no member role is associated' do + context 'when no member role is associated' do it 'is valid' do expect(member).to be_valid end end - context 'member role is associated' do + context 'when member role is associated' do let!(:member_role) do - create(:member_role, members: [member], base_access_level: Gitlab::Access::DEVELOPER) + create( + :member_role, + members: [member], + base_access_level: Gitlab::Access::DEVELOPER, + namespace: member.member_namespace + ) end - context 'member role matches access level' do + context 'when member role matches access level' do it 'is valid' do expect(member).to be_valid end end - context 'member role does not match access level' do + context 'when member role does not match access level' do it 'is invalid' do member_role.base_access_level = Gitlab::Access::MAINTAINER @@ -202,13 +207,57 @@ RSpec.describe Member do end end - context 'access_level cannot be changed' do + context 'when access_level is changed' do it 'is invalid' do member.access_level = Gitlab::Access::MAINTAINER expect(member).not_to be_valid - expect(member.errors.full_messages).to include( - "Access level cannot be changed since member is associated with a custom role" + expect(member.errors[:access_level]).to include( + _("cannot be changed since member is associated with a custom role") + ) + end + end + end + end + + context 'member role namespace' do + let_it_be_with_reload(:member) { create(:group_member) } + + context 'when no member role is associated' do + it 'is valid' do + expect(member).to be_valid + end + end + + context 'when member role is associated' do + let_it_be(:member_role) do + create(:member_role, members: [member], namespace: member.group, base_access_level: member.access_level) + end + + context 'when member#member_namespace is a group within hierarchy of member_role#namespace' do + it 'is valid' do + member.member_namespace = create(:group, parent: member_role.namespace) + + expect(member).to be_valid + end + end + + context 'when member#member_namespace is a project within hierarchy of member_role#namespace' do + it 'is valid' do + project = create(:project, group: member_role.namespace) + member.member_namespace = Namespace.find(project.parent_id) + + expect(member).to be_valid + end + end + + context 'when member#member_namespace is outside hierarchy of member_role#namespace' do + it 'is invalid' do + member.member_namespace = create(:group) + + expect(member).not_to be_valid + expect(member.errors[:member_namespace]).to include( + _("must be in same hierarchy as custom role's namespace") ) end end @@ -248,7 +297,7 @@ RSpec.describe Member do accepted_invite_user = build(:user, state: :active) @accepted_invite_member = create(:project_member, :invited, :developer, project: project) - .tap { |u| u.accept_invite!(accepted_invite_user) } + .tap { |u| u.accept_invite!(accepted_invite_user) } requested_user = create(:user).tap { |u| project.request_access(u) } @requested_member = project.requesters.find_by(user_id: requested_user.id) @@ -612,14 +661,14 @@ RSpec.describe Member do subject { described_class.authorizable.to_a } it 'includes the member who has an associated user record,'\ - 'but also having an invite_token' do - member = create(:project_member, - :developer, - :invited, - user: create(:user)) + 'but also having an invite_token' do + member = create(:project_member, + :developer, + :invited, + user: create(:user)) - expect(subject).to include(member) - end + expect(subject).to include(member) + end it { is_expected.to include @owner } it { is_expected.to include @maintainer } diff --git a/spec/models/members/member_role_spec.rb b/spec/models/members/member_role_spec.rb index e2691e2e78c..f9d6757bb90 100644 --- a/spec/models/members/member_role_spec.rb +++ b/spec/models/members/member_role_spec.rb @@ -9,39 +9,50 @@ RSpec.describe MemberRole do end describe 'validation' do - subject { described_class.new } + subject(:member_role) { build(:member_role) } it { is_expected.to validate_presence_of(:namespace) } it { is_expected.to validate_presence_of(:base_access_level) } - context 'for namespace' do - subject { build(:member_role) } - + context 'when for namespace' do let_it_be(:root_group) { create(:group) } context 'when namespace is a subgroup' do it 'is invalid' do subgroup = create(:group, parent: root_group) - subject.namespace = subgroup + member_role.namespace = subgroup - expect(subject).to be_invalid + expect(member_role).to be_invalid + expect(member_role.errors[:namespace]).to include( + s_("MemberRole|must be top-level namespace") + ) end end context 'when namespace is a root group' do it 'is valid' do - subject.namespace = root_group + member_role.namespace = root_group - expect(subject).to be_valid + expect(member_role).to be_valid end end context 'when namespace is not present' do it 'is invalid with a different error message' do - subject.namespace = nil + member_role.namespace = nil + + expect(member_role).to be_invalid + expect(member_role.errors[:namespace]).to include(_("can't be blank")) + end + end + + context 'when namespace is outside hierarchy of member' do + it 'creates a validation error' do + member_role.save! + member_role.namespace = create(:group) - expect(subject).to be_invalid - expect(subject.errors.full_messages).to eq(["Namespace can't be blank"]) + expect(member_role).not_to be_valid + expect(member_role.errors[:namespace]).to include(s_("MemberRole|can't be changed")) end end end diff --git a/spec/requests/api/branches_spec.rb b/spec/requests/api/branches_spec.rb index 750b9a39e15..186afaa1b79 100644 --- a/spec/requests/api/branches_spec.rb +++ b/spec/requests/api/branches_spec.rb @@ -344,6 +344,18 @@ RSpec.describe API::Branches do end end + context 'when branch is ambiguous' do + let(:branch_name) { 'prefix' } + + before do + project.repository.create_branch('prefix/branch') + end + + it_behaves_like '404 response' do + let(:request) { get api(route, current_user) } + end + end + context 'when repository does not exist' do it_behaves_like '404 response' do let(:project) { create(:project, creator: user) } diff --git a/spec/services/ci/append_build_trace_service_spec.rb b/spec/services/ci/append_build_trace_service_spec.rb index 487dbacbe90..36061bc3596 100644 --- a/spec/services/ci/append_build_trace_service_spec.rb +++ b/spec/services/ci/append_build_trace_service_spec.rb @@ -76,4 +76,20 @@ RSpec.describe Ci::AppendBuildTraceService do expect(build.failure_reason).to eq 'trace_size_exceeded' end end + + context 'when debug_trace param is provided' do + let(:metadata) { Ci::BuildMetadata.find_by(build_id: build) } + + it 'changes the build metadata debug_trace value' do + stream_size = 192.kilobytes + body_data = 'x' * stream_size + content_range = "0-#{stream_size}" + + described_class + .new(build, content_range: content_range, debug_trace: true) + .execute(body_data) + + expect(metadata.debug_trace_enabled).to be(true) + end + end end diff --git a/spec/services/ci/create_pipeline_service/logger_spec.rb b/spec/services/ci/create_pipeline_service/logger_spec.rb index 9cd5d48a439..76155690ced 100644 --- a/spec/services/ci/create_pipeline_service/logger_spec.rb +++ b/spec/services/ci/create_pipeline_service/logger_spec.rb @@ -2,8 +2,8 @@ require 'spec_helper' -RSpec.describe Ci::CreatePipelineService, :yaml_processor_feature_flag_corectness do - context 'pipeline logger' do +RSpec.describe Ci::CreatePipelineService, :yaml_processor_feature_flag_corectness do # rubocop: disable RSpec/FilePath + describe 'pipeline logger' do let_it_be(:project) { create(:project, :repository) } let_it_be(:user) { project.first_owner } @@ -12,10 +12,6 @@ RSpec.describe Ci::CreatePipelineService, :yaml_processor_feature_flag_corectnes let(:pipeline) { service.execute(:push).payload } let(:file_location) { 'spec/fixtures/gitlab/ci/external_files/.gitlab-ci-template-1.yml' } - before do - stub_ci_pipeline_yaml_file(gitlab_ci_yaml) - end - let(:counters) do { 'count' => a_kind_of(Numeric), @@ -32,15 +28,19 @@ RSpec.describe Ci::CreatePipelineService, :yaml_processor_feature_flag_corectnes 'pipeline_persisted' => true, 'project_id' => project.id, 'pipeline_creation_service_duration_s' => a_kind_of(Numeric), - 'pipeline_creation_duration_s' => counters, - 'pipeline_size_count' => counters, - 'pipeline_step_gitlab_ci_pipeline_chain_seed_duration_s' => counters, + 'pipeline_creation_duration_s' => a_kind_of(Numeric), + 'pipeline_size_count' => a_kind_of(Numeric), + 'pipeline_step_gitlab_ci_pipeline_chain_seed_duration_s' => a_kind_of(Numeric), 'pipeline_seed_build_inclusion_duration_s' => counters, 'pipeline_builds_tags_count' => a_kind_of(Numeric), 'pipeline_builds_distinct_tags_count' => a_kind_of(Numeric) } end + before do + stub_ci_pipeline_yaml_file(gitlab_ci_yaml) + end + context 'when the duration is under the threshold' do it 'does not create a log entry but it collects the data' do expect(Gitlab::AppJsonLogger).not_to receive(:info) @@ -49,9 +49,9 @@ RSpec.describe Ci::CreatePipelineService, :yaml_processor_feature_flag_corectnes expect(service.logger.observations_hash) .to match( a_hash_including( - 'pipeline_creation_duration_s' => counters, - 'pipeline_size_count' => counters, - 'pipeline_step_gitlab_ci_pipeline_chain_seed_duration_s' => counters + 'pipeline_creation_duration_s' => a_kind_of(Numeric), + 'pipeline_size_count' => a_kind_of(Numeric), + 'pipeline_step_gitlab_ci_pipeline_chain_seed_duration_s' => a_kind_of(Numeric) ) ) end @@ -60,7 +60,7 @@ RSpec.describe Ci::CreatePipelineService, :yaml_processor_feature_flag_corectnes context 'when the durations exceeds the threshold' do let(:timer) do proc do - @timer = @timer.to_i + 30 + @timer = @timer.to_i + 30 # rubocop: disable RSpec/InstanceVariable end end @@ -86,17 +86,15 @@ RSpec.describe Ci::CreatePipelineService, :yaml_processor_feature_flag_corectnes 'pipeline_persisted' => false, 'project_id' => project.id, 'pipeline_creation_service_duration_s' => a_kind_of(Numeric), - 'pipeline_step_gitlab_ci_pipeline_chain_seed_duration_s' => counters + 'pipeline_step_gitlab_ci_pipeline_chain_seed_duration_s' => a_kind_of(Numeric) } end - before do + it 'creates a log entry' do allow_next_instance_of(Ci::Pipeline) do |pipeline| expect(pipeline).to receive(:save!).and_raise { RuntimeError } end - end - it 'creates a log entry' do expect(Gitlab::AppJsonLogger) .to receive(:info) .with(a_hash_including(loggable_data)) @@ -123,7 +121,7 @@ RSpec.describe Ci::CreatePipelineService, :yaml_processor_feature_flag_corectnes context 'when the size exceeds the threshold' do before do allow_next_instance_of(Ci::Pipeline) do |pipeline| - allow(pipeline).to receive(:total_size) { 5000 } + allow(pipeline).to receive(:total_size).and_return(5000) end end |