diff options
Diffstat (limited to 'spec/services')
802 files changed, 3725 insertions, 1804 deletions
diff --git a/spec/services/access_token_validation_service_spec.rb b/spec/services/access_token_validation_service_spec.rb index 2bf74d64dc9..4cdce094358 100644 --- a/spec/services/access_token_validation_service_spec.rb +++ b/spec/services/access_token_validation_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe AccessTokenValidationService do +RSpec.describe AccessTokenValidationService, feature_category: :system_access do describe ".include_any_scope?" do let(:request) { double("request") } diff --git a/spec/services/achievements/award_service_spec.rb b/spec/services/achievements/award_service_spec.rb new file mode 100644 index 00000000000..fb45a634ddd --- /dev/null +++ b/spec/services/achievements/award_service_spec.rb @@ -0,0 +1,73 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe Achievements::AwardService, feature_category: :user_profile do + describe '#execute' do + let_it_be(:developer) { create(:user) } + let_it_be(:maintainer) { create(:user) } + let_it_be(:group) { create(:group) } + let_it_be(:achievement) { create(:achievement, namespace: group) } + let_it_be(:recipient) { create(:user) } + + let(:achievement_id) { achievement.id } + let(:recipient_id) { recipient.id } + + subject(:response) { described_class.new(current_user, achievement_id, recipient_id).execute } + + before_all do + group.add_developer(developer) + group.add_maintainer(maintainer) + end + + context 'when user does not have permission' do + let(:current_user) { developer } + + it 'returns an error' do + expect(response).to be_error + expect(response.message).to match_array( + ['You have insufficient permissions to award this achievement']) + end + end + + context 'when user has permission' do + let(:current_user) { maintainer } + + it 'creates an achievement' do + expect(response).to be_success + end + + context 'when the achievement is not persisted' do + let(:user_achievement) { instance_double('Achievements::UserAchievement') } + + it 'returns the correct error' do + allow(user_achievement).to receive(:persisted?).and_return(false) + allow(user_achievement).to receive(:errors).and_return(nil) + allow(Achievements::UserAchievement).to receive(:create).and_return(user_achievement) + + expect(response).to be_error + expect(response.message).to match_array(["Failed to award achievement"]) + end + end + + context 'when the achievement does not exist' do + let(:achievement_id) { non_existing_record_id } + + it 'returns the correct error' do + expect(response).to be_error + expect(response.message) + .to contain_exactly("Couldn't find Achievements::Achievement with 'id'=#{non_existing_record_id}") + end + end + + context 'when the recipient does not exist' do + let(:recipient_id) { non_existing_record_id } + + it 'returns the correct error' do + expect(response).to be_error + expect(response.message).to contain_exactly("Couldn't find User with 'id'=#{non_existing_record_id}") + end + end + end + end +end diff --git a/spec/services/achievements/revoke_service_spec.rb b/spec/services/achievements/revoke_service_spec.rb new file mode 100644 index 00000000000..c9925f1e3df --- /dev/null +++ b/spec/services/achievements/revoke_service_spec.rb @@ -0,0 +1,66 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe Achievements::RevokeService, feature_category: :user_profile do + describe '#execute' do + let_it_be(:developer) { create(:user) } + let_it_be(:maintainer) { create(:user) } + let_it_be(:group) { create(:group) } + let_it_be(:achievement) { create(:achievement, namespace: group) } + let_it_be(:user_achievement) { create(:user_achievement, achievement: achievement) } + + let(:user_achievement_param) { user_achievement } + + subject(:response) { described_class.new(current_user, user_achievement_param).execute } + + before_all do + group.add_developer(developer) + group.add_maintainer(maintainer) + end + + context 'when user does not have permission' do + let(:current_user) { developer } + + it 'returns an error' do + expect(response).to be_error + expect(response.message).to match_array( + ['You have insufficient permissions to revoke this achievement']) + end + end + + context 'when user has permission' do + let(:current_user) { maintainer } + + it 'revokes an achievement' do + expect(response).to be_success + end + + context 'when the achievement has already been revoked' do + let_it_be(:revoked_achievement) { create(:user_achievement, :revoked, achievement: achievement) } + let(:user_achievement_param) { revoked_achievement } + + it 'returns the correct error' do + expect(response).to be_error + expect(response.message) + .to contain_exactly('This achievement has already been revoked') + end + end + + context 'when the user achievement fails to save' do + let(:user_achievement_param) { instance_double('Achievements::UserAchievement') } + + it 'returns the correct error' do + allow(user_achievement_param).to receive(:save).and_return(false) + allow(user_achievement_param).to receive(:achievement).and_return(achievement) + allow(user_achievement_param).to receive(:revoked?).and_return(false) + allow(user_achievement_param).to receive(:errors).and_return(nil) + expect(user_achievement_param).to receive(:assign_attributes) + + expect(response).to be_error + expect(response.message).to match_array(["Failed to revoke achievement"]) + end + end + end + end +end diff --git a/spec/services/admin/set_feature_flag_service_spec.rb b/spec/services/admin/set_feature_flag_service_spec.rb index 45ee914558a..e66802f6332 100644 --- a/spec/services/admin/set_feature_flag_service_spec.rb +++ b/spec/services/admin/set_feature_flag_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Admin::SetFeatureFlagService do +RSpec.describe Admin::SetFeatureFlagService, feature_category: :feature_flags do let_it_be(:user) { create(:user) } let_it_be(:project) { create(:project) } let_it_be(:group) { create(:group) } diff --git a/spec/services/alert_management/alerts/todo/create_service_spec.rb b/spec/services/alert_management/alerts/todo/create_service_spec.rb index fa4fd8ed0b2..fd81c0893ed 100644 --- a/spec/services/alert_management/alerts/todo/create_service_spec.rb +++ b/spec/services/alert_management/alerts/todo/create_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe AlertManagement::Alerts::Todo::CreateService do +RSpec.describe AlertManagement::Alerts::Todo::CreateService, feature_category: :incident_management do let_it_be(:user) { create(:user) } let_it_be(:alert) { create(:alert_management_alert) } diff --git a/spec/services/alert_management/alerts/update_service_spec.rb b/spec/services/alert_management/alerts/update_service_spec.rb index 8375c8cdf7d..69e2f2de291 100644 --- a/spec/services/alert_management/alerts/update_service_spec.rb +++ b/spec/services/alert_management/alerts/update_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe AlertManagement::Alerts::UpdateService do +RSpec.describe AlertManagement::Alerts::UpdateService, feature_category: :incident_management do let_it_be(:user_with_permissions) { create(:user) } let_it_be(:other_user_with_permissions) { create(:user) } let_it_be(:user_without_permissions) { create(:user) } diff --git a/spec/services/alert_management/create_alert_issue_service_spec.rb b/spec/services/alert_management/create_alert_issue_service_spec.rb index 7255a722d26..b8d93f99ae4 100644 --- a/spec/services/alert_management/create_alert_issue_service_spec.rb +++ b/spec/services/alert_management/create_alert_issue_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe AlertManagement::CreateAlertIssueService do +RSpec.describe AlertManagement::CreateAlertIssueService, feature_category: :incident_management do let_it_be(:user) { create(:user) } let_it_be(:group) { create(:group) } let_it_be(:project) { create(:project, group: group) } diff --git a/spec/services/alert_management/http_integrations/create_service_spec.rb b/spec/services/alert_management/http_integrations/create_service_spec.rb index ac5c62caf84..5200ec27dd1 100644 --- a/spec/services/alert_management/http_integrations/create_service_spec.rb +++ b/spec/services/alert_management/http_integrations/create_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe AlertManagement::HttpIntegrations::CreateService do +RSpec.describe AlertManagement::HttpIntegrations::CreateService, feature_category: :incident_management do let_it_be(:user_with_permissions) { create(:user) } let_it_be(:user_without_permissions) { create(:user) } let_it_be_with_reload(:project) { create(:project) } diff --git a/spec/services/alert_management/http_integrations/destroy_service_spec.rb b/spec/services/alert_management/http_integrations/destroy_service_spec.rb index cd949d728de..a8e9746cb85 100644 --- a/spec/services/alert_management/http_integrations/destroy_service_spec.rb +++ b/spec/services/alert_management/http_integrations/destroy_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe AlertManagement::HttpIntegrations::DestroyService do +RSpec.describe AlertManagement::HttpIntegrations::DestroyService, feature_category: :incident_management do let_it_be(:user_with_permissions) { create(:user) } let_it_be(:user_without_permissions) { create(:user) } let_it_be(:project) { create(:project) } diff --git a/spec/services/alert_management/http_integrations/update_service_spec.rb b/spec/services/alert_management/http_integrations/update_service_spec.rb index 94c34d9a29c..3f1a0967aa9 100644 --- a/spec/services/alert_management/http_integrations/update_service_spec.rb +++ b/spec/services/alert_management/http_integrations/update_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe AlertManagement::HttpIntegrations::UpdateService do +RSpec.describe AlertManagement::HttpIntegrations::UpdateService, feature_category: :incident_management do let_it_be(:user_with_permissions) { create(:user) } let_it_be(:user_without_permissions) { create(:user) } let_it_be(:project) { create(:project) } diff --git a/spec/services/alert_management/metric_images/upload_service_spec.rb b/spec/services/alert_management/metric_images/upload_service_spec.rb index 527d9db0fd9..2cafd2c9029 100644 --- a/spec/services/alert_management/metric_images/upload_service_spec.rb +++ b/spec/services/alert_management/metric_images/upload_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe AlertManagement::MetricImages::UploadService do +RSpec.describe AlertManagement::MetricImages::UploadService, feature_category: :metrics do subject(:service) { described_class.new(alert, current_user, params) } let_it_be_with_refind(:project) { create(:project) } diff --git a/spec/services/alert_management/process_prometheus_alert_service_spec.rb b/spec/services/alert_management/process_prometheus_alert_service_spec.rb index ae52a09be48..eb5f3808021 100644 --- a/spec/services/alert_management/process_prometheus_alert_service_spec.rb +++ b/spec/services/alert_management/process_prometheus_alert_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe AlertManagement::ProcessPrometheusAlertService do +RSpec.describe AlertManagement::ProcessPrometheusAlertService, feature_category: :incident_management do let_it_be(:project, reload: true) { create(:project, :repository) } let(:service) { described_class.new(project, payload) } diff --git a/spec/services/analytics/cycle_analytics/stages/list_service_spec.rb b/spec/services/analytics/cycle_analytics/stages/list_service_spec.rb index 7bfae0cd9fc..c39965a2799 100644 --- a/spec/services/analytics/cycle_analytics/stages/list_service_spec.rb +++ b/spec/services/analytics/cycle_analytics/stages/list_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Analytics::CycleAnalytics::Stages::ListService do +RSpec.describe Analytics::CycleAnalytics::Stages::ListService, feature_category: :value_stream_management do let_it_be(:project) { create(:project) } let_it_be(:user) { create(:user) } let_it_be(:project_namespace) { project.project_namespace.reload } diff --git a/spec/services/application_settings/update_service_spec.rb b/spec/services/application_settings/update_service_spec.rb index e20d59fb0ef..79d4fc67538 100644 --- a/spec/services/application_settings/update_service_spec.rb +++ b/spec/services/application_settings/update_service_spec.rb @@ -110,7 +110,7 @@ RSpec.describe ApplicationSettings::UpdateService do end end - describe 'markdown cache invalidators' do + describe 'markdown cache invalidators', feature_category: :team_planning do shared_examples 'invalidates markdown cache' do |attribute| let(:params) { attribute } @@ -144,7 +144,7 @@ RSpec.describe ApplicationSettings::UpdateService do end end - describe 'performance bar settings' do + describe 'performance bar settings', feature_category: :application_performance do using RSpec::Parameterized::TableSyntax where(:params_performance_bar_enabled, @@ -247,7 +247,7 @@ RSpec.describe ApplicationSettings::UpdateService do end end - context 'when external authorization is enabled' do + context 'when external authorization is enabled', feature_category: :system_access do before do enable_external_authorization_service_check end diff --git a/spec/services/audit_event_service_spec.rb b/spec/services/audit_event_service_spec.rb index 4f8b90fcb4a..8a20f7775eb 100644 --- a/spec/services/audit_event_service_spec.rb +++ b/spec/services/audit_event_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe AuditEventService, :with_license do +RSpec.describe AuditEventService, :with_license, feature_category: :audit_events do let_it_be(:project) { create(:project) } let_it_be(:user) { create(:user, :with_sign_ins) } let_it_be(:project_member) { create(:project_member, user: user) } diff --git a/spec/services/audit_events/build_service_spec.rb b/spec/services/audit_events/build_service_spec.rb index caf405a53aa..575ec9e58b8 100644 --- a/spec/services/audit_events/build_service_spec.rb +++ b/spec/services/audit_events/build_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe AuditEvents::BuildService do +RSpec.describe AuditEvents::BuildService, feature_category: :audit_events do let(:author) { build_stubbed(:author, current_sign_in_ip: '127.0.0.1') } let(:deploy_token) { build_stubbed(:deploy_token, user: author) } let(:scope) { build_stubbed(:group) } diff --git a/spec/services/auth/container_registry_authentication_service_spec.rb b/spec/services/auth/container_registry_authentication_service_spec.rb index ba7acd3d3df..90aba1ae54c 100644 --- a/spec/services/auth/container_registry_authentication_service_spec.rb +++ b/spec/services/auth/container_registry_authentication_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Auth::ContainerRegistryAuthenticationService do +RSpec.describe Auth::ContainerRegistryAuthenticationService, feature_category: :container_registry do include AdminModeHelper it_behaves_like 'a container registry auth service' diff --git a/spec/services/auth/dependency_proxy_authentication_service_spec.rb b/spec/services/auth/dependency_proxy_authentication_service_spec.rb index 667f361dc34..8f92fbe272c 100644 --- a/spec/services/auth/dependency_proxy_authentication_service_spec.rb +++ b/spec/services/auth/dependency_proxy_authentication_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Auth::DependencyProxyAuthenticationService do +RSpec.describe Auth::DependencyProxyAuthenticationService, feature_category: :dependency_proxy do let_it_be(:user) { create(:user) } let(:service) { Auth::DependencyProxyAuthenticationService.new(nil, user) } diff --git a/spec/services/authorized_project_update/find_records_due_for_refresh_service_spec.rb b/spec/services/authorized_project_update/find_records_due_for_refresh_service_spec.rb index 691fb3f60f4..e8f86b4d7c5 100644 --- a/spec/services/authorized_project_update/find_records_due_for_refresh_service_spec.rb +++ b/spec/services/authorized_project_update/find_records_due_for_refresh_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe AuthorizedProjectUpdate::FindRecordsDueForRefreshService do +RSpec.describe AuthorizedProjectUpdate::FindRecordsDueForRefreshService, feature_category: :projects do # We're using let! here so that any expectations for the service class are not # triggered twice. let!(:project) { create(:project) } diff --git a/spec/services/authorized_project_update/periodic_recalculate_service_spec.rb b/spec/services/authorized_project_update/periodic_recalculate_service_spec.rb index 782f6858870..51cab6d188b 100644 --- a/spec/services/authorized_project_update/periodic_recalculate_service_spec.rb +++ b/spec/services/authorized_project_update/periodic_recalculate_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe AuthorizedProjectUpdate::PeriodicRecalculateService do +RSpec.describe AuthorizedProjectUpdate::PeriodicRecalculateService, feature_category: :projects do subject(:service) { described_class.new } describe '#execute' do diff --git a/spec/services/authorized_project_update/project_access_changed_service_spec.rb b/spec/services/authorized_project_update/project_access_changed_service_spec.rb index da428bece20..7c09d7755ca 100644 --- a/spec/services/authorized_project_update/project_access_changed_service_spec.rb +++ b/spec/services/authorized_project_update/project_access_changed_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe AuthorizedProjectUpdate::ProjectAccessChangedService do +RSpec.describe AuthorizedProjectUpdate::ProjectAccessChangedService, feature_category: :projects do describe '#execute' do it 'executes projects_authorizations refresh' do expect(AuthorizedProjectUpdate::ProjectRecalculateWorker).to receive(:bulk_perform_async) diff --git a/spec/services/authorized_project_update/project_recalculate_per_user_service_spec.rb b/spec/services/authorized_project_update/project_recalculate_per_user_service_spec.rb index 62862d0e558..7b2dd52810f 100644 --- a/spec/services/authorized_project_update/project_recalculate_per_user_service_spec.rb +++ b/spec/services/authorized_project_update/project_recalculate_per_user_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe AuthorizedProjectUpdate::ProjectRecalculatePerUserService, '#execute' do +RSpec.describe AuthorizedProjectUpdate::ProjectRecalculatePerUserService, '#execute', feature_category: :projects do let_it_be(:project) { create(:project) } let_it_be(:user) { create(:user) } let_it_be(:another_user) { create(:user) } diff --git a/spec/services/authorized_project_update/project_recalculate_service_spec.rb b/spec/services/authorized_project_update/project_recalculate_service_spec.rb index c339faaeabf..8360f3c67ab 100644 --- a/spec/services/authorized_project_update/project_recalculate_service_spec.rb +++ b/spec/services/authorized_project_update/project_recalculate_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe AuthorizedProjectUpdate::ProjectRecalculateService, '#execute' do +RSpec.describe AuthorizedProjectUpdate::ProjectRecalculateService, '#execute', feature_category: :projects do let_it_be(:project) { create(:project) } subject(:execute) { described_class.new(project).execute } diff --git a/spec/services/auto_merge/base_service_spec.rb b/spec/services/auto_merge/base_service_spec.rb index 6c804a14620..7afe5d406ba 100644 --- a/spec/services/auto_merge/base_service_spec.rb +++ b/spec/services/auto_merge/base_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe AutoMerge::BaseService do +RSpec.describe AutoMerge::BaseService, feature_category: :code_review_workflow do let(:project) { create(:project) } let(:user) { create(:user) } let(:service) { described_class.new(project, user, params) } diff --git a/spec/services/auto_merge/merge_when_pipeline_succeeds_service_spec.rb b/spec/services/auto_merge/merge_when_pipeline_succeeds_service_spec.rb index 676f55be28a..a0b22267960 100644 --- a/spec/services/auto_merge/merge_when_pipeline_succeeds_service_spec.rb +++ b/spec/services/auto_merge/merge_when_pipeline_succeeds_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe AutoMerge::MergeWhenPipelineSucceedsService do +RSpec.describe AutoMerge::MergeWhenPipelineSucceedsService, feature_category: :code_review_workflow do let_it_be(:user) { create(:user) } let_it_be(:project) { create(:project, :repository) } diff --git a/spec/services/auto_merge_service_spec.rb b/spec/services/auto_merge_service_spec.rb index 7584e44152e..94f4b414dca 100644 --- a/spec/services/auto_merge_service_spec.rb +++ b/spec/services/auto_merge_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe AutoMergeService do +RSpec.describe AutoMergeService, feature_category: :code_review_workflow do let_it_be(:project) { create(:project, :repository) } let_it_be(:user) { create(:user) } diff --git a/spec/services/award_emojis/add_service_spec.rb b/spec/services/award_emojis/add_service_spec.rb index 0fbb785e2d6..99dbe6dc606 100644 --- a/spec/services/award_emojis/add_service_spec.rb +++ b/spec/services/award_emojis/add_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe AwardEmojis::AddService do +RSpec.describe AwardEmojis::AddService, feature_category: :team_planning do let_it_be(:user) { create(:user) } let_it_be(:project) { create(:project) } let_it_be(:awardable) { create(:note, project: project) } diff --git a/spec/services/award_emojis/base_service_spec.rb b/spec/services/award_emojis/base_service_spec.rb index e0c8fd39ad9..f1ee4d1cfb8 100644 --- a/spec/services/award_emojis/base_service_spec.rb +++ b/spec/services/award_emojis/base_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe AwardEmojis::BaseService do +RSpec.describe AwardEmojis::BaseService, feature_category: :team_planning do let(:awardable) { build(:note) } let(:current_user) { build(:user) } diff --git a/spec/services/award_emojis/collect_user_emoji_service_spec.rb b/spec/services/award_emojis/collect_user_emoji_service_spec.rb index bf5aa0eb9ef..d75d5804f93 100644 --- a/spec/services/award_emojis/collect_user_emoji_service_spec.rb +++ b/spec/services/award_emojis/collect_user_emoji_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe AwardEmojis::CollectUserEmojiService do +RSpec.describe AwardEmojis::CollectUserEmojiService, feature_category: :team_planning do describe '#execute' do it 'returns an Array containing the awarded emoji names' do user = create(:user) diff --git a/spec/services/award_emojis/copy_service_spec.rb b/spec/services/award_emojis/copy_service_spec.rb index abb9c65e25d..6c1d7fb21e2 100644 --- a/spec/services/award_emojis/copy_service_spec.rb +++ b/spec/services/award_emojis/copy_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe AwardEmojis::CopyService do +RSpec.describe AwardEmojis::CopyService, feature_category: :team_planning do let_it_be(:from_awardable) do create( :issue, diff --git a/spec/services/award_emojis/destroy_service_spec.rb b/spec/services/award_emojis/destroy_service_spec.rb index f743de7c59e..109bdbfa986 100644 --- a/spec/services/award_emojis/destroy_service_spec.rb +++ b/spec/services/award_emojis/destroy_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe AwardEmojis::DestroyService do +RSpec.describe AwardEmojis::DestroyService, feature_category: :team_planning do let_it_be(:user) { create(:user) } let_it_be(:awardable) { create(:note) } let_it_be(:project) { awardable.project } diff --git a/spec/services/award_emojis/toggle_service_spec.rb b/spec/services/award_emojis/toggle_service_spec.rb index 74e97c66193..61dcc22561f 100644 --- a/spec/services/award_emojis/toggle_service_spec.rb +++ b/spec/services/award_emojis/toggle_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe AwardEmojis::ToggleService do +RSpec.describe AwardEmojis::ToggleService, feature_category: :team_planning do let_it_be(:user) { create(:user) } let_it_be(:project) { create(:project, :public) } let_it_be(:awardable) { create(:note, project: project) } diff --git a/spec/services/base_container_service_spec.rb b/spec/services/base_container_service_spec.rb index 1de79eec702..7406f0aea93 100644 --- a/spec/services/base_container_service_spec.rb +++ b/spec/services/base_container_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe BaseContainerService do +RSpec.describe BaseContainerService, feature_category: :container_registry do let(:project) { Project.new } let(:user) { User.new } diff --git a/spec/services/base_count_service_spec.rb b/spec/services/base_count_service_spec.rb index 18cab2e8e9a..9a731f52b09 100644 --- a/spec/services/base_count_service_spec.rb +++ b/spec/services/base_count_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe BaseCountService, :use_clean_rails_memory_store_caching do +RSpec.describe BaseCountService, :use_clean_rails_memory_store_caching, feature_category: :shared do let(:service) { described_class.new } describe '#relation_for_count' do diff --git a/spec/services/boards/create_service_spec.rb b/spec/services/boards/create_service_spec.rb index f6a9f0903ce..5aaef9d529c 100644 --- a/spec/services/boards/create_service_spec.rb +++ b/spec/services/boards/create_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Boards::CreateService do +RSpec.describe Boards::CreateService, feature_category: :team_planning do describe '#execute' do context 'when board parent is a project' do let(:parent) { create(:project) } diff --git a/spec/services/boards/destroy_service_spec.rb b/spec/services/boards/destroy_service_spec.rb index cd6df832547..feaca3cfcce 100644 --- a/spec/services/boards/destroy_service_spec.rb +++ b/spec/services/boards/destroy_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Boards::DestroyService do +RSpec.describe Boards::DestroyService, feature_category: :team_planning do context 'with project board' do let_it_be(:parent) { create(:project) } diff --git a/spec/services/boards/issues/create_service_spec.rb b/spec/services/boards/issues/create_service_spec.rb index c4f1eb093dc..f9a9c338f58 100644 --- a/spec/services/boards/issues/create_service_spec.rb +++ b/spec/services/boards/issues/create_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Boards::Issues::CreateService do +RSpec.describe Boards::Issues::CreateService, feature_category: :team_planning do describe '#execute' do let(:project) { create(:project) } let(:board) { create(:board, project: project) } diff --git a/spec/services/boards/issues/list_service_spec.rb b/spec/services/boards/issues/list_service_spec.rb index 1959710bb0c..5e10d1d216c 100644 --- a/spec/services/boards/issues/list_service_spec.rb +++ b/spec/services/boards/issues/list_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Boards::Issues::ListService do +RSpec.describe Boards::Issues::ListService, feature_category: :team_planning do describe '#execute' do let_it_be(:user) { create(:user) } diff --git a/spec/services/boards/issues/move_service_spec.rb b/spec/services/boards/issues/move_service_spec.rb index 3a25f13762c..9c173f3f86e 100644 --- a/spec/services/boards/issues/move_service_spec.rb +++ b/spec/services/boards/issues/move_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Boards::Issues::MoveService do +RSpec.describe Boards::Issues::MoveService, feature_category: :team_planning do describe '#execute' do context 'when parent is a project' do let(:user) { create(:user) } diff --git a/spec/services/boards/lists/create_service_spec.rb b/spec/services/boards/lists/create_service_spec.rb index cac26b3c88d..da317fdd474 100644 --- a/spec/services/boards/lists/create_service_spec.rb +++ b/spec/services/boards/lists/create_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Boards::Lists::CreateService do +RSpec.describe Boards::Lists::CreateService, feature_category: :team_planning do context 'when board parent is a project' do let_it_be(:parent) { create(:project) } let_it_be(:board) { create(:board, project: parent) } diff --git a/spec/services/boards/lists/destroy_service_spec.rb b/spec/services/boards/lists/destroy_service_spec.rb index d5358bcc1e1..837635d49e8 100644 --- a/spec/services/boards/lists/destroy_service_spec.rb +++ b/spec/services/boards/lists/destroy_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Boards::Lists::DestroyService do +RSpec.describe Boards::Lists::DestroyService, feature_category: :team_planning do let_it_be(:user) { create(:user) } let(:list_type) { :list } diff --git a/spec/services/boards/lists/list_service_spec.rb b/spec/services/boards/lists/list_service_spec.rb index 2d41de42581..90b705e05c3 100644 --- a/spec/services/boards/lists/list_service_spec.rb +++ b/spec/services/boards/lists/list_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Boards::Lists::ListService do +RSpec.describe Boards::Lists::ListService, feature_category: :team_planning do let_it_be(:user) { create(:user) } let_it_be(:group) { create(:group) } diff --git a/spec/services/boards/lists/move_service_spec.rb b/spec/services/boards/lists/move_service_spec.rb index 2861fc48b4d..abf7d48e114 100644 --- a/spec/services/boards/lists/move_service_spec.rb +++ b/spec/services/boards/lists/move_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Boards::Lists::MoveService do +RSpec.describe Boards::Lists::MoveService, feature_category: :team_planning do describe '#execute' do context 'when board parent is a project' do let(:project) { create(:project) } diff --git a/spec/services/boards/lists/update_service_spec.rb b/spec/services/boards/lists/update_service_spec.rb index 21216e1b945..341eaa52292 100644 --- a/spec/services/boards/lists/update_service_spec.rb +++ b/spec/services/boards/lists/update_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Boards::Lists::UpdateService do +RSpec.describe Boards::Lists::UpdateService, feature_category: :team_planning do let_it_be(:user) { create(:user) } let!(:list) { create(:list, board: board, position: 0) } diff --git a/spec/services/boards/visits/create_service_spec.rb b/spec/services/boards/visits/create_service_spec.rb index 8910345d170..4af4e914da5 100644 --- a/spec/services/boards/visits/create_service_spec.rb +++ b/spec/services/boards/visits/create_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Boards::Visits::CreateService do +RSpec.describe Boards::Visits::CreateService, feature_category: :team_planning do describe '#execute' do let(:user) { create(:user) } diff --git a/spec/services/branches/create_service_spec.rb b/spec/services/branches/create_service_spec.rb index 19a32aafa38..7fb7d9d440d 100644 --- a/spec/services/branches/create_service_spec.rb +++ b/spec/services/branches/create_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Branches::CreateService, :use_clean_rails_redis_caching do +RSpec.describe Branches::CreateService, :use_clean_rails_redis_caching, feature_category: :source_code_management do subject(:service) { described_class.new(project, user) } let_it_be(:project) { create(:project_empty_repo) } @@ -108,7 +108,7 @@ RSpec.describe Branches::CreateService, :use_clean_rails_redis_caching do control = RedisCommands::Recorder.new(pattern: ':branch_names:') { subject } - expect(control.by_command(:sadd).count).to eq(1) + expect(control).not_to exceed_redis_command_calls_limit(:sadd, 1) end end diff --git a/spec/services/branches/delete_merged_service_spec.rb b/spec/services/branches/delete_merged_service_spec.rb index 46611670fe1..23a892a56ef 100644 --- a/spec/services/branches/delete_merged_service_spec.rb +++ b/spec/services/branches/delete_merged_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Branches::DeleteMergedService do +RSpec.describe Branches::DeleteMergedService, feature_category: :source_code_management do include ProjectForksHelper subject(:service) { described_class.new(project, project.first_owner) } diff --git a/spec/services/branches/delete_service_spec.rb b/spec/services/branches/delete_service_spec.rb index 727cadc5a50..003645b1b8c 100644 --- a/spec/services/branches/delete_service_spec.rb +++ b/spec/services/branches/delete_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Branches::DeleteService do +RSpec.describe Branches::DeleteService, feature_category: :source_code_management do let(:project) { create(:project, :repository) } let(:repository) { project.repository } let(:user) { create(:user) } diff --git a/spec/services/branches/diverging_commit_counts_service_spec.rb b/spec/services/branches/diverging_commit_counts_service_spec.rb index 34a2b81c831..3cccc74735c 100644 --- a/spec/services/branches/diverging_commit_counts_service_spec.rb +++ b/spec/services/branches/diverging_commit_counts_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Branches::DivergingCommitCountsService do +RSpec.describe Branches::DivergingCommitCountsService, feature_category: :source_code_management do let(:project) { create(:project, :repository) } let(:repository) { project.repository } diff --git a/spec/services/branches/validate_new_service_spec.rb b/spec/services/branches/validate_new_service_spec.rb index 02127c8c10d..a5b75a09353 100644 --- a/spec/services/branches/validate_new_service_spec.rb +++ b/spec/services/branches/validate_new_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Branches::ValidateNewService do +RSpec.describe Branches::ValidateNewService, feature_category: :source_code_management do let(:project) { create(:project, :repository) } subject(:service) { described_class.new(project) } diff --git a/spec/services/bulk_create_integration_service_spec.rb b/spec/services/bulk_create_integration_service_spec.rb index 22bb1736f9f..57bdfdbd4cb 100644 --- a/spec/services/bulk_create_integration_service_spec.rb +++ b/spec/services/bulk_create_integration_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe BulkCreateIntegrationService do +RSpec.describe BulkCreateIntegrationService, feature_category: :integrations do include JiraIntegrationHelpers before_all do diff --git a/spec/services/bulk_imports/archive_extraction_service_spec.rb b/spec/services/bulk_imports/archive_extraction_service_spec.rb index da9df31cde9..40f8d8718ae 100644 --- a/spec/services/bulk_imports/archive_extraction_service_spec.rb +++ b/spec/services/bulk_imports/archive_extraction_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe BulkImports::ArchiveExtractionService do +RSpec.describe BulkImports::ArchiveExtractionService, feature_category: :importers do let_it_be(:tmpdir) { Dir.mktmpdir } let_it_be(:filename) { 'symlink_export.tar' } let_it_be(:filepath) { File.join(tmpdir, filename) } diff --git a/spec/services/bulk_imports/export_service_spec.rb b/spec/services/bulk_imports/export_service_spec.rb index 2414f7c5ca7..ac7514fde5b 100644 --- a/spec/services/bulk_imports/export_service_spec.rb +++ b/spec/services/bulk_imports/export_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe BulkImports::ExportService do +RSpec.describe BulkImports::ExportService, feature_category: :importers do let_it_be(:group) { create(:group) } let_it_be(:user) { create(:user) } diff --git a/spec/services/bulk_imports/file_decompression_service_spec.rb b/spec/services/bulk_imports/file_decompression_service_spec.rb index 77348428d60..9b8320aeac5 100644 --- a/spec/services/bulk_imports/file_decompression_service_spec.rb +++ b/spec/services/bulk_imports/file_decompression_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe BulkImports::FileDecompressionService do +RSpec.describe BulkImports::FileDecompressionService, feature_category: :importers do let_it_be(:tmpdir) { Dir.mktmpdir } let_it_be(:ndjson_filename) { 'labels.ndjson' } let_it_be(:ndjson_filepath) { File.join(tmpdir, ndjson_filename) } diff --git a/spec/services/bulk_imports/file_download_service_spec.rb b/spec/services/bulk_imports/file_download_service_spec.rb index 27f77b678e3..7c64d6efc65 100644 --- a/spec/services/bulk_imports/file_download_service_spec.rb +++ b/spec/services/bulk_imports/file_download_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe BulkImports::FileDownloadService do +RSpec.describe BulkImports::FileDownloadService, feature_category: :importers do describe '#execute' do let_it_be(:allowed_content_types) { %w(application/gzip application/octet-stream) } let_it_be(:file_size_limit) { 5.gigabytes } diff --git a/spec/services/bulk_imports/file_export_service_spec.rb b/spec/services/bulk_imports/file_export_service_spec.rb index 453fc1d0c0d..3c23b86ad5c 100644 --- a/spec/services/bulk_imports/file_export_service_spec.rb +++ b/spec/services/bulk_imports/file_export_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe BulkImports::FileExportService do +RSpec.describe BulkImports::FileExportService, feature_category: :importers do let_it_be(:project) { create(:project) } describe '#execute' do diff --git a/spec/services/bulk_imports/lfs_objects_export_service_spec.rb b/spec/services/bulk_imports/lfs_objects_export_service_spec.rb index 894789c7941..4f721a3a259 100644 --- a/spec/services/bulk_imports/lfs_objects_export_service_spec.rb +++ b/spec/services/bulk_imports/lfs_objects_export_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe BulkImports::LfsObjectsExportService do +RSpec.describe BulkImports::LfsObjectsExportService, feature_category: :importers do let_it_be(:project) { create(:project) } let_it_be(:lfs_json_filename) { "#{BulkImports::FileTransfer::ProjectConfig::LFS_OBJECTS_RELATION}.json" } let_it_be(:remote_url) { 'http://my-object-storage.local' } diff --git a/spec/services/bulk_imports/relation_export_service_spec.rb b/spec/services/bulk_imports/relation_export_service_spec.rb index f0f85217d2e..bc999b0b9b3 100644 --- a/spec/services/bulk_imports/relation_export_service_spec.rb +++ b/spec/services/bulk_imports/relation_export_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe BulkImports::RelationExportService do +RSpec.describe BulkImports::RelationExportService, feature_category: :importers do let_it_be(:jid) { 'jid' } let_it_be(:relation) { 'labels' } let_it_be(:user) { create(:user) } diff --git a/spec/services/bulk_imports/repository_bundle_export_service_spec.rb b/spec/services/bulk_imports/repository_bundle_export_service_spec.rb index f0d63de1ab9..92d5d21c33f 100644 --- a/spec/services/bulk_imports/repository_bundle_export_service_spec.rb +++ b/spec/services/bulk_imports/repository_bundle_export_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe BulkImports::RepositoryBundleExportService do +RSpec.describe BulkImports::RepositoryBundleExportService, feature_category: :importers do let(:project) { create(:project) } let(:export_path) { Dir.mktmpdir } diff --git a/spec/services/bulk_imports/tree_export_service_spec.rb b/spec/services/bulk_imports/tree_export_service_spec.rb index 6e26cb6dc2b..fa96641f1c1 100644 --- a/spec/services/bulk_imports/tree_export_service_spec.rb +++ b/spec/services/bulk_imports/tree_export_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe BulkImports::TreeExportService do +RSpec.describe BulkImports::TreeExportService, feature_category: :importers do let_it_be(:project) { create(:project) } let_it_be(:export_path) { Dir.mktmpdir } diff --git a/spec/services/bulk_imports/uploads_export_service_spec.rb b/spec/services/bulk_imports/uploads_export_service_spec.rb index ad6e005485c..8dc67b28d12 100644 --- a/spec/services/bulk_imports/uploads_export_service_spec.rb +++ b/spec/services/bulk_imports/uploads_export_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe BulkImports::UploadsExportService do +RSpec.describe BulkImports::UploadsExportService, feature_category: :importers do let_it_be(:export_path) { Dir.mktmpdir } let_it_be(:project) { create(:project, avatar: fixture_file_upload('spec/fixtures/rails_sample.png', 'image/png')) } diff --git a/spec/services/bulk_push_event_payload_service_spec.rb b/spec/services/bulk_push_event_payload_service_spec.rb index 381c735c003..95e1c831498 100644 --- a/spec/services/bulk_push_event_payload_service_spec.rb +++ b/spec/services/bulk_push_event_payload_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe BulkPushEventPayloadService do +RSpec.describe BulkPushEventPayloadService, feature_category: :source_code_management do let(:event) { create(:push_event) } let(:push_data) do diff --git a/spec/services/bulk_update_integration_service_spec.rb b/spec/services/bulk_update_integration_service_spec.rb index 24a868b524d..260eed3c734 100644 --- a/spec/services/bulk_update_integration_service_spec.rb +++ b/spec/services/bulk_update_integration_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe BulkUpdateIntegrationService do +RSpec.describe BulkUpdateIntegrationService, feature_category: :integrations do include JiraIntegrationHelpers before_all do diff --git a/spec/services/captcha/captcha_verification_service_spec.rb b/spec/services/captcha/captcha_verification_service_spec.rb index fe2199fb53e..b67e725bf91 100644 --- a/spec/services/captcha/captcha_verification_service_spec.rb +++ b/spec/services/captcha/captcha_verification_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Captcha::CaptchaVerificationService do +RSpec.describe Captcha::CaptchaVerificationService, feature_category: :team_planning do describe '#execute' do let(:captcha_response) { 'abc123' } let(:fake_ip) { '1.2.3.4' } diff --git a/spec/services/chat_names/find_user_service_spec.rb b/spec/services/chat_names/find_user_service_spec.rb index 10cb0a2f065..14bece4efb4 100644 --- a/spec/services/chat_names/find_user_service_spec.rb +++ b/spec/services/chat_names/find_user_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe ChatNames::FindUserService, :clean_gitlab_redis_shared_state do +RSpec.describe ChatNames::FindUserService, :clean_gitlab_redis_shared_state, feature_category: :user_profile do describe '#execute' do subject { described_class.new(team_id, user_id).execute } diff --git a/spec/services/ci/abort_pipelines_service_spec.rb b/spec/services/ci/abort_pipelines_service_spec.rb index e43faf0af51..60f3ee11442 100644 --- a/spec/services/ci/abort_pipelines_service_spec.rb +++ b/spec/services/ci/abort_pipelines_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Ci::AbortPipelinesService do +RSpec.describe Ci::AbortPipelinesService, feature_category: :continuous_integration do let_it_be(:user) { create(:user) } let_it_be(:project) { create(:project, namespace: user.namespace) } diff --git a/spec/services/ci/append_build_trace_service_spec.rb b/spec/services/ci/append_build_trace_service_spec.rb index 20f7967d1f1..113c88dc5f3 100644 --- a/spec/services/ci/append_build_trace_service_spec.rb +++ b/spec/services/ci/append_build_trace_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Ci::AppendBuildTraceService do +RSpec.describe Ci::AppendBuildTraceService, feature_category: :continuous_integration do let_it_be(:project) { create(:project) } let_it_be(:pipeline) { create(:ci_pipeline, project: project) } let_it_be_with_reload(:build) { create(:ci_build, :running, pipeline: pipeline) } diff --git a/spec/services/ci/build_cancel_service_spec.rb b/spec/services/ci/build_cancel_service_spec.rb index fe036dc1368..314d2e86bd3 100644 --- a/spec/services/ci/build_cancel_service_spec.rb +++ b/spec/services/ci/build_cancel_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Ci::BuildCancelService do +RSpec.describe Ci::BuildCancelService, feature_category: :continuous_integration do let_it_be(:user) { create(:user) } let_it_be(:project) { create(:project) } let_it_be(:pipeline) { create(:ci_pipeline, project: project) } diff --git a/spec/services/ci/build_erase_service_spec.rb b/spec/services/ci/build_erase_service_spec.rb index e750a163621..35e74f76a26 100644 --- a/spec/services/ci/build_erase_service_spec.rb +++ b/spec/services/ci/build_erase_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Ci::BuildEraseService do +RSpec.describe Ci::BuildEraseService, feature_category: :continuous_integration do let_it_be(:user) { user } let(:build) { create(:ci_build, :artifacts, :trace_artifact, artifacts_expire_at: 100.days.from_now) } diff --git a/spec/services/ci/build_report_result_service_spec.rb b/spec/services/ci/build_report_result_service_spec.rb index c5238b7f5e0..c3ce6714241 100644 --- a/spec/services/ci/build_report_result_service_spec.rb +++ b/spec/services/ci/build_report_result_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Ci::BuildReportResultService do +RSpec.describe Ci::BuildReportResultService, feature_category: :continuous_integration do describe '#execute', :clean_gitlab_redis_shared_state do subject(:build_report_result) { described_class.new.execute(build) } diff --git a/spec/services/ci/build_unschedule_service_spec.rb b/spec/services/ci/build_unschedule_service_spec.rb index d784d9a2754..539c66047e4 100644 --- a/spec/services/ci/build_unschedule_service_spec.rb +++ b/spec/services/ci/build_unschedule_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Ci::BuildUnscheduleService do +RSpec.describe Ci::BuildUnscheduleService, feature_category: :continuous_integration do let_it_be(:user) { create(:user) } let_it_be(:project) { create(:project) } let_it_be(:pipeline) { create(:ci_pipeline, project: project) } diff --git a/spec/services/ci/catalog/add_resource_service_spec.rb b/spec/services/ci/catalog/add_resource_service_spec.rb new file mode 100644 index 00000000000..ecb939e3c2d --- /dev/null +++ b/spec/services/ci/catalog/add_resource_service_spec.rb @@ -0,0 +1,55 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe Ci::Catalog::AddResourceService, feature_category: :pipeline_composition do + let_it_be(:project) { create(:project, :repository, description: 'Our components') } + let_it_be(:user) { create(:user) } + + let(:service) { described_class.new(project, user) } + + describe '#execute' do + context 'with an unauthorized user' do + it 'raises an AccessDeniedError' do + expect { service.execute }.to raise_error(Gitlab::Access::AccessDeniedError) + end + end + + context 'with an authorized user' do + before do + project.add_owner(user) + end + + context 'and a valid project' do + it 'creates a catalog resource' do + response = service.execute + + expect(response.payload.project).to eq(project) + end + end + + context 'with an invalid project' do + let_it_be(:project) { create(:project, :repository) } + + it 'does not create a catalog resource' do + response = service.execute + + expect(response.message).to eq('Project must have a description') + end + end + + context 'with an invalid catalog resource' do + it 'does not save the catalog resource' do + catalog_resource = instance_double(::Ci::Catalog::Resource, + valid?: false, + errors: instance_double(ActiveModel::Errors, full_messages: ['not valid'])) + allow(::Ci::Catalog::Resource).to receive(:new).and_return(catalog_resource) + + response = service.execute + + expect(response.message).to eq('not valid') + end + end + end + end +end diff --git a/spec/services/ci/catalog/validate_resource_service_spec.rb b/spec/services/ci/catalog/validate_resource_service_spec.rb new file mode 100644 index 00000000000..3bee37b7e55 --- /dev/null +++ b/spec/services/ci/catalog/validate_resource_service_spec.rb @@ -0,0 +1,57 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe Ci::Catalog::ValidateResourceService, feature_category: :pipeline_composition do + describe '#execute' do + context 'with a project that has a README and a description' do + it 'is valid' do + project = create(:project, :repository, description: 'Component project') + response = described_class.new(project, project.default_branch).execute + + expect(response).to be_success + end + end + + context 'with a project that has neither a description nor a README' do + it 'is not valid' do + project = create(:project, :empty_repo) + project.repository.create_file( + project.creator, + 'ruby.rb', + 'I like this', + message: 'Ruby like this', + branch_name: 'master' + ) + response = described_class.new(project, project.default_branch).execute + + expect(response.message).to eq('Project must have a README , Project must have a description') + end + end + + context 'with a project that has a description but not a README' do + it 'is not valid' do + project = create(:project, :empty_repo, description: 'project with no README') + project.repository.create_file( + project.creator, + 'text.txt', + 'I do not like this', + message: 'only text like text', + branch_name: 'master' + ) + response = described_class.new(project, project.default_branch).execute + + expect(response.message).to eq('Project must have a README') + end + end + + context 'with a project that has a README and not a description' do + it 'is not valid' do + project = create(:project, :repository) + response = described_class.new(project, project.default_branch).execute + + expect(response.message).to eq('Project must have a description') + end + end + end +end diff --git a/spec/services/ci/change_variable_service_spec.rb b/spec/services/ci/change_variable_service_spec.rb index f86a87132b1..a9f9e4233d7 100644 --- a/spec/services/ci/change_variable_service_spec.rb +++ b/spec/services/ci/change_variable_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Ci::ChangeVariableService do +RSpec.describe Ci::ChangeVariableService, feature_category: :pipeline_composition do let(:service) { described_class.new(container: group, current_user: user, params: params) } let_it_be(:user) { create(:user) } diff --git a/spec/services/ci/change_variables_service_spec.rb b/spec/services/ci/change_variables_service_spec.rb index b710ca78554..1bc36a78762 100644 --- a/spec/services/ci/change_variables_service_spec.rb +++ b/spec/services/ci/change_variables_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Ci::ChangeVariablesService do +RSpec.describe Ci::ChangeVariablesService, feature_category: :pipeline_composition do let(:service) { described_class.new(container: group, current_user: user, params: params) } let_it_be(:user) { create(:user) } diff --git a/spec/services/ci/compare_accessibility_reports_service_spec.rb b/spec/services/ci/compare_accessibility_reports_service_spec.rb index e0b84219834..57514c18042 100644 --- a/spec/services/ci/compare_accessibility_reports_service_spec.rb +++ b/spec/services/ci/compare_accessibility_reports_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Ci::CompareAccessibilityReportsService do +RSpec.describe Ci::CompareAccessibilityReportsService, feature_category: :continuous_integration do let(:service) { described_class.new(project) } let(:project) { create(:project, :repository) } diff --git a/spec/services/ci/compare_codequality_reports_service_spec.rb b/spec/services/ci/compare_codequality_reports_service_spec.rb index ef762a2e9ad..de2300c354b 100644 --- a/spec/services/ci/compare_codequality_reports_service_spec.rb +++ b/spec/services/ci/compare_codequality_reports_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Ci::CompareCodequalityReportsService do +RSpec.describe Ci::CompareCodequalityReportsService, feature_category: :continuous_integration do let(:service) { described_class.new(project) } let(:project) { create(:project, :repository) } diff --git a/spec/services/ci/compare_reports_base_service_spec.rb b/spec/services/ci/compare_reports_base_service_spec.rb index 20d8cd37553..2906d61066d 100644 --- a/spec/services/ci/compare_reports_base_service_spec.rb +++ b/spec/services/ci/compare_reports_base_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Ci::CompareReportsBaseService do +RSpec.describe Ci::CompareReportsBaseService, feature_category: :continuous_integration do let(:service) { described_class.new(project) } let(:project) { create(:project, :repository) } diff --git a/spec/services/ci/compare_test_reports_service_spec.rb b/spec/services/ci/compare_test_reports_service_spec.rb index f259072fe87..d29cef0c583 100644 --- a/spec/services/ci/compare_test_reports_service_spec.rb +++ b/spec/services/ci/compare_test_reports_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Ci::CompareTestReportsService do +RSpec.describe Ci::CompareTestReportsService, feature_category: :continuous_integration do let(:service) { described_class.new(project) } let(:project) { create(:project, :repository) } diff --git a/spec/services/ci/components/fetch_service_spec.rb b/spec/services/ci/components/fetch_service_spec.rb index f2eaa8d31b4..532098b3b20 100644 --- a/spec/services/ci/components/fetch_service_spec.rb +++ b/spec/services/ci/components/fetch_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Ci::Components::FetchService, feature_category: :pipeline_authoring do +RSpec.describe Ci::Components::FetchService, feature_category: :pipeline_composition do let_it_be(:project) { create(:project, :repository, create_tag: 'v1.0') } let_it_be(:user) { create(:user) } let_it_be(:current_user) { user } diff --git a/spec/services/ci/copy_cross_database_associations_service_spec.rb b/spec/services/ci/copy_cross_database_associations_service_spec.rb index 5938ac258d0..2be0cbd9582 100644 --- a/spec/services/ci/copy_cross_database_associations_service_spec.rb +++ b/spec/services/ci/copy_cross_database_associations_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Ci::CopyCrossDatabaseAssociationsService do +RSpec.describe Ci::CopyCrossDatabaseAssociationsService, feature_category: :continuous_integration do let_it_be(:project) { create(:project) } let_it_be(:pipeline) { create(:ci_pipeline, project: project) } let_it_be(:old_build) { create(:ci_build, pipeline: pipeline) } diff --git a/spec/services/ci/create_pipeline_service/artifacts_spec.rb b/spec/services/ci/create_pipeline_service/artifacts_spec.rb index e5e405492a0..c193900b2d3 100644 --- a/spec/services/ci/create_pipeline_service/artifacts_spec.rb +++ b/spec/services/ci/create_pipeline_service/artifacts_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -RSpec.describe Ci::CreatePipelineService, :yaml_processor_feature_flag_corectness do +RSpec.describe Ci::CreatePipelineService, :yaml_processor_feature_flag_corectness, feature_category: :build_artifacts do let_it_be(:project) { create(:project, :repository) } let_it_be(:user) { project.first_owner } diff --git a/spec/services/ci/create_pipeline_service/cache_spec.rb b/spec/services/ci/create_pipeline_service/cache_spec.rb index f9640f99031..e8d9cec6695 100644 --- a/spec/services/ci/create_pipeline_service/cache_spec.rb +++ b/spec/services/ci/create_pipeline_service/cache_spec.rb @@ -2,7 +2,8 @@ require 'spec_helper' -RSpec.describe Ci::CreatePipelineService, :yaml_processor_feature_flag_corectness do +RSpec.describe Ci::CreatePipelineService, :yaml_processor_feature_flag_corectness, + feature_category: :continuous_integration do context 'cache' do let(:project) { create(:project, :custom_repo, files: files) } let(:user) { project.first_owner } diff --git a/spec/services/ci/create_pipeline_service/creation_errors_and_warnings_spec.rb b/spec/services/ci/create_pipeline_service/creation_errors_and_warnings_spec.rb index 0ebcecdd6e6..036116dc037 100644 --- a/spec/services/ci/create_pipeline_service/creation_errors_and_warnings_spec.rb +++ b/spec/services/ci/create_pipeline_service/creation_errors_and_warnings_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Ci::CreatePipelineService, :yaml_processor_feature_flag_corectness do +RSpec.describe Ci::CreatePipelineService, :yaml_processor_feature_flag_corectness, feature_category: :continuous_integration do describe 'creation errors and warnings' do let_it_be(:project) { create(:project, :repository) } let_it_be(:user) { project.first_owner } diff --git a/spec/services/ci/create_pipeline_service/cross_project_pipeline_spec.rb b/spec/services/ci/create_pipeline_service/cross_project_pipeline_spec.rb index 0d5017a763f..dc87cc872e3 100644 --- a/spec/services/ci/create_pipeline_service/cross_project_pipeline_spec.rb +++ b/spec/services/ci/create_pipeline_service/cross_project_pipeline_spec.rb @@ -2,7 +2,8 @@ require 'spec_helper' -RSpec.describe Ci::CreatePipelineService, '#execute', :yaml_processor_feature_flag_corectness do +RSpec.describe Ci::CreatePipelineService, '#execute', :yaml_processor_feature_flag_corectness, + feature_category: :continuous_integration do let_it_be(:group) { create(:group, name: 'my-organization') } let(:upstream_project) { create(:project, :repository, name: 'upstream', group: group) } diff --git a/spec/services/ci/create_pipeline_service/custom_config_content_spec.rb b/spec/services/ci/create_pipeline_service/custom_config_content_spec.rb index dafa227c4c8..819946bfd27 100644 --- a/spec/services/ci/create_pipeline_service/custom_config_content_spec.rb +++ b/spec/services/ci/create_pipeline_service/custom_config_content_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -RSpec.describe Ci::CreatePipelineService, :yaml_processor_feature_flag_corectness do +RSpec.describe Ci::CreatePipelineService, :yaml_processor_feature_flag_corectness, feature_category: :continuous_integration do let_it_be(:project) { create(:project, :repository) } let_it_be(:user) { project.first_owner } diff --git a/spec/services/ci/create_pipeline_service/custom_yaml_tags_spec.rb b/spec/services/ci/create_pipeline_service/custom_yaml_tags_spec.rb index 3b042f05fc0..b78ad68194a 100644 --- a/spec/services/ci/create_pipeline_service/custom_yaml_tags_spec.rb +++ b/spec/services/ci/create_pipeline_service/custom_yaml_tags_spec.rb @@ -1,7 +1,8 @@ # frozen_string_literal: true require 'spec_helper' -RSpec.describe Ci::CreatePipelineService, :yaml_processor_feature_flag_corectness do +RSpec.describe Ci::CreatePipelineService, :yaml_processor_feature_flag_corectness, + feature_category: :continuous_integration do describe '!reference tags' do let_it_be(:project) { create(:project, :repository) } let_it_be(:user) { project.first_owner } diff --git a/spec/services/ci/create_pipeline_service/dry_run_spec.rb b/spec/services/ci/create_pipeline_service/dry_run_spec.rb index de1ed251c82..7136fa5dc13 100644 --- a/spec/services/ci/create_pipeline_service/dry_run_spec.rb +++ b/spec/services/ci/create_pipeline_service/dry_run_spec.rb @@ -2,7 +2,8 @@ require 'spec_helper' -RSpec.describe Ci::CreatePipelineService, :yaml_processor_feature_flag_corectness do +RSpec.describe Ci::CreatePipelineService, :yaml_processor_feature_flag_corectness, + feature_category: :continuous_integration do let_it_be(:project) { create(:project, :repository) } let_it_be(:user) { project.first_owner } diff --git a/spec/services/ci/create_pipeline_service/environment_spec.rb b/spec/services/ci/create_pipeline_service/environment_spec.rb index b713cad2cad..96e54af43cd 100644 --- a/spec/services/ci/create_pipeline_service/environment_spec.rb +++ b/spec/services/ci/create_pipeline_service/environment_spec.rb @@ -2,7 +2,8 @@ require 'spec_helper' -RSpec.describe Ci::CreatePipelineService, :yaml_processor_feature_flag_corectness do +RSpec.describe Ci::CreatePipelineService, :yaml_processor_feature_flag_corectness, + feature_category: :pipeline_composition do let_it_be(:project) { create(:project, :repository) } let_it_be(:developer) { create(:user) } diff --git a/spec/services/ci/create_pipeline_service/evaluate_runner_tags_spec.rb b/spec/services/ci/create_pipeline_service/evaluate_runner_tags_spec.rb index e84726d31f6..b40e504f99b 100644 --- a/spec/services/ci/create_pipeline_service/evaluate_runner_tags_spec.rb +++ b/spec/services/ci/create_pipeline_service/evaluate_runner_tags_spec.rb @@ -2,7 +2,8 @@ require 'spec_helper' -RSpec.describe Ci::CreatePipelineService, :yaml_processor_feature_flag_corectness do +RSpec.describe Ci::CreatePipelineService, :yaml_processor_feature_flag_corectness, + feature_category: :pipeline_composition do let_it_be(:group) { create(:group, :private) } let_it_be(:group_variable) { create(:ci_group_variable, group: group, key: 'RUNNER_TAG', value: 'group') } let_it_be(:project) { create(:project, :repository, group: group) } diff --git a/spec/services/ci/create_pipeline_service/include_spec.rb b/spec/services/ci/create_pipeline_service/include_spec.rb index f18b4883aaf..86f71be5971 100644 --- a/spec/services/ci/create_pipeline_service/include_spec.rb +++ b/spec/services/ci/create_pipeline_service/include_spec.rb @@ -3,7 +3,7 @@ require 'spec_helper' RSpec.describe Ci::CreatePipelineService, -:yaml_processor_feature_flag_corectness, feature_category: :pipeline_authoring do +:yaml_processor_feature_flag_corectness, feature_category: :pipeline_composition do include RepoHelpers context 'include:' do diff --git a/spec/services/ci/create_pipeline_service/limit_active_jobs_spec.rb b/spec/services/ci/create_pipeline_service/limit_active_jobs_spec.rb index 003d109a27c..b0730eaf215 100644 --- a/spec/services/ci/create_pipeline_service/limit_active_jobs_spec.rb +++ b/spec/services/ci/create_pipeline_service/limit_active_jobs_spec.rb @@ -1,7 +1,8 @@ # frozen_string_literal: true require 'spec_helper' -RSpec.describe Ci::CreatePipelineService, :yaml_processor_feature_flag_corectness do +RSpec.describe Ci::CreatePipelineService, :yaml_processor_feature_flag_corectness, + feature_category: :continuous_integration do let_it_be(:project) { create(:project, :repository) } let_it_be(:user) { project.first_owner } let_it_be(:existing_pipeline) { create(:ci_pipeline, project: project) } diff --git a/spec/services/ci/create_pipeline_service/logger_spec.rb b/spec/services/ci/create_pipeline_service/logger_spec.rb index ecb24a61075..082a09db69e 100644 --- a/spec/services/ci/create_pipeline_service/logger_spec.rb +++ b/spec/services/ci/create_pipeline_service/logger_spec.rb @@ -142,7 +142,7 @@ RSpec.describe Ci::CreatePipelineService, # rubocop: disable RSpec/FilePath describe 'pipeline includes count' do before do - stub_const('Gitlab::Ci::Config::External::Context::MAX_INCLUDES', 2) + stub_const('Gitlab::Ci::Config::External::Context::TEMP_MAX_INCLUDES', 2) end context 'when the includes count exceeds the maximum' do diff --git a/spec/services/ci/create_pipeline_service/merge_requests_spec.rb b/spec/services/ci/create_pipeline_service/merge_requests_spec.rb index 80f48451e5c..8d04b3d020f 100644 --- a/spec/services/ci/create_pipeline_service/merge_requests_spec.rb +++ b/spec/services/ci/create_pipeline_service/merge_requests_spec.rb @@ -2,7 +2,8 @@ require 'spec_helper' -RSpec.describe Ci::CreatePipelineService, :yaml_processor_feature_flag_corectness do +RSpec.describe Ci::CreatePipelineService, :yaml_processor_feature_flag_corectness, +feature_category: :continuous_integration do context 'merge requests handling' do let_it_be(:project) { create(:project, :repository) } let_it_be(:user) { project.first_owner } diff --git a/spec/services/ci/create_pipeline_service/needs_spec.rb b/spec/services/ci/create_pipeline_service/needs_spec.rb index 38e330316ea..068cad68e64 100644 --- a/spec/services/ci/create_pipeline_service/needs_spec.rb +++ b/spec/services/ci/create_pipeline_service/needs_spec.rb @@ -2,7 +2,8 @@ require 'spec_helper' -RSpec.describe Ci::CreatePipelineService, :yaml_processor_feature_flag_corectness do +RSpec.describe Ci::CreatePipelineService, :yaml_processor_feature_flag_corectness, + feature_category: :pipeline_composition do context 'needs' do let_it_be(:project) { create(:project, :repository) } let_it_be(:user) { project.first_owner } diff --git a/spec/services/ci/create_pipeline_service/parallel_spec.rb b/spec/services/ci/create_pipeline_service/parallel_spec.rb index 5ee378a9719..71434fe0b0c 100644 --- a/spec/services/ci/create_pipeline_service/parallel_spec.rb +++ b/spec/services/ci/create_pipeline_service/parallel_spec.rb @@ -1,7 +1,8 @@ # frozen_string_literal: true require 'spec_helper' -RSpec.describe Ci::CreatePipelineService, :yaml_processor_feature_flag_corectness do +RSpec.describe Ci::CreatePipelineService, :yaml_processor_feature_flag_corectness, + feature_category: :continuous_integration do let_it_be(:project) { create(:project, :repository) } let_it_be(:user) { project.first_owner } diff --git a/spec/services/ci/create_pipeline_service/parameter_content_spec.rb b/spec/services/ci/create_pipeline_service/parameter_content_spec.rb index cae88bb67cf..16555dd68d6 100644 --- a/spec/services/ci/create_pipeline_service/parameter_content_spec.rb +++ b/spec/services/ci/create_pipeline_service/parameter_content_spec.rb @@ -2,7 +2,8 @@ require 'spec_helper' -RSpec.describe Ci::CreatePipelineService, :yaml_processor_feature_flag_corectness do +RSpec.describe Ci::CreatePipelineService, :yaml_processor_feature_flag_corectness, + feature_category: :continuous_integration do let_it_be(:project) { create(:project, :repository) } let_it_be(:user) { project.first_owner } diff --git a/spec/services/ci/create_pipeline_service/parent_child_pipeline_spec.rb b/spec/services/ci/create_pipeline_service/parent_child_pipeline_spec.rb index eb17935967c..e644273df9a 100644 --- a/spec/services/ci/create_pipeline_service/parent_child_pipeline_spec.rb +++ b/spec/services/ci/create_pipeline_service/parent_child_pipeline_spec.rb @@ -2,7 +2,8 @@ require 'spec_helper' -RSpec.describe Ci::CreatePipelineService, '#execute', :yaml_processor_feature_flag_corectness do +RSpec.describe Ci::CreatePipelineService, '#execute', :yaml_processor_feature_flag_corectness, + feature_category: :continuous_integration do let_it_be(:project) { create(:project, :repository) } let_it_be(:user) { create(:user) } diff --git a/spec/services/ci/create_pipeline_service/pre_post_stages_spec.rb b/spec/services/ci/create_pipeline_service/pre_post_stages_spec.rb index db110bdc608..d935824e6cc 100644 --- a/spec/services/ci/create_pipeline_service/pre_post_stages_spec.rb +++ b/spec/services/ci/create_pipeline_service/pre_post_stages_spec.rb @@ -1,7 +1,8 @@ # frozen_string_literal: true require 'spec_helper' -RSpec.describe Ci::CreatePipelineService, :yaml_processor_feature_flag_corectness do +RSpec.describe Ci::CreatePipelineService, :yaml_processor_feature_flag_corectness, + feature_category: :continuous_integration do describe '.pre/.post stages' do let_it_be(:project) { create(:project, :repository) } let_it_be(:user) { project.first_owner } diff --git a/spec/services/ci/create_pipeline_service/rate_limit_spec.rb b/spec/services/ci/create_pipeline_service/rate_limit_spec.rb index dfa74870341..31bea10f062 100644 --- a/spec/services/ci/create_pipeline_service/rate_limit_spec.rb +++ b/spec/services/ci/create_pipeline_service/rate_limit_spec.rb @@ -3,7 +3,8 @@ require 'spec_helper' RSpec.describe Ci::CreatePipelineService, :freeze_time, :clean_gitlab_redis_rate_limiting, - :yaml_processor_feature_flag_corectness do + :yaml_processor_feature_flag_corectness, + feature_category: :continuous_integration do describe 'rate limiting' do let_it_be(:project) { create(:project, :repository) } let_it_be(:user) { project.first_owner } diff --git a/spec/services/ci/create_pipeline_service/rules_spec.rb b/spec/services/ci/create_pipeline_service/rules_spec.rb index 26bb8b7d006..19f9e7e3e4a 100644 --- a/spec/services/ci/create_pipeline_service/rules_spec.rb +++ b/spec/services/ci/create_pipeline_service/rules_spec.rb @@ -1,25 +1,18 @@ # frozen_string_literal: true require 'spec_helper' -RSpec.describe Ci::CreatePipelineService, :yaml_processor_feature_flag_corectness, feature_category: :pipeline_authoring do +RSpec.describe Ci::CreatePipelineService, :yaml_processor_feature_flag_corectness, feature_category: :pipeline_composition do let(:project) { create(:project, :repository) } let(:user) { project.first_owner } let(:ref) { 'refs/heads/master' } let(:source) { :push } - let(:service) { described_class.new(project, user, { ref: ref }) } - let(:response) { execute_service } + let(:service) { described_class.new(project, user, initialization_params) } + let(:response) { service.execute(source) } let(:pipeline) { response.payload } let(:build_names) { pipeline.builds.pluck(:name) } - def execute_service(before: '00000000', variables_attributes: nil) - params = { ref: ref, before: before, after: project.commit(ref).sha, variables_attributes: variables_attributes } - - described_class - .new(project, user, params) - .execute(source) do |pipeline| - yield(pipeline) if block_given? - end - end + let(:base_initialization_params) { { ref: ref, before: '00000000', after: project.commit(ref).sha, variables_attributes: nil } } + let(:initialization_params) { base_initialization_params } context 'job:rules' do let(:regular_job) { find_job('regular-job') } @@ -516,11 +509,10 @@ RSpec.describe Ci::CreatePipelineService, :yaml_processor_feature_flag_corectnes ) end + let(:initialization_params) { base_initialization_params.merge(before: nil) } let(:changed_file) { 'file2.txt' } let(:ref) { 'feature_2' } - let(:response) { execute_service(before: nil) } - context 'for jobs rules' do let(:config) do <<-EOY @@ -1230,9 +1222,7 @@ RSpec.describe Ci::CreatePipelineService, :yaml_processor_feature_flag_corectnes end context 'with pipeline variables' do - let(:pipeline) do - execute_service(variables_attributes: variables_attributes).payload - end + let(:initialization_params) { base_initialization_params.merge(variables_attributes: variables_attributes) } let(:config) do <<-EOY @@ -1267,10 +1257,10 @@ RSpec.describe Ci::CreatePipelineService, :yaml_processor_feature_flag_corectnes end context 'with trigger variables' do - let(:pipeline) do - execute_service do |pipeline| + let(:response) do + service.execute(source) do |pipeline| pipeline.variables.build(variables) - end.payload + end end let(:config) do @@ -1434,10 +1424,10 @@ RSpec.describe Ci::CreatePipelineService, :yaml_processor_feature_flag_corectnes [{ key: 'SOME_VARIABLE', secret_value: 'SOME_VAL' }] end - let(:pipeline) do - execute_service do |pipeline| + let(:response) do + service.execute(source) do |pipeline| pipeline.variables.build(variables) - end.payload + end end let(:config) do diff --git a/spec/services/ci/create_pipeline_service/scripts_spec.rb b/spec/services/ci/create_pipeline_service/scripts_spec.rb index 50b558e505a..d541257a086 100644 --- a/spec/services/ci/create_pipeline_service/scripts_spec.rb +++ b/spec/services/ci/create_pipeline_service/scripts_spec.rb @@ -2,7 +2,8 @@ require 'spec_helper' -RSpec.describe Ci::CreatePipelineService, :yaml_processor_feature_flag_corectness do +RSpec.describe Ci::CreatePipelineService, :yaml_processor_feature_flag_corectness, + feature_category: :continuous_integration do let_it_be(:project) { create(:project, :repository) } let_it_be(:user) { project.first_owner } @@ -83,30 +84,5 @@ RSpec.describe Ci::CreatePipelineService, :yaml_processor_feature_flag_corectnes options: { script: ["echo 'hello job3 script'"] } ) end - - context 'when the FF ci_hooks_pre_get_sources_script is disabled' do - before do - stub_feature_flags(ci_hooks_pre_get_sources_script: false) - end - - it 'creates jobs without hook data' do - expect(pipeline).to be_created_successfully - expect(pipeline.builds.find_by(name: 'job1')).to have_attributes( - name: 'job1', - stage: 'test', - options: { script: ["echo 'hello job1 script'"] } - ) - expect(pipeline.builds.find_by(name: 'job2')).to have_attributes( - name: 'job2', - stage: 'test', - options: { script: ["echo 'hello job2 script'"] } - ) - expect(pipeline.builds.find_by(name: 'job3')).to have_attributes( - name: 'job3', - stage: 'test', - options: { script: ["echo 'hello job3 script'"] } - ) - end - end end end diff --git a/spec/services/ci/create_pipeline_service/tags_spec.rb b/spec/services/ci/create_pipeline_service/tags_spec.rb index 7450df11eac..cb2dbf1c3a4 100644 --- a/spec/services/ci/create_pipeline_service/tags_spec.rb +++ b/spec/services/ci/create_pipeline_service/tags_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -RSpec.describe Ci::CreatePipelineService, :yaml_processor_feature_flag_corectness do +RSpec.describe Ci::CreatePipelineService, :yaml_processor_feature_flag_corectness, feature_category: :continuous_integration do describe 'tags:' do let_it_be(:project) { create(:project, :repository) } let_it_be(:user) { project.first_owner } diff --git a/spec/services/ci/create_pipeline_service/variables_spec.rb b/spec/services/ci/create_pipeline_service/variables_spec.rb index fd138bde656..64f8b90f2f2 100644 --- a/spec/services/ci/create_pipeline_service/variables_spec.rb +++ b/spec/services/ci/create_pipeline_service/variables_spec.rb @@ -2,7 +2,8 @@ require 'spec_helper' -RSpec.describe Ci::CreatePipelineService, :yaml_processor_feature_flag_corectness do +RSpec.describe Ci::CreatePipelineService, :yaml_processor_feature_flag_corectness, + feature_category: :pipeline_composition do let_it_be(:project) { create(:project, :repository) } let_it_be(:user) { project.first_owner } diff --git a/spec/services/ci/create_web_ide_terminal_service_spec.rb b/spec/services/ci/create_web_ide_terminal_service_spec.rb index 3462b48cfe7..b22ca1472b7 100644 --- a/spec/services/ci/create_web_ide_terminal_service_spec.rb +++ b/spec/services/ci/create_web_ide_terminal_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Ci::CreateWebIdeTerminalService do +RSpec.describe Ci::CreateWebIdeTerminalService, feature_category: :continuous_integration do let_it_be(:project) { create(:project, :repository) } let_it_be(:user) { create(:user) } diff --git a/spec/services/ci/daily_build_group_report_result_service_spec.rb b/spec/services/ci/daily_build_group_report_result_service_spec.rb index 32651247adb..bb6ce559fbd 100644 --- a/spec/services/ci/daily_build_group_report_result_service_spec.rb +++ b/spec/services/ci/daily_build_group_report_result_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Ci::DailyBuildGroupReportResultService, '#execute' do +RSpec.describe Ci::DailyBuildGroupReportResultService, '#execute', feature_category: :continuous_integration do let_it_be(:group) { create(:group, :private) } let_it_be(:pipeline) { create(:ci_pipeline, project: create(:project, group: group), created_at: '2020-02-06 00:01:10') } let_it_be(:rspec_job) { create(:ci_build, pipeline: pipeline, name: 'rspec 3/3', coverage: 80) } diff --git a/spec/services/ci/delete_objects_service_spec.rb b/spec/services/ci/delete_objects_service_spec.rb index 448f8979681..d84ee596721 100644 --- a/spec/services/ci/delete_objects_service_spec.rb +++ b/spec/services/ci/delete_objects_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Ci::DeleteObjectsService, :aggregate_failure do +RSpec.describe Ci::DeleteObjectsService, :aggregate_failure, feature_category: :continuous_integration do let(:service) { described_class.new } let(:artifact) { create(:ci_job_artifact, :archive) } let(:data) { [artifact] } diff --git a/spec/services/ci/delete_unit_tests_service_spec.rb b/spec/services/ci/delete_unit_tests_service_spec.rb index 4c63c513d48..2f07e709107 100644 --- a/spec/services/ci/delete_unit_tests_service_spec.rb +++ b/spec/services/ci/delete_unit_tests_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Ci::DeleteUnitTestsService do +RSpec.describe Ci::DeleteUnitTestsService, feature_category: :continuous_integration do describe '#execute' do let!(:unit_test_1) { create(:ci_unit_test) } let!(:unit_test_2) { create(:ci_unit_test) } diff --git a/spec/services/ci/deployments/destroy_service_spec.rb b/spec/services/ci/deployments/destroy_service_spec.rb index 60a57c05728..d0e7f5acb2b 100644 --- a/spec/services/ci/deployments/destroy_service_spec.rb +++ b/spec/services/ci/deployments/destroy_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe ::Ci::Deployments::DestroyService do +RSpec.describe ::Ci::Deployments::DestroyService, feature_category: :continuous_integration do let_it_be(:project) { create(:project, :repository) } let(:environment) { create(:environment, project: project) } diff --git a/spec/services/ci/destroy_pipeline_service_spec.rb b/spec/services/ci/destroy_pipeline_service_spec.rb index 6bd7fe7559c..a1883d90b0a 100644 --- a/spec/services/ci/destroy_pipeline_service_spec.rb +++ b/spec/services/ci/destroy_pipeline_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe ::Ci::DestroyPipelineService do +RSpec.describe ::Ci::DestroyPipelineService, feature_category: :continuous_integration do let_it_be(:project) { create(:project, :repository) } let!(:pipeline) { create(:ci_pipeline, :success, project: project, sha: project.commit.id) } diff --git a/spec/services/ci/destroy_secure_file_service_spec.rb b/spec/services/ci/destroy_secure_file_service_spec.rb index 6a30d33f4ca..321efc2ed71 100644 --- a/spec/services/ci/destroy_secure_file_service_spec.rb +++ b/spec/services/ci/destroy_secure_file_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe ::Ci::DestroySecureFileService do +RSpec.describe ::Ci::DestroySecureFileService, feature_category: :continuous_integration do let_it_be(:maintainer_user) { create(:user) } let_it_be(:developer_user) { create(:user) } let_it_be(:project) { create(:project) } diff --git a/spec/services/ci/disable_user_pipeline_schedules_service_spec.rb b/spec/services/ci/disable_user_pipeline_schedules_service_spec.rb index 4ff8dcf075b..d422cf0dab9 100644 --- a/spec/services/ci/disable_user_pipeline_schedules_service_spec.rb +++ b/spec/services/ci/disable_user_pipeline_schedules_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Ci::DisableUserPipelineSchedulesService do +RSpec.describe Ci::DisableUserPipelineSchedulesService, feature_category: :continuous_integration do describe '#execute' do let(:user) { create(:user) } diff --git a/spec/services/ci/drop_pipeline_service_spec.rb b/spec/services/ci/drop_pipeline_service_spec.rb index ddb53712d9c..ed45b3460c1 100644 --- a/spec/services/ci/drop_pipeline_service_spec.rb +++ b/spec/services/ci/drop_pipeline_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Ci::DropPipelineService do +RSpec.describe Ci::DropPipelineService, feature_category: :continuous_integration do let_it_be(:user) { create(:user) } let(:failure_reason) { :user_blocked } diff --git a/spec/services/ci/ensure_stage_service_spec.rb b/spec/services/ci/ensure_stage_service_spec.rb index 026814edda6..5d6025095a1 100644 --- a/spec/services/ci/ensure_stage_service_spec.rb +++ b/spec/services/ci/ensure_stage_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Ci::EnsureStageService, '#execute' do +RSpec.describe Ci::EnsureStageService, '#execute', feature_category: :continuous_integration do let_it_be(:project) { create(:project) } let_it_be(:user) { create(:user) } diff --git a/spec/services/ci/expire_pipeline_cache_service_spec.rb b/spec/services/ci/expire_pipeline_cache_service_spec.rb index 8cfe756faf3..3d0ce456aa5 100644 --- a/spec/services/ci/expire_pipeline_cache_service_spec.rb +++ b/spec/services/ci/expire_pipeline_cache_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Ci::ExpirePipelineCacheService do +RSpec.describe Ci::ExpirePipelineCacheService, feature_category: :continuous_integration do let_it_be(:user) { create(:user) } let_it_be(:project) { create(:project) } let_it_be(:pipeline) { create(:ci_pipeline, project: project) } diff --git a/spec/services/ci/external_pull_requests/create_pipeline_service_spec.rb b/spec/services/ci/external_pull_requests/create_pipeline_service_spec.rb index d5881d3b204..1b548aaf614 100644 --- a/spec/services/ci/external_pull_requests/create_pipeline_service_spec.rb +++ b/spec/services/ci/external_pull_requests/create_pipeline_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Ci::ExternalPullRequests::CreatePipelineService do +RSpec.describe Ci::ExternalPullRequests::CreatePipelineService, feature_category: :continuous_integration do describe '#execute' do let_it_be(:project) { create(:project, :auto_devops, :repository) } let_it_be(:user) { create(:user) } diff --git a/spec/services/ci/find_exposed_artifacts_service_spec.rb b/spec/services/ci/find_exposed_artifacts_service_spec.rb index 6e11c153a75..69360e73b86 100644 --- a/spec/services/ci/find_exposed_artifacts_service_spec.rb +++ b/spec/services/ci/find_exposed_artifacts_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Ci::FindExposedArtifactsService do +RSpec.describe Ci::FindExposedArtifactsService, feature_category: :build_artifacts do include Gitlab::Routing let(:metadata) do diff --git a/spec/services/ci/generate_codequality_mr_diff_report_service_spec.rb b/spec/services/ci/generate_codequality_mr_diff_report_service_spec.rb index 63bc7a1caf8..c33b182e9a9 100644 --- a/spec/services/ci/generate_codequality_mr_diff_report_service_spec.rb +++ b/spec/services/ci/generate_codequality_mr_diff_report_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Ci::GenerateCodequalityMrDiffReportService do +RSpec.describe Ci::GenerateCodequalityMrDiffReportService, feature_category: :code_review_workflow do let(:service) { described_class.new(project) } let(:project) { create(:project, :repository) } diff --git a/spec/services/ci/generate_coverage_reports_service_spec.rb b/spec/services/ci/generate_coverage_reports_service_spec.rb index 212e6be9d07..811431bf9d6 100644 --- a/spec/services/ci/generate_coverage_reports_service_spec.rb +++ b/spec/services/ci/generate_coverage_reports_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Ci::GenerateCoverageReportsService do +RSpec.describe Ci::GenerateCoverageReportsService, feature_category: :code_testing do let_it_be(:project) { create(:project, :repository) } let(:service) { described_class.new(project) } diff --git a/spec/services/ci/generate_kubeconfig_service_spec.rb b/spec/services/ci/generate_kubeconfig_service_spec.rb index c0858b0f0c9..da18dfe04c3 100644 --- a/spec/services/ci/generate_kubeconfig_service_spec.rb +++ b/spec/services/ci/generate_kubeconfig_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Ci::GenerateKubeconfigService do +RSpec.describe Ci::GenerateKubeconfigService, feature_category: :kubernetes_management do describe '#execute' do let_it_be(:group) { create(:group) } let_it_be(:project) { create(:project, group: group) } diff --git a/spec/services/ci/generate_terraform_reports_service_spec.rb b/spec/services/ci/generate_terraform_reports_service_spec.rb index c32e8bcaeb8..b2142d391b8 100644 --- a/spec/services/ci/generate_terraform_reports_service_spec.rb +++ b/spec/services/ci/generate_terraform_reports_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Ci::GenerateTerraformReportsService do +RSpec.describe Ci::GenerateTerraformReportsService, feature_category: :infrastructure_as_code do let_it_be(:project) { create(:project, :repository) } describe '#execute' do diff --git a/spec/services/ci/job_artifacts/bulk_delete_by_project_service_spec.rb b/spec/services/ci/job_artifacts/bulk_delete_by_project_service_spec.rb new file mode 100644 index 00000000000..a180837f9a9 --- /dev/null +++ b/spec/services/ci/job_artifacts/bulk_delete_by_project_service_spec.rb @@ -0,0 +1,121 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe ::Ci::JobArtifacts::BulkDeleteByProjectService, "#execute", feature_category: :build_artifacts do + subject(:execute) do + described_class.new( + job_artifact_ids: job_artifact_ids, + current_user: current_user, + project: project).execute + end + + let_it_be(:current_user) { create(:user) } + let_it_be(:build, reload: true) do + create(:ci_build, :artifacts, :trace_artifact, user: current_user) + end + + let_it_be(:project) { build.project } + let_it_be(:job_artifact_ids) { build.job_artifacts.map(&:id) } + + describe '#execute' do + context 'when number of artifacts exceeds limits to delete' do + let_it_be(:second_build, reload: true) do + create(:ci_build, :artifacts, :trace_artifact, user: current_user, project: project) + end + + let_it_be(:job_artifact_ids) { ::Ci::JobArtifact.all.map(&:id) } + + before do + project.add_maintainer(current_user) + stub_const("#{described_class}::JOB_ARTIFACTS_COUNT_LIMIT", 1) + end + + it 'fails to destroy' do + result = execute + + expect(result).to be_error + expect(result[:message]).to eq('Can only delete up to 1 job artifacts per call') + end + end + + context 'when requested not existing artifacts do delete' do + let_it_be(:deleted_build, reload: true) do + create(:ci_build, :artifacts, :trace_artifact, user: current_user, project: project) + end + + let_it_be(:deleted_job_artifacts) { deleted_build.job_artifacts } + let_it_be(:job_artifact_ids) { ::Ci::JobArtifact.all.map(&:id) } + + before do + project.add_maintainer(current_user) + deleted_job_artifacts.each(&:destroy!) + end + + it 'fails to destroy' do + result = execute + + expect(result).to be_error + expect(result[:message]).to eq("Artifacts (#{deleted_job_artifacts.map(&:id).join(',')}) not found") + end + end + + context 'when maintainer has access to the project' do + before do + project.add_maintainer(current_user) + end + + it 'is successful' do + result = execute + + expect(result).to be_success + expect(result.payload).to eq( + { + destroyed_count: job_artifact_ids.count, + destroyed_ids: job_artifact_ids, + errors: [] + } + ) + expect(::Ci::JobArtifact.where(id: job_artifact_ids).count).to eq(0) + end + + context 'and partially owns artifacts' do + let_it_be(:orphan_artifact) { create(:ci_job_artifact, :archive) } + let_it_be(:orphan_artifact_id) { orphan_artifact.id } + let_it_be(:owned_artifacts_ids) { build.job_artifacts.erasable.map(&:id) } + let_it_be(:job_artifact_ids) { [orphan_artifact_id] + owned_artifacts_ids } + + it 'fails to destroy' do + result = execute + + expect(result).to be_error + expect(result[:message]).to be('Not all artifacts belong to requested project') + expect(::Ci::JobArtifact.where(id: job_artifact_ids).count).to eq(3) + end + end + + context 'and request all artifacts from a different project' do + let_it_be(:different_project_artifact) { create(:ci_job_artifact, :archive) } + let_it_be(:job_artifact_ids) { [different_project_artifact] } + + let_it_be(:different_build, reload: true) do + create(:ci_build, :artifacts, :trace_artifact, user: current_user) + end + + let_it_be(:different_project) { different_build.project } + + before do + different_project.add_maintainer(current_user) + end + + it 'returns a error' do + result = execute + + expect(result).to be_error + expect(result[:message]).to be('Not all artifacts belong to requested project') + expect(::Ci::JobArtifact.where(id: job_artifact_ids).count).to eq(job_artifact_ids.count) + end + end + end + end +end diff --git a/spec/services/ci/job_artifacts/create_service_spec.rb b/spec/services/ci/job_artifacts/create_service_spec.rb index 47e9e5994ef..69f760e28ca 100644 --- a/spec/services/ci/job_artifacts/create_service_spec.rb +++ b/spec/services/ci/job_artifacts/create_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Ci::JobArtifacts::CreateService do +RSpec.describe Ci::JobArtifacts::CreateService, feature_category: :build_artifacts do let_it_be(:project) { create(:project) } let(:service) { described_class.new(job) } @@ -33,6 +33,66 @@ RSpec.describe Ci::JobArtifacts::CreateService do describe '#execute' do subject { service.execute(artifacts_file, params, metadata_file: metadata_file) } + def expect_accessibility_be(accessibility) + if accessibility == :public + expect(job.job_artifacts).to all be_public_accessibility + else + expect(job.job_artifacts).to all be_private_accessibility + end + end + + shared_examples 'job does not have public artifacts in the CI config' do |expected_artifacts_count, accessibility| + it "sets accessibility by default to #{accessibility}" do + expect { subject }.to change { Ci::JobArtifact.count }.by(expected_artifacts_count) + + expect_accessibility_be(accessibility) + end + end + + shared_examples 'job artifact set as private in the CI config' do |expected_artifacts_count, accessibility| + let!(:job) { create(:ci_build, :with_private_artifacts_config, project: project) } + + it "sets accessibility to #{accessibility}" do + expect { subject }.to change { Ci::JobArtifact.count }.by(expected_artifacts_count) + + expect_accessibility_be(accessibility) + end + end + + shared_examples 'job artifact set as public in the CI config' do |expected_artifacts_count, accessibility| + let!(:job) { create(:ci_build, :with_public_artifacts_config, project: project) } + + it "sets accessibility to #{accessibility}" do + expect { subject }.to change { Ci::JobArtifact.count }.by(expected_artifacts_count) + + expect_accessibility_be(accessibility) + end + end + + shared_examples 'when accessibility level passed as private' do |expected_artifacts_count, accessibility| + before do + params.merge!('accessibility' => 'private') + end + + it 'sets accessibility to private level' do + expect { subject }.to change { Ci::JobArtifact.count }.by(expected_artifacts_count) + + expect_accessibility_be(accessibility) + end + end + + shared_examples 'when accessibility passed as public' do |expected_artifacts_count| + before do + params.merge!('accessibility' => 'public') + end + + it 'sets accessibility level to public' do + expect { subject }.to change { Ci::JobArtifact.count }.by(expected_artifacts_count) + + expect(job.job_artifacts).to all be_public_accessibility + end + end + context 'when artifacts file is uploaded' do it 'logs the created artifact' do expect(Gitlab::Ci::Artifacts::Logger) @@ -61,37 +121,19 @@ RSpec.describe Ci::JobArtifacts::CreateService do expect(new_artifact.locked).to eq(job.pipeline.locked) end - it 'sets accessibility level by default to public' do - expect { subject }.to change { Ci::JobArtifact.count }.by(1) - - new_artifact = job.job_artifacts.last - expect(new_artifact).to be_public_accessibility - end - - context 'when accessibility level passed as private' do + context 'when non_public_artifacts feature flag is disabled' do before do - params.merge!('accessibility' => 'private') + stub_feature_flags(non_public_artifacts: false) end - it 'sets accessibility level to private' do - expect { subject }.to change { Ci::JobArtifact.count }.by(1) - - new_artifact = job.job_artifacts.last - expect(new_artifact).to be_private_accessibility + context 'when accessibility level not passed to the service' do + it_behaves_like 'job does not have public artifacts in the CI config', 1, :public + it_behaves_like 'job artifact set as private in the CI config', 1, :public + it_behaves_like 'job artifact set as public in the CI config', 1, :public end - end - context 'when accessibility passed as public' do - before do - params.merge!('accessibility' => 'public') - end - - it 'sets accessibility to public level' do - expect { subject }.to change { Ci::JobArtifact.count }.by(1) - - new_artifact = job.job_artifacts.last - expect(new_artifact).to be_public_accessibility - end + it_behaves_like 'when accessibility level passed as private', 1, :public + it_behaves_like 'when accessibility passed as public', 1 end context 'when accessibility passed as invalid value' do @@ -104,6 +146,16 @@ RSpec.describe Ci::JobArtifacts::CreateService do end end + context 'when accessibility level not passed to the service' do + it_behaves_like 'job does not have public artifacts in the CI config', 1, :public + it_behaves_like 'job artifact set as private in the CI config', 1, :private + it_behaves_like 'job artifact set as public in the CI config', 1, :public + end + + it_behaves_like 'when accessibility level passed as private', 1, :private + + it_behaves_like 'when accessibility passed as public', 1 + context 'when metadata file is also uploaded' do let(:metadata_file) do file_to_upload('spec/fixtures/ci_build_artifacts_metadata.gz', sha256: artifacts_sha256) @@ -125,13 +177,16 @@ RSpec.describe Ci::JobArtifacts::CreateService do expect(new_artifact.locked).to eq(job.pipeline.locked) end - it 'sets accessibility by default to public' do - expect { subject }.to change { Ci::JobArtifact.count }.by(2) - - new_artifact = job.job_artifacts.last - expect(new_artifact).to be_public_accessibility + context 'when accessibility level not passed to the service' do + it_behaves_like 'job does not have public artifacts in the CI config', 2, :public + it_behaves_like 'job artifact set as private in the CI config', 2, :private + it_behaves_like 'job artifact set as public in the CI config', 2, :public end + it_behaves_like 'when accessibility level passed as private', 2, :privatge + + it_behaves_like 'when accessibility passed as public', 2 + it 'logs the created artifact and metadata' do expect(Gitlab::Ci::Artifacts::Logger) .to receive(:log_created) @@ -140,32 +195,6 @@ RSpec.describe Ci::JobArtifacts::CreateService do subject end - context 'when accessibility level passed as private' do - before do - params.merge!('accessibility' => 'private') - end - - it 'sets accessibility to private level' do - expect { subject }.to change { Ci::JobArtifact.count }.by(2) - - new_artifact = job.job_artifacts.last - expect(new_artifact).to be_private_accessibility - end - end - - context 'when accessibility passed as public' do - before do - params.merge!('accessibility' => 'public') - end - - it 'sets accessibility level to public' do - expect { subject }.to change { Ci::JobArtifact.count }.by(2) - - new_artifact = job.job_artifacts.last - expect(new_artifact).to be_public_accessibility - end - end - it 'sets expiration date according to application settings' do expected_expire_at = 1.day.from_now diff --git a/spec/services/ci/job_artifacts/delete_project_artifacts_service_spec.rb b/spec/services/ci/job_artifacts/delete_project_artifacts_service_spec.rb index 74fa42962f3..9c711e54b00 100644 --- a/spec/services/ci/job_artifacts/delete_project_artifacts_service_spec.rb +++ b/spec/services/ci/job_artifacts/delete_project_artifacts_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Ci::JobArtifacts::DeleteProjectArtifactsService do +RSpec.describe Ci::JobArtifacts::DeleteProjectArtifactsService, feature_category: :build_artifacts do let_it_be(:project) { create(:project) } subject { described_class.new(project: project) } diff --git a/spec/services/ci/job_artifacts/delete_service_spec.rb b/spec/services/ci/job_artifacts/delete_service_spec.rb index 78e8be48255..1560d0fc6f4 100644 --- a/spec/services/ci/job_artifacts/delete_service_spec.rb +++ b/spec/services/ci/job_artifacts/delete_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Ci::JobArtifacts::DeleteService do +RSpec.describe Ci::JobArtifacts::DeleteService, feature_category: :build_artifacts do let_it_be(:build, reload: true) do create(:ci_build, :artifacts, :trace_artifact, artifacts_expire_at: 100.days.from_now) end diff --git a/spec/services/ci/job_artifacts/destroy_all_expired_service_spec.rb b/spec/services/ci/job_artifacts/destroy_all_expired_service_spec.rb index 457be67c1ea..d1ec2a1d3a6 100644 --- a/spec/services/ci/job_artifacts/destroy_all_expired_service_spec.rb +++ b/spec/services/ci/job_artifacts/destroy_all_expired_service_spec.rb @@ -39,32 +39,12 @@ feature_category: :build_artifacts do second_artifact end - context 'with ci_destroy_unlocked_job_artifacts feature flag disabled' do - before do - stub_feature_flags(ci_destroy_unlocked_job_artifacts: false) - end - - it 'performs a consistent number of queries' do - control = ActiveRecord::QueryRecorder.new { service.execute } - - more_artifacts - - expect { subject }.not_to exceed_query_limit(control.count) - end - end - - context 'with ci_destroy_unlocked_job_artifacts feature flag enabled' do - before do - stub_feature_flags(ci_destroy_unlocked_job_artifacts: true) - end - - it 'performs a consistent number of queries' do - control = ActiveRecord::QueryRecorder.new { service.execute } + it 'performs a consistent number of queries' do + control = ActiveRecord::QueryRecorder.new { service.execute } - more_artifacts + more_artifacts - expect { subject }.not_to exceed_query_limit(control.count) - end + expect { subject }.not_to exceed_query_limit(control.count) end end @@ -251,6 +231,16 @@ feature_category: :build_artifacts do end end + context 'when some artifacts are trace' do + let!(:artifact) { create(:ci_job_artifact, :expired, job: job, locked: job.pipeline.locked) } + let!(:trace_artifact) { create(:ci_job_artifact, :trace, :expired, job: job, locked: job.pipeline.locked) } + + it 'destroys only non trace artifacts' do + expect { subject }.to change { Ci::JobArtifact.count }.by(-1) + expect(trace_artifact).to be_persisted + end + end + context 'when all artifacts are locked' do let!(:artifact) { create(:ci_job_artifact, :expired, job: locked_job, locked: locked_job.pipeline.locked) } diff --git a/spec/services/ci/job_artifacts/destroy_associations_service_spec.rb b/spec/services/ci/job_artifacts/destroy_associations_service_spec.rb index ca36c923dcf..f4839ccb04b 100644 --- a/spec/services/ci/job_artifacts/destroy_associations_service_spec.rb +++ b/spec/services/ci/job_artifacts/destroy_associations_service_spec.rb @@ -2,24 +2,37 @@ require 'spec_helper' -RSpec.describe Ci::JobArtifacts::DestroyAssociationsService do +RSpec.describe Ci::JobArtifacts::DestroyAssociationsService, feature_category: :build_artifacts do let_it_be(:project_1) { create(:project) } let_it_be(:project_2) { create(:project) } let_it_be(:artifact_1, refind: true) { create(:ci_job_artifact, :zip, project: project_1) } - let_it_be(:artifact_2, refind: true) { create(:ci_job_artifact, :zip, project: project_2) } - let_it_be(:artifact_3, refind: true) { create(:ci_job_artifact, :zip, project: project_1) } + let_it_be(:artifact_2, refind: true) { create(:ci_job_artifact, :junit, project: project_2) } + let_it_be(:artifact_3, refind: true) { create(:ci_job_artifact, :terraform, project: project_1) } + let_it_be(:artifact_4, refind: true) { create(:ci_job_artifact, :trace, project: project_2) } + let_it_be(:artifact_5, refind: true) { create(:ci_job_artifact, :metadata, project: project_2) } - let(:artifacts) { Ci::JobArtifact.where(id: [artifact_1.id, artifact_2.id, artifact_3.id]) } + let_it_be(:locked_artifact, refind: true) { create(:ci_job_artifact, :zip, :locked, project: project_1) } + + let(:artifact_ids_to_be_removed) { [artifact_1.id, artifact_2.id, artifact_3.id, artifact_4.id, artifact_5.id] } + let(:artifacts) { Ci::JobArtifact.where(id: artifact_ids_to_be_removed) } let(:service) { described_class.new(artifacts) } describe '#destroy_records' do - it 'removes artifacts without updating statistics' do + it 'removes all types of artifacts without updating statistics' do expect_next_instance_of(Ci::JobArtifacts::DestroyBatchService) do |service| expect(service).to receive(:execute).with(update_stats: false).and_call_original end - expect { service.destroy_records }.to change { Ci::JobArtifact.count }.by(-3) + expect { service.destroy_records }.to change { Ci::JobArtifact.count }.by(-artifact_ids_to_be_removed.count) + end + + context 'with a locked artifact' do + let(:artifact_ids_to_be_removed) { [artifact_1.id, locked_artifact.id] } + + it 'removes all artifacts' do + expect { service.destroy_records }.to change { Ci::JobArtifact.count }.by(-artifact_ids_to_be_removed.count) + end end context 'when there are no artifacts' do @@ -42,7 +55,11 @@ RSpec.describe Ci::JobArtifacts::DestroyAssociationsService do have_attributes(amount: -artifact_1.size, ref: artifact_1.id), have_attributes(amount: -artifact_3.size, ref: artifact_3.id) ] - project2_increments = [have_attributes(amount: -artifact_2.size, ref: artifact_2.id)] + project2_increments = [ + have_attributes(amount: -artifact_2.size, ref: artifact_2.id), + have_attributes(amount: -artifact_4.size, ref: artifact_4.id), + have_attributes(amount: -artifact_5.size, ref: artifact_5.id) + ] expect(ProjectStatistics).to receive(:bulk_increment_statistic).once .with(project_1, :build_artifacts_size, match_array(project1_increments)) diff --git a/spec/services/ci/job_artifacts/destroy_batch_service_spec.rb b/spec/services/ci/job_artifacts/destroy_batch_service_spec.rb index cde42783d8c..6f9dcf47535 100644 --- a/spec/services/ci/job_artifacts/destroy_batch_service_spec.rb +++ b/spec/services/ci/job_artifacts/destroy_batch_service_spec.rb @@ -2,8 +2,8 @@ require 'spec_helper' -RSpec.describe Ci::JobArtifacts::DestroyBatchService do - let(:artifacts) { Ci::JobArtifact.where(id: [artifact_with_file.id, artifact_without_file.id, trace_artifact.id]) } +RSpec.describe Ci::JobArtifacts::DestroyBatchService, feature_category: :build_artifacts do + let(:artifacts) { Ci::JobArtifact.where(id: [artifact_with_file.id, artifact_without_file.id]) } let(:skip_projects_on_refresh) { false } let(:service) do described_class.new( @@ -25,10 +25,6 @@ RSpec.describe Ci::JobArtifacts::DestroyBatchService do create(:ci_job_artifact) end - let_it_be(:trace_artifact, refind: true) do - create(:ci_job_artifact, :trace, :expired) - end - describe '#execute' do subject(:execute) { service.execute } @@ -60,11 +56,6 @@ RSpec.describe Ci::JobArtifacts::DestroyBatchService do execute end - it 'preserves trace artifacts' do - expect { subject } - .to not_change { Ci::JobArtifact.exists?(trace_artifact.id) } - end - context 'when artifact belongs to a project that is undergoing stats refresh' do let!(:artifact_under_refresh_1) do create(:ci_job_artifact, :zip) @@ -287,7 +278,7 @@ RSpec.describe Ci::JobArtifacts::DestroyBatchService do end it 'reports the number of destroyed artifacts' do - is_expected.to eq(destroyed_artifacts_count: 0, statistics_updates: {}, status: :success) + is_expected.to eq(destroyed_artifacts_count: 0, destroyed_ids: [], statistics_updates: {}, status: :success) end end end diff --git a/spec/services/ci/job_artifacts/expire_project_build_artifacts_service_spec.rb b/spec/services/ci/job_artifacts/expire_project_build_artifacts_service_spec.rb index fb9dd6b876b..69cdf39107a 100644 --- a/spec/services/ci/job_artifacts/expire_project_build_artifacts_service_spec.rb +++ b/spec/services/ci/job_artifacts/expire_project_build_artifacts_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Ci::JobArtifacts::ExpireProjectBuildArtifactsService do +RSpec.describe Ci::JobArtifacts::ExpireProjectBuildArtifactsService, feature_category: :build_artifacts do let_it_be(:project) { create(:project) } let_it_be(:pipeline, reload: true) { create(:ci_pipeline, :unlocked, project: project) } diff --git a/spec/services/ci/job_artifacts/track_artifact_report_service_spec.rb b/spec/services/ci/job_artifacts/track_artifact_report_service_spec.rb index d4d56825e1f..5355bec2d6c 100644 --- a/spec/services/ci/job_artifacts/track_artifact_report_service_spec.rb +++ b/spec/services/ci/job_artifacts/track_artifact_report_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Ci::JobArtifacts::TrackArtifactReportService do +RSpec.describe Ci::JobArtifacts::TrackArtifactReportService, feature_category: :build_artifacts do describe '#execute', :clean_gitlab_redis_shared_state do let_it_be(:group) { create(:group, :private) } let_it_be(:project) { create(:project, group: group) } diff --git a/spec/services/ci/job_artifacts/update_unknown_locked_status_service_spec.rb b/spec/services/ci/job_artifacts/update_unknown_locked_status_service_spec.rb index 67412e41fb8..5f6a89b89e1 100644 --- a/spec/services/ci/job_artifacts/update_unknown_locked_status_service_spec.rb +++ b/spec/services/ci/job_artifacts/update_unknown_locked_status_service_spec.rb @@ -2,7 +2,8 @@ require 'spec_helper' -RSpec.describe Ci::JobArtifacts::UpdateUnknownLockedStatusService, :clean_gitlab_redis_shared_state do +RSpec.describe Ci::JobArtifacts::UpdateUnknownLockedStatusService, :clean_gitlab_redis_shared_state, + feature_category: :build_artifacts do include ExclusiveLeaseHelpers let(:service) { described_class.new } diff --git a/spec/services/ci/list_config_variables_service_spec.rb b/spec/services/ci/list_config_variables_service_spec.rb index e2bbdefef7f..56a392221be 100644 --- a/spec/services/ci/list_config_variables_service_spec.rb +++ b/spec/services/ci/list_config_variables_service_spec.rb @@ -3,7 +3,7 @@ require 'spec_helper' RSpec.describe Ci::ListConfigVariablesService, -:use_clean_rails_memory_store_caching, feature_category: :pipeline_authoring do +:use_clean_rails_memory_store_caching, feature_category: :pipeline_composition do include ReactiveCachingHelpers let(:ci_config) { {} } diff --git a/spec/services/ci/pipeline_artifacts/coverage_report_service_spec.rb b/spec/services/ci/pipeline_artifacts/coverage_report_service_spec.rb index c4558bddc85..b7b32d2a0af 100644 --- a/spec/services/ci/pipeline_artifacts/coverage_report_service_spec.rb +++ b/spec/services/ci/pipeline_artifacts/coverage_report_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Ci::PipelineArtifacts::CoverageReportService do +RSpec.describe Ci::PipelineArtifacts::CoverageReportService, feature_category: :build_artifacts do describe '#execute' do let_it_be(:project) { create(:project, :repository) } diff --git a/spec/services/ci/pipeline_artifacts/create_code_quality_mr_diff_report_service_spec.rb b/spec/services/ci/pipeline_artifacts/create_code_quality_mr_diff_report_service_spec.rb index 5d854b61f14..20265a0ca48 100644 --- a/spec/services/ci/pipeline_artifacts/create_code_quality_mr_diff_report_service_spec.rb +++ b/spec/services/ci/pipeline_artifacts/create_code_quality_mr_diff_report_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe ::Ci::PipelineArtifacts::CreateCodeQualityMrDiffReportService do +RSpec.describe ::Ci::PipelineArtifacts::CreateCodeQualityMrDiffReportService, feature_category: :build_artifacts do describe '#execute' do let(:merge_request) { create(:merge_request) } let(:project) { merge_request.project } diff --git a/spec/services/ci/pipeline_artifacts/destroy_all_expired_service_spec.rb b/spec/services/ci/pipeline_artifacts/destroy_all_expired_service_spec.rb index 47e8766c215..b46648760e1 100644 --- a/spec/services/ci/pipeline_artifacts/destroy_all_expired_service_spec.rb +++ b/spec/services/ci/pipeline_artifacts/destroy_all_expired_service_spec.rb @@ -2,7 +2,8 @@ require 'spec_helper' -RSpec.describe Ci::PipelineArtifacts::DestroyAllExpiredService, :clean_gitlab_redis_shared_state do +RSpec.describe Ci::PipelineArtifacts::DestroyAllExpiredService, :clean_gitlab_redis_shared_state, + feature_category: :build_artifacts do let(:service) { described_class.new } describe '.execute' do diff --git a/spec/services/ci/pipeline_bridge_status_service_spec.rb b/spec/services/ci/pipeline_bridge_status_service_spec.rb index 1346f68c952..3d8219251d6 100644 --- a/spec/services/ci/pipeline_bridge_status_service_spec.rb +++ b/spec/services/ci/pipeline_bridge_status_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Ci::PipelineBridgeStatusService do +RSpec.describe Ci::PipelineBridgeStatusService, feature_category: :continuous_integration do let(:user) { build(:user) } let_it_be(:project) { create(:project) } diff --git a/spec/services/ci/pipeline_creation/start_pipeline_service_spec.rb b/spec/services/ci/pipeline_creation/start_pipeline_service_spec.rb index ab4ba20e716..06139c091b9 100644 --- a/spec/services/ci/pipeline_creation/start_pipeline_service_spec.rb +++ b/spec/services/ci/pipeline_creation/start_pipeline_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Ci::PipelineCreation::StartPipelineService do +RSpec.describe Ci::PipelineCreation::StartPipelineService, feature_category: :continuous_integration do let(:pipeline) { build(:ci_pipeline) } subject(:service) { described_class.new(pipeline) } diff --git a/spec/services/ci/pipeline_processing/atomic_processing_service/status_collection_spec.rb b/spec/services/ci/pipeline_processing/atomic_processing_service/status_collection_spec.rb index d0aa1ba4c6c..46ea0036e49 100644 --- a/spec/services/ci/pipeline_processing/atomic_processing_service/status_collection_spec.rb +++ b/spec/services/ci/pipeline_processing/atomic_processing_service/status_collection_spec.rb @@ -2,7 +2,8 @@ require 'spec_helper' -RSpec.describe Ci::PipelineProcessing::AtomicProcessingService::StatusCollection do +RSpec.describe Ci::PipelineProcessing::AtomicProcessingService::StatusCollection, + feature_category: :continuous_integration do using RSpec::Parameterized::TableSyntax let_it_be(:pipeline) { create(:ci_pipeline) } @@ -35,7 +36,7 @@ RSpec.describe Ci::PipelineProcessing::AtomicProcessingService::StatusCollection it 'does update existing status of processable' do collection.set_processable_status(test_a.id, 'success', 100) - expect(collection.status_for_names(['test-a'], dag: false)).to eq('success') + expect(collection.status_of_processables(['test-a'], dag: false)).to eq('success') end it 'ignores a missing processable' do @@ -49,7 +50,7 @@ RSpec.describe Ci::PipelineProcessing::AtomicProcessingService::StatusCollection end end - describe '#status_for_names' do + describe '#status_of_processables' do where(:names, :status, :dag) do %w[build-a] | 'success' | false %w[build-a build-b] | 'failed' | false @@ -61,12 +62,12 @@ RSpec.describe Ci::PipelineProcessing::AtomicProcessingService::StatusCollection with_them do it 'returns composite status of given names' do - expect(collection.status_for_names(names, dag: dag)).to eq(status) + expect(collection.status_of_processables(names, dag: dag)).to eq(status) end end end - describe '#status_for_prior_stage_position' do + describe '#status_of_processables_prior_to_stage' do where(:stage, :status) do 0 | 'success' 1 | 'failed' @@ -75,12 +76,12 @@ RSpec.describe Ci::PipelineProcessing::AtomicProcessingService::StatusCollection with_them do it 'returns composite status for processables in prior stages' do - expect(collection.status_for_prior_stage_position(stage)).to eq(status) + expect(collection.status_of_processables_prior_to_stage(stage)).to eq(status) end end end - describe '#status_for_stage_position' do + describe '#status_of_stage' do where(:stage, :status) do 0 | 'failed' 1 | 'running' @@ -89,16 +90,16 @@ RSpec.describe Ci::PipelineProcessing::AtomicProcessingService::StatusCollection with_them do it 'returns composite status for processables at a given stages' do - expect(collection.status_for_stage_position(stage)).to eq(status) + expect(collection.status_of_stage(stage)).to eq(status) end end end - describe '#created_processable_ids_for_stage_position' do + describe '#created_processable_ids_in_stage' do it 'returns IDs of processables at a given stage position' do - expect(collection.created_processable_ids_for_stage_position(0)).to be_empty - expect(collection.created_processable_ids_for_stage_position(1)).to be_empty - expect(collection.created_processable_ids_for_stage_position(2)).to contain_exactly(deploy.id) + expect(collection.created_processable_ids_in_stage(0)).to be_empty + expect(collection.created_processable_ids_in_stage(1)).to be_empty + expect(collection.created_processable_ids_in_stage(2)).to contain_exactly(deploy.id) end end diff --git a/spec/services/ci/pipeline_schedules/take_ownership_service_spec.rb b/spec/services/ci/pipeline_schedules/take_ownership_service_spec.rb index 9a3aad20d89..1d45a06f9ea 100644 --- a/spec/services/ci/pipeline_schedules/take_ownership_service_spec.rb +++ b/spec/services/ci/pipeline_schedules/take_ownership_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Ci::PipelineSchedules::TakeOwnershipService do +RSpec.describe Ci::PipelineSchedules::TakeOwnershipService, feature_category: :continuous_integration do let_it_be(:user) { create(:user) } let_it_be(:owner) { create(:user) } let_it_be(:reporter) { create(:user) } diff --git a/spec/services/ci/pipeline_trigger_service_spec.rb b/spec/services/ci/pipeline_trigger_service_spec.rb index 4946367380e..b6e07e82bb5 100644 --- a/spec/services/ci/pipeline_trigger_service_spec.rb +++ b/spec/services/ci/pipeline_trigger_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Ci::PipelineTriggerService do +RSpec.describe Ci::PipelineTriggerService, feature_category: :continuous_integration do include AfterNextHelpers let_it_be(:project) { create(:project, :repository) } diff --git a/spec/services/ci/pipelines/add_job_service_spec.rb b/spec/services/ci/pipelines/add_job_service_spec.rb index c62aa9506bd..9fb1d6933c6 100644 --- a/spec/services/ci/pipelines/add_job_service_spec.rb +++ b/spec/services/ci/pipelines/add_job_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Ci::Pipelines::AddJobService do +RSpec.describe Ci::Pipelines::AddJobService, feature_category: :continuous_integration do include ExclusiveLeaseHelpers let_it_be_with_reload(:pipeline) { create(:ci_pipeline) } diff --git a/spec/services/ci/pipelines/hook_service_spec.rb b/spec/services/ci/pipelines/hook_service_spec.rb index 8d138a3d957..e773ae2d2c3 100644 --- a/spec/services/ci/pipelines/hook_service_spec.rb +++ b/spec/services/ci/pipelines/hook_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Ci::Pipelines::HookService do +RSpec.describe Ci::Pipelines::HookService, feature_category: :continuous_integration do describe '#execute_hooks' do let_it_be(:namespace) { create(:namespace) } let_it_be(:project) { create(:project, :repository, namespace: namespace) } diff --git a/spec/services/ci/play_bridge_service_spec.rb b/spec/services/ci/play_bridge_service_spec.rb index 56b1615a56d..5727ed64f8b 100644 --- a/spec/services/ci/play_bridge_service_spec.rb +++ b/spec/services/ci/play_bridge_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Ci::PlayBridgeService, '#execute' do +RSpec.describe Ci::PlayBridgeService, '#execute', feature_category: :continuous_integration do let(:project) { create(:project) } let(:user) { create(:user) } let(:pipeline) { create(:ci_pipeline, project: project) } diff --git a/spec/services/ci/play_build_service_spec.rb b/spec/services/ci/play_build_service_spec.rb index fc07801b672..f439538b4cc 100644 --- a/spec/services/ci/play_build_service_spec.rb +++ b/spec/services/ci/play_build_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Ci::PlayBuildService, '#execute' do +RSpec.describe Ci::PlayBuildService, '#execute', feature_category: :continuous_integration do let(:user) { create(:user, developer_projects: [project]) } let(:project) { create(:project) } let(:pipeline) { create(:ci_pipeline, project: project) } diff --git a/spec/services/ci/play_manual_stage_service_spec.rb b/spec/services/ci/play_manual_stage_service_spec.rb index 24f0a21f3dd..1aca4ffec2d 100644 --- a/spec/services/ci/play_manual_stage_service_spec.rb +++ b/spec/services/ci/play_manual_stage_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Ci::PlayManualStageService, '#execute' do +RSpec.describe Ci::PlayManualStageService, '#execute', feature_category: :continuous_integration do let(:current_user) { create(:user) } let(:pipeline) { create(:ci_pipeline, user: current_user) } let(:project) { pipeline.project } diff --git a/spec/services/ci/prepare_build_service_spec.rb b/spec/services/ci/prepare_build_service_spec.rb index f75cb322fe9..8583b8e667c 100644 --- a/spec/services/ci/prepare_build_service_spec.rb +++ b/spec/services/ci/prepare_build_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Ci::PrepareBuildService do +RSpec.describe Ci::PrepareBuildService, feature_category: :continuous_integration do describe '#execute' do let(:build) { create(:ci_build, :preparing) } diff --git a/spec/services/ci/process_build_service_spec.rb b/spec/services/ci/process_build_service_spec.rb index de308bb1a87..d1442b75731 100644 --- a/spec/services/ci/process_build_service_spec.rb +++ b/spec/services/ci/process_build_service_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -RSpec.describe Ci::ProcessBuildService, '#execute' do +RSpec.describe Ci::ProcessBuildService, '#execute', feature_category: :continuous_integration do using RSpec::Parameterized::TableSyntax let_it_be(:user) { create(:user) } let_it_be(:project) { create(:project) } diff --git a/spec/services/ci/process_pipeline_service_spec.rb b/spec/services/ci/process_pipeline_service_spec.rb index 404e1bf7c87..d1586ad4c8b 100644 --- a/spec/services/ci/process_pipeline_service_spec.rb +++ b/spec/services/ci/process_pipeline_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Ci::ProcessPipelineService do +RSpec.describe Ci::ProcessPipelineService, feature_category: :continuous_integration do let_it_be(:project) { create(:project) } let(:pipeline) do diff --git a/spec/services/ci/process_sync_events_service_spec.rb b/spec/services/ci/process_sync_events_service_spec.rb index 7ab7911e578..c042a9bd46e 100644 --- a/spec/services/ci/process_sync_events_service_spec.rb +++ b/spec/services/ci/process_sync_events_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Ci::ProcessSyncEventsService do +RSpec.describe Ci::ProcessSyncEventsService, feature_category: :continuous_integration do let!(:group) { create(:group) } let!(:project1) { create(:project, group: group) } let!(:project2) { create(:project, group: group) } diff --git a/spec/services/ci/prometheus_metrics/observe_histograms_service_spec.rb b/spec/services/ci/prometheus_metrics/observe_histograms_service_spec.rb index 0b100af5902..a9ee5216d81 100644 --- a/spec/services/ci/prometheus_metrics/observe_histograms_service_spec.rb +++ b/spec/services/ci/prometheus_metrics/observe_histograms_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Ci::PrometheusMetrics::ObserveHistogramsService do +RSpec.describe Ci::PrometheusMetrics::ObserveHistogramsService, feature_category: :continuous_integration do let_it_be(:project) { create(:project) } let(:params) { {} } diff --git a/spec/services/ci/queue/pending_builds_strategy_spec.rb b/spec/services/ci/queue/pending_builds_strategy_spec.rb index 6f22c256c17..ea9207ddb8f 100644 --- a/spec/services/ci/queue/pending_builds_strategy_spec.rb +++ b/spec/services/ci/queue/pending_builds_strategy_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Ci::Queue::PendingBuildsStrategy do +RSpec.describe Ci::Queue::PendingBuildsStrategy, feature_category: :continuous_integration do let_it_be(:group) { create(:group) } let_it_be(:group_runner) { create(:ci_runner, :group, groups: [group]) } let_it_be(:project) { create(:project, group: group) } diff --git a/spec/services/ci/register_job_service_spec.rb b/spec/services/ci/register_job_service_spec.rb index 9183df359b4..18cb016f94a 100644 --- a/spec/services/ci/register_job_service_spec.rb +++ b/spec/services/ci/register_job_service_spec.rb @@ -16,126 +16,155 @@ module Ci describe '#execute' do subject(:execute) { described_class.new(runner, runner_machine).execute } - context 'with runner_machine specified' do - let(:runner) { project_runner } - let!(:runner_machine) { create(:ci_runner_machine, runner: project_runner) } + let(:runner_machine) { nil } + + context 'checks database loadbalancing stickiness' do + let(:runner) { shared_runner } before do - pending_job.update!(tag_list: ["linux"]) - pending_job.reload - pending_job.create_queuing_entry! - project_runner.update!(tag_list: ["linux"]) + project.update!(shared_runners_enabled: false) end - it 'sets runner_machine on job' do - expect { execute }.to change { pending_job.reload.runner_machine }.from(nil).to(runner_machine) + it 'result is valid if replica did caught-up', :aggregate_failures do + expect(ApplicationRecord.sticking).to receive(:all_caught_up?).with(:runner, runner.id) { true } - expect(execute.build).to eq(pending_job) + expect { execute }.not_to change { Ci::RunnerMachineBuild.count }.from(0) + expect(execute).to be_valid + expect(execute.build).to be_nil + expect(execute.build_json).to be_nil end - end - - context 'with no runner machine' do - let(:runner_machine) { nil } - - context 'checks database loadbalancing stickiness' do - let(:runner) { shared_runner } - - before do - project.update!(shared_runners_enabled: false) - end - it 'result is valid if replica did caught-up', :aggregate_failures do - expect(ApplicationRecord.sticking).to receive(:all_caught_up?).with(:runner, runner.id) { true } + it 'result is invalid if replica did not caught-up', :aggregate_failures do + expect(ApplicationRecord.sticking).to receive(:all_caught_up?) + .with(:runner, shared_runner.id) { false } - expect(execute).to be_valid - expect(execute.build).to be_nil - expect(execute.build_json).to be_nil - end + expect(subject).not_to be_valid + expect(subject.build).to be_nil + expect(subject.build_json).to be_nil + end + end - it 'result is invalid if replica did not caught-up', :aggregate_failures do - expect(ApplicationRecord.sticking).to receive(:all_caught_up?) - .with(:runner, shared_runner.id) { false } + shared_examples 'handles runner assignment' do + context 'runner follows tag list' do + subject(:build) { build_on(project_runner, runner_machine: project_runner_machine) } - expect(subject).not_to be_valid - expect(subject.build).to be_nil - expect(subject.build_json).to be_nil - end - end + let(:project_runner_machine) { nil } - shared_examples 'handles runner assignment' do - context 'runner follow tag list' do - it "picks build with the same tag" do + context 'when job has tag' do + before do pending_job.update!(tag_list: ["linux"]) pending_job.reload pending_job.create_queuing_entry! - project_runner.update!(tag_list: ["linux"]) - expect(build_on(project_runner)).to eq(pending_job) end - it "does not pick build with different tag" do - pending_job.update!(tag_list: ["linux"]) - pending_job.reload - pending_job.create_queuing_entry! - project_runner.update!(tag_list: ["win32"]) - expect(build_on(project_runner)).to be_falsey + context 'and runner has matching tag' do + before do + project_runner.update!(tag_list: ["linux"]) + end + + context 'with no runner machine specified' do + it 'picks build' do + expect(build).to eq(pending_job) + expect(pending_job.runner_machine).to be_nil + end + end + + context 'with runner machine specified' do + let(:project_runner_machine) { create(:ci_runner_machine, runner: project_runner) } + + it 'picks build and assigns runner machine' do + expect(build).to eq(pending_job) + expect(pending_job.runner_machine).to eq(project_runner_machine) + end + end end - it "picks build without tag" do - expect(build_on(project_runner)).to eq(pending_job) + it 'does not pick build with different tag' do + project_runner.update!(tag_list: ["win32"]) + expect(build).to be_falsey end - it "does not pick build with tag" do - pending_job.update!(tag_list: ["linux"]) - pending_job.reload + it 'does not pick build with tag' do pending_job.create_queuing_entry! - expect(build_on(project_runner)).to be_falsey + expect(build).to be_falsey end + end - it "pick build without tag" do - project_runner.update!(tag_list: ["win32"]) - expect(build_on(project_runner)).to eq(pending_job) + context 'when job has no tag' do + it 'picks build' do + expect(build).to eq(pending_job) + end + + context 'when runner has tag' do + before do + project_runner.update!(tag_list: ["win32"]) + end + + it 'picks build' do + expect(build).to eq(pending_job) + end end end + end - context 'deleted projects' do + context 'deleted projects' do + before do + project.update!(pending_delete: true) + end + + context 'for shared runners' do before do - project.update!(pending_delete: true) + project.update!(shared_runners_enabled: true) end - context 'for shared runners' do - before do - project.update!(shared_runners_enabled: true) - end + it 'does not pick a build' do + expect(build_on(shared_runner)).to be_nil + end + end + + context 'for project runner' do + subject(:build) { build_on(project_runner, runner_machine: project_runner_machine) } + let(:project_runner_machine) { nil } + + context 'with no runner machine specified' do it 'does not pick a build' do - expect(build_on(shared_runner)).to be_nil + expect(build).to be_nil + expect(pending_job.reload).to be_failed + expect(pending_job.queuing_entry).to be_nil + expect(Ci::RunnerMachineBuild.all).to be_empty end end - context 'for project runner' do + context 'with runner machine specified' do + let(:project_runner_machine) { create(:ci_runner_machine, runner: project_runner) } + it 'does not pick a build' do - expect(build_on(project_runner)).to be_nil + expect(build).to be_nil expect(pending_job.reload).to be_failed expect(pending_job.queuing_entry).to be_nil + expect(Ci::RunnerMachineBuild.all).to be_empty end end end + end - context 'allow shared runners' do - before do - project.update!(shared_runners_enabled: true) - pipeline.reload - pending_job.reload - pending_job.create_queuing_entry! - end + context 'allow shared runners' do + before do + project.update!(shared_runners_enabled: true) + pipeline.reload + pending_job.reload + pending_job.create_queuing_entry! + end - context 'when build owner has been blocked' do - let(:user) { create(:user, :blocked) } + context 'when build owner has been blocked' do + let(:user) { create(:user, :blocked) } - before do - pending_job.update!(user: user) - end + before do + pending_job.update!(user: user) + end + context 'with no runner machine specified' do it 'does not pick the build and drops the build' do expect(build_on(shared_runner)).to be_falsey @@ -143,690 +172,701 @@ module Ci end end - context 'for multiple builds' do - let!(:project2) { create :project, shared_runners_enabled: true } - let!(:pipeline2) { create :ci_pipeline, project: project2 } - let!(:project3) { create :project, shared_runners_enabled: true } - let!(:pipeline3) { create :ci_pipeline, project: project3 } - let!(:build1_project1) { pending_job } - let!(:build2_project1) { create(:ci_build, :pending, :queued, pipeline: pipeline) } - let!(:build3_project1) { create(:ci_build, :pending, :queued, pipeline: pipeline) } - let!(:build1_project2) { create(:ci_build, :pending, :queued, pipeline: pipeline2) } - let!(:build2_project2) { create(:ci_build, :pending, :queued, pipeline: pipeline2) } - let!(:build1_project3) { create(:ci_build, :pending, :queued, pipeline: pipeline3) } + context 'with runner machine specified' do + let(:runner_machine) { create(:ci_runner_machine, runner: runner) } - it 'picks builds one-by-one' do - expect(Ci::Build).to receive(:find).with(pending_job.id).and_call_original + it 'does not pick the build and does not create join record' do + expect(build_on(shared_runner, runner_machine: runner_machine)).to be_falsey - expect(build_on(shared_runner)).to eq(build1_project1) + expect(Ci::RunnerMachineBuild.all).to be_empty end + end + end - context 'when using fair scheduling' do - context 'when all builds are pending' do - it 'prefers projects without builds first' do - # it gets for one build from each of the projects - expect(build_on(shared_runner)).to eq(build1_project1) - expect(build_on(shared_runner)).to eq(build1_project2) - expect(build_on(shared_runner)).to eq(build1_project3) - - # then it gets a second build from each of the projects - expect(build_on(shared_runner)).to eq(build2_project1) - expect(build_on(shared_runner)).to eq(build2_project2) - - # in the end the third build - expect(build_on(shared_runner)).to eq(build3_project1) - end - end + context 'for multiple builds' do + let!(:project2) { create :project, shared_runners_enabled: true } + let!(:pipeline2) { create :ci_pipeline, project: project2 } + let!(:project3) { create :project, shared_runners_enabled: true } + let!(:pipeline3) { create :ci_pipeline, project: project3 } + let!(:build1_project1) { pending_job } + let!(:build2_project1) { create(:ci_build, :pending, :queued, pipeline: pipeline) } + let!(:build3_project1) { create(:ci_build, :pending, :queued, pipeline: pipeline) } + let!(:build1_project2) { create(:ci_build, :pending, :queued, pipeline: pipeline2) } + let!(:build2_project2) { create(:ci_build, :pending, :queued, pipeline: pipeline2) } + let!(:build1_project3) { create(:ci_build, :pending, :queued, pipeline: pipeline3) } + + it 'picks builds one-by-one' do + expect(Ci::Build).to receive(:find).with(pending_job.id).and_call_original + + expect(build_on(shared_runner)).to eq(build1_project1) + end - context 'when some builds transition to success' do - it 'equalises number of running builds' do - # after finishing the first build for project 1, get a second build from the same project - expect(build_on(shared_runner)).to eq(build1_project1) - build1_project1.reload.success - expect(build_on(shared_runner)).to eq(build2_project1) - - expect(build_on(shared_runner)).to eq(build1_project2) - build1_project2.reload.success - expect(build_on(shared_runner)).to eq(build2_project2) - expect(build_on(shared_runner)).to eq(build1_project3) - expect(build_on(shared_runner)).to eq(build3_project1) - end + context 'when using fair scheduling' do + context 'when all builds are pending' do + it 'prefers projects without builds first' do + # it gets for one build from each of the projects + expect(build_on(shared_runner)).to eq(build1_project1) + expect(build_on(shared_runner)).to eq(build1_project2) + expect(build_on(shared_runner)).to eq(build1_project3) + + # then it gets a second build from each of the projects + expect(build_on(shared_runner)).to eq(build2_project1) + expect(build_on(shared_runner)).to eq(build2_project2) + + # in the end the third build + expect(build_on(shared_runner)).to eq(build3_project1) end end - context 'when using DEFCON mode that disables fair scheduling' do - before do - stub_feature_flags(ci_queueing_disaster_recovery_disable_fair_scheduling: true) + context 'when some builds transition to success' do + it 'equalises number of running builds' do + # after finishing the first build for project 1, get a second build from the same project + expect(build_on(shared_runner)).to eq(build1_project1) + build1_project1.reload.success + expect(build_on(shared_runner)).to eq(build2_project1) + + expect(build_on(shared_runner)).to eq(build1_project2) + build1_project2.reload.success + expect(build_on(shared_runner)).to eq(build2_project2) + expect(build_on(shared_runner)).to eq(build1_project3) + expect(build_on(shared_runner)).to eq(build3_project1) end + end + end - context 'when all builds are pending' do - it 'returns builds in order of creation (FIFO)' do - # it gets for one build from each of the projects - expect(build_on(shared_runner)).to eq(build1_project1) - expect(build_on(shared_runner)).to eq(build2_project1) - expect(build_on(shared_runner)).to eq(build3_project1) - expect(build_on(shared_runner)).to eq(build1_project2) - expect(build_on(shared_runner)).to eq(build2_project2) - expect(build_on(shared_runner)).to eq(build1_project3) - end + context 'when using DEFCON mode that disables fair scheduling' do + before do + stub_feature_flags(ci_queueing_disaster_recovery_disable_fair_scheduling: true) + end + + context 'when all builds are pending' do + it 'returns builds in order of creation (FIFO)' do + # it gets for one build from each of the projects + expect(build_on(shared_runner)).to eq(build1_project1) + expect(build_on(shared_runner)).to eq(build2_project1) + expect(build_on(shared_runner)).to eq(build3_project1) + expect(build_on(shared_runner)).to eq(build1_project2) + expect(build_on(shared_runner)).to eq(build2_project2) + expect(build_on(shared_runner)).to eq(build1_project3) end + end - context 'when some builds transition to success' do - it 'returns builds in order of creation (FIFO)' do - expect(build_on(shared_runner)).to eq(build1_project1) - build1_project1.reload.success - expect(build_on(shared_runner)).to eq(build2_project1) - - expect(build_on(shared_runner)).to eq(build3_project1) - build2_project1.reload.success - expect(build_on(shared_runner)).to eq(build1_project2) - expect(build_on(shared_runner)).to eq(build2_project2) - expect(build_on(shared_runner)).to eq(build1_project3) - end + context 'when some builds transition to success' do + it 'returns builds in order of creation (FIFO)' do + expect(build_on(shared_runner)).to eq(build1_project1) + build1_project1.reload.success + expect(build_on(shared_runner)).to eq(build2_project1) + + expect(build_on(shared_runner)).to eq(build3_project1) + build2_project1.reload.success + expect(build_on(shared_runner)).to eq(build1_project2) + expect(build_on(shared_runner)).to eq(build2_project2) + expect(build_on(shared_runner)).to eq(build1_project3) end end end + end - context 'shared runner' do - let(:response) { described_class.new(shared_runner, nil).execute } - let(:build) { response.build } + context 'shared runner' do + let(:response) { described_class.new(shared_runner, nil).execute } + let(:build) { response.build } - it { expect(build).to be_kind_of(Build) } - it { expect(build).to be_valid } - it { expect(build).to be_running } - it { expect(build.runner).to eq(shared_runner) } - it { expect(Gitlab::Json.parse(response.build_json)['id']).to eq(build.id) } - end + it { expect(build).to be_kind_of(Build) } + it { expect(build).to be_valid } + it { expect(build).to be_running } + it { expect(build.runner).to eq(shared_runner) } + it { expect(Gitlab::Json.parse(response.build_json)['id']).to eq(build.id) } + end - context 'project runner' do - let(:build) { build_on(project_runner) } + context 'project runner' do + let(:build) { build_on(project_runner) } - it { expect(build).to be_kind_of(Build) } - it { expect(build).to be_valid } - it { expect(build).to be_running } - it { expect(build.runner).to eq(project_runner) } - end + it { expect(build).to be_kind_of(Build) } + it { expect(build).to be_valid } + it { expect(build).to be_running } + it { expect(build.runner).to eq(project_runner) } end + end - context 'disallow shared runners' do - before do - project.update!(shared_runners_enabled: false) - end + context 'disallow shared runners' do + before do + project.update!(shared_runners_enabled: false) + end - context 'shared runner' do - let(:build) { build_on(shared_runner) } + context 'shared runner' do + let(:build) { build_on(shared_runner) } - it { expect(build).to be_nil } - end + it { expect(build).to be_nil } + end - context 'project runner' do - let(:build) { build_on(project_runner) } + context 'project runner' do + let(:build) { build_on(project_runner) } - it { expect(build).to be_kind_of(Build) } - it { expect(build).to be_valid } - it { expect(build).to be_running } - it { expect(build.runner).to eq(project_runner) } - end + it { expect(build).to be_kind_of(Build) } + it { expect(build).to be_valid } + it { expect(build).to be_running } + it { expect(build.runner).to eq(project_runner) } end + end - context 'disallow when builds are disabled' do - before do - project.update!(shared_runners_enabled: true, group_runners_enabled: true) - project.project_feature.update_attribute(:builds_access_level, ProjectFeature::DISABLED) + context 'disallow when builds are disabled' do + before do + project.update!(shared_runners_enabled: true, group_runners_enabled: true) + project.project_feature.update_attribute(:builds_access_level, ProjectFeature::DISABLED) - pending_job.reload.create_queuing_entry! - end + pending_job.reload.create_queuing_entry! + end - context 'and uses shared runner' do - let(:build) { build_on(shared_runner) } + context 'and uses shared runner' do + let(:build) { build_on(shared_runner) } - it { expect(build).to be_nil } - end + it { expect(build).to be_nil } + end - context 'and uses group runner' do - let(:build) { build_on(group_runner) } + context 'and uses group runner' do + let(:build) { build_on(group_runner) } - it { expect(build).to be_nil } - end + it { expect(build).to be_nil } + end - context 'and uses project runner' do - let(:build) { build_on(project_runner) } + context 'and uses project runner' do + let(:build) { build_on(project_runner) } - it 'does not pick a build' do - expect(build).to be_nil - expect(pending_job.reload).to be_failed - expect(pending_job.queuing_entry).to be_nil - end + it 'does not pick a build' do + expect(build).to be_nil + expect(pending_job.reload).to be_failed + expect(pending_job.queuing_entry).to be_nil end end + end - context 'allow group runners' do - before do - project.update!(group_runners_enabled: true) - end + context 'allow group runners' do + before do + project.update!(group_runners_enabled: true) + end - context 'for multiple builds' do - let!(:project2) { create(:project, group_runners_enabled: true, group: group) } - let!(:pipeline2) { create(:ci_pipeline, project: project2) } - let!(:project3) { create(:project, group_runners_enabled: true, group: group) } - let!(:pipeline3) { create(:ci_pipeline, project: project3) } + context 'for multiple builds' do + let!(:project2) { create(:project, group_runners_enabled: true, group: group) } + let!(:pipeline2) { create(:ci_pipeline, project: project2) } + let!(:project3) { create(:project, group_runners_enabled: true, group: group) } + let!(:pipeline3) { create(:ci_pipeline, project: project3) } - let!(:build1_project1) { pending_job } - let!(:build2_project1) { create(:ci_build, :queued, pipeline: pipeline) } - let!(:build3_project1) { create(:ci_build, :queued, pipeline: pipeline) } - let!(:build1_project2) { create(:ci_build, :queued, pipeline: pipeline2) } - let!(:build2_project2) { create(:ci_build, :queued, pipeline: pipeline2) } - let!(:build1_project3) { create(:ci_build, :queued, pipeline: pipeline3) } + let!(:build1_project1) { pending_job } + let!(:build2_project1) { create(:ci_build, :queued, pipeline: pipeline) } + let!(:build3_project1) { create(:ci_build, :queued, pipeline: pipeline) } + let!(:build1_project2) { create(:ci_build, :queued, pipeline: pipeline2) } + let!(:build2_project2) { create(:ci_build, :queued, pipeline: pipeline2) } + let!(:build1_project3) { create(:ci_build, :queued, pipeline: pipeline3) } - # these shouldn't influence the scheduling - let!(:unrelated_group) { create(:group) } - let!(:unrelated_project) { create(:project, group_runners_enabled: true, group: unrelated_group) } - let!(:unrelated_pipeline) { create(:ci_pipeline, project: unrelated_project) } - let!(:build1_unrelated_project) { create(:ci_build, :pending, :queued, pipeline: unrelated_pipeline) } - let!(:unrelated_group_runner) { create(:ci_runner, :group, groups: [unrelated_group]) } + # these shouldn't influence the scheduling + let!(:unrelated_group) { create(:group) } + let!(:unrelated_project) { create(:project, group_runners_enabled: true, group: unrelated_group) } + let!(:unrelated_pipeline) { create(:ci_pipeline, project: unrelated_project) } + let!(:build1_unrelated_project) { create(:ci_build, :pending, :queued, pipeline: unrelated_pipeline) } + let!(:unrelated_group_runner) { create(:ci_runner, :group, groups: [unrelated_group]) } - it 'does not consider builds from other group runners' do - queue = ::Ci::Queue::BuildQueueService.new(group_runner) + it 'does not consider builds from other group runners' do + queue = ::Ci::Queue::BuildQueueService.new(group_runner) - expect(queue.builds_for_group_runner.size).to eq 6 - build_on(group_runner) + expect(queue.builds_for_group_runner.size).to eq 6 + build_on(group_runner) - expect(queue.builds_for_group_runner.size).to eq 5 - build_on(group_runner) + expect(queue.builds_for_group_runner.size).to eq 5 + build_on(group_runner) - expect(queue.builds_for_group_runner.size).to eq 4 - build_on(group_runner) + expect(queue.builds_for_group_runner.size).to eq 4 + build_on(group_runner) - expect(queue.builds_for_group_runner.size).to eq 3 - build_on(group_runner) + expect(queue.builds_for_group_runner.size).to eq 3 + build_on(group_runner) - expect(queue.builds_for_group_runner.size).to eq 2 - build_on(group_runner) + expect(queue.builds_for_group_runner.size).to eq 2 + build_on(group_runner) - expect(queue.builds_for_group_runner.size).to eq 1 - build_on(group_runner) + expect(queue.builds_for_group_runner.size).to eq 1 + build_on(group_runner) - expect(queue.builds_for_group_runner.size).to eq 0 - expect(build_on(group_runner)).to be_nil - end + expect(queue.builds_for_group_runner.size).to eq 0 + expect(build_on(group_runner)).to be_nil end + end - context 'group runner' do - let(:build) { build_on(group_runner) } + context 'group runner' do + let(:build) { build_on(group_runner) } - it { expect(build).to be_kind_of(Build) } - it { expect(build).to be_valid } - it { expect(build).to be_running } - it { expect(build.runner).to eq(group_runner) } - end + it { expect(build).to be_kind_of(Build) } + it { expect(build).to be_valid } + it { expect(build).to be_running } + it { expect(build.runner).to eq(group_runner) } end + end - context 'disallow group runners' do - before do - project.update!(group_runners_enabled: false) + context 'disallow group runners' do + before do + project.update!(group_runners_enabled: false) - pending_job.reload.create_queuing_entry! - end + pending_job.reload.create_queuing_entry! + end - context 'group runner' do - let(:build) { build_on(group_runner) } + context 'group runner' do + let(:build) { build_on(group_runner) } - it { expect(build).to be_nil } - end + it { expect(build).to be_nil } end + end - context 'when first build is stalled' do - before do - allow_any_instance_of(Ci::RegisterJobService).to receive(:assign_runner!).and_call_original - allow_any_instance_of(Ci::RegisterJobService).to receive(:assign_runner!) - .with(pending_job, anything).and_raise(ActiveRecord::StaleObjectError) - end + context 'when first build is stalled' do + before do + allow_any_instance_of(Ci::RegisterJobService).to receive(:assign_runner!).and_call_original + allow_any_instance_of(Ci::RegisterJobService).to receive(:assign_runner!) + .with(pending_job, anything).and_raise(ActiveRecord::StaleObjectError) + end - subject { described_class.new(project_runner, nil).execute } + subject { described_class.new(project_runner, nil).execute } - context 'with multiple builds are in queue' do - let!(:other_build) { create(:ci_build, :pending, :queued, pipeline: pipeline) } + context 'with multiple builds are in queue' do + let!(:other_build) { create(:ci_build, :pending, :queued, pipeline: pipeline) } - before do - allow_any_instance_of(::Ci::Queue::BuildQueueService) - .to receive(:execute) - .and_return(Ci::Build.where(id: [pending_job, other_build]).pluck(:id)) - end + before do + allow_any_instance_of(::Ci::Queue::BuildQueueService) + .to receive(:execute) + .and_return(Ci::Build.where(id: [pending_job, other_build]).pluck(:id)) + end - it "receives second build from the queue" do - expect(subject).to be_valid - expect(subject.build).to eq(other_build) - end + it "receives second build from the queue" do + expect(subject).to be_valid + expect(subject.build).to eq(other_build) end + end - context 'when single build is in queue' do - before do - allow_any_instance_of(::Ci::Queue::BuildQueueService) - .to receive(:execute) - .and_return(Ci::Build.where(id: pending_job).pluck(:id)) - end + context 'when single build is in queue' do + before do + allow_any_instance_of(::Ci::Queue::BuildQueueService) + .to receive(:execute) + .and_return(Ci::Build.where(id: pending_job).pluck(:id)) + end - it "does not receive any valid result" do - expect(subject).not_to be_valid - end + it "does not receive any valid result" do + expect(subject).not_to be_valid end + end - context 'when there is no build in queue' do - before do - allow_any_instance_of(::Ci::Queue::BuildQueueService) - .to receive(:execute) - .and_return([]) - end + context 'when there is no build in queue' do + before do + allow_any_instance_of(::Ci::Queue::BuildQueueService) + .to receive(:execute) + .and_return([]) + end - it "does not receive builds but result is valid" do - expect(subject).to be_valid - expect(subject.build).to be_nil - end + it "does not receive builds but result is valid" do + expect(subject).to be_valid + expect(subject.build).to be_nil end end + end - context 'when access_level of runner is not_protected' do - let!(:project_runner) { create(:ci_runner, :project, projects: [project]) } + context 'when access_level of runner is not_protected' do + let!(:project_runner) { create(:ci_runner, :project, projects: [project]) } - context 'when a job is protected' do - let!(:pending_job) { create(:ci_build, :pending, :queued, :protected, pipeline: pipeline) } + context 'when a job is protected' do + let!(:pending_job) { create(:ci_build, :pending, :queued, :protected, pipeline: pipeline) } - it 'picks the job' do - expect(build_on(project_runner)).to eq(pending_job) - end + it 'picks the job' do + expect(build_on(project_runner)).to eq(pending_job) end + end - context 'when a job is unprotected' do - let!(:pending_job) { create(:ci_build, :pending, :queued, pipeline: pipeline) } + context 'when a job is unprotected' do + let!(:pending_job) { create(:ci_build, :pending, :queued, pipeline: pipeline) } - it 'picks the job' do - expect(build_on(project_runner)).to eq(pending_job) - end + it 'picks the job' do + expect(build_on(project_runner)).to eq(pending_job) end + end - context 'when protected attribute of a job is nil' do - let!(:pending_job) { create(:ci_build, :pending, :queued, pipeline: pipeline) } + context 'when protected attribute of a job is nil' do + let!(:pending_job) { create(:ci_build, :pending, :queued, pipeline: pipeline) } - before do - pending_job.update_attribute(:protected, nil) - end + before do + pending_job.update_attribute(:protected, nil) + end - it 'picks the job' do - expect(build_on(project_runner)).to eq(pending_job) - end + it 'picks the job' do + expect(build_on(project_runner)).to eq(pending_job) end end + end - context 'when access_level of runner is ref_protected' do - let!(:project_runner) { create(:ci_runner, :project, :ref_protected, projects: [project]) } + context 'when access_level of runner is ref_protected' do + let!(:project_runner) { create(:ci_runner, :project, :ref_protected, projects: [project]) } - context 'when a job is protected' do - let!(:pending_job) { create(:ci_build, :pending, :queued, :protected, pipeline: pipeline) } + context 'when a job is protected' do + let!(:pending_job) { create(:ci_build, :pending, :queued, :protected, pipeline: pipeline) } - it 'picks the job' do - expect(build_on(project_runner)).to eq(pending_job) - end + it 'picks the job' do + expect(build_on(project_runner)).to eq(pending_job) end + end - context 'when a job is unprotected' do - let!(:pending_job) { create(:ci_build, :pending, :queued, pipeline: pipeline) } + context 'when a job is unprotected' do + let!(:pending_job) { create(:ci_build, :pending, :queued, pipeline: pipeline) } - it 'does not pick the job' do - expect(build_on(project_runner)).to be_nil - end + it 'does not pick the job' do + expect(build_on(project_runner)).to be_nil end + end - context 'when protected attribute of a job is nil' do - let!(:pending_job) { create(:ci_build, :pending, :queued, pipeline: pipeline) } + context 'when protected attribute of a job is nil' do + let!(:pending_job) { create(:ci_build, :pending, :queued, pipeline: pipeline) } - before do - pending_job.update_attribute(:protected, nil) - end + before do + pending_job.update_attribute(:protected, nil) + end - it 'does not pick the job' do - expect(build_on(project_runner)).to be_nil - end + it 'does not pick the job' do + expect(build_on(project_runner)).to be_nil end end + end - context 'runner feature set is verified' do - let(:options) { { artifacts: { reports: { junit: "junit.xml" } } } } - let!(:pending_job) { create(:ci_build, :pending, :queued, pipeline: pipeline, options: options) } + context 'runner feature set is verified' do + let(:options) { { artifacts: { reports: { junit: "junit.xml" } } } } + let!(:pending_job) { create(:ci_build, :pending, :queued, pipeline: pipeline, options: options) } - subject { build_on(project_runner, params: params) } + subject { build_on(project_runner, params: params) } - context 'when feature is missing by runner' do - let(:params) { {} } + context 'when feature is missing by runner' do + let(:params) { {} } - it 'does not pick the build and drops the build' do - expect(subject).to be_nil - expect(pending_job.reload).to be_failed - expect(pending_job).to be_runner_unsupported - end + it 'does not pick the build and drops the build' do + expect(subject).to be_nil + expect(pending_job.reload).to be_failed + expect(pending_job).to be_runner_unsupported end + end - context 'when feature is supported by runner' do - let(:params) do - { info: { features: { upload_multiple_artifacts: true } } } - end + context 'when feature is supported by runner' do + let(:params) do + { info: { features: { upload_multiple_artifacts: true } } } + end - it 'does pick job' do - expect(subject).not_to be_nil - end + it 'does pick job' do + expect(subject).not_to be_nil end end + end - context 'when "dependencies" keyword is specified' do - let!(:pre_stage_job) do - create(:ci_build, :success, :artifacts, pipeline: pipeline, name: 'test', stage_idx: 0) - end + context 'when "dependencies" keyword is specified' do + let!(:pre_stage_job) do + create(:ci_build, :success, :artifacts, pipeline: pipeline, name: 'test', stage_idx: 0) + end - let!(:pending_job) do - create(:ci_build, :pending, :queued, - pipeline: pipeline, stage_idx: 1, - options: { script: ["bash"], dependencies: dependencies }) - end + let!(:pending_job) do + create(:ci_build, :pending, :queued, + pipeline: pipeline, stage_idx: 1, + options: { script: ["bash"], dependencies: dependencies }) + end - let(:dependencies) { %w[test] } + let(:dependencies) { %w[test] } - subject { build_on(project_runner) } + subject { build_on(project_runner) } - it 'picks a build with a dependency' do - picked_build = build_on(project_runner) + it 'picks a build with a dependency' do + picked_build = build_on(project_runner) - expect(picked_build).to be_present + expect(picked_build).to be_present + end + + context 'when there are multiple dependencies with artifacts' do + let!(:pre_stage_job_second) do + create(:ci_build, :success, :artifacts, pipeline: pipeline, name: 'deploy', stage_idx: 0) end - context 'when there are multiple dependencies with artifacts' do - let!(:pre_stage_job_second) do - create(:ci_build, :success, :artifacts, pipeline: pipeline, name: 'deploy', stage_idx: 0) - end + let(:dependencies) { %w[test deploy] } - let(:dependencies) { %w[test deploy] } + it 'logs build artifacts size' do + build_on(project_runner) - it 'logs build artifacts size' do - build_on(project_runner) + artifacts_size = [pre_stage_job, pre_stage_job_second].sum do |job| + job.job_artifacts_archive.size + end - artifacts_size = [pre_stage_job, pre_stage_job_second].sum do |job| - job.job_artifacts_archive.size - end + expect(artifacts_size).to eq 107464 * 2 + expect(Gitlab::ApplicationContext.current).to include({ + 'meta.artifacts_dependencies_size' => artifacts_size, + 'meta.artifacts_dependencies_count' => 2 + }) + end + end - expect(artifacts_size).to eq 107464 * 2 - expect(Gitlab::ApplicationContext.current).to include({ - 'meta.artifacts_dependencies_size' => artifacts_size, - 'meta.artifacts_dependencies_count' => 2 - }) - end + shared_examples 'not pick' do + it 'does not pick the build and drops the build' do + expect(subject).to be_nil + expect(pending_job.reload).to be_failed + expect(pending_job).to be_missing_dependency_failure end + end - shared_examples 'not pick' do - it 'does not pick the build and drops the build' do - expect(subject).to be_nil - expect(pending_job.reload).to be_failed - expect(pending_job).to be_missing_dependency_failure + shared_examples 'validation is active' do + context 'when depended job has not been completed yet' do + let!(:pre_stage_job) do + create(:ci_build, :pending, :queued, :manual, pipeline: pipeline, name: 'test', stage_idx: 0) end - end - shared_examples 'validation is active' do - context 'when depended job has not been completed yet' do - let!(:pre_stage_job) do - create(:ci_build, :pending, :queued, :manual, pipeline: pipeline, name: 'test', stage_idx: 0) - end + it { is_expected.to eq(pending_job) } + end - it { is_expected.to eq(pending_job) } + context 'when artifacts of depended job has been expired' do + let!(:pre_stage_job) do + create(:ci_build, :success, :expired, pipeline: pipeline, name: 'test', stage_idx: 0) end - context 'when artifacts of depended job has been expired' do - let!(:pre_stage_job) do - create(:ci_build, :success, :expired, pipeline: pipeline, name: 'test', stage_idx: 0) + context 'when the pipeline is locked' do + before do + pipeline.artifacts_locked! end - context 'when the pipeline is locked' do - before do - pipeline.artifacts_locked! - end + it { is_expected.to eq(pending_job) } + end - it { is_expected.to eq(pending_job) } + context 'when the pipeline is unlocked' do + before do + pipeline.unlocked! end - context 'when the pipeline is unlocked' do - before do - pipeline.unlocked! - end + it_behaves_like 'not pick' + end + end - it_behaves_like 'not pick' - end + context 'when artifacts of depended job has been erased' do + let!(:pre_stage_job) do + create(:ci_build, :success, pipeline: pipeline, name: 'test', stage_idx: 0, erased_at: 1.minute.ago) end - context 'when artifacts of depended job has been erased' do - let!(:pre_stage_job) do - create(:ci_build, :success, pipeline: pipeline, name: 'test', stage_idx: 0, erased_at: 1.minute.ago) - end + it_behaves_like 'not pick' + end - it_behaves_like 'not pick' + context 'when job object is staled' do + let!(:pre_stage_job) do + create(:ci_build, :success, :expired, pipeline: pipeline, name: 'test', stage_idx: 0) end - context 'when job object is staled' do - let!(:pre_stage_job) do - create(:ci_build, :success, :expired, pipeline: pipeline, name: 'test', stage_idx: 0) - end - - before do - pipeline.unlocked! + before do + pipeline.unlocked! - allow_next_instance_of(Ci::Build) do |build| - expect(build).to receive(:drop!) - .and_raise(ActiveRecord::StaleObjectError.new(pending_job, :drop!)) - end + allow_next_instance_of(Ci::Build) do |build| + expect(build).to receive(:drop!) + .and_raise(ActiveRecord::StaleObjectError.new(pending_job, :drop!)) end + end - it 'does not drop nor pick' do - expect(subject).to be_nil - end + it 'does not drop nor pick' do + expect(subject).to be_nil end end + end - shared_examples 'validation is not active' do - context 'when depended job has not been completed yet' do - let!(:pre_stage_job) do - create(:ci_build, :pending, :queued, :manual, pipeline: pipeline, name: 'test', stage_idx: 0) - end - - it { expect(subject).to eq(pending_job) } + shared_examples 'validation is not active' do + context 'when depended job has not been completed yet' do + let!(:pre_stage_job) do + create(:ci_build, :pending, :queued, :manual, pipeline: pipeline, name: 'test', stage_idx: 0) end - context 'when artifacts of depended job has been expired' do - let!(:pre_stage_job) do - create(:ci_build, :success, :expired, pipeline: pipeline, name: 'test', stage_idx: 0) - end + it { expect(subject).to eq(pending_job) } + end - it { expect(subject).to eq(pending_job) } + context 'when artifacts of depended job has been expired' do + let!(:pre_stage_job) do + create(:ci_build, :success, :expired, pipeline: pipeline, name: 'test', stage_idx: 0) end - context 'when artifacts of depended job has been erased' do - let!(:pre_stage_job) do - create(:ci_build, :success, pipeline: pipeline, name: 'test', stage_idx: 0, erased_at: 1.minute.ago) - end + it { expect(subject).to eq(pending_job) } + end - it { expect(subject).to eq(pending_job) } + context 'when artifacts of depended job has been erased' do + let!(:pre_stage_job) do + create(:ci_build, :success, pipeline: pipeline, name: 'test', stage_idx: 0, erased_at: 1.minute.ago) end - end - it_behaves_like 'validation is active' + it { expect(subject).to eq(pending_job) } + end end - context 'when build is degenerated' do - let!(:pending_job) { create(:ci_build, :pending, :queued, :degenerated, pipeline: pipeline) } + it_behaves_like 'validation is active' + end - subject { build_on(project_runner) } + context 'when build is degenerated' do + let!(:pending_job) { create(:ci_build, :pending, :queued, :degenerated, pipeline: pipeline) } - it 'does not pick the build and drops the build' do - expect(subject).to be_nil + subject { build_on(project_runner) } - pending_job.reload - expect(pending_job).to be_failed - expect(pending_job).to be_archived_failure - end + it 'does not pick the build and drops the build' do + expect(subject).to be_nil + + pending_job.reload + expect(pending_job).to be_failed + expect(pending_job).to be_archived_failure end + end - context 'when build has data integrity problem' do - let!(:pending_job) do - create(:ci_build, :pending, :queued, pipeline: pipeline) - end + context 'when build has data integrity problem' do + let!(:pending_job) do + create(:ci_build, :pending, :queued, pipeline: pipeline) + end - before do - pending_job.update_columns(options: "string") - end + before do + pending_job.update_columns(options: "string") + end - subject { build_on(project_runner) } + subject { build_on(project_runner) } - it 'does drop the build and logs both failures' do - expect(Gitlab::ErrorTracking).to receive(:track_exception) - .with(anything, a_hash_including(build_id: pending_job.id)) - .twice - .and_call_original + it 'does drop the build and logs both failures' do + expect(Gitlab::ErrorTracking).to receive(:track_exception) + .with(anything, a_hash_including(build_id: pending_job.id)) + .twice + .and_call_original - expect(subject).to be_nil + expect(subject).to be_nil - pending_job.reload - expect(pending_job).to be_failed - expect(pending_job).to be_data_integrity_failure - end + pending_job.reload + expect(pending_job).to be_failed + expect(pending_job).to be_data_integrity_failure end + end - context 'when build fails to be run!' do - let!(:pending_job) do - create(:ci_build, :pending, :queued, pipeline: pipeline) - end + context 'when build fails to be run!' do + let!(:pending_job) do + create(:ci_build, :pending, :queued, pipeline: pipeline) + end - before do - expect_any_instance_of(Ci::Build).to receive(:run!) - .and_raise(RuntimeError, 'scheduler error') - end + before do + expect_any_instance_of(Ci::Build).to receive(:run!) + .and_raise(RuntimeError, 'scheduler error') + end - subject { build_on(project_runner) } + subject { build_on(project_runner) } - it 'does drop the build and logs failure' do - expect(Gitlab::ErrorTracking).to receive(:track_exception) - .with(anything, a_hash_including(build_id: pending_job.id)) - .once - .and_call_original + it 'does drop the build and logs failure' do + expect(Gitlab::ErrorTracking).to receive(:track_exception) + .with(anything, a_hash_including(build_id: pending_job.id)) + .once + .and_call_original - expect(subject).to be_nil + expect(subject).to be_nil - pending_job.reload - expect(pending_job).to be_failed - expect(pending_job).to be_scheduler_failure - end + pending_job.reload + expect(pending_job).to be_failed + expect(pending_job).to be_scheduler_failure end + end - context 'when an exception is raised during a persistent ref creation' do - before do - allow_any_instance_of(Ci::PersistentRef).to receive(:exist?) { false } - allow_any_instance_of(Ci::PersistentRef).to receive(:create_ref) { raise ArgumentError } - end + context 'when an exception is raised during a persistent ref creation' do + before do + allow_any_instance_of(Ci::PersistentRef).to receive(:exist?) { false } + allow_any_instance_of(Ci::PersistentRef).to receive(:create_ref) { raise ArgumentError } + end - subject { build_on(project_runner) } + subject { build_on(project_runner) } - it 'picks the build' do - expect(subject).to eq(pending_job) + it 'picks the build' do + expect(subject).to eq(pending_job) - pending_job.reload - expect(pending_job).to be_running - end + pending_job.reload + expect(pending_job).to be_running end + end - context 'when only some builds can be matched by runner' do - let!(:project_runner) { create(:ci_runner, :project, projects: [project], tag_list: %w[matching]) } - let!(:pending_job) { create(:ci_build, :pending, :queued, pipeline: pipeline, tag_list: %w[matching]) } + context 'when only some builds can be matched by runner' do + let!(:project_runner) { create(:ci_runner, :project, projects: [project], tag_list: %w[matching]) } + let!(:pending_job) { create(:ci_build, :pending, :queued, pipeline: pipeline, tag_list: %w[matching]) } - before do - # create additional matching and non-matching jobs - create_list(:ci_build, 2, :pending, :queued, pipeline: pipeline, tag_list: %w[matching]) - create(:ci_build, :pending, :queued, pipeline: pipeline, tag_list: %w[non-matching]) - end + before do + # create additional matching and non-matching jobs + create_list(:ci_build, 2, :pending, :queued, pipeline: pipeline, tag_list: %w[matching]) + create(:ci_build, :pending, :queued, pipeline: pipeline, tag_list: %w[non-matching]) + end - it 'observes queue size of only matching jobs' do - # pending_job + 2 x matching ones - expect(Gitlab::Ci::Queue::Metrics.queue_size_total).to receive(:observe) - .with({ runner_type: project_runner.runner_type }, 3) + it 'observes queue size of only matching jobs' do + # pending_job + 2 x matching ones + expect(Gitlab::Ci::Queue::Metrics.queue_size_total).to receive(:observe) + .with({ runner_type: project_runner.runner_type }, 3) - expect(build_on(project_runner)).to eq(pending_job) - end + expect(build_on(project_runner)).to eq(pending_job) + end - it 'observes queue processing time by the runner type' do - expect(Gitlab::Ci::Queue::Metrics.queue_iteration_duration_seconds) - .to receive(:observe) - .with({ runner_type: project_runner.runner_type }, anything) + it 'observes queue processing time by the runner type' do + expect(Gitlab::Ci::Queue::Metrics.queue_iteration_duration_seconds) + .to receive(:observe) + .with({ runner_type: project_runner.runner_type }, anything) - expect(Gitlab::Ci::Queue::Metrics.queue_retrieval_duration_seconds) - .to receive(:observe) - .with({ runner_type: project_runner.runner_type }, anything) + expect(Gitlab::Ci::Queue::Metrics.queue_retrieval_duration_seconds) + .to receive(:observe) + .with({ runner_type: project_runner.runner_type }, anything) - expect(build_on(project_runner)).to eq(pending_job) - end + expect(build_on(project_runner)).to eq(pending_job) end + end - context 'when ci_register_job_temporary_lock is enabled' do - before do - stub_feature_flags(ci_register_job_temporary_lock: true) + context 'when ci_register_job_temporary_lock is enabled' do + before do + stub_feature_flags(ci_register_job_temporary_lock: true) + + allow(Gitlab::Ci::Queue::Metrics.queue_operations_total).to receive(:increment) + end - allow(Gitlab::Ci::Queue::Metrics.queue_operations_total).to receive(:increment) + context 'when a build is temporarily locked' do + let(:service) { described_class.new(project_runner, nil) } + + before do + service.send(:acquire_temporary_lock, pending_job.id) end - context 'when a build is temporarily locked' do - let(:service) { described_class.new(project_runner, nil) } + it 'skips this build and marks queue as invalid' do + expect(Gitlab::Ci::Queue::Metrics.queue_operations_total).to receive(:increment) + .with(operation: :queue_iteration) + expect(Gitlab::Ci::Queue::Metrics.queue_operations_total).to receive(:increment) + .with(operation: :build_temporary_locked) - before do - service.send(:acquire_temporary_lock, pending_job.id) - end + expect(service.execute).not_to be_valid + end - it 'skips this build and marks queue as invalid' do + context 'when there is another build in queue' do + let!(:next_pending_job) { create(:ci_build, :pending, :queued, pipeline: pipeline) } + + it 'skips this build and picks another build' do expect(Gitlab::Ci::Queue::Metrics.queue_operations_total).to receive(:increment) - .with(operation: :queue_iteration) + .with(operation: :queue_iteration).twice expect(Gitlab::Ci::Queue::Metrics.queue_operations_total).to receive(:increment) .with(operation: :build_temporary_locked) - expect(service.execute).not_to be_valid - end - - context 'when there is another build in queue' do - let!(:next_pending_job) { create(:ci_build, :pending, :queued, pipeline: pipeline) } - - it 'skips this build and picks another build' do - expect(Gitlab::Ci::Queue::Metrics.queue_operations_total).to receive(:increment) - .with(operation: :queue_iteration).twice - expect(Gitlab::Ci::Queue::Metrics.queue_operations_total).to receive(:increment) - .with(operation: :build_temporary_locked) + result = service.execute - result = service.execute - - expect(result.build).to eq(next_pending_job) - expect(result).to be_valid - end + expect(result.build).to eq(next_pending_job) + expect(result).to be_valid end end end end + end - context 'when using pending builds table' do - include_examples 'handles runner assignment' + context 'when using pending builds table' do + let!(:runner) { create(:ci_runner, :project, projects: [project], tag_list: %w[conflict]) } - context 'when a conflicting data is stored in denormalized table' do - let!(:runner) { create(:ci_runner, :project, projects: [project], tag_list: %w[conflict]) } - let!(:pending_job) { create(:ci_build, :pending, :queued, pipeline: pipeline, tag_list: %w[conflict]) } + include_examples 'handles runner assignment' - before do - pending_job.update_column(:status, :running) - end + context 'when a conflicting data is stored in denormalized table' do + let!(:pending_job) { create(:ci_build, :pending, :queued, pipeline: pipeline, tag_list: %w[conflict]) } - it 'removes queuing entry upon build assignment attempt' do - expect(pending_job.reload).to be_running - expect(pending_job.queuing_entry).to be_present + before do + pending_job.update_column(:status, :running) + end - expect(execute).not_to be_valid - expect(pending_job.reload.queuing_entry).not_to be_present - end + it 'removes queuing entry upon build assignment attempt' do + expect(pending_job.reload).to be_running + expect(pending_job.queuing_entry).to be_present + + expect(execute).not_to be_valid + expect(pending_job.reload.queuing_entry).not_to be_present end end end diff --git a/spec/services/ci/resource_groups/assign_resource_from_resource_group_service_spec.rb b/spec/services/ci/resource_groups/assign_resource_from_resource_group_service_spec.rb index 3d1abe290bc..ea15e3ea2c0 100644 --- a/spec/services/ci/resource_groups/assign_resource_from_resource_group_service_spec.rb +++ b/spec/services/ci/resource_groups/assign_resource_from_resource_group_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Ci::ResourceGroups::AssignResourceFromResourceGroupService do +RSpec.describe Ci::ResourceGroups::AssignResourceFromResourceGroupService, feature_category: :continuous_integration do include ConcurrentHelpers let_it_be(:project) { create(:project) } diff --git a/spec/services/ci/retry_pipeline_service_spec.rb b/spec/services/ci/retry_pipeline_service_spec.rb index 07518c35fab..51a894640ab 100644 --- a/spec/services/ci/retry_pipeline_service_spec.rb +++ b/spec/services/ci/retry_pipeline_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Ci::RetryPipelineService, '#execute' do +RSpec.describe Ci::RetryPipelineService, '#execute', feature_category: :continuous_integration do include ProjectForksHelper let_it_be_with_refind(:user) { create(:user) } diff --git a/spec/services/ci/run_scheduled_build_service_spec.rb b/spec/services/ci/run_scheduled_build_service_spec.rb index 27d25e88944..e3ae1d93e5e 100644 --- a/spec/services/ci/run_scheduled_build_service_spec.rb +++ b/spec/services/ci/run_scheduled_build_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Ci::RunScheduledBuildService do +RSpec.describe Ci::RunScheduledBuildService, feature_category: :continuous_integration do let(:user) { create(:user) } let(:project) { create(:project) } let(:pipeline) { create(:ci_pipeline, project: project) } diff --git a/spec/services/ci/runners/create_runner_service_spec.rb b/spec/services/ci/runners/create_runner_service_spec.rb index 673bf3ef90e..52acfcbb7af 100644 --- a/spec/services/ci/runners/create_runner_service_spec.rb +++ b/spec/services/ci/runners/create_runner_service_spec.rb @@ -83,6 +83,49 @@ RSpec.describe ::Ci::Runners::CreateRunnerService, "#execute", feature_category: expect(runner.authenticated_user_registration_type?).to be_truthy expect(runner.runner_type).to eq 'instance_type' end + + context 'with a nil paused value' do + let(:args) do + { + paused: nil, + description: 'some description', + maintenance_note: 'a note', + tag_list: %w[tag1 tag2], + access_level: 'ref_protected', + locked: true, + maximum_timeout: 600, + run_untagged: false + } + end + + it { is_expected.to be_success } + + it 'creates runner with active set to true' do + expect(runner).to be_an_instance_of(::Ci::Runner) + expect(runner.active).to eq true + end + end + + context 'with no paused value given' do + let(:args) do + { + description: 'some description', + maintenance_note: 'a note', + tag_list: %w[tag1 tag2], + access_level: 'ref_protected', + locked: true, + maximum_timeout: 600, + run_untagged: false + } + end + + it { is_expected.to be_success } + + it 'creates runner with active set to true' do + expect(runner).to be_an_instance_of(::Ci::Runner) + expect(runner.active).to eq true + end + end end end diff --git a/spec/services/ci/runners/process_runner_version_update_service_spec.rb b/spec/services/ci/runners/process_runner_version_update_service_spec.rb index e62cb1ec3e3..f8b7aa281af 100644 --- a/spec/services/ci/runners/process_runner_version_update_service_spec.rb +++ b/spec/services/ci/runners/process_runner_version_update_service_spec.rb @@ -29,6 +29,19 @@ RSpec.describe Ci::Runners::ProcessRunnerVersionUpdateService, feature_category: end end + context 'when fetching runner releases is disabled' do + before do + stub_application_setting(update_runner_versions_enabled: false) + end + + it 'does not update ci_runner_versions records', :aggregate_failures do + expect do + expect(execute).to be_error + expect(execute.message).to eq 'version update disabled' + end.not_to change(Ci::RunnerVersion, :count).from(0) + end + end + context 'with successful result from upgrade check' do before do url = ::Gitlab::CurrentSettings.current_application_settings.public_runner_releases_url diff --git a/spec/services/ci/stuck_builds/drop_pending_service_spec.rb b/spec/services/ci/stuck_builds/drop_pending_service_spec.rb index a452a65829a..6d91f5098eb 100644 --- a/spec/services/ci/stuck_builds/drop_pending_service_spec.rb +++ b/spec/services/ci/stuck_builds/drop_pending_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Ci::StuckBuilds::DropPendingService do +RSpec.describe Ci::StuckBuilds::DropPendingService, feature_category: :runner_fleet do let_it_be(:runner) { create(:ci_runner) } let_it_be(:pipeline) { create(:ci_empty_pipeline) } let_it_be_with_reload(:job) do diff --git a/spec/services/ci/stuck_builds/drop_running_service_spec.rb b/spec/services/ci/stuck_builds/drop_running_service_spec.rb index c1c92c2b8e2..deb807753c2 100644 --- a/spec/services/ci/stuck_builds/drop_running_service_spec.rb +++ b/spec/services/ci/stuck_builds/drop_running_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Ci::StuckBuilds::DropRunningService do +RSpec.describe Ci::StuckBuilds::DropRunningService, feature_category: :runner_fleet do let!(:runner) { create :ci_runner } let!(:job) { create(:ci_build, runner: runner, created_at: created_at, updated_at: updated_at, status: status) } diff --git a/spec/services/ci/stuck_builds/drop_scheduled_service_spec.rb b/spec/services/ci/stuck_builds/drop_scheduled_service_spec.rb index a4f9f97fffc..f2e658c3ae3 100644 --- a/spec/services/ci/stuck_builds/drop_scheduled_service_spec.rb +++ b/spec/services/ci/stuck_builds/drop_scheduled_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Ci::StuckBuilds::DropScheduledService do +RSpec.describe Ci::StuckBuilds::DropScheduledService, feature_category: :runner_fleet do let_it_be(:runner) { create :ci_runner } let!(:job) { create :ci_build, :scheduled, scheduled_at: scheduled_at, runner: runner } diff --git a/spec/services/ci/test_failure_history_service_spec.rb b/spec/services/ci/test_failure_history_service_spec.rb index 10f6c6f5007..e77c6533483 100644 --- a/spec/services/ci/test_failure_history_service_spec.rb +++ b/spec/services/ci/test_failure_history_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Ci::TestFailureHistoryService, :aggregate_failures do +RSpec.describe Ci::TestFailureHistoryService, :aggregate_failures, feature_category: :continuous_integration do let_it_be(:project) { create(:project, :repository) } let_it_be_with_reload(:pipeline) do diff --git a/spec/services/ci/track_failed_build_service_spec.rb b/spec/services/ci/track_failed_build_service_spec.rb index 676769d2fc7..23e7cee731d 100644 --- a/spec/services/ci/track_failed_build_service_spec.rb +++ b/spec/services/ci/track_failed_build_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Ci::TrackFailedBuildService do +RSpec.describe Ci::TrackFailedBuildService, feature_category: :continuous_integration do let_it_be(:user) { create(:user) } let_it_be(:project) { create(:project, :public) } let_it_be(:pipeline) { create(:ci_pipeline, project: project, user: user) } diff --git a/spec/services/ci/unlock_artifacts_service_spec.rb b/spec/services/ci/unlock_artifacts_service_spec.rb index c15e1cb2b5d..1921ea4bdba 100644 --- a/spec/services/ci/unlock_artifacts_service_spec.rb +++ b/spec/services/ci/unlock_artifacts_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Ci::UnlockArtifactsService do +RSpec.describe Ci::UnlockArtifactsService, feature_category: :continuous_integration do using RSpec::Parameterized::TableSyntax where(:tag) do @@ -24,7 +24,7 @@ RSpec.describe Ci::UnlockArtifactsService do let!(:older_ambiguous_pipeline) { create(:ci_pipeline, :with_persisted_artifacts, ref: ref, tag: !tag, project: project, locked: :artifacts_locked) } let!(:code_coverage_pipeline) { create(:ci_pipeline, :with_coverage_report_artifact, ref: ref, tag: tag, project: project, locked: :artifacts_locked) } let!(:pipeline) { create(:ci_pipeline, :with_persisted_artifacts, ref: ref, tag: tag, project: project, locked: :artifacts_locked) } - let!(:child_pipeline) { create(:ci_pipeline, :with_persisted_artifacts, ref: ref, tag: tag, project: project, locked: :artifacts_locked) } + let!(:child_pipeline) { create(:ci_pipeline, :with_persisted_artifacts, ref: ref, tag: tag, child_of: pipeline, project: project, locked: :artifacts_locked) } let!(:newer_pipeline) { create(:ci_pipeline, :with_persisted_artifacts, ref: ref, tag: tag, project: project, locked: :artifacts_locked) } let!(:other_ref_pipeline) { create(:ci_pipeline, :with_persisted_artifacts, ref: 'other_ref', tag: tag, project: project, locked: :artifacts_locked) } let!(:sources_pipeline) { create(:ci_sources_pipeline, source_job: source_job, source_project: project, pipeline: child_pipeline, project: project) } @@ -201,8 +201,7 @@ RSpec.describe Ci::UnlockArtifactsService do describe '#unlock_job_artifacts_query' do subject { described_class.new(pipeline.project, pipeline.user).unlock_job_artifacts_query(pipeline_ids) } - context 'when running on a ref before a pipeline' do - let(:before_pipeline) { pipeline } + context 'when given a single pipeline ID' do let(:pipeline_ids) { [older_pipeline.id] } it 'produces the expected SQL string' do @@ -226,8 +225,7 @@ RSpec.describe Ci::UnlockArtifactsService do end end - context 'when running on just the ref' do - let(:before_pipeline) { nil } + context 'when given multiple pipeline IDs' do let(:pipeline_ids) { [older_pipeline.id, newer_pipeline.id, pipeline.id] } it 'produces the expected SQL string' do diff --git a/spec/services/ci/update_build_queue_service_spec.rb b/spec/services/ci/update_build_queue_service_spec.rb index dd26339831c..4fd4492278d 100644 --- a/spec/services/ci/update_build_queue_service_spec.rb +++ b/spec/services/ci/update_build_queue_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Ci::UpdateBuildQueueService do +RSpec.describe Ci::UpdateBuildQueueService, feature_category: :continuous_integration do let(:project) { create(:project, :repository) } let(:pipeline) { create(:ci_pipeline, project: project) } let(:build) { create(:ci_build, pipeline: pipeline) } diff --git a/spec/services/ci/update_instance_variables_service_spec.rb b/spec/services/ci/update_instance_variables_service_spec.rb index f235d006e34..19f28793f90 100644 --- a/spec/services/ci/update_instance_variables_service_spec.rb +++ b/spec/services/ci/update_instance_variables_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Ci::UpdateInstanceVariablesService do +RSpec.describe Ci::UpdateInstanceVariablesService, feature_category: :pipeline_composition do let(:params) { { variables_attributes: variables_attributes } } subject { described_class.new(params) } diff --git a/spec/services/ci/update_pending_build_service_spec.rb b/spec/services/ci/update_pending_build_service_spec.rb index e49b22299f0..abf31dd5184 100644 --- a/spec/services/ci/update_pending_build_service_spec.rb +++ b/spec/services/ci/update_pending_build_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Ci::UpdatePendingBuildService do +RSpec.describe Ci::UpdatePendingBuildService, feature_category: :continuous_integration do let_it_be(:group) { create(:group) } let_it_be(:project) { create(:project, namespace: group) } let_it_be_with_reload(:pending_build_1) { create(:ci_pending_build, project: project, instance_runners_enabled: false) } diff --git a/spec/services/clusters/agent_tokens/create_service_spec.rb b/spec/services/clusters/agent_tokens/create_service_spec.rb index dc7abd1504b..519a3ba7ce5 100644 --- a/spec/services/clusters/agent_tokens/create_service_spec.rb +++ b/spec/services/clusters/agent_tokens/create_service_spec.rb @@ -2,14 +2,14 @@ require 'spec_helper' -RSpec.describe Clusters::AgentTokens::CreateService do - subject(:service) { described_class.new(container: project, current_user: user, params: params) } +RSpec.describe Clusters::AgentTokens::CreateService, feature_category: :kubernetes_management do + subject(:service) { described_class.new(agent: cluster_agent, current_user: user, params: params) } let_it_be(:user) { create(:user) } let(:cluster_agent) { create(:cluster_agent) } let(:project) { cluster_agent.project } - let(:params) { { agent_id: cluster_agent.id, description: 'token description', name: 'token name' } } + let(:params) { { description: 'token description', name: 'token name' } } describe '#execute' do subject { service.execute } @@ -75,7 +75,7 @@ RSpec.describe Clusters::AgentTokens::CreateService do it 'returns validation errors', :aggregate_failures do expect(subject.status).to eq(:error) - expect(subject.message).to eq(["Agent must exist", "Name can't be blank"]) + expect(subject.message).to eq(["Name can't be blank"]) end end end diff --git a/spec/services/clusters/agent_tokens/revoke_service_spec.rb b/spec/services/clusters/agent_tokens/revoke_service_spec.rb new file mode 100644 index 00000000000..9e511de0a13 --- /dev/null +++ b/spec/services/clusters/agent_tokens/revoke_service_spec.rb @@ -0,0 +1,77 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe Clusters::AgentTokens::RevokeService, feature_category: :kubernetes_management do + describe '#execute' do + subject { described_class.new(token: agent_token, current_user: user).execute } + + let(:agent) { create(:cluster_agent) } + let(:agent_token) { create(:cluster_agent_token, agent: agent) } + let(:project) { agent.project } + let(:user) { agent.created_by_user } + + before do + project.add_maintainer(user) + end + + context 'when user is authorized' do + before do + project.add_maintainer(user) + end + + context 'when user revokes agent token' do + it 'succeeds' do + subject + + expect(agent_token.revoked?).to be true + end + + it 'creates an activity event' do + expect { subject }.to change { ::Clusters::Agents::ActivityEvent.count }.by(1) + + event = agent.activity_events.last + + expect(event).to have_attributes( + kind: 'token_revoked', + level: 'info', + recorded_at: agent_token.reload.updated_at, + user: user, + agent_token: agent_token + ) + end + end + + context 'when there is a validation failure' do + before do + agent_token.name = '' # make the record invalid, as we require a name to be present + end + + it 'fails without raising an error', :aggregate_failures do + expect(subject[:status]).to eq(:error) + expect(subject[:message]).to eq(["Name can't be blank"]) + end + + it 'does not create an activity event' do + expect { subject }.not_to change { ::Clusters::Agents::ActivityEvent.count } + end + end + end + + context 'when user is not authorized' do + let(:user) { create(:user) } + + before do + project.add_guest(user) + end + + context 'when user attempts to revoke agent token' do + it 'fails' do + subject + + expect(agent_token.revoked?).to be false + end + end + end + end +end diff --git a/spec/services/clusters/agent_tokens/track_usage_service_spec.rb b/spec/services/clusters/agent_tokens/track_usage_service_spec.rb index 3350b15a5ce..e9e1a5f7ad9 100644 --- a/spec/services/clusters/agent_tokens/track_usage_service_spec.rb +++ b/spec/services/clusters/agent_tokens/track_usage_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Clusters::AgentTokens::TrackUsageService do +RSpec.describe Clusters::AgentTokens::TrackUsageService, feature_category: :kubernetes_management do let_it_be(:agent) { create(:cluster_agent) } describe '#execute', :clean_gitlab_redis_cache do diff --git a/spec/services/clusters/agents/authorize_proxy_user_service_spec.rb b/spec/services/clusters/agents/authorize_proxy_user_service_spec.rb new file mode 100644 index 00000000000..c099d87f6eb --- /dev/null +++ b/spec/services/clusters/agents/authorize_proxy_user_service_spec.rb @@ -0,0 +1,68 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe Clusters::Agents::AuthorizeProxyUserService, feature_category: :kubernetes_management do + subject(:service_response) { service.execute } + + let(:service) { described_class.new(user, agent) } + let(:user) { create(:user) } + + let_it_be(:project) { create(:project) } + let_it_be(:group) { create(:group) } + let_it_be(:user_access_config) do + { + 'user_access' => { + 'access_as' => { 'agent' => {} }, + 'projects' => [{ 'id' => project.full_path }], + 'groups' => [{ 'id' => group.full_path }] + } + } + end + + let_it_be(:configuration_project) do + create( + :project, :custom_repo, + files: { + ".gitlab/agents/the-agent/config.yaml" => user_access_config.to_yaml + } + ) + end + + let_it_be(:agent) { create(:cluster_agent, name: 'the-agent', project: configuration_project) } + + it 'returns forbidden when user has no access to any project', :aggregate_failures do + expect(service_response).to be_error + expect(service_response.reason).to eq :forbidden + end + + context 'when user is member of an authorized group' do + it 'authorizes developers', :aggregate_failures do + group.add_member(user, :developer) + expect(service_response).to be_success + expect(service_response.payload[:user]).to include(id: user.id, username: user.username) + expect(service_response.payload[:agent]).to include(id: agent.id, config_project: { id: agent.project.id }) + end + + it 'does not authorize reporters', :aggregate_failures do + group.add_member(user, :reporter) + expect(service_response).to be_error + expect(service_response.reason).to eq :forbidden + end + end + + context 'when user is member of an authorized project' do + it 'authorizes developers', :aggregate_failures do + project.add_member(user, :developer) + expect(service_response).to be_success + expect(service_response.payload[:user]).to include(id: user.id, username: user.username) + expect(service_response.payload[:agent]).to include(id: agent.id, config_project: { id: agent.project.id }) + end + + it 'does not authorize reporters', :aggregate_failures do + project.add_member(user, :reporter) + expect(service_response).to be_error + expect(service_response.reason).to eq :forbidden + end + end +end diff --git a/spec/services/clusters/agents/create_activity_event_service_spec.rb b/spec/services/clusters/agents/create_activity_event_service_spec.rb index 7a8f0e16d60..3da8ecddb8d 100644 --- a/spec/services/clusters/agents/create_activity_event_service_spec.rb +++ b/spec/services/clusters/agents/create_activity_event_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Clusters::Agents::CreateActivityEventService do +RSpec.describe Clusters::Agents::CreateActivityEventService, feature_category: :kubernetes_management do let_it_be(:agent) { create(:cluster_agent) } let_it_be(:token) { create(:cluster_agent_token, agent: agent) } let_it_be(:user) { create(:user) } @@ -40,5 +40,16 @@ RSpec.describe Clusters::Agents::CreateActivityEventService do subject end + + context 'when activity event creation fails' do + let(:params) { {} } + + it 'tracks the exception without raising' do + expect(Gitlab::ErrorTracking).to receive(:track_exception) + .with(instance_of(ActiveRecord::RecordInvalid), agent_id: agent.id) + + subject + end + end end end diff --git a/spec/services/clusters/agents/create_service_spec.rb b/spec/services/clusters/agents/create_service_spec.rb index 2b3bbcae13c..dc69dfb5e27 100644 --- a/spec/services/clusters/agents/create_service_spec.rb +++ b/spec/services/clusters/agents/create_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Clusters::Agents::CreateService do +RSpec.describe Clusters::Agents::CreateService, feature_category: :kubernetes_management do subject(:service) { described_class.new(project, user) } let(:project) { create(:project, :public, :repository) } diff --git a/spec/services/clusters/agents/delete_expired_events_service_spec.rb b/spec/services/clusters/agents/delete_expired_events_service_spec.rb index 3dc166f54eb..892cd5a70ea 100644 --- a/spec/services/clusters/agents/delete_expired_events_service_spec.rb +++ b/spec/services/clusters/agents/delete_expired_events_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Clusters::Agents::DeleteExpiredEventsService do +RSpec.describe Clusters::Agents::DeleteExpiredEventsService, feature_category: :kubernetes_management do let_it_be(:agent) { create(:cluster_agent) } describe '#execute' do diff --git a/spec/services/clusters/agents/delete_service_spec.rb b/spec/services/clusters/agents/delete_service_spec.rb index abe1bdaab27..da97cdee4ca 100644 --- a/spec/services/clusters/agents/delete_service_spec.rb +++ b/spec/services/clusters/agents/delete_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Clusters::Agents::DeleteService do +RSpec.describe Clusters::Agents::DeleteService, feature_category: :kubernetes_management do subject(:service) { described_class.new(container: project, current_user: user) } let(:cluster_agent) { create(:cluster_agent) } diff --git a/spec/services/clusters/build_kubernetes_namespace_service_spec.rb b/spec/services/clusters/build_kubernetes_namespace_service_spec.rb index 4ee933374f6..b1be3eb4199 100644 --- a/spec/services/clusters/build_kubernetes_namespace_service_spec.rb +++ b/spec/services/clusters/build_kubernetes_namespace_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Clusters::BuildKubernetesNamespaceService do +RSpec.describe Clusters::BuildKubernetesNamespaceService, feature_category: :kubernetes_management do let(:cluster) { create(:cluster, :project, :provided_by_gcp) } let(:environment) { create(:environment) } let(:project) { environment.project } diff --git a/spec/services/clusters/build_service_spec.rb b/spec/services/clusters/build_service_spec.rb index c7a64435d3b..9e71b7a8115 100644 --- a/spec/services/clusters/build_service_spec.rb +++ b/spec/services/clusters/build_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Clusters::BuildService do +RSpec.describe Clusters::BuildService, feature_category: :kubernetes_management do describe '#execute' do subject { described_class.new(cluster_subject).execute } diff --git a/spec/services/clusters/cleanup/project_namespace_service_spec.rb b/spec/services/clusters/cleanup/project_namespace_service_spec.rb index 8d3ae217a9f..366e4fa9c03 100644 --- a/spec/services/clusters/cleanup/project_namespace_service_spec.rb +++ b/spec/services/clusters/cleanup/project_namespace_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Clusters::Cleanup::ProjectNamespaceService do +RSpec.describe Clusters::Cleanup::ProjectNamespaceService, feature_category: :kubernetes_management do describe '#execute' do subject { service.execute } diff --git a/spec/services/clusters/cleanup/service_account_service_spec.rb b/spec/services/clusters/cleanup/service_account_service_spec.rb index 769762237f9..881ec85b3d5 100644 --- a/spec/services/clusters/cleanup/service_account_service_spec.rb +++ b/spec/services/clusters/cleanup/service_account_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Clusters::Cleanup::ServiceAccountService do +RSpec.describe Clusters::Cleanup::ServiceAccountService, feature_category: :kubernetes_management do describe '#execute' do subject { service.execute } diff --git a/spec/services/clusters/create_service_spec.rb b/spec/services/clusters/create_service_spec.rb index 95f10cdbd80..0d170f66f4a 100644 --- a/spec/services/clusters/create_service_spec.rb +++ b/spec/services/clusters/create_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Clusters::CreateService do +RSpec.describe Clusters::CreateService, feature_category: :kubernetes_management do let(:access_token) { 'xxx' } let(:project) { create(:project) } let(:user) { create(:user) } diff --git a/spec/services/clusters/destroy_service_spec.rb b/spec/services/clusters/destroy_service_spec.rb index dc600c9e830..2bc0099ff04 100644 --- a/spec/services/clusters/destroy_service_spec.rb +++ b/spec/services/clusters/destroy_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Clusters::DestroyService do +RSpec.describe Clusters::DestroyService, feature_category: :kubernetes_management do describe '#execute' do subject { described_class.new(cluster.user, params).execute(cluster) } diff --git a/spec/services/clusters/integrations/create_service_spec.rb b/spec/services/clusters/integrations/create_service_spec.rb index 9104e07504d..fa47811dc6b 100644 --- a/spec/services/clusters/integrations/create_service_spec.rb +++ b/spec/services/clusters/integrations/create_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Clusters::Integrations::CreateService, '#execute' do +RSpec.describe Clusters::Integrations::CreateService, '#execute', feature_category: :kubernetes_management do let_it_be(:project) { create(:project) } let_it_be_with_reload(:cluster) { create(:cluster, :provided_by_gcp, projects: [project]) } diff --git a/spec/services/clusters/integrations/prometheus_health_check_service_spec.rb b/spec/services/clusters/integrations/prometheus_health_check_service_spec.rb index 526462931a6..2d527bb0872 100644 --- a/spec/services/clusters/integrations/prometheus_health_check_service_spec.rb +++ b/spec/services/clusters/integrations/prometheus_health_check_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Clusters::Integrations::PrometheusHealthCheckService, '#execute' do +RSpec.describe Clusters::Integrations::PrometheusHealthCheckService, '#execute', feature_category: :kubernetes_management do let(:service) { described_class.new(cluster) } subject { service.execute } diff --git a/spec/services/clusters/kubernetes/create_or_update_namespace_service_spec.rb b/spec/services/clusters/kubernetes/create_or_update_namespace_service_spec.rb index 90956e7b4ea..8ae34e4f9ab 100644 --- a/spec/services/clusters/kubernetes/create_or_update_namespace_service_spec.rb +++ b/spec/services/clusters/kubernetes/create_or_update_namespace_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Clusters::Kubernetes::CreateOrUpdateNamespaceService, '#execute' do +RSpec.describe Clusters::Kubernetes::CreateOrUpdateNamespaceService, '#execute', feature_category: :kubernetes_management do include KubernetesHelpers let(:cluster) { create(:cluster, :project, :provided_by_gcp) } diff --git a/spec/services/clusters/kubernetes/create_or_update_service_account_service_spec.rb b/spec/services/clusters/kubernetes/create_or_update_service_account_service_spec.rb index 37478a0bcd9..bdf46c19e36 100644 --- a/spec/services/clusters/kubernetes/create_or_update_service_account_service_spec.rb +++ b/spec/services/clusters/kubernetes/create_or_update_service_account_service_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -RSpec.describe Clusters::Kubernetes::CreateOrUpdateServiceAccountService do +RSpec.describe Clusters::Kubernetes::CreateOrUpdateServiceAccountService, feature_category: :kubernetes_management do include KubernetesHelpers let(:api_url) { 'http://111.111.111.111' } diff --git a/spec/services/clusters/kubernetes/fetch_kubernetes_token_service_spec.rb b/spec/services/clusters/kubernetes/fetch_kubernetes_token_service_spec.rb index 03c402fb066..2b77df1eb6d 100644 --- a/spec/services/clusters/kubernetes/fetch_kubernetes_token_service_spec.rb +++ b/spec/services/clusters/kubernetes/fetch_kubernetes_token_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Clusters::Kubernetes::FetchKubernetesTokenService do +RSpec.describe Clusters::Kubernetes::FetchKubernetesTokenService, feature_category: :kubernetes_management do include KubernetesHelpers describe '#execute' do diff --git a/spec/services/clusters/kubernetes_spec.rb b/spec/services/clusters/kubernetes_spec.rb index 12af63890fc..7e22c2f95df 100644 --- a/spec/services/clusters/kubernetes_spec.rb +++ b/spec/services/clusters/kubernetes_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Clusters::Kubernetes do +RSpec.describe Clusters::Kubernetes, feature_category: :kubernetes_management do it { is_expected.to be_const_defined(:GITLAB_SERVICE_ACCOUNT_NAME) } it { is_expected.to be_const_defined(:GITLAB_SERVICE_ACCOUNT_NAMESPACE) } it { is_expected.to be_const_defined(:GITLAB_ADMIN_TOKEN_NAME) } diff --git a/spec/services/clusters/management/validate_management_project_permissions_service_spec.rb b/spec/services/clusters/management/validate_management_project_permissions_service_spec.rb index a21c378d3d1..8a49d90aa48 100644 --- a/spec/services/clusters/management/validate_management_project_permissions_service_spec.rb +++ b/spec/services/clusters/management/validate_management_project_permissions_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Clusters::Management::ValidateManagementProjectPermissionsService do +RSpec.describe Clusters::Management::ValidateManagementProjectPermissionsService, feature_category: :kubernetes_management do describe '#execute' do subject { described_class.new(user).execute(cluster, management_project_id) } diff --git a/spec/services/clusters/update_service_spec.rb b/spec/services/clusters/update_service_spec.rb index 9aead97f41c..31661d30f41 100644 --- a/spec/services/clusters/update_service_spec.rb +++ b/spec/services/clusters/update_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Clusters::UpdateService do +RSpec.describe Clusters::UpdateService, feature_category: :kubernetes_management do include KubernetesHelpers describe '#execute' do diff --git a/spec/services/cohorts_service_spec.rb b/spec/services/cohorts_service_spec.rb index dce8d4f80f2..ab53bcf8657 100644 --- a/spec/services/cohorts_service_spec.rb +++ b/spec/services/cohorts_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe CohortsService do +RSpec.describe CohortsService, feature_category: :shared do describe '#execute' do def month_start(months_ago) months_ago.months.ago.beginning_of_month.to_date diff --git a/spec/services/commits/cherry_pick_service_spec.rb b/spec/services/commits/cherry_pick_service_spec.rb index 2565e17ac90..880ebea1c09 100644 --- a/spec/services/commits/cherry_pick_service_spec.rb +++ b/spec/services/commits/cherry_pick_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Commits::CherryPickService do +RSpec.describe Commits::CherryPickService, feature_category: :source_code_management do let(:project) { create(:project, :repository) } # * ddd0f15ae83993f5cb66a927a28673882e99100b (HEAD -> master, origin/master, origin/HEAD) Merge branch 'po-fix-test-en # |\ diff --git a/spec/services/commits/commit_patch_service_spec.rb b/spec/services/commits/commit_patch_service_spec.rb index edd0918e488..a9d61be23be 100644 --- a/spec/services/commits/commit_patch_service_spec.rb +++ b/spec/services/commits/commit_patch_service_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -RSpec.describe Commits::CommitPatchService do +RSpec.describe Commits::CommitPatchService, feature_category: :source_code_management do describe '#execute' do let(:patches) do patches_folder = Rails.root.join('spec/fixtures/patchfiles') diff --git a/spec/services/commits/tag_service_spec.rb b/spec/services/commits/tag_service_spec.rb index dd742ebe469..25aa84276c3 100644 --- a/spec/services/commits/tag_service_spec.rb +++ b/spec/services/commits/tag_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Commits::TagService do +RSpec.describe Commits::TagService, feature_category: :source_code_management do let(:project) { create(:project, :repository) } let(:user) { create(:user) } diff --git a/spec/services/compare_service_spec.rb b/spec/services/compare_service_spec.rb index e96a7f2f4f4..6757fbdf5d4 100644 --- a/spec/services/compare_service_spec.rb +++ b/spec/services/compare_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe CompareService do +RSpec.describe CompareService, feature_category: :source_code_management do let(:project) { create(:project, :repository) } let(:user) { create(:user) } let(:service) { described_class.new(project, 'feature') } diff --git a/spec/services/concerns/audit_event_save_type_spec.rb b/spec/services/concerns/audit_event_save_type_spec.rb index fbaebd9f85c..a89eb513d27 100644 --- a/spec/services/concerns/audit_event_save_type_spec.rb +++ b/spec/services/concerns/audit_event_save_type_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe AuditEventSaveType do +RSpec.describe AuditEventSaveType, feature_category: :audit_events do subject(:target) { Object.new.extend(described_class) } describe '#should_save_database? and #should_save_stream?' do diff --git a/spec/services/concerns/exclusive_lease_guard_spec.rb b/spec/services/concerns/exclusive_lease_guard_spec.rb index 6a2aa0a377b..b081d2642c0 100644 --- a/spec/services/concerns/exclusive_lease_guard_spec.rb +++ b/spec/services/concerns/exclusive_lease_guard_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe ExclusiveLeaseGuard, :clean_gitlab_redis_shared_state do +RSpec.describe ExclusiveLeaseGuard, :clean_gitlab_redis_shared_state, feature_category: :shared do subject :subject_class do Class.new do include ExclusiveLeaseGuard diff --git a/spec/services/concerns/merge_requests/assigns_merge_params_spec.rb b/spec/services/concerns/merge_requests/assigns_merge_params_spec.rb index 5b1e8fca31b..c6ee5b78c13 100644 --- a/spec/services/concerns/merge_requests/assigns_merge_params_spec.rb +++ b/spec/services/concerns/merge_requests/assigns_merge_params_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe MergeRequests::AssignsMergeParams do +RSpec.describe MergeRequests::AssignsMergeParams, feature_category: :code_review_workflow do it 'raises an error when used from an instance that does not respond to #current_user' do define_class = -> { Class.new { include MergeRequests::AssignsMergeParams }.new } diff --git a/spec/services/concerns/rate_limited_service_spec.rb b/spec/services/concerns/rate_limited_service_spec.rb index d913cd17067..2172c756ecf 100644 --- a/spec/services/concerns/rate_limited_service_spec.rb +++ b/spec/services/concerns/rate_limited_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe RateLimitedService do +RSpec.describe RateLimitedService, feature_category: :rate_limiting do let(:key) { :issues_create } let(:scope) { [:container, :current_user] } let(:opts) { { scope: scope, users_allowlist: -> { [User.support_bot.username] } } } diff --git a/spec/services/container_expiration_policies/cleanup_service_spec.rb b/spec/services/container_expiration_policies/cleanup_service_spec.rb index 6e1be7271e1..4663944f0b9 100644 --- a/spec/services/container_expiration_policies/cleanup_service_spec.rb +++ b/spec/services/container_expiration_policies/cleanup_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe ContainerExpirationPolicies::CleanupService do +RSpec.describe ContainerExpirationPolicies::CleanupService, feature_category: :container_registry do let_it_be(:repository, reload: true) { create(:container_repository, expiration_policy_started_at: 30.minutes.ago) } let_it_be(:project) { repository.project } @@ -190,6 +190,7 @@ RSpec.describe ContainerExpirationPolicies::CleanupService do context 'with only the current repository started_at before the policy next_run_at' do before do + repository.update!(expiration_policy_started_at: policy.next_run_at + 9.minutes) repository2.update!(expiration_policy_started_at: policy.next_run_at + 10.minutes) repository3.update!(expiration_policy_started_at: policy.next_run_at + 12.minutes) end diff --git a/spec/services/container_expiration_policies/update_service_spec.rb b/spec/services/container_expiration_policies/update_service_spec.rb index 7d949b77de7..992240201e0 100644 --- a/spec/services/container_expiration_policies/update_service_spec.rb +++ b/spec/services/container_expiration_policies/update_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe ContainerExpirationPolicies::UpdateService do +RSpec.describe ContainerExpirationPolicies::UpdateService, feature_category: :container_registry do using RSpec::Parameterized::TableSyntax let_it_be(:project, reload: true) { create(:project) } diff --git a/spec/services/customer_relations/contacts/create_service_spec.rb b/spec/services/customer_relations/contacts/create_service_spec.rb index db6cce799fe..610143586e3 100644 --- a/spec/services/customer_relations/contacts/create_service_spec.rb +++ b/spec/services/customer_relations/contacts/create_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe CustomerRelations::Contacts::CreateService do +RSpec.describe CustomerRelations::Contacts::CreateService, feature_category: :service_desk do describe '#execute' do let_it_be(:user) { create(:user) } let_it_be(:not_found_or_does_not_belong) { 'The specified organization was not found or does not belong to this group' } diff --git a/spec/services/customer_relations/contacts/update_service_spec.rb b/spec/services/customer_relations/contacts/update_service_spec.rb index 729fdc2058b..105b5bad5f7 100644 --- a/spec/services/customer_relations/contacts/update_service_spec.rb +++ b/spec/services/customer_relations/contacts/update_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe CustomerRelations::Contacts::UpdateService do +RSpec.describe CustomerRelations::Contacts::UpdateService, feature_category: :service_desk do let_it_be(:user) { create(:user) } let(:contact) { create(:contact, first_name: 'Mark', group: group, state: 'active') } diff --git a/spec/services/customer_relations/organizations/create_service_spec.rb b/spec/services/customer_relations/organizations/create_service_spec.rb index 18eefdd716e..3b1ae5606b1 100644 --- a/spec/services/customer_relations/organizations/create_service_spec.rb +++ b/spec/services/customer_relations/organizations/create_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe CustomerRelations::Organizations::CreateService do +RSpec.describe CustomerRelations::Organizations::CreateService, feature_category: :service_desk do describe '#execute' do let_it_be(:user) { create(:user) } diff --git a/spec/services/customer_relations/organizations/update_service_spec.rb b/spec/services/customer_relations/organizations/update_service_spec.rb index 4764ba85551..ac71a211bf8 100644 --- a/spec/services/customer_relations/organizations/update_service_spec.rb +++ b/spec/services/customer_relations/organizations/update_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe CustomerRelations::Organizations::UpdateService do +RSpec.describe CustomerRelations::Organizations::UpdateService, feature_category: :service_desk do let_it_be(:user) { create(:user) } let(:organization) { create(:organization, name: 'Test', group: group, state: 'active') } diff --git a/spec/services/database/consistency_fix_service_spec.rb b/spec/services/database/consistency_fix_service_spec.rb index 9a0fac2191c..fcc776cbc2a 100644 --- a/spec/services/database/consistency_fix_service_spec.rb +++ b/spec/services/database/consistency_fix_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Database::ConsistencyFixService do +RSpec.describe Database::ConsistencyFixService, feature_category: :pods do describe '#execute' do context 'fixing namespaces inconsistencies' do subject(:consistency_fix_service) do diff --git a/spec/services/dependency_proxy/auth_token_service_spec.rb b/spec/services/dependency_proxy/auth_token_service_spec.rb index c686f57c5cb..2612c5765a4 100644 --- a/spec/services/dependency_proxy/auth_token_service_spec.rb +++ b/spec/services/dependency_proxy/auth_token_service_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -RSpec.describe DependencyProxy::AuthTokenService do +RSpec.describe DependencyProxy::AuthTokenService, feature_category: :dependency_proxy do include DependencyProxyHelpers let_it_be(:user) { create(:user) } diff --git a/spec/services/dependency_proxy/find_cached_manifest_service_spec.rb b/spec/services/dependency_proxy/find_cached_manifest_service_spec.rb index 470c6eb9e03..13620b3dfc1 100644 --- a/spec/services/dependency_proxy/find_cached_manifest_service_spec.rb +++ b/spec/services/dependency_proxy/find_cached_manifest_service_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -RSpec.describe DependencyProxy::FindCachedManifestService do +RSpec.describe DependencyProxy::FindCachedManifestService, feature_category: :dependency_proxy do include DependencyProxyHelpers let_it_be(:image) { 'alpine' } diff --git a/spec/services/dependency_proxy/group_settings/update_service_spec.rb b/spec/services/dependency_proxy/group_settings/update_service_spec.rb index 4954d9ec267..38f837a828a 100644 --- a/spec/services/dependency_proxy/group_settings/update_service_spec.rb +++ b/spec/services/dependency_proxy/group_settings/update_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe ::DependencyProxy::GroupSettings::UpdateService do +RSpec.describe ::DependencyProxy::GroupSettings::UpdateService, feature_category: :dependency_proxy do using RSpec::Parameterized::TableSyntax let_it_be_with_reload(:group) { create(:group) } diff --git a/spec/services/dependency_proxy/head_manifest_service_spec.rb b/spec/services/dependency_proxy/head_manifest_service_spec.rb index 949a8eb3bee..a9646a185bc 100644 --- a/spec/services/dependency_proxy/head_manifest_service_spec.rb +++ b/spec/services/dependency_proxy/head_manifest_service_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -RSpec.describe DependencyProxy::HeadManifestService do +RSpec.describe DependencyProxy::HeadManifestService, feature_category: :dependency_proxy do include DependencyProxyHelpers let(:image) { 'alpine' } diff --git a/spec/services/dependency_proxy/image_ttl_group_policies/update_service_spec.rb b/spec/services/dependency_proxy/image_ttl_group_policies/update_service_spec.rb index 3a6ba2cca71..f58434222a5 100644 --- a/spec/services/dependency_proxy/image_ttl_group_policies/update_service_spec.rb +++ b/spec/services/dependency_proxy/image_ttl_group_policies/update_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe ::DependencyProxy::ImageTtlGroupPolicies::UpdateService do +RSpec.describe ::DependencyProxy::ImageTtlGroupPolicies::UpdateService, feature_category: :dependency_proxy do using RSpec::Parameterized::TableSyntax let_it_be_with_reload(:group) { create(:group) } diff --git a/spec/services/dependency_proxy/request_token_service_spec.rb b/spec/services/dependency_proxy/request_token_service_spec.rb index 8b3ba783b8d..0cc3695f0b0 100644 --- a/spec/services/dependency_proxy/request_token_service_spec.rb +++ b/spec/services/dependency_proxy/request_token_service_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -RSpec.describe DependencyProxy::RequestTokenService do +RSpec.describe DependencyProxy::RequestTokenService, feature_category: :dependency_proxy do include DependencyProxyHelpers let(:image) { 'alpine:3.9' } diff --git a/spec/services/deploy_keys/create_service_spec.rb b/spec/services/deploy_keys/create_service_spec.rb index 2e3318236f5..8bff80b2d11 100644 --- a/spec/services/deploy_keys/create_service_spec.rb +++ b/spec/services/deploy_keys/create_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe DeployKeys::CreateService do +RSpec.describe DeployKeys::CreateService, feature_category: :continuous_delivery do let(:user) { create(:user) } let(:params) { attributes_for(:deploy_key) } diff --git a/spec/services/deployments/archive_in_project_service_spec.rb b/spec/services/deployments/archive_in_project_service_spec.rb index a316c210d64..ed03ce06255 100644 --- a/spec/services/deployments/archive_in_project_service_spec.rb +++ b/spec/services/deployments/archive_in_project_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Deployments::ArchiveInProjectService do +RSpec.describe Deployments::ArchiveInProjectService, feature_category: :continuous_delivery do let_it_be(:project) { create(:project, :repository) } let(:service) { described_class.new(project, nil) } diff --git a/spec/services/deployments/create_for_build_service_spec.rb b/spec/services/deployments/create_for_build_service_spec.rb index 3748df87d99..c07fc07cfbf 100644 --- a/spec/services/deployments/create_for_build_service_spec.rb +++ b/spec/services/deployments/create_for_build_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Deployments::CreateForBuildService do +RSpec.describe Deployments::CreateForBuildService, feature_category: :continuous_delivery do let_it_be(:project) { create(:project, :repository) } let_it_be(:user) { create(:user) } diff --git a/spec/services/deployments/create_service_spec.rb b/spec/services/deployments/create_service_spec.rb index 0f2a6ce32e1..2a70d450575 100644 --- a/spec/services/deployments/create_service_spec.rb +++ b/spec/services/deployments/create_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Deployments::CreateService do +RSpec.describe Deployments::CreateService, feature_category: :continuous_delivery do let(:user) { create(:user) } describe '#execute' do diff --git a/spec/services/deployments/link_merge_requests_service_spec.rb b/spec/services/deployments/link_merge_requests_service_spec.rb index a653cd2b48b..a468af90ffb 100644 --- a/spec/services/deployments/link_merge_requests_service_spec.rb +++ b/spec/services/deployments/link_merge_requests_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Deployments::LinkMergeRequestsService do +RSpec.describe Deployments::LinkMergeRequestsService, feature_category: :continuous_delivery do let(:project) { create(:project, :repository) } # * ddd0f15 Merge branch 'po-fix-test-env-path' into 'master' diff --git a/spec/services/deployments/older_deployments_drop_service_spec.rb b/spec/services/deployments/older_deployments_drop_service_spec.rb index d9a512a5dd2..7e3074a1688 100644 --- a/spec/services/deployments/older_deployments_drop_service_spec.rb +++ b/spec/services/deployments/older_deployments_drop_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Deployments::OlderDeploymentsDropService do +RSpec.describe Deployments::OlderDeploymentsDropService, feature_category: :continuous_delivery do let(:environment) { create(:environment) } let(:deployment) { create(:deployment, environment: environment) } let(:service) { described_class.new(deployment) } diff --git a/spec/services/deployments/update_environment_service_spec.rb b/spec/services/deployments/update_environment_service_spec.rb index 31a3abda8c7..33c9c9ed592 100644 --- a/spec/services/deployments/update_environment_service_spec.rb +++ b/spec/services/deployments/update_environment_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Deployments::UpdateEnvironmentService do +RSpec.describe Deployments::UpdateEnvironmentService, feature_category: :continuous_delivery do let(:user) { create(:user) } let(:project) { create(:project, :repository) } let(:options) { { name: environment_name } } diff --git a/spec/services/deployments/update_service_spec.rb b/spec/services/deployments/update_service_spec.rb index d3840189ba4..0814091765c 100644 --- a/spec/services/deployments/update_service_spec.rb +++ b/spec/services/deployments/update_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Deployments::UpdateService do +RSpec.describe Deployments::UpdateService, feature_category: :continuous_delivery do let(:deploy) { create(:deployment) } describe '#execute' do diff --git a/spec/services/design_management/copy_design_collection/copy_service_spec.rb b/spec/services/design_management/copy_design_collection/copy_service_spec.rb index 89a78c9bf5f..048327792e0 100644 --- a/spec/services/design_management/copy_design_collection/copy_service_spec.rb +++ b/spec/services/design_management/copy_design_collection/copy_service_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -RSpec.describe DesignManagement::CopyDesignCollection::CopyService, :clean_gitlab_redis_shared_state do +RSpec.describe DesignManagement::CopyDesignCollection::CopyService, :clean_gitlab_redis_shared_state, feature_category: :portfolio_management do include DesignManagementTestHelpers let_it_be(:user) { create(:user) } @@ -117,6 +117,7 @@ RSpec.describe DesignManagement::CopyDesignCollection::CopyService, :clean_gitla new_designs.zip(old_designs).each do |new_design, old_design| expect(new_design).to have_attributes( filename: old_design.filename, + description: old_design.description, relative_position: old_design.relative_position, issue: target_issue, project: target_issue.project diff --git a/spec/services/design_management/copy_design_collection/queue_service_spec.rb b/spec/services/design_management/copy_design_collection/queue_service_spec.rb index 05a7b092ccf..e6809e65d8a 100644 --- a/spec/services/design_management/copy_design_collection/queue_service_spec.rb +++ b/spec/services/design_management/copy_design_collection/queue_service_spec.rb @@ -1,7 +1,8 @@ # frozen_string_literal: true require 'spec_helper' -RSpec.describe DesignManagement::CopyDesignCollection::QueueService, :clean_gitlab_redis_shared_state do +RSpec.describe DesignManagement::CopyDesignCollection::QueueService, :clean_gitlab_redis_shared_state, + feature_category: :design_management do include DesignManagementTestHelpers let_it_be(:user) { create(:user) } diff --git a/spec/services/design_management/delete_designs_service_spec.rb b/spec/services/design_management/delete_designs_service_spec.rb index 48e53a92758..09ff2c5b897 100644 --- a/spec/services/design_management/delete_designs_service_spec.rb +++ b/spec/services/design_management/delete_designs_service_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -RSpec.describe DesignManagement::DeleteDesignsService do +RSpec.describe DesignManagement::DeleteDesignsService, feature_category: :design_management do include DesignManagementTestHelpers let_it_be(:project) { create(:project) } diff --git a/spec/services/design_management/design_user_notes_count_service_spec.rb b/spec/services/design_management/design_user_notes_count_service_spec.rb index 37806d3461c..1dbd055038c 100644 --- a/spec/services/design_management/design_user_notes_count_service_spec.rb +++ b/spec/services/design_management/design_user_notes_count_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe DesignManagement::DesignUserNotesCountService, :use_clean_rails_memory_store_caching do +RSpec.describe DesignManagement::DesignUserNotesCountService, :use_clean_rails_memory_store_caching, feature_category: :design_management do let_it_be(:design) { create(:design, :with_file) } subject { described_class.new(design) } diff --git a/spec/services/design_management/generate_image_versions_service_spec.rb b/spec/services/design_management/generate_image_versions_service_spec.rb index 5409ec12016..08442f221fa 100644 --- a/spec/services/design_management/generate_image_versions_service_spec.rb +++ b/spec/services/design_management/generate_image_versions_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe DesignManagement::GenerateImageVersionsService do +RSpec.describe DesignManagement::GenerateImageVersionsService, feature_category: :design_management do let_it_be(:project) { create(:project) } let_it_be(:issue) { create(:issue, project: project) } let_it_be(:version) { create(:design, :with_lfs_file, issue: issue).versions.first } diff --git a/spec/services/design_management/move_designs_service_spec.rb b/spec/services/design_management/move_designs_service_spec.rb index 519378a8dd4..8276d8d186a 100644 --- a/spec/services/design_management/move_designs_service_spec.rb +++ b/spec/services/design_management/move_designs_service_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -RSpec.describe DesignManagement::MoveDesignsService do +RSpec.describe DesignManagement::MoveDesignsService, feature_category: :design_management do include DesignManagementTestHelpers let_it_be(:issue) { create(:issue) } diff --git a/spec/services/discussions/capture_diff_note_position_service_spec.rb b/spec/services/discussions/capture_diff_note_position_service_spec.rb index 11614ccfd55..313e828bf0a 100644 --- a/spec/services/discussions/capture_diff_note_position_service_spec.rb +++ b/spec/services/discussions/capture_diff_note_position_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Discussions::CaptureDiffNotePositionService do +RSpec.describe Discussions::CaptureDiffNotePositionService, feature_category: :code_review_workflow do subject { described_class.new(note.noteable, paths) } context 'image note on diff' do diff --git a/spec/services/discussions/capture_diff_note_positions_service_spec.rb b/spec/services/discussions/capture_diff_note_positions_service_spec.rb index 8ba54495d4c..96922535eb2 100644 --- a/spec/services/discussions/capture_diff_note_positions_service_spec.rb +++ b/spec/services/discussions/capture_diff_note_positions_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Discussions::CaptureDiffNotePositionsService do +RSpec.describe Discussions::CaptureDiffNotePositionsService, feature_category: :code_review_workflow do context 'when merge request has a discussion' do let(:source_branch) { 'compare-with-merge-head-source' } let(:target_branch) { 'compare-with-merge-head-target' } diff --git a/spec/services/discussions/update_diff_position_service_spec.rb b/spec/services/discussions/update_diff_position_service_spec.rb index e7a3505bbd4..274430fdccb 100644 --- a/spec/services/discussions/update_diff_position_service_spec.rb +++ b/spec/services/discussions/update_diff_position_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Discussions::UpdateDiffPositionService do +RSpec.describe Discussions::UpdateDiffPositionService, feature_category: :code_review_workflow do let(:project) { create(:project, :repository) } let(:current_user) { project.first_owner } let(:create_commit) { project.commit("913c66a37b4a45b9769037c55c2d238bd0942d2e") } diff --git a/spec/services/draft_notes/create_service_spec.rb b/spec/services/draft_notes/create_service_spec.rb index 528c8717525..93731a80dcc 100644 --- a/spec/services/draft_notes/create_service_spec.rb +++ b/spec/services/draft_notes/create_service_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -RSpec.describe DraftNotes::CreateService do +RSpec.describe DraftNotes::CreateService, feature_category: :code_review_workflow do let(:merge_request) { create(:merge_request) } let(:project) { merge_request.target_project } let(:user) { merge_request.author } diff --git a/spec/services/draft_notes/destroy_service_spec.rb b/spec/services/draft_notes/destroy_service_spec.rb index 1f246a56eb3..f4cc9daa9e9 100644 --- a/spec/services/draft_notes/destroy_service_spec.rb +++ b/spec/services/draft_notes/destroy_service_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -RSpec.describe DraftNotes::DestroyService do +RSpec.describe DraftNotes::DestroyService, feature_category: :code_review_workflow do let(:merge_request) { create(:merge_request) } let(:project) { merge_request.target_project } let(:user) { merge_request.author } diff --git a/spec/services/draft_notes/publish_service_spec.rb b/spec/services/draft_notes/publish_service_spec.rb index 44fe9063ac9..a4b1d8742d0 100644 --- a/spec/services/draft_notes/publish_service_spec.rb +++ b/spec/services/draft_notes/publish_service_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -RSpec.describe DraftNotes::PublishService do +RSpec.describe DraftNotes::PublishService, feature_category: :code_review_workflow do include RepoHelpers let(:merge_request) { create(:merge_request) } diff --git a/spec/services/emails/confirm_service_spec.rb b/spec/services/emails/confirm_service_spec.rb index e8d3c0d673b..43fca75a5ea 100644 --- a/spec/services/emails/confirm_service_spec.rb +++ b/spec/services/emails/confirm_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Emails::ConfirmService do +RSpec.describe Emails::ConfirmService, feature_category: :user_management do let_it_be(:user) { create(:user) } subject(:service) { described_class.new(user) } diff --git a/spec/services/emails/create_service_spec.rb b/spec/services/emails/create_service_spec.rb index b13197f21b8..3ef67036483 100644 --- a/spec/services/emails/create_service_spec.rb +++ b/spec/services/emails/create_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Emails::CreateService do +RSpec.describe Emails::CreateService, feature_category: :user_management do let_it_be(:user) { create(:user) } let(:opts) { { email: 'new@email.com', user: user } } diff --git a/spec/services/emails/destroy_service_spec.rb b/spec/services/emails/destroy_service_spec.rb index 7dcf367016e..9d5e2b45647 100644 --- a/spec/services/emails/destroy_service_spec.rb +++ b/spec/services/emails/destroy_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Emails::DestroyService do +RSpec.describe Emails::DestroyService, feature_category: :user_management do let!(:user) { create(:user) } let!(:email) { create(:email, user: user) } diff --git a/spec/services/environments/auto_stop_service_spec.rb b/spec/services/environments/auto_stop_service_spec.rb index d688690c376..57fb860a557 100644 --- a/spec/services/environments/auto_stop_service_spec.rb +++ b/spec/services/environments/auto_stop_service_spec.rb @@ -2,7 +2,8 @@ require 'spec_helper' -RSpec.describe Environments::AutoStopService, :clean_gitlab_redis_shared_state, :sidekiq_inline do +RSpec.describe Environments::AutoStopService, :clean_gitlab_redis_shared_state, :sidekiq_inline, + feature_category: :continuous_delivery do include CreateEnvironmentsHelpers include ExclusiveLeaseHelpers diff --git a/spec/services/environments/canary_ingress/update_service_spec.rb b/spec/services/environments/canary_ingress/update_service_spec.rb index 531f7d68a9f..f7d446c13f9 100644 --- a/spec/services/environments/canary_ingress/update_service_spec.rb +++ b/spec/services/environments/canary_ingress/update_service_spec.rb @@ -2,7 +2,8 @@ require 'spec_helper' -RSpec.describe Environments::CanaryIngress::UpdateService, :clean_gitlab_redis_cache do +RSpec.describe Environments::CanaryIngress::UpdateService, :clean_gitlab_redis_cache, + feature_category: :continuous_delivery do include KubernetesHelpers let_it_be(:project, refind: true) { create(:project) } diff --git a/spec/services/environments/create_for_build_service_spec.rb b/spec/services/environments/create_for_build_service_spec.rb index c7aadb20c01..223401a243d 100644 --- a/spec/services/environments/create_for_build_service_spec.rb +++ b/spec/services/environments/create_for_build_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Environments::CreateForBuildService do +RSpec.describe Environments::CreateForBuildService, feature_category: :continuous_delivery do let_it_be(:project) { create(:project, :repository) } let_it_be(:user) { create(:user) } let_it_be(:pipeline) { create(:ci_pipeline, project: project) } diff --git a/spec/services/environments/reset_auto_stop_service_spec.rb b/spec/services/environments/reset_auto_stop_service_spec.rb index 4a0b091c12d..a3b8b2e0aa1 100644 --- a/spec/services/environments/reset_auto_stop_service_spec.rb +++ b/spec/services/environments/reset_auto_stop_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Environments::ResetAutoStopService do +RSpec.describe Environments::ResetAutoStopService, feature_category: :continuous_delivery do let_it_be(:project) { create(:project) } let_it_be(:developer) { create(:user).tap { |user| project.add_developer(user) } } let_it_be(:reporter) { create(:user).tap { |user| project.add_reporter(user) } } diff --git a/spec/services/environments/schedule_to_delete_review_apps_service_spec.rb b/spec/services/environments/schedule_to_delete_review_apps_service_spec.rb index 401d6203b2c..3047f415815 100644 --- a/spec/services/environments/schedule_to_delete_review_apps_service_spec.rb +++ b/spec/services/environments/schedule_to_delete_review_apps_service_spec.rb @@ -2,7 +2,7 @@ require "spec_helper" -RSpec.describe Environments::ScheduleToDeleteReviewAppsService do +RSpec.describe Environments::ScheduleToDeleteReviewAppsService, feature_category: :continuous_delivery do include ExclusiveLeaseHelpers let_it_be(:maintainer) { create(:user) } diff --git a/spec/services/environments/stop_service_spec.rb b/spec/services/environments/stop_service_spec.rb index 5f983a2151a..6e3b36b5636 100644 --- a/spec/services/environments/stop_service_spec.rb +++ b/spec/services/environments/stop_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Environments::StopService do +RSpec.describe Environments::StopService, feature_category: :continuous_delivery do include CreateEnvironmentsHelpers let(:project) { create(:project, :private, :repository) } diff --git a/spec/services/error_tracking/base_service_spec.rb b/spec/services/error_tracking/base_service_spec.rb index de3523cb847..ed9efd9f95a 100644 --- a/spec/services/error_tracking/base_service_spec.rb +++ b/spec/services/error_tracking/base_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe ErrorTracking::BaseService do +RSpec.describe ErrorTracking::BaseService, feature_category: :error_tracking do describe '#compose_response' do let(:project) { build_stubbed(:project) } let(:user) { build_stubbed(:user, id: non_existing_record_id) } diff --git a/spec/services/error_tracking/collect_error_service_spec.rb b/spec/services/error_tracking/collect_error_service_spec.rb index 159c070c683..3ff753e8c65 100644 --- a/spec/services/error_tracking/collect_error_service_spec.rb +++ b/spec/services/error_tracking/collect_error_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe ErrorTracking::CollectErrorService do +RSpec.describe ErrorTracking::CollectErrorService, feature_category: :error_tracking do let_it_be(:project) { create(:project) } let(:parsed_event_file) { 'error_tracking/parsed_event.json' } diff --git a/spec/services/error_tracking/issue_details_service_spec.rb b/spec/services/error_tracking/issue_details_service_spec.rb index 29f8154a27c..7ac41ffead6 100644 --- a/spec/services/error_tracking/issue_details_service_spec.rb +++ b/spec/services/error_tracking/issue_details_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe ErrorTracking::IssueDetailsService do +RSpec.describe ErrorTracking::IssueDetailsService, feature_category: :error_tracking do include_context 'sentry error tracking context' subject { described_class.new(project, user, params) } diff --git a/spec/services/error_tracking/issue_latest_event_service_spec.rb b/spec/services/error_tracking/issue_latest_event_service_spec.rb index aa2430ddffb..bfde14c7ef1 100644 --- a/spec/services/error_tracking/issue_latest_event_service_spec.rb +++ b/spec/services/error_tracking/issue_latest_event_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe ErrorTracking::IssueLatestEventService do +RSpec.describe ErrorTracking::IssueLatestEventService, feature_category: :error_tracking do include_context 'sentry error tracking context' let(:params) { {} } diff --git a/spec/services/error_tracking/issue_update_service_spec.rb b/spec/services/error_tracking/issue_update_service_spec.rb index a06c3588264..4dae6cc2fa0 100644 --- a/spec/services/error_tracking/issue_update_service_spec.rb +++ b/spec/services/error_tracking/issue_update_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe ErrorTracking::IssueUpdateService do +RSpec.describe ErrorTracking::IssueUpdateService, feature_category: :error_tracking do include_context 'sentry error tracking context' let(:arguments) { { issue_id: non_existing_record_id, status: 'resolved' } } diff --git a/spec/services/error_tracking/list_issues_service_spec.rb b/spec/services/error_tracking/list_issues_service_spec.rb index a7bd6c75df5..2c35c2b8acd 100644 --- a/spec/services/error_tracking/list_issues_service_spec.rb +++ b/spec/services/error_tracking/list_issues_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe ErrorTracking::ListIssuesService do +RSpec.describe ErrorTracking::ListIssuesService, feature_category: :error_tracking do include_context 'sentry error tracking context' let(:params) { {} } diff --git a/spec/services/event_create_service_spec.rb b/spec/services/event_create_service_spec.rb index b969bd76053..d14f130233e 100644 --- a/spec/services/event_create_service_spec.rb +++ b/spec/services/event_create_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe EventCreateService, :clean_gitlab_redis_cache, :clean_gitlab_redis_shared_state do +RSpec.describe EventCreateService, :clean_gitlab_redis_cache, :clean_gitlab_redis_shared_state, feature_category: :service_ping do include SnowplowHelpers let(:service) { described_class.new } @@ -12,10 +12,20 @@ RSpec.describe EventCreateService, :clean_gitlab_redis_cache, :clean_gitlab_redi shared_examples 'it records the event in the event counter' do specify do - tracking_params = { event_action: event_action, date_from: Date.yesterday, date_to: Date.today } + tracking_params = { event_names: event_action, start_date: Date.yesterday, end_date: Date.today } expect { subject } - .to change { Gitlab::UsageDataCounters::TrackUniqueEvents.count_unique_events(**tracking_params) } + .to change { Gitlab::UsageDataCounters::HLLRedisCounter.unique_events(**tracking_params) } + .by(1) + end + end + + shared_examples 'it records a git write event' do + specify do + tracking_params = { event_names: 'git_write_action', start_date: Date.yesterday, end_date: Date.today } + + expect { subject } + .to change { Gitlab::UsageDataCounters::HLLRedisCounter.unique_events(**tracking_params) } .by(1) end end @@ -65,11 +75,10 @@ RSpec.describe EventCreateService, :clean_gitlab_redis_cache, :clean_gitlab_redi end it_behaves_like "it records the event in the event counter" do - let(:event_action) { Gitlab::UsageDataCounters::TrackUniqueEvents::MERGE_REQUEST_ACTION } + let(:event_action) { :merge_request_action } end it_behaves_like 'Snowplow event tracking with RedisHLL context' do - let(:feature_flag_name) { :route_hll_to_snowplow_phase2 } let(:category) { described_class.name } let(:action) { 'created' } let(:label) { described_class::MR_EVENT_LABEL } @@ -95,11 +104,10 @@ RSpec.describe EventCreateService, :clean_gitlab_redis_cache, :clean_gitlab_redi end it_behaves_like "it records the event in the event counter" do - let(:event_action) { Gitlab::UsageDataCounters::TrackUniqueEvents::MERGE_REQUEST_ACTION } + let(:event_action) { :merge_request_action } end it_behaves_like 'Snowplow event tracking with RedisHLL context' do - let(:feature_flag_name) { :route_hll_to_snowplow_phase2 } let(:category) { described_class.name } let(:action) { 'closed' } let(:label) { described_class::MR_EVENT_LABEL } @@ -125,11 +133,10 @@ RSpec.describe EventCreateService, :clean_gitlab_redis_cache, :clean_gitlab_redi end it_behaves_like "it records the event in the event counter" do - let(:event_action) { Gitlab::UsageDataCounters::TrackUniqueEvents::MERGE_REQUEST_ACTION } + let(:event_action) { :merge_request_action } end it_behaves_like 'Snowplow event tracking with RedisHLL context' do - let(:feature_flag_name) { :route_hll_to_snowplow_phase2 } let(:category) { described_class.name } let(:action) { 'merged' } let(:label) { described_class::MR_EVENT_LABEL } @@ -276,8 +283,10 @@ RSpec.describe EventCreateService, :clean_gitlab_redis_cache, :clean_gitlab_redi end it_behaves_like "it records the event in the event counter" do - let(:event_action) { Gitlab::UsageDataCounters::TrackUniqueEvents::WIKI_ACTION } + let(:event_action) { :wiki_action } end + + it_behaves_like "it records a git write event" end (Event.actions.keys - Event::WIKI_ACTIONS).each do |bad_action| @@ -312,9 +321,11 @@ RSpec.describe EventCreateService, :clean_gitlab_redis_cache, :clean_gitlab_redi it_behaves_like 'service for creating a push event', PushEventPayloadService it_behaves_like "it records the event in the event counter" do - let(:event_action) { Gitlab::UsageDataCounters::TrackUniqueEvents::PUSH_ACTION } + let(:event_action) { :project_action } end + it_behaves_like "it records a git write event" + it_behaves_like 'Snowplow event tracking with RedisHLL context' do let(:category) { described_class.to_s } let(:action) { :push } @@ -338,9 +349,11 @@ RSpec.describe EventCreateService, :clean_gitlab_redis_cache, :clean_gitlab_redi it_behaves_like 'service for creating a push event', BulkPushEventPayloadService it_behaves_like "it records the event in the event counter" do - let(:event_action) { Gitlab::UsageDataCounters::TrackUniqueEvents::PUSH_ACTION } + let(:event_action) { :project_action } end + it_behaves_like "it records a git write event" + it_behaves_like 'Snowplow event tracking with RedisHLL context' do let(:category) { described_class.to_s } let(:action) { :push } @@ -400,16 +413,17 @@ RSpec.describe EventCreateService, :clean_gitlab_redis_cache, :clean_gitlab_redi end it_behaves_like "it records the event in the event counter" do - let(:event_action) { Gitlab::UsageDataCounters::TrackUniqueEvents::DESIGN_ACTION } + let(:event_action) { :design_action } end + it_behaves_like "it records a git write event" + describe 'Snowplow tracking' do let(:project) { design.project } let(:namespace) { project.namespace } let(:category) { described_class.name } - let(:property) { Gitlab::UsageDataCounters::TrackUniqueEvents::DESIGN_ACTION.to_s } + let(:property) { :design_action.to_s } let(:label) { ::EventCreateService::DEGIGN_EVENT_LABEL } - let(:feature_flag_name) { :route_hll_to_snowplow_phase2 } context 'for create event' do it_behaves_like 'Snowplow event tracking with RedisHLL context' do @@ -448,9 +462,11 @@ RSpec.describe EventCreateService, :clean_gitlab_redis_cache, :clean_gitlab_redi end it_behaves_like "it records the event in the event counter" do - let(:event_action) { Gitlab::UsageDataCounters::TrackUniqueEvents::DESIGN_ACTION } + let(:event_action) { :design_action } end + it_behaves_like "it records a git write event" + it_behaves_like 'Snowplow event tracking with RedisHLL context' do subject(:design_service) { service.destroy_designs([design], author) } @@ -459,9 +475,8 @@ RSpec.describe EventCreateService, :clean_gitlab_redis_cache, :clean_gitlab_redi let(:category) { described_class.name } let(:action) { 'destroy' } let(:user) { author } - let(:property) { Gitlab::UsageDataCounters::TrackUniqueEvents::DESIGN_ACTION.to_s } + let(:property) { :design_action.to_s } let(:label) { ::EventCreateService::DEGIGN_EVENT_LABEL } - let(:feature_flag_name) { :route_hll_to_snowplow_phase2 } end end end @@ -471,7 +486,7 @@ RSpec.describe EventCreateService, :clean_gitlab_redis_cache, :clean_gitlab_redi let(:note) { create(:note) } let(:author) { create(:user) } - let(:event_action) { Gitlab::UsageDataCounters::TrackUniqueEvents::MERGE_REQUEST_ACTION } + let(:event_action) { :merge_request_action } it { expect(leave_note).to be_truthy } @@ -485,7 +500,6 @@ RSpec.describe EventCreateService, :clean_gitlab_redis_cache, :clean_gitlab_redi it_behaves_like "it records the event in the event counter" it_behaves_like 'Snowplow event tracking with RedisHLL context' do - let(:feature_flag_name) { :route_hll_to_snowplow_phase2 } let(:note) { create(:diff_note_on_merge_request) } let(:category) { described_class.name } let(:action) { 'commented' } @@ -502,10 +516,9 @@ RSpec.describe EventCreateService, :clean_gitlab_redis_cache, :clean_gitlab_redi context 'when it is not a diff note' do it 'does not change the unique action counter' do - counter_class = Gitlab::UsageDataCounters::TrackUniqueEvents - tracking_params = { event_action: event_action, date_from: Date.yesterday, date_to: Date.today } + tracking_params = { event_names: event_action, start_date: Date.yesterday, end_date: Date.today } - expect { subject }.not_to change { counter_class.count_unique_events(**tracking_params) } + expect { subject }.not_to change { Gitlab::UsageDataCounters::HLLRedisCounter.unique_events(**tracking_params) } end end end diff --git a/spec/services/events/destroy_service_spec.rb b/spec/services/events/destroy_service_spec.rb index 8b07852c040..e50fe247238 100644 --- a/spec/services/events/destroy_service_spec.rb +++ b/spec/services/events/destroy_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Events::DestroyService do +RSpec.describe Events::DestroyService, feature_category: :user_profile do subject(:service) { described_class.new(project) } let_it_be(:project, reload: true) { create(:project, :repository) } diff --git a/spec/services/events/render_service_spec.rb b/spec/services/events/render_service_spec.rb index 24a3b9abe14..2e8cd26781b 100644 --- a/spec/services/events/render_service_spec.rb +++ b/spec/services/events/render_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Events::RenderService do +RSpec.describe Events::RenderService, feature_category: :user_profile do describe '#execute' do let!(:note) { build(:note) } let!(:event) { build(:event, target: note, project: note.project) } diff --git a/spec/services/feature_flags/create_service_spec.rb b/spec/services/feature_flags/create_service_spec.rb index 1a32faad948..18c48714ccd 100644 --- a/spec/services/feature_flags/create_service_spec.rb +++ b/spec/services/feature_flags/create_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe FeatureFlags::CreateService do +RSpec.describe FeatureFlags::CreateService, feature_category: :feature_flags do let_it_be(:project) { create(:project) } let_it_be(:developer) { create(:user) } let_it_be(:reporter) { create(:user) } @@ -46,6 +46,8 @@ RSpec.describe FeatureFlags::CreateService do end context 'when feature flag is saved correctly' do + let(:audit_event_details) { AuditEvent.last.details } + let(:audit_event_message) { audit_event_details[:custom_message] } let(:params) do { name: 'feature_flag', @@ -88,9 +90,9 @@ RSpec.describe FeatureFlags::CreateService do it 'creates audit event', :with_license do expect { subject }.to change { AuditEvent.count }.by(1) - expect(AuditEvent.last.details[:custom_message]).to start_with('Created feature flag feature_flag with description "description".') - expect(AuditEvent.last.details[:custom_message]).to include('Created strategy "default" with scopes "*".') - expect(AuditEvent.last.details[:custom_message]).to include('Created strategy "default" with scopes "production".') + expect(audit_event_message).to start_with('Created feature flag feature_flag with description "description".') + expect(audit_event_message).to include('Created strategy "default" with scopes "*".') + expect(audit_event_message).to include('Created strategy "default" with scopes "production".') end context 'when user is reporter' do diff --git a/spec/services/feature_flags/destroy_service_spec.rb b/spec/services/feature_flags/destroy_service_spec.rb index b2793dc0560..1ec0ee6e68c 100644 --- a/spec/services/feature_flags/destroy_service_spec.rb +++ b/spec/services/feature_flags/destroy_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe FeatureFlags::DestroyService do +RSpec.describe FeatureFlags::DestroyService, feature_category: :feature_flags do include FeatureFlagHelpers let_it_be(:project) { create(:project) } @@ -20,7 +20,8 @@ RSpec.describe FeatureFlags::DestroyService do describe '#execute' do subject { described_class.new(project, user, params).execute(feature_flag) } - let(:audit_event_message) { AuditEvent.last.details[:custom_message] } + let(:audit_event_details) { AuditEvent.last.details } + let(:audit_event_message) { audit_event_details[:custom_message] } let(:params) { {} } it 'returns status success' do diff --git a/spec/services/feature_flags/hook_service_spec.rb b/spec/services/feature_flags/hook_service_spec.rb index f3edaca52a9..2a3ce9085b8 100644 --- a/spec/services/feature_flags/hook_service_spec.rb +++ b/spec/services/feature_flags/hook_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe FeatureFlags::HookService do +RSpec.describe FeatureFlags::HookService, feature_category: :feature_flags do describe '#execute_hooks' do let_it_be(:namespace) { create(:namespace) } let_it_be(:project) { create(:project, :repository, namespace: namespace) } diff --git a/spec/services/feature_flags/update_service_spec.rb b/spec/services/feature_flags/update_service_spec.rb index 1c5af71a50a..55c09f06f16 100644 --- a/spec/services/feature_flags/update_service_spec.rb +++ b/spec/services/feature_flags/update_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe FeatureFlags::UpdateService, :with_license do +RSpec.describe FeatureFlags::UpdateService, :with_license, feature_category: :feature_flags do let_it_be(:project) { create(:project) } let_it_be(:developer) { create(:user) } let_it_be(:reporter) { create(:user) } @@ -19,9 +19,8 @@ RSpec.describe FeatureFlags::UpdateService, :with_license do subject { described_class.new(project, user, params).execute(feature_flag) } let(:params) { { name: 'new_name' } } - let(:audit_event_message) do - AuditEvent.last.details[:custom_message] - end + let(:audit_event_details) { AuditEvent.last.details } + let(:audit_event_message) { audit_event_details[:custom_message] } it 'returns success status' do expect(subject[:status]).to eq(:success) diff --git a/spec/services/files/create_service_spec.rb b/spec/services/files/create_service_spec.rb index 3b3dbd1fcfe..26f57f43120 100644 --- a/spec/services/files/create_service_spec.rb +++ b/spec/services/files/create_service_spec.rb @@ -2,7 +2,7 @@ require "spec_helper" -RSpec.describe Files::CreateService do +RSpec.describe Files::CreateService, feature_category: :source_code_management do let(:project) { create(:project, :repository) } let(:repository) { project.repository } let(:user) { create(:user, :commit_email) } diff --git a/spec/services/files/delete_service_spec.rb b/spec/services/files/delete_service_spec.rb index 3823d027812..dd99e5f9742 100644 --- a/spec/services/files/delete_service_spec.rb +++ b/spec/services/files/delete_service_spec.rb @@ -2,7 +2,7 @@ require "spec_helper" -RSpec.describe Files::DeleteService do +RSpec.describe Files::DeleteService, feature_category: :source_code_management do subject { described_class.new(project, user, commit_params) } let(:project) { create(:project, :repository) } @@ -52,8 +52,8 @@ RSpec.describe Files::DeleteService do end describe "#execute" do - context "when the file's last commit sha does not match the supplied last_commit_sha" do - let(:last_commit_sha) { "foo" } + context "when the file's last commit is earlier than the latest commit for this branch" do + let(:last_commit_sha) { Gitlab::Git::Commit.last_for_path(project.repository, project.default_branch, file_path).parent_id } it "returns a hash with the correct error message and a :error status" do expect { subject.execute } diff --git a/spec/services/files/multi_service_spec.rb b/spec/services/files/multi_service_spec.rb index 6a5c7d2749d..7149fa77d6a 100644 --- a/spec/services/files/multi_service_spec.rb +++ b/spec/services/files/multi_service_spec.rb @@ -2,7 +2,7 @@ require "spec_helper" -RSpec.describe Files::MultiService do +RSpec.describe Files::MultiService, feature_category: :source_code_management do subject { described_class.new(project, user, commit_params) } let(:project) { create(:project, :repository) } @@ -19,6 +19,10 @@ RSpec.describe Files::MultiService do Gitlab::Git::Commit.last_for_path(project.repository, branch_name, original_file_path).sha end + let(:branch_commit_id) do + Gitlab::Git::Commit.find(project.repository, branch_name).sha + end + let(:default_action) do { action: action, @@ -78,6 +82,16 @@ RSpec.describe Files::MultiService do end end + context 'when file not changed, but later commit id is used' do + let(:actions) { [default_action.merge(last_commit_id: branch_commit_id)] } + + it 'accepts the commit' do + results = subject.execute + + expect(results[:status]).to eq(:success) + end + end + context 'when the file have not been modified' do it 'accepts the commit' do results = subject.execute diff --git a/spec/services/files/update_service_spec.rb b/spec/services/files/update_service_spec.rb index 6d7459e0b29..6a9f9d6b86f 100644 --- a/spec/services/files/update_service_spec.rb +++ b/spec/services/files/update_service_spec.rb @@ -2,7 +2,7 @@ require "spec_helper" -RSpec.describe Files::UpdateService do +RSpec.describe Files::UpdateService, feature_category: :source_code_management do subject { described_class.new(project, user, commit_params) } let(:project) { create(:project, :repository) } @@ -31,8 +31,8 @@ RSpec.describe Files::UpdateService do end describe "#execute" do - context "when the file's last commit sha does not match the supplied last_commit_sha" do - let(:last_commit_sha) { "foo" } + context "when the file's last commit sha is earlier than the latest change for that branch" do + let(:last_commit_sha) { Gitlab::Git::Commit.last_for_path(project.repository, project.default_branch, file_path).parent_id } it "returns a hash with the correct error message and a :error status" do expect { subject.execute } diff --git a/spec/services/git/base_hooks_service_spec.rb b/spec/services/git/base_hooks_service_spec.rb index 5afd7b30ab0..9d49943ccfb 100644 --- a/spec/services/git/base_hooks_service_spec.rb +++ b/spec/services/git/base_hooks_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Git::BaseHooksService do +RSpec.describe Git::BaseHooksService, feature_category: :source_code_management do include RepoHelpers let_it_be(:user) { create(:user) } diff --git a/spec/services/git/branch_hooks_service_spec.rb b/spec/services/git/branch_hooks_service_spec.rb index 973ead28462..e991b5bd842 100644 --- a/spec/services/git/branch_hooks_service_spec.rb +++ b/spec/services/git/branch_hooks_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Git::BranchHooksService, :clean_gitlab_redis_shared_state do +RSpec.describe Git::BranchHooksService, :clean_gitlab_redis_shared_state, feature_category: :source_code_management do include RepoHelpers include ProjectForksHelper diff --git a/spec/services/git/branch_push_service_spec.rb b/spec/services/git/branch_push_service_spec.rb index a9f5b07fef4..aa534777f3e 100644 --- a/spec/services/git/branch_push_service_spec.rb +++ b/spec/services/git/branch_push_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Git::BranchPushService, :use_clean_rails_redis_caching, services: true do +RSpec.describe Git::BranchPushService, :use_clean_rails_redis_caching, services: true, feature_category: :source_code_management do include RepoHelpers let_it_be(:user) { create(:user) } diff --git a/spec/services/git/process_ref_changes_service_spec.rb b/spec/services/git/process_ref_changes_service_spec.rb index 8d2da4a899e..9ec13bc957b 100644 --- a/spec/services/git/process_ref_changes_service_spec.rb +++ b/spec/services/git/process_ref_changes_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Git::ProcessRefChangesService do +RSpec.describe Git::ProcessRefChangesService, feature_category: :source_code_management do let(:project) { create(:project, :repository) } let(:user) { project.first_owner } let(:params) { { changes: git_changes } } diff --git a/spec/services/git/tag_hooks_service_spec.rb b/spec/services/git/tag_hooks_service_spec.rb index 01a0d2e8600..73f6eff36ba 100644 --- a/spec/services/git/tag_hooks_service_spec.rb +++ b/spec/services/git/tag_hooks_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Git::TagHooksService, :service do +RSpec.describe Git::TagHooksService, :service, feature_category: :source_code_management do let(:user) { create(:user) } let(:project) { create(:project, :repository) } diff --git a/spec/services/git/tag_push_service_spec.rb b/spec/services/git/tag_push_service_spec.rb index 597254d46fa..0d40c331d11 100644 --- a/spec/services/git/tag_push_service_spec.rb +++ b/spec/services/git/tag_push_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Git::TagPushService do +RSpec.describe Git::TagPushService, feature_category: :source_code_management do include RepoHelpers let(:user) { create(:user) } diff --git a/spec/services/git/wiki_push_service/change_spec.rb b/spec/services/git/wiki_push_service/change_spec.rb index 3616bf62b20..ad3c4ae68c0 100644 --- a/spec/services/git/wiki_push_service/change_spec.rb +++ b/spec/services/git/wiki_push_service/change_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Git::WikiPushService::Change do +RSpec.describe Git::WikiPushService::Change, feature_category: :source_code_management do subject { described_class.new(project_wiki, change, raw_change) } let(:project_wiki) { double('ProjectWiki') } diff --git a/spec/services/google_cloud/create_cloudsql_instance_service_spec.rb b/spec/services/google_cloud/create_cloudsql_instance_service_spec.rb index cd0dd75e576..4f2e0bea623 100644 --- a/spec/services/google_cloud/create_cloudsql_instance_service_spec.rb +++ b/spec/services/google_cloud/create_cloudsql_instance_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe GoogleCloud::CreateCloudsqlInstanceService do +RSpec.describe GoogleCloud::CreateCloudsqlInstanceService, feature_category: :deployment_management do let(:project) { create(:project) } let(:user) { create(:user) } let(:gcp_project_id) { 'gcp_project_120' } diff --git a/spec/services/google_cloud/create_service_accounts_service_spec.rb b/spec/services/google_cloud/create_service_accounts_service_spec.rb index 3f500e7c235..3b57f2a9e5f 100644 --- a/spec/services/google_cloud/create_service_accounts_service_spec.rb +++ b/spec/services/google_cloud/create_service_accounts_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe GoogleCloud::CreateServiceAccountsService do +RSpec.describe GoogleCloud::CreateServiceAccountsService, feature_category: :deployment_management do describe '#execute' do before do mock_google_oauth2_creds = Struct.new(:app_id, :app_secret) diff --git a/spec/services/google_cloud/enable_cloud_run_service_spec.rb b/spec/services/google_cloud/enable_cloud_run_service_spec.rb index 6d2b1f5cfd5..3de9e7fcd5c 100644 --- a/spec/services/google_cloud/enable_cloud_run_service_spec.rb +++ b/spec/services/google_cloud/enable_cloud_run_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe GoogleCloud::EnableCloudRunService do +RSpec.describe GoogleCloud::EnableCloudRunService, feature_category: :deployment_management do describe 'when a project does not have any gcp projects' do let_it_be(:project) { create(:project) } diff --git a/spec/services/google_cloud/enable_cloudsql_service_spec.rb b/spec/services/google_cloud/enable_cloudsql_service_spec.rb index aa6d2402d7c..b14b827e8b8 100644 --- a/spec/services/google_cloud/enable_cloudsql_service_spec.rb +++ b/spec/services/google_cloud/enable_cloudsql_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe GoogleCloud::EnableCloudsqlService do +RSpec.describe GoogleCloud::EnableCloudsqlService, feature_category: :deployment_management do let_it_be(:project) { create(:project) } let_it_be(:user) { create(:user) } let_it_be(:params) do diff --git a/spec/services/google_cloud/gcp_region_add_or_replace_service_spec.rb b/spec/services/google_cloud/gcp_region_add_or_replace_service_spec.rb index b2cd5632be0..a748fed7134 100644 --- a/spec/services/google_cloud/gcp_region_add_or_replace_service_spec.rb +++ b/spec/services/google_cloud/gcp_region_add_or_replace_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe GoogleCloud::GcpRegionAddOrReplaceService do +RSpec.describe GoogleCloud::GcpRegionAddOrReplaceService, feature_category: :deployment_management do it 'adds and replaces GCP region vars' do project = create(:project, :public) service = described_class.new(project) diff --git a/spec/services/google_cloud/generate_pipeline_service_spec.rb b/spec/services/google_cloud/generate_pipeline_service_spec.rb index a78d8ff6661..c18514884ca 100644 --- a/spec/services/google_cloud/generate_pipeline_service_spec.rb +++ b/spec/services/google_cloud/generate_pipeline_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe GoogleCloud::GeneratePipelineService do +RSpec.describe GoogleCloud::GeneratePipelineService, feature_category: :deployment_management do describe 'for cloud-run' do describe 'when there is no existing pipeline' do let_it_be(:project) { create(:project, :repository) } diff --git a/spec/services/google_cloud/get_cloudsql_instances_service_spec.rb b/spec/services/google_cloud/get_cloudsql_instances_service_spec.rb index 4587a5077c0..ed41d0fd487 100644 --- a/spec/services/google_cloud/get_cloudsql_instances_service_spec.rb +++ b/spec/services/google_cloud/get_cloudsql_instances_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe GoogleCloud::GetCloudsqlInstancesService do +RSpec.describe GoogleCloud::GetCloudsqlInstancesService, feature_category: :deployment_management do let(:service) { described_class.new(project) } let(:project) { create(:project) } diff --git a/spec/services/google_cloud/service_accounts_service_spec.rb b/spec/services/google_cloud/service_accounts_service_spec.rb index 10e387126a3..c900bf7d300 100644 --- a/spec/services/google_cloud/service_accounts_service_spec.rb +++ b/spec/services/google_cloud/service_accounts_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe GoogleCloud::ServiceAccountsService do +RSpec.describe GoogleCloud::ServiceAccountsService, feature_category: :deployment_management do let(:service) { described_class.new(project) } describe 'find_for_project' do diff --git a/spec/services/google_cloud/setup_cloudsql_instance_service_spec.rb b/spec/services/google_cloud/setup_cloudsql_instance_service_spec.rb index 0a0f05ab4be..5095277f61a 100644 --- a/spec/services/google_cloud/setup_cloudsql_instance_service_spec.rb +++ b/spec/services/google_cloud/setup_cloudsql_instance_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe GoogleCloud::SetupCloudsqlInstanceService do +RSpec.describe GoogleCloud::SetupCloudsqlInstanceService, feature_category: :deployment_management do let(:random_user) { create(:user) } let(:project) { create(:project) } let(:list_databases_empty) { Google::Apis::SqladminV1beta4::ListDatabasesResponse.new(items: []) } diff --git a/spec/services/gpg_keys/create_service_spec.rb b/spec/services/gpg_keys/create_service_spec.rb index 9ac56355b4b..d603ce951ec 100644 --- a/spec/services/gpg_keys/create_service_spec.rb +++ b/spec/services/gpg_keys/create_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe GpgKeys::CreateService do +RSpec.describe GpgKeys::CreateService, feature_category: :source_code_management do let(:user) { create(:user) } let(:params) { attributes_for(:gpg_key) } diff --git a/spec/services/grafana/proxy_service_spec.rb b/spec/services/grafana/proxy_service_spec.rb index 99120de3593..7029bab379a 100644 --- a/spec/services/grafana/proxy_service_spec.rb +++ b/spec/services/grafana/proxy_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Grafana::ProxyService do +RSpec.describe Grafana::ProxyService, feature_category: :metrics do include ReactiveCachingHelpers let_it_be(:project) { create(:project) } diff --git a/spec/services/gravatar_service_spec.rb b/spec/services/gravatar_service_spec.rb index a6418b02f78..6ccb362cc5c 100644 --- a/spec/services/gravatar_service_spec.rb +++ b/spec/services/gravatar_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe GravatarService do +RSpec.describe GravatarService, feature_category: :user_profile do describe '#execute' do let(:url) { 'http://example.com/avatar?hash=%{hash}&size=%{size}&email=%{email}&username=%{username}' } diff --git a/spec/services/groups/auto_devops_service_spec.rb b/spec/services/groups/auto_devops_service_spec.rb index 486a99dd8df..0724e072dab 100644 --- a/spec/services/groups/auto_devops_service_spec.rb +++ b/spec/services/groups/auto_devops_service_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -RSpec.describe Groups::AutoDevopsService, '#execute' do +RSpec.describe Groups::AutoDevopsService, '#execute', feature_category: :auto_devops do let_it_be(:group) { create(:group) } let_it_be(:user) { create(:user) } diff --git a/spec/services/groups/autocomplete_service_spec.rb b/spec/services/groups/autocomplete_service_spec.rb index 00d0ad3b347..9f55322e72d 100644 --- a/spec/services/groups/autocomplete_service_spec.rb +++ b/spec/services/groups/autocomplete_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Groups::AutocompleteService do +RSpec.describe Groups::AutocompleteService, feature_category: :subgroups do let_it_be(:group, refind: true) { create(:group, :nested, :private, avatar: fixture_file_upload('spec/fixtures/dk.png')) } let_it_be(:sub_group) { create(:group, :private, parent: group) } diff --git a/spec/services/groups/deploy_tokens/create_service_spec.rb b/spec/services/groups/deploy_tokens/create_service_spec.rb index 0c28075f998..e408c2787d8 100644 --- a/spec/services/groups/deploy_tokens/create_service_spec.rb +++ b/spec/services/groups/deploy_tokens/create_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Groups::DeployTokens::CreateService do +RSpec.describe Groups::DeployTokens::CreateService, feature_category: :deployment_management do it_behaves_like 'a deploy token creation service' do let(:entity) { create(:group) } let(:deploy_token_class) { GroupDeployToken } diff --git a/spec/services/groups/deploy_tokens/destroy_service_spec.rb b/spec/services/groups/deploy_tokens/destroy_service_spec.rb index 28e60b12993..c4694758b2f 100644 --- a/spec/services/groups/deploy_tokens/destroy_service_spec.rb +++ b/spec/services/groups/deploy_tokens/destroy_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Groups::DeployTokens::DestroyService do +RSpec.describe Groups::DeployTokens::DestroyService, feature_category: :deployment_management do it_behaves_like 'a deploy token deletion service' do let_it_be(:entity) { create(:group) } let_it_be(:deploy_token_class) { GroupDeployToken } diff --git a/spec/services/groups/deploy_tokens/revoke_service_spec.rb b/spec/services/groups/deploy_tokens/revoke_service_spec.rb index fcf11bbb8e6..c302dd14e3b 100644 --- a/spec/services/groups/deploy_tokens/revoke_service_spec.rb +++ b/spec/services/groups/deploy_tokens/revoke_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Groups::DeployTokens::RevokeService do +RSpec.describe Groups::DeployTokens::RevokeService, feature_category: :deployment_management do let_it_be(:entity) { create(:group) } let_it_be(:deploy_token) { create(:deploy_token, :group, groups: [entity]) } let_it_be(:user) { create(:user) } diff --git a/spec/services/groups/group_links/create_service_spec.rb b/spec/services/groups/group_links/create_service_spec.rb index bfbaedbd06f..ced87421858 100644 --- a/spec/services/groups/group_links/create_service_spec.rb +++ b/spec/services/groups/group_links/create_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Groups::GroupLinks::CreateService, '#execute' do +RSpec.describe Groups::GroupLinks::CreateService, '#execute', feature_category: :subgroups do let_it_be(:shared_with_group_parent) { create(:group, :private) } let_it_be(:shared_with_group) { create(:group, :private, parent: shared_with_group_parent) } let_it_be(:shared_with_group_child) { create(:group, :private, parent: shared_with_group) } diff --git a/spec/services/groups/group_links/destroy_service_spec.rb b/spec/services/groups/group_links/destroy_service_spec.rb index a570c28cf8b..5821ec44192 100644 --- a/spec/services/groups/group_links/destroy_service_spec.rb +++ b/spec/services/groups/group_links/destroy_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Groups::GroupLinks::DestroyService, '#execute' do +RSpec.describe Groups::GroupLinks::DestroyService, '#execute', feature_category: :subgroups do let_it_be(:user) { create(:user) } let_it_be(:group) { create(:group, :private) } let_it_be(:shared_group) { create(:group, :private) } diff --git a/spec/services/groups/group_links/update_service_spec.rb b/spec/services/groups/group_links/update_service_spec.rb index 31446c8e4bf..f17d2f50a02 100644 --- a/spec/services/groups/group_links/update_service_spec.rb +++ b/spec/services/groups/group_links/update_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Groups::GroupLinks::UpdateService, '#execute' do +RSpec.describe Groups::GroupLinks::UpdateService, '#execute', feature_category: :subgroups do let(:user) { create(:user) } let_it_be(:group) { create(:group, :private) } @@ -18,7 +18,7 @@ RSpec.describe Groups::GroupLinks::UpdateService, '#execute' do expires_at: expiry_date } end - subject { described_class.new(link).execute(group_link_params) } + subject { described_class.new(link, user).execute(group_link_params) } before do group.add_developer(group_member_user) diff --git a/spec/services/groups/import_export/export_service_spec.rb b/spec/services/groups/import_export/export_service_spec.rb index ec42a728409..c44c2e3b911 100644 --- a/spec/services/groups/import_export/export_service_spec.rb +++ b/spec/services/groups/import_export/export_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Groups::ImportExport::ExportService do +RSpec.describe Groups::ImportExport::ExportService, feature_category: :importers do describe '#async_execute' do let(:user) { create(:user) } let(:group) { create(:group) } diff --git a/spec/services/groups/import_export/import_service_spec.rb b/spec/services/groups/import_export/import_service_spec.rb index 972b12d7ee5..75db6e26cbf 100644 --- a/spec/services/groups/import_export/import_service_spec.rb +++ b/spec/services/groups/import_export/import_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Groups::ImportExport::ImportService do +RSpec.describe Groups::ImportExport::ImportService, feature_category: :importers do describe '#async_execute' do let_it_be(:user) { create(:user) } let_it_be(:group) { create(:group) } diff --git a/spec/services/groups/merge_requests_count_service_spec.rb b/spec/services/groups/merge_requests_count_service_spec.rb index 8bd350d6f0e..32c4c618eda 100644 --- a/spec/services/groups/merge_requests_count_service_spec.rb +++ b/spec/services/groups/merge_requests_count_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Groups::MergeRequestsCountService, :use_clean_rails_memory_store_caching do +RSpec.describe Groups::MergeRequestsCountService, :use_clean_rails_memory_store_caching, feature_category: :subgroups do let_it_be(:user) { create(:user) } let_it_be(:group) { create(:group, :public) } let_it_be(:project) { create(:project, :repository, namespace: group) } diff --git a/spec/services/groups/nested_create_service_spec.rb b/spec/services/groups/nested_create_service_spec.rb index a43c1d8d9c3..476bc2aa23c 100644 --- a/spec/services/groups/nested_create_service_spec.rb +++ b/spec/services/groups/nested_create_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Groups::NestedCreateService do +RSpec.describe Groups::NestedCreateService, feature_category: :subgroups do let(:user) { create(:user) } subject(:service) { described_class.new(user, params) } diff --git a/spec/services/groups/open_issues_count_service_spec.rb b/spec/services/groups/open_issues_count_service_spec.rb index 923caa6c150..725b913bf15 100644 --- a/spec/services/groups/open_issues_count_service_spec.rb +++ b/spec/services/groups/open_issues_count_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Groups::OpenIssuesCountService, :use_clean_rails_memory_store_caching do +RSpec.describe Groups::OpenIssuesCountService, :use_clean_rails_memory_store_caching, feature_category: :subgroups do let_it_be(:group) { create(:group, :public) } let_it_be(:project) { create(:project, :public, namespace: group) } let_it_be(:user) { create(:user) } diff --git a/spec/services/groups/participants_service_spec.rb b/spec/services/groups/participants_service_spec.rb index 750aead277f..37966a523c2 100644 --- a/spec/services/groups/participants_service_spec.rb +++ b/spec/services/groups/participants_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Groups::ParticipantsService do +RSpec.describe Groups::ParticipantsService, feature_category: :subgroups do describe '#group_members' do let(:user) { create(:user) } let(:parent_group) { create(:group) } diff --git a/spec/services/groups/update_service_spec.rb b/spec/services/groups/update_service_spec.rb index c758d3d5477..6baa8e5d6b6 100644 --- a/spec/services/groups/update_service_spec.rb +++ b/spec/services/groups/update_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Groups::UpdateService do +RSpec.describe Groups::UpdateService, feature_category: :subgroups do let!(:user) { create(:user) } let!(:private_group) { create(:group, :private) } let!(:internal_group) { create(:group, :internal) } diff --git a/spec/services/groups/update_shared_runners_service_spec.rb b/spec/services/groups/update_shared_runners_service_spec.rb index a29f73a71c2..48c81f109aa 100644 --- a/spec/services/groups/update_shared_runners_service_spec.rb +++ b/spec/services/groups/update_shared_runners_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Groups::UpdateSharedRunnersService do +RSpec.describe Groups::UpdateSharedRunnersService, feature_category: :subgroups do let(:user) { create(:user) } let(:group) { create(:group) } let(:params) { {} } diff --git a/spec/services/groups/update_statistics_service_spec.rb b/spec/services/groups/update_statistics_service_spec.rb index 84b18b670a7..13a88839de0 100644 --- a/spec/services/groups/update_statistics_service_spec.rb +++ b/spec/services/groups/update_statistics_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Groups::UpdateStatisticsService do +RSpec.describe Groups::UpdateStatisticsService, feature_category: :subgroups do let_it_be(:group, reload: true) { create(:group) } let(:statistics) { %w(wiki_size) } diff --git a/spec/services/ide/base_config_service_spec.rb b/spec/services/ide/base_config_service_spec.rb index ee57f2c18ec..ac57a13d7fc 100644 --- a/spec/services/ide/base_config_service_spec.rb +++ b/spec/services/ide/base_config_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Ide::BaseConfigService do +RSpec.describe Ide::BaseConfigService, feature_category: :web_ide do let_it_be(:project) { create(:project, :repository) } let_it_be(:user) { create(:user) } diff --git a/spec/services/ide/schemas_config_service_spec.rb b/spec/services/ide/schemas_config_service_spec.rb index f277b8e9954..b6f229edc78 100644 --- a/spec/services/ide/schemas_config_service_spec.rb +++ b/spec/services/ide/schemas_config_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Ide::SchemasConfigService do +RSpec.describe Ide::SchemasConfigService, feature_category: :web_ide do let_it_be(:project) { create(:project, :repository) } let_it_be(:user) { create(:user) } diff --git a/spec/services/ide/terminal_config_service_spec.rb b/spec/services/ide/terminal_config_service_spec.rb index 73614f28b06..76c8d9f2e6f 100644 --- a/spec/services/ide/terminal_config_service_spec.rb +++ b/spec/services/ide/terminal_config_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Ide::TerminalConfigService do +RSpec.describe Ide::TerminalConfigService, feature_category: :web_ide do let_it_be(:project) { create(:project, :repository) } let_it_be(:user) { create(:user) } diff --git a/spec/services/import/bitbucket_server_service_spec.rb b/spec/services/import/bitbucket_server_service_spec.rb index 555812ca9cf..aea6c45b3a8 100644 --- a/spec/services/import/bitbucket_server_service_spec.rb +++ b/spec/services/import/bitbucket_server_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Import::BitbucketServerService do +RSpec.describe Import::BitbucketServerService, feature_category: :importers do let_it_be(:user) { create(:user) } let(:base_uri) { "https://test:7990" } diff --git a/spec/services/import/fogbugz_service_spec.rb b/spec/services/import/fogbugz_service_spec.rb index 027d0240a7a..6953213add7 100644 --- a/spec/services/import/fogbugz_service_spec.rb +++ b/spec/services/import/fogbugz_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Import::FogbugzService do +RSpec.describe Import::FogbugzService, feature_category: :importers do let_it_be(:user) { create(:user) } let(:base_uri) { "https://test:7990" } diff --git a/spec/services/import/github/cancel_project_import_service_spec.rb b/spec/services/import/github/cancel_project_import_service_spec.rb index 77b8771ee65..d8ea303fa50 100644 --- a/spec/services/import/github/cancel_project_import_service_spec.rb +++ b/spec/services/import/github/cancel_project_import_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Import::Github::CancelProjectImportService do +RSpec.describe Import::Github::CancelProjectImportService, feature_category: :importers do subject(:import_cancel) { described_class.new(project, project.owner) } let_it_be(:user) { create(:user) } @@ -14,6 +14,18 @@ RSpec.describe Import::Github::CancelProjectImportService do it 'update import state to be canceled' do expect(import_cancel.execute).to eq({ status: :success, project: project }) end + + it 'tracks canceled imports' do + metrics_double = instance_double('Gitlab::Import::Metrics') + + expect(Gitlab::Import::Metrics) + .to receive(:new) + .with(:github_importer, project) + .and_return(metrics_double) + expect(metrics_double).to receive(:track_canceled_import) + + import_cancel.execute + end end context 'when import is finished' do diff --git a/spec/services/import/github/notes/create_service_spec.rb b/spec/services/import/github/notes/create_service_spec.rb index 57699def848..37cb903b66e 100644 --- a/spec/services/import/github/notes/create_service_spec.rb +++ b/spec/services/import/github/notes/create_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Import::Github::Notes::CreateService do +RSpec.describe Import::Github::Notes::CreateService, feature_category: :importers do it 'does not support quick actions' do project = create(:project, :repository) user = create(:user) diff --git a/spec/services/import/github_service_spec.rb b/spec/services/import/github_service_spec.rb index 293e247c140..5d762568a62 100644 --- a/spec/services/import/github_service_spec.rb +++ b/spec/services/import/github_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Import::GithubService do +RSpec.describe Import::GithubService, feature_category: :importers do let_it_be(:user) { create(:user) } let_it_be(:token) { 'complex-token' } let_it_be(:access_params) { { github_access_token: 'github-complex-token' } } diff --git a/spec/services/import/gitlab_projects/create_project_service_spec.rb b/spec/services/import/gitlab_projects/create_project_service_spec.rb index 59c384bad3c..35378bcee92 100644 --- a/spec/services/import/gitlab_projects/create_project_service_spec.rb +++ b/spec/services/import/gitlab_projects/create_project_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe ::Import::GitlabProjects::CreateProjectService, :aggregate_failures do +RSpec.describe ::Import::GitlabProjects::CreateProjectService, :aggregate_failures, feature_category: :importers do let(:fake_file_acquisition_strategy) do Class.new do attr_reader :errors @@ -127,7 +127,7 @@ RSpec.describe ::Import::GitlabProjects::CreateProjectService, :aggregate_failur expect(response.payload).to eq(other_errors: []) end - context 'when the project contains multilple errors' do + context 'when the project contains multiple errors' do it 'fails to create a project' do params.merge!(name: '_ an invalid name _', path: '_ an invalid path _') @@ -137,10 +137,13 @@ RSpec.describe ::Import::GitlabProjects::CreateProjectService, :aggregate_failur expect(response).to be_error expect(response.http_status).to eq(:bad_request) - expect(response.message) - .to eq(%{Project namespace path can contain only letters, digits, '_', '-' and '.'. Cannot start with '-', end in '.git' or end in '.atom'}) + expect(response.message).to eq( + 'Project namespace path must not start or end with a special character and must not contain consecutive ' \ + 'special characters.' + ) expect(response.payload).to eq( other_errors: [ + %{Project namespace path can contain only letters, digits, '_', '-' and '.'. Cannot start with '-', end in '.git' or end in '.atom'}, %{Path can contain only letters, digits, '_', '-' and '.'. Cannot start with '-', end in '.git' or end in '.atom'}, %{Path must not start or end with a special character and must not contain consecutive special characters.} ]) diff --git a/spec/services/import/gitlab_projects/file_acquisition_strategies/file_upload_spec.rb b/spec/services/import/gitlab_projects/file_acquisition_strategies/file_upload_spec.rb index 3c788138157..3a94ed02dd5 100644 --- a/spec/services/import/gitlab_projects/file_acquisition_strategies/file_upload_spec.rb +++ b/spec/services/import/gitlab_projects/file_acquisition_strategies/file_upload_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe ::Import::GitlabProjects::FileAcquisitionStrategies::FileUpload, :aggregate_failures do +RSpec.describe ::Import::GitlabProjects::FileAcquisitionStrategies::FileUpload, :aggregate_failures, feature_category: :importers do let(:file) { UploadedFile.new(File.join('spec', 'features', 'projects', 'import_export', 'test_project_export.tar.gz')) } describe 'validation' do diff --git a/spec/services/import/gitlab_projects/file_acquisition_strategies/remote_file_s3_spec.rb b/spec/services/import/gitlab_projects/file_acquisition_strategies/remote_file_s3_spec.rb index d9042e95149..411e2ec5286 100644 --- a/spec/services/import/gitlab_projects/file_acquisition_strategies/remote_file_s3_spec.rb +++ b/spec/services/import/gitlab_projects/file_acquisition_strategies/remote_file_s3_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe ::Import::GitlabProjects::FileAcquisitionStrategies::RemoteFileS3, :aggregate_failures do +RSpec.describe ::Import::GitlabProjects::FileAcquisitionStrategies::RemoteFileS3, :aggregate_failures, feature_category: :importers do let(:region_name) { 'region_name' } let(:bucket_name) { 'bucket_name' } let(:file_key) { 'file_key' } diff --git a/spec/services/import/prepare_service_spec.rb b/spec/services/import/prepare_service_spec.rb index 0097198f7a9..fcb90575d96 100644 --- a/spec/services/import/prepare_service_spec.rb +++ b/spec/services/import/prepare_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Import::PrepareService do +RSpec.describe Import::PrepareService, feature_category: :importers do let_it_be(:project) { create(:project) } let_it_be(:user) { create(:user) } diff --git a/spec/services/import/validate_remote_git_endpoint_service_spec.rb b/spec/services/import/validate_remote_git_endpoint_service_spec.rb index 221ac2cd73a..1d2b3975832 100644 --- a/spec/services/import/validate_remote_git_endpoint_service_spec.rb +++ b/spec/services/import/validate_remote_git_endpoint_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Import::ValidateRemoteGitEndpointService do +RSpec.describe Import::ValidateRemoteGitEndpointService, feature_category: :importers do include StubRequests let_it_be(:base_url) { 'http://demo.host/path' } @@ -35,6 +35,28 @@ RSpec.describe Import::ValidateRemoteGitEndpointService do end end + context 'when uri is using an invalid protocol' do + subject { described_class.new(url: 'ssh://demo.host/repo') } + + it 'reports error when invalid URL is provided' do + result = subject.execute + + expect(result).to be_a(ServiceResponse) + expect(result.error?).to be(true) + end + end + + context 'when uri is invalid' do + subject { described_class.new(url: 'http:example.com') } + + it 'reports error when invalid URL is provided' do + result = subject.execute + + expect(result).to be_a(ServiceResponse) + expect(result.error?).to be(true) + end + end + context 'when receiving HTTP response' do subject { described_class.new(url: base_url) } diff --git a/spec/services/import_csv/base_service_spec.rb b/spec/services/import_csv/base_service_spec.rb index 0c0ed40ff4d..93fff0d546a 100644 --- a/spec/services/import_csv/base_service_spec.rb +++ b/spec/services/import_csv/base_service_spec.rb @@ -24,40 +24,65 @@ RSpec.describe ImportCsv::BaseService, feature_category: :importers do it_behaves_like 'abstract method', :validate_headers_presence!, "any" it_behaves_like 'abstract method', :create_object_class - describe '#detect_col_sep' do - context 'when header contains invalid separators' do - it 'raises error' do - header = 'Name&email' + context 'when given a class' do + let(:importer_klass) do + Class.new(described_class) do + def attributes_for(row) + { title: row[:title] } + end - expect { subject.send(:detect_col_sep, header) }.to raise_error(CSV::MalformedCSVError) - end - end + def validate_headers_presence!(headers) + raise CSV::MalformedCSVError.new("Missing required headers", 1) unless headers.present? + end - context 'when header is valid' do - shared_examples 'header with valid separators' do - let(:header) { "Name#{separator}email" } + def create_object_class + Class.new + end - it 'returns separator value' do - expect(subject.send(:detect_col_sep, header)).to eq(separator) + def email_results_to_user + # no-op end end + end - context 'with ; as separator' do - let(:separator) { ';' } + let(:service) do + uploader = FileUploader.new(project) + uploader.store!(file) - it_behaves_like 'header with valid separators' - end + importer_klass.new(user, project, uploader) + end + + subject { service.execute } + + it_behaves_like 'correctly handles invalid files' + + describe '#detect_col_sep' do + using RSpec::Parameterized::TableSyntax - context 'with \t as separator' do - let(:separator) { "\t" } + let(:file) { double } - it_behaves_like 'header with valid separators' + before do + allow(service).to receive_message_chain('csv_data.lines.first').and_return(header) end - context 'with , as separator' do - let(:separator) { ',' } + where(:sep_character, :valid) do + '&' | false + '?' | false + ';' | true + ',' | true + "\t" | true + end + + with_them do + let(:header) { "Name#{sep_character}email" } - it_behaves_like 'header with valid separators' + it 'responds appropriately' do + if valid + expect(service.send(:detect_col_sep)).to eq sep_character + else + expect { service.send(:detect_col_sep) }.to raise_error(CSV::MalformedCSVError) + end + end end end end diff --git a/spec/services/import_export_clean_up_service_spec.rb b/spec/services/import_export_clean_up_service_spec.rb index 2bcdfa6dd8f..7b638b4948b 100644 --- a/spec/services/import_export_clean_up_service_spec.rb +++ b/spec/services/import_export_clean_up_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe ImportExportCleanUpService do +RSpec.describe ImportExportCleanUpService, feature_category: :importers do describe '#execute' do let(:service) { described_class.new } diff --git a/spec/services/incident_management/incidents/create_service_spec.rb b/spec/services/incident_management/incidents/create_service_spec.rb index 7db762b9c5b..e6ded379434 100644 --- a/spec/services/incident_management/incidents/create_service_spec.rb +++ b/spec/services/incident_management/incidents/create_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe IncidentManagement::Incidents::CreateService do +RSpec.describe IncidentManagement::Incidents::CreateService, feature_category: :incident_management do let_it_be(:project) { create(:project) } let_it_be(:user) { User.alert_bot } diff --git a/spec/services/incident_management/issuable_escalation_statuses/after_update_service_spec.rb b/spec/services/incident_management/issuable_escalation_statuses/after_update_service_spec.rb index 4b0c8d9113c..9b1994af1bb 100644 --- a/spec/services/incident_management/issuable_escalation_statuses/after_update_service_spec.rb +++ b/spec/services/incident_management/issuable_escalation_statuses/after_update_service_spec.rb @@ -2,7 +2,8 @@ require 'spec_helper' -RSpec.describe IncidentManagement::IssuableEscalationStatuses::AfterUpdateService do +RSpec.describe IncidentManagement::IssuableEscalationStatuses::AfterUpdateService, + feature_category: :incident_management do let_it_be(:current_user) { create(:user) } let_it_be(:escalation_status, reload: true) { create(:incident_management_issuable_escalation_status, :triggered) } let_it_be(:issue, reload: true) { escalation_status.issue } diff --git a/spec/services/incident_management/issuable_escalation_statuses/build_service_spec.rb b/spec/services/incident_management/issuable_escalation_statuses/build_service_spec.rb index b5c5238d483..56a159f452c 100644 --- a/spec/services/incident_management/issuable_escalation_statuses/build_service_spec.rb +++ b/spec/services/incident_management/issuable_escalation_statuses/build_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe IncidentManagement::IssuableEscalationStatuses::BuildService do +RSpec.describe IncidentManagement::IssuableEscalationStatuses::BuildService, feature_category: :incident_management do let_it_be(:project) { create(:project) } let_it_be(:incident, reload: true) { create(:incident, project: project) } diff --git a/spec/services/incident_management/issuable_escalation_statuses/create_service_spec.rb b/spec/services/incident_management/issuable_escalation_statuses/create_service_spec.rb index b6ae03a19fe..e6c63d63123 100644 --- a/spec/services/incident_management/issuable_escalation_statuses/create_service_spec.rb +++ b/spec/services/incident_management/issuable_escalation_statuses/create_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe IncidentManagement::IssuableEscalationStatuses::CreateService do +RSpec.describe IncidentManagement::IssuableEscalationStatuses::CreateService, feature_category: :incident_management do let_it_be(:project) { create(:project) } let(:incident) { create(:incident, project: project) } diff --git a/spec/services/incident_management/issuable_escalation_statuses/prepare_update_service_spec.rb b/spec/services/incident_management/issuable_escalation_statuses/prepare_update_service_spec.rb index e8208c410d5..3f3174d0112 100644 --- a/spec/services/incident_management/issuable_escalation_statuses/prepare_update_service_spec.rb +++ b/spec/services/incident_management/issuable_escalation_statuses/prepare_update_service_spec.rb @@ -2,7 +2,8 @@ require 'spec_helper' -RSpec.describe IncidentManagement::IssuableEscalationStatuses::PrepareUpdateService, factory_default: :keep do +RSpec.describe IncidentManagement::IssuableEscalationStatuses::PrepareUpdateService, factory_default: :keep, + feature_category: :incident_management do let_it_be(:project) { create_default(:project) } let_it_be(:escalation_status) { create(:incident_management_issuable_escalation_status, :triggered) } let_it_be(:user_with_permissions) { create(:user) } diff --git a/spec/services/incident_management/pager_duty/create_incident_issue_service_spec.rb b/spec/services/incident_management/pager_duty/create_incident_issue_service_spec.rb index 2fda789cf56..caa5ee495b7 100644 --- a/spec/services/incident_management/pager_duty/create_incident_issue_service_spec.rb +++ b/spec/services/incident_management/pager_duty/create_incident_issue_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe IncidentManagement::PagerDuty::CreateIncidentIssueService do +RSpec.describe IncidentManagement::PagerDuty::CreateIncidentIssueService, feature_category: :incident_management do let_it_be(:project, reload: true) { create(:project) } let_it_be(:user) { User.alert_bot } diff --git a/spec/services/incident_management/pager_duty/process_webhook_service_spec.rb b/spec/services/incident_management/pager_duty/process_webhook_service_spec.rb index e2aba0b61af..06f423bc63c 100644 --- a/spec/services/incident_management/pager_duty/process_webhook_service_spec.rb +++ b/spec/services/incident_management/pager_duty/process_webhook_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe IncidentManagement::PagerDuty::ProcessWebhookService do +RSpec.describe IncidentManagement::PagerDuty::ProcessWebhookService, feature_category: :incident_management do let_it_be(:project, reload: true) { create(:project) } describe '#execute' do diff --git a/spec/services/incident_management/timeline_event_tags/create_service_spec.rb b/spec/services/incident_management/timeline_event_tags/create_service_spec.rb index c1b993ce3d9..b21a116d5f9 100644 --- a/spec/services/incident_management/timeline_event_tags/create_service_spec.rb +++ b/spec/services/incident_management/timeline_event_tags/create_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe IncidentManagement::TimelineEventTags::CreateService do +RSpec.describe IncidentManagement::TimelineEventTags::CreateService, feature_category: :incident_management do let_it_be(:user_with_permissions) { create(:user) } let_it_be(:user_without_permissions) { create(:user) } let_it_be_with_reload(:project) { create(:project) } diff --git a/spec/services/incident_management/timeline_events/create_service_spec.rb b/spec/services/incident_management/timeline_events/create_service_spec.rb index fa5f4c64a43..fff6241f083 100644 --- a/spec/services/incident_management/timeline_events/create_service_spec.rb +++ b/spec/services/incident_management/timeline_events/create_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe IncidentManagement::TimelineEvents::CreateService do +RSpec.describe IncidentManagement::TimelineEvents::CreateService, feature_category: :incident_management do let_it_be(:user_with_permissions) { create(:user) } let_it_be(:user_without_permissions) { create(:user) } let_it_be(:project) { create(:project) } @@ -57,7 +57,6 @@ RSpec.describe IncidentManagement::TimelineEvents::CreateService do it_behaves_like 'an incident management tracked event', :incident_management_timeline_event_created it_behaves_like 'Snowplow event tracking with RedisHLL context' do - let(:feature_flag_name) { :route_hll_to_snowplow_phase2 } let(:namespace) { project.namespace.reload } let(:category) { described_class.to_s } let(:user) { current_user } @@ -286,7 +285,6 @@ RSpec.describe IncidentManagement::TimelineEvents::CreateService do it_behaves_like 'an incident management tracked event', :incident_management_timeline_event_created it_behaves_like 'Snowplow event tracking with RedisHLL context' do - let(:feature_flag_name) { :route_hll_to_snowplow_phase2 } let(:namespace) { project.namespace.reload } let(:category) { described_class.to_s } let(:user) { current_user } diff --git a/spec/services/incident_management/timeline_events/destroy_service_spec.rb b/spec/services/incident_management/timeline_events/destroy_service_spec.rb index f90ff72a2bf..78f6659beec 100644 --- a/spec/services/incident_management/timeline_events/destroy_service_spec.rb +++ b/spec/services/incident_management/timeline_events/destroy_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe IncidentManagement::TimelineEvents::DestroyService do +RSpec.describe IncidentManagement::TimelineEvents::DestroyService, feature_category: :incident_management do let_it_be(:user_with_permissions) { create(:user) } let_it_be(:user_without_permissions) { create(:user) } let_it_be(:project) { create(:project) } @@ -67,7 +67,6 @@ RSpec.describe IncidentManagement::TimelineEvents::DestroyService do it_behaves_like 'an incident management tracked event', :incident_management_timeline_event_deleted it_behaves_like 'Snowplow event tracking with RedisHLL context' do - let(:feature_flag_name) { :route_hll_to_snowplow_phase2 } let(:namespace) { project.namespace.reload } let(:category) { described_class.to_s } let(:user) { current_user } diff --git a/spec/services/incident_management/timeline_events/update_service_spec.rb b/spec/services/incident_management/timeline_events/update_service_spec.rb index ebaa4dde7a2..c38126baa65 100644 --- a/spec/services/incident_management/timeline_events/update_service_spec.rb +++ b/spec/services/incident_management/timeline_events/update_service_spec.rb @@ -50,7 +50,6 @@ RSpec.describe IncidentManagement::TimelineEvents::UpdateService, feature_catego it_behaves_like 'an incident management tracked event', :incident_management_timeline_event_edited it_behaves_like 'Snowplow event tracking with RedisHLL context' do - let(:feature_flag_name) { :route_hll_to_snowplow_phase2 } let(:namespace) { project.namespace.reload } let(:category) { described_class.to_s } let(:action) { 'incident_management_timeline_event_edited' } diff --git a/spec/services/integrations/propagate_service_spec.rb b/spec/services/integrations/propagate_service_spec.rb index c971c4a0ad0..0267b1b0ed0 100644 --- a/spec/services/integrations/propagate_service_spec.rb +++ b/spec/services/integrations/propagate_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Integrations::PropagateService do +RSpec.describe Integrations::PropagateService, feature_category: :integrations do describe '.propagate' do include JiraIntegrationHelpers diff --git a/spec/services/integrations/test/project_service_spec.rb b/spec/services/integrations/test/project_service_spec.rb index 74833686283..4f8f932fb45 100644 --- a/spec/services/integrations/test/project_service_spec.rb +++ b/spec/services/integrations/test/project_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Integrations::Test::ProjectService do +RSpec.describe Integrations::Test::ProjectService, feature_category: :integrations do include AfterNextHelpers describe '#execute' do diff --git a/spec/services/issuable/bulk_update_service_spec.rb b/spec/services/issuable/bulk_update_service_spec.rb index 7ba349ceeae..a76d575a1e0 100644 --- a/spec/services/issuable/bulk_update_service_spec.rb +++ b/spec/services/issuable/bulk_update_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Issuable::BulkUpdateService do +RSpec.describe Issuable::BulkUpdateService, feature_category: :team_planning do let_it_be(:user) { create(:user) } let_it_be(:project) { create(:project, :repository, namespace: user.namespace) } diff --git a/spec/services/issuable/common_system_notes_service_spec.rb b/spec/services/issuable/common_system_notes_service_spec.rb index 0d2b8a4ac3c..9306aeaac44 100644 --- a/spec/services/issuable/common_system_notes_service_spec.rb +++ b/spec/services/issuable/common_system_notes_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Issuable::CommonSystemNotesService do +RSpec.describe Issuable::CommonSystemNotesService, feature_category: :team_planning do let_it_be(:project) { create(:project) } let_it_be(:user) { create(:user) } diff --git a/spec/services/issuable/destroy_label_links_service_spec.rb b/spec/services/issuable/destroy_label_links_service_spec.rb index bbc69e266c9..f0a92c201d2 100644 --- a/spec/services/issuable/destroy_label_links_service_spec.rb +++ b/spec/services/issuable/destroy_label_links_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Issuable::DestroyLabelLinksService do +RSpec.describe Issuable::DestroyLabelLinksService, feature_category: :team_planning do describe '#execute' do context 'when target is an Issue' do let_it_be(:target) { create(:issue) } diff --git a/spec/services/issuable/destroy_service_spec.rb b/spec/services/issuable/destroy_service_spec.rb index 29f548e1c47..1acaf01dce0 100644 --- a/spec/services/issuable/destroy_service_spec.rb +++ b/spec/services/issuable/destroy_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Issuable::DestroyService do +RSpec.describe Issuable::DestroyService, feature_category: :team_planning do let(:user) { create(:user) } let(:group) { create(:group, :public) } let(:project) { create(:project, :public, group: group) } diff --git a/spec/services/issuable/discussions_list_service_spec.rb b/spec/services/issuable/discussions_list_service_spec.rb index a6f57088ad1..03b6a1b4556 100644 --- a/spec/services/issuable/discussions_list_service_spec.rb +++ b/spec/services/issuable/discussions_list_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Issuable::DiscussionsListService do +RSpec.describe Issuable::DiscussionsListService, feature_category: :team_planning do let_it_be(:current_user) { create(:user) } let_it_be(:group) { create(:group, :private) } let_it_be(:project) { create(:project, :repository, :private, group: group) } diff --git a/spec/services/issuable/process_assignees_spec.rb b/spec/services/issuable/process_assignees_spec.rb index 9e909b68172..2c8d4c5e11d 100644 --- a/spec/services/issuable/process_assignees_spec.rb +++ b/spec/services/issuable/process_assignees_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Issuable::ProcessAssignees do +RSpec.describe Issuable::ProcessAssignees, feature_category: :team_planning do describe '#execute' do it 'returns assignee_ids when add_assignee_ids and remove_assignee_ids are not specified' do process = Issuable::ProcessAssignees.new(assignee_ids: %w(5 7 9), diff --git a/spec/services/issue_links/create_service_spec.rb b/spec/services/issue_links/create_service_spec.rb index 0629b8b091b..71603da1c90 100644 --- a/spec/services/issue_links/create_service_spec.rb +++ b/spec/services/issue_links/create_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe IssueLinks::CreateService do +RSpec.describe IssueLinks::CreateService, feature_category: :team_planning do describe '#execute' do let_it_be(:user) { create :user } let_it_be(:namespace) { create :namespace } @@ -43,7 +43,6 @@ RSpec.describe IssueLinks::CreateService do end it_behaves_like 'Snowplow event tracking with RedisHLL context' do - let(:feature_flag_name) { :route_hll_to_snowplow_phase2 } let(:namespace) { issue.namespace } let(:category) { described_class.to_s } let(:action) { 'incident_management_incident_relate' } diff --git a/spec/services/issue_links/destroy_service_spec.rb b/spec/services/issue_links/destroy_service_spec.rb index ecb53b5cd31..5c4814f5ad1 100644 --- a/spec/services/issue_links/destroy_service_spec.rb +++ b/spec/services/issue_links/destroy_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe IssueLinks::DestroyService do +RSpec.describe IssueLinks::DestroyService, feature_category: :team_planning do describe '#execute' do let_it_be(:project) { create(:project_empty_repo, :private) } let_it_be(:user) { create(:user) } @@ -27,7 +27,6 @@ RSpec.describe IssueLinks::DestroyService do end it_behaves_like 'Snowplow event tracking with RedisHLL context' do - let(:feature_flag_name) { :route_hll_to_snowplow_phase2 } let(:namespace) { issue_b.namespace } let(:category) { described_class.to_s } let(:action) { 'incident_management_incident_unrelate' } diff --git a/spec/services/issue_links/list_service_spec.rb b/spec/services/issue_links/list_service_spec.rb index 7a3ba845c7c..bfb6127ed56 100644 --- a/spec/services/issue_links/list_service_spec.rb +++ b/spec/services/issue_links/list_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe IssueLinks::ListService do +RSpec.describe IssueLinks::ListService, feature_category: :team_planning do let(:user) { create :user } let(:project) { create(:project_empty_repo, :private) } let(:issue) { create :issue, project: project } diff --git a/spec/services/issues/after_create_service_spec.rb b/spec/services/issues/after_create_service_spec.rb index 39a6799dbad..594caed23d7 100644 --- a/spec/services/issues/after_create_service_spec.rb +++ b/spec/services/issues/after_create_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Issues::AfterCreateService do +RSpec.describe Issues::AfterCreateService, feature_category: :team_planning do include AfterNextHelpers let_it_be(:project) { create(:project) } diff --git a/spec/services/issues/base_service_spec.rb b/spec/services/issues/base_service_spec.rb new file mode 100644 index 00000000000..94165d557d8 --- /dev/null +++ b/spec/services/issues/base_service_spec.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe Issues::BaseService, feature_category: :team_planning do + describe '#constructor_container_arg' do + it { expect(described_class.constructor_container_arg("some-value")).to eq({ container: "some-value" }) } + end +end diff --git a/spec/services/issues/build_service_spec.rb b/spec/services/issues/build_service_spec.rb index 2160c45d079..0f89a746520 100644 --- a/spec/services/issues/build_service_spec.rb +++ b/spec/services/issues/build_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Issues::BuildService do +RSpec.describe Issues::BuildService, feature_category: :team_planning do using RSpec::Parameterized::TableSyntax let_it_be(:project) { create(:project, :repository) } diff --git a/spec/services/issues/clone_service_spec.rb b/spec/services/issues/clone_service_spec.rb index eafaea93015..2fb14d8ce8e 100644 --- a/spec/services/issues/clone_service_spec.rb +++ b/spec/services/issues/clone_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Issues::CloneService do +RSpec.describe Issues::CloneService, feature_category: :team_planning do include DesignManagementTestHelpers let_it_be(:user) { create(:user) } diff --git a/spec/services/issues/close_service_spec.rb b/spec/services/issues/close_service_spec.rb index 803808e667c..0d9b3306540 100644 --- a/spec/services/issues/close_service_spec.rb +++ b/spec/services/issues/close_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Issues::CloseService do +RSpec.describe Issues::CloseService, feature_category: :team_planning do let(:project) { create(:project, :repository) } let(:user) { create(:user, email: "user@example.com") } let(:user2) { create(:user, email: "user2@example.com") } @@ -100,7 +100,6 @@ RSpec.describe Issues::CloseService do it_behaves_like 'an incident management tracked event', :incident_management_incident_closed it_behaves_like 'Snowplow event tracking with RedisHLL context' do - let(:feature_flag_name) { :route_hll_to_snowplow_phase2 } let(:namespace) { issue.namespace } let(:category) { described_class.to_s } let(:action) { 'incident_management_incident_closed' } diff --git a/spec/services/issues/create_service_spec.rb b/spec/services/issues/create_service_spec.rb index ada5b300d7a..d5d88baca1f 100644 --- a/spec/services/issues/create_service_spec.rb +++ b/spec/services/issues/create_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Issues::CreateService do +RSpec.describe Issues::CreateService, feature_category: :team_planning do include AfterNextHelpers let_it_be(:group) { create(:group, :crm_enabled) } diff --git a/spec/services/issues/duplicate_service_spec.rb b/spec/services/issues/duplicate_service_spec.rb index f49bce70cd0..f9d8bf04ae9 100644 --- a/spec/services/issues/duplicate_service_spec.rb +++ b/spec/services/issues/duplicate_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Issues::DuplicateService do +RSpec.describe Issues::DuplicateService, feature_category: :team_planning do let(:user) { create(:user) } let(:canonical_project) { create(:project) } let(:duplicate_project) { create(:project) } diff --git a/spec/services/issues/import_csv_service_spec.rb b/spec/services/issues/import_csv_service_spec.rb index 90e360f9cf1..6a147782209 100644 --- a/spec/services/issues/import_csv_service_spec.rb +++ b/spec/services/issues/import_csv_service_spec.rb @@ -6,6 +6,7 @@ RSpec.describe Issues::ImportCsvService, feature_category: :team_planning do let(:project) { create(:project) } let(:user) { create(:user) } let(:assignee) { create(:user, username: 'csv_assignee') } + let(:file) { fixture_file_upload('spec/fixtures/csv_complex.csv') } let(:service) do uploader = FileUploader.new(project) uploader.store!(file) @@ -19,8 +20,6 @@ RSpec.describe Issues::ImportCsvService, feature_category: :team_planning do end describe '#execute' do - let(:file) { fixture_file_upload('spec/fixtures/csv_complex.csv') } - subject { service.execute } it 'sets all issueable attributes and executes quick actions' do diff --git a/spec/services/issues/issuable_base_service_spec.rb b/spec/services/issues/issuable_base_service_spec.rb new file mode 100644 index 00000000000..e1680d5c908 --- /dev/null +++ b/spec/services/issues/issuable_base_service_spec.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe IssuableBaseService, feature_category: :team_planning do + describe '#constructor_container_arg' do + it { expect(described_class.constructor_container_arg("some-value")).to eq({ container: "some-value" }) } + end +end diff --git a/spec/services/issues/prepare_import_csv_service_spec.rb b/spec/services/issues/prepare_import_csv_service_spec.rb index ded23ee43b9..d318d4fd25e 100644 --- a/spec/services/issues/prepare_import_csv_service_spec.rb +++ b/spec/services/issues/prepare_import_csv_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Issues::PrepareImportCsvService do +RSpec.describe Issues::PrepareImportCsvService, feature_category: :team_planning do let_it_be(:project) { create(:project) } let_it_be(:user) { create(:user) } diff --git a/spec/services/issues/referenced_merge_requests_service_spec.rb b/spec/services/issues/referenced_merge_requests_service_spec.rb index aee3583b834..4781daf7688 100644 --- a/spec/services/issues/referenced_merge_requests_service_spec.rb +++ b/spec/services/issues/referenced_merge_requests_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Issues::ReferencedMergeRequestsService do +RSpec.describe Issues::ReferencedMergeRequestsService, feature_category: :team_planning do def create_referencing_mr(attributes = {}) create(:merge_request, attributes).tap do |merge_request| create(:note, :system, project: project, noteable: issue, author: user, note: merge_request.to_reference(full: true)) diff --git a/spec/services/issues/related_branches_service_spec.rb b/spec/services/issues/related_branches_service_spec.rb index 05c61d0abfc..940d988668e 100644 --- a/spec/services/issues/related_branches_service_spec.rb +++ b/spec/services/issues/related_branches_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Issues::RelatedBranchesService do +RSpec.describe Issues::RelatedBranchesService, feature_category: :team_planning do let_it_be(:project) { create(:project, :repository, :public, public_builds: false) } let_it_be(:developer) { create(:user) } let_it_be(:issue) { create(:issue, project: project) } diff --git a/spec/services/issues/relative_position_rebalancing_service_spec.rb b/spec/services/issues/relative_position_rebalancing_service_spec.rb index 27c0394ac8b..68f1af49b5f 100644 --- a/spec/services/issues/relative_position_rebalancing_service_spec.rb +++ b/spec/services/issues/relative_position_rebalancing_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Issues::RelativePositionRebalancingService, :clean_gitlab_redis_shared_state do +RSpec.describe Issues::RelativePositionRebalancingService, :clean_gitlab_redis_shared_state, feature_category: :team_planning do let_it_be(:project, reload: true) { create(:project, :repository_disabled, skip_disk_validation: true) } let_it_be(:user) { project.creator } let_it_be(:start) { RelativePositioning::START_POSITION } diff --git a/spec/services/issues/reopen_service_spec.rb b/spec/services/issues/reopen_service_spec.rb index 68015a2327e..0f89844a2c1 100644 --- a/spec/services/issues/reopen_service_spec.rb +++ b/spec/services/issues/reopen_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Issues::ReopenService do +RSpec.describe Issues::ReopenService, feature_category: :team_planning do let(:project) { create(:project) } let(:issue) { create(:issue, :closed, project: project) } @@ -75,7 +75,6 @@ RSpec.describe Issues::ReopenService do it_behaves_like 'an incident management tracked event', :incident_management_incident_reopened it_behaves_like 'Snowplow event tracking with RedisHLL context' do - let(:feature_flag_name) { :route_hll_to_snowplow_phase2 } let(:namespace) { issue.namespace } let(:category) { described_class.to_s } let(:action) { 'incident_management_incident_reopened' } diff --git a/spec/services/issues/reorder_service_spec.rb b/spec/services/issues/reorder_service_spec.rb index 430a9e9f526..b98d23e0f7f 100644 --- a/spec/services/issues/reorder_service_spec.rb +++ b/spec/services/issues/reorder_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Issues::ReorderService do +RSpec.describe Issues::ReorderService, feature_category: :team_planning do let_it_be(:user) { create_default(:user) } let_it_be(:group) { create(:group) } let_it_be(:project, reload: true) { create(:project, namespace: group) } diff --git a/spec/services/issues/resolve_discussions_spec.rb b/spec/services/issues/resolve_discussions_spec.rb index 1ac71b966bc..c2111bffdda 100644 --- a/spec/services/issues/resolve_discussions_spec.rb +++ b/spec/services/issues/resolve_discussions_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Issues::ResolveDiscussions do +RSpec.describe Issues::ResolveDiscussions, feature_category: :team_planning do let(:project) { create(:project, :repository) } let(:user) { create(:user) } @@ -11,7 +11,7 @@ RSpec.describe Issues::ResolveDiscussions do DummyService.class_eval do include ::Issues::ResolveDiscussions - def initialize(project:, current_user: nil, params: {}) + def initialize(container:, current_user: nil, params: {}) super filter_resolve_discussion_params end @@ -26,7 +26,7 @@ RSpec.describe Issues::ResolveDiscussions do let(:other_merge_request) { create(:merge_request, source_project: project, source_branch: "fix") } describe "#merge_request_for_resolving_discussion" do - let(:service) { DummyService.new(project: project, current_user: user, params: { merge_request_to_resolve_discussions_of: merge_request.iid }) } + let(:service) { DummyService.new(container: project, current_user: user, params: { merge_request_to_resolve_discussions_of: merge_request.iid }) } it "finds the merge request" do expect(service.merge_request_to_resolve_discussions_of).to eq(merge_request) @@ -45,7 +45,7 @@ RSpec.describe Issues::ResolveDiscussions do describe "#discussions_to_resolve" do it "contains a single discussion when matching merge request and discussion are passed" do service = DummyService.new( - project: project, + container: project, current_user: user, params: { discussion_to_resolve: discussion.id, @@ -65,7 +65,7 @@ RSpec.describe Issues::ResolveDiscussions do project: merge_request.target_project, line_number: 15)]) service = DummyService.new( - project: project, + container: project, current_user: user, params: { merge_request_to_resolve_discussions_of: merge_request.iid } ) @@ -83,7 +83,7 @@ RSpec.describe Issues::ResolveDiscussions do line_number: 15 )]) service = DummyService.new( - project: project, + container: project, current_user: user, params: { merge_request_to_resolve_discussions_of: merge_request.iid } ) @@ -96,7 +96,7 @@ RSpec.describe Issues::ResolveDiscussions do it "is empty when a discussion and another merge request are passed" do service = DummyService.new( - project: project, + container: project, current_user: user, params: { discussion_to_resolve: discussion.id, diff --git a/spec/services/issues/set_crm_contacts_service_spec.rb b/spec/services/issues/set_crm_contacts_service_spec.rb index 5613cc49cc5..aa5dec20a13 100644 --- a/spec/services/issues/set_crm_contacts_service_spec.rb +++ b/spec/services/issues/set_crm_contacts_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Issues::SetCrmContactsService do +RSpec.describe Issues::SetCrmContactsService, feature_category: :team_planning do let_it_be(:user) { create(:user) } let_it_be(:group) { create(:group, :crm_enabled) } let_it_be(:project) { create(:project, group: create(:group, :crm_enabled, parent: group)) } diff --git a/spec/services/issues/update_service_spec.rb b/spec/services/issues/update_service_spec.rb index 973025bd2e3..9c81015e05e 100644 --- a/spec/services/issues/update_service_spec.rb +++ b/spec/services/issues/update_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Issues::UpdateService, :mailer do +RSpec.describe Issues::UpdateService, :mailer, feature_category: :team_planning do let_it_be(:user) { create(:user) } let_it_be(:user2) { create(:user) } let_it_be(:user3) { create(:user) } @@ -191,7 +191,6 @@ RSpec.describe Issues::UpdateService, :mailer do it_behaves_like 'an incident management tracked event', :incident_management_incident_change_confidential it_behaves_like 'Snowplow event tracking with RedisHLL context' do - let(:feature_flag_name) { :route_hll_to_snowplow_phase2 } let(:namespace) { issue.namespace } let(:category) { described_class.to_s } let(:label) { 'redis_hll_counters.incident_management.incident_management_total_unique_counts_monthly' } @@ -696,7 +695,6 @@ RSpec.describe Issues::UpdateService, :mailer do it_behaves_like 'an incident management tracked event', :incident_management_incident_assigned it_behaves_like 'Snowplow event tracking with RedisHLL context' do - let(:feature_flag_name) { :route_hll_to_snowplow_phase2 } let(:namespace) { issue.namespace } let(:category) { described_class.to_s } let(:label) { 'redis_hll_counters.incident_management.incident_management_total_unique_counts_monthly' } diff --git a/spec/services/issues/zoom_link_service_spec.rb b/spec/services/issues/zoom_link_service_spec.rb index 230e4c1b5e1..f2a81cbe33f 100644 --- a/spec/services/issues/zoom_link_service_spec.rb +++ b/spec/services/issues/zoom_link_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Issues::ZoomLinkService do +RSpec.describe Issues::ZoomLinkService, feature_category: :team_planning do let_it_be(:user) { create(:user) } let_it_be(:issue) { create(:issue) } @@ -97,7 +97,6 @@ RSpec.describe Issues::ZoomLinkService do it_behaves_like 'an incident management tracked event', :incident_management_incident_zoom_meeting it_behaves_like 'Snowplow event tracking with RedisHLL context' do - let(:feature_flag_name) { :route_hll_to_snowplow_phase2 } let(:namespace) { issue.namespace } let(:category) { described_class.to_s } let(:action) { 'incident_management_incident_zoom_meeting' } diff --git a/spec/services/jira/requests/projects/list_service_spec.rb b/spec/services/jira/requests/projects/list_service_spec.rb index 78ee9cb9698..37e9f66d273 100644 --- a/spec/services/jira/requests/projects/list_service_spec.rb +++ b/spec/services/jira/requests/projects/list_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Jira::Requests::Projects::ListService do +RSpec.describe Jira::Requests::Projects::ListService, feature_category: :projects do include AfterNextHelpers let(:jira_integration) { create(:jira_integration) } diff --git a/spec/services/jira_connect/sync_service_spec.rb b/spec/services/jira_connect/sync_service_spec.rb index 32580a7735f..fc1b4e997a5 100644 --- a/spec/services/jira_connect/sync_service_spec.rb +++ b/spec/services/jira_connect/sync_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe JiraConnect::SyncService do +RSpec.describe JiraConnect::SyncService, feature_category: :integrations do include AfterNextHelpers describe '#execute' do diff --git a/spec/services/jira_connect_installations/destroy_service_spec.rb b/spec/services/jira_connect_installations/destroy_service_spec.rb index bb5bab53ccb..b8b59d6cc57 100644 --- a/spec/services/jira_connect_installations/destroy_service_spec.rb +++ b/spec/services/jira_connect_installations/destroy_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe JiraConnectInstallations::DestroyService do +RSpec.describe JiraConnectInstallations::DestroyService, feature_category: :integrations do describe '.execute' do it 'creates an instance and calls execute' do expect_next_instance_of(described_class, 'param1', 'param2', 'param3') do |destroy_service| diff --git a/spec/services/jira_connect_installations/proxy_lifecycle_event_service_spec.rb b/spec/services/jira_connect_installations/proxy_lifecycle_event_service_spec.rb index c621388a734..3c144de2208 100644 --- a/spec/services/jira_connect_installations/proxy_lifecycle_event_service_spec.rb +++ b/spec/services/jira_connect_installations/proxy_lifecycle_event_service_spec.rb @@ -94,9 +94,9 @@ RSpec.describe JiraConnectInstallations::ProxyLifecycleEventService, feature_cat expect(Gitlab::IntegrationsLogger).to receive(:info).with( integration: 'JiraConnect', message: 'Proxy lifecycle event received error response', - event_type: evnet_type, - status_code: 422, - body: 'Error message' + jira_event_type: evnet_type, + jira_status_code: 422, + jira_body: 'Error message' ) execute_service diff --git a/spec/services/jira_connect_subscriptions/create_service_spec.rb b/spec/services/jira_connect_subscriptions/create_service_spec.rb index 85208a30c30..f9d3954b84c 100644 --- a/spec/services/jira_connect_subscriptions/create_service_spec.rb +++ b/spec/services/jira_connect_subscriptions/create_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe JiraConnectSubscriptions::CreateService do +RSpec.describe JiraConnectSubscriptions::CreateService, feature_category: :integrations do let_it_be(:installation) { create(:jira_connect_installation) } let_it_be(:current_user) { create(:user) } let_it_be(:group) { create(:group) } diff --git a/spec/services/jira_import/cloud_users_mapper_service_spec.rb b/spec/services/jira_import/cloud_users_mapper_service_spec.rb index 6b06a982a80..e3f3d550467 100644 --- a/spec/services/jira_import/cloud_users_mapper_service_spec.rb +++ b/spec/services/jira_import/cloud_users_mapper_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe JiraImport::CloudUsersMapperService do +RSpec.describe JiraImport::CloudUsersMapperService, feature_category: :integrations do let(:start_at) { 7 } let(:url) { "/rest/api/2/users?maxResults=50&startAt=#{start_at}" } diff --git a/spec/services/jira_import/server_users_mapper_service_spec.rb b/spec/services/jira_import/server_users_mapper_service_spec.rb index 71cb8aea0be..e2304953dd2 100644 --- a/spec/services/jira_import/server_users_mapper_service_spec.rb +++ b/spec/services/jira_import/server_users_mapper_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe JiraImport::ServerUsersMapperService do +RSpec.describe JiraImport::ServerUsersMapperService, feature_category: :integrations do let(:start_at) { 7 } let(:url) { "/rest/api/2/user/search?username=''&maxResults=50&startAt=#{start_at}" } diff --git a/spec/services/jira_import/start_import_service_spec.rb b/spec/services/jira_import/start_import_service_spec.rb index c0db3012a30..9cb163e3d1a 100644 --- a/spec/services/jira_import/start_import_service_spec.rb +++ b/spec/services/jira_import/start_import_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe JiraImport::StartImportService do +RSpec.describe JiraImport::StartImportService, feature_category: :integrations do include JiraIntegrationHelpers let_it_be(:user) { create(:user) } diff --git a/spec/services/jira_import/users_importer_spec.rb b/spec/services/jira_import/users_importer_spec.rb index ace9e0d5779..39f8475754a 100644 --- a/spec/services/jira_import/users_importer_spec.rb +++ b/spec/services/jira_import/users_importer_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe JiraImport::UsersImporter do +RSpec.describe JiraImport::UsersImporter, feature_category: :integrations do include JiraIntegrationHelpers let_it_be(:user) { create(:user) } diff --git a/spec/services/keys/create_service_spec.rb b/spec/services/keys/create_service_spec.rb index 1dbe383ad8e..0a9fe2f5856 100644 --- a/spec/services/keys/create_service_spec.rb +++ b/spec/services/keys/create_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Keys::CreateService do +RSpec.describe Keys::CreateService, feature_category: :source_code_management do let(:user) { create(:user) } let(:params) { attributes_for(:key) } diff --git a/spec/services/keys/destroy_service_spec.rb b/spec/services/keys/destroy_service_spec.rb index dd40f9d73fd..9f064cb7236 100644 --- a/spec/services/keys/destroy_service_spec.rb +++ b/spec/services/keys/destroy_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Keys::DestroyService do +RSpec.describe Keys::DestroyService, feature_category: :source_code_management do let(:user) { create(:user) } subject { described_class.new(user) } diff --git a/spec/services/keys/expiry_notification_service_spec.rb b/spec/services/keys/expiry_notification_service_spec.rb index 7cb6cbce311..b8db4f28df7 100644 --- a/spec/services/keys/expiry_notification_service_spec.rb +++ b/spec/services/keys/expiry_notification_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Keys::ExpiryNotificationService do +RSpec.describe Keys::ExpiryNotificationService, feature_category: :source_code_management do let_it_be_with_reload(:user) { create(:user) } let(:params) { { keys: user.keys, expiring_soon: expiring_soon } } diff --git a/spec/services/keys/last_used_service_spec.rb b/spec/services/keys/last_used_service_spec.rb index a2cd5ffdd38..3113fe27acf 100644 --- a/spec/services/keys/last_used_service_spec.rb +++ b/spec/services/keys/last_used_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Keys::LastUsedService do +RSpec.describe Keys::LastUsedService, feature_category: :source_code_management do describe '#execute', :clean_gitlab_redis_shared_state do it 'updates the key when it has not been used recently' do key = create(:key, last_used_at: 1.year.ago) diff --git a/spec/services/keys/revoke_service_spec.rb b/spec/services/keys/revoke_service_spec.rb index ec07701b4b7..8294ec5bbd1 100644 --- a/spec/services/keys/revoke_service_spec.rb +++ b/spec/services/keys/revoke_service_spec.rb @@ -32,17 +32,4 @@ RSpec.describe Keys::RevokeService, feature_category: :source_code_management do expect { service.execute(key) }.not_to change { signature.reload.verification_status } expect(key).to be_persisted end - - context 'when revoke_ssh_signatures disabled' do - before do - stub_feature_flags(revoke_ssh_signatures: false) - end - - it 'does not unverifies signatures' do - key = create(:key) - signature = create(:ssh_signature, key: key) - - expect { service.execute(key) }.not_to change { signature.reload.verification_status } - end - end end diff --git a/spec/services/labels/available_labels_service_spec.rb b/spec/services/labels/available_labels_service_spec.rb index 355dbd0c712..51314c2c226 100644 --- a/spec/services/labels/available_labels_service_spec.rb +++ b/spec/services/labels/available_labels_service_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -RSpec.describe Labels::AvailableLabelsService do +RSpec.describe Labels::AvailableLabelsService, feature_category: :team_planning do let(:user) { create(:user) } let(:project) { create(:project, :public, group: group) } let(:group) { create(:group) } diff --git a/spec/services/labels/create_service_spec.rb b/spec/services/labels/create_service_spec.rb index 02dec8ae690..9be611490cf 100644 --- a/spec/services/labels/create_service_spec.rb +++ b/spec/services/labels/create_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Labels::CreateService do +RSpec.describe Labels::CreateService, feature_category: :team_planning do describe '#execute' do let(:project) { create(:project) } let(:group) { create(:group) } diff --git a/spec/services/labels/find_or_create_service_spec.rb b/spec/services/labels/find_or_create_service_spec.rb index 3ea2727dc60..0bc1326942d 100644 --- a/spec/services/labels/find_or_create_service_spec.rb +++ b/spec/services/labels/find_or_create_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Labels::FindOrCreateService do +RSpec.describe Labels::FindOrCreateService, feature_category: :team_planning do describe '#execute' do let(:group) { create(:group) } let(:project) { create(:project, namespace: group) } diff --git a/spec/services/labels/promote_service_spec.rb b/spec/services/labels/promote_service_spec.rb index 3af6cf4c8f4..79cc88c65c8 100644 --- a/spec/services/labels/promote_service_spec.rb +++ b/spec/services/labels/promote_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Labels::PromoteService do +RSpec.describe Labels::PromoteService, feature_category: :team_planning do describe '#execute' do let_it_be(:user) { create(:user) } diff --git a/spec/services/labels/transfer_service_spec.rb b/spec/services/labels/transfer_service_spec.rb index e67ab6025a5..bf895692e64 100644 --- a/spec/services/labels/transfer_service_spec.rb +++ b/spec/services/labels/transfer_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Labels::TransferService do +RSpec.describe Labels::TransferService, feature_category: :team_planning do shared_examples 'transfer labels' do describe '#execute' do let_it_be(:user) { create(:user) } diff --git a/spec/services/labels/update_service_spec.rb b/spec/services/labels/update_service_spec.rb index abc456f75f9..b9ac5282d10 100644 --- a/spec/services/labels/update_service_spec.rb +++ b/spec/services/labels/update_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Labels::UpdateService do +RSpec.describe Labels::UpdateService, feature_category: :team_planning do describe '#execute' do let(:project) { create(:project) } diff --git a/spec/services/lfs/lock_file_service_spec.rb b/spec/services/lfs/lock_file_service_spec.rb index b3a121866c8..47bf0c5f4ce 100644 --- a/spec/services/lfs/lock_file_service_spec.rb +++ b/spec/services/lfs/lock_file_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Lfs::LockFileService do +RSpec.describe Lfs::LockFileService, feature_category: :source_code_management do let(:project) { create(:project) } let(:current_user) { create(:user) } diff --git a/spec/services/lfs/locks_finder_service_spec.rb b/spec/services/lfs/locks_finder_service_spec.rb index 1167212eb69..38f8dadd38d 100644 --- a/spec/services/lfs/locks_finder_service_spec.rb +++ b/spec/services/lfs/locks_finder_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Lfs::LocksFinderService do +RSpec.describe Lfs::LocksFinderService, feature_category: :source_code_management do let(:project) { create(:project) } let(:user) { create(:user) } let(:params) { {} } diff --git a/spec/services/lfs/push_service_spec.rb b/spec/services/lfs/push_service_spec.rb index f52bba94eea..1ec143a7fc9 100644 --- a/spec/services/lfs/push_service_spec.rb +++ b/spec/services/lfs/push_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Lfs::PushService do +RSpec.describe Lfs::PushService, feature_category: :source_code_management do let(:logger) { service.send(:logger) } let(:lfs_client) { service.send(:lfs_client) } diff --git a/spec/services/lfs/unlock_file_service_spec.rb b/spec/services/lfs/unlock_file_service_spec.rb index 7ab269f897a..45fd1adcfb4 100644 --- a/spec/services/lfs/unlock_file_service_spec.rb +++ b/spec/services/lfs/unlock_file_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Lfs::UnlockFileService do +RSpec.describe Lfs::UnlockFileService, feature_category: :source_code_management do let(:project) { create(:project) } let(:current_user) { create(:user) } let(:lock_author) { create(:user) } diff --git a/spec/services/loose_foreign_keys/batch_cleaner_service_spec.rb b/spec/services/loose_foreign_keys/batch_cleaner_service_spec.rb index 735f090d926..6eee83d5ee9 100644 --- a/spec/services/loose_foreign_keys/batch_cleaner_service_spec.rb +++ b/spec/services/loose_foreign_keys/batch_cleaner_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe LooseForeignKeys::BatchCleanerService do +RSpec.describe LooseForeignKeys::BatchCleanerService, feature_category: :database do include MigrationsHelpers def create_table_structure diff --git a/spec/services/loose_foreign_keys/cleaner_service_spec.rb b/spec/services/loose_foreign_keys/cleaner_service_spec.rb index 2cfd8385953..04f6270c5f2 100644 --- a/spec/services/loose_foreign_keys/cleaner_service_spec.rb +++ b/spec/services/loose_foreign_keys/cleaner_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe LooseForeignKeys::CleanerService do +RSpec.describe LooseForeignKeys::CleanerService, feature_category: :database do let(:schema) { ApplicationRecord.connection.current_schema } let(:deleted_records) do [ diff --git a/spec/services/loose_foreign_keys/process_deleted_records_service_spec.rb b/spec/services/loose_foreign_keys/process_deleted_records_service_spec.rb index 1824f822ba8..af010547cc9 100644 --- a/spec/services/loose_foreign_keys/process_deleted_records_service_spec.rb +++ b/spec/services/loose_foreign_keys/process_deleted_records_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe LooseForeignKeys::ProcessDeletedRecordsService do +RSpec.describe LooseForeignKeys::ProcessDeletedRecordsService, feature_category: :database do include MigrationsHelpers def create_table_structure diff --git a/spec/services/markdown_content_rewriter_service_spec.rb b/spec/services/markdown_content_rewriter_service_spec.rb index d94289856cf..bf15ef08647 100644 --- a/spec/services/markdown_content_rewriter_service_spec.rb +++ b/spec/services/markdown_content_rewriter_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe MarkdownContentRewriterService do +RSpec.describe MarkdownContentRewriterService, feature_category: :team_planning do let_it_be(:user) { create(:user) } let_it_be(:source_parent) { create(:project, :public) } let_it_be(:target_parent) { create(:project, :public) } diff --git a/spec/services/markup/rendering_service_spec.rb b/spec/services/markup/rendering_service_spec.rb index 99ab87f2072..952ee33da98 100644 --- a/spec/services/markup/rendering_service_spec.rb +++ b/spec/services/markup/rendering_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Markup::RenderingService do +RSpec.describe Markup::RenderingService, feature_category: :projects do describe '#execute' do let_it_be(:project) { create(:project, :repository) } let_it_be(:user) do @@ -111,5 +111,22 @@ RSpec.describe Markup::RenderingService do is_expected.to eq(expected_html) end end + + context 'with reStructuredText' do + let(:file_name) { 'foo.rst' } + let(:text) { "####\nPART\n####" } + + it 'returns rendered html' do + is_expected.to eq("<h1>PART</h1>\n\n") + end + + context 'when input has an invalid syntax' do + let(:text) { "####\nPART\n##" } + + it 'uses a simple formatter for html' do + is_expected.to eq("<p>####\n<br>PART\n<br>##</p>") + end + end + end end end diff --git a/spec/services/mattermost/create_team_service_spec.rb b/spec/services/mattermost/create_team_service_spec.rb new file mode 100644 index 00000000000..b9e5162aab4 --- /dev/null +++ b/spec/services/mattermost/create_team_service_spec.rb @@ -0,0 +1,28 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe Mattermost::CreateTeamService, feature_category: :integrations do + let(:user) { create(:user) } + let(:group) { create(:group) } + + subject { described_class.new(group, user) } + + it 'creates a team' do + expect_next_instance_of(::Mattermost::Team) do |instance| + expect(instance).to receive(:create).with(name: anything, display_name: anything, type: anything) + end + + subject.execute + end + + it 'adds an error if a team could not be created' do + expect_next_instance_of(::Mattermost::Team) do |instance| + expect(instance).to receive(:create).and_raise(::Mattermost::ClientError, 'client error') + end + + subject.execute + + expect(group.errors).to be_present + end +end diff --git a/spec/services/members/approve_access_request_service_spec.rb b/spec/services/members/approve_access_request_service_spec.rb index ca5c052d032..de5074809cb 100644 --- a/spec/services/members/approve_access_request_service_spec.rb +++ b/spec/services/members/approve_access_request_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Members::ApproveAccessRequestService do +RSpec.describe Members::ApproveAccessRequestService, feature_category: :subgroups do let(:project) { create(:project, :public) } let(:group) { create(:group, :public) } let(:current_user) { create(:user) } diff --git a/spec/services/members/create_service_spec.rb b/spec/services/members/create_service_spec.rb index 756e1cf403c..13f233162cd 100644 --- a/spec/services/members/create_service_spec.rb +++ b/spec/services/members/create_service_spec.rb @@ -2,7 +2,8 @@ require 'spec_helper' -RSpec.describe Members::CreateService, :aggregate_failures, :clean_gitlab_redis_cache, :clean_gitlab_redis_shared_state, :sidekiq_inline do +RSpec.describe Members::CreateService, :aggregate_failures, :clean_gitlab_redis_cache, :clean_gitlab_redis_shared_state, :sidekiq_inline, + feature_category: :subgroups do let_it_be(:source, reload: true) { create(:project) } let_it_be(:user) { create(:user) } let_it_be(:member) { create(:user) } diff --git a/spec/services/members/creator_service_spec.rb b/spec/services/members/creator_service_spec.rb index ad4c649086b..8191eefbe95 100644 --- a/spec/services/members/creator_service_spec.rb +++ b/spec/services/members/creator_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Members::CreatorService do +RSpec.describe Members::CreatorService, feature_category: :subgroups do let_it_be(:source, reload: true) { create(:group, :public) } let_it_be(:member_type) { GroupMember } let_it_be(:user) { create(:user) } diff --git a/spec/services/members/groups/creator_service_spec.rb b/spec/services/members/groups/creator_service_spec.rb index fced7195046..48c971297c1 100644 --- a/spec/services/members/groups/creator_service_spec.rb +++ b/spec/services/members/groups/creator_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Members::Groups::CreatorService do +RSpec.describe Members::Groups::CreatorService, feature_category: :subgroups do let_it_be(:source, reload: true) { create(:group, :public) } let_it_be(:user) { create(:user) } diff --git a/spec/services/members/import_project_team_service_spec.rb b/spec/services/members/import_project_team_service_spec.rb index 96e8db1ba73..af9b30aa0b3 100644 --- a/spec/services/members/import_project_team_service_spec.rb +++ b/spec/services/members/import_project_team_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Members::ImportProjectTeamService do +RSpec.describe Members::ImportProjectTeamService, feature_category: :subgroups do describe '#execute' do let_it_be(:source_project) { create(:project) } let_it_be(:target_project) { create(:project) } diff --git a/spec/services/members/invitation_reminder_email_service_spec.rb b/spec/services/members/invitation_reminder_email_service_spec.rb index 768a8719d54..da23965eabe 100644 --- a/spec/services/members/invitation_reminder_email_service_spec.rb +++ b/spec/services/members/invitation_reminder_email_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Members::InvitationReminderEmailService do +RSpec.describe Members::InvitationReminderEmailService, feature_category: :subgroups do describe 'sending invitation reminders' do subject { described_class.new(invitation).execute } diff --git a/spec/services/members/invite_member_builder_spec.rb b/spec/services/members/invite_member_builder_spec.rb index 52de65364c4..e7bbec4e0ef 100644 --- a/spec/services/members/invite_member_builder_spec.rb +++ b/spec/services/members/invite_member_builder_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Members::InviteMemberBuilder do +RSpec.describe Members::InviteMemberBuilder, feature_category: :subgroups do let_it_be(:source) { create(:group) } let_it_be(:existing_member) { create(:group_member) } diff --git a/spec/services/members/invite_service_spec.rb b/spec/services/members/invite_service_spec.rb index 23d4d671afc..22294b3fda5 100644 --- a/spec/services/members/invite_service_spec.rb +++ b/spec/services/members/invite_service_spec.rb @@ -2,7 +2,8 @@ require 'spec_helper' -RSpec.describe Members::InviteService, :aggregate_failures, :clean_gitlab_redis_shared_state, :sidekiq_inline do +RSpec.describe Members::InviteService, :aggregate_failures, :clean_gitlab_redis_shared_state, :sidekiq_inline, + feature_category: :subgroups do let_it_be(:project, reload: true) { create(:project) } let_it_be(:user) { project.first_owner } let_it_be(:project_user) { create(:user) } diff --git a/spec/services/members/projects/creator_service_spec.rb b/spec/services/members/projects/creator_service_spec.rb index 5dfba7adf0f..f09682347ef 100644 --- a/spec/services/members/projects/creator_service_spec.rb +++ b/spec/services/members/projects/creator_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Members::Projects::CreatorService do +RSpec.describe Members::Projects::CreatorService, feature_category: :projects do let_it_be(:source, reload: true) { create(:project, :public) } let_it_be(:user) { create(:user) } diff --git a/spec/services/members/request_access_service_spec.rb b/spec/services/members/request_access_service_spec.rb index 69eea2aea4b..ef8ee6492ab 100644 --- a/spec/services/members/request_access_service_spec.rb +++ b/spec/services/members/request_access_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Members::RequestAccessService do +RSpec.describe Members::RequestAccessService, feature_category: :subgroups do let(:user) { create(:user) } shared_examples 'a service raising Gitlab::Access::AccessDeniedError' do diff --git a/spec/services/members/standard_member_builder_spec.rb b/spec/services/members/standard_member_builder_spec.rb index 16daff53d31..69b764f3f16 100644 --- a/spec/services/members/standard_member_builder_spec.rb +++ b/spec/services/members/standard_member_builder_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Members::StandardMemberBuilder do +RSpec.describe Members::StandardMemberBuilder, feature_category: :subgroups do let_it_be(:source) { create(:group) } let_it_be(:existing_member) { create(:group_member) } diff --git a/spec/services/members/unassign_issuables_service_spec.rb b/spec/services/members/unassign_issuables_service_spec.rb index 3f7ccb7bab3..37dfbd16c56 100644 --- a/spec/services/members/unassign_issuables_service_spec.rb +++ b/spec/services/members/unassign_issuables_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Members::UnassignIssuablesService do +RSpec.describe Members::UnassignIssuablesService, feature_category: :subgroups do let_it_be(:group) { create(:group, :private) } let_it_be(:project) { create(:project, group: group) } let_it_be(:user, reload: true) { create(:user) } diff --git a/spec/services/members/update_service_spec.rb b/spec/services/members/update_service_spec.rb index 8a7f9a84c77..b94b44c8485 100644 --- a/spec/services/members/update_service_spec.rb +++ b/spec/services/members/update_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Members::UpdateService do +RSpec.describe Members::UpdateService, feature_category: :subgroups do let_it_be(:project) { create(:project, :public) } let_it_be(:group) { create(:group, :public) } let_it_be(:current_user) { create(:user) } diff --git a/spec/services/merge_requests/add_context_service_spec.rb b/spec/services/merge_requests/add_context_service_spec.rb index 448be27efe8..5fca2c17a3c 100644 --- a/spec/services/merge_requests/add_context_service_spec.rb +++ b/spec/services/merge_requests/add_context_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe MergeRequests::AddContextService do +RSpec.describe MergeRequests::AddContextService, feature_category: :code_review_workflow do let(:project) { create(:project, :repository) } let(:admin) { create(:admin) } let(:merge_request) { create(:merge_request, source_project: project, target_project: project, author: admin) } diff --git a/spec/services/merge_requests/add_spent_time_service_spec.rb b/spec/services/merge_requests/add_spent_time_service_spec.rb index 1e0b3e07f26..5d6d33c14d7 100644 --- a/spec/services/merge_requests/add_spent_time_service_spec.rb +++ b/spec/services/merge_requests/add_spent_time_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe MergeRequests::AddSpentTimeService do +RSpec.describe MergeRequests::AddSpentTimeService, feature_category: :code_review_workflow do let_it_be(:user) { create(:user) } let_it_be(:project) { create(:project, :public, :repository) } let_it_be_with_reload(:merge_request) { create(:merge_request, :simple, :unique_branches, source_project: project) } diff --git a/spec/services/merge_requests/add_todo_when_build_fails_service_spec.rb b/spec/services/merge_requests/add_todo_when_build_fails_service_spec.rb index 8d1abe5ea89..3c37792b576 100644 --- a/spec/services/merge_requests/add_todo_when_build_fails_service_spec.rb +++ b/spec/services/merge_requests/add_todo_when_build_fails_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe ::MergeRequests::AddTodoWhenBuildFailsService do +RSpec.describe ::MergeRequests::AddTodoWhenBuildFailsService, feature_category: :code_review_workflow do let(:user) { create(:user) } let(:project) { create(:project, :repository) } let(:sha) { '1234567890abcdef1234567890abcdef12345678' } diff --git a/spec/services/merge_requests/approval_service_spec.rb b/spec/services/merge_requests/approval_service_spec.rb index 1d6427900b9..6140021c8d2 100644 --- a/spec/services/merge_requests/approval_service_spec.rb +++ b/spec/services/merge_requests/approval_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe MergeRequests::ApprovalService do +RSpec.describe MergeRequests::ApprovalService, feature_category: :code_review_workflow do describe '#execute' do let(:user) { create(:user) } let(:merge_request) { create(:merge_request, reviewers: [user]) } diff --git a/spec/services/merge_requests/assign_issues_service_spec.rb b/spec/services/merge_requests/assign_issues_service_spec.rb index cf405c0102e..f5fb88b6161 100644 --- a/spec/services/merge_requests/assign_issues_service_spec.rb +++ b/spec/services/merge_requests/assign_issues_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe MergeRequests::AssignIssuesService do +RSpec.describe MergeRequests::AssignIssuesService, feature_category: :code_review_workflow do let(:user) { create(:user) } let(:project) { create(:project, :public, :repository) } let(:issue) { create(:issue, project: project) } diff --git a/spec/services/merge_requests/base_service_spec.rb b/spec/services/merge_requests/base_service_spec.rb index bd907ba6015..deabb1c9804 100644 --- a/spec/services/merge_requests/base_service_spec.rb +++ b/spec/services/merge_requests/base_service_spec.rb @@ -123,4 +123,8 @@ RSpec.describe MergeRequests::BaseService, feature_category: :code_review_workfl end end end + + describe '#constructor_container_arg' do + it { expect(described_class.constructor_container_arg("some-value")).to eq({ project: "some-value" }) } + end end diff --git a/spec/services/merge_requests/cleanup_refs_service_spec.rb b/spec/services/merge_requests/cleanup_refs_service_spec.rb index e8690ae5bf2..960b8101c36 100644 --- a/spec/services/merge_requests/cleanup_refs_service_spec.rb +++ b/spec/services/merge_requests/cleanup_refs_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe MergeRequests::CleanupRefsService do +RSpec.describe MergeRequests::CleanupRefsService, feature_category: :code_review_workflow do describe '.schedule' do let(:merge_request) { create(:merge_request) } diff --git a/spec/services/merge_requests/close_service_spec.rb b/spec/services/merge_requests/close_service_spec.rb index 2c0817550c6..25c75ae7244 100644 --- a/spec/services/merge_requests/close_service_spec.rb +++ b/spec/services/merge_requests/close_service_spec.rb @@ -88,7 +88,11 @@ RSpec.describe MergeRequests::CloseService, feature_category: :code_review_workf end it 'refreshes the number of open merge requests for a valid MR', :use_clean_rails_memory_store_caching do - expect { execute } + expect do + execute + + BatchLoader::Executor.clear_current + end .to change { project.open_merge_requests_count }.from(1).to(0) end diff --git a/spec/services/merge_requests/conflicts/list_service_spec.rb b/spec/services/merge_requests/conflicts/list_service_spec.rb index 5132eac0158..5eb53b1bcba 100644 --- a/spec/services/merge_requests/conflicts/list_service_spec.rb +++ b/spec/services/merge_requests/conflicts/list_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe MergeRequests::Conflicts::ListService do +RSpec.describe MergeRequests::Conflicts::ListService, feature_category: :code_review_workflow do describe '#can_be_resolved_in_ui?' do def create_merge_request(source_branch, target_branch = 'conflict-start') create(:merge_request, source_branch: source_branch, target_branch: target_branch, merge_status: :unchecked) do |mr| diff --git a/spec/services/merge_requests/conflicts/resolve_service_spec.rb b/spec/services/merge_requests/conflicts/resolve_service_spec.rb index 0abc70f71b0..e11cccaa54a 100644 --- a/spec/services/merge_requests/conflicts/resolve_service_spec.rb +++ b/spec/services/merge_requests/conflicts/resolve_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe MergeRequests::Conflicts::ResolveService do +RSpec.describe MergeRequests::Conflicts::ResolveService, feature_category: :code_review_workflow do include ProjectForksHelper let(:user) { create(:user) } let(:project) { create(:project, :public, :repository) } diff --git a/spec/services/merge_requests/create_approval_event_service_spec.rb b/spec/services/merge_requests/create_approval_event_service_spec.rb index 3d41ace11a7..4876c992337 100644 --- a/spec/services/merge_requests/create_approval_event_service_spec.rb +++ b/spec/services/merge_requests/create_approval_event_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe MergeRequests::CreateApprovalEventService do +RSpec.describe MergeRequests::CreateApprovalEventService, feature_category: :code_review_workflow do let(:user) { create(:user) } let(:merge_request) { create(:merge_request) } let(:project) { merge_request.project } diff --git a/spec/services/merge_requests/create_pipeline_service_spec.rb b/spec/services/merge_requests/create_pipeline_service_spec.rb index f11e3d0d1df..9c2321a2f16 100644 --- a/spec/services/merge_requests/create_pipeline_service_spec.rb +++ b/spec/services/merge_requests/create_pipeline_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe MergeRequests::CreatePipelineService, :clean_gitlab_redis_cache do +RSpec.describe MergeRequests::CreatePipelineService, :clean_gitlab_redis_cache, feature_category: :code_review_workflow do include ProjectForksHelper let_it_be(:project, refind: true) { create(:project, :repository) } diff --git a/spec/services/merge_requests/create_service_spec.rb b/spec/services/merge_requests/create_service_spec.rb index 394fc269ac3..7e20af32985 100644 --- a/spec/services/merge_requests/create_service_spec.rb +++ b/spec/services/merge_requests/create_service_spec.rb @@ -43,8 +43,11 @@ RSpec.describe MergeRequests::CreateService, :clean_gitlab_redis_shared_state, f end it 'refreshes the number of open merge requests', :use_clean_rails_memory_store_caching do - expect { service.execute } - .to change { project.open_merge_requests_count }.from(0).to(1) + expect do + service.execute + + BatchLoader::Executor.clear_current + end.to change { project.open_merge_requests_count }.from(0).to(1) end it 'creates exactly 1 create MR event', :sidekiq_might_not_need_inline do diff --git a/spec/services/merge_requests/delete_non_latest_diffs_service_spec.rb b/spec/services/merge_requests/delete_non_latest_diffs_service_spec.rb index d2070a466b1..d9e60911ada 100644 --- a/spec/services/merge_requests/delete_non_latest_diffs_service_spec.rb +++ b/spec/services/merge_requests/delete_non_latest_diffs_service_spec.rb @@ -2,7 +2,8 @@ require 'spec_helper' -RSpec.describe MergeRequests::DeleteNonLatestDiffsService, :clean_gitlab_redis_shared_state do +RSpec.describe MergeRequests::DeleteNonLatestDiffsService, :clean_gitlab_redis_shared_state, + feature_category: :code_review_workflow do let(:merge_request) { create(:merge_request) } let!(:subject) { described_class.new(merge_request) } diff --git a/spec/services/merge_requests/execute_approval_hooks_service_spec.rb b/spec/services/merge_requests/execute_approval_hooks_service_spec.rb index 863c47e8191..9f460648b05 100644 --- a/spec/services/merge_requests/execute_approval_hooks_service_spec.rb +++ b/spec/services/merge_requests/execute_approval_hooks_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe MergeRequests::ExecuteApprovalHooksService do +RSpec.describe MergeRequests::ExecuteApprovalHooksService, feature_category: :code_review_workflow do let(:user) { create(:user) } let(:merge_request) { create(:merge_request) } let(:project) { merge_request.project } diff --git a/spec/services/merge_requests/ff_merge_service_spec.rb b/spec/services/merge_requests/ff_merge_service_spec.rb index 5027acbba0a..993b7cfa85b 100644 --- a/spec/services/merge_requests/ff_merge_service_spec.rb +++ b/spec/services/merge_requests/ff_merge_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe MergeRequests::FfMergeService do +RSpec.describe MergeRequests::FfMergeService, feature_category: :code_review_workflow do let(:user) { create(:user) } let(:user2) { create(:user) } let(:merge_request) do diff --git a/spec/services/merge_requests/get_urls_service_spec.rb b/spec/services/merge_requests/get_urls_service_spec.rb index 5f81e1728fa..31b3e513a51 100644 --- a/spec/services/merge_requests/get_urls_service_spec.rb +++ b/spec/services/merge_requests/get_urls_service_spec.rb @@ -2,7 +2,7 @@ require "spec_helper" -RSpec.describe MergeRequests::GetUrlsService do +RSpec.describe MergeRequests::GetUrlsService, feature_category: :code_review_workflow do include ProjectForksHelper let(:project) { create(:project, :public, :repository) } diff --git a/spec/services/merge_requests/handle_assignees_change_service_spec.rb b/spec/services/merge_requests/handle_assignees_change_service_spec.rb index 3db3efedb84..951e59afe7f 100644 --- a/spec/services/merge_requests/handle_assignees_change_service_spec.rb +++ b/spec/services/merge_requests/handle_assignees_change_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe MergeRequests::HandleAssigneesChangeService do +RSpec.describe MergeRequests::HandleAssigneesChangeService, feature_category: :code_review_workflow do let_it_be(:project) { create(:project, :repository) } let_it_be(:user) { create(:user) } let_it_be(:assignee) { create(:user) } diff --git a/spec/services/merge_requests/mark_reviewer_reviewed_service_spec.rb b/spec/services/merge_requests/mark_reviewer_reviewed_service_spec.rb index 8437876c3cf..172c2133168 100644 --- a/spec/services/merge_requests/mark_reviewer_reviewed_service_spec.rb +++ b/spec/services/merge_requests/mark_reviewer_reviewed_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe MergeRequests::MarkReviewerReviewedService do +RSpec.describe MergeRequests::MarkReviewerReviewedService, feature_category: :code_review_workflow do let(:current_user) { create(:user) } let(:merge_request) { create(:merge_request, reviewers: [current_user]) } let(:reviewer) { merge_request.merge_request_reviewers.find_by(user_id: current_user.id) } diff --git a/spec/services/merge_requests/merge_orchestration_service_spec.rb b/spec/services/merge_requests/merge_orchestration_service_spec.rb index ebcd2f0e277..41da7abfeab 100644 --- a/spec/services/merge_requests/merge_orchestration_service_spec.rb +++ b/spec/services/merge_requests/merge_orchestration_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe MergeRequests::MergeOrchestrationService do +RSpec.describe MergeRequests::MergeOrchestrationService, feature_category: :code_review_workflow do let_it_be(:maintainer) { create(:user) } let(:merge_params) { { sha: merge_request.diff_head_sha } } diff --git a/spec/services/merge_requests/merge_service_spec.rb b/spec/services/merge_requests/merge_service_spec.rb index d3bf203d6bb..f380357a659 100644 --- a/spec/services/merge_requests/merge_service_spec.rb +++ b/spec/services/merge_requests/merge_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe MergeRequests::MergeService do +RSpec.describe MergeRequests::MergeService, feature_category: :code_review_workflow do include ExclusiveLeaseHelpers let_it_be(:user) { create(:user) } diff --git a/spec/services/merge_requests/merge_to_ref_service_spec.rb b/spec/services/merge_requests/merge_to_ref_service_spec.rb index 19fac3b5095..8428848c3c8 100644 --- a/spec/services/merge_requests/merge_to_ref_service_spec.rb +++ b/spec/services/merge_requests/merge_to_ref_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe MergeRequests::MergeToRefService do +RSpec.describe MergeRequests::MergeToRefService, feature_category: :code_review_workflow do shared_examples_for 'MergeService for target ref' do it 'target_ref has the same state of target branch' do repo = merge_request.target_project.repository diff --git a/spec/services/merge_requests/mergeability/check_base_service_spec.rb b/spec/services/merge_requests/mergeability/check_base_service_spec.rb index f07522b43cb..806bde61c23 100644 --- a/spec/services/merge_requests/mergeability/check_base_service_spec.rb +++ b/spec/services/merge_requests/mergeability/check_base_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe MergeRequests::Mergeability::CheckBaseService do +RSpec.describe MergeRequests::Mergeability::CheckBaseService, feature_category: :code_review_workflow do subject(:check_base_service) { described_class.new(merge_request: merge_request, params: params) } let(:merge_request) { double } diff --git a/spec/services/merge_requests/mergeability/check_broken_status_service_spec.rb b/spec/services/merge_requests/mergeability/check_broken_status_service_spec.rb index 6cc1079c94a..b6ee1049bb9 100644 --- a/spec/services/merge_requests/mergeability/check_broken_status_service_spec.rb +++ b/spec/services/merge_requests/mergeability/check_broken_status_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe MergeRequests::Mergeability::CheckBrokenStatusService do +RSpec.describe MergeRequests::Mergeability::CheckBrokenStatusService, feature_category: :code_review_workflow do subject(:check_broken_status) { described_class.new(merge_request: merge_request, params: {}) } let(:merge_request) { build(:merge_request) } diff --git a/spec/services/merge_requests/mergeability/check_ci_status_service_spec.rb b/spec/services/merge_requests/mergeability/check_ci_status_service_spec.rb index def3cb0ca28..cf835cf70a3 100644 --- a/spec/services/merge_requests/mergeability/check_ci_status_service_spec.rb +++ b/spec/services/merge_requests/mergeability/check_ci_status_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe MergeRequests::Mergeability::CheckCiStatusService do +RSpec.describe MergeRequests::Mergeability::CheckCiStatusService, feature_category: :code_review_workflow do subject(:check_ci_status) { described_class.new(merge_request: merge_request, params: params) } let(:merge_request) { build(:merge_request) } diff --git a/spec/services/merge_requests/mergeability/check_discussions_status_service_spec.rb b/spec/services/merge_requests/mergeability/check_discussions_status_service_spec.rb index 9f107ce046a..a3b77558ec3 100644 --- a/spec/services/merge_requests/mergeability/check_discussions_status_service_spec.rb +++ b/spec/services/merge_requests/mergeability/check_discussions_status_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe MergeRequests::Mergeability::CheckDiscussionsStatusService do +RSpec.describe MergeRequests::Mergeability::CheckDiscussionsStatusService, feature_category: :code_review_workflow do subject(:check_discussions_status) { described_class.new(merge_request: merge_request, params: params) } let(:merge_request) { build(:merge_request) } diff --git a/spec/services/merge_requests/mergeability/check_draft_status_service_spec.rb b/spec/services/merge_requests/mergeability/check_draft_status_service_spec.rb index e9363e5d676..cb624705a02 100644 --- a/spec/services/merge_requests/mergeability/check_draft_status_service_spec.rb +++ b/spec/services/merge_requests/mergeability/check_draft_status_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe MergeRequests::Mergeability::CheckDraftStatusService do +RSpec.describe MergeRequests::Mergeability::CheckDraftStatusService, feature_category: :code_review_workflow do subject(:check_draft_status) { described_class.new(merge_request: merge_request, params: {}) } let(:merge_request) { build(:merge_request) } diff --git a/spec/services/merge_requests/mergeability/check_open_status_service_spec.rb b/spec/services/merge_requests/mergeability/check_open_status_service_spec.rb index 936524b020a..53ad77ea4df 100644 --- a/spec/services/merge_requests/mergeability/check_open_status_service_spec.rb +++ b/spec/services/merge_requests/mergeability/check_open_status_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe MergeRequests::Mergeability::CheckOpenStatusService do +RSpec.describe MergeRequests::Mergeability::CheckOpenStatusService, feature_category: :code_review_workflow do subject(:check_open_status) { described_class.new(merge_request: merge_request, params: {}) } let(:merge_request) { build(:merge_request) } diff --git a/spec/services/merge_requests/mergeability/detailed_merge_status_service_spec.rb b/spec/services/merge_requests/mergeability/detailed_merge_status_service_spec.rb index 5722bb79cc5..876b1e7f23a 100644 --- a/spec/services/merge_requests/mergeability/detailed_merge_status_service_spec.rb +++ b/spec/services/merge_requests/mergeability/detailed_merge_status_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe ::MergeRequests::Mergeability::DetailedMergeStatusService do +RSpec.describe ::MergeRequests::Mergeability::DetailedMergeStatusService, feature_category: :code_review_workflow do subject(:detailed_merge_status) { described_class.new(merge_request: merge_request).execute } context 'when merge status is cannot_be_merged_rechecking' do diff --git a/spec/services/merge_requests/mergeability/logger_spec.rb b/spec/services/merge_requests/mergeability/logger_spec.rb index 3e2a1e9f9fd..1f56b6bebdb 100644 --- a/spec/services/merge_requests/mergeability/logger_spec.rb +++ b/spec/services/merge_requests/mergeability/logger_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe MergeRequests::Mergeability::Logger, :request_store do +RSpec.describe MergeRequests::Mergeability::Logger, :request_store, feature_category: :code_review_workflow do let_it_be(:merge_request) { create(:merge_request) } subject(:logger) { described_class.new(merge_request: merge_request) } diff --git a/spec/services/merge_requests/mergeability/run_checks_service_spec.rb b/spec/services/merge_requests/mergeability/run_checks_service_spec.rb index c56b38bccc1..bfff582994b 100644 --- a/spec/services/merge_requests/mergeability/run_checks_service_spec.rb +++ b/spec/services/merge_requests/mergeability/run_checks_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe MergeRequests::Mergeability::RunChecksService, :clean_gitlab_redis_cache do +RSpec.describe MergeRequests::Mergeability::RunChecksService, :clean_gitlab_redis_cache, feature_category: :code_review_workflow do subject(:run_checks) { described_class.new(merge_request: merge_request, params: {}) } describe '#execute' do diff --git a/spec/services/merge_requests/mergeability_check_service_spec.rb b/spec/services/merge_requests/mergeability_check_service_spec.rb index ee23238314e..881157e7f11 100644 --- a/spec/services/merge_requests/mergeability_check_service_spec.rb +++ b/spec/services/merge_requests/mergeability_check_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe MergeRequests::MergeabilityCheckService, :clean_gitlab_redis_shared_state do +RSpec.describe MergeRequests::MergeabilityCheckService, :clean_gitlab_redis_shared_state, feature_category: :code_review_workflow do shared_examples_for 'unmergeable merge request' do it 'updates or keeps merge status as cannot_be_merged' do subject diff --git a/spec/services/merge_requests/migrate_external_diffs_service_spec.rb b/spec/services/merge_requests/migrate_external_diffs_service_spec.rb index 6ea8626ba73..c7f78dfa992 100644 --- a/spec/services/merge_requests/migrate_external_diffs_service_spec.rb +++ b/spec/services/merge_requests/migrate_external_diffs_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe MergeRequests::MigrateExternalDiffsService do +RSpec.describe MergeRequests::MigrateExternalDiffsService, feature_category: :code_review_workflow do let(:merge_request) { create(:merge_request) } let(:diff) { merge_request.merge_request_diff } diff --git a/spec/services/merge_requests/post_merge_service_spec.rb b/spec/services/merge_requests/post_merge_service_spec.rb index e486daae15e..f7526c169bd 100644 --- a/spec/services/merge_requests/post_merge_service_spec.rb +++ b/spec/services/merge_requests/post_merge_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe MergeRequests::PostMergeService do +RSpec.describe MergeRequests::PostMergeService, feature_category: :code_review_workflow do include ProjectForksHelper let_it_be(:user) { create(:user) } @@ -23,7 +23,11 @@ RSpec.describe MergeRequests::PostMergeService do # Cache the counter before the MR changed state. project.open_merge_requests_count - expect { subject }.to change { project.open_merge_requests_count }.from(1).to(0) + expect do + subject + + BatchLoader::Executor.clear_current + end.to change { project.open_merge_requests_count }.from(1).to(0) end it 'updates metrics' do diff --git a/spec/services/merge_requests/push_options_handler_service_spec.rb b/spec/services/merge_requests/push_options_handler_service_spec.rb index 251bf6f0d9d..7ca795ecd1a 100644 --- a/spec/services/merge_requests/push_options_handler_service_spec.rb +++ b/spec/services/merge_requests/push_options_handler_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe MergeRequests::PushOptionsHandlerService do +RSpec.describe MergeRequests::PushOptionsHandlerService, feature_category: :source_code_management do include ProjectForksHelper let_it_be(:parent_group) { create(:group, :public) } diff --git a/spec/services/merge_requests/refresh_service_spec.rb b/spec/services/merge_requests/refresh_service_spec.rb index 0814942b6b7..d8e5eb3bcde 100644 --- a/spec/services/merge_requests/refresh_service_spec.rb +++ b/spec/services/merge_requests/refresh_service_spec.rb @@ -109,6 +109,14 @@ RSpec.describe MergeRequests::RefreshService, feature_category: :code_review_wor expect(@fork_build_failed_todo).to be_done end + it 'triggers mergeRequestMergeStatusUpdated GraphQL subscription conditionally' do + expect(GraphqlTriggers).to receive(:merge_request_merge_status_updated).with(@merge_request) + expect(GraphqlTriggers).to receive(:merge_request_merge_status_updated).with(@another_merge_request) + expect(GraphqlTriggers).not_to receive(:merge_request_merge_status_updated).with(@fork_merge_request) + + refresh_service.execute(@oldrev, @newrev, 'refs/heads/master') + end + context 'when a merge error exists' do let(:error_message) { 'This is a merge error' } diff --git a/spec/services/merge_requests/reload_diffs_service_spec.rb b/spec/services/merge_requests/reload_diffs_service_spec.rb index 3d5b65207e6..4dd05f75a3e 100644 --- a/spec/services/merge_requests/reload_diffs_service_spec.rb +++ b/spec/services/merge_requests/reload_diffs_service_spec.rb @@ -2,7 +2,8 @@ require 'spec_helper' -RSpec.describe MergeRequests::ReloadDiffsService, :use_clean_rails_memory_store_caching do +RSpec.describe MergeRequests::ReloadDiffsService, :use_clean_rails_memory_store_caching, +feature_category: :code_review_workflow do let(:current_user) { create(:user) } let(:merge_request) { create(:merge_request) } let(:subject) { described_class.new(merge_request, current_user) } diff --git a/spec/services/merge_requests/reload_merge_head_diff_service_spec.rb b/spec/services/merge_requests/reload_merge_head_diff_service_spec.rb index 20b5cf5e3a1..1c315f12221 100644 --- a/spec/services/merge_requests/reload_merge_head_diff_service_spec.rb +++ b/spec/services/merge_requests/reload_merge_head_diff_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe MergeRequests::ReloadMergeHeadDiffService do +RSpec.describe MergeRequests::ReloadMergeHeadDiffService, feature_category: :code_review_workflow do let(:merge_request) { create(:merge_request) } subject { described_class.new(merge_request).execute } diff --git a/spec/services/merge_requests/reopen_service_spec.rb b/spec/services/merge_requests/reopen_service_spec.rb index b9df31b6727..7399b29d06e 100644 --- a/spec/services/merge_requests/reopen_service_spec.rb +++ b/spec/services/merge_requests/reopen_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe MergeRequests::ReopenService do +RSpec.describe MergeRequests::ReopenService, feature_category: :code_review_workflow do let(:user) { create(:user) } let(:user2) { create(:user) } let(:guest) { create(:user) } @@ -92,7 +92,11 @@ RSpec.describe MergeRequests::ReopenService do it 'refreshes the number of open merge requests for a valid MR' do service = described_class.new(project: project, current_user: user) - expect { service.execute(merge_request) } + expect do + service.execute(merge_request) + + BatchLoader::Executor.clear_current + end .to change { project.open_merge_requests_count }.from(0).to(1) end diff --git a/spec/services/merge_requests/request_review_service_spec.rb b/spec/services/merge_requests/request_review_service_spec.rb index 1d3f92b083f..ef96bf11e0b 100644 --- a/spec/services/merge_requests/request_review_service_spec.rb +++ b/spec/services/merge_requests/request_review_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe MergeRequests::RequestReviewService do +RSpec.describe MergeRequests::RequestReviewService, feature_category: :code_review_workflow do let(:current_user) { create(:user) } let(:user) { create(:user) } let(:merge_request) { create(:merge_request, reviewers: [user]) } diff --git a/spec/services/merge_requests/resolve_todos_service_spec.rb b/spec/services/merge_requests/resolve_todos_service_spec.rb index 53bd259f0f4..de7ddbea8bb 100644 --- a/spec/services/merge_requests/resolve_todos_service_spec.rb +++ b/spec/services/merge_requests/resolve_todos_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe MergeRequests::ResolveTodosService do +RSpec.describe MergeRequests::ResolveTodosService, feature_category: :code_review_workflow do let_it_be(:merge_request) { create(:merge_request) } let_it_be(:user) { create(:user) } diff --git a/spec/services/merge_requests/resolved_discussion_notification_service_spec.rb b/spec/services/merge_requests/resolved_discussion_notification_service_spec.rb index 2f191f2ee44..c3a99431dcc 100644 --- a/spec/services/merge_requests/resolved_discussion_notification_service_spec.rb +++ b/spec/services/merge_requests/resolved_discussion_notification_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe MergeRequests::ResolvedDiscussionNotificationService do +RSpec.describe MergeRequests::ResolvedDiscussionNotificationService, feature_category: :code_review_workflow do let(:merge_request) { create(:merge_request) } let(:user) { create(:user) } let(:project) { merge_request.project } diff --git a/spec/services/merge_requests/squash_service_spec.rb b/spec/services/merge_requests/squash_service_spec.rb index 471bb03f18c..26e225db9fc 100644 --- a/spec/services/merge_requests/squash_service_spec.rb +++ b/spec/services/merge_requests/squash_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe MergeRequests::SquashService do +RSpec.describe MergeRequests::SquashService, feature_category: :source_code_management do let(:service) { described_class.new(project: project, current_user: user, params: { merge_request: merge_request }) } let(:user) { project.first_owner } let(:project) { create(:project, :repository) } diff --git a/spec/services/merge_requests/update_assignees_service_spec.rb b/spec/services/merge_requests/update_assignees_service_spec.rb index 2d80d75a262..7d08eb86441 100644 --- a/spec/services/merge_requests/update_assignees_service_spec.rb +++ b/spec/services/merge_requests/update_assignees_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe MergeRequests::UpdateAssigneesService do +RSpec.describe MergeRequests::UpdateAssigneesService, feature_category: :code_review_workflow do include AfterNextHelpers let_it_be(:group) { create(:group, :public) } diff --git a/spec/services/merge_requests/update_reviewers_service_spec.rb b/spec/services/merge_requests/update_reviewers_service_spec.rb index 9f935e1cecf..ed2d448b523 100644 --- a/spec/services/merge_requests/update_reviewers_service_spec.rb +++ b/spec/services/merge_requests/update_reviewers_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe MergeRequests::UpdateReviewersService do +RSpec.describe MergeRequests::UpdateReviewersService, feature_category: :code_review_workflow do include AfterNextHelpers let_it_be(:group) { create(:group, :public) } diff --git a/spec/services/metrics/dashboard/annotations/create_service_spec.rb b/spec/services/metrics/dashboard/annotations/create_service_spec.rb index 8f5484fcabe..2bcfa54ead7 100644 --- a/spec/services/metrics/dashboard/annotations/create_service_spec.rb +++ b/spec/services/metrics/dashboard/annotations/create_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Metrics::Dashboard::Annotations::CreateService do +RSpec.describe Metrics::Dashboard::Annotations::CreateService, feature_category: :metrics do let_it_be(:user) { create(:user) } let(:description) { 'test annotation' } diff --git a/spec/services/metrics/dashboard/annotations/delete_service_spec.rb b/spec/services/metrics/dashboard/annotations/delete_service_spec.rb index ec2bd3772bf..557d6d95767 100644 --- a/spec/services/metrics/dashboard/annotations/delete_service_spec.rb +++ b/spec/services/metrics/dashboard/annotations/delete_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Metrics::Dashboard::Annotations::DeleteService do +RSpec.describe Metrics::Dashboard::Annotations::DeleteService, feature_category: :metrics do let(:user) { create(:user) } let(:service_instance) { described_class.new(user, annotation) } diff --git a/spec/services/metrics/dashboard/clone_dashboard_service_spec.rb b/spec/services/metrics/dashboard/clone_dashboard_service_spec.rb index 47e5557105b..40ec37c393d 100644 --- a/spec/services/metrics/dashboard/clone_dashboard_service_spec.rb +++ b/spec/services/metrics/dashboard/clone_dashboard_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Metrics::Dashboard::CloneDashboardService, :use_clean_rails_memory_store_caching do +RSpec.describe Metrics::Dashboard::CloneDashboardService, :use_clean_rails_memory_store_caching, feature_category: :metrics do include MetricsDashboardHelpers let_it_be(:user) { create(:user) } diff --git a/spec/services/metrics/dashboard/cluster_dashboard_service_spec.rb b/spec/services/metrics/dashboard/cluster_dashboard_service_spec.rb index f2e32d5eb35..beed23a366f 100644 --- a/spec/services/metrics/dashboard/cluster_dashboard_service_spec.rb +++ b/spec/services/metrics/dashboard/cluster_dashboard_service_spec.rb @@ -2,7 +2,8 @@ require 'spec_helper' -RSpec.describe Metrics::Dashboard::ClusterDashboardService, :use_clean_rails_memory_store_caching do +RSpec.describe Metrics::Dashboard::ClusterDashboardService, :use_clean_rails_memory_store_caching, + feature_category: :metrics do include MetricsDashboardHelpers let_it_be(:user) { create(:user) } diff --git a/spec/services/metrics/dashboard/cluster_metrics_embed_service_spec.rb b/spec/services/metrics/dashboard/cluster_metrics_embed_service_spec.rb index dbb89af45d0..5d63505e5cc 100644 --- a/spec/services/metrics/dashboard/cluster_metrics_embed_service_spec.rb +++ b/spec/services/metrics/dashboard/cluster_metrics_embed_service_spec.rb @@ -2,7 +2,8 @@ require 'spec_helper' -RSpec.describe Metrics::Dashboard::ClusterMetricsEmbedService, :use_clean_rails_memory_store_caching do +RSpec.describe Metrics::Dashboard::ClusterMetricsEmbedService, :use_clean_rails_memory_store_caching, + feature_category: :metrics do include MetricsDashboardHelpers using RSpec::Parameterized::TableSyntax diff --git a/spec/services/metrics/dashboard/custom_dashboard_service_spec.rb b/spec/services/metrics/dashboard/custom_dashboard_service_spec.rb index afeb1646005..940daa38ae7 100644 --- a/spec/services/metrics/dashboard/custom_dashboard_service_spec.rb +++ b/spec/services/metrics/dashboard/custom_dashboard_service_spec.rb @@ -2,7 +2,8 @@ require 'spec_helper' -RSpec.describe Metrics::Dashboard::CustomDashboardService, :use_clean_rails_memory_store_caching do +RSpec.describe Metrics::Dashboard::CustomDashboardService, :use_clean_rails_memory_store_caching, + feature_category: :metrics do include MetricsDashboardHelpers let_it_be(:user) { create(:user) } diff --git a/spec/services/metrics/dashboard/custom_metric_embed_service_spec.rb b/spec/services/metrics/dashboard/custom_metric_embed_service_spec.rb index 127cec6275c..8117296b048 100644 --- a/spec/services/metrics/dashboard/custom_metric_embed_service_spec.rb +++ b/spec/services/metrics/dashboard/custom_metric_embed_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Metrics::Dashboard::CustomMetricEmbedService do +RSpec.describe Metrics::Dashboard::CustomMetricEmbedService, feature_category: :metrics do include MetricsDashboardHelpers let_it_be(:project, reload: true) { build(:project) } diff --git a/spec/services/metrics/dashboard/default_embed_service_spec.rb b/spec/services/metrics/dashboard/default_embed_service_spec.rb index 647778eadc1..6ef248f6b09 100644 --- a/spec/services/metrics/dashboard/default_embed_service_spec.rb +++ b/spec/services/metrics/dashboard/default_embed_service_spec.rb @@ -2,7 +2,8 @@ require 'spec_helper' -RSpec.describe Metrics::Dashboard::DefaultEmbedService, :use_clean_rails_memory_store_caching do +RSpec.describe Metrics::Dashboard::DefaultEmbedService, :use_clean_rails_memory_store_caching, + feature_category: :metrics do include MetricsDashboardHelpers let_it_be(:project) { build(:project) } diff --git a/spec/services/metrics/dashboard/dynamic_embed_service_spec.rb b/spec/services/metrics/dashboard/dynamic_embed_service_spec.rb index 5eb8f24266c..1643f552a70 100644 --- a/spec/services/metrics/dashboard/dynamic_embed_service_spec.rb +++ b/spec/services/metrics/dashboard/dynamic_embed_service_spec.rb @@ -2,7 +2,8 @@ require 'spec_helper' -RSpec.describe Metrics::Dashboard::DynamicEmbedService, :use_clean_rails_memory_store_caching do +RSpec.describe Metrics::Dashboard::DynamicEmbedService, :use_clean_rails_memory_store_caching, + feature_category: :metrics do include MetricsDashboardHelpers let_it_be(:project) { build(:project) } diff --git a/spec/services/metrics/dashboard/gitlab_alert_embed_service_spec.rb b/spec/services/metrics/dashboard/gitlab_alert_embed_service_spec.rb index 2905e4599f3..25812a492b2 100644 --- a/spec/services/metrics/dashboard/gitlab_alert_embed_service_spec.rb +++ b/spec/services/metrics/dashboard/gitlab_alert_embed_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Metrics::Dashboard::GitlabAlertEmbedService do +RSpec.describe Metrics::Dashboard::GitlabAlertEmbedService, feature_category: :metrics do include MetricsDashboardHelpers let_it_be(:alert) { create(:prometheus_alert) } diff --git a/spec/services/metrics/dashboard/grafana_metric_embed_service_spec.rb b/spec/services/metrics/dashboard/grafana_metric_embed_service_spec.rb index 5263fd40a40..877a455ea44 100644 --- a/spec/services/metrics/dashboard/grafana_metric_embed_service_spec.rb +++ b/spec/services/metrics/dashboard/grafana_metric_embed_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Metrics::Dashboard::GrafanaMetricEmbedService do +RSpec.describe Metrics::Dashboard::GrafanaMetricEmbedService, feature_category: :metrics do include MetricsDashboardHelpers include ReactiveCachingHelpers include GrafanaApiHelpers diff --git a/spec/services/metrics/dashboard/panel_preview_service_spec.rb b/spec/services/metrics/dashboard/panel_preview_service_spec.rb index 787c61cc918..2a70c667ee5 100644 --- a/spec/services/metrics/dashboard/panel_preview_service_spec.rb +++ b/spec/services/metrics/dashboard/panel_preview_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Metrics::Dashboard::PanelPreviewService do +RSpec.describe Metrics::Dashboard::PanelPreviewService, feature_category: :metrics do let_it_be(:project) { create(:project) } let_it_be(:environment) { create(:environment, project: project) } let_it_be(:panel_yml) do diff --git a/spec/services/metrics/dashboard/pod_dashboard_service_spec.rb b/spec/services/metrics/dashboard/pod_dashboard_service_spec.rb index 0ea812e93ee..d26b27d7a18 100644 --- a/spec/services/metrics/dashboard/pod_dashboard_service_spec.rb +++ b/spec/services/metrics/dashboard/pod_dashboard_service_spec.rb @@ -2,7 +2,8 @@ require 'spec_helper' -RSpec.describe Metrics::Dashboard::PodDashboardService, :use_clean_rails_memory_store_caching do +RSpec.describe Metrics::Dashboard::PodDashboardService, :use_clean_rails_memory_store_caching, + feature_category: :pods do include MetricsDashboardHelpers let_it_be(:user) { create(:user) } diff --git a/spec/services/metrics/dashboard/self_monitoring_dashboard_service_spec.rb b/spec/services/metrics/dashboard/self_monitoring_dashboard_service_spec.rb index d0cefdbeb30..930789ed701 100644 --- a/spec/services/metrics/dashboard/self_monitoring_dashboard_service_spec.rb +++ b/spec/services/metrics/dashboard/self_monitoring_dashboard_service_spec.rb @@ -2,7 +2,8 @@ require 'spec_helper' -RSpec.describe Metrics::Dashboard::SelfMonitoringDashboardService, :use_clean_rails_memory_store_caching do +RSpec.describe Metrics::Dashboard::SelfMonitoringDashboardService, :use_clean_rails_memory_store_caching, + feature_category: :metrics do include MetricsDashboardHelpers let_it_be(:user) { create(:user) } diff --git a/spec/services/metrics/dashboard/system_dashboard_service_spec.rb b/spec/services/metrics/dashboard/system_dashboard_service_spec.rb index e1c6aaeec66..b08b980e50e 100644 --- a/spec/services/metrics/dashboard/system_dashboard_service_spec.rb +++ b/spec/services/metrics/dashboard/system_dashboard_service_spec.rb @@ -2,7 +2,8 @@ require 'spec_helper' -RSpec.describe Metrics::Dashboard::SystemDashboardService, :use_clean_rails_memory_store_caching do +RSpec.describe Metrics::Dashboard::SystemDashboardService, :use_clean_rails_memory_store_caching, + feature_category: :metrics do include MetricsDashboardHelpers let_it_be(:user) { create(:user) } diff --git a/spec/services/metrics/dashboard/transient_embed_service_spec.rb b/spec/services/metrics/dashboard/transient_embed_service_spec.rb index 53ea83c33d6..1e3ccde6ae3 100644 --- a/spec/services/metrics/dashboard/transient_embed_service_spec.rb +++ b/spec/services/metrics/dashboard/transient_embed_service_spec.rb @@ -2,7 +2,8 @@ require 'spec_helper' -RSpec.describe Metrics::Dashboard::TransientEmbedService, :use_clean_rails_memory_store_caching do +RSpec.describe Metrics::Dashboard::TransientEmbedService, :use_clean_rails_memory_store_caching, + feature_category: :metrics do let_it_be(:project) { build(:project) } let_it_be(:user) { create(:user) } let_it_be(:environment) { create(:environment, project: project) } diff --git a/spec/services/metrics/dashboard/update_dashboard_service_spec.rb b/spec/services/metrics/dashboard/update_dashboard_service_spec.rb index 148005480ea..15bbe9f9364 100644 --- a/spec/services/metrics/dashboard/update_dashboard_service_spec.rb +++ b/spec/services/metrics/dashboard/update_dashboard_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Metrics::Dashboard::UpdateDashboardService, :use_clean_rails_memory_store_caching do +RSpec.describe Metrics::Dashboard::UpdateDashboardService, :use_clean_rails_memory_store_caching, feature_category: :metrics do include MetricsDashboardHelpers let_it_be(:user) { create(:user) } diff --git a/spec/services/metrics/sample_metrics_service_spec.rb b/spec/services/metrics/sample_metrics_service_spec.rb index b94345500f0..3442b4303db 100644 --- a/spec/services/metrics/sample_metrics_service_spec.rb +++ b/spec/services/metrics/sample_metrics_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Metrics::SampleMetricsService do +RSpec.describe Metrics::SampleMetricsService, feature_category: :metrics do describe 'query' do let(:range_start) { '2019-12-02T23:31:45.000Z' } let(:range_end) { '2019-12-03T00:01:45.000Z' } diff --git a/spec/services/metrics/users_starred_dashboards/create_service_spec.rb b/spec/services/metrics/users_starred_dashboards/create_service_spec.rb index 1435e39e458..e08bdca8410 100644 --- a/spec/services/metrics/users_starred_dashboards/create_service_spec.rb +++ b/spec/services/metrics/users_starred_dashboards/create_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Metrics::UsersStarredDashboards::CreateService do +RSpec.describe Metrics::UsersStarredDashboards::CreateService, feature_category: :metrics do let_it_be(:user) { create(:user) } let(:dashboard_path) { 'config/prometheus/common_metrics.yml' } diff --git a/spec/services/metrics/users_starred_dashboards/delete_service_spec.rb b/spec/services/metrics/users_starred_dashboards/delete_service_spec.rb index 5cdffe681eb..8c4bcecc239 100644 --- a/spec/services/metrics/users_starred_dashboards/delete_service_spec.rb +++ b/spec/services/metrics/users_starred_dashboards/delete_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Metrics::UsersStarredDashboards::DeleteService do +RSpec.describe Metrics::UsersStarredDashboards::DeleteService, feature_category: :metrics do subject(:service_instance) { described_class.new(user, project, dashboard_path) } let_it_be(:user) { create(:user) } diff --git a/spec/services/milestones/close_service_spec.rb b/spec/services/milestones/close_service_spec.rb index 53751b40667..f362c8da642 100644 --- a/spec/services/milestones/close_service_spec.rb +++ b/spec/services/milestones/close_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Milestones::CloseService do +RSpec.describe Milestones::CloseService, feature_category: :team_planning do let(:user) { create(:user) } let(:project) { create(:project) } let(:milestone) { create(:milestone, title: "Milestone v1.2", project: project) } diff --git a/spec/services/milestones/closed_issues_count_service_spec.rb b/spec/services/milestones/closed_issues_count_service_spec.rb index a3865d08972..f0ed0872c2d 100644 --- a/spec/services/milestones/closed_issues_count_service_spec.rb +++ b/spec/services/milestones/closed_issues_count_service_spec.rb @@ -2,7 +2,8 @@ require 'spec_helper' -RSpec.describe Milestones::ClosedIssuesCountService, :use_clean_rails_memory_store_caching do +RSpec.describe Milestones::ClosedIssuesCountService, :use_clean_rails_memory_store_caching, + feature_category: :team_planning do let(:project) { create(:project) } let(:milestone) { create(:milestone, project: project) } diff --git a/spec/services/milestones/create_service_spec.rb b/spec/services/milestones/create_service_spec.rb index 93ca4ff653f..78cb05532eb 100644 --- a/spec/services/milestones/create_service_spec.rb +++ b/spec/services/milestones/create_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Milestones::CreateService do +RSpec.describe Milestones::CreateService, feature_category: :team_planning do let(:project) { create(:project) } let(:user) { create(:user) } diff --git a/spec/services/milestones/destroy_service_spec.rb b/spec/services/milestones/destroy_service_spec.rb index 6c08b7db43a..209177c348b 100644 --- a/spec/services/milestones/destroy_service_spec.rb +++ b/spec/services/milestones/destroy_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Milestones::DestroyService do +RSpec.describe Milestones::DestroyService, feature_category: :team_planning do let(:user) { create(:user) } let(:project) { create(:project, :repository) } let(:milestone) { create(:milestone, title: 'Milestone v1.0', project: project) } diff --git a/spec/services/milestones/find_or_create_service_spec.rb b/spec/services/milestones/find_or_create_service_spec.rb index 1bcaf578441..8a72778a22a 100644 --- a/spec/services/milestones/find_or_create_service_spec.rb +++ b/spec/services/milestones/find_or_create_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Milestones::FindOrCreateService do +RSpec.describe Milestones::FindOrCreateService, feature_category: :team_planning do describe '#execute' do subject(:service) { described_class.new(project, user, params) } diff --git a/spec/services/milestones/issues_count_service_spec.rb b/spec/services/milestones/issues_count_service_spec.rb index c944055e4e7..a80b27822b6 100644 --- a/spec/services/milestones/issues_count_service_spec.rb +++ b/spec/services/milestones/issues_count_service_spec.rb @@ -2,7 +2,8 @@ require 'spec_helper' -RSpec.describe Milestones::IssuesCountService, :use_clean_rails_memory_store_caching do +RSpec.describe Milestones::IssuesCountService, :use_clean_rails_memory_store_caching, + feature_category: :team_planning do let(:project) { create(:project) } let(:milestone) { create(:milestone, project: project) } diff --git a/spec/services/milestones/merge_requests_count_service_spec.rb b/spec/services/milestones/merge_requests_count_service_spec.rb index aecc7d5ef52..00b7b95aeb6 100644 --- a/spec/services/milestones/merge_requests_count_service_spec.rb +++ b/spec/services/milestones/merge_requests_count_service_spec.rb @@ -2,7 +2,8 @@ require 'spec_helper' -RSpec.describe Milestones::MergeRequestsCountService, :use_clean_rails_memory_store_caching do +RSpec.describe Milestones::MergeRequestsCountService, :use_clean_rails_memory_store_caching, + feature_category: :team_planning do let_it_be(:project) { create(:project, :empty_repo) } let_it_be(:milestone) { create(:milestone, project: project) } diff --git a/spec/services/milestones/promote_service_spec.rb b/spec/services/milestones/promote_service_spec.rb index 8f4201d8d94..203ac2d3f40 100644 --- a/spec/services/milestones/promote_service_spec.rb +++ b/spec/services/milestones/promote_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Milestones::PromoteService do +RSpec.describe Milestones::PromoteService, feature_category: :team_planning do let(:group) { create(:group) } let(:project) { create(:project, namespace: group) } let(:user) { create(:user) } diff --git a/spec/services/milestones/transfer_service_spec.rb b/spec/services/milestones/transfer_service_spec.rb index de02226661c..ea65f713902 100644 --- a/spec/services/milestones/transfer_service_spec.rb +++ b/spec/services/milestones/transfer_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Milestones::TransferService do +RSpec.describe Milestones::TransferService, feature_category: :team_planning do describe '#execute' do subject(:service) { described_class.new(user, old_group, project) } diff --git a/spec/services/milestones/update_service_spec.rb b/spec/services/milestones/update_service_spec.rb index 85fd89c11ac..76110af2514 100644 --- a/spec/services/milestones/update_service_spec.rb +++ b/spec/services/milestones/update_service_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -RSpec.describe Milestones::UpdateService do +RSpec.describe Milestones::UpdateService, feature_category: :team_planning do let(:project) { create(:project) } let(:user) { build(:user) } let(:milestone) { create(:milestone, project: project) } diff --git a/spec/services/ml/experiment_tracking/candidate_repository_spec.rb b/spec/services/ml/experiment_tracking/candidate_repository_spec.rb index e3c05178025..45a4792426c 100644 --- a/spec/services/ml/experiment_tracking/candidate_repository_spec.rb +++ b/spec/services/ml/experiment_tracking/candidate_repository_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe ::Ml::ExperimentTracking::CandidateRepository do +RSpec.describe ::Ml::ExperimentTracking::CandidateRepository, feature_category: :experimentation_activation do let_it_be(:project) { create(:project) } let_it_be(:user) { create(:user) } let_it_be(:experiment) { create(:ml_experiments, user: user, project: project) } diff --git a/spec/services/ml/experiment_tracking/experiment_repository_spec.rb b/spec/services/ml/experiment_tracking/experiment_repository_spec.rb index c3c716b831a..3c645fa84b4 100644 --- a/spec/services/ml/experiment_tracking/experiment_repository_spec.rb +++ b/spec/services/ml/experiment_tracking/experiment_repository_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe ::Ml::ExperimentTracking::ExperimentRepository do +RSpec.describe ::Ml::ExperimentTracking::ExperimentRepository, feature_category: :experimentation_activation do let_it_be(:project) { create(:project) } let_it_be(:user) { create(:user) } let_it_be(:experiment) { create(:ml_experiments, user: user, project: project) } diff --git a/spec/services/namespace_settings/update_service_spec.rb b/spec/services/namespace_settings/update_service_spec.rb index e0f32cb3821..5f1ff6746bc 100644 --- a/spec/services/namespace_settings/update_service_spec.rb +++ b/spec/services/namespace_settings/update_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe NamespaceSettings::UpdateService do +RSpec.describe NamespaceSettings::UpdateService, feature_category: :subgroups do let(:user) { create(:user) } let(:group) { create(:group) } let(:settings) { {} } diff --git a/spec/services/namespaces/in_product_marketing_emails_service_spec.rb b/spec/services/namespaces/in_product_marketing_emails_service_spec.rb index b44c256802f..8a2ecd5c3e0 100644 --- a/spec/services/namespaces/in_product_marketing_emails_service_spec.rb +++ b/spec/services/namespaces/in_product_marketing_emails_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Namespaces::InProductMarketingEmailsService, '#execute' do +RSpec.describe Namespaces::InProductMarketingEmailsService, '#execute', feature_category: :purchase do subject(:execute_service) { described_class.new(track, interval).execute } let(:track) { :create } diff --git a/spec/services/namespaces/package_settings/update_service_spec.rb b/spec/services/namespaces/package_settings/update_service_spec.rb index 10926c5ef57..e21c9a8f1b9 100644 --- a/spec/services/namespaces/package_settings/update_service_spec.rb +++ b/spec/services/namespaces/package_settings/update_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe ::Namespaces::PackageSettings::UpdateService do +RSpec.describe ::Namespaces::PackageSettings::UpdateService, feature_category: :package_registry do using RSpec::Parameterized::TableSyntax let_it_be_with_reload(:namespace) { create(:group) } diff --git a/spec/services/namespaces/statistics_refresher_service_spec.rb b/spec/services/namespaces/statistics_refresher_service_spec.rb index 2d5f9235bd4..750f98615cc 100644 --- a/spec/services/namespaces/statistics_refresher_service_spec.rb +++ b/spec/services/namespaces/statistics_refresher_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Namespaces::StatisticsRefresherService, '#execute' do +RSpec.describe Namespaces::StatisticsRefresherService, '#execute', feature_category: :subgroups do let(:group) { create(:group) } let(:subgroup) { create(:group, parent: group) } let(:projects) { create_list(:project, 5, namespace: group) } diff --git a/spec/services/note_summary_spec.rb b/spec/services/note_summary_spec.rb index ad244f62292..1cbbb68205d 100644 --- a/spec/services/note_summary_spec.rb +++ b/spec/services/note_summary_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe NoteSummary do +RSpec.describe NoteSummary, feature_category: :code_review_workflow do let(:project) { build(:project) } let(:noteable) { build(:issue) } let(:user) { build(:user) } diff --git a/spec/services/notes/build_service_spec.rb b/spec/services/notes/build_service_spec.rb index 67d8b37f809..97c736e373b 100644 --- a/spec/services/notes/build_service_spec.rb +++ b/spec/services/notes/build_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Notes::BuildService do +RSpec.describe Notes::BuildService, feature_category: :team_planning do include AdminModeHelper let_it_be(:project) { create(:project, :repository) } diff --git a/spec/services/notes/copy_service_spec.rb b/spec/services/notes/copy_service_spec.rb index 2fa9a462bb9..5a48f6e7560 100644 --- a/spec/services/notes/copy_service_spec.rb +++ b/spec/services/notes/copy_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Notes::CopyService do +RSpec.describe Notes::CopyService, feature_category: :team_planning do describe '#initialize' do let_it_be(:noteable) { create(:issue) } diff --git a/spec/services/notes/create_service_spec.rb b/spec/services/notes/create_service_spec.rb index 1ee9e51433e..05a41ddc6c5 100644 --- a/spec/services/notes/create_service_spec.rb +++ b/spec/services/notes/create_service_spec.rb @@ -108,7 +108,6 @@ RSpec.describe Notes::CreateService, feature_category: :team_planning do end it_behaves_like 'Snowplow event tracking with RedisHLL context' do - let(:feature_flag_name) { :route_hll_to_snowplow_phase2 } let(:namespace) { issue.namespace } let(:category) { described_class.to_s } let(:action) { 'incident_management_incident_comment' } @@ -124,10 +123,6 @@ RSpec.describe Notes::CreateService, feature_category: :team_planning do let(:execute_create_service) { described_class.new(project, user, opts).execute } - before do - stub_feature_flags(notes_create_service_tracking: false) - end - it 'tracks commit comment usage data', :clean_gitlab_redis_shared_state do expect(counter).to receive(:count).with(:create, 'Commit').and_call_original diff --git a/spec/services/notes/destroy_service_spec.rb b/spec/services/notes/destroy_service_spec.rb index 744808525f5..43132b4221f 100644 --- a/spec/services/notes/destroy_service_spec.rb +++ b/spec/services/notes/destroy_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Notes::DestroyService do +RSpec.describe Notes::DestroyService, feature_category: :team_planning do let_it_be(:project) { create(:project, :public) } let_it_be(:issue) { create(:issue, project: project) } diff --git a/spec/services/notes/post_process_service_spec.rb b/spec/services/notes/post_process_service_spec.rb index 17001733c5b..0bcfd6b63d2 100644 --- a/spec/services/notes/post_process_service_spec.rb +++ b/spec/services/notes/post_process_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Notes::PostProcessService do +RSpec.describe Notes::PostProcessService, feature_category: :team_planning do let(:project) { create(:project) } let(:issue) { create(:issue, project: project) } let(:user) { create(:user) } diff --git a/spec/services/notes/quick_actions_service_spec.rb b/spec/services/notes/quick_actions_service_spec.rb index bca954c3959..b474285e67e 100644 --- a/spec/services/notes/quick_actions_service_spec.rb +++ b/spec/services/notes/quick_actions_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Notes::QuickActionsService do +RSpec.describe Notes::QuickActionsService, feature_category: :team_planning do shared_context 'note on noteable' do let_it_be(:project) { create(:project, :repository) } let_it_be(:maintainer) { create(:user).tap { |u| project.add_maintainer(u) } } @@ -253,6 +253,12 @@ RSpec.describe Notes::QuickActionsService do describe '.noteable_update_service_class' do include_context 'note on noteable' + it 'returns WorkItems::UpdateService for a note on a work item' do + note = create(:note_on_work_item, project: project) + + expect(described_class.noteable_update_service_class(note)).to eq(WorkItems::UpdateService) + end + it 'returns Issues::UpdateService for a note on an issue' do note = create(:note_on_issue, project: project) @@ -322,6 +328,84 @@ RSpec.describe Notes::QuickActionsService do let(:merge_request) { create(:merge_request, source_project: project) } let(:note) { build(:note_on_merge_request, project: project, noteable: merge_request) } end + + context 'note on work item that supports quick actions' do + include_context 'note on noteable' + + let_it_be(:work_item, reload: true) { create(:work_item, project: project) } + + let(:note) { build(:note_on_work_item, project: project, noteable: work_item) } + + let!(:labels) { create_pair(:label, project: project) } + + before do + note.note = note_text + end + + describe 'note with only command' do + describe '/close, /label & /assign' do + let(:note_text) do + %(/close\n/label ~#{labels.first.name} ~#{labels.last.name}\n/assign @#{assignee.username}\n) + end + + it 'closes noteable, sets labels, assigns and leave no note' do + content = execute(note) + + expect(content).to be_empty + expect(note.noteable).to be_closed + expect(note.noteable.labels).to match_array(labels) + expect(note.noteable.assignees).to eq([assignee]) + end + end + + describe '/reopen' do + before do + note.noteable.close! + expect(note.noteable).to be_closed + end + let(:note_text) { '/reopen' } + + it 'opens the noteable, and leave no note' do + content = execute(note) + + expect(content).to be_empty + expect(note.noteable).to be_open + end + end + end + + describe 'note with command & text' do + describe '/close, /label, /assign' do + let(:note_text) do + %(HELLO\n/close\n/label ~#{labels.first.name} ~#{labels.last.name}\n/assign @#{assignee.username}\nWORLD) + end + + it 'closes noteable, sets labels, assigns, and sets milestone to noteable' do + content = execute(note) + + expect(content).to eq "HELLO\nWORLD" + expect(note.noteable).to be_closed + expect(note.noteable.labels).to match_array(labels) + expect(note.noteable.assignees).to eq([assignee]) + end + end + + describe '/reopen' do + before do + note.noteable.close + expect(note.noteable).to be_closed + end + let(:note_text) { "HELLO\n/reopen\nWORLD" } + + it 'opens the noteable' do + content = execute(note) + + expect(content).to eq "HELLO\nWORLD" + expect(note.noteable).to be_open + end + end + end + end end context 'CE restriction for issue assignees' do diff --git a/spec/services/notes/render_service_spec.rb b/spec/services/notes/render_service_spec.rb index 09cd7dc572b..8ebecddffa7 100644 --- a/spec/services/notes/render_service_spec.rb +++ b/spec/services/notes/render_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Notes::RenderService do +RSpec.describe Notes::RenderService, feature_category: :team_planning do describe '#execute' do it 'renders a Note' do note = double(:note) diff --git a/spec/services/notes/resolve_service_spec.rb b/spec/services/notes/resolve_service_spec.rb index 1c5b308aed1..1b5586ee1b3 100644 --- a/spec/services/notes/resolve_service_spec.rb +++ b/spec/services/notes/resolve_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Notes::ResolveService do +RSpec.describe Notes::ResolveService, feature_category: :team_planning do let(:merge_request) { create(:merge_request) } let(:note) { create(:diff_note_on_merge_request, noteable: merge_request, project: merge_request.project) } let(:user) { merge_request.author } diff --git a/spec/services/notes/update_service_spec.rb b/spec/services/notes/update_service_spec.rb index 05703ac548d..0d5a0ae7706 100644 --- a/spec/services/notes/update_service_spec.rb +++ b/spec/services/notes/update_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Notes::UpdateService do +RSpec.describe Notes::UpdateService, feature_category: :team_planning do let(:group) { create(:group, :public) } let(:project) { create(:project, :public, group: group) } let(:private_group) { create(:group, :private) } diff --git a/spec/services/notification_recipients/build_service_spec.rb b/spec/services/notification_recipients/build_service_spec.rb index 899d23ec641..bfd1dcd7d80 100644 --- a/spec/services/notification_recipients/build_service_spec.rb +++ b/spec/services/notification_recipients/build_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe NotificationRecipients::BuildService do +RSpec.describe NotificationRecipients::BuildService, feature_category: :team_planning do let(:service) { described_class } let(:assignee) { create(:user) } let(:project) { create(:project, :public) } diff --git a/spec/services/notification_recipients/builder/default_spec.rb b/spec/services/notification_recipients/builder/default_spec.rb index 4d0ddc7c4f7..da991b5951a 100644 --- a/spec/services/notification_recipients/builder/default_spec.rb +++ b/spec/services/notification_recipients/builder/default_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe NotificationRecipients::Builder::Default do +RSpec.describe NotificationRecipients::Builder::Default, feature_category: :team_planning do describe '#build!' do let_it_be(:group) { create(:group, :public) } let_it_be(:project) { create(:project, :public, group: group).tap { |p| p.add_developer(project_watcher) if project_watcher } } diff --git a/spec/services/notification_recipients/builder/new_note_spec.rb b/spec/services/notification_recipients/builder/new_note_spec.rb index 7d2a4f682c5..e87824f3156 100644 --- a/spec/services/notification_recipients/builder/new_note_spec.rb +++ b/spec/services/notification_recipients/builder/new_note_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe NotificationRecipients::Builder::NewNote do +RSpec.describe NotificationRecipients::Builder::NewNote, feature_category: :team_planning do describe '#notification_recipients' do let_it_be(:group) { create(:group, :public) } let_it_be(:project) { create(:project, :public, group: group) } diff --git a/spec/services/onboarding/progress_service_spec.rb b/spec/services/onboarding/progress_service_spec.rb index 8f3f723613e..e1d6b4cd44b 100644 --- a/spec/services/onboarding/progress_service_spec.rb +++ b/spec/services/onboarding/progress_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Onboarding::ProgressService do +RSpec.describe Onboarding::ProgressService, feature_category: :onboarding do describe '.async' do let_it_be(:namespace) { create(:namespace) } let_it_be(:action) { :git_pull } diff --git a/spec/services/packages/cleanup/execute_policy_service_spec.rb b/spec/services/packages/cleanup/execute_policy_service_spec.rb index 93335c4a821..a083dc0d4ea 100644 --- a/spec/services/packages/cleanup/execute_policy_service_spec.rb +++ b/spec/services/packages/cleanup/execute_policy_service_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -RSpec.describe Packages::Cleanup::ExecutePolicyService do +RSpec.describe Packages::Cleanup::ExecutePolicyService, feature_category: :package_registry do let_it_be(:project) { create(:project) } let_it_be_with_reload(:policy) { create(:packages_cleanup_policy, project: project) } diff --git a/spec/services/packages/cleanup/update_policy_service_spec.rb b/spec/services/packages/cleanup/update_policy_service_spec.rb index a11fbb766f5..8068c351e5f 100644 --- a/spec/services/packages/cleanup/update_policy_service_spec.rb +++ b/spec/services/packages/cleanup/update_policy_service_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -RSpec.describe Packages::Cleanup::UpdatePolicyService do +RSpec.describe Packages::Cleanup::UpdatePolicyService, feature_category: :package_registry do using RSpec::Parameterized::TableSyntax let_it_be_with_reload(:project) { create(:project) } diff --git a/spec/services/packages/composer/composer_json_service_spec.rb b/spec/services/packages/composer/composer_json_service_spec.rb index d2187688c4c..15acd79c49e 100644 --- a/spec/services/packages/composer/composer_json_service_spec.rb +++ b/spec/services/packages/composer/composer_json_service_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -RSpec.describe Packages::Composer::ComposerJsonService do +RSpec.describe Packages::Composer::ComposerJsonService, feature_category: :package_registry do describe '#execute' do let(:branch) { project.repository.find_branch('master') } let(:target) { branch.target } diff --git a/spec/services/packages/composer/create_package_service_spec.rb b/spec/services/packages/composer/create_package_service_spec.rb index 26429a7b5d9..78d5d76fe4f 100644 --- a/spec/services/packages/composer/create_package_service_spec.rb +++ b/spec/services/packages/composer/create_package_service_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -RSpec.describe Packages::Composer::CreatePackageService do +RSpec.describe Packages::Composer::CreatePackageService, feature_category: :package_registry do include PackagesManagerApiSpecHelpers let_it_be(:package_name) { 'composer-package-name' } diff --git a/spec/services/packages/composer/version_parser_service_spec.rb b/spec/services/packages/composer/version_parser_service_spec.rb index 69253ff934e..ac50f2e2e55 100644 --- a/spec/services/packages/composer/version_parser_service_spec.rb +++ b/spec/services/packages/composer/version_parser_service_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -RSpec.describe Packages::Composer::VersionParserService do +RSpec.describe Packages::Composer::VersionParserService, feature_category: :package_registry do let_it_be(:params) { {} } describe '#execute' do diff --git a/spec/services/packages/conan/create_package_file_service_spec.rb b/spec/services/packages/conan/create_package_file_service_spec.rb index e655b8d1f9e..6859e52560a 100644 --- a/spec/services/packages/conan/create_package_file_service_spec.rb +++ b/spec/services/packages/conan/create_package_file_service_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -RSpec.describe Packages::Conan::CreatePackageFileService do +RSpec.describe Packages::Conan::CreatePackageFileService, feature_category: :package_registry do include WorkhorseHelpers let_it_be(:package) { create(:conan_package) } diff --git a/spec/services/packages/conan/create_package_service_spec.rb b/spec/services/packages/conan/create_package_service_spec.rb index 6f644f5ef95..db06463b7fa 100644 --- a/spec/services/packages/conan/create_package_service_spec.rb +++ b/spec/services/packages/conan/create_package_service_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -RSpec.describe Packages::Conan::CreatePackageService do +RSpec.describe Packages::Conan::CreatePackageService, feature_category: :package_registry do let_it_be(:project) { create(:project) } let_it_be(:user) { create(:user) } diff --git a/spec/services/packages/create_dependency_service_spec.rb b/spec/services/packages/create_dependency_service_spec.rb index f95e21cd045..06a7a13bdd9 100644 --- a/spec/services/packages/create_dependency_service_spec.rb +++ b/spec/services/packages/create_dependency_service_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -RSpec.describe Packages::CreateDependencyService do +RSpec.describe Packages::CreateDependencyService, feature_category: :package_registry do describe '#execute' do let_it_be(:namespace) { create(:namespace) } let_it_be(:version) { '1.0.1' } diff --git a/spec/services/packages/create_event_service_spec.rb b/spec/services/packages/create_event_service_spec.rb index 58fa68b11fe..44ad3f29c58 100644 --- a/spec/services/packages/create_event_service_spec.rb +++ b/spec/services/packages/create_event_service_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -RSpec.describe Packages::CreateEventService do +RSpec.describe Packages::CreateEventService, feature_category: :package_registry do let(:scope) { 'generic' } let(:event_name) { 'push_package' } diff --git a/spec/services/packages/create_package_file_service_spec.rb b/spec/services/packages/create_package_file_service_spec.rb index 2ff00ea8568..5b4ea3e1530 100644 --- a/spec/services/packages/create_package_file_service_spec.rb +++ b/spec/services/packages/create_package_file_service_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -RSpec.describe Packages::CreatePackageFileService do +RSpec.describe Packages::CreatePackageFileService, feature_category: :package_registry do let_it_be(:package) { create(:maven_package) } let_it_be(:user) { create(:user) } diff --git a/spec/services/packages/create_temporary_package_service_spec.rb b/spec/services/packages/create_temporary_package_service_spec.rb index 4b8d37401d8..be8b5afc1e0 100644 --- a/spec/services/packages/create_temporary_package_service_spec.rb +++ b/spec/services/packages/create_temporary_package_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Packages::CreateTemporaryPackageService do +RSpec.describe Packages::CreateTemporaryPackageService, feature_category: :package_registry do let_it_be(:project) { create(:project) } let_it_be(:user) { create(:user) } let_it_be(:params) { {} } diff --git a/spec/services/packages/debian/create_package_file_service_spec.rb b/spec/services/packages/debian/create_package_file_service_spec.rb index 43928669eb1..b527bf8c1de 100644 --- a/spec/services/packages/debian/create_package_file_service_spec.rb +++ b/spec/services/packages/debian/create_package_file_service_spec.rb @@ -57,7 +57,7 @@ RSpec.describe Packages::Debian::CreatePackageFileService, feature_category: :pa expect(package_file).to be_valid expect(package_file.file.read).to start_with('Format: 1.8') - expect(package_file.size).to eq(2143) + expect(package_file.size).to eq(2422) expect(package_file.file_name).to eq(file_name) expect(package_file.file_sha1).to eq('54321') expect(package_file.file_sha256).to eq('543212345') diff --git a/spec/services/packages/debian/extract_changes_metadata_service_spec.rb b/spec/services/packages/debian/extract_changes_metadata_service_spec.rb index 4d6acac219b..a22c1fc7acc 100644 --- a/spec/services/packages/debian/extract_changes_metadata_service_spec.rb +++ b/spec/services/packages/debian/extract_changes_metadata_service_spec.rb @@ -19,7 +19,7 @@ RSpec.describe Packages::Debian::ExtractChangesMetadataService, feature_category expect(subject[:file_type]).to eq(:changes) expect(subject[:architecture]).to be_nil expect(subject[:fields]).to include(expected_fields) - expect(subject[:files].count).to eq(6) + expect(subject[:files].count).to eq(7) end end diff --git a/spec/services/packages/debian/extract_metadata_service_spec.rb b/spec/services/packages/debian/extract_metadata_service_spec.rb index 412f285152b..1983c49c6b7 100644 --- a/spec/services/packages/debian/extract_metadata_service_spec.rb +++ b/spec/services/packages/debian/extract_metadata_service_spec.rb @@ -1,4 +1,5 @@ # frozen_string_literal: true + require 'spec_helper' RSpec.describe Packages::Debian::ExtractMetadataService, feature_category: :package_registry do @@ -6,12 +7,13 @@ RSpec.describe Packages::Debian::ExtractMetadataService, feature_category: :pack subject { service.execute } - RSpec.shared_context 'Debian ExtractMetadata Service' do |trait| + RSpec.shared_context 'with Debian package file' do |trait| let(:package_file) { create(:debian_package_file, trait) } end RSpec.shared_examples 'Test Debian ExtractMetadata Service' do |expected_file_type, expected_architecture, expected_fields| - it "returns file_type #{expected_file_type.inspect}, architecture #{expected_architecture.inspect} and fields #{expected_fields.nil? ? '' : 'including '}#{expected_fields.inspect}", :aggregate_failures do + it "returns file_type #{expected_file_type.inspect}, architecture #{expected_architecture.inspect} and fields #{expected_fields.nil? ? '' : 'including '}#{expected_fields.inspect}", + :aggregate_failures do expect(subject[:file_type]).to eq(expected_file_type) expect(subject[:architecture]).to eq(expected_architecture) @@ -25,29 +27,79 @@ RSpec.describe Packages::Debian::ExtractMetadataService, feature_category: :pack using RSpec::Parameterized::TableSyntax - where(:case_name, :trait, :expected_file_type, :expected_architecture, :expected_fields) do - 'with invalid' | :invalid | :unknown | nil | nil - 'with source' | :source | :source | nil | nil - 'with dsc' | :dsc | :dsc | nil | { 'Binary' => 'sample-dev, libsample0, sample-udeb' } - 'with deb' | :deb | :deb | 'amd64' | { 'Multi-Arch' => 'same' } - 'with udeb' | :udeb | :udeb | 'amd64' | { 'Package' => 'sample-udeb' } - 'with buildinfo' | :buildinfo | :buildinfo | nil | { 'Architecture' => 'amd64 source', 'Build-Architecture' => 'amd64' } - 'with changes' | :changes | :changes | nil | { 'Architecture' => 'source amd64', 'Binary' => 'libsample0 sample-dev sample-udeb' } + context 'with valid file types' do + where(:case_name, :trait, :expected_file_type, :expected_architecture, :expected_fields) do + 'with source' | :source | :source | nil | nil + 'with dsc' | :dsc | :dsc | nil | { 'Binary' => 'sample-dev, libsample0, sample-udeb, sample-ddeb' } + 'with deb' | :deb | :deb | 'amd64' | { 'Multi-Arch' => 'same' } + 'with udeb' | :udeb | :udeb | 'amd64' | { 'Package' => 'sample-udeb' } + 'with ddeb' | :ddeb | :ddeb | 'amd64' | { 'Package' => 'sample-ddeb' } + 'with buildinfo' | :buildinfo | :buildinfo | nil | { 'Architecture' => 'amd64 source', + 'Build-Architecture' => 'amd64' } + 'with changes' | :changes | :changes | nil | { 'Architecture' => 'source amd64', + 'Binary' => 'libsample0 sample-dev sample-udeb' } + end + + with_them do + include_context 'with Debian package file', params[:trait] do + it_behaves_like 'Test Debian ExtractMetadata Service', + params[:expected_file_type], + params[:expected_architecture], + params[:expected_fields] + end + end end - with_them do - include_context 'Debian ExtractMetadata Service', params[:trait] do - it_behaves_like 'Test Debian ExtractMetadata Service', - params[:expected_file_type], - params[:expected_architecture], - params[:expected_fields] + context 'with valid source extensions' do + where(:ext) do + %i[gz bz2 lzma xz] + end + + with_them do + let(:package_file) do + create(:debian_package_file, :source, file_name: "myfile.tar.#{ext}", + file_fixture: 'spec/fixtures/packages/debian/sample_1.2.3~alpha2.tar.xz') + end + + it_behaves_like 'Test Debian ExtractMetadata Service', :source + end + end + + context 'with invalid source extensions' do + where(:ext) do + %i[gzip bzip2] + end + + with_them do + let(:package_file) do + create(:debian_package_file, :source, file_name: "myfile.tar.#{ext}", + file_fixture: 'spec/fixtures/packages/debian/sample_1.2.3~alpha2.tar.xz') + end + + it 'raises an error' do + expect do + subject + end.to raise_error(described_class::ExtractionError, + "unsupported file extension for file #{package_file.file_name}") + end + end + end + + context 'with invalid file name' do + let(:package_file) { create(:debian_package_file, :invalid) } + + it 'raises an error' do + expect do + subject + end.to raise_error(described_class::ExtractionError, + "unsupported file extension for file #{package_file.file_name}") end end context 'with invalid package file' do let(:package_file) { create(:conan_package_file) } - it 'raise error' do + it 'raises an error' do expect { subject }.to raise_error(described_class::ExtractionError, 'invalid package file') end end diff --git a/spec/services/packages/debian/generate_distribution_service_spec.rb b/spec/services/packages/debian/generate_distribution_service_spec.rb index 6d179c791a3..27206b847e4 100644 --- a/spec/services/packages/debian/generate_distribution_service_spec.rb +++ b/spec/services/packages/debian/generate_distribution_service_spec.rb @@ -3,20 +3,32 @@ require 'spec_helper' RSpec.describe Packages::Debian::GenerateDistributionService, feature_category: :package_registry do - describe '#execute' do - subject { described_class.new(distribution).execute } + include_context 'with published Debian package' - let(:subject2) { described_class.new(distribution).execute } - let(:subject3) { described_class.new(distribution).execute } + let(:service) { described_class.new(distribution) } - include_context 'with published Debian package' + [:project, :group].each do |container_type| + context "for #{container_type}" do + include_context 'with Debian distribution', container_type - [:project, :group].each do |container_type| - context "for #{container_type}" do - include_context 'with Debian distribution', container_type + describe '#execute' do + subject { service.execute } + + let(:subject2) { described_class.new(distribution).execute } + let(:subject3) { described_class.new(distribution).execute } it_behaves_like 'Generate Debian Distribution and component files' end + + describe '#lease_key' do + subject { service.send(:lease_key) } + + let(:prefix) { "packages:debian:generate_distribution_service:" } + + it 'returns an unique key' do + is_expected.to eq "#{prefix}#{container_type}_distribution:#{distribution.id}" + end + end end end end diff --git a/spec/services/packages/debian/parse_debian822_service_spec.rb b/spec/services/packages/debian/parse_debian822_service_spec.rb index 35b7ead9209..624d4d95e5a 100644 --- a/spec/services/packages/debian/parse_debian822_service_spec.rb +++ b/spec/services/packages/debian/parse_debian822_service_spec.rb @@ -1,4 +1,5 @@ # frozen_string_literal: true + require 'spec_helper' RSpec.describe Packages::Debian::ParseDebian822Service, feature_category: :package_registry do @@ -76,14 +77,19 @@ RSpec.describe Packages::Debian::ParseDebian822Service, feature_category: :packa 'Multi-Arch' => 'same', 'Depends' => '${shlibs:Depends}, ${misc:Depends}', 'Description' => "Some mostly empty lib\nUsed in GitLab tests.\n\nTesting another paragraph." - }, + }, 'Package: sample-udeb' => { - 'Package' => 'sample-udeb', - 'Package-Type' => 'udeb', - 'Architecture' => 'any', - 'Depends' => 'installed-base', - 'Description' => 'Some mostly empty udeb' - } + 'Package' => 'sample-udeb', + 'Package-Type' => 'udeb', + 'Architecture' => 'any', + 'Depends' => 'installed-base', + 'Description' => 'Some mostly empty udeb' + }, + 'Package: sample-ddeb' => { + 'Package' => 'sample-ddeb', + 'Architecture' => 'any', + 'Description' => 'Some fake Ubuntu ddeb' + } } expect(subject.execute.to_s).to eq(expected.to_s) diff --git a/spec/services/packages/debian/process_changes_service_spec.rb b/spec/services/packages/debian/process_changes_service_spec.rb index e3ed744377e..d2c05b678ea 100644 --- a/spec/services/packages/debian/process_changes_service_spec.rb +++ b/spec/services/packages/debian/process_changes_service_spec.rb @@ -18,7 +18,7 @@ RSpec.describe Packages::Debian::ProcessChangesService, feature_category: :packa expect { subject.execute } .to change { Packages::Package.count }.from(1).to(2) .and not_change { Packages::PackageFile.count } - .and change { incoming.package_files.count }.from(7).to(0) + .and change { incoming.package_files.count }.from(8).to(0) .and change { package_file.debian_file_metadatum&.reload&.file_type }.from('unknown').to('changes') created_package = Packages::Package.last diff --git a/spec/services/packages/debian/process_package_file_service_spec.rb b/spec/services/packages/debian/process_package_file_service_spec.rb index caf29cfc4fa..2684b69785a 100644 --- a/spec/services/packages/debian/process_package_file_service_spec.rb +++ b/spec/services/packages/debian/process_package_file_service_spec.rb @@ -35,6 +35,7 @@ RSpec.describe Packages::Debian::ProcessPackageFileService, feature_category: :p where(:case_name, :expected_file_type, :file_name, :component_name) do 'with a deb' | 'deb' | 'libsample0_1.2.3~alpha2_amd64.deb' | 'main' 'with an udeb' | 'udeb' | 'sample-udeb_1.2.3~alpha2_amd64.udeb' | 'contrib' + 'with an ddeb' | 'ddeb' | 'sample-ddeb_1.2.3~alpha2_amd64.ddeb' | 'main' end with_them do @@ -67,9 +68,9 @@ RSpec.describe Packages::Debian::ProcessPackageFileService, feature_category: :p .to receive(:perform_async).with(:project, distribution.id) expect { subject.execute } .to change(Packages::Package, :count).from(2).to(1) - .and change(Packages::PackageFile, :count).from(14).to(8) + .and change(Packages::PackageFile, :count).from(16).to(9) .and not_change(Packages::Debian::Publication, :count) - .and change(package.package_files, :count).from(7).to(0) + .and change(package.package_files, :count).from(8).to(0) .and change(package_file, :package).from(package).to(matching_package) .and not_change(matching_package, :name) .and not_change(matching_package, :version) diff --git a/spec/services/packages/generic/create_package_file_service_spec.rb b/spec/services/packages/generic/create_package_file_service_spec.rb index 9d6784b7721..08c4cbdbe11 100644 --- a/spec/services/packages/generic/create_package_file_service_spec.rb +++ b/spec/services/packages/generic/create_package_file_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Packages::Generic::CreatePackageFileService do +RSpec.describe Packages::Generic::CreatePackageFileService, feature_category: :package_registry do let_it_be(:project) { create(:project) } let_it_be(:user) { create(:user) } let_it_be(:pipeline) { create(:ci_pipeline, user: user) } diff --git a/spec/services/packages/generic/find_or_create_package_service_spec.rb b/spec/services/packages/generic/find_or_create_package_service_spec.rb index 10ec917bc99..07054fe3651 100644 --- a/spec/services/packages/generic/find_or_create_package_service_spec.rb +++ b/spec/services/packages/generic/find_or_create_package_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Packages::Generic::FindOrCreatePackageService do +RSpec.describe Packages::Generic::FindOrCreatePackageService, feature_category: :package_registry do let_it_be(:project) { create(:project) } let_it_be(:user) { create(:user) } let_it_be(:ci_build) { create(:ci_build, :running, user: user) } diff --git a/spec/services/packages/go/create_package_service_spec.rb b/spec/services/packages/go/create_package_service_spec.rb index 4ca1119fbaa..f552af81077 100644 --- a/spec/services/packages/go/create_package_service_spec.rb +++ b/spec/services/packages/go/create_package_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Packages::Go::CreatePackageService do +RSpec.describe Packages::Go::CreatePackageService, feature_category: :package_registry do let_it_be(:project) { create :project_empty_repo, path: 'my-go-lib' } let_it_be(:mod) { create :go_module, project: project } diff --git a/spec/services/packages/go/sync_packages_service_spec.rb b/spec/services/packages/go/sync_packages_service_spec.rb index 565b0f252ce..2881b6fdac9 100644 --- a/spec/services/packages/go/sync_packages_service_spec.rb +++ b/spec/services/packages/go/sync_packages_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Packages::Go::SyncPackagesService do +RSpec.describe Packages::Go::SyncPackagesService, feature_category: :package_registry do include_context 'basic Go module' let(:params) { { info: true, mod: true, zip: true } } diff --git a/spec/services/packages/helm/extract_file_metadata_service_spec.rb b/spec/services/packages/helm/extract_file_metadata_service_spec.rb index f4c61c12344..861d326d12a 100644 --- a/spec/services/packages/helm/extract_file_metadata_service_spec.rb +++ b/spec/services/packages/helm/extract_file_metadata_service_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -RSpec.describe Packages::Helm::ExtractFileMetadataService do +RSpec.describe Packages::Helm::ExtractFileMetadataService, feature_category: :package_registry do let_it_be(:package_file) { create(:helm_package_file) } let(:service) { described_class.new(package_file) } diff --git a/spec/services/packages/helm/process_file_service_spec.rb b/spec/services/packages/helm/process_file_service_spec.rb index 1be0153a4a5..a1f53e8756c 100644 --- a/spec/services/packages/helm/process_file_service_spec.rb +++ b/spec/services/packages/helm/process_file_service_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -RSpec.describe Packages::Helm::ProcessFileService do +RSpec.describe Packages::Helm::ProcessFileService, feature_category: :package_registry do let(:package) { create(:helm_package, without_package_files: true, status: 'processing') } let!(:package_file) { create(:helm_package_file, without_loaded_metadatum: true, package: package) } let(:channel) { 'stable' } diff --git a/spec/services/packages/mark_package_files_for_destruction_service_spec.rb b/spec/services/packages/mark_package_files_for_destruction_service_spec.rb index 66534338003..a00a0b79854 100644 --- a/spec/services/packages/mark_package_files_for_destruction_service_spec.rb +++ b/spec/services/packages/mark_package_files_for_destruction_service_spec.rb @@ -2,7 +2,8 @@ require 'spec_helper' -RSpec.describe Packages::MarkPackageFilesForDestructionService, :aggregate_failures do +RSpec.describe Packages::MarkPackageFilesForDestructionService, :aggregate_failures, + feature_category: :package_registry do let(:service) { described_class.new(package_files) } describe '#execute', :aggregate_failures do diff --git a/spec/services/packages/mark_package_for_destruction_service_spec.rb b/spec/services/packages/mark_package_for_destruction_service_spec.rb index 125ec53ad61..d65e62b84a6 100644 --- a/spec/services/packages/mark_package_for_destruction_service_spec.rb +++ b/spec/services/packages/mark_package_for_destruction_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Packages::MarkPackageForDestructionService do +RSpec.describe Packages::MarkPackageForDestructionService, feature_category: :package_registry do let_it_be(:user) { create(:user) } let_it_be_with_reload(:package) { create(:npm_package) } @@ -36,6 +36,12 @@ RSpec.describe Packages::MarkPackageForDestructionService do end it 'returns an error ServiceResponse' do + expect(Gitlab::ErrorTracking).to receive(:track_exception).with( + instance_of(StandardError), + project_id: package.project_id, + package_id: package.id + ) + response = service.execute expect(package).not_to receive(:sync_maven_metadata) diff --git a/spec/services/packages/mark_packages_for_destruction_service_spec.rb b/spec/services/packages/mark_packages_for_destruction_service_spec.rb index 5c043b89de8..22278f9927d 100644 --- a/spec/services/packages/mark_packages_for_destruction_service_spec.rb +++ b/spec/services/packages/mark_packages_for_destruction_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Packages::MarkPackagesForDestructionService, :sidekiq_inline do +RSpec.describe Packages::MarkPackagesForDestructionService, :sidekiq_inline, feature_category: :package_registry do let_it_be(:project) { create(:project) } let_it_be_with_reload(:packages) { create_list(:npm_package, 3, project: project) } @@ -76,6 +76,11 @@ RSpec.describe Packages::MarkPackagesForDestructionService, :sidekiq_inline do it 'returns an error ServiceResponse' do expect(::Packages::Maven::Metadata::SyncService).not_to receive(:new) + expect(Gitlab::ErrorTracking).to receive(:track_exception).with( + instance_of(StandardError), + package_ids: package_ids + ) + expect { subject }.to not_change { ::Packages::Package.pending_destruction.count } .and not_change { ::Packages::PackageFile.pending_destruction.count } diff --git a/spec/services/packages/maven/create_package_service_spec.rb b/spec/services/packages/maven/create_package_service_spec.rb index 11bf00c1399..2c528c3591e 100644 --- a/spec/services/packages/maven/create_package_service_spec.rb +++ b/spec/services/packages/maven/create_package_service_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -RSpec.describe Packages::Maven::CreatePackageService do +RSpec.describe Packages::Maven::CreatePackageService, feature_category: :package_registry do let(:project) { create(:project) } let(:user) { create(:user) } let(:app_name) { 'my-app' } diff --git a/spec/services/packages/maven/find_or_create_package_service_spec.rb b/spec/services/packages/maven/find_or_create_package_service_spec.rb index cca074e2fa6..8b84d2541eb 100644 --- a/spec/services/packages/maven/find_or_create_package_service_spec.rb +++ b/spec/services/packages/maven/find_or_create_package_service_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -RSpec.describe Packages::Maven::FindOrCreatePackageService do +RSpec.describe Packages::Maven::FindOrCreatePackageService, feature_category: :package_registry do let_it_be(:project) { create(:project) } let_it_be(:user) { create(:user) } @@ -44,6 +44,15 @@ RSpec.describe Packages::Maven::FindOrCreatePackageService do end end + shared_examples 'returning an error' do |with_message: ''| + it { expect { subject }.not_to change { project.package_files.count } } + + it 'returns an error', :aggregate_failures do + expect(subject.payload).to be_empty + expect(subject.errors).to include(with_message) + end + end + context 'path with version' do # Note that "path with version" and "file type maven metadata xml" only exists for snapshot versions # In other words, we will never have an metadata xml upload on a path with version for a non snapshot version @@ -128,11 +137,19 @@ RSpec.describe Packages::Maven::FindOrCreatePackageService do let!(:existing_package) { create(:maven_package, name: path, version: version, project: project) } - it { expect { subject }.not_to change { project.package_files.count } } + let(:existing_file_name) { file_name } + let(:jar_file) { existing_package.package_files.with_file_name_like('%.jar').first } - it 'returns an error', :aggregate_failures do - expect(subject.payload).to be_empty - expect(subject.errors).to include('Duplicate package is not allowed') + before do + jar_file.update_column(:file_name, existing_file_name) + end + + it_behaves_like 'returning an error', with_message: 'Duplicate package is not allowed' + + context 'for a SNAPSHOT version' do + let(:version) { '1.0.0-SNAPSHOT' } + + it_behaves_like 'returning an error', with_message: 'Duplicate package is not allowed' end context 'when uploading to the versionless package which contains metadata about all versions' do @@ -144,8 +161,7 @@ RSpec.describe Packages::Maven::FindOrCreatePackageService do context 'when uploading different non-duplicate files to the same package' do before do - package_file = existing_package.package_files.find_by(file_name: 'my-app-1.0-20180724.124855-1.jar') - package_file.destroy! + jar_file.destroy! end it_behaves_like 'reuse existing package' @@ -166,6 +182,27 @@ RSpec.describe Packages::Maven::FindOrCreatePackageService do it_behaves_like 'reuse existing package' end + + context 'when uploading a similar package file name with a classifier' do + let(:existing_file_name) { 'test.jar' } + let(:file_name) { 'test-javadoc.jar' } + + it_behaves_like 'reuse existing package' + + context 'for a SNAPSHOT version' do + let(:version) { '1.0.0-SNAPSHOT' } + let(:existing_file_name) { 'test-1.0-20230303.163304-1.jar' } + let(:file_name) { 'test-1.0-20230303.163304-1-javadoc.jar' } + + it_behaves_like 'reuse existing package' + end + end + end + + context 'with a very large file name' do + let(:params) { super().merge(file_name: 'a' * (described_class::MAX_FILE_NAME_LENGTH + 1)) } + + it_behaves_like 'returning an error', with_message: 'File name is too long' end end end diff --git a/spec/services/packages/maven/metadata/append_package_file_service_spec.rb b/spec/services/packages/maven/metadata/append_package_file_service_spec.rb index f3a90d31158..f65029f7b64 100644 --- a/spec/services/packages/maven/metadata/append_package_file_service_spec.rb +++ b/spec/services/packages/maven/metadata/append_package_file_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe ::Packages::Maven::Metadata::AppendPackageFileService do +RSpec.describe ::Packages::Maven::Metadata::AppendPackageFileService, feature_category: :package_registry do let_it_be(:package) { create(:maven_package, version: nil) } let(:service) { described_class.new(package: package, metadata_content: content) } diff --git a/spec/services/packages/maven/metadata/create_plugins_xml_service_spec.rb b/spec/services/packages/maven/metadata/create_plugins_xml_service_spec.rb index 6fc1087940d..d0ef037b2d9 100644 --- a/spec/services/packages/maven/metadata/create_plugins_xml_service_spec.rb +++ b/spec/services/packages/maven/metadata/create_plugins_xml_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe ::Packages::Maven::Metadata::CreatePluginsXmlService do +RSpec.describe ::Packages::Maven::Metadata::CreatePluginsXmlService, feature_category: :package_registry do let_it_be(:group_id) { 'my/test' } let_it_be(:package) { create(:maven_package, name: group_id, version: nil) } diff --git a/spec/services/packages/maven/metadata/create_versions_xml_service_spec.rb b/spec/services/packages/maven/metadata/create_versions_xml_service_spec.rb index 70c2bbad87a..6ae84b5df4e 100644 --- a/spec/services/packages/maven/metadata/create_versions_xml_service_spec.rb +++ b/spec/services/packages/maven/metadata/create_versions_xml_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe ::Packages::Maven::Metadata::CreateVersionsXmlService do +RSpec.describe ::Packages::Maven::Metadata::CreateVersionsXmlService, feature_category: :package_registry do let_it_be(:package) { create(:maven_package, version: nil) } let(:versions_in_database) { %w[1.3 2.0-SNAPSHOT 1.6 1.4 1.5-SNAPSHOT] } diff --git a/spec/services/packages/maven/metadata/sync_service_spec.rb b/spec/services/packages/maven/metadata/sync_service_spec.rb index 9a704d749b3..eaed54d959b 100644 --- a/spec/services/packages/maven/metadata/sync_service_spec.rb +++ b/spec/services/packages/maven/metadata/sync_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe ::Packages::Maven::Metadata::SyncService do +RSpec.describe ::Packages::Maven::Metadata::SyncService, feature_category: :package_registry do using RSpec::Parameterized::TableSyntax let_it_be(:project) { create(:project) } diff --git a/spec/services/packages/npm/create_package_service_spec.rb b/spec/services/packages/npm/create_package_service_spec.rb index ef8cdf2e8ab..70c79dae437 100644 --- a/spec/services/packages/npm/create_package_service_spec.rb +++ b/spec/services/packages/npm/create_package_service_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -RSpec.describe Packages::Npm::CreatePackageService do +RSpec.describe Packages::Npm::CreatePackageService, feature_category: :package_registry do let(:namespace) { create(:namespace) } let(:project) { create(:project, namespace: namespace) } let(:user) { create(:user) } diff --git a/spec/services/packages/npm/create_tag_service_spec.rb b/spec/services/packages/npm/create_tag_service_spec.rb index a4b07bf97cc..682effc9f4f 100644 --- a/spec/services/packages/npm/create_tag_service_spec.rb +++ b/spec/services/packages/npm/create_tag_service_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -RSpec.describe Packages::Npm::CreateTagService do +RSpec.describe Packages::Npm::CreateTagService, feature_category: :package_registry do let(:package) { create(:npm_package) } let(:tag_name) { 'test-tag' } diff --git a/spec/services/packages/nuget/create_dependency_service_spec.rb b/spec/services/packages/nuget/create_dependency_service_spec.rb index 268c8837e25..10daec8b871 100644 --- a/spec/services/packages/nuget/create_dependency_service_spec.rb +++ b/spec/services/packages/nuget/create_dependency_service_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -RSpec.describe Packages::Nuget::CreateDependencyService do +RSpec.describe Packages::Nuget::CreateDependencyService, feature_category: :package_registry do let_it_be(:package, reload: true) { create(:nuget_package) } describe '#execute' do diff --git a/spec/services/packages/nuget/metadata_extraction_service_spec.rb b/spec/services/packages/nuget/metadata_extraction_service_spec.rb index 12bab30b4a7..9177a5379d9 100644 --- a/spec/services/packages/nuget/metadata_extraction_service_spec.rb +++ b/spec/services/packages/nuget/metadata_extraction_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Packages::Nuget::MetadataExtractionService do +RSpec.describe Packages::Nuget::MetadataExtractionService, feature_category: :package_registry do let_it_be(:package_file) { create(:nuget_package).package_files.first } let(:service) { described_class.new(package_file.id) } diff --git a/spec/services/packages/nuget/search_service_spec.rb b/spec/services/packages/nuget/search_service_spec.rb index 66c91487a8f..b5f32c9b727 100644 --- a/spec/services/packages/nuget/search_service_spec.rb +++ b/spec/services/packages/nuget/search_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Packages::Nuget::SearchService do +RSpec.describe Packages::Nuget::SearchService, feature_category: :package_registry do let_it_be(:user) { create(:user) } let_it_be(:group) { create(:group) } let_it_be(:subgroup) { create(:group, parent: group) } diff --git a/spec/services/packages/nuget/sync_metadatum_service_spec.rb b/spec/services/packages/nuget/sync_metadatum_service_spec.rb index 32093c48b76..ae07f312fcc 100644 --- a/spec/services/packages/nuget/sync_metadatum_service_spec.rb +++ b/spec/services/packages/nuget/sync_metadatum_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Packages::Nuget::SyncMetadatumService do +RSpec.describe Packages::Nuget::SyncMetadatumService, feature_category: :package_registry do let_it_be(:package, reload: true) { create(:nuget_package) } let_it_be(:metadata) do { diff --git a/spec/services/packages/nuget/update_package_from_metadata_service_spec.rb b/spec/services/packages/nuget/update_package_from_metadata_service_spec.rb index 6a4dbeb10dc..3a13f2ff902 100644 --- a/spec/services/packages/nuget/update_package_from_metadata_service_spec.rb +++ b/spec/services/packages/nuget/update_package_from_metadata_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Packages::Nuget::UpdatePackageFromMetadataService, :clean_gitlab_redis_shared_state do +RSpec.describe Packages::Nuget::UpdatePackageFromMetadataService, :clean_gitlab_redis_shared_state, feature_category: :package_registry do include ExclusiveLeaseHelpers let!(:package) { create(:nuget_package, :processing, :with_symbol_package) } diff --git a/spec/services/packages/pypi/create_package_service_spec.rb b/spec/services/packages/pypi/create_package_service_spec.rb index 6794ab4d9d6..0d278e32e89 100644 --- a/spec/services/packages/pypi/create_package_service_spec.rb +++ b/spec/services/packages/pypi/create_package_service_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -RSpec.describe Packages::Pypi::CreatePackageService, :aggregate_failures do +RSpec.describe Packages::Pypi::CreatePackageService, :aggregate_failures, feature_category: :package_registry do include PackagesManagerApiSpecHelpers let_it_be(:project) { create(:project) } diff --git a/spec/services/packages/remove_tag_service_spec.rb b/spec/services/packages/remove_tag_service_spec.rb index 084635824e5..4ad478d487a 100644 --- a/spec/services/packages/remove_tag_service_spec.rb +++ b/spec/services/packages/remove_tag_service_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -RSpec.describe Packages::RemoveTagService do +RSpec.describe Packages::RemoveTagService, feature_category: :package_registry do let!(:package_tag) { create(:packages_tag) } describe '#execute' do diff --git a/spec/services/packages/rpm/parse_package_service_spec.rb b/spec/services/packages/rpm/parse_package_service_spec.rb index f330587bfa0..80907d8f43f 100644 --- a/spec/services/packages/rpm/parse_package_service_spec.rb +++ b/spec/services/packages/rpm/parse_package_service_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -RSpec.describe Packages::Rpm::ParsePackageService do +RSpec.describe Packages::Rpm::ParsePackageService, feature_category: :package_registry do let(:package_file) { File.open('spec/fixtures/packages/rpm/hello-0.0.1-1.fc29.x86_64.rpm') } describe 'dynamic private methods' do diff --git a/spec/services/packages/rpm/repository_metadata/build_filelist_xml_service_spec.rb b/spec/services/packages/rpm/repository_metadata/build_filelist_xml_service_spec.rb index d93d6ab9fcb..e0d9e192d97 100644 --- a/spec/services/packages/rpm/repository_metadata/build_filelist_xml_service_spec.rb +++ b/spec/services/packages/rpm/repository_metadata/build_filelist_xml_service_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -RSpec.describe Packages::Rpm::RepositoryMetadata::BuildFilelistXmlService do +RSpec.describe Packages::Rpm::RepositoryMetadata::BuildFilelistXmlService, feature_category: :package_registry do describe '#execute' do subject { described_class.new(data).execute } diff --git a/spec/services/packages/rpm/repository_metadata/build_other_xml_service_spec.rb b/spec/services/packages/rpm/repository_metadata/build_other_xml_service_spec.rb index 201f9e67ce9..e81a436e006 100644 --- a/spec/services/packages/rpm/repository_metadata/build_other_xml_service_spec.rb +++ b/spec/services/packages/rpm/repository_metadata/build_other_xml_service_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -RSpec.describe Packages::Rpm::RepositoryMetadata::BuildOtherXmlService do +RSpec.describe Packages::Rpm::RepositoryMetadata::BuildOtherXmlService, feature_category: :package_registry do describe '#execute' do subject { described_class.new(data).execute } diff --git a/spec/services/packages/rpm/repository_metadata/build_primary_xml_service_spec.rb b/spec/services/packages/rpm/repository_metadata/build_primary_xml_service_spec.rb index 9bbfa5c9863..1e534782841 100644 --- a/spec/services/packages/rpm/repository_metadata/build_primary_xml_service_spec.rb +++ b/spec/services/packages/rpm/repository_metadata/build_primary_xml_service_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -RSpec.describe Packages::Rpm::RepositoryMetadata::BuildPrimaryXmlService do +RSpec.describe Packages::Rpm::RepositoryMetadata::BuildPrimaryXmlService, feature_category: :package_registry do describe '#execute' do subject { described_class.new(data).execute } diff --git a/spec/services/packages/rpm/repository_metadata/build_repomd_xml_service_spec.rb b/spec/services/packages/rpm/repository_metadata/build_repomd_xml_service_spec.rb index cf28301fa2c..99fcf0fabbf 100644 --- a/spec/services/packages/rpm/repository_metadata/build_repomd_xml_service_spec.rb +++ b/spec/services/packages/rpm/repository_metadata/build_repomd_xml_service_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -RSpec.describe Packages::Rpm::RepositoryMetadata::BuildRepomdXmlService do +RSpec.describe Packages::Rpm::RepositoryMetadata::BuildRepomdXmlService, feature_category: :package_registry do describe '#execute' do subject { described_class.new(data).execute } diff --git a/spec/services/packages/rpm/repository_metadata/update_xml_service_spec.rb b/spec/services/packages/rpm/repository_metadata/update_xml_service_spec.rb index e351392ba1c..68a3ac7d82f 100644 --- a/spec/services/packages/rpm/repository_metadata/update_xml_service_spec.rb +++ b/spec/services/packages/rpm/repository_metadata/update_xml_service_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -RSpec.describe Packages::Rpm::RepositoryMetadata::UpdateXmlService do +RSpec.describe Packages::Rpm::RepositoryMetadata::UpdateXmlService, feature_category: :package_registry do describe '#execute' do subject { described_class.new(filename: filename, xml: xml, data: data).execute } diff --git a/spec/services/packages/rubygems/create_dependencies_service_spec.rb b/spec/services/packages/rubygems/create_dependencies_service_spec.rb index b6e12b1cc61..d689bae96ff 100644 --- a/spec/services/packages/rubygems/create_dependencies_service_spec.rb +++ b/spec/services/packages/rubygems/create_dependencies_service_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -RSpec.describe Packages::Rubygems::CreateDependenciesService do +RSpec.describe Packages::Rubygems::CreateDependenciesService, feature_category: :package_registry do include RubygemsHelpers let_it_be(:package) { create(:rubygems_package) } diff --git a/spec/services/packages/rubygems/create_gemspec_service_spec.rb b/spec/services/packages/rubygems/create_gemspec_service_spec.rb index 839fb4d955a..17890100b93 100644 --- a/spec/services/packages/rubygems/create_gemspec_service_spec.rb +++ b/spec/services/packages/rubygems/create_gemspec_service_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -RSpec.describe Packages::Rubygems::CreateGemspecService do +RSpec.describe Packages::Rubygems::CreateGemspecService, feature_category: :package_registry do include RubygemsHelpers let_it_be(:package_file) { create(:package_file, :gem) } diff --git a/spec/services/packages/rubygems/dependency_resolver_service_spec.rb b/spec/services/packages/rubygems/dependency_resolver_service_spec.rb index bb84e0cd361..9a72c51e99c 100644 --- a/spec/services/packages/rubygems/dependency_resolver_service_spec.rb +++ b/spec/services/packages/rubygems/dependency_resolver_service_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -RSpec.describe Packages::Rubygems::DependencyResolverService do +RSpec.describe Packages::Rubygems::DependencyResolverService, feature_category: :package_registry do let_it_be(:project) { create(:project, :private) } let_it_be(:package) { create(:package, project: project) } let_it_be(:user) { create(:user) } diff --git a/spec/services/packages/rubygems/metadata_extraction_service_spec.rb b/spec/services/packages/rubygems/metadata_extraction_service_spec.rb index bbd5b6f3d59..87d63eff311 100644 --- a/spec/services/packages/rubygems/metadata_extraction_service_spec.rb +++ b/spec/services/packages/rubygems/metadata_extraction_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' require 'rubygems/package' -RSpec.describe Packages::Rubygems::MetadataExtractionService do +RSpec.describe Packages::Rubygems::MetadataExtractionService, feature_category: :package_registry do include RubygemsHelpers let_it_be(:package) { create(:rubygems_package) } diff --git a/spec/services/packages/rubygems/process_gem_service_spec.rb b/spec/services/packages/rubygems/process_gem_service_spec.rb index caff338ef53..a1b4eae9655 100644 --- a/spec/services/packages/rubygems/process_gem_service_spec.rb +++ b/spec/services/packages/rubygems/process_gem_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Packages::Rubygems::ProcessGemService do +RSpec.describe Packages::Rubygems::ProcessGemService, feature_category: :package_registry do include ExclusiveLeaseHelpers include RubygemsHelpers diff --git a/spec/services/packages/terraform_module/create_package_service_spec.rb b/spec/services/packages/terraform_module/create_package_service_spec.rb index f73b5682835..3355dfcf5ec 100644 --- a/spec/services/packages/terraform_module/create_package_service_spec.rb +++ b/spec/services/packages/terraform_module/create_package_service_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -RSpec.describe Packages::TerraformModule::CreatePackageService do +RSpec.describe Packages::TerraformModule::CreatePackageService, feature_category: :package_registry do let_it_be(:namespace) { create(:namespace) } let_it_be(:project) { create(:project, namespace: namespace) } let_it_be(:user) { create(:user) } diff --git a/spec/services/packages/update_package_file_service_spec.rb b/spec/services/packages/update_package_file_service_spec.rb index d988049c43a..5d081059105 100644 --- a/spec/services/packages/update_package_file_service_spec.rb +++ b/spec/services/packages/update_package_file_service_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -RSpec.describe Packages::UpdatePackageFileService do +RSpec.describe Packages::UpdatePackageFileService, feature_category: :package_registry do let_it_be(:another_package) { create(:package) } let_it_be(:old_file_name) { 'old_file_name.txt' } let_it_be(:new_file_name) { 'new_file_name.txt' } diff --git a/spec/services/packages/update_tags_service_spec.rb b/spec/services/packages/update_tags_service_spec.rb index c4256699c94..d8f572fff32 100644 --- a/spec/services/packages/update_tags_service_spec.rb +++ b/spec/services/packages/update_tags_service_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -RSpec.describe Packages::UpdateTagsService do +RSpec.describe Packages::UpdateTagsService, feature_category: :package_registry do let_it_be(:package, reload: true) { create(:nuget_package) } let(:tags) { %w(test-tag tag1 tag2 tag3) } diff --git a/spec/services/pages/delete_service_spec.rb b/spec/services/pages/delete_service_spec.rb index 8b9e72ac9b1..590378af22b 100644 --- a/spec/services/pages/delete_service_spec.rb +++ b/spec/services/pages/delete_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Pages::DeleteService do +RSpec.describe Pages::DeleteService, feature_category: :pages do let_it_be(:admin) { create(:admin) } let(:project) { create(:project, path: "my.project") } diff --git a/spec/services/pages/migrate_legacy_storage_to_deployment_service_spec.rb b/spec/services/pages/migrate_legacy_storage_to_deployment_service_spec.rb index 177467aac85..b18f62c1c28 100644 --- a/spec/services/pages/migrate_legacy_storage_to_deployment_service_spec.rb +++ b/spec/services/pages/migrate_legacy_storage_to_deployment_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Pages::MigrateLegacyStorageToDeploymentService do +RSpec.describe Pages::MigrateLegacyStorageToDeploymentService, feature_category: :pages do let(:project) { create(:project, :repository) } let(:service) { described_class.new(project) } diff --git a/spec/services/pages/zip_directory_service_spec.rb b/spec/services/pages/zip_directory_service_spec.rb index 00fe75dbbfd..4917bc65a02 100644 --- a/spec/services/pages/zip_directory_service_spec.rb +++ b/spec/services/pages/zip_directory_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Pages::ZipDirectoryService do +RSpec.describe Pages::ZipDirectoryService, feature_category: :pages do around do |example| Dir.mktmpdir do |dir| @work_dir = dir diff --git a/spec/services/pages_domains/create_acme_order_service_spec.rb b/spec/services/pages_domains/create_acme_order_service_spec.rb index 35b2cc56973..97534d52c67 100644 --- a/spec/services/pages_domains/create_acme_order_service_spec.rb +++ b/spec/services/pages_domains/create_acme_order_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe PagesDomains::CreateAcmeOrderService do +RSpec.describe PagesDomains::CreateAcmeOrderService, feature_category: :pages do include LetsEncryptHelpers let(:pages_domain) { create(:pages_domain) } diff --git a/spec/services/pages_domains/obtain_lets_encrypt_certificate_service_spec.rb b/spec/services/pages_domains/obtain_lets_encrypt_certificate_service_spec.rb index ecb445fa441..2377fbcf003 100644 --- a/spec/services/pages_domains/obtain_lets_encrypt_certificate_service_spec.rb +++ b/spec/services/pages_domains/obtain_lets_encrypt_certificate_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe PagesDomains::ObtainLetsEncryptCertificateService do +RSpec.describe PagesDomains::ObtainLetsEncryptCertificateService, feature_category: :pages do include LetsEncryptHelpers let(:pages_domain) { create(:pages_domain, :without_certificate, :without_key) } diff --git a/spec/services/personal_access_tokens/create_service_spec.rb b/spec/services/personal_access_tokens/create_service_spec.rb index b8a4c8f30d2..d80be5cccce 100644 --- a/spec/services/personal_access_tokens/create_service_spec.rb +++ b/spec/services/personal_access_tokens/create_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe PersonalAccessTokens::CreateService do +RSpec.describe PersonalAccessTokens::CreateService, feature_category: :system_access do shared_examples_for 'a successfully created token' do it 'creates personal access token record' do expect(subject.success?).to be true @@ -40,7 +40,7 @@ RSpec.describe PersonalAccessTokens::CreateService do let(:current_user) { create(:user) } let(:user) { create(:user) } let(:params) { { name: 'Test token', impersonation: false, scopes: [:api], expires_at: Date.today + 1.month } } - let(:service) { described_class.new(current_user: current_user, target_user: user, params: params) } + let(:service) { described_class.new(current_user: current_user, target_user: user, params: params, concatenate_errors: false) } let(:token) { subject.payload[:personal_access_token] } context 'when current_user is an administrator' do @@ -66,5 +66,21 @@ RSpec.describe PersonalAccessTokens::CreateService do it_behaves_like 'a successfully created token' end end + + context 'when invalid scope' do + let(:params) { { name: 'Test token', impersonation: false, scopes: [:no_valid], expires_at: Date.today + 1.month } } + + context 'when concatenate_errors: true' do + let(:service) { described_class.new(current_user: user, target_user: user, params: params) } + + it { expect(subject.message).to be_an_instance_of(String) } + end + + context 'when concatenate_errors: false' do + let(:service) { described_class.new(current_user: user, target_user: user, params: params, concatenate_errors: false) } + + it { expect(subject.message).to be_an_instance_of(Array) } + end + end end end diff --git a/spec/services/personal_access_tokens/last_used_service_spec.rb b/spec/services/personal_access_tokens/last_used_service_spec.rb index 6fc74e27dd9..20eabc20338 100644 --- a/spec/services/personal_access_tokens/last_used_service_spec.rb +++ b/spec/services/personal_access_tokens/last_used_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe PersonalAccessTokens::LastUsedService do +RSpec.describe PersonalAccessTokens::LastUsedService, feature_category: :system_access do describe '#execute' do subject { described_class.new(personal_access_token).execute } diff --git a/spec/services/personal_access_tokens/revoke_service_spec.rb b/spec/services/personal_access_tokens/revoke_service_spec.rb index a9b4df9749f..4c5d106660a 100644 --- a/spec/services/personal_access_tokens/revoke_service_spec.rb +++ b/spec/services/personal_access_tokens/revoke_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe PersonalAccessTokens::RevokeService do +RSpec.describe PersonalAccessTokens::RevokeService, feature_category: :system_access do shared_examples_for 'a successfully revoked token' do it { expect(subject.success?).to be true } it { expect(service.token.revoked?).to be true } diff --git a/spec/services/post_receive_service_spec.rb b/spec/services/post_receive_service_spec.rb index aa955b3445b..13bd103003f 100644 --- a/spec/services/post_receive_service_spec.rb +++ b/spec/services/post_receive_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe PostReceiveService do +RSpec.describe PostReceiveService, feature_category: :team_planning do include GitlabShellHelpers include Gitlab::Routing diff --git a/spec/services/preview_markdown_service_spec.rb b/spec/services/preview_markdown_service_spec.rb index d1bc10cfd28..97e31ec2cd3 100644 --- a/spec/services/preview_markdown_service_spec.rb +++ b/spec/services/preview_markdown_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe PreviewMarkdownService do +RSpec.describe PreviewMarkdownService, feature_category: :team_planning do let(:user) { create(:user) } let(:project) { create(:project, :repository) } diff --git a/spec/services/product_analytics/build_activity_graph_service_spec.rb b/spec/services/product_analytics/build_activity_graph_service_spec.rb index e303656da34..cd1bc42e156 100644 --- a/spec/services/product_analytics/build_activity_graph_service_spec.rb +++ b/spec/services/product_analytics/build_activity_graph_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe ProductAnalytics::BuildActivityGraphService do +RSpec.describe ProductAnalytics::BuildActivityGraphService, feature_category: :product_analytics do let_it_be(:project) { create(:project) } let_it_be(:time_now) { Time.zone.now } let_it_be(:time_ago) { Time.zone.now - 5.days } diff --git a/spec/services/product_analytics/build_graph_service_spec.rb b/spec/services/product_analytics/build_graph_service_spec.rb index 933a2bfee92..ee0e2190501 100644 --- a/spec/services/product_analytics/build_graph_service_spec.rb +++ b/spec/services/product_analytics/build_graph_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe ProductAnalytics::BuildGraphService do +RSpec.describe ProductAnalytics::BuildGraphService, feature_category: :product_analytics do let_it_be(:project) { create(:project) } let_it_be(:events) do diff --git a/spec/services/projects/after_rename_service_spec.rb b/spec/services/projects/after_rename_service_spec.rb index 72bb0adbf56..3097d6d1498 100644 --- a/spec/services/projects/after_rename_service_spec.rb +++ b/spec/services/projects/after_rename_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Projects::AfterRenameService do +RSpec.describe Projects::AfterRenameService, feature_category: :projects do let(:legacy_storage) { Storage::LegacyProject.new(project) } let(:hashed_storage) { Storage::Hashed.new(project) } let!(:path_before_rename) { project.path } diff --git a/spec/services/projects/alerting/notify_service_spec.rb b/spec/services/projects/alerting/notify_service_spec.rb index aa2ef39bf98..8cd9b5d3e00 100644 --- a/spec/services/projects/alerting/notify_service_spec.rb +++ b/spec/services/projects/alerting/notify_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Projects::Alerting::NotifyService do +RSpec.describe Projects::Alerting::NotifyService, feature_category: :projects do let_it_be_with_reload(:project) { create(:project) } let(:payload) { ActionController::Parameters.new(payload_raw).permit! } diff --git a/spec/services/projects/all_issues_count_service_spec.rb b/spec/services/projects/all_issues_count_service_spec.rb index d7e35991940..e8e08a25c45 100644 --- a/spec/services/projects/all_issues_count_service_spec.rb +++ b/spec/services/projects/all_issues_count_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Projects::AllIssuesCountService, :use_clean_rails_memory_store_caching do +RSpec.describe Projects::AllIssuesCountService, :use_clean_rails_memory_store_caching, feature_category: :projects do let_it_be(:group) { create(:group, :public) } let_it_be(:project) { create(:project, :public, namespace: group) } let_it_be(:banned_user) { create(:user, :banned) } diff --git a/spec/services/projects/all_merge_requests_count_service_spec.rb b/spec/services/projects/all_merge_requests_count_service_spec.rb index 13954d688aa..dc7038611ed 100644 --- a/spec/services/projects/all_merge_requests_count_service_spec.rb +++ b/spec/services/projects/all_merge_requests_count_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Projects::AllMergeRequestsCountService, :use_clean_rails_memory_store_caching do +RSpec.describe Projects::AllMergeRequestsCountService, :use_clean_rails_memory_store_caching, feature_category: :projects do let_it_be(:project) { create(:project) } subject { described_class.new(project) } diff --git a/spec/services/projects/android_target_platform_detector_service_spec.rb b/spec/services/projects/android_target_platform_detector_service_spec.rb index 74fd320bb48..d5feef4ec3d 100644 --- a/spec/services/projects/android_target_platform_detector_service_spec.rb +++ b/spec/services/projects/android_target_platform_detector_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Projects::AndroidTargetPlatformDetectorService do +RSpec.describe Projects::AndroidTargetPlatformDetectorService, feature_category: :projects do let_it_be(:project) { build(:project) } subject { described_class.new(project).execute } diff --git a/spec/services/projects/apple_target_platform_detector_service_spec.rb b/spec/services/projects/apple_target_platform_detector_service_spec.rb index 6391161824c..787faaa0f79 100644 --- a/spec/services/projects/apple_target_platform_detector_service_spec.rb +++ b/spec/services/projects/apple_target_platform_detector_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Projects::AppleTargetPlatformDetectorService do +RSpec.describe Projects::AppleTargetPlatformDetectorService, feature_category: :projects do let_it_be(:project) { build(:project) } subject { described_class.new(project).execute } diff --git a/spec/services/projects/auto_devops/disable_service_spec.rb b/spec/services/projects/auto_devops/disable_service_spec.rb index 1f161990fb2..fd70362a53f 100644 --- a/spec/services/projects/auto_devops/disable_service_spec.rb +++ b/spec/services/projects/auto_devops/disable_service_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -RSpec.describe Projects::AutoDevops::DisableService, '#execute' do +RSpec.describe Projects::AutoDevops::DisableService, '#execute', feature_category: :auto_devops do let(:project) { create(:project, :repository, :auto_devops) } let(:auto_devops) { project.auto_devops } diff --git a/spec/services/projects/autocomplete_service_spec.rb b/spec/services/projects/autocomplete_service_spec.rb index bc95a1f3c8b..9d3075874a2 100644 --- a/spec/services/projects/autocomplete_service_spec.rb +++ b/spec/services/projects/autocomplete_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Projects::AutocompleteService do +RSpec.describe Projects::AutocompleteService, feature_category: :projects do describe '#issues' do describe 'confidential issues' do let(:author) { create(:user) } diff --git a/spec/services/projects/batch_open_issues_count_service_spec.rb b/spec/services/projects/batch_open_issues_count_service_spec.rb index 89a4abbf9c9..d29115a697f 100644 --- a/spec/services/projects/batch_open_issues_count_service_spec.rb +++ b/spec/services/projects/batch_open_issues_count_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Projects::BatchOpenIssuesCountService do +RSpec.describe Projects::BatchOpenIssuesCountService, feature_category: :projects do let!(:project_1) { create(:project) } let!(:project_2) { create(:project) } diff --git a/spec/services/projects/batch_open_merge_requests_count_service_spec.rb b/spec/services/projects/batch_open_merge_requests_count_service_spec.rb new file mode 100644 index 00000000000..96fc6c5e9dd --- /dev/null +++ b/spec/services/projects/batch_open_merge_requests_count_service_spec.rb @@ -0,0 +1,32 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe Projects::BatchOpenMergeRequestsCountService, feature_category: :code_review_workflow do + subject { described_class.new([project_1, project_2]) } + + let_it_be(:project_1) { create(:project) } + let_it_be(:project_2) { create(:project) } + + describe '#refresh_cache_and_retrieve_data', :use_clean_rails_memory_store_caching do + before do + create(:merge_request, source_project: project_1, target_project: project_1) + create(:merge_request, source_project: project_2, target_project: project_2) + end + + it 'refreshes cache keys correctly when cache is clean', :aggregate_failures do + subject.refresh_cache_and_retrieve_data + + expect(Rails.cache.read(get_cache_key(subject, project_1))).to eq(1) + expect(Rails.cache.read(get_cache_key(subject, project_2))).to eq(1) + + expect { subject.refresh_cache_and_retrieve_data }.not_to exceed_query_limit(0) + end + end + + def get_cache_key(subject, project) + subject.count_service + .new(project) + .cache_key + end +end diff --git a/spec/services/projects/blame_service_spec.rb b/spec/services/projects/blame_service_spec.rb index 52b0ed3412d..e3df69b3b7b 100644 --- a/spec/services/projects/blame_service_spec.rb +++ b/spec/services/projects/blame_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Projects::BlameService, :aggregate_failures do +RSpec.describe Projects::BlameService, :aggregate_failures, feature_category: :source_code_management do subject(:service) { described_class.new(blob, commit, params) } let_it_be(:project) { create(:project, :repository) } diff --git a/spec/services/projects/branches_by_mode_service_spec.rb b/spec/services/projects/branches_by_mode_service_spec.rb index 9a63563b37b..bfe76b34310 100644 --- a/spec/services/projects/branches_by_mode_service_spec.rb +++ b/spec/services/projects/branches_by_mode_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Projects::BranchesByModeService do +RSpec.describe Projects::BranchesByModeService, feature_category: :source_code_management do let_it_be(:user) { create(:user) } let_it_be(:project) { create(:project, :repository) } diff --git a/spec/services/projects/cleanup_service_spec.rb b/spec/services/projects/cleanup_service_spec.rb index f2c052d9397..533a09f7bc7 100644 --- a/spec/services/projects/cleanup_service_spec.rb +++ b/spec/services/projects/cleanup_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Projects::CleanupService do +RSpec.describe Projects::CleanupService, feature_category: :source_code_management do subject(:service) { described_class.new(project) } describe '.enqueue' do diff --git a/spec/services/projects/container_repository/cleanup_tags_service_spec.rb b/spec/services/projects/container_repository/cleanup_tags_service_spec.rb index 8311c4e4d9b..b8ad63d9b8a 100644 --- a/spec/services/projects/container_repository/cleanup_tags_service_spec.rb +++ b/spec/services/projects/container_repository/cleanup_tags_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Projects::ContainerRepository::CleanupTagsService do +RSpec.describe Projects::ContainerRepository::CleanupTagsService, feature_category: :container_registry do let_it_be_with_reload(:container_repository) { create(:container_repository) } let_it_be(:user) { container_repository.project.owner } @@ -77,7 +77,7 @@ RSpec.describe Projects::ContainerRepository::CleanupTagsService do context 'with a migrated repository' do before do - container_repository.update_column(:migration_state, :import_done) + allow(container_repository).to receive(:migrated?).and_return(true) end context 'supporting the gitlab api' do @@ -99,8 +99,7 @@ RSpec.describe Projects::ContainerRepository::CleanupTagsService do context 'with a non migrated repository' do before do - container_repository.update_column(:migration_state, :default) - container_repository.update!(created_at: ContainerRepository::MIGRATION_PHASE_1_ENDED_AT - 1.week) + allow(container_repository).to receive(:migrated?).and_return(false) end it_behaves_like 'calling service', ::Projects::ContainerRepository::ThirdParty::CleanupTagsService, extra_log_data: { third_party_cleanup_tags_service: true } diff --git a/spec/services/projects/container_repository/delete_tags_service_spec.rb b/spec/services/projects/container_repository/delete_tags_service_spec.rb index 9e6849aa514..5b67d614dfb 100644 --- a/spec/services/projects/container_repository/delete_tags_service_spec.rb +++ b/spec/services/projects/container_repository/delete_tags_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Projects::ContainerRepository::DeleteTagsService do +RSpec.describe Projects::ContainerRepository::DeleteTagsService, feature_category: :container_registry do using RSpec::Parameterized::TableSyntax include_context 'container repository delete tags service shared context' diff --git a/spec/services/projects/container_repository/destroy_service_spec.rb b/spec/services/projects/container_repository/destroy_service_spec.rb index fed1d13daa5..a142360f99d 100644 --- a/spec/services/projects/container_repository/destroy_service_spec.rb +++ b/spec/services/projects/container_repository/destroy_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Projects::ContainerRepository::DestroyService do +RSpec.describe Projects::ContainerRepository::DestroyService, feature_category: :container_registry do let_it_be(:user) { create(:user) } let_it_be(:project) { create(:project, :private) } let_it_be(:params) { {} } diff --git a/spec/services/projects/container_repository/gitlab/cleanup_tags_service_spec.rb b/spec/services/projects/container_repository/gitlab/cleanup_tags_service_spec.rb index b06a5709bd5..416a3ed9782 100644 --- a/spec/services/projects/container_repository/gitlab/cleanup_tags_service_spec.rb +++ b/spec/services/projects/container_repository/gitlab/cleanup_tags_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Projects::ContainerRepository::Gitlab::CleanupTagsService do +RSpec.describe Projects::ContainerRepository::Gitlab::CleanupTagsService, feature_category: :container_registry do using RSpec::Parameterized::TableSyntax include_context 'for a cleanup tags service' @@ -11,11 +11,13 @@ RSpec.describe Projects::ContainerRepository::Gitlab::CleanupTagsService do let_it_be(:user) { create(:user) } let_it_be(:project, reload: true) { create(:project, :private) } - let(:repository) { create(:container_repository, :root, :import_done, project: project) } + let(:repository) { create(:container_repository, :root, project: project) } let(:service) { described_class.new(container_repository: repository, current_user: user, params: params) } let(:tags) { %w[latest A Ba Bb C D E] } before do + allow(repository).to receive(:migrated?).and_return(true) + project.add_maintainer(user) if user stub_container_registry_config(enabled: true) @@ -147,6 +149,20 @@ RSpec.describe Projects::ContainerRepository::Gitlab::CleanupTagsService do it_behaves_like 'when running a container_expiration_policy', delete_expectations: [%w[Ba Bb C]] end + + context 'with no tags page' do + let(:tags_page_size) { 1000 } + let(:deleted) { [] } + let(:params) { {} } + + before do + allow(repository.gitlab_api_client) + .to receive(:tags) + .and_return({}) + end + + it { is_expected.to eq(expected_service_response(status: :success, deleted: [], original_size: 0)) } + end end private diff --git a/spec/services/projects/container_repository/gitlab/delete_tags_service_spec.rb b/spec/services/projects/container_repository/gitlab/delete_tags_service_spec.rb index f03912dba80..c4e6c7f4a11 100644 --- a/spec/services/projects/container_repository/gitlab/delete_tags_service_spec.rb +++ b/spec/services/projects/container_repository/gitlab/delete_tags_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Projects::ContainerRepository::Gitlab::DeleteTagsService do +RSpec.describe Projects::ContainerRepository::Gitlab::DeleteTagsService, feature_category: :container_registry do include_context 'container repository delete tags service shared context' let(:service) { described_class.new(repository, tags) } diff --git a/spec/services/projects/container_repository/third_party/cleanup_tags_service_spec.rb b/spec/services/projects/container_repository/third_party/cleanup_tags_service_spec.rb index 7227834b131..d9b30428fb5 100644 --- a/spec/services/projects/container_repository/third_party/cleanup_tags_service_spec.rb +++ b/spec/services/projects/container_repository/third_party/cleanup_tags_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Projects::ContainerRepository::ThirdParty::CleanupTagsService, :clean_gitlab_redis_cache do +RSpec.describe Projects::ContainerRepository::ThirdParty::CleanupTagsService, :clean_gitlab_redis_cache, feature_category: :container_registry do using RSpec::Parameterized::TableSyntax include_context 'for a cleanup tags service' diff --git a/spec/services/projects/container_repository/third_party/delete_tags_service_spec.rb b/spec/services/projects/container_repository/third_party/delete_tags_service_spec.rb index 4de36452684..0c297b6e1f7 100644 --- a/spec/services/projects/container_repository/third_party/delete_tags_service_spec.rb +++ b/spec/services/projects/container_repository/third_party/delete_tags_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Projects::ContainerRepository::ThirdParty::DeleteTagsService do +RSpec.describe Projects::ContainerRepository::ThirdParty::DeleteTagsService, feature_category: :container_registry do include_context 'container repository delete tags service shared context' let(:service) { described_class.new(repository, tags) } diff --git a/spec/services/projects/count_service_spec.rb b/spec/services/projects/count_service_spec.rb index 11b2b57a277..71940fa396e 100644 --- a/spec/services/projects/count_service_spec.rb +++ b/spec/services/projects/count_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Projects::CountService do +RSpec.describe Projects::CountService, feature_category: :projects do let(:project) { build(:project, id: 1) } let(:service) { described_class.new(project) } diff --git a/spec/services/projects/create_from_template_service_spec.rb b/spec/services/projects/create_from_template_service_spec.rb index fba6225b87a..a3fdb258f75 100644 --- a/spec/services/projects/create_from_template_service_spec.rb +++ b/spec/services/projects/create_from_template_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Projects::CreateFromTemplateService do +RSpec.describe Projects::CreateFromTemplateService, feature_category: :projects do let(:user) { create(:user) } let(:template_name) { 'rails' } let(:project_params) do diff --git a/spec/services/projects/deploy_tokens/create_service_spec.rb b/spec/services/projects/deploy_tokens/create_service_spec.rb index 831dbc06588..96458a51fb4 100644 --- a/spec/services/projects/deploy_tokens/create_service_spec.rb +++ b/spec/services/projects/deploy_tokens/create_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Projects::DeployTokens::CreateService do +RSpec.describe Projects::DeployTokens::CreateService, feature_category: :continuous_delivery do it_behaves_like 'a deploy token creation service' do let(:entity) { create(:project) } let(:deploy_token_class) { ProjectDeployToken } diff --git a/spec/services/projects/deploy_tokens/destroy_service_spec.rb b/spec/services/projects/deploy_tokens/destroy_service_spec.rb index edb2345aa6c..3d0323c60ba 100644 --- a/spec/services/projects/deploy_tokens/destroy_service_spec.rb +++ b/spec/services/projects/deploy_tokens/destroy_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Projects::DeployTokens::DestroyService do +RSpec.describe Projects::DeployTokens::DestroyService, feature_category: :continuous_delivery do it_behaves_like 'a deploy token deletion service' do let_it_be(:entity) { create(:project) } let_it_be(:deploy_token_class) { ProjectDeployToken } diff --git a/spec/services/projects/detect_repository_languages_service_spec.rb b/spec/services/projects/detect_repository_languages_service_spec.rb index cf4c7a5024d..5759f8128d0 100644 --- a/spec/services/projects/detect_repository_languages_service_spec.rb +++ b/spec/services/projects/detect_repository_languages_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Projects::DetectRepositoryLanguagesService, :clean_gitlab_redis_shared_state do +RSpec.describe Projects::DetectRepositoryLanguagesService, :clean_gitlab_redis_shared_state, feature_category: :projects do let_it_be(:project, reload: true) { create(:project, :repository) } subject { described_class.new(project) } diff --git a/spec/services/projects/download_service_spec.rb b/spec/services/projects/download_service_spec.rb index f158b11a9fa..52bdbefe01a 100644 --- a/spec/services/projects/download_service_spec.rb +++ b/spec/services/projects/download_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Projects::DownloadService do +RSpec.describe Projects::DownloadService, feature_category: :projects do describe 'File service' do before do @user = create(:user) diff --git a/spec/services/projects/enable_deploy_key_service_spec.rb b/spec/services/projects/enable_deploy_key_service_spec.rb index c0b3992037e..59c76a96d07 100644 --- a/spec/services/projects/enable_deploy_key_service_spec.rb +++ b/spec/services/projects/enable_deploy_key_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Projects::EnableDeployKeyService do +RSpec.describe Projects::EnableDeployKeyService, feature_category: :continuous_delivery do let(:deploy_key) { create(:deploy_key, public: true) } let(:project) { create(:project) } let(:user) { project.creator } diff --git a/spec/services/projects/fetch_statistics_increment_service_spec.rb b/spec/services/projects/fetch_statistics_increment_service_spec.rb index 16121a42c39..9e24e68fa98 100644 --- a/spec/services/projects/fetch_statistics_increment_service_spec.rb +++ b/spec/services/projects/fetch_statistics_increment_service_spec.rb @@ -3,7 +3,7 @@ require 'spec_helper' module Projects - RSpec.describe FetchStatisticsIncrementService do + RSpec.describe FetchStatisticsIncrementService, feature_category: :projects do let(:project) { create(:project) } describe '#execute' do diff --git a/spec/services/projects/fork_service_spec.rb b/spec/services/projects/fork_service_spec.rb index 48756cf774b..8f42f5c8f87 100644 --- a/spec/services/projects/fork_service_spec.rb +++ b/spec/services/projects/fork_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Projects::ForkService do +RSpec.describe Projects::ForkService, feature_category: :source_code_management do include ProjectForksHelper shared_examples 'forks count cache refresh' do diff --git a/spec/services/projects/forks/sync_service_spec.rb b/spec/services/projects/forks/sync_service_spec.rb new file mode 100644 index 00000000000..aeb53992ed4 --- /dev/null +++ b/spec/services/projects/forks/sync_service_spec.rb @@ -0,0 +1,185 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe Projects::Forks::SyncService, feature_category: :source_code_management do + include ProjectForksHelper + include RepoHelpers + + let_it_be(:user) { create(:user) } + let_it_be(:source_project) { create(:project, :repository, :public) } + let_it_be(:project) { fork_project(source_project, user, { repository: true }) } + + let(:fork_branch) { project.default_branch } + let(:service) { described_class.new(project, user, fork_branch) } + + def details + Projects::Forks::Details.new(project, fork_branch) + end + + def expect_to_cancel_exclusive_lease + expect(Gitlab::ExclusiveLease).to receive(:cancel) + end + + describe '#execute' do + context 'when fork is up-to-date with the upstream' do + it 'does not perform merge' do + expect_to_cancel_exclusive_lease + expect(project.repository).not_to receive(:merge_to_branch) + expect(project.repository).not_to receive(:ff_merge) + + expect(service.execute).to be_success + end + end + + context 'when fork is behind the upstream' do + let_it_be(:base_commit) { source_project.commit.sha } + + before_all do + source_project.repository.commit_files( + user, + branch_name: source_project.repository.root_ref, message: 'Commit to root ref', + actions: [{ action: :create, file_path: 'encoding/CHANGELOG', content: 'One more' }] + ) + + source_project.repository.commit_files( + user, + branch_name: source_project.repository.root_ref, message: 'Another commit to root ref', + actions: [{ action: :create, file_path: 'encoding/NEW-CHANGELOG', content: 'One more time' }] + ) + end + + before do + project.repository.create_branch(fork_branch, base_commit) + end + + context 'when fork is not ahead of the upstream' do + let(:fork_branch) { 'fork-without-new-commits' } + + it 'updates the fork using ff merge' do + expect_to_cancel_exclusive_lease + expect(project.commit(fork_branch).sha).to eq(base_commit) + expect(project.repository).to receive(:ff_merge) + .with(user, source_project.commit.sha, fork_branch, target_sha: base_commit) + .and_call_original + + expect do + expect(service.execute).to be_success + end.to change { details.counts }.from({ ahead: 0, behind: 2 }).to({ ahead: 0, behind: 0 }) + end + end + + context 'when fork is ahead of the upstream' do + context 'and has conflicts with the upstream', :use_clean_rails_redis_caching do + let(:fork_branch) { 'fork-with-conflicts' } + + it 'returns an error' do + project.repository.commit_files( + user, + branch_name: fork_branch, message: 'Committing something', + actions: [{ action: :create, file_path: 'encoding/CHANGELOG', content: 'New file' }] + ) + + expect_to_cancel_exclusive_lease + expect(details).not_to have_conflicts + + expect do + result = service.execute + + expect(result).to be_error + expect(result.message).to eq("9:merging commits: merge: there are conflicting files.") + end.not_to change { details.counts } + + expect(details).to have_conflicts + end + end + + context 'and does not have conflicts with the upstream' do + let(:fork_branch) { 'fork-with-new-commits' } + + it 'updates the fork using merge' do + project.repository.commit_files( + user, + branch_name: fork_branch, message: 'Committing completely new changelog', + actions: [{ action: :create, file_path: 'encoding/COMPLETELY-NEW-CHANGELOG', content: 'New file' }] + ) + + commit_message = "Merge branch #{source_project.path}:#{source_project.default_branch} into #{fork_branch}" + expect(project.repository).to receive(:merge_to_branch).with( + user, + source_sha: source_project.commit.sha, + target_branch: fork_branch, + target_sha: project.commit(fork_branch).sha, + message: commit_message + ).and_call_original + expect_to_cancel_exclusive_lease + + expect do + expect(service.execute).to be_success + end.to change { details.counts }.from({ ahead: 1, behind: 2 }).to({ ahead: 2, behind: 0 }) + + commits = project.repository.commits_between(source_project.commit.sha, project.commit(fork_branch).sha) + expect(commits.map(&:message)).to eq([ + "Committing completely new changelog", + commit_message + ]) + end + end + end + + context 'when a merge cannot happen due to another ongoing merge' do + it 'does not merge' do + expect(service).to receive(:perform_merge).and_return(nil) + + result = service.execute + + expect(result).to be_error + expect(result.message).to eq(described_class::ONGOING_MERGE_ERROR) + end + end + + context 'when upstream branch contains lfs reference' do + let(:source_project) { create(:project, :repository, :public) } + let(:project) { fork_project(source_project, user, { repository: true }) } + let(:fork_branch) { 'fork-fetches-lfs-pointers' } + + before do + source_project.change_head('lfs') + + allow(source_project).to receive(:lfs_enabled?).and_return(true) + allow(project).to receive(:lfs_enabled?).and_return(true) + + create_file_in_repo(source_project, 'lfs', 'lfs', 'one.lfs', 'One') + create_file_in_repo(source_project, 'lfs', 'lfs', 'two.lfs', 'Two') + end + + it 'links fetched lfs objects to the fork project', :aggregate_failures do + expect_to_cancel_exclusive_lease + + expect do + expect(service.execute).to be_success + end.to change { project.reload.lfs_objects.size }.from(0).to(2) + .and change { details.counts }.from({ ahead: 0, behind: 3 }).to({ ahead: 0, behind: 0 }) + + expect(project.lfs_objects).to match_array(source_project.lfs_objects) + end + + context 'and there are too many of them for a single sync' do + let(:fork_branch) { 'fork-too-many-lfs-pointers' } + + it 'updates the fork successfully' do + expect_to_cancel_exclusive_lease + stub_const('Projects::LfsPointers::LfsLinkService::MAX_OIDS', 1) + + expect do + result = service.execute + + expect(result).to be_error + expect(result.message).to eq('Too many LFS object ids to link, please push them manually') + end.not_to change { details.counts } + end + end + end + end + end +end diff --git a/spec/services/projects/forks_count_service_spec.rb b/spec/services/projects/forks_count_service_spec.rb index 31662f78973..403d8656b7c 100644 --- a/spec/services/projects/forks_count_service_spec.rb +++ b/spec/services/projects/forks_count_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Projects::ForksCountService, :use_clean_rails_memory_store_caching do +RSpec.describe Projects::ForksCountService, :use_clean_rails_memory_store_caching, feature_category: :source_code_management do let(:project) { build(:project) } subject { described_class.new(project) } diff --git a/spec/services/projects/git_deduplication_service_spec.rb b/spec/services/projects/git_deduplication_service_spec.rb index e6eff936de7..314c9d160dd 100644 --- a/spec/services/projects/git_deduplication_service_spec.rb +++ b/spec/services/projects/git_deduplication_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Projects::GitDeduplicationService do +RSpec.describe Projects::GitDeduplicationService, feature_category: :source_code_management do include ExclusiveLeaseHelpers let(:pool) { create(:pool_repository, :ready) } diff --git a/spec/services/projects/gitlab_projects_import_service_spec.rb b/spec/services/projects/gitlab_projects_import_service_spec.rb index d32e720a49f..b1468a40212 100644 --- a/spec/services/projects/gitlab_projects_import_service_spec.rb +++ b/spec/services/projects/gitlab_projects_import_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Projects::GitlabProjectsImportService do +RSpec.describe Projects::GitlabProjectsImportService, feature_category: :importers do let_it_be(:namespace) { create(:namespace) } let(:path) { 'test-path' } diff --git a/spec/services/projects/group_links/create_service_spec.rb b/spec/services/projects/group_links/create_service_spec.rb index eae898b4f68..b62fd0ecb68 100644 --- a/spec/services/projects/group_links/create_service_spec.rb +++ b/spec/services/projects/group_links/create_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Projects::GroupLinks::CreateService, '#execute' do +RSpec.describe Projects::GroupLinks::CreateService, '#execute', feature_category: :subgroups do let_it_be(:user) { create :user } let_it_be(:group) { create :group } let_it_be(:project) { create(:project, namespace: create(:namespace, :with_namespace_settings)) } diff --git a/spec/services/projects/group_links/destroy_service_spec.rb b/spec/services/projects/group_links/destroy_service_spec.rb index 89865d6bc3b..e1f915e18bd 100644 --- a/spec/services/projects/group_links/destroy_service_spec.rb +++ b/spec/services/projects/group_links/destroy_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Projects::GroupLinks::DestroyService, '#execute' do +RSpec.describe Projects::GroupLinks::DestroyService, '#execute', feature_category: :subgroups do let_it_be(:user) { create :user } let_it_be(:project) { create(:project, :private) } let_it_be(:group) { create(:group) } diff --git a/spec/services/projects/group_links/update_service_spec.rb b/spec/services/projects/group_links/update_service_spec.rb index 1acbb770763..b3336cb91fd 100644 --- a/spec/services/projects/group_links/update_service_spec.rb +++ b/spec/services/projects/group_links/update_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Projects::GroupLinks::UpdateService, '#execute' do +RSpec.describe Projects::GroupLinks::UpdateService, '#execute', feature_category: :subgroups do let_it_be(:user) { create :user } let_it_be(:group) { create :group } let_it_be(:project) { create :project } diff --git a/spec/services/projects/hashed_storage/base_attachment_service_spec.rb b/spec/services/projects/hashed_storage/base_attachment_service_spec.rb index 86e3fb3820c..01036fc2d9c 100644 --- a/spec/services/projects/hashed_storage/base_attachment_service_spec.rb +++ b/spec/services/projects/hashed_storage/base_attachment_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Projects::HashedStorage::BaseAttachmentService do +RSpec.describe Projects::HashedStorage::BaseAttachmentService, feature_category: :projects do let(:project) { create(:project, :repository, storage_version: 0, skip_disk_validation: true) } subject(:service) { described_class.new(project: project, old_disk_path: project.full_path, logger: nil) } diff --git a/spec/services/projects/hashed_storage/migrate_attachments_service_spec.rb b/spec/services/projects/hashed_storage/migrate_attachments_service_spec.rb index c8f24c6ce00..39263506bca 100644 --- a/spec/services/projects/hashed_storage/migrate_attachments_service_spec.rb +++ b/spec/services/projects/hashed_storage/migrate_attachments_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Projects::HashedStorage::MigrateAttachmentsService do +RSpec.describe Projects::HashedStorage::MigrateAttachmentsService, feature_category: :projects do subject(:service) { described_class.new(project: project, old_disk_path: project.full_path, logger: nil) } let(:project) { create(:project, :repository, storage_version: 1, skip_disk_validation: true) } diff --git a/spec/services/projects/hashed_storage/migrate_repository_service_spec.rb b/spec/services/projects/hashed_storage/migrate_repository_service_spec.rb index eb8d94ebfa5..bcc914e72b5 100644 --- a/spec/services/projects/hashed_storage/migrate_repository_service_spec.rb +++ b/spec/services/projects/hashed_storage/migrate_repository_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Projects::HashedStorage::MigrateRepositoryService do +RSpec.describe Projects::HashedStorage::MigrateRepositoryService, feature_category: :projects do let(:gitlab_shell) { Gitlab::Shell.new } let(:project) { create(:project, :legacy_storage, :repository, :wiki_repo, :design_repo) } let(:legacy_storage) { Storage::LegacyProject.new(project) } diff --git a/spec/services/projects/hashed_storage/migration_service_spec.rb b/spec/services/projects/hashed_storage/migration_service_spec.rb index ef96c17dd85..14bfa645be2 100644 --- a/spec/services/projects/hashed_storage/migration_service_spec.rb +++ b/spec/services/projects/hashed_storage/migration_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Projects::HashedStorage::MigrationService do +RSpec.describe Projects::HashedStorage::MigrationService, feature_category: :projects do let(:project) { create(:project, :empty_repo, :wiki_repo, :legacy_storage) } let(:logger) { double } let!(:project_attachment) { build(:file_uploader, project: project) } diff --git a/spec/services/projects/hashed_storage/rollback_attachments_service_spec.rb b/spec/services/projects/hashed_storage/rollback_attachments_service_spec.rb index d4cb46c82ad..95491d63df2 100644 --- a/spec/services/projects/hashed_storage/rollback_attachments_service_spec.rb +++ b/spec/services/projects/hashed_storage/rollback_attachments_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Projects::HashedStorage::RollbackAttachmentsService do +RSpec.describe Projects::HashedStorage::RollbackAttachmentsService, feature_category: :projects do subject(:service) { described_class.new(project: project, old_disk_path: project.disk_path, logger: nil) } let(:project) { create(:project, :repository, skip_disk_validation: true) } diff --git a/spec/services/projects/hashed_storage/rollback_repository_service_spec.rb b/spec/services/projects/hashed_storage/rollback_repository_service_spec.rb index 385c03e6308..19f1856e39a 100644 --- a/spec/services/projects/hashed_storage/rollback_repository_service_spec.rb +++ b/spec/services/projects/hashed_storage/rollback_repository_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Projects::HashedStorage::RollbackRepositoryService, :clean_gitlab_redis_shared_state do +RSpec.describe Projects::HashedStorage::RollbackRepositoryService, :clean_gitlab_redis_shared_state, feature_category: :projects do let(:gitlab_shell) { Gitlab::Shell.new } let(:project) { create(:project, :repository, :wiki_repo, :design_repo, storage_version: ::Project::HASHED_STORAGE_FEATURES[:repository]) } let(:legacy_storage) { Storage::LegacyProject.new(project) } diff --git a/spec/services/projects/hashed_storage/rollback_service_spec.rb b/spec/services/projects/hashed_storage/rollback_service_spec.rb index 0bd63f2da2a..6d047f856ec 100644 --- a/spec/services/projects/hashed_storage/rollback_service_spec.rb +++ b/spec/services/projects/hashed_storage/rollback_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Projects::HashedStorage::RollbackService do +RSpec.describe Projects::HashedStorage::RollbackService, feature_category: :projects do let(:project) { create(:project, :empty_repo, :wiki_repo) } let(:logger) { double } let!(:project_attachment) { build(:file_uploader, project: project) } diff --git a/spec/services/projects/import_error_filter_spec.rb b/spec/services/projects/import_error_filter_spec.rb index fd31cd52cc4..be07208c7f2 100644 --- a/spec/services/projects/import_error_filter_spec.rb +++ b/spec/services/projects/import_error_filter_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Projects::ImportErrorFilter do +RSpec.describe Projects::ImportErrorFilter, feature_category: :importers do it 'filters any full paths' do message = 'Error importing into /my/folder Permission denied @ unlink_internal - /var/opt/gitlab/gitlab-rails/shared/a/b/c/uploads/file' diff --git a/spec/services/projects/import_export/relation_export_service_spec.rb b/spec/services/projects/import_export/relation_export_service_spec.rb index 94f5653ee7d..4b44a37b299 100644 --- a/spec/services/projects/import_export/relation_export_service_spec.rb +++ b/spec/services/projects/import_export/relation_export_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Projects::ImportExport::RelationExportService do +RSpec.describe Projects::ImportExport::RelationExportService, feature_category: :importers do using RSpec::Parameterized::TableSyntax subject(:service) { described_class.new(relation_export, 'jid') } @@ -49,6 +49,7 @@ RSpec.describe Projects::ImportExport::RelationExportService do expect(logger).to receive(:error).with( export_error: '', message: 'Project relation export failed', + relation: relation_export.relation, project_export_job_id: project_export_job.id, project_id: project_export_job.project.id, project_name: project_export_job.project.name @@ -78,6 +79,7 @@ RSpec.describe Projects::ImportExport::RelationExportService do expect(logger).to receive(:error).with( export_error: 'Error!', message: 'Project relation export failed', + relation: relation_export.relation, project_export_job_id: project_export_job.id, project_id: project_export_job.project.id, project_name: project_export_job.project.name diff --git a/spec/services/projects/in_product_marketing_campaign_emails_service_spec.rb b/spec/services/projects/in_product_marketing_campaign_emails_service_spec.rb index 4c51c8a4ac8..4ad6fd0edff 100644 --- a/spec/services/projects/in_product_marketing_campaign_emails_service_spec.rb +++ b/spec/services/projects/in_product_marketing_campaign_emails_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Projects::InProductMarketingCampaignEmailsService do +RSpec.describe Projects::InProductMarketingCampaignEmailsService, feature_category: :experimentation_adoption do describe '#execute' do let(:user) { create(:user, email_opted_in: true) } let(:project) { create(:project) } diff --git a/spec/services/projects/lfs_pointers/lfs_download_link_list_service_spec.rb b/spec/services/projects/lfs_pointers/lfs_download_link_list_service_spec.rb index 80b3c4d0403..0aaaae19f5a 100644 --- a/spec/services/projects/lfs_pointers/lfs_download_link_list_service_spec.rb +++ b/spec/services/projects/lfs_pointers/lfs_download_link_list_service_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -RSpec.describe Projects::LfsPointers::LfsDownloadLinkListService do +RSpec.describe Projects::LfsPointers::LfsDownloadLinkListService, feature_category: :source_code_management do let(:import_url) { 'http://www.gitlab.com/demo/repo.git' } let(:lfs_endpoint) { "#{import_url}/info/lfs/objects/batch" } let!(:project) { create(:project, import_url: import_url) } diff --git a/spec/services/projects/lfs_pointers/lfs_download_service_spec.rb b/spec/services/projects/lfs_pointers/lfs_download_service_spec.rb index c815ad38843..00c156ba538 100644 --- a/spec/services/projects/lfs_pointers/lfs_download_service_spec.rb +++ b/spec/services/projects/lfs_pointers/lfs_download_service_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -RSpec.describe Projects::LfsPointers::LfsDownloadService do +RSpec.describe Projects::LfsPointers::LfsDownloadService, feature_category: :source_code_management do include StubRequests let_it_be(:project) { create(:project) } diff --git a/spec/services/projects/lfs_pointers/lfs_import_service_spec.rb b/spec/services/projects/lfs_pointers/lfs_import_service_spec.rb index 32b86ade81e..f1e4db55962 100644 --- a/spec/services/projects/lfs_pointers/lfs_import_service_spec.rb +++ b/spec/services/projects/lfs_pointers/lfs_import_service_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -RSpec.describe Projects::LfsPointers::LfsImportService do +RSpec.describe Projects::LfsPointers::LfsImportService, feature_category: :source_code_management do let(:project) { create(:project) } let(:user) { project.creator } let(:import_url) { 'http://www.gitlab.com/demo/repo.git' } diff --git a/spec/services/projects/lfs_pointers/lfs_link_service_spec.rb b/spec/services/projects/lfs_pointers/lfs_link_service_spec.rb index 0e7d16f18e8..e8a08d95bba 100644 --- a/spec/services/projects/lfs_pointers/lfs_link_service_spec.rb +++ b/spec/services/projects/lfs_pointers/lfs_link_service_spec.rb @@ -1,9 +1,10 @@ # frozen_string_literal: true require 'spec_helper' -RSpec.describe Projects::LfsPointers::LfsLinkService do - let!(:project) { create(:project, lfs_enabled: true) } - let!(:lfs_objects_project) { create_list(:lfs_objects_project, 2, project: project) } +RSpec.describe Projects::LfsPointers::LfsLinkService, feature_category: :source_code_management do + let_it_be(:project) { create(:project, lfs_enabled: true) } + let_it_be(:lfs_objects_project) { create_list(:lfs_objects_project, 2, project: project) } + let(:new_oids) { { 'oid1' => 123, 'oid2' => 125 } } let(:all_oids) { LfsObject.pluck(:oid, :size).to_h.merge(new_oids) } let(:new_lfs_object) { create(:lfs_object) } @@ -17,12 +18,26 @@ RSpec.describe Projects::LfsPointers::LfsLinkService do describe '#execute' do it 'raises an error when trying to link too many objects at once' do + stub_const("#{described_class}::MAX_OIDS", 5) + oids = Array.new(described_class::MAX_OIDS) { |i| "oid-#{i}" } oids << 'the straw' expect { subject.execute(oids) }.to raise_error(described_class::TooManyOidsError) end + it 'executes a block after validation and before execution' do + block = instance_double(Proc) + + expect(subject).to receive(:validate!).ordered + expect(block).to receive(:call).ordered + expect(subject).to receive(:link_existing_lfs_objects).ordered + + subject.execute([]) do + block.call + end + end + it 'links existing lfs objects to the project' do expect(project.lfs_objects.count).to eq 2 diff --git a/spec/services/projects/lfs_pointers/lfs_object_download_list_service_spec.rb b/spec/services/projects/lfs_pointers/lfs_object_download_list_service_spec.rb index 59eb1ed7a29..f5dcae05959 100644 --- a/spec/services/projects/lfs_pointers/lfs_object_download_list_service_spec.rb +++ b/spec/services/projects/lfs_pointers/lfs_object_download_list_service_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -RSpec.describe Projects::LfsPointers::LfsObjectDownloadListService do +RSpec.describe Projects::LfsPointers::LfsObjectDownloadListService, feature_category: :source_code_management do let(:import_url) { 'http://www.gitlab.com/demo/repo.git' } let(:default_endpoint) { "#{import_url}/info/lfs/objects/batch" } let(:group) { create(:group, lfs_enabled: true) } diff --git a/spec/services/projects/move_access_service_spec.rb b/spec/services/projects/move_access_service_spec.rb index 45e10c3ca84..b9244002f6c 100644 --- a/spec/services/projects/move_access_service_spec.rb +++ b/spec/services/projects/move_access_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Projects::MoveAccessService do +RSpec.describe Projects::MoveAccessService, feature_category: :projects do let(:user) { create(:user) } let(:group) { create(:group) } let(:project_with_access) { create(:project, namespace: user.namespace) } diff --git a/spec/services/projects/move_deploy_keys_projects_service_spec.rb b/spec/services/projects/move_deploy_keys_projects_service_spec.rb index 59674a3a4ef..b40eb4a18d1 100644 --- a/spec/services/projects/move_deploy_keys_projects_service_spec.rb +++ b/spec/services/projects/move_deploy_keys_projects_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Projects::MoveDeployKeysProjectsService do +RSpec.describe Projects::MoveDeployKeysProjectsService, feature_category: :continuous_delivery do let!(:user) { create(:user) } let!(:project_with_deploy_keys) { create(:project, namespace: user.namespace) } let!(:target_project) { create(:project, namespace: user.namespace) } diff --git a/spec/services/projects/move_forks_service_spec.rb b/spec/services/projects/move_forks_service_spec.rb index 7d3637b7758..093562207dd 100644 --- a/spec/services/projects/move_forks_service_spec.rb +++ b/spec/services/projects/move_forks_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Projects::MoveForksService do +RSpec.describe Projects::MoveForksService, feature_category: :source_code_management do include ProjectForksHelper let!(:user) { create(:user) } diff --git a/spec/services/projects/move_lfs_objects_projects_service_spec.rb b/spec/services/projects/move_lfs_objects_projects_service_spec.rb index e3df5fed9cf..f3cc4014b1c 100644 --- a/spec/services/projects/move_lfs_objects_projects_service_spec.rb +++ b/spec/services/projects/move_lfs_objects_projects_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Projects::MoveLfsObjectsProjectsService do +RSpec.describe Projects::MoveLfsObjectsProjectsService, feature_category: :source_code_management do let!(:user) { create(:user) } let!(:project_with_lfs_objects) { create(:project, namespace: user.namespace) } let!(:target_project) { create(:project, namespace: user.namespace) } diff --git a/spec/services/projects/move_notification_settings_service_spec.rb b/spec/services/projects/move_notification_settings_service_spec.rb index e381ae7590f..5ef6e8a0647 100644 --- a/spec/services/projects/move_notification_settings_service_spec.rb +++ b/spec/services/projects/move_notification_settings_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Projects::MoveNotificationSettingsService do +RSpec.describe Projects::MoveNotificationSettingsService, feature_category: :projects do let(:user) { create(:user) } let(:project_with_notifications) { create(:project, namespace: user.namespace) } let(:target_project) { create(:project, namespace: user.namespace) } diff --git a/spec/services/projects/move_project_authorizations_service_spec.rb b/spec/services/projects/move_project_authorizations_service_spec.rb index d47b13ca939..6cd0b056325 100644 --- a/spec/services/projects/move_project_authorizations_service_spec.rb +++ b/spec/services/projects/move_project_authorizations_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Projects::MoveProjectAuthorizationsService do +RSpec.describe Projects::MoveProjectAuthorizationsService, feature_category: :projects do let!(:user) { create(:user) } let(:project_with_users) { create(:project, namespace: user.namespace) } let(:target_project) { create(:project, namespace: user.namespace) } diff --git a/spec/services/projects/move_project_group_links_service_spec.rb b/spec/services/projects/move_project_group_links_service_spec.rb index 1fca96a0367..cfd4b51b001 100644 --- a/spec/services/projects/move_project_group_links_service_spec.rb +++ b/spec/services/projects/move_project_group_links_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Projects::MoveProjectGroupLinksService do +RSpec.describe Projects::MoveProjectGroupLinksService, feature_category: :projects do let!(:user) { create(:user) } let(:project_with_groups) { create(:project, namespace: user.namespace) } let(:target_project) { create(:project, namespace: user.namespace) } diff --git a/spec/services/projects/move_project_members_service_spec.rb b/spec/services/projects/move_project_members_service_spec.rb index 8fbd0ba3270..364fb7faaf2 100644 --- a/spec/services/projects/move_project_members_service_spec.rb +++ b/spec/services/projects/move_project_members_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Projects::MoveProjectMembersService do +RSpec.describe Projects::MoveProjectMembersService, feature_category: :projects do let!(:user) { create(:user) } let(:project_with_users) { create(:project, namespace: user.namespace) } let(:target_project) { create(:project, namespace: user.namespace) } diff --git a/spec/services/projects/move_users_star_projects_service_spec.rb b/spec/services/projects/move_users_star_projects_service_spec.rb index b580d3d8772..b99e51d954b 100644 --- a/spec/services/projects/move_users_star_projects_service_spec.rb +++ b/spec/services/projects/move_users_star_projects_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Projects::MoveUsersStarProjectsService do +RSpec.describe Projects::MoveUsersStarProjectsService, feature_category: :projects do let!(:user) { create(:user) } let!(:project_with_stars) { create(:project, namespace: user.namespace) } let!(:target_project) { create(:project, namespace: user.namespace) } diff --git a/spec/services/projects/open_issues_count_service_spec.rb b/spec/services/projects/open_issues_count_service_spec.rb index c739fea5ecf..89405f06f5d 100644 --- a/spec/services/projects/open_issues_count_service_spec.rb +++ b/spec/services/projects/open_issues_count_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Projects::OpenIssuesCountService, :use_clean_rails_memory_store_caching do +RSpec.describe Projects::OpenIssuesCountService, :use_clean_rails_memory_store_caching, feature_category: :team_planning do let(:project) { create(:project) } subject { described_class.new(project) } diff --git a/spec/services/projects/open_merge_requests_count_service_spec.rb b/spec/services/projects/open_merge_requests_count_service_spec.rb index 6caef181e77..74eead39ec4 100644 --- a/spec/services/projects/open_merge_requests_count_service_spec.rb +++ b/spec/services/projects/open_merge_requests_count_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Projects::OpenMergeRequestsCountService, :use_clean_rails_memory_store_caching do +RSpec.describe Projects::OpenMergeRequestsCountService, :use_clean_rails_memory_store_caching, feature_category: :code_review_workflow do let_it_be(:project) { create(:project) } subject { described_class.new(project) } diff --git a/spec/services/projects/operations/update_service_spec.rb b/spec/services/projects/operations/update_service_spec.rb index 95f2176dbc0..7babaf4d0d8 100644 --- a/spec/services/projects/operations/update_service_spec.rb +++ b/spec/services/projects/operations/update_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Projects::Operations::UpdateService do +RSpec.describe Projects::Operations::UpdateService, feature_category: :projects do let_it_be_with_refind(:project) { create(:project) } let_it_be(:user) { create(:user) } diff --git a/spec/services/projects/overwrite_project_service_spec.rb b/spec/services/projects/overwrite_project_service_spec.rb index 7038910508f..b4faf45a1cb 100644 --- a/spec/services/projects/overwrite_project_service_spec.rb +++ b/spec/services/projects/overwrite_project_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Projects::OverwriteProjectService do +RSpec.describe Projects::OverwriteProjectService, feature_category: :projects do include ProjectForksHelper let(:user) { create(:user) } diff --git a/spec/services/projects/participants_service_spec.rb b/spec/services/projects/participants_service_spec.rb index fc745cd669f..bd297343879 100644 --- a/spec/services/projects/participants_service_spec.rb +++ b/spec/services/projects/participants_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Projects::ParticipantsService do +RSpec.describe Projects::ParticipantsService, feature_category: :projects do describe '#execute' do let_it_be(:user) { create(:user) } let_it_be(:project) { create(:project, :public) } diff --git a/spec/services/projects/prometheus/alerts/notify_service_spec.rb b/spec/services/projects/prometheus/alerts/notify_service_spec.rb index 43d23023d83..d747cc4b424 100644 --- a/spec/services/projects/prometheus/alerts/notify_service_spec.rb +++ b/spec/services/projects/prometheus/alerts/notify_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Projects::Prometheus::Alerts::NotifyService do +RSpec.describe Projects::Prometheus::Alerts::NotifyService, feature_category: :metrics do include PrometheusHelpers using RSpec::Parameterized::TableSyntax diff --git a/spec/services/projects/prometheus/metrics/destroy_service_spec.rb b/spec/services/projects/prometheus/metrics/destroy_service_spec.rb index b4af81f2c87..4c2a959a149 100644 --- a/spec/services/projects/prometheus/metrics/destroy_service_spec.rb +++ b/spec/services/projects/prometheus/metrics/destroy_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Projects::Prometheus::Metrics::DestroyService do +RSpec.describe Projects::Prometheus::Metrics::DestroyService, feature_category: :metrics do let(:metric) { create(:prometheus_metric) } subject { described_class.new(metric) } diff --git a/spec/services/projects/protect_default_branch_service_spec.rb b/spec/services/projects/protect_default_branch_service_spec.rb index 9f9e89ff8f8..21743e2a656 100644 --- a/spec/services/projects/protect_default_branch_service_spec.rb +++ b/spec/services/projects/protect_default_branch_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Projects::ProtectDefaultBranchService do +RSpec.describe Projects::ProtectDefaultBranchService, feature_category: :source_code_management do let(:service) { described_class.new(project) } let(:project) { create(:project) } diff --git a/spec/services/projects/readme_renderer_service_spec.rb b/spec/services/projects/readme_renderer_service_spec.rb index 14cdcf67640..58b967b7e9c 100644 --- a/spec/services/projects/readme_renderer_service_spec.rb +++ b/spec/services/projects/readme_renderer_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Projects::ReadmeRendererService, '#execute' do +RSpec.describe Projects::ReadmeRendererService, '#execute', feature_category: :projects do using RSpec::Parameterized::TableSyntax subject(:service) { described_class.new(project, nil, opts) } diff --git a/spec/services/projects/record_target_platforms_service_spec.rb b/spec/services/projects/record_target_platforms_service_spec.rb index 22ff325a62e..dd4e9fe19e0 100644 --- a/spec/services/projects/record_target_platforms_service_spec.rb +++ b/spec/services/projects/record_target_platforms_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Projects::RecordTargetPlatformsService, '#execute' do +RSpec.describe Projects::RecordTargetPlatformsService, '#execute', feature_category: :projects do let_it_be(:project) { create(:project) } let(:detector_service) { Projects::AppleTargetPlatformDetectorService } diff --git a/spec/services/projects/refresh_build_artifacts_size_statistics_service_spec.rb b/spec/services/projects/refresh_build_artifacts_size_statistics_service_spec.rb index 62330441d2f..591cd1cba8d 100644 --- a/spec/services/projects/refresh_build_artifacts_size_statistics_service_spec.rb +++ b/spec/services/projects/refresh_build_artifacts_size_statistics_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Projects::RefreshBuildArtifactsSizeStatisticsService, :clean_gitlab_redis_shared_state do +RSpec.describe Projects::RefreshBuildArtifactsSizeStatisticsService, :clean_gitlab_redis_shared_state, feature_category: :build_artifacts do let(:service) { described_class.new } describe '#execute' do diff --git a/spec/services/projects/repository_languages_service_spec.rb b/spec/services/projects/repository_languages_service_spec.rb index 50d5fba6b84..a02844309b2 100644 --- a/spec/services/projects/repository_languages_service_spec.rb +++ b/spec/services/projects/repository_languages_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Projects::RepositoryLanguagesService do +RSpec.describe Projects::RepositoryLanguagesService, feature_category: :source_code_management do let(:service) { described_class.new(project, project.first_owner) } context 'when detected_repository_languages flag is set' do diff --git a/spec/services/projects/schedule_bulk_repository_shard_moves_service_spec.rb b/spec/services/projects/schedule_bulk_repository_shard_moves_service_spec.rb index 76830396104..3d89f6efa6f 100644 --- a/spec/services/projects/schedule_bulk_repository_shard_moves_service_spec.rb +++ b/spec/services/projects/schedule_bulk_repository_shard_moves_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Projects::ScheduleBulkRepositoryShardMovesService do +RSpec.describe Projects::ScheduleBulkRepositoryShardMovesService, feature_category: :source_code_management do it_behaves_like 'moves repository shard in bulk' do let_it_be_with_reload(:container) { create(:project, :repository) } diff --git a/spec/services/projects/transfer_service_spec.rb b/spec/services/projects/transfer_service_spec.rb index 32818535146..755ee795ebe 100644 --- a/spec/services/projects/transfer_service_spec.rb +++ b/spec/services/projects/transfer_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Projects::TransferService do +RSpec.describe Projects::TransferService, feature_category: :projects do let_it_be(:group) { create(:group) } let_it_be(:user) { create(:user) } let_it_be(:group_integration) { create(:integrations_slack, :group, group: group, webhook: 'http://group.slack.com') } diff --git a/spec/services/projects/unlink_fork_service_spec.rb b/spec/services/projects/unlink_fork_service_spec.rb index d939a79b7e9..f9fb1f65550 100644 --- a/spec/services/projects/unlink_fork_service_spec.rb +++ b/spec/services/projects/unlink_fork_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Projects::UnlinkForkService, :use_clean_rails_memory_store_caching do +RSpec.describe Projects::UnlinkForkService, :use_clean_rails_memory_store_caching, feature_category: :source_code_management do include ProjectForksHelper subject { described_class.new(forked_project, user) } diff --git a/spec/services/projects/update_pages_service_spec.rb b/spec/services/projects/update_pages_service_spec.rb index d908a169898..8157dce4ce8 100644 --- a/spec/services/projects/update_pages_service_spec.rb +++ b/spec/services/projects/update_pages_service_spec.rb @@ -2,7 +2,7 @@ require "spec_helper" -RSpec.describe Projects::UpdatePagesService do +RSpec.describe Projects::UpdatePagesService, feature_category: :pages do let_it_be(:project, refind: true) { create(:project, :repository) } let_it_be(:old_pipeline) { create(:ci_pipeline, project: project, sha: project.commit('HEAD').sha) } diff --git a/spec/services/projects/update_remote_mirror_service_spec.rb b/spec/services/projects/update_remote_mirror_service_spec.rb index 547641867bc..b65f7a50e4c 100644 --- a/spec/services/projects/update_remote_mirror_service_spec.rb +++ b/spec/services/projects/update_remote_mirror_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Projects::UpdateRemoteMirrorService do +RSpec.describe Projects::UpdateRemoteMirrorService, feature_category: :source_code_management do let_it_be(:project) { create(:project, :repository, lfs_enabled: true) } let_it_be(:remote_project) { create(:forked_project_with_submodules) } let_it_be(:remote_mirror) { create(:remote_mirror, project: project, enabled: true) } diff --git a/spec/services/projects/update_repository_storage_service_spec.rb b/spec/services/projects/update_repository_storage_service_spec.rb index ee8f7fb2ef2..af920d51776 100644 --- a/spec/services/projects/update_repository_storage_service_spec.rb +++ b/spec/services/projects/update_repository_storage_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Projects::UpdateRepositoryStorageService do +RSpec.describe Projects::UpdateRepositoryStorageService, feature_category: :source_code_management do include Gitlab::ShellAdapter subject { described_class.new(repository_storage_move) } diff --git a/spec/services/projects/update_service_spec.rb b/spec/services/projects/update_service_spec.rb index 3cda6bc2627..bdb2e6e09e5 100644 --- a/spec/services/projects/update_service_spec.rb +++ b/spec/services/projects/update_service_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -RSpec.describe Projects::UpdateService do +RSpec.describe Projects::UpdateService, feature_category: :projects do include ExternalAuthorizationServiceHelpers include ProjectForksHelper @@ -227,48 +227,16 @@ RSpec.describe Projects::UpdateService do let(:user) { project.first_owner } let(:forked_project) { fork_project(project) } - context 'and unlink forks feature flag is off' do - before do - stub_feature_flags(unlink_fork_network_upon_visibility_decrease: false) - end - - it 'updates forks visibility level when parent set to more restrictive' do - opts = { visibility_level: Gitlab::VisibilityLevel::PRIVATE } - - expect(project).to be_internal - expect(forked_project).to be_internal - - expect(update_project(project, user, opts)).to eq({ status: :success }) - - expect(project).to be_private - expect(forked_project.reload).to be_private - end - - it 'does not update forks visibility level when parent set to less restrictive' do - opts = { visibility_level: Gitlab::VisibilityLevel::PUBLIC } + it 'does not change visibility of forks' do + opts = { visibility_level: Gitlab::VisibilityLevel::PRIVATE } - expect(project).to be_internal - expect(forked_project).to be_internal + expect(project).to be_internal + expect(forked_project).to be_internal - expect(update_project(project, user, opts)).to eq({ status: :success }) + expect(update_project(project, user, opts)).to eq({ status: :success }) - expect(project).to be_public - expect(forked_project.reload).to be_internal - end - end - - context 'and unlink forks feature flag is on' do - it 'does not change visibility of forks' do - opts = { visibility_level: Gitlab::VisibilityLevel::PRIVATE } - - expect(project).to be_internal - expect(forked_project).to be_internal - - expect(update_project(project, user, opts)).to eq({ status: :success }) - - expect(project).to be_private - expect(forked_project.reload).to be_internal - end + expect(project).to be_private + expect(forked_project.reload).to be_internal end end @@ -794,6 +762,112 @@ RSpec.describe Projects::UpdateService do expect(project.topic_list).to eq(%w[tag_list]) end end + + describe 'when updating pages unique domain', feature_category: :pages do + let(:group) { create(:group, path: 'group') } + let(:project) { create(:project, path: 'project', group: group) } + + context 'with pages_unique_domain feature flag disabled' do + before do + stub_feature_flags(pages_unique_domain: false) + end + + it 'does not change pages unique domain' do + expect(project) + .to receive(:update) + .with({ project_setting_attributes: { has_confluence: true } }) + .and_call_original + + expect do + update_project(project, user, project_setting_attributes: { + has_confluence: true, + pages_unique_domain_enabled: true + }) + end.not_to change { project.project_setting.pages_unique_domain_enabled } + end + + it 'does not remove other attributes' do + expect(project) + .to receive(:update) + .with({ name: 'True' }) + .and_call_original + + update_project(project, user, name: 'True') + end + end + + context 'with pages_unique_domain feature flag enabled' do + before do + stub_feature_flags(pages_unique_domain: true) + end + + it 'updates project pages unique domain' do + expect do + update_project(project, user, project_setting_attributes: { + pages_unique_domain_enabled: true + }) + end.to change { project.project_setting.pages_unique_domain_enabled } + + expect(project.project_setting.pages_unique_domain_enabled).to eq true + expect(project.project_setting.pages_unique_domain).to match %r{project-group-\w+} + end + + it 'does not changes unique domain when it already exists' do + project.project_setting.update!( + pages_unique_domain_enabled: false, + pages_unique_domain: 'unique-domain' + ) + + expect do + update_project(project, user, project_setting_attributes: { + pages_unique_domain_enabled: true + }) + end.to change { project.project_setting.pages_unique_domain_enabled } + + expect(project.project_setting.pages_unique_domain_enabled).to eq true + expect(project.project_setting.pages_unique_domain).to eq 'unique-domain' + end + + it 'does not changes unique domain when it disabling unique domain' do + project.project_setting.update!( + pages_unique_domain_enabled: true, + pages_unique_domain: 'unique-domain' + ) + + expect do + update_project(project, user, project_setting_attributes: { + pages_unique_domain_enabled: false + }) + end.not_to change { project.project_setting.pages_unique_domain } + + expect(project.project_setting.pages_unique_domain_enabled).to eq false + expect(project.project_setting.pages_unique_domain).to eq 'unique-domain' + end + + context 'when there is another project with the unique domain' do + it 'fails pages unique domain already exists' do + create( + :project_setting, + pages_unique_domain_enabled: true, + pages_unique_domain: 'unique-domain' + ) + + allow(Gitlab::Pages::RandomDomain) + .to receive(:generate) + .and_return('unique-domain') + + result = update_project(project, user, project_setting_attributes: { + pages_unique_domain_enabled: true + }) + + expect(result).to eq( + status: :error, + message: 'Project setting pages unique domain has already been taken' + ) + end + end + end + end end describe '#run_auto_devops_pipeline?' do diff --git a/spec/services/projects/update_statistics_service_spec.rb b/spec/services/projects/update_statistics_service_spec.rb index 1cc69e7e2fe..313e1c29cd2 100644 --- a/spec/services/projects/update_statistics_service_spec.rb +++ b/spec/services/projects/update_statistics_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Projects::UpdateStatisticsService do +RSpec.describe Projects::UpdateStatisticsService, feature_category: :projects do using RSpec::Parameterized::TableSyntax let(:service) { described_class.new(project, nil, statistics: statistics) } diff --git a/spec/services/prometheus/proxy_service_spec.rb b/spec/services/prometheus/proxy_service_spec.rb index b78683cace7..f71662f62ad 100644 --- a/spec/services/prometheus/proxy_service_spec.rb +++ b/spec/services/prometheus/proxy_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Prometheus::ProxyService do +RSpec.describe Prometheus::ProxyService, feature_category: :metrics do include ReactiveCachingHelpers let_it_be(:project) { create(:project) } diff --git a/spec/services/prometheus/proxy_variable_substitution_service_spec.rb b/spec/services/prometheus/proxy_variable_substitution_service_spec.rb index d8c1fdffb98..fbee4b9c7d7 100644 --- a/spec/services/prometheus/proxy_variable_substitution_service_spec.rb +++ b/spec/services/prometheus/proxy_variable_substitution_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Prometheus::ProxyVariableSubstitutionService do +RSpec.describe Prometheus::ProxyVariableSubstitutionService, feature_category: :metrics do describe '#execute' do let_it_be(:environment) { create(:environment) } diff --git a/spec/services/protected_branches/api_service_spec.rb b/spec/services/protected_branches/api_service_spec.rb index c98e253267b..f7f5f451a49 100644 --- a/spec/services/protected_branches/api_service_spec.rb +++ b/spec/services/protected_branches/api_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe ProtectedBranches::ApiService do +RSpec.describe ProtectedBranches::ApiService, feature_category: :compliance_management do shared_examples 'execute with entity' do it 'creates a protected branch with prefilled defaults' do expect(::ProtectedBranches::CreateService).to receive(:new).with( diff --git a/spec/services/protected_branches/cache_service_spec.rb b/spec/services/protected_branches/cache_service_spec.rb index ea434922661..3aa3b56640b 100644 --- a/spec/services/protected_branches/cache_service_spec.rb +++ b/spec/services/protected_branches/cache_service_spec.rb @@ -3,7 +3,7 @@ # require 'spec_helper' -RSpec.describe ProtectedBranches::CacheService, :clean_gitlab_redis_cache do +RSpec.describe ProtectedBranches::CacheService, :clean_gitlab_redis_cache, feature_category: :compliance_management do shared_examples 'execute with entity' do subject(:service) { described_class.new(entity, user) } diff --git a/spec/services/protected_branches/destroy_service_spec.rb b/spec/services/protected_branches/destroy_service_spec.rb index 421d4aae5bb..e02b4475c02 100644 --- a/spec/services/protected_branches/destroy_service_spec.rb +++ b/spec/services/protected_branches/destroy_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe ProtectedBranches::DestroyService do +RSpec.describe ProtectedBranches::DestroyService, feature_category: :compliance_management do shared_examples 'execute with entity' do subject(:service) { described_class.new(entity, user) } diff --git a/spec/services/protected_branches/update_service_spec.rb b/spec/services/protected_branches/update_service_spec.rb index c70cc032a6a..8b11604aa15 100644 --- a/spec/services/protected_branches/update_service_spec.rb +++ b/spec/services/protected_branches/update_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe ProtectedBranches::UpdateService do +RSpec.describe ProtectedBranches::UpdateService, feature_category: :compliance_management do shared_examples 'execute with entity' do let(:params) { { name: new_name } } diff --git a/spec/services/protected_tags/create_service_spec.rb b/spec/services/protected_tags/create_service_spec.rb index a0b99b595e3..78b14aae029 100644 --- a/spec/services/protected_tags/create_service_spec.rb +++ b/spec/services/protected_tags/create_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe ProtectedTags::CreateService do +RSpec.describe ProtectedTags::CreateService, feature_category: :compliance_management do let(:project) { create(:project) } let(:user) { project.first_owner } let(:params) do diff --git a/spec/services/protected_tags/destroy_service_spec.rb b/spec/services/protected_tags/destroy_service_spec.rb index 658a4f5557e..fcb30d39520 100644 --- a/spec/services/protected_tags/destroy_service_spec.rb +++ b/spec/services/protected_tags/destroy_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe ProtectedTags::DestroyService do +RSpec.describe ProtectedTags::DestroyService, feature_category: :compliance_management do let(:protected_tag) { create(:protected_tag) } let(:project) { protected_tag.project } let(:user) { project.first_owner } diff --git a/spec/services/protected_tags/update_service_spec.rb b/spec/services/protected_tags/update_service_spec.rb index 4b6e726bb6e..2fb6cf84719 100644 --- a/spec/services/protected_tags/update_service_spec.rb +++ b/spec/services/protected_tags/update_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe ProtectedTags::UpdateService do +RSpec.describe ProtectedTags::UpdateService, feature_category: :compliance_management do let(:protected_tag) { create(:protected_tag) } let(:project) { protected_tag.project } let(:user) { project.first_owner } diff --git a/spec/services/push_event_payload_service_spec.rb b/spec/services/push_event_payload_service_spec.rb index de2bec21a3c..50da5ca9b24 100644 --- a/spec/services/push_event_payload_service_spec.rb +++ b/spec/services/push_event_payload_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe PushEventPayloadService do +RSpec.describe PushEventPayloadService, feature_category: :source_code_management do let(:event) { create(:push_event) } describe '#execute' do diff --git a/spec/services/quick_actions/interpret_service_spec.rb b/spec/services/quick_actions/interpret_service_spec.rb index 257e7eb972b..b8abfd1e6ba 100644 --- a/spec/services/quick_actions/interpret_service_spec.rb +++ b/spec/services/quick_actions/interpret_service_spec.rb @@ -746,10 +746,10 @@ RSpec.describe QuickActions::InterpretService, feature_category: :team_planning it 'assigns to users with escaped underscores' do user = create(:user) base = user.username - user.update!(username: "#{base}_") + user.update!(username: "#{base}_new") issuable.project.add_developer(user) - cmd = "/assign @#{base}\\_" + cmd = "/assign @#{base}\\_new" _, updates, _ = service.execute(cmd, issuable) diff --git a/spec/services/quick_actions/target_service_spec.rb b/spec/services/quick_actions/target_service_spec.rb index 1b0a5d4ae73..5f4e92cf955 100644 --- a/spec/services/quick_actions/target_service_spec.rb +++ b/spec/services/quick_actions/target_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe QuickActions::TargetService do +RSpec.describe QuickActions::TargetService, feature_category: :team_planning do let(:project) { create(:project) } let(:user) { create(:user) } let(:service) { described_class.new(project, user) } diff --git a/spec/services/releases/create_evidence_service_spec.rb b/spec/services/releases/create_evidence_service_spec.rb index 0ac15a7291d..75d0a2b9c0e 100644 --- a/spec/services/releases/create_evidence_service_spec.rb +++ b/spec/services/releases/create_evidence_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Releases::CreateEvidenceService do +RSpec.describe Releases::CreateEvidenceService, feature_category: :release_orchestration do let_it_be(:project) { create(:project) } let(:release) { create(:release, project: project) } diff --git a/spec/services/releases/destroy_service_spec.rb b/spec/services/releases/destroy_service_spec.rb index 46550ac5bef..953490ac379 100644 --- a/spec/services/releases/destroy_service_spec.rb +++ b/spec/services/releases/destroy_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Releases::DestroyService do +RSpec.describe Releases::DestroyService, feature_category: :release_orchestration do let(:project) { create(:project, :repository) } let(:mainatiner) { create(:user) } let(:repoter) { create(:user) } diff --git a/spec/services/releases/links/create_service_spec.rb b/spec/services/releases/links/create_service_spec.rb new file mode 100644 index 00000000000..9928d2162d7 --- /dev/null +++ b/spec/services/releases/links/create_service_spec.rb @@ -0,0 +1,84 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe Releases::Links::CreateService, feature_category: :release_orchestration do + let(:service) { described_class.new(release, user, params) } + let_it_be(:project) { create(:project, :repository) } + let_it_be(:user) { create(:user) } + let_it_be(:release) { create(:release, project: project, author: user, tag: 'v1.1.0') } + + let(:params) { { name: name, url: url, direct_asset_path: direct_asset_path, link_type: link_type } } + let(:name) { 'link' } + let(:url) { 'https://example.com' } + let(:direct_asset_path) { '/path' } + let(:link_type) { 'other' } + + before do + project.add_developer(user) + end + + describe '#execute' do + subject(:execute) { service.execute } + + let(:link) { subject.payload[:link] } + + it 'successfully creates a release link' do + expect { execute }.to change { Releases::Link.count }.by(1) + + expect(link).to have_attributes( + name: name, + url: url, + filepath: direct_asset_path, + link_type: link_type + ) + end + + context 'when user does not have access to create release link' do + before do + project.add_guest(user) + end + + it 'returns an error' do + expect { execute }.not_to change { Releases::Link.count } + + is_expected.to be_error + expect(execute.message).to include('Access Denied') + expect(execute.reason).to eq(:forbidden) + end + end + + context 'when url is invalid' do + let(:url) { 'not_a_url' } + + it 'returns an error' do + expect { execute }.not_to change { Releases::Link.count } + + is_expected.to be_error + expect(execute.message[0]).to include('Url is blocked') + expect(execute.reason).to eq(:bad_request) + end + end + + context 'when both direct_asset_path and filepath are provided' do + let(:params) { super().merge(filepath: '/filepath') } + + it 'prefers direct_asset_path' do + is_expected.to be_success + + expect(link.filepath).to eq(direct_asset_path) + end + end + + context 'when only filepath is set' do + let(:params) { super().merge(filepath: '/filepath') } + let(:direct_asset_path) { nil } + + it 'uses filepath' do + is_expected.to be_success + + expect(link.filepath).to eq('/filepath') + end + end + end +end diff --git a/spec/services/releases/links/destroy_service_spec.rb b/spec/services/releases/links/destroy_service_spec.rb new file mode 100644 index 00000000000..a248932eada --- /dev/null +++ b/spec/services/releases/links/destroy_service_spec.rb @@ -0,0 +1,72 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe Releases::Links::DestroyService, feature_category: :release_orchestration do + let(:service) { described_class.new(release, user, {}) } + let_it_be(:project) { create(:project, :repository) } + let_it_be(:user) { create(:user) } + let_it_be(:release) { create(:release, project: project, author: user, tag: 'v1.1.0') } + + let!(:release_link) do + create( + :release_link, + release: release, + name: 'awesome-app.dmg', + url: 'https://example.com/download/awesome-app.dmg' + ) + end + + before do + project.add_developer(user) + end + + describe '#execute' do + subject(:execute) { service.execute(release_link) } + + it 'successfully deletes a release link' do + expect { execute }.to change { release.links.count }.by(-1) + + is_expected.to be_success + end + + context 'when user does not have access to delete release link' do + before do + project.add_guest(user) + end + + it 'returns an error' do + expect { execute }.not_to change { release.links.count } + + is_expected.to be_error + expect(execute.message).to include('Access Denied') + expect(execute.reason).to eq(:forbidden) + end + end + + context 'when release link does not exist' do + let(:release_link) { nil } + + it 'returns an error' do + expect { execute }.not_to change { release.links.count } + + is_expected.to be_error + expect(execute.message).to eq('Link does not exist') + expect(execute.reason).to eq(:not_found) + end + end + + context 'when release link deletion failed' do + before do + allow(release_link).to receive(:destroy).and_return(false) + end + + it 'returns an error' do + expect { execute }.not_to change { release.links.count } + + is_expected.to be_error + expect(execute.reason).to eq(:bad_request) + end + end + end +end diff --git a/spec/services/releases/links/update_service_spec.rb b/spec/services/releases/links/update_service_spec.rb new file mode 100644 index 00000000000..3f48985cf60 --- /dev/null +++ b/spec/services/releases/links/update_service_spec.rb @@ -0,0 +1,89 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe Releases::Links::UpdateService, feature_category: :release_orchestration do + let(:service) { described_class.new(release, user, params) } + let_it_be(:project) { create(:project, :repository) } + let_it_be(:user) { create(:user) } + let_it_be(:release) { create(:release, project: project, author: user, tag: 'v1.1.0') } + + let(:release_link) do + create( + :release_link, + release: release, + name: 'awesome-app.dmg', + url: 'https://example.com/download/awesome-app.dmg' + ) + end + + let(:params) { { name: name, url: url, direct_asset_path: direct_asset_path, link_type: link_type } } + let(:name) { 'link' } + let(:url) { 'https://example.com' } + let(:direct_asset_path) { '/path' } + let(:link_type) { 'other' } + + before do + project.add_developer(user) + end + + describe '#execute' do + subject(:execute) { service.execute(release_link) } + + let(:updated_link) { execute.payload[:link] } + + it 'successfully updates a release link' do + is_expected.to be_success + + expect(updated_link).to have_attributes( + name: name, + url: url, + filepath: direct_asset_path, + link_type: link_type + ) + end + + context 'when user does not have access to update release link' do + before do + project.add_guest(user) + end + + it 'returns an error' do + is_expected.to be_error + expect(execute.message).to include('Access Denied') + expect(execute.reason).to eq(:forbidden) + end + end + + context 'when url is invalid' do + let(:url) { 'not_a_url' } + + it 'returns an error' do + is_expected.to be_error + expect(execute.message[0]).to include('Url is blocked') + expect(execute.reason).to eq(:bad_request) + end + end + + context 'when both direct_asset_path and filepath are provided' do + let(:params) { super().merge(filepath: '/filepath') } + + it 'prefers direct_asset_path' do + is_expected.to be_success + + expect(updated_link.filepath).to eq(direct_asset_path) + end + end + + context 'when only filepath is set' do + let(:params) { super().merge(filepath: '/filepath') } + let(:direct_asset_path) { nil } + + it 'uses filepath' do + is_expected.to be_success + + expect(updated_link.filepath).to eq('/filepath') + end + end + end +end diff --git a/spec/services/repositories/changelog_service_spec.rb b/spec/services/repositories/changelog_service_spec.rb index 42b586637ad..1b5300672e3 100644 --- a/spec/services/repositories/changelog_service_spec.rb +++ b/spec/services/repositories/changelog_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Repositories::ChangelogService do +RSpec.describe Repositories::ChangelogService, feature_category: :source_code_management do describe '#execute' do let!(:project) { create(:project, :empty_repo) } let!(:creator) { project.creator } diff --git a/spec/services/repositories/destroy_service_spec.rb b/spec/services/repositories/destroy_service_spec.rb index 565a18d501a..b3bad4fd84d 100644 --- a/spec/services/repositories/destroy_service_spec.rb +++ b/spec/services/repositories/destroy_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Repositories::DestroyService do +RSpec.describe Repositories::DestroyService, feature_category: :source_code_management do let_it_be(:user) { create(:user) } let!(:project) { create(:project, :repository, namespace: user.namespace) } diff --git a/spec/services/repository_archive_clean_up_service_spec.rb b/spec/services/repository_archive_clean_up_service_spec.rb index 8db1a6858fa..1ce68080c73 100644 --- a/spec/services/repository_archive_clean_up_service_spec.rb +++ b/spec/services/repository_archive_clean_up_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe RepositoryArchiveCleanUpService do +RSpec.describe RepositoryArchiveCleanUpService, feature_category: :source_code_management do subject(:service) { described_class.new } describe '#execute (new archive locations)' do diff --git a/spec/services/reset_project_cache_service_spec.rb b/spec/services/reset_project_cache_service_spec.rb index 165b38ee338..6ae516a5f07 100644 --- a/spec/services/reset_project_cache_service_spec.rb +++ b/spec/services/reset_project_cache_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe ResetProjectCacheService do +RSpec.describe ResetProjectCacheService, feature_category: :projects do let(:project) { create(:project) } let(:user) { create(:user) } diff --git a/spec/services/resource_access_tokens/create_service_spec.rb b/spec/services/resource_access_tokens/create_service_spec.rb index a8c8d41ca09..464fc18f1f0 100644 --- a/spec/services/resource_access_tokens/create_service_spec.rb +++ b/spec/services/resource_access_tokens/create_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe ResourceAccessTokens::CreateService do +RSpec.describe ResourceAccessTokens::CreateService, feature_category: :system_access do subject { described_class.new(user, resource, params).execute } let_it_be(:user) { create(:user) } @@ -99,12 +99,20 @@ RSpec.describe ResourceAccessTokens::CreateService do end end - context 'bot email' do - it 'check email domain' do - response = subject - access_token = response.payload[:access_token] + context 'bot username and email' do + include_examples 'username and email pair is generated by Gitlab::Utils::UsernameAndEmailGenerator' do + subject do + response = described_class.new(user, resource, params).execute + response.payload[:access_token].user + end + + let(:username_prefix) do + "#{resource.class.name.downcase}_#{resource.id}_bot" + end - expect(access_token.user.email).to end_with("@noreply.#{Gitlab.config.gitlab.host}") + let(:email_domain) do + "noreply.#{Gitlab.config.gitlab.host}" + end end end @@ -119,9 +127,7 @@ RSpec.describe ResourceAccessTokens::CreateService do end end - context 'when user specifies an access level' do - let_it_be(:params) { { access_level: Gitlab::Access::DEVELOPER } } - + shared_examples 'bot with access level' do it 'adds the bot user with the specified access level in the resource' do response = subject access_token = response.payload[:access_token] @@ -131,6 +137,18 @@ RSpec.describe ResourceAccessTokens::CreateService do end end + context 'when user specifies an access level' do + let_it_be(:params) { { access_level: Gitlab::Access::DEVELOPER } } + + it_behaves_like 'bot with access level' + end + + context 'with DEVELOPER access_level, in string format' do + let_it_be(:params) { { access_level: Gitlab::Access::DEVELOPER.to_s } } + + it_behaves_like 'bot with access level' + end + context 'when user is external' do before do user.update!(external: true) @@ -219,17 +237,31 @@ RSpec.describe ResourceAccessTokens::CreateService do let_it_be(:bot_user) { create(:user, :project_bot) } let(:unpersisted_member) { build(:project_member, source: resource, user: bot_user) } - let(:error_message) { 'Could not provision maintainer access to project access token' } + let(:error_message) { 'Could not provision maintainer access to the access token. ERROR: error message' } before do allow_next_instance_of(ResourceAccessTokens::CreateService) do |service| allow(service).to receive(:create_user).and_return(bot_user) allow(service).to receive(:create_membership).and_return(unpersisted_member) end + + allow(unpersisted_member).to receive_message_chain(:errors, :full_messages, :to_sentence) + .and_return('error message') + end + + context 'with MAINTAINER access_level, in integer format' do + let_it_be(:params) { { access_level: Gitlab::Access::MAINTAINER } } + + it_behaves_like 'token creation fails' + it_behaves_like 'correct error message' end - it_behaves_like 'token creation fails' - it_behaves_like 'correct error message' + context 'with MAINTAINER access_level, in string format' do + let_it_be(:params) { { access_level: Gitlab::Access::MAINTAINER.to_s } } + + it_behaves_like 'token creation fails' + it_behaves_like 'correct error message' + end end end diff --git a/spec/services/resource_access_tokens/revoke_service_spec.rb b/spec/services/resource_access_tokens/revoke_service_spec.rb index 28f173f1bc7..c00146961e3 100644 --- a/spec/services/resource_access_tokens/revoke_service_spec.rb +++ b/spec/services/resource_access_tokens/revoke_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe ResourceAccessTokens::RevokeService do +RSpec.describe ResourceAccessTokens::RevokeService, feature_category: :system_access do subject { described_class.new(user, resource, access_token).execute } let_it_be(:user) { create(:user) } diff --git a/spec/services/resource_events/change_labels_service_spec.rb b/spec/services/resource_events/change_labels_service_spec.rb index d94b49de9d7..8393ce78df8 100644 --- a/spec/services/resource_events/change_labels_service_spec.rb +++ b/spec/services/resource_events/change_labels_service_spec.rb @@ -3,7 +3,7 @@ require 'spec_helper' # feature category is shared among plan(issues, epics), monitor(incidents), create(merge request) stages -RSpec.describe ResourceEvents::ChangeLabelsService, feature_category: :shared do +RSpec.describe ResourceEvents::ChangeLabelsService, feature_category: :team_planning do let_it_be(:project) { create(:project) } let_it_be(:author) { create(:user) } let_it_be(:issue) { create(:issue, project: project) } diff --git a/spec/services/resource_events/change_milestone_service_spec.rb b/spec/services/resource_events/change_milestone_service_spec.rb index 425d5b19907..077058df1d5 100644 --- a/spec/services/resource_events/change_milestone_service_spec.rb +++ b/spec/services/resource_events/change_milestone_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe ResourceEvents::ChangeMilestoneService do +RSpec.describe ResourceEvents::ChangeMilestoneService, feature_category: :team_planning do let_it_be(:timebox) { create(:milestone) } let(:created_at_time) { Time.utc(2019, 12, 30) } diff --git a/spec/services/resource_events/change_state_service_spec.rb b/spec/services/resource_events/change_state_service_spec.rb index b679943073c..a63b4302635 100644 --- a/spec/services/resource_events/change_state_service_spec.rb +++ b/spec/services/resource_events/change_state_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe ResourceEvents::ChangeStateService do +RSpec.describe ResourceEvents::ChangeStateService, feature_category: :team_planning do let_it_be(:project) { create(:project) } let_it_be(:user) { create(:user) } diff --git a/spec/services/resource_events/merge_into_notes_service_spec.rb b/spec/services/resource_events/merge_into_notes_service_spec.rb index ebfd942066f..6eb6780d704 100644 --- a/spec/services/resource_events/merge_into_notes_service_spec.rb +++ b/spec/services/resource_events/merge_into_notes_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe ResourceEvents::MergeIntoNotesService do +RSpec.describe ResourceEvents::MergeIntoNotesService, feature_category: :team_planning do def create_event(params) event_params = { action: :add, label: label, issue: resource, user: user } diff --git a/spec/services/resource_events/synthetic_label_notes_builder_service_spec.rb b/spec/services/resource_events/synthetic_label_notes_builder_service_spec.rb index 71b1d0993ee..3396abaff9e 100644 --- a/spec/services/resource_events/synthetic_label_notes_builder_service_spec.rb +++ b/spec/services/resource_events/synthetic_label_notes_builder_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe ResourceEvents::SyntheticLabelNotesBuilderService do +RSpec.describe ResourceEvents::SyntheticLabelNotesBuilderService, feature_category: :team_planning do describe '#execute' do let_it_be(:user) { create(:user) } diff --git a/spec/services/resource_events/synthetic_milestone_notes_builder_service_spec.rb b/spec/services/resource_events/synthetic_milestone_notes_builder_service_spec.rb index f368e107c60..ca61afc7914 100644 --- a/spec/services/resource_events/synthetic_milestone_notes_builder_service_spec.rb +++ b/spec/services/resource_events/synthetic_milestone_notes_builder_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe ResourceEvents::SyntheticMilestoneNotesBuilderService do +RSpec.describe ResourceEvents::SyntheticMilestoneNotesBuilderService, feature_category: :team_planning do describe '#execute' do let_it_be(:user) { create(:user) } let_it_be(:issue) { create(:issue, author: user) } diff --git a/spec/services/resource_events/synthetic_state_notes_builder_service_spec.rb b/spec/services/resource_events/synthetic_state_notes_builder_service_spec.rb index 79500f3768b..9f838660f92 100644 --- a/spec/services/resource_events/synthetic_state_notes_builder_service_spec.rb +++ b/spec/services/resource_events/synthetic_state_notes_builder_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe ResourceEvents::SyntheticStateNotesBuilderService do +RSpec.describe ResourceEvents::SyntheticStateNotesBuilderService, feature_category: :team_planning do describe '#execute' do let_it_be(:user) { create(:user) } diff --git a/spec/services/search/global_service_spec.rb b/spec/services/search/global_service_spec.rb index e8716ef4d90..6250d32574f 100644 --- a/spec/services/search/global_service_spec.rb +++ b/spec/services/search/global_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Search::GlobalService do +RSpec.describe Search::GlobalService, feature_category: :global_search do let(:user) { create(:user) } let(:internal_user) { create(:user) } diff --git a/spec/services/search/group_service_spec.rb b/spec/services/search/group_service_spec.rb index c9bfa7cb7b4..e8a4a228f8f 100644 --- a/spec/services/search/group_service_spec.rb +++ b/spec/services/search/group_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Search::GroupService do +RSpec.describe Search::GroupService, feature_category: :global_search do shared_examples_for 'group search' do context 'finding projects by name' do let(:user) { create(:user) } diff --git a/spec/services/search/snippet_service_spec.rb b/spec/services/search/snippet_service_spec.rb index d204f626635..d60b60d28e4 100644 --- a/spec/services/search/snippet_service_spec.rb +++ b/spec/services/search/snippet_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Search::SnippetService do +RSpec.describe Search::SnippetService, feature_category: :global_search do let_it_be(:author) { create(:author) } let_it_be(:project) { create(:project, :public) } diff --git a/spec/services/security/ci_configuration/container_scanning_create_service_spec.rb b/spec/services/security/ci_configuration/container_scanning_create_service_spec.rb index df76750efc8..a56fbb026c1 100644 --- a/spec/services/security/ci_configuration/container_scanning_create_service_spec.rb +++ b/spec/services/security/ci_configuration/container_scanning_create_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Security::CiConfiguration::ContainerScanningCreateService, :snowplow do +RSpec.describe Security::CiConfiguration::ContainerScanningCreateService, :snowplow, feature_category: :container_scanning do subject(:result) { described_class.new(project, user).execute } let(:branch_name) { 'set-container-scanning-config-1' } diff --git a/spec/services/security/ci_configuration/sast_iac_create_service_spec.rb b/spec/services/security/ci_configuration/sast_iac_create_service_spec.rb index deb10732b37..7f1ad543f7c 100644 --- a/spec/services/security/ci_configuration/sast_iac_create_service_spec.rb +++ b/spec/services/security/ci_configuration/sast_iac_create_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Security::CiConfiguration::SastIacCreateService, :snowplow do +RSpec.describe Security::CiConfiguration::SastIacCreateService, :snowplow, feature_category: :static_application_security_testing do subject(:result) { described_class.new(project, user).execute } let(:branch_name) { 'set-sast-iac-config-1' } diff --git a/spec/services/security/ci_configuration/sast_parser_service_spec.rb b/spec/services/security/ci_configuration/sast_parser_service_spec.rb index 9211beb76f8..051bbcd194b 100644 --- a/spec/services/security/ci_configuration/sast_parser_service_spec.rb +++ b/spec/services/security/ci_configuration/sast_parser_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Security::CiConfiguration::SastParserService do +RSpec.describe Security::CiConfiguration::SastParserService, feature_category: :static_application_security_testing do describe '#configuration' do include_context 'read ci configuration for sast enabled project' diff --git a/spec/services/security/ci_configuration/secret_detection_create_service_spec.rb b/spec/services/security/ci_configuration/secret_detection_create_service_spec.rb index c1df3ebdca5..6cbeb219d11 100644 --- a/spec/services/security/ci_configuration/secret_detection_create_service_spec.rb +++ b/spec/services/security/ci_configuration/secret_detection_create_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Security::CiConfiguration::SecretDetectionCreateService, :snowplow do +RSpec.describe Security::CiConfiguration::SecretDetectionCreateService, :snowplow, feature_category: :container_scanning do subject(:result) { described_class.new(project, user).execute } let(:branch_name) { 'set-secret-detection-config-1' } diff --git a/spec/services/security/merge_reports_service_spec.rb b/spec/services/security/merge_reports_service_spec.rb index 249f4da5f34..809d0b27c20 100644 --- a/spec/services/security/merge_reports_service_spec.rb +++ b/spec/services/security/merge_reports_service_spec.rb @@ -3,7 +3,7 @@ require 'spec_helper' # rubocop: disable RSpec/MultipleMemoizedHelpers -RSpec.describe Security::MergeReportsService, '#execute' do +RSpec.describe Security::MergeReportsService, '#execute', feature_category: :code_review_workflow do let(:scanner_1) { build(:ci_reports_security_scanner, external_id: 'scanner-1', name: 'Scanner 1') } let(:scanner_2) { build(:ci_reports_security_scanner, external_id: 'scanner-2', name: 'Scanner 2') } let(:scanner_3) { build(:ci_reports_security_scanner, external_id: 'scanner-3', name: 'Scanner 3') } diff --git a/spec/services/serverless/associate_domain_service_spec.rb b/spec/services/serverless/associate_domain_service_spec.rb deleted file mode 100644 index 2f45806589e..00000000000 --- a/spec/services/serverless/associate_domain_service_spec.rb +++ /dev/null @@ -1,91 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' - -RSpec.describe Serverless::AssociateDomainService do - let_it_be(:sdc_pages_domain) { create(:pages_domain, :instance_serverless) } - let_it_be(:sdc_cluster) { create(:cluster, :with_installed_helm, :provided_by_gcp) } - let_it_be(:sdc_knative) { create(:clusters_applications_knative, cluster: sdc_cluster) } - let_it_be(:sdc_creator) { create(:user) } - - let(:sdc) do - create(:serverless_domain_cluster, - knative: sdc_knative, - creator: sdc_creator, - pages_domain: sdc_pages_domain) - end - - let(:knative) { sdc.knative } - let(:creator) { sdc.creator } - let(:pages_domain_id) { sdc.pages_domain_id } - - subject { described_class.new(knative, pages_domain_id: pages_domain_id, creator: creator) } - - context 'when the domain is unchanged' do - let(:creator) { create(:user) } - - it 'does not update creator' do - expect { subject.execute }.not_to change { sdc.reload.creator } - end - end - - context 'when domain is changed to nil' do - let_it_be(:creator) { create(:user) } - let_it_be(:pages_domain_id) { nil } - - it 'removes the association between knative and the domain' do - expect { subject.execute }.to change { knative.reload.pages_domain }.from(sdc.pages_domain).to(nil) - end - - it 'does not attempt to update creator' do - expect { subject.execute }.not_to raise_error - end - end - - context 'when a new domain is associated' do - let_it_be(:creator) { create(:user) } - let_it_be(:pages_domain_id) { create(:pages_domain, :instance_serverless).id } - - it 'creates an association with the domain' do - expect { subject.execute }.to change { knative.reload.pages_domain.id } - .from(sdc.pages_domain.id) - .to(pages_domain_id) - end - - it 'updates creator' do - expect { subject.execute }.to change { sdc.reload.creator }.from(sdc.creator).to(creator) - end - end - - context 'when knative is not authorized to use the pages domain' do - let_it_be(:pages_domain_id) { create(:pages_domain).id } - - before do - expect(knative).to receive(:available_domains).and_return(PagesDomain.none) - end - - it 'sets pages_domain_id to nil' do - expect { subject.execute }.to change { knative.reload.pages_domain }.from(sdc.pages_domain).to(nil) - end - end - - describe 'for new knative application' do - let_it_be(:cluster) { create(:cluster, :with_installed_helm, :provided_by_gcp) } - - context 'when knative hostname is nil' do - let(:knative) { build(:clusters_applications_knative, cluster: cluster, hostname: nil) } - - it 'sets hostname to a placeholder value' do - expect { subject.execute }.to change { knative.hostname }.to('example.com') - end - end - - context 'when knative hostname exists' do - let(:knative) { build(:clusters_applications_knative, cluster: cluster, hostname: 'hostname.com') } - - it 'does not change hostname' do - expect { subject.execute }.not_to change { knative.hostname } - end - end - end -end diff --git a/spec/services/service_desk_settings/update_service_spec.rb b/spec/services/service_desk_settings/update_service_spec.rb index 72134af1369..342fb2b6b7a 100644 --- a/spec/services/service_desk_settings/update_service_spec.rb +++ b/spec/services/service_desk_settings/update_service_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -RSpec.describe ServiceDeskSettings::UpdateService do +RSpec.describe ServiceDeskSettings::UpdateService, feature_category: :service_desk do describe '#execute' do let_it_be(:settings) { create(:service_desk_setting, outgoing_name: 'original name') } let_it_be(:user) { create(:user) } diff --git a/spec/services/service_ping/submit_service_ping_service_spec.rb b/spec/services/service_ping/submit_service_ping_service_spec.rb index b02f1e84d25..2248febda5c 100644 --- a/spec/services/service_ping/submit_service_ping_service_spec.rb +++ b/spec/services/service_ping/submit_service_ping_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe ServicePing::SubmitService do +RSpec.describe ServicePing::SubmitService, feature_category: :service_ping do include StubRequests include UsageDataHelpers diff --git a/spec/services/service_response_spec.rb b/spec/services/service_response_spec.rb index 58dd2fd4c5e..6171ca1a8a6 100644 --- a/spec/services/service_response_spec.rb +++ b/spec/services/service_response_spec.rb @@ -7,7 +7,7 @@ require 're2' require_relative '../../app/services/service_response' require_relative '../../lib/gitlab/error_tracking' -RSpec.describe ServiceResponse do +RSpec.describe ServiceResponse, feature_category: :shared do describe '.success' do it 'creates a successful response without a message' do expect(described_class.success).to be_success diff --git a/spec/services/snippets/bulk_destroy_service_spec.rb b/spec/services/snippets/bulk_destroy_service_spec.rb index 4142aa349e4..208386aee48 100644 --- a/spec/services/snippets/bulk_destroy_service_spec.rb +++ b/spec/services/snippets/bulk_destroy_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Snippets::BulkDestroyService do +RSpec.describe Snippets::BulkDestroyService, feature_category: :source_code_management do let_it_be(:project) { create(:project) } let(:user) { create(:user) } diff --git a/spec/services/snippets/count_service_spec.rb b/spec/services/snippets/count_service_spec.rb index 5ce637d0bac..4ad9b07d518 100644 --- a/spec/services/snippets/count_service_spec.rb +++ b/spec/services/snippets/count_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Snippets::CountService do +RSpec.describe Snippets::CountService, feature_category: :source_code_management do let_it_be(:user) { create(:user) } let_it_be(:project) { create(:project, :public) } diff --git a/spec/services/snippets/create_service_spec.rb b/spec/services/snippets/create_service_spec.rb index 0eb73c8edd2..725f1b165a2 100644 --- a/spec/services/snippets/create_service_spec.rb +++ b/spec/services/snippets/create_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Snippets::CreateService do +RSpec.describe Snippets::CreateService, feature_category: :source_code_management do describe '#execute' do let_it_be(:user) { create(:user) } let_it_be(:admin) { create(:user, :admin) } diff --git a/spec/services/snippets/destroy_service_spec.rb b/spec/services/snippets/destroy_service_spec.rb index 23765243dd6..d78b5429189 100644 --- a/spec/services/snippets/destroy_service_spec.rb +++ b/spec/services/snippets/destroy_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Snippets::DestroyService do +RSpec.describe Snippets::DestroyService, feature_category: :source_code_management do let_it_be(:project) { create(:project) } let_it_be(:user) { create(:user) } let_it_be(:other_user) { create(:user) } diff --git a/spec/services/snippets/repository_validation_service_spec.rb b/spec/services/snippets/repository_validation_service_spec.rb index 8166ce144e1..c9cd9f21481 100644 --- a/spec/services/snippets/repository_validation_service_spec.rb +++ b/spec/services/snippets/repository_validation_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Snippets::RepositoryValidationService do +RSpec.describe Snippets::RepositoryValidationService, feature_category: :source_code_management do describe '#execute' do let_it_be(:user) { create(:user) } let_it_be(:snippet) { create(:personal_snippet, :empty_repo, author: user) } diff --git a/spec/services/snippets/schedule_bulk_repository_shard_moves_service_spec.rb b/spec/services/snippets/schedule_bulk_repository_shard_moves_service_spec.rb index 9286d73ed4a..e88969ccf2d 100644 --- a/spec/services/snippets/schedule_bulk_repository_shard_moves_service_spec.rb +++ b/spec/services/snippets/schedule_bulk_repository_shard_moves_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Snippets::ScheduleBulkRepositoryShardMovesService do +RSpec.describe Snippets::ScheduleBulkRepositoryShardMovesService, feature_category: :source_code_management do it_behaves_like 'moves repository shard in bulk' do let_it_be_with_reload(:container) { create(:snippet, :repository) } diff --git a/spec/services/snippets/update_repository_storage_service_spec.rb b/spec/services/snippets/update_repository_storage_service_spec.rb index 9874189f73a..c417fbfd8b1 100644 --- a/spec/services/snippets/update_repository_storage_service_spec.rb +++ b/spec/services/snippets/update_repository_storage_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Snippets::UpdateRepositoryStorageService do +RSpec.describe Snippets::UpdateRepositoryStorageService, feature_category: :source_code_management do subject { described_class.new(repository_storage_move) } describe "#execute" do diff --git a/spec/services/snippets/update_service_spec.rb b/spec/services/snippets/update_service_spec.rb index 67cc258b4b6..99bb70a3077 100644 --- a/spec/services/snippets/update_service_spec.rb +++ b/spec/services/snippets/update_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Snippets::UpdateService do +RSpec.describe Snippets::UpdateService, feature_category: :source_code_management do describe '#execute', :aggregate_failures do let_it_be(:user) { create(:user) } let_it_be(:admin) { create :user, admin: true } diff --git a/spec/services/snippets/update_statistics_service_spec.rb b/spec/services/snippets/update_statistics_service_spec.rb index 27ae054676a..2d1872a09c4 100644 --- a/spec/services/snippets/update_statistics_service_spec.rb +++ b/spec/services/snippets/update_statistics_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Snippets::UpdateStatisticsService do +RSpec.describe Snippets::UpdateStatisticsService, feature_category: :source_code_management do describe '#execute' do subject { described_class.new(snippet).execute } diff --git a/spec/services/spam/akismet_mark_as_spam_service_spec.rb b/spec/services/spam/akismet_mark_as_spam_service_spec.rb index 12666e23e47..f07fa8d262b 100644 --- a/spec/services/spam/akismet_mark_as_spam_service_spec.rb +++ b/spec/services/spam/akismet_mark_as_spam_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Spam::AkismetMarkAsSpamService do +RSpec.describe Spam::AkismetMarkAsSpamService, feature_category: :instance_resiliency do let(:user_agent_detail) { build(:user_agent_detail) } let(:spammable) { build(:issue, user_agent_detail: user_agent_detail) } let(:fake_akismet_service) { double(:akismet_service, submit_spam: true) } diff --git a/spec/services/spam/akismet_service_spec.rb b/spec/services/spam/akismet_service_spec.rb index d9f62258a53..4d6a1650327 100644 --- a/spec/services/spam/akismet_service_spec.rb +++ b/spec/services/spam/akismet_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Spam::AkismetService do +RSpec.describe Spam::AkismetService, feature_category: :instance_resiliency do let(:fake_akismet_client) { double(:akismet_client) } let(:ip) { '1.2.3.4' } let(:user_agent) { 'some user_agent' } diff --git a/spec/services/spam/ham_service_spec.rb b/spec/services/spam/ham_service_spec.rb index 0101a8e7704..00906bc4b3d 100644 --- a/spec/services/spam/ham_service_spec.rb +++ b/spec/services/spam/ham_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Spam::HamService do +RSpec.describe Spam::HamService, feature_category: :instance_resiliency do let_it_be(:user) { create(:user) } let!(:spam_log) { create(:spam_log, user: user, submitted_as_ham: false) } diff --git a/spec/services/spam/spam_action_service_spec.rb b/spec/services/spam/spam_action_service_spec.rb index 4dfec9735ba..882b325b7b7 100644 --- a/spec/services/spam/spam_action_service_spec.rb +++ b/spec/services/spam/spam_action_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Spam::SpamActionService do +RSpec.describe Spam::SpamActionService, feature_category: :instance_resiliency do include_context 'includes Spam constants' let(:issue) { create(:issue, project: project, author: author) } diff --git a/spec/services/spam/spam_params_spec.rb b/spec/services/spam/spam_params_spec.rb index 7e74641c0fa..39c3b303529 100644 --- a/spec/services/spam/spam_params_spec.rb +++ b/spec/services/spam/spam_params_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Spam::SpamParams do +RSpec.describe Spam::SpamParams, feature_category: :instance_resiliency do shared_examples 'constructs from a request' do it 'constructs from a request' do expected = ::Spam::SpamParams.new( diff --git a/spec/services/spam/spam_verdict_service_spec.rb b/spec/services/spam/spam_verdict_service_spec.rb index dde93aa6b93..42993491459 100644 --- a/spec/services/spam/spam_verdict_service_spec.rb +++ b/spec/services/spam/spam_verdict_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Spam::SpamVerdictService do +RSpec.describe Spam::SpamVerdictService, feature_category: :instance_resiliency do include_context 'includes Spam constants' let(:fake_ip) { '1.2.3.4' } diff --git a/spec/services/submodules/update_service_spec.rb b/spec/services/submodules/update_service_spec.rb index 1a53da7b9fe..aeaf8ec1c7b 100644 --- a/spec/services/submodules/update_service_spec.rb +++ b/spec/services/submodules/update_service_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -RSpec.describe Submodules::UpdateService do +RSpec.describe Submodules::UpdateService, feature_category: :source_code_management do let(:project) { create(:project, :repository) } let(:repository) { project.repository } let(:user) { create(:user, :commit_email) } diff --git a/spec/services/suggestions/apply_service_spec.rb b/spec/services/suggestions/apply_service_spec.rb index 41ccd8523fa..6e2c623035e 100644 --- a/spec/services/suggestions/apply_service_spec.rb +++ b/spec/services/suggestions/apply_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Suggestions::ApplyService do +RSpec.describe Suggestions::ApplyService, feature_category: :code_suggestions do include ProjectForksHelper def build_position(**optional_args) diff --git a/spec/services/suggestions/create_service_spec.rb b/spec/services/suggestions/create_service_spec.rb index a4e62431128..a8bc3cba697 100644 --- a/spec/services/suggestions/create_service_spec.rb +++ b/spec/services/suggestions/create_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Suggestions::CreateService do +RSpec.describe Suggestions::CreateService, feature_category: :code_suggestions do let(:project_with_repo) { create(:project, :repository) } let(:merge_request) do create(:merge_request, source_project: project_with_repo, diff --git a/spec/services/suggestions/outdate_service_spec.rb b/spec/services/suggestions/outdate_service_spec.rb index e8891f88548..7bd70866bf7 100644 --- a/spec/services/suggestions/outdate_service_spec.rb +++ b/spec/services/suggestions/outdate_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Suggestions::OutdateService do +RSpec.describe Suggestions::OutdateService, feature_category: :code_suggestions do describe '#execute' do let(:merge_request) { create(:merge_request) } let(:project) { merge_request.target_project } diff --git a/spec/services/system_hooks_service_spec.rb b/spec/services/system_hooks_service_spec.rb index 5d60b6e0487..883a7d3a2ce 100644 --- a/spec/services/system_hooks_service_spec.rb +++ b/spec/services/system_hooks_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe SystemHooksService do +RSpec.describe SystemHooksService, feature_category: :webhooks do describe '#execute_hooks_for' do let_it_be(:user) { create(:user) } let_it_be(:group) { create(:group) } diff --git a/spec/services/system_notes/alert_management_service_spec.rb b/spec/services/system_notes/alert_management_service_spec.rb index 039975c1bf6..4d40a6a6cfd 100644 --- a/spec/services/system_notes/alert_management_service_spec.rb +++ b/spec/services/system_notes/alert_management_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe ::SystemNotes::AlertManagementService do +RSpec.describe ::SystemNotes::AlertManagementService, feature_category: :projects do let_it_be(:author) { create(:user) } let_it_be(:project) { create(:project, :repository) } let_it_be(:noteable) { create(:alert_management_alert, :with_incident, :acknowledged, project: project) } diff --git a/spec/services/system_notes/base_service_spec.rb b/spec/services/system_notes/base_service_spec.rb index efb165f8e4c..6ea4751b613 100644 --- a/spec/services/system_notes/base_service_spec.rb +++ b/spec/services/system_notes/base_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe SystemNotes::BaseService do +RSpec.describe SystemNotes::BaseService, feature_category: :projects do let(:noteable) { double } let(:project) { double } let(:author) { double } diff --git a/spec/services/system_notes/commit_service_spec.rb b/spec/services/system_notes/commit_service_spec.rb index 0399603980d..8dfb83f63fe 100644 --- a/spec/services/system_notes/commit_service_spec.rb +++ b/spec/services/system_notes/commit_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe SystemNotes::CommitService do +RSpec.describe SystemNotes::CommitService, feature_category: :code_review_workflow do let_it_be(:group) { create(:group) } let_it_be(:project) { create(:project, :repository, group: group) } let_it_be(:author) { create(:user) } @@ -13,7 +13,7 @@ RSpec.describe SystemNotes::CommitService do subject { commit_service.add_commits(new_commits, old_commits, oldrev) } let(:noteable) { create(:merge_request, source_project: project, target_project: project) } - let(:new_commits) { noteable.commits } + let(:new_commits) { create_commits(10) } let(:old_commits) { [] } let(:oldrev) { nil } @@ -43,6 +43,48 @@ RSpec.describe SystemNotes::CommitService do expect(decoded_note_content).to include("<li>#{commit.short_id} - #{commit.title}</li>") end end + + context 'with HTML content' do + let(:new_commits) { [double(title: '<pre>This is a test</pre>', short_id: '12345678')] } + + it 'escapes HTML titles' do + expect(note_lines[1]).to eq("<ul><li>12345678 - <pre>This is a test</pre></li></ul>") + end + end + + context 'with one commit exceeding the NEW_COMMIT_DISPLAY_LIMIT' do + let(:new_commits) { create_commits(11) } + let(:earlier_commit_summary_line) { note_lines[1] } + + it 'includes the truncated new commits summary' do + expect(earlier_commit_summary_line).to start_with("<ul><li>#{new_commits[0].short_id} - 1 earlier commit") + end + + context 'with oldrev' do + let(:oldrev) { '12345678abcd' } + + it 'includes the truncated new commits summary with the oldrev' do + expect(earlier_commit_summary_line).to start_with("<ul><li>#{new_commits[0].short_id} - 1 earlier commit") + end + end + end + + context 'with multiple commits exceeding the NEW_COMMIT_DISPLAY_LIMIT' do + let(:new_commits) { create_commits(13) } + let(:earlier_commit_summary_line) { note_lines[1] } + + it 'includes the truncated new commits summary' do + expect(earlier_commit_summary_line).to start_with("<ul><li>#{new_commits[0].short_id}..#{new_commits[2].short_id} - 3 earlier commits") + end + + context 'with oldrev' do + let(:oldrev) { '12345678abcd' } + + it 'includes the truncated new commits summary with the oldrev' do + expect(earlier_commit_summary_line).to start_with("<ul><li>12345678...#{new_commits[2].short_id} - 3 earlier commits") + end + end + end end describe 'summary line for existing commits' do @@ -54,6 +96,15 @@ RSpec.describe SystemNotes::CommitService do it 'includes the existing commit' do expect(summary_line).to start_with("<ul><li>#{old_commits.first.short_id} - 1 commit from branch <code>feature</code>") end + + context 'with new commits exceeding the display limit' do + let(:summary_line) { note_lines[1] } + let(:new_commits) { create_commits(13) } + + it 'includes the existing commit as well as the truncated new commit summary' do + expect(summary_line).to start_with("<ul><li>#{old_commits.first.short_id} - 1 commit from branch <code>feature</code></li><li>#{old_commits.last.short_id}...#{new_commits[2].short_id} - 3 earlier commits") + end + end end context 'with multiple existing commits' do @@ -66,6 +117,15 @@ RSpec.describe SystemNotes::CommitService do expect(summary_line) .to start_with("<ul><li>#{Commit.truncate_sha(oldrev)}...#{old_commits.last.short_id} - 26 commits from branch <code>feature</code>") end + + context 'with new commits exceeding the display limit' do + let(:new_commits) { create_commits(13) } + + it 'includes the existing commit as well as the truncated new commit summary' do + expect(summary_line) + .to start_with("<ul><li>#{Commit.truncate_sha(oldrev)}...#{old_commits.last.short_id} - 26 commits from branch <code>feature</code></li><li>#{old_commits.last.short_id}...#{new_commits[2].short_id} - 3 earlier commits") + end + end end context 'without oldrev' do @@ -73,6 +133,15 @@ RSpec.describe SystemNotes::CommitService do expect(summary_line) .to start_with("<ul><li>#{old_commits[0].short_id}..#{old_commits[-1].short_id} - 26 commits from branch <code>feature</code>") end + + context 'with new commits exceeding the display limit' do + let(:new_commits) { create_commits(13) } + + it 'includes the existing commit as well as the truncated new commit summary' do + expect(summary_line) + .to start_with("<ul><li>#{old_commits.first.short_id}..#{old_commits.last.short_id} - 26 commits from branch <code>feature</code></li><li>#{old_commits.last.short_id}...#{new_commits[2].short_id} - 3 earlier commits") + end + end end context 'on a fork' do @@ -106,12 +175,9 @@ RSpec.describe SystemNotes::CommitService do end end - describe '#new_commit_summary' do - it 'escapes HTML titles' do - commit = double(title: '<pre>This is a test</pre>', short_id: '12345678') - escaped = '<pre>This is a test</pre>' - - expect(described_class.new.new_commit_summary([commit])).to all(match(/- #{escaped}/)) + def create_commits(count) + Array.new(count) do |i| + double(title: "Test commit #{i}", short_id: "abcd00#{i}") end end end diff --git a/spec/services/system_notes/design_management_service_spec.rb b/spec/services/system_notes/design_management_service_spec.rb index 19e1f338eb8..92568890c6f 100644 --- a/spec/services/system_notes/design_management_service_spec.rb +++ b/spec/services/system_notes/design_management_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe SystemNotes::DesignManagementService do +RSpec.describe SystemNotes::DesignManagementService, feature_category: :design_management do let(:project) { create(:project) } let(:issue) { create(:issue, project: project) } diff --git a/spec/services/system_notes/incident_service_spec.rb b/spec/services/system_notes/incident_service_spec.rb index 5de352ad8fa..0e9828c0a81 100644 --- a/spec/services/system_notes/incident_service_spec.rb +++ b/spec/services/system_notes/incident_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe ::SystemNotes::IncidentService do +RSpec.describe ::SystemNotes::IncidentService, feature_category: :incident_management do let_it_be(:author) { create(:user) } let_it_be(:project) { create(:project) } let_it_be(:noteable) { create(:incident, project: project) } diff --git a/spec/services/system_notes/incidents_service_spec.rb b/spec/services/system_notes/incidents_service_spec.rb index 6439f9fae93..5452d51dfc0 100644 --- a/spec/services/system_notes/incidents_service_spec.rb +++ b/spec/services/system_notes/incidents_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe SystemNotes::IncidentsService do +RSpec.describe SystemNotes::IncidentsService, feature_category: :incident_management do let_it_be(:project) { create(:project) } let_it_be(:user) { create(:user) } let_it_be(:author) { create(:user) } diff --git a/spec/services/system_notes/issuables_service_spec.rb b/spec/services/system_notes/issuables_service_spec.rb index 3263e410d3c..08a91234174 100644 --- a/spec/services/system_notes/issuables_service_spec.rb +++ b/spec/services/system_notes/issuables_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe ::SystemNotes::IssuablesService do +RSpec.describe ::SystemNotes::IssuablesService, feature_category: :team_planning do include ProjectForksHelper let_it_be(:group) { create(:group) } diff --git a/spec/services/system_notes/merge_requests_service_spec.rb b/spec/services/system_notes/merge_requests_service_spec.rb index 3e66ccef106..7ddcd799a55 100644 --- a/spec/services/system_notes/merge_requests_service_spec.rb +++ b/spec/services/system_notes/merge_requests_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe ::SystemNotes::MergeRequestsService do +RSpec.describe ::SystemNotes::MergeRequestsService, feature_category: :code_review_workflow do include Gitlab::Routing let_it_be(:group) { create(:group) } diff --git a/spec/services/system_notes/time_tracking_service_spec.rb b/spec/services/system_notes/time_tracking_service_spec.rb index c856caa3f3e..5cc17f55012 100644 --- a/spec/services/system_notes/time_tracking_service_spec.rb +++ b/spec/services/system_notes/time_tracking_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe ::SystemNotes::TimeTrackingService do +RSpec.describe ::SystemNotes::TimeTrackingService, feature_category: :team_planning do let_it_be(:author) { create(:user) } let_it_be(:project) { create(:project, :repository) } diff --git a/spec/services/system_notes/zoom_service_spec.rb b/spec/services/system_notes/zoom_service_spec.rb index 986324c9664..b46b4113e12 100644 --- a/spec/services/system_notes/zoom_service_spec.rb +++ b/spec/services/system_notes/zoom_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe ::SystemNotes::ZoomService do +RSpec.describe ::SystemNotes::ZoomService, feature_category: :integrations do let_it_be(:project) { create(:project, :repository) } let_it_be(:author) { create(:user) } diff --git a/spec/services/tags/create_service_spec.rb b/spec/services/tags/create_service_spec.rb index bbf6fe62959..51b8bace626 100644 --- a/spec/services/tags/create_service_spec.rb +++ b/spec/services/tags/create_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Tags::CreateService do +RSpec.describe Tags::CreateService, feature_category: :source_code_management do let(:project) { create(:project, :repository) } let(:repository) { project.repository } let(:user) { create(:user) } diff --git a/spec/services/tags/destroy_service_spec.rb b/spec/services/tags/destroy_service_spec.rb index 6160f337552..343a87785ad 100644 --- a/spec/services/tags/destroy_service_spec.rb +++ b/spec/services/tags/destroy_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Tags::DestroyService do +RSpec.describe Tags::DestroyService, feature_category: :source_code_management do let(:project) { create(:project, :repository) } let(:repository) { project.repository } let(:user) { create(:user) } diff --git a/spec/services/task_list_toggle_service_spec.rb b/spec/services/task_list_toggle_service_spec.rb index f889f298213..b0444a5ba72 100644 --- a/spec/services/task_list_toggle_service_spec.rb +++ b/spec/services/task_list_toggle_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe TaskListToggleService do +RSpec.describe TaskListToggleService, feature_category: :team_planning do let(:markdown) do <<-EOT.strip_heredoc * [ ] Task 1 diff --git a/spec/services/tasks_to_be_done/base_service_spec.rb b/spec/services/tasks_to_be_done/base_service_spec.rb index cfeff36cc0d..ff4eefdfb3a 100644 --- a/spec/services/tasks_to_be_done/base_service_spec.rb +++ b/spec/services/tasks_to_be_done/base_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe TasksToBeDone::BaseService do +RSpec.describe TasksToBeDone::BaseService, feature_category: :team_planning do let_it_be(:project) { create(:project) } let_it_be(:current_user) { create(:user) } let_it_be(:assignee_one) { create(:user) } diff --git a/spec/services/terraform/remote_state_handler_spec.rb b/spec/services/terraform/remote_state_handler_spec.rb index 369309e4d5a..f4f7a8a0985 100644 --- a/spec/services/terraform/remote_state_handler_spec.rb +++ b/spec/services/terraform/remote_state_handler_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Terraform::RemoteStateHandler do +RSpec.describe Terraform::RemoteStateHandler, feature_category: :infrastructure_as_code do let_it_be(:project) { create(:project) } let_it_be(:developer) { create(:user, developer_projects: [project]) } let_it_be(:maintainer) { create(:user, maintainer_projects: [project]) } diff --git a/spec/services/terraform/states/destroy_service_spec.rb b/spec/services/terraform/states/destroy_service_spec.rb index 5acf32cd73c..3515a758827 100644 --- a/spec/services/terraform/states/destroy_service_spec.rb +++ b/spec/services/terraform/states/destroy_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Terraform::States::DestroyService do +RSpec.describe Terraform::States::DestroyService, feature_category: :infrastructure_as_code do let_it_be(:state) { create(:terraform_state, :with_version, :deletion_in_progress) } let(:file) { instance_double(Terraform::StateUploader, relative_path: 'path') } diff --git a/spec/services/terraform/states/trigger_destroy_service_spec.rb b/spec/services/terraform/states/trigger_destroy_service_spec.rb index 459f4c3bdb9..0b37d962353 100644 --- a/spec/services/terraform/states/trigger_destroy_service_spec.rb +++ b/spec/services/terraform/states/trigger_destroy_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Terraform::States::TriggerDestroyService do +RSpec.describe Terraform::States::TriggerDestroyService, feature_category: :infrastructure_as_code do let_it_be(:project) { create(:project) } let_it_be(:user) { create(:user, maintainer_projects: [project]) } diff --git a/spec/services/test_hooks/project_service_spec.rb b/spec/services/test_hooks/project_service_spec.rb index 13f863dbbdb..31f97edbd08 100644 --- a/spec/services/test_hooks/project_service_spec.rb +++ b/spec/services/test_hooks/project_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe TestHooks::ProjectService do +RSpec.describe TestHooks::ProjectService, feature_category: :code_testing do include AfterNextHelpers let(:current_user) { create(:user) } diff --git a/spec/services/test_hooks/system_service_spec.rb b/spec/services/test_hooks/system_service_spec.rb index e94ea4669c6..4c5009fea54 100644 --- a/spec/services/test_hooks/system_service_spec.rb +++ b/spec/services/test_hooks/system_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe TestHooks::SystemService do +RSpec.describe TestHooks::SystemService, feature_category: :code_testing do include AfterNextHelpers describe '#execute' do diff --git a/spec/services/timelogs/delete_service_spec.rb b/spec/services/timelogs/delete_service_spec.rb index ee1133af6b3..c0543bafcec 100644 --- a/spec/services/timelogs/delete_service_spec.rb +++ b/spec/services/timelogs/delete_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Timelogs::DeleteService do +RSpec.describe Timelogs::DeleteService, feature_category: :team_planning do let_it_be(:author) { create(:user) } let_it_be(:project) { create(:project, :public) } let_it_be(:issue) { create(:issue, project: project) } diff --git a/spec/services/todo_service_spec.rb b/spec/services/todo_service_spec.rb index f73eae70d3c..f0aabd0a8dc 100644 --- a/spec/services/todo_service_spec.rb +++ b/spec/services/todo_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe TodoService do +RSpec.describe TodoService, feature_category: :team_planning do include AfterNextHelpers let_it_be(:project) { create(:project, :repository) } @@ -211,7 +211,6 @@ RSpec.describe TodoService do end it_behaves_like 'Snowplow event tracking with RedisHLL context' do - let(:feature_flag_name) { :route_hll_to_snowplow_phase2 } let(:namespace) { project.namespace } let(:category) { described_class.to_s } let(:action) { 'incident_management_incident_todo' } diff --git a/spec/services/todos/allowed_target_filter_service_spec.rb b/spec/services/todos/allowed_target_filter_service_spec.rb index 1d2b1b044db..3929e3788d0 100644 --- a/spec/services/todos/allowed_target_filter_service_spec.rb +++ b/spec/services/todos/allowed_target_filter_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Todos::AllowedTargetFilterService do +RSpec.describe Todos::AllowedTargetFilterService, feature_category: :team_planning do include DesignManagementTestHelpers let_it_be(:authorized_group) { create(:group, :private) } diff --git a/spec/services/todos/destroy/confidential_issue_service_spec.rb b/spec/services/todos/destroy/confidential_issue_service_spec.rb index e3dcc2bae95..9de71faf8bf 100644 --- a/spec/services/todos/destroy/confidential_issue_service_spec.rb +++ b/spec/services/todos/destroy/confidential_issue_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Todos::Destroy::ConfidentialIssueService do +RSpec.describe Todos::Destroy::ConfidentialIssueService, feature_category: :team_planning do let(:project) { create(:project, :public) } let(:user) { create(:user) } let(:author) { create(:user) } diff --git a/spec/services/todos/destroy/design_service_spec.rb b/spec/services/todos/destroy/design_service_spec.rb index 92b25d94dc6..628398e7062 100644 --- a/spec/services/todos/destroy/design_service_spec.rb +++ b/spec/services/todos/destroy/design_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Todos::Destroy::DesignService do +RSpec.describe Todos::Destroy::DesignService, feature_category: :design_management do let_it_be(:user) { create(:user) } let_it_be(:user_2) { create(:user) } let_it_be(:design) { create(:design) } diff --git a/spec/services/todos/destroy/destroyed_issuable_service_spec.rb b/spec/services/todos/destroy/destroyed_issuable_service_spec.rb index 6d6abe06d1c..63ff189ede5 100644 --- a/spec/services/todos/destroy/destroyed_issuable_service_spec.rb +++ b/spec/services/todos/destroy/destroyed_issuable_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Todos::Destroy::DestroyedIssuableService do +RSpec.describe Todos::Destroy::DestroyedIssuableService, feature_category: :team_planning do describe '#execute' do let_it_be(:user) { create(:user) } diff --git a/spec/services/todos/destroy/project_private_service_spec.rb b/spec/services/todos/destroy/project_private_service_spec.rb index 1d1c010535d..cc15f6eab8b 100644 --- a/spec/services/todos/destroy/project_private_service_spec.rb +++ b/spec/services/todos/destroy/project_private_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Todos::Destroy::ProjectPrivateService do +RSpec.describe Todos::Destroy::ProjectPrivateService, feature_category: :team_planning do let(:group) { create(:group, :public) } let(:project) { create(:project, :public, group: group) } let(:user) { create(:user) } diff --git a/spec/services/todos/destroy/unauthorized_features_service_spec.rb b/spec/services/todos/destroy/unauthorized_features_service_spec.rb index 5f6c9b0cdf0..c02c0dfd5c8 100644 --- a/spec/services/todos/destroy/unauthorized_features_service_spec.rb +++ b/spec/services/todos/destroy/unauthorized_features_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Todos::Destroy::UnauthorizedFeaturesService do +RSpec.describe Todos::Destroy::UnauthorizedFeaturesService, feature_category: :team_planning do let_it_be(:project, reload: true) { create(:project, :public, :repository) } let_it_be(:issue) { create(:issue, project: project) } let_it_be(:mr) { create(:merge_request, source_project: project) } diff --git a/spec/services/topics/merge_service_spec.rb b/spec/services/topics/merge_service_spec.rb index 98247250a61..41afabdf2ca 100644 --- a/spec/services/topics/merge_service_spec.rb +++ b/spec/services/topics/merge_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Topics::MergeService do +RSpec.describe Topics::MergeService, feature_category: :shared do let_it_be(:source_topic) { create(:topic, name: 'source_topic') } let_it_be(:target_topic) { create(:topic, name: 'target_topic') } let_it_be(:project_1) { create(:project, :public, topic_list: source_topic.name) } diff --git a/spec/services/two_factor/destroy_service_spec.rb b/spec/services/two_factor/destroy_service_spec.rb index 30c189520fd..0811ce336c8 100644 --- a/spec/services/two_factor/destroy_service_spec.rb +++ b/spec/services/two_factor/destroy_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe TwoFactor::DestroyService do +RSpec.describe TwoFactor::DestroyService, feature_category: :system_access do let_it_be(:current_user) { create(:user) } subject { described_class.new(current_user, user: user).execute } diff --git a/spec/services/update_container_registry_info_service_spec.rb b/spec/services/update_container_registry_info_service_spec.rb index 64071e79508..416b08bd04b 100644 --- a/spec/services/update_container_registry_info_service_spec.rb +++ b/spec/services/update_container_registry_info_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe UpdateContainerRegistryInfoService do +RSpec.describe UpdateContainerRegistryInfoService, feature_category: :container_registry do let_it_be(:application_settings) { Gitlab::CurrentSettings } let_it_be(:api_url) { 'http://registry.gitlab' } diff --git a/spec/services/update_merge_request_metrics_service_spec.rb b/spec/services/update_merge_request_metrics_service_spec.rb index a07fcee91e4..f30836fbaf5 100644 --- a/spec/services/update_merge_request_metrics_service_spec.rb +++ b/spec/services/update_merge_request_metrics_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe MergeRequestMetricsService do +RSpec.describe MergeRequestMetricsService, feature_category: :code_review_workflow do let(:metrics) { create(:merge_request).metrics } describe '#merge' do diff --git a/spec/services/upload_service_spec.rb b/spec/services/upload_service_spec.rb index 48aa65451f3..518d12d5b41 100644 --- a/spec/services/upload_service_spec.rb +++ b/spec/services/upload_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe UploadService do +RSpec.describe UploadService, feature_category: :shared do describe 'File service' do before do @user = create(:user) diff --git a/spec/services/uploads/destroy_service_spec.rb b/spec/services/uploads/destroy_service_spec.rb index bb58da231b6..76ac2ec245e 100644 --- a/spec/services/uploads/destroy_service_spec.rb +++ b/spec/services/uploads/destroy_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Uploads::DestroyService do +RSpec.describe Uploads::DestroyService, feature_category: :shared do let_it_be(:project) { create(:project) } let_it_be(:user) { create(:user) } let_it_be_with_reload(:upload) { create(:upload, :issuable_upload, model: project) } diff --git a/spec/services/user_preferences/update_service_spec.rb b/spec/services/user_preferences/update_service_spec.rb index 59089a4a7af..09acc01729e 100644 --- a/spec/services/user_preferences/update_service_spec.rb +++ b/spec/services/user_preferences/update_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe UserPreferences::UpdateService do +RSpec.describe UserPreferences::UpdateService, feature_category: :user_profile do let(:user) { create(:user) } let(:params) { { view_diffs_file_by_file: false } } diff --git a/spec/services/user_project_access_changed_service_spec.rb b/spec/services/user_project_access_changed_service_spec.rb index 356675d55f2..563af8e7e9e 100644 --- a/spec/services/user_project_access_changed_service_spec.rb +++ b/spec/services/user_project_access_changed_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe UserProjectAccessChangedService, feature_category: :authentication_and_authorization do +RSpec.describe UserProjectAccessChangedService, feature_category: :system_access do describe '#execute' do it 'permits high-priority operation' do expect(AuthorizedProjectsWorker).to receive(:bulk_perform_async) diff --git a/spec/services/users/activity_service_spec.rb b/spec/services/users/activity_service_spec.rb index 6c0d93f568a..f78535569b3 100644 --- a/spec/services/users/activity_service_spec.rb +++ b/spec/services/users/activity_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Users::ActivityService do +RSpec.describe Users::ActivityService, feature_category: :user_profile do include ExclusiveLeaseHelpers let(:user) { create(:user, last_activity_on: last_activity_on) } diff --git a/spec/services/users/approve_service_spec.rb b/spec/services/users/approve_service_spec.rb index 34eb5b18ff6..1b063a9ad1c 100644 --- a/spec/services/users/approve_service_spec.rb +++ b/spec/services/users/approve_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Users::ApproveService do +RSpec.describe Users::ApproveService, feature_category: :user_management do let_it_be(:current_user) { create(:admin) } let(:user) { create(:user, :blocked_pending_approval) } diff --git a/spec/services/users/authorized_build_service_spec.rb b/spec/services/users/authorized_build_service_spec.rb index 57a122cbf35..7eed6833cba 100644 --- a/spec/services/users/authorized_build_service_spec.rb +++ b/spec/services/users/authorized_build_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Users::AuthorizedBuildService do +RSpec.describe Users::AuthorizedBuildService, feature_category: :user_management do describe '#execute' do let_it_be(:current_user) { create(:user) } diff --git a/spec/services/users/ban_service_spec.rb b/spec/services/users/ban_service_spec.rb index 3f9c7ebf067..5be5de82e91 100644 --- a/spec/services/users/ban_service_spec.rb +++ b/spec/services/users/ban_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Users::BanService do +RSpec.describe Users::BanService, feature_category: :user_management do let(:user) { create(:user) } let_it_be(:current_user) { create(:admin) } diff --git a/spec/services/users/banned_user_base_service_spec.rb b/spec/services/users/banned_user_base_service_spec.rb index 29a549f0f49..65b24e08d80 100644 --- a/spec/services/users/banned_user_base_service_spec.rb +++ b/spec/services/users/banned_user_base_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Users::BannedUserBaseService do +RSpec.describe Users::BannedUserBaseService, feature_category: :user_management do let(:admin) { create(:admin) } let(:base_service) { described_class.new(admin) } diff --git a/spec/services/users/batch_status_cleaner_service_spec.rb b/spec/services/users/batch_status_cleaner_service_spec.rb index 46a004542d8..8feec761fd0 100644 --- a/spec/services/users/batch_status_cleaner_service_spec.rb +++ b/spec/services/users/batch_status_cleaner_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Users::BatchStatusCleanerService do +RSpec.describe Users::BatchStatusCleanerService, feature_category: :user_management do let_it_be(:user_status_1) { create(:user_status, emoji: 'coffee', message: 'msg1', clear_status_at: 1.year.ago) } let_it_be(:user_status_2) { create(:user_status, emoji: 'coffee', message: 'msg1', clear_status_at: 1.year.from_now) } let_it_be(:user_status_3) { create(:user_status, emoji: 'coffee', message: 'msg1', clear_status_at: 2.years.ago) } diff --git a/spec/services/users/block_service_spec.rb b/spec/services/users/block_service_spec.rb index 7ff9a887f38..63aa375c8af 100644 --- a/spec/services/users/block_service_spec.rb +++ b/spec/services/users/block_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Users::BlockService do +RSpec.describe Users::BlockService, feature_category: :user_management do let_it_be(:current_user) { create(:admin) } subject(:service) { described_class.new(current_user) } diff --git a/spec/services/users/build_service_spec.rb b/spec/services/users/build_service_spec.rb index 98fe6d9b5ba..f3236d40412 100644 --- a/spec/services/users/build_service_spec.rb +++ b/spec/services/users/build_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Users::BuildService do +RSpec.describe Users::BuildService, feature_category: :user_management do using RSpec::Parameterized::TableSyntax describe '#execute' do diff --git a/spec/services/users/create_service_spec.rb b/spec/services/users/create_service_spec.rb index f3c9701c556..eac4faa2042 100644 --- a/spec/services/users/create_service_spec.rb +++ b/spec/services/users/create_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Users::CreateService do +RSpec.describe Users::CreateService, feature_category: :user_management do describe '#execute' do let(:password) { User.random_password } let(:admin_user) { create(:admin) } diff --git a/spec/services/users/destroy_service_spec.rb b/spec/services/users/destroy_service_spec.rb index 18ad946b289..5cd11efe942 100644 --- a/spec/services/users/destroy_service_spec.rb +++ b/spec/services/users/destroy_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Users::DestroyService do +RSpec.describe Users::DestroyService, feature_category: :user_management do let!(:user) { create(:user) } let!(:admin) { create(:admin) } let!(:namespace) { user.namespace } diff --git a/spec/services/users/dismiss_callout_service_spec.rb b/spec/services/users/dismiss_callout_service_spec.rb index 6ba9f180444..776388ef5f1 100644 --- a/spec/services/users/dismiss_callout_service_spec.rb +++ b/spec/services/users/dismiss_callout_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Users::DismissCalloutService do +RSpec.describe Users::DismissCalloutService, feature_category: :user_management do describe '#execute' do let_it_be(:user) { create(:user) } diff --git a/spec/services/users/dismiss_group_callout_service_spec.rb b/spec/services/users/dismiss_group_callout_service_spec.rb index d74602a7606..a653fa7ee00 100644 --- a/spec/services/users/dismiss_group_callout_service_spec.rb +++ b/spec/services/users/dismiss_group_callout_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Users::DismissGroupCalloutService do +RSpec.describe Users::DismissGroupCalloutService, feature_category: :user_management do describe '#execute' do let_it_be(:user) { create(:user) } let_it_be(:group) { create(:group) } diff --git a/spec/services/users/dismiss_project_callout_service_spec.rb b/spec/services/users/dismiss_project_callout_service_spec.rb index 73e50a4c37d..7bcb11e4dbc 100644 --- a/spec/services/users/dismiss_project_callout_service_spec.rb +++ b/spec/services/users/dismiss_project_callout_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Users::DismissProjectCalloutService do +RSpec.describe Users::DismissProjectCalloutService, feature_category: :user_management do describe '#execute' do let_it_be(:user) { create(:user) } let_it_be(:project) { create(:project) } diff --git a/spec/services/users/email_verification/generate_token_service_spec.rb b/spec/services/users/email_verification/generate_token_service_spec.rb index e7aa1bf8306..3b299622a90 100644 --- a/spec/services/users/email_verification/generate_token_service_spec.rb +++ b/spec/services/users/email_verification/generate_token_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Users::EmailVerification::GenerateTokenService do +RSpec.describe Users::EmailVerification::GenerateTokenService, feature_category: :system_access do using RSpec::Parameterized::TableSyntax let(:service) { described_class.new(attr: attr) } diff --git a/spec/services/users/email_verification/validate_token_service_spec.rb b/spec/services/users/email_verification/validate_token_service_spec.rb index 44af4a4d36f..9b69034290a 100644 --- a/spec/services/users/email_verification/validate_token_service_spec.rb +++ b/spec/services/users/email_verification/validate_token_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Users::EmailVerification::ValidateTokenService, :clean_gitlab_redis_rate_limiting do +RSpec.describe Users::EmailVerification::ValidateTokenService, :clean_gitlab_redis_rate_limiting, feature_category: :system_access do using RSpec::Parameterized::TableSyntax let(:service) { described_class.new(attr: attr, user: user, token: token) } diff --git a/spec/services/users/in_product_marketing_email_records_spec.rb b/spec/services/users/in_product_marketing_email_records_spec.rb index 0b9400dcd12..059f0890b53 100644 --- a/spec/services/users/in_product_marketing_email_records_spec.rb +++ b/spec/services/users/in_product_marketing_email_records_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Users::InProductMarketingEmailRecords do +RSpec.describe Users::InProductMarketingEmailRecords, feature_category: :onboarding do let_it_be(:user) { create :user } subject(:records) { described_class.new } diff --git a/spec/services/users/keys_count_service_spec.rb b/spec/services/users/keys_count_service_spec.rb index 607d2946b2c..258fe351e4b 100644 --- a/spec/services/users/keys_count_service_spec.rb +++ b/spec/services/users/keys_count_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Users::KeysCountService, :use_clean_rails_memory_store_caching do +RSpec.describe Users::KeysCountService, :use_clean_rails_memory_store_caching, feature_category: :system_access do let(:user) { create(:user) } subject { described_class.new(user) } diff --git a/spec/services/users/last_push_event_service_spec.rb b/spec/services/users/last_push_event_service_spec.rb index 5b755db407f..fe61f12fe1a 100644 --- a/spec/services/users/last_push_event_service_spec.rb +++ b/spec/services/users/last_push_event_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Users::LastPushEventService do +RSpec.describe Users::LastPushEventService, feature_category: :source_code_management do let(:user) { build(:user, id: 1) } let(:project) { build(:project, id: 2) } let(:event) { build(:push_event, id: 3, author: user, project: project) } diff --git a/spec/services/users/migrate_records_to_ghost_user_in_batches_service_spec.rb b/spec/services/users/migrate_records_to_ghost_user_in_batches_service_spec.rb index 107ff82016c..0b9f92a868e 100644 --- a/spec/services/users/migrate_records_to_ghost_user_in_batches_service_spec.rb +++ b/spec/services/users/migrate_records_to_ghost_user_in_batches_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Users::MigrateRecordsToGhostUserInBatchesService do +RSpec.describe Users::MigrateRecordsToGhostUserInBatchesService, feature_category: :user_management do let(:service) { described_class.new } let_it_be(:ghost_user_migration) { create(:ghost_user_migration) } diff --git a/spec/services/users/migrate_records_to_ghost_user_service_spec.rb b/spec/services/users/migrate_records_to_ghost_user_service_spec.rb index 827d6f652a4..cfa0ddff04d 100644 --- a/spec/services/users/migrate_records_to_ghost_user_service_spec.rb +++ b/spec/services/users/migrate_records_to_ghost_user_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Users::MigrateRecordsToGhostUserService do +RSpec.describe Users::MigrateRecordsToGhostUserService, feature_category: :user_management do include BatchDestroyDependentAssociationsHelper let!(:user) { create(:user) } diff --git a/spec/services/users/refresh_authorized_projects_service_spec.rb b/spec/services/users/refresh_authorized_projects_service_spec.rb index e33886d2add..55b27954a74 100644 --- a/spec/services/users/refresh_authorized_projects_service_spec.rb +++ b/spec/services/users/refresh_authorized_projects_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Users::RefreshAuthorizedProjectsService do +RSpec.describe Users::RefreshAuthorizedProjectsService, feature_category: :user_management do include ExclusiveLeaseHelpers # We're using let! here so that any expectations for the service class are not diff --git a/spec/services/users/registrations_build_service_spec.rb b/spec/services/users/registrations_build_service_spec.rb index fa53a4cc604..736db855fe0 100644 --- a/spec/services/users/registrations_build_service_spec.rb +++ b/spec/services/users/registrations_build_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Users::RegistrationsBuildService do +RSpec.describe Users::RegistrationsBuildService, feature_category: :system_access do describe '#execute' do let(:base_params) { build_stubbed(:user).slice(:first_name, :last_name, :username, :email, :password) } let(:skip_param) { {} } diff --git a/spec/services/users/reject_service_spec.rb b/spec/services/users/reject_service_spec.rb index 37d003c5dac..f72666d8a63 100644 --- a/spec/services/users/reject_service_spec.rb +++ b/spec/services/users/reject_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Users::RejectService do +RSpec.describe Users::RejectService, feature_category: :user_management do let_it_be(:current_user) { create(:admin) } let(:user) { create(:user, :blocked_pending_approval) } diff --git a/spec/services/users/repair_ldap_blocked_service_spec.rb b/spec/services/users/repair_ldap_blocked_service_spec.rb index 54540d68af2..424c14ccdbc 100644 --- a/spec/services/users/repair_ldap_blocked_service_spec.rb +++ b/spec/services/users/repair_ldap_blocked_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Users::RepairLdapBlockedService do +RSpec.describe Users::RepairLdapBlockedService, feature_category: :system_access do let(:user) { create(:omniauth_user, provider: 'ldapmain', state: 'ldap_blocked') } let(:identity) { user.ldap_identity } diff --git a/spec/services/users/respond_to_terms_service_spec.rb b/spec/services/users/respond_to_terms_service_spec.rb index 1997dcd0e04..dc33f98535a 100644 --- a/spec/services/users/respond_to_terms_service_spec.rb +++ b/spec/services/users/respond_to_terms_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Users::RespondToTermsService do +RSpec.describe Users::RespondToTermsService, feature_category: :user_profile do let(:user) { create(:user) } let(:term) { create(:term) } diff --git a/spec/services/users/saved_replies/create_service_spec.rb b/spec/services/users/saved_replies/create_service_spec.rb index e01b6248308..ee42a53a220 100644 --- a/spec/services/users/saved_replies/create_service_spec.rb +++ b/spec/services/users/saved_replies/create_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Users::SavedReplies::CreateService do +RSpec.describe Users::SavedReplies::CreateService, feature_category: :team_planning do describe '#execute' do let_it_be(:current_user) { create(:user) } let_it_be(:saved_reply) { create(:saved_reply, user: current_user) } diff --git a/spec/services/users/saved_replies/destroy_service_spec.rb b/spec/services/users/saved_replies/destroy_service_spec.rb index cb97fac7b7c..41c2013e3df 100644 --- a/spec/services/users/saved_replies/destroy_service_spec.rb +++ b/spec/services/users/saved_replies/destroy_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Users::SavedReplies::DestroyService do +RSpec.describe Users::SavedReplies::DestroyService, feature_category: :team_planning do describe '#execute' do let!(:saved_reply) { create(:saved_reply) } diff --git a/spec/services/users/saved_replies/update_service_spec.rb b/spec/services/users/saved_replies/update_service_spec.rb index bdb54d7c8f7..c18b7395040 100644 --- a/spec/services/users/saved_replies/update_service_spec.rb +++ b/spec/services/users/saved_replies/update_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Users::SavedReplies::UpdateService do +RSpec.describe Users::SavedReplies::UpdateService, feature_category: :team_planning do describe '#execute' do let_it_be(:current_user) { create(:user) } let_it_be(:saved_reply) { create(:saved_reply, user: current_user) } diff --git a/spec/services/users/set_status_service_spec.rb b/spec/services/users/set_status_service_spec.rb index 76e86506d94..b75c558785f 100644 --- a/spec/services/users/set_status_service_spec.rb +++ b/spec/services/users/set_status_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Users::SetStatusService do +RSpec.describe Users::SetStatusService, feature_category: :user_management do let(:current_user) { create(:user) } subject(:service) { described_class.new(current_user, params) } diff --git a/spec/services/users/signup_service_spec.rb b/spec/services/users/signup_service_spec.rb index ef532e01d0b..29663411346 100644 --- a/spec/services/users/signup_service_spec.rb +++ b/spec/services/users/signup_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Users::SignupService do +RSpec.describe Users::SignupService, feature_category: :system_access do let(:user) { create(:user, setup_for_company: true) } describe '#execute' do @@ -48,11 +48,7 @@ RSpec.describe Users::SignupService do expect(user.reload.setup_for_company).to be(false) end - context 'when on .com' do - before do - allow(Gitlab).to receive(:com?).and_return(true) - end - + context 'when on SaaS', :saas do it 'returns an error result when setup_for_company is missing' do result = update_user(user, setup_for_company: '') diff --git a/spec/services/users/unban_service_spec.rb b/spec/services/users/unban_service_spec.rb index 3dcb8450e7b..20fe40b370f 100644 --- a/spec/services/users/unban_service_spec.rb +++ b/spec/services/users/unban_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Users::UnbanService do +RSpec.describe Users::UnbanService, feature_category: :user_management do let(:user) { create(:user) } let_it_be(:current_user) { create(:admin) } diff --git a/spec/services/users/unblock_service_spec.rb b/spec/services/users/unblock_service_spec.rb index 25ee99427ab..95a077d6100 100644 --- a/spec/services/users/unblock_service_spec.rb +++ b/spec/services/users/unblock_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Users::UnblockService do +RSpec.describe Users::UnblockService, feature_category: :user_management do let_it_be(:current_user) { create(:admin) } subject(:service) { described_class.new(current_user) } diff --git a/spec/services/users/update_canonical_email_service_spec.rb b/spec/services/users/update_canonical_email_service_spec.rb index 1dead13d338..559b759a400 100644 --- a/spec/services/users/update_canonical_email_service_spec.rb +++ b/spec/services/users/update_canonical_email_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Users::UpdateCanonicalEmailService do +RSpec.describe Users::UpdateCanonicalEmailService, feature_category: :user_profile do let(:other_email) { "differentaddress@includeddomain.com" } before do diff --git a/spec/services/users/update_highest_member_role_service_spec.rb b/spec/services/users/update_highest_member_role_service_spec.rb index 89ddd635bb6..06f4d787d72 100644 --- a/spec/services/users/update_highest_member_role_service_spec.rb +++ b/spec/services/users/update_highest_member_role_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Users::UpdateHighestMemberRoleService do +RSpec.describe Users::UpdateHighestMemberRoleService, feature_category: :user_management do let(:user) { create(:user) } let(:execute_service) { described_class.new(user).execute } diff --git a/spec/services/users/update_service_spec.rb b/spec/services/users/update_service_spec.rb index f4ea757f81a..1716685566c 100644 --- a/spec/services/users/update_service_spec.rb +++ b/spec/services/users/update_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Users::UpdateService do +RSpec.describe Users::UpdateService, feature_category: :user_profile do let(:password) { User.random_password } let(:user) { create(:user, password: password, password_confirmation: password) } diff --git a/spec/services/users/update_todo_count_cache_service_spec.rb b/spec/services/users/update_todo_count_cache_service_spec.rb index 3d96af928df..eec637cf5b4 100644 --- a/spec/services/users/update_todo_count_cache_service_spec.rb +++ b/spec/services/users/update_todo_count_cache_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Users::UpdateTodoCountCacheService do +RSpec.describe Users::UpdateTodoCountCacheService, feature_category: :team_planning do describe '#execute' do let_it_be(:user1) { create(:user) } let_it_be(:user2) { create(:user) } diff --git a/spec/services/users/upsert_credit_card_validation_service_spec.rb b/spec/services/users/upsert_credit_card_validation_service_spec.rb index ac7e619612f..37aa5fed838 100644 --- a/spec/services/users/upsert_credit_card_validation_service_spec.rb +++ b/spec/services/users/upsert_credit_card_validation_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Users::UpsertCreditCardValidationService do +RSpec.describe Users::UpsertCreditCardValidationService, feature_category: :user_profile do let_it_be(:user) { create(:user, requires_credit_card_verification: true) } let(:user_id) { user.id } diff --git a/spec/services/users/validate_manual_otp_service_spec.rb b/spec/services/users/validate_manual_otp_service_spec.rb index d71735814f2..9a6083bc41c 100644 --- a/spec/services/users/validate_manual_otp_service_spec.rb +++ b/spec/services/users/validate_manual_otp_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Users::ValidateManualOtpService do +RSpec.describe Users::ValidateManualOtpService, feature_category: :user_profile do let_it_be(:user) { create(:user) } let(:otp_code) { 42 } @@ -32,6 +32,20 @@ RSpec.describe Users::ValidateManualOtpService do validate end + + it 'handles unexpected error' do + error_message = "boom!" + + expect_next_instance_of(::Gitlab::Auth::Otp::Strategies::FortiAuthenticator::ManualOtp) do |strategy| + expect(strategy).to receive(:validate).with(otp_code).once.and_raise(StandardError, error_message) + end + expect(Gitlab::ErrorTracking).to receive(:log_exception) + + result = validate + + expect(result[:status]).to eq(:error) + expect(result[:message]).to eq(error_message) + end end context 'FortiTokenCloud' do @@ -49,16 +63,23 @@ RSpec.describe Users::ValidateManualOtpService do end end - context 'unexpected error' do + context 'DuoAuth' do before do - stub_feature_flags(forti_authenticator: user) - allow(::Gitlab.config.forti_authenticator).to receive(:enabled).and_return(true) + allow(::Gitlab.config.duo_auth).to receive(:enabled).and_return(true) end - it 'returns error' do + it 'calls DuoAuth strategy' do + expect_next_instance_of(::Gitlab::Auth::Otp::Strategies::DuoAuth::ManualOtp) do |strategy| + expect(strategy).to receive(:validate).with(otp_code).once + end + + validate + end + + it "handles unexpected error" do error_message = "boom!" - expect_next_instance_of(::Gitlab::Auth::Otp::Strategies::FortiAuthenticator::ManualOtp) do |strategy| + expect_next_instance_of(::Gitlab::Auth::Otp::Strategies::DuoAuth::ManualOtp) do |strategy| expect(strategy).to receive(:validate).with(otp_code).once.and_raise(StandardError, error_message) end expect(Gitlab::ErrorTracking).to receive(:log_exception) diff --git a/spec/services/users/validate_push_otp_service_spec.rb b/spec/services/users/validate_push_otp_service_spec.rb index 960b6bcd3bb..4ef374cbb7f 100644 --- a/spec/services/users/validate_push_otp_service_spec.rb +++ b/spec/services/users/validate_push_otp_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Users::ValidatePushOtpService do +RSpec.describe Users::ValidatePushOtpService, feature_category: :user_profile do let_it_be(:user) { create(:user) } subject(:validate) { described_class.new(user).execute } diff --git a/spec/services/verify_pages_domain_service_spec.rb b/spec/services/verify_pages_domain_service_spec.rb index 42f7ebc85f9..d66d584d3d0 100644 --- a/spec/services/verify_pages_domain_service_spec.rb +++ b/spec/services/verify_pages_domain_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe VerifyPagesDomainService do +RSpec.describe VerifyPagesDomainService, feature_category: :pages do using RSpec::Parameterized::TableSyntax include EmailHelpers diff --git a/spec/services/web_hooks/destroy_service_spec.rb b/spec/services/web_hooks/destroy_service_spec.rb index ca8cb8a1b75..642c25ab312 100644 --- a/spec/services/web_hooks/destroy_service_spec.rb +++ b/spec/services/web_hooks/destroy_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe WebHooks::DestroyService do +RSpec.describe WebHooks::DestroyService, feature_category: :webhooks do let_it_be(:user) { create(:user) } subject { described_class.new(user) } diff --git a/spec/services/web_hooks/log_destroy_service_spec.rb b/spec/services/web_hooks/log_destroy_service_spec.rb index 7634726e5a4..b0444b659ba 100644 --- a/spec/services/web_hooks/log_destroy_service_spec.rb +++ b/spec/services/web_hooks/log_destroy_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe WebHooks::LogDestroyService do +RSpec.describe WebHooks::LogDestroyService, feature_category: :webhooks do subject(:service) { described_class.new(hook.id) } describe '#execute' do diff --git a/spec/services/web_hooks/log_execution_service_spec.rb b/spec/services/web_hooks/log_execution_service_spec.rb index 8a845f60ad2..f56c07386fa 100644 --- a/spec/services/web_hooks/log_execution_service_spec.rb +++ b/spec/services/web_hooks/log_execution_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe WebHooks::LogExecutionService do +RSpec.describe WebHooks::LogExecutionService, feature_category: :webhooks do include ExclusiveLeaseHelpers using RSpec::Parameterized::TableSyntax diff --git a/spec/services/webauthn/authenticate_service_spec.rb b/spec/services/webauthn/authenticate_service_spec.rb index b40f9465b63..ca940dff0eb 100644 --- a/spec/services/webauthn/authenticate_service_spec.rb +++ b/spec/services/webauthn/authenticate_service_spec.rb @@ -3,7 +3,7 @@ require 'spec_helper' require 'webauthn/fake_client' -RSpec.describe Webauthn::AuthenticateService do +RSpec.describe Webauthn::AuthenticateService, feature_category: :system_access do let(:client) { WebAuthn::FakeClient.new(origin) } let(:user) { create(:user) } let(:challenge) { Base64.strict_encode64(SecureRandom.random_bytes(32)) } diff --git a/spec/services/webauthn/register_service_spec.rb b/spec/services/webauthn/register_service_spec.rb index bb9fa2080d2..2286d261e94 100644 --- a/spec/services/webauthn/register_service_spec.rb +++ b/spec/services/webauthn/register_service_spec.rb @@ -3,7 +3,7 @@ require 'spec_helper' require 'webauthn/fake_client' -RSpec.describe Webauthn::RegisterService do +RSpec.describe Webauthn::RegisterService, feature_category: :system_access do let(:client) { WebAuthn::FakeClient.new(origin) } let(:user) { create(:user) } let(:challenge) { Base64.strict_encode64(SecureRandom.random_bytes(32)) } diff --git a/spec/services/wiki_pages/base_service_spec.rb b/spec/services/wiki_pages/base_service_spec.rb index 6ccc796014c..f434dc689ef 100644 --- a/spec/services/wiki_pages/base_service_spec.rb +++ b/spec/services/wiki_pages/base_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe WikiPages::BaseService do +RSpec.describe WikiPages::BaseService, feature_category: :wiki do let(:project) { double('project') } let(:user) { double('user') } diff --git a/spec/services/wiki_pages/create_service_spec.rb b/spec/services/wiki_pages/create_service_spec.rb index fd3776f4207..ca2d38ad70d 100644 --- a/spec/services/wiki_pages/create_service_spec.rb +++ b/spec/services/wiki_pages/create_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe WikiPages::CreateService do +RSpec.describe WikiPages::CreateService, feature_category: :wiki do it_behaves_like 'WikiPages::CreateService#execute', :project describe '#execute' do diff --git a/spec/services/wiki_pages/destroy_service_spec.rb b/spec/services/wiki_pages/destroy_service_spec.rb index 9384ea1cd43..ff29fc59b3e 100644 --- a/spec/services/wiki_pages/destroy_service_spec.rb +++ b/spec/services/wiki_pages/destroy_service_spec.rb @@ -2,6 +2,6 @@ require 'spec_helper' -RSpec.describe WikiPages::DestroyService do +RSpec.describe WikiPages::DestroyService, feature_category: :wiki do it_behaves_like 'WikiPages::DestroyService#execute', :project end diff --git a/spec/services/wiki_pages/event_create_service_spec.rb b/spec/services/wiki_pages/event_create_service_spec.rb index 8476f872e98..cbc2bd82a98 100644 --- a/spec/services/wiki_pages/event_create_service_spec.rb +++ b/spec/services/wiki_pages/event_create_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe WikiPages::EventCreateService do +RSpec.describe WikiPages::EventCreateService, feature_category: :wiki do let_it_be(:project) { create(:project) } let_it_be(:user) { create(:user) } diff --git a/spec/services/wiki_pages/update_service_spec.rb b/spec/services/wiki_pages/update_service_spec.rb index 62881817e32..79b2b55907b 100644 --- a/spec/services/wiki_pages/update_service_spec.rb +++ b/spec/services/wiki_pages/update_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe WikiPages::UpdateService do +RSpec.describe WikiPages::UpdateService, feature_category: :wiki do it_behaves_like 'WikiPages::UpdateService#execute', :project describe '#execute' do diff --git a/spec/services/wikis/create_attachment_service_spec.rb b/spec/services/wikis/create_attachment_service_spec.rb index 22e34e1f373..fccdbd3040b 100644 --- a/spec/services/wikis/create_attachment_service_spec.rb +++ b/spec/services/wikis/create_attachment_service_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -RSpec.describe Wikis::CreateAttachmentService do +RSpec.describe Wikis::CreateAttachmentService, feature_category: :wiki do let(:container) { create(:project, :wiki_repo) } let(:user) { create(:user) } let(:file_name) { 'filename.txt' } diff --git a/spec/services/work_items/build_service_spec.rb b/spec/services/work_items/build_service_spec.rb index 405b4414fc2..3ecf78e0659 100644 --- a/spec/services/work_items/build_service_spec.rb +++ b/spec/services/work_items/build_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe WorkItems::BuildService do +RSpec.describe WorkItems::BuildService, feature_category: :team_planning do let_it_be(:project) { create(:project, :repository) } let_it_be(:guest) { create(:user) } diff --git a/spec/services/work_items/create_from_task_service_spec.rb b/spec/services/work_items/create_from_task_service_spec.rb index 7c5430f038c..b2f81f1dc54 100644 --- a/spec/services/work_items/create_from_task_service_spec.rb +++ b/spec/services/work_items/create_from_task_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe WorkItems::CreateFromTaskService do +RSpec.describe WorkItems::CreateFromTaskService, feature_category: :team_planning do let_it_be(:project) { create(:project) } let_it_be(:developer) { create(:user) } let_it_be(:list_work_item, refind: true) { create(:work_item, project: project, description: "- [ ] Item to be converted\n second line\n third line") } diff --git a/spec/services/work_items/create_service_spec.rb b/spec/services/work_items/create_service_spec.rb index 1b134c308f2..ecd7937f933 100644 --- a/spec/services/work_items/create_service_spec.rb +++ b/spec/services/work_items/create_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe WorkItems::CreateService do +RSpec.describe WorkItems::CreateService, feature_category: :team_planning do include AfterNextHelpers let_it_be_with_reload(:project) { create(:project) } diff --git a/spec/services/work_items/delete_service_spec.rb b/spec/services/work_items/delete_service_spec.rb index 69ae881a12f..ac72815a57e 100644 --- a/spec/services/work_items/delete_service_spec.rb +++ b/spec/services/work_items/delete_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe WorkItems::DeleteService do +RSpec.describe WorkItems::DeleteService, feature_category: :team_planning do let_it_be(:project) { create(:project, :repository) } let_it_be(:guest) { create(:user) } let_it_be(:work_item, refind: true) { create(:work_item, project: project, author: guest) } diff --git a/spec/services/work_items/delete_task_service_spec.rb b/spec/services/work_items/delete_task_service_spec.rb index 07a0d8d6c1a..dc01da65771 100644 --- a/spec/services/work_items/delete_task_service_spec.rb +++ b/spec/services/work_items/delete_task_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe WorkItems::DeleteTaskService do +RSpec.describe WorkItems::DeleteTaskService, feature_category: :team_planning do let_it_be(:project) { create(:project) } let_it_be(:developer) { create(:user).tap { |u| project.add_developer(u) } } let_it_be_with_refind(:task) { create(:work_item, project: project, author: developer) } diff --git a/spec/services/work_items/export_csv_service_spec.rb b/spec/services/work_items/export_csv_service_spec.rb index 0718d3b686a..7c22312ce1f 100644 --- a/spec/services/work_items/export_csv_service_spec.rb +++ b/spec/services/work_items/export_csv_service_spec.rb @@ -30,9 +30,8 @@ RSpec.describe WorkItems::ExportCsvService, :with_license, feature_category: :te end describe '#email' do - # TODO - will be implemented as part of https://gitlab.com/gitlab-org/gitlab/-/issues/379082 - xit 'emails csv' do - expect { subject.email(user) }.o change { ActionMailer::Base.deliveries.count }.from(0).to(1) + it 'emails csv' do + expect { subject.email(user) }.to change { ActionMailer::Base.deliveries.count }.from(0).to(1) end end diff --git a/spec/services/work_items/import_csv_service_spec.rb b/spec/services/work_items/import_csv_service_spec.rb new file mode 100644 index 00000000000..3c710640f4a --- /dev/null +++ b/spec/services/work_items/import_csv_service_spec.rb @@ -0,0 +1,122 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe WorkItems::ImportCsvService, feature_category: :team_planning do + let_it_be(:project) { create(:project) } + let_it_be(:user) { create(:user) } + let_it_be(:author) { create(:user, username: 'csv_author') } + let(:file) { fixture_file_upload('spec/fixtures/work_items_valid_types.csv') } + let(:service) do + uploader = FileUploader.new(project) + uploader.store!(file) + + described_class.new(user, project, uploader) + end + + let_it_be(:issue_type) { ::WorkItems::Type.default_issue_type } + + let(:work_items) { ::WorkItems::WorkItemsFinder.new(user, project: project).execute } + let(:email_method) { :import_work_items_csv_email } + + subject { service.execute } + + describe '#execute', :aggregate_failures do + context 'when user has permission' do + before do + project.add_reporter(user) + end + + it_behaves_like 'importer with email notification' + + context 'when file format is valid' do + context 'when work item types are available' do + it 'creates the expected number of work items' do + expect { subject }.to change { work_items.count }.by 2 + end + + it 'sets work item attributes' do + result = subject + + expect(work_items.reload).to contain_exactly( + have_attributes( + title: 'Valid issue', + work_item_type_id: issue_type.id + ), + have_attributes( + title: 'Valid issue with alternate case', + work_item_type_id: issue_type.id + ) + ) + + expect(result[:success]).to eq(2) + expect(result[:error_lines]).to eq([]) + expect(result[:type_errors]).to be_nil + expect(result[:parse_error]).to eq(false) + end + end + + context 'when csv contains work item types that are missing or not available' do + let(:file) { fixture_file_upload('spec/fixtures/work_items_invalid_types.csv') } + + it 'creates no work items' do + expect { subject }.not_to change { work_items.count } + end + + it 'returns the correct result' do + result = subject + + expect(result[:success]).to eq(0) + expect(result[:error_lines]).to be_empty # there are problematic lines detailed below + expect(result[:parse_error]).to eq(false) + expect(result[:type_errors]).to match({ + blank: [4], + disallowed: {}, # tested in the EE version + missing: { + "isssue" => [2], + "issue!!" => [3] + } + }) + end + end + end + + context 'when file is missing necessary headers' do + let(:file) { fixture_file_upload('spec/fixtures/work_items_missing_header.csv') } + + it 'creates no records' do + result = subject + + expect(result[:success]).to eq(0) + expect(result[:error_lines]).to eq([1]) + expect(result[:type_errors]).to be_nil + expect(result[:parse_error]).to eq(true) + end + + it 'creates no work items' do + expect { subject }.not_to change { work_items.count } + end + end + + context 'when import_export_work_items_csv feature flag is off' do + before do + stub_feature_flags(import_export_work_items_csv: false) + end + + it 'raises an error' do + expect { subject }.to raise_error(/This feature is currently behind a feature flag and it is not available./) + end + end + end + + context 'when user does not have permission' do + before do + project.add_guest(user) + end + + it 'raises an error' do + expect { subject }.to raise_error(/You do not have permission to import work items in this project/) + end + end + end +end diff --git a/spec/services/work_items/parent_links/create_service_spec.rb b/spec/services/work_items/parent_links/create_service_spec.rb index 5884847eac3..a989ecf9c07 100644 --- a/spec/services/work_items/parent_links/create_service_spec.rb +++ b/spec/services/work_items/parent_links/create_service_spec.rb @@ -68,6 +68,40 @@ RSpec.describe WorkItems::ParentLinks::CreateService, feature_category: :portfol end end + context 'when adjacent is already in place' do + using RSpec::Parameterized::TableSyntax + + let_it_be_with_reload(:parent_item) { create(:work_item, :objective, project: project) } + let_it_be_with_reload(:current_item) { create(:work_item, :objective, project: project) } + + let_it_be_with_reload(:adjacent) do + create(:work_item, :objective, project: project) + end + + let_it_be_with_reload(:link_to_adjacent) do + create(:parent_link, work_item_parent: parent_item, work_item: adjacent) + end + + subject { described_class.new(parent_item, user, { target_issuable: current_item }).execute } + + where(:adjacent_position, :expected_order) do + -100 | lazy { [adjacent, current_item] } + 0 | lazy { [adjacent, current_item] } + 100 | lazy { [adjacent, current_item] } + end + + with_them do + before do + link_to_adjacent.update!(relative_position: adjacent_position) + end + + it 'sets relative positions' do + expect { subject }.to change(parent_link_class, :count).by(1) + expect(parent_item.work_item_children_by_relative_position).to eq(expected_order) + end + end + end + context 'when there are tasks to relate' do let(:params) { { issuable_references: [task1, task2] } } diff --git a/spec/services/work_items/parent_links/destroy_service_spec.rb b/spec/services/work_items/parent_links/destroy_service_spec.rb index 654a03ef6f7..c77546f6ca1 100644 --- a/spec/services/work_items/parent_links/destroy_service_spec.rb +++ b/spec/services/work_items/parent_links/destroy_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe WorkItems::ParentLinks::DestroyService do +RSpec.describe WorkItems::ParentLinks::DestroyService, feature_category: :team_planning do describe '#execute' do let_it_be(:reporter) { create(:user) } let_it_be(:guest) { create(:user) } diff --git a/spec/services/work_items/task_list_reference_removal_service_spec.rb b/spec/services/work_items/task_list_reference_removal_service_spec.rb index 91b7814ae92..4e87ce66c21 100644 --- a/spec/services/work_items/task_list_reference_removal_service_spec.rb +++ b/spec/services/work_items/task_list_reference_removal_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe WorkItems::TaskListReferenceRemovalService do +RSpec.describe WorkItems::TaskListReferenceRemovalService, feature_category: :team_planning do let_it_be(:developer) { create(:user) } let_it_be(:project) { create(:project, :repository).tap { |project| project.add_developer(developer) } } let_it_be(:task) { create(:work_item, project: project, title: 'Task title') } diff --git a/spec/services/work_items/task_list_reference_replacement_service_spec.rb b/spec/services/work_items/task_list_reference_replacement_service_spec.rb index 965c5f1d554..8f696109fa1 100644 --- a/spec/services/work_items/task_list_reference_replacement_service_spec.rb +++ b/spec/services/work_items/task_list_reference_replacement_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe WorkItems::TaskListReferenceReplacementService do +RSpec.describe WorkItems::TaskListReferenceReplacementService, feature_category: :team_planning do let_it_be(:developer) { create(:user) } let_it_be(:project) { create(:project, :repository).tap { |project| project.add_developer(developer) } } let_it_be(:single_line_work_item, refind: true) { create(:work_item, project: project, description: '- [ ] single line', lock_version: 3) } diff --git a/spec/services/work_items/update_service_spec.rb b/spec/services/work_items/update_service_spec.rb index 435995c6570..5647f8c085c 100644 --- a/spec/services/work_items/update_service_spec.rb +++ b/spec/services/work_items/update_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe WorkItems::UpdateService do +RSpec.describe WorkItems::UpdateService, feature_category: :team_planning do let_it_be(:developer) { create(:user) } let_it_be(:guest) { create(:user) } let_it_be(:project) { create(:project) } diff --git a/spec/services/work_items/widgets/assignees_service/update_service_spec.rb b/spec/services/work_items/widgets/assignees_service/update_service_spec.rb index 0ab2c85f078..67736592876 100644 --- a/spec/services/work_items/widgets/assignees_service/update_service_spec.rb +++ b/spec/services/work_items/widgets/assignees_service/update_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe WorkItems::Widgets::AssigneesService::UpdateService, :freeze_time do +RSpec.describe WorkItems::Widgets::AssigneesService::UpdateService, :freeze_time, feature_category: :portfolio_management do let_it_be(:reporter) { create(:user) } let_it_be(:project) { create(:project, :private) } let_it_be(:new_assignee) { create(:user) } diff --git a/spec/services/work_items/widgets/description_service/update_service_spec.rb b/spec/services/work_items/widgets/description_service/update_service_spec.rb index 4275950e720..20b5758dde9 100644 --- a/spec/services/work_items/widgets/description_service/update_service_spec.rb +++ b/spec/services/work_items/widgets/description_service/update_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe WorkItems::Widgets::DescriptionService::UpdateService do +RSpec.describe WorkItems::Widgets::DescriptionService::UpdateService, feature_category: :portfolio_management do let_it_be(:random_user) { create(:user) } let_it_be(:author) { create(:user) } let_it_be(:guest) { create(:user) } diff --git a/spec/services/work_items/widgets/hierarchy_service/create_service_spec.rb b/spec/services/work_items/widgets/hierarchy_service/create_service_spec.rb new file mode 100644 index 00000000000..8d834c9a4f8 --- /dev/null +++ b/spec/services/work_items/widgets/hierarchy_service/create_service_spec.rb @@ -0,0 +1,31 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe WorkItems::Widgets::HierarchyService::CreateService, feature_category: :portfolio_management do + let_it_be(:user) { create(:user) } + let_it_be(:project) { create(:project) } + let_it_be(:parent_item) { create(:work_item, project: project) } + + let(:widget) { parent_item.widgets.find { |widget| widget.is_a?(WorkItems::Widgets::Hierarchy) } } + + shared_examples 'raises a WidgetError' do + it { expect { subject }.to raise_error(described_class::WidgetError, message) } + end + + before(:all) do + project.add_developer(user) + end + + describe '#create' do + subject { described_class.new(widget: widget, current_user: user).after_create_in_transaction(params: params) } + + context 'when invalid params are present' do + let(:params) { { other_parent: 'parent_work_item' } } + + it_behaves_like 'raises a WidgetError' do + let(:message) { 'One or more arguments are invalid: other_parent.' } + end + end + end +end diff --git a/spec/services/work_items/widgets/milestone_service/create_service_spec.rb b/spec/services/work_items/widgets/milestone_service/create_service_spec.rb index 3f90784b703..64ab2421c74 100644 --- a/spec/services/work_items/widgets/milestone_service/create_service_spec.rb +++ b/spec/services/work_items/widgets/milestone_service/create_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe WorkItems::Widgets::MilestoneService::CreateService do +RSpec.describe WorkItems::Widgets::MilestoneService::CreateService, feature_category: :portfolio_management do let_it_be(:group) { create(:group) } let_it_be(:project) { create(:project, :private, group: group) } let_it_be(:project_milestone) { create(:milestone, project: project) } diff --git a/spec/services/work_items/widgets/milestone_service/update_service_spec.rb b/spec/services/work_items/widgets/milestone_service/update_service_spec.rb index f3a7fc156b9..c5bc2b12fc5 100644 --- a/spec/services/work_items/widgets/milestone_service/update_service_spec.rb +++ b/spec/services/work_items/widgets/milestone_service/update_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe WorkItems::Widgets::MilestoneService::UpdateService do +RSpec.describe WorkItems::Widgets::MilestoneService::UpdateService, feature_category: :portfolio_management do let_it_be(:group) { create(:group) } let_it_be(:project) { create(:project, :private, group: group) } let_it_be(:project_milestone) { create(:milestone, project: project) } diff --git a/spec/services/work_items/widgets/notifications_service/update_service_spec.rb b/spec/services/work_items/widgets/notifications_service/update_service_spec.rb new file mode 100644 index 00000000000..9615020fe49 --- /dev/null +++ b/spec/services/work_items/widgets/notifications_service/update_service_spec.rb @@ -0,0 +1,117 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe WorkItems::Widgets::NotificationsService::UpdateService, feature_category: :team_planning do + let_it_be(:group) { create(:group) } + let_it_be(:project) { create(:project, :private, group: group) } + let_it_be(:guest) { create(:user).tap { |u| project.add_guest(u) } } + let_it_be(:author) { create(:user).tap { |u| project.add_guest(u) } } + let_it_be_with_reload(:work_item) { create(:work_item, project: project, author: author) } + let_it_be(:current_user) { guest } + + let(:widget) { work_item.widgets.find { |widget| widget.is_a?(WorkItems::Widgets::Notifications) } } + let(:service) { described_class.new(widget: widget, current_user: current_user) } + + describe '#before_update_in_transaction' do + let(:expected) { params[:subscribed] } + + subject(:update_notifications) { service.before_update_in_transaction(params: params) } + + shared_examples 'failing to update subscription' do + context 'when user is subscribed with a subscription record' do + let_it_be(:subscription) { create_subscription(:subscribed) } + + it "does not update the work item's subscription" do + expect do + update_notifications + subscription.reload + end.to not_change { subscription.subscribed } + .and(not_change { work_item.subscribed?(current_user, project) }) + end + end + + context 'when user is subscribed by being a participant' do + let_it_be(:current_user) { author } + + it 'does not create subscription record or change subscription state' do + expect { update_notifications } + .to not_change { Subscription.count } + .and(not_change { work_item.subscribed?(current_user, project) }) + end + end + end + + shared_examples 'updating notifications subscription successfully' do + it 'updates existing subscription record' do + expect do + update_notifications + subscription.reload + end.to change { subscription.subscribed }.to(expected) + .and(change { work_item.subscribed?(current_user, project) }.to(expected)) + end + end + + context 'when update fails' do + context 'when user lack update_subscription permissions' do + let_it_be(:params) { { subscribed: false } } + + before do + allow(Ability).to receive(:allowed?).and_call_original + allow(Ability).to receive(:allowed?) + .with(current_user, :update_subscription, work_item) + .and_return(false) + end + + it_behaves_like 'failing to update subscription' + end + + context 'when notifications params are not present' do + let_it_be(:params) { {} } + + it_behaves_like 'failing to update subscription' + end + end + + context 'when update is successful' do + context 'when subscribing' do + let_it_be(:subscription) { create_subscription(:unsubscribed) } + let(:params) { { subscribed: true } } + + it_behaves_like 'updating notifications subscription successfully' + end + + context 'when unsubscribing' do + let(:params) { { subscribed: false } } + + context 'when user is subscribed with a subscription record' do + let_it_be(:subscription) { create_subscription(:subscribed) } + + it_behaves_like 'updating notifications subscription successfully' + end + + context 'when user is subscribed by being a participant' do + let_it_be(:current_user) { author } + + it 'creates a subscription with expected value' do + expect { update_notifications } + .to change { Subscription.count }.by(1) + .and(change { work_item.subscribed?(current_user, project) }.to(expected)) + + expect(Subscription.last.subscribed).to eq(expected) + end + end + end + end + end + + def create_subscription(state) + create( + :subscription, + project: project, + user: current_user, + subscribable: work_item, + subscribed: (state == :subscribed) + ) + end +end diff --git a/spec/services/work_items/widgets/start_and_due_date_service/update_service_spec.rb b/spec/services/work_items/widgets/start_and_due_date_service/update_service_spec.rb index d328c541fc7..a46e9ac9f7a 100644 --- a/spec/services/work_items/widgets/start_and_due_date_service/update_service_spec.rb +++ b/spec/services/work_items/widgets/start_and_due_date_service/update_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe WorkItems::Widgets::StartAndDueDateService::UpdateService do +RSpec.describe WorkItems::Widgets::StartAndDueDateService::UpdateService, feature_category: :portfolio_management do let_it_be(:user) { create(:user) } let_it_be(:project) { create(:project) } let_it_be_with_reload(:work_item) { create(:work_item, project: project) } diff --git a/spec/services/x509_certificate_revoke_service_spec.rb b/spec/services/x509_certificate_revoke_service_spec.rb index ff5d2dc058b..460381afd79 100644 --- a/spec/services/x509_certificate_revoke_service_spec.rb +++ b/spec/services/x509_certificate_revoke_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe X509CertificateRevokeService do +RSpec.describe X509CertificateRevokeService, feature_category: :system_access do describe '#execute' do let(:service) { described_class.new } let!(:x509_signature_1) { create(:x509_commit_signature, x509_certificate: x509_certificate, verification_status: :verified) } |