From 3a77f46d0914b01949b35be2a3619103f35d5a8d Mon Sep 17 00:00:00 2001 From: GitLab Bot Date: Mon, 23 Jun 2025 12:07:46 +0000 Subject: [PATCH] Add latest changes from gitlab-org/gitlab@master --- .rubocop_todo/layout/line_length.yml | 1 - .rubocop_todo/rspec/change_by_zero.yml | 24 --- .rubocop_todo/rspec/context_wording.yml | 1 - .../rspec/example_without_description.yml | 1 - .rubocop_todo/rspec/expect_in_hook.yml | 1 - .rubocop_todo/rspec/named_subject.yml | 1 - .rubocop_todo/style/string_concatenation.yml | 1 - .../components/pipeline_operations.vue | 4 +- app/assets/javascripts/sidebar/constants.js | 2 +- app/graphql/types/namespaces/link_paths.rb | 2 +- .../link_paths/comment_template_type.rb | 21 ++ .../link_paths/group_namespace_links_type.rb | 2 +- .../project_namespace_links_type.rb | 2 +- app/models/project.rb | 1 + app/views/layouts/minimal.html.haml | 2 +- config/sidekiq_queues.yml | 4 + ...versal_ids_to_vulnerability_statistics.yml | 4 +- ...ian_project_component_files_project_id.yml | 2 +- .../backfill_software_license_policies.yml | 2 +- .../backfill_wiki_page_slugs_namespace_id.yml | 2 +- ...lize_backfill_software_license_policies.rb | 21 ++ ...bian_project_component_files_project_id.rb | 20 ++ ...e_backfill_wiki_page_slugs_namespace_id.rb | 20 ++ ...l_ids_to_vulnerability_statistics_again.rb | 28 +++ db/schema_migrations/20250616151232 | 1 + db/schema_migrations/20250617193751 | 1 + db/schema_migrations/20250619174731 | 1 + db/schema_migrations/20250620051921 | 1 + doc/api/graphql/reference/_index.md | 19 +- doc/ci/variables/predefined_variables.md | 1 + doc/update/_index.md | 2 + .../set_up_gitlab_agent_and_proxies.md | 2 +- lib/gitlab/regex/packages.rb | 2 +- lib/search/navigation.rb | 8 +- locale/gitlab.pot | 9 + .../workspaces_kubernetes_setup.sh | 2 +- spec/controllers/search_controller_spec.rb | 181 +++++++----------- .../sidebar_escalation_status_spec.js | 7 +- .../group_namespace_links_type_spec.rb | 2 +- .../project_namespace_links_type_spec.rb | 2 +- spec/lib/gitlab/ci/variables/builder_spec.rb | 2 + spec/lib/gitlab/regex_spec.rb | 6 +- spec/lib/search/navigation_spec.rb | 16 +- ..._to_vulnerability_statistics_again_spec.rb | 27 +++ spec/models/ci/build_spec.rb | 1 + spec/models/packages/generic/package_spec.rb | 1 + ...create_downstream_pipeline_service_spec.rb | 2 +- .../ci/delete_objects_service_spec.rb | 2 +- .../destroy_all_expired_service_spec.rb | 2 +- .../destroy_batch_service_spec.rb | 2 +- .../create_project_service_spec.rb | 9 +- .../timeline_events/update_service_spec.rb | 4 +- spec/services/issues/close_service_spec.rb | 2 +- .../create_from_issue_service_spec.rb | 2 +- .../merge_requests/refresh_service_spec.rb | 6 +- .../composer/create_package_service_spec.rb | 4 +- .../npm/create_metadata_cache_service_spec.rb | 4 +- .../nuget/sync_metadatum_service_spec.rb | 2 +- ...date_package_from_metadata_service_spec.rb | 18 +- .../protection/create_rule_service_spec.rb | 4 +- .../pypi/create_package_service_spec.rb | 2 +- .../projects/transfer_service_spec.rb | 2 +- .../projects/update_pages_service_spec.rb | 2 +- .../routes/rename_descendants_service_spec.rb | 28 +-- spec/support/rspec_order_todo.yml | 1 - .../controllers/todos_shared_examples.rb | 4 +- .../timelogs/create_shared_examples.rb | 2 +- .../relative_positioning_shared_examples.rb | 6 +- .../api/pypi_packages_shared_examples.rb | 6 +- .../create_service_shared_examples.rb | 2 +- ..._repository_shard_moves_shared_examples.rb | 2 +- .../update_service_shared_examples.rb | 2 +- spec/views/layouts/minimal.html.haml_spec.rb | 12 ++ 73 files changed, 352 insertions(+), 245 deletions(-) create mode 100644 app/graphql/types/namespaces/link_paths/comment_template_type.rb create mode 100644 db/post_migrate/20250616151232_finalize_backfill_software_license_policies.rb create mode 100644 db/post_migrate/20250617193751_finalize_backfill_packages_debian_project_component_files_project_id.rb create mode 100644 db/post_migrate/20250619174731_finalize_backfill_wiki_page_slugs_namespace_id.rb create mode 100644 db/post_migrate/20250620051921_requeue_backfill_archived_and_traversal_ids_to_vulnerability_statistics_again.rb create mode 100644 db/schema_migrations/20250616151232 create mode 100644 db/schema_migrations/20250617193751 create mode 100644 db/schema_migrations/20250619174731 create mode 100644 db/schema_migrations/20250620051921 create mode 100644 spec/migrations/20250620051921_requeue_backfill_archived_and_traversal_ids_to_vulnerability_statistics_again_spec.rb diff --git a/.rubocop_todo/layout/line_length.yml b/.rubocop_todo/layout/line_length.yml index 833eed69fa4..cbb077e9719 100644 --- a/.rubocop_todo/layout/line_length.yml +++ b/.rubocop_todo/layout/line_length.yml @@ -2448,7 +2448,6 @@ Layout/LineLength: - 'spec/controllers/registrations_controller_spec.rb' - 'spec/controllers/repositories/git_http_controller_spec.rb' - 'spec/controllers/repositories/lfs_storage_controller_spec.rb' - - 'spec/controllers/search_controller_spec.rb' - 'spec/controllers/sessions_controller_spec.rb' - 'spec/controllers/uploads_controller_spec.rb' - 'spec/db/schema_spec.rb' diff --git a/.rubocop_todo/rspec/change_by_zero.yml b/.rubocop_todo/rspec/change_by_zero.yml index 334e0f0e58c..5b21a515227 100644 --- a/.rubocop_todo/rspec/change_by_zero.yml +++ b/.rubocop_todo/rspec/change_by_zero.yml @@ -41,27 +41,3 @@ RSpec/ChangeByZero: - 'spec/lib/gitlab/seeders/project_environment_seeder_spec.rb' - 'spec/migrations/db/migrate/20240806100120_remove_records_without_project_from_project_saved_replies_table_spec.rb' - 'spec/models/integrations/slack_workspace/api_scope_spec.rb' - - 'spec/services/ci/create_downstream_pipeline_service_spec.rb' - - 'spec/services/ci/delete_objects_service_spec.rb' - - 'spec/services/ci/job_artifacts/destroy_all_expired_service_spec.rb' - - 'spec/services/ci/job_artifacts/destroy_batch_service_spec.rb' - - 'spec/services/import/gitlab_projects/create_project_service_spec.rb' - - 'spec/services/incident_management/timeline_events/update_service_spec.rb' - - 'spec/services/merge_requests/create_from_issue_service_spec.rb' - - 'spec/services/merge_requests/refresh_service_spec.rb' - - 'spec/services/packages/composer/create_package_service_spec.rb' - - 'spec/services/packages/npm/create_metadata_cache_service_spec.rb' - - 'spec/services/packages/nuget/sync_metadatum_service_spec.rb' - - 'spec/services/packages/nuget/update_package_from_metadata_service_spec.rb' - - 'spec/services/packages/protection/create_rule_service_spec.rb' - - 'spec/services/packages/pypi/create_package_service_spec.rb' - - 'spec/services/projects/transfer_service_spec.rb' - - 'spec/services/projects/update_pages_service_spec.rb' - - 'spec/services/routes/rename_descendants_service_spec.rb' - - 'spec/support/shared_examples/controllers/todos_shared_examples.rb' - - 'spec/support/shared_examples/graphql/mutations/timelogs/create_shared_examples.rb' - - 'spec/support/shared_examples/models/relative_positioning_shared_examples.rb' - - 'spec/support/shared_examples/requests/api/pypi_packages_shared_examples.rb' - - 'spec/support/shared_examples/services/clusters/create_service_shared_examples.rb' - - 'spec/support/shared_examples/services/schedule_bulk_repository_shard_moves_shared_examples.rb' - - 'spec/support/shared_examples/services/wiki_pages/update_service_shared_examples.rb' diff --git a/.rubocop_todo/rspec/context_wording.yml b/.rubocop_todo/rspec/context_wording.yml index a04f88c4960..226fbd7e290 100644 --- a/.rubocop_todo/rspec/context_wording.yml +++ b/.rubocop_todo/rspec/context_wording.yml @@ -904,7 +904,6 @@ RSpec/ContextWording: - 'spec/controllers/projects/web_ide_terminals_controller_spec.rb' - 'spec/controllers/projects_controller_spec.rb' - 'spec/controllers/root_controller_spec.rb' - - 'spec/controllers/search_controller_spec.rb' - 'spec/controllers/sessions_controller_spec.rb' - 'spec/controllers/snippets/notes_controller_spec.rb' - 'spec/controllers/snippets_controller_spec.rb' diff --git a/.rubocop_todo/rspec/example_without_description.yml b/.rubocop_todo/rspec/example_without_description.yml index d716d20718b..23a46c24216 100644 --- a/.rubocop_todo/rspec/example_without_description.yml +++ b/.rubocop_todo/rspec/example_without_description.yml @@ -228,7 +228,6 @@ RSpec/ExampleWithoutDescription: - 'spec/controllers/projects/releases/evidences_controller_spec.rb' - 'spec/controllers/projects/releases_controller_spec.rb' - 'spec/controllers/projects/templates_controller_spec.rb' - - 'spec/controllers/search_controller_spec.rb' - 'spec/features/admin/users/admin_sees_user_spec.rb' - 'spec/features/admin/users/users_spec.rb' - 'spec/features/commits_spec.rb' diff --git a/.rubocop_todo/rspec/expect_in_hook.yml b/.rubocop_todo/rspec/expect_in_hook.yml index e7f40c1bf87..f98cec842ad 100644 --- a/.rubocop_todo/rspec/expect_in_hook.yml +++ b/.rubocop_todo/rspec/expect_in_hook.yml @@ -87,7 +87,6 @@ RSpec/ExpectInHook: - 'spec/controllers/projects/settings/ci_cd_controller_spec.rb' - 'spec/controllers/projects/settings/operations_controller_spec.rb' - 'spec/controllers/projects_controller_spec.rb' - - 'spec/controllers/search_controller_spec.rb' - 'spec/controllers/snippets/notes_controller_spec.rb' - 'spec/features/admin/admin_mode/login_spec.rb' - 'spec/features/admin/admin_projects_spec.rb' diff --git a/.rubocop_todo/rspec/named_subject.yml b/.rubocop_todo/rspec/named_subject.yml index e129d6c919b..df190766f9f 100644 --- a/.rubocop_todo/rspec/named_subject.yml +++ b/.rubocop_todo/rspec/named_subject.yml @@ -1195,7 +1195,6 @@ RSpec/NamedSubject: - 'spec/controllers/registrations_controller_spec.rb' - 'spec/controllers/repositories/lfs_storage_controller_spec.rb' - 'spec/controllers/root_controller_spec.rb' - - 'spec/controllers/search_controller_spec.rb' - 'spec/controllers/sessions_controller_spec.rb' - 'spec/controllers/snippets/blobs_controller_spec.rb' - 'spec/controllers/snippets/notes_controller_spec.rb' diff --git a/.rubocop_todo/style/string_concatenation.yml b/.rubocop_todo/style/string_concatenation.yml index 157183e6dff..10dc434cb64 100644 --- a/.rubocop_todo/style/string_concatenation.yml +++ b/.rubocop_todo/style/string_concatenation.yml @@ -110,7 +110,6 @@ Style/StringConcatenation: - 'spec/controllers/projects/labels_controller_spec.rb' - 'spec/controllers/projects/uploads_controller_spec.rb' - 'spec/controllers/projects_controller_spec.rb' - - 'spec/controllers/search_controller_spec.rb' - 'spec/experiments/application_experiment_spec.rb' - 'spec/factories/ci/daily_build_group_report_results.rb' - 'spec/factories/gitaly/commit.rb' diff --git a/app/assets/javascripts/ci/pipelines_page/components/pipeline_operations.vue b/app/assets/javascripts/ci/pipelines_page/components/pipeline_operations.vue index 82ba602ae32..7407c1502ab 100644 --- a/app/assets/javascripts/ci/pipelines_page/components/pipeline_operations.vue +++ b/app/assets/javascripts/ci/pipelines_page/components/pipeline_operations.vue @@ -96,7 +96,7 @@ export default { `resolved` | [`Int`](#int) | Count of resolved code quality degradations. | | `total` | [`Int`](#int) | Total count of code quality degradations. | +### `CommentTemplatePath` + +#### Fields + +| Name | Type | Description | +| ---- | ---- | ----------- | +| `href` | [`String!`](#string) | Path of the comment template. | +| `text` | [`String!`](#string) | Text used on the template path. | + ### `CommentTemplatePathType` #### Fields @@ -24585,6 +24594,7 @@ Represents a ComplianceRequirement associated with a ComplianceFramework. | ---- | ---- | ----------- | | `complianceRequirementsControls` | [`ComplianceRequirementsControlConnection`](#compliancerequirementscontrolconnection) | Compliance controls of the compliance requirement. (see [Connections](#connections)) | | `description` | [`String!`](#string) | Description of the compliance requirement. | +| `framework` | [`ComplianceFramework`](#complianceframework) | Compliance framework associated with the requirement. | | `id` | [`ID!`](#id) | Compliance requirement ID. | | `name` | [`String!`](#string) | Name of the compliance requirement. | @@ -24606,6 +24616,7 @@ Represents a ComplianceRequirementsControl associated with a ComplianceRequireme | Name | Type | Description | | ---- | ---- | ----------- | +| `complianceRequirement` | [`ComplianceRequirement`](#compliancerequirement) | Compliance requirement associated with the control. | | `controlType` | [`String!`](#string) | Type of the compliance control. | | `expression` | [`String`](#string) | Expression of the compliance control. | | `externalControlName` | [`String`](#string) | Name of the external control. | @@ -30315,7 +30326,7 @@ Limited group data accessible to users without full group read access (e.g. non- | `issuesList` | [`String`](#string) | Namespace issues_list. | | `labelsFetch` | [`String`](#string) | Namespace labels_fetch. | | `labelsManage` | [`String`](#string) | Namespace labels_manage. | -| `newCommentTemplate` | [`String`](#string) | Namespace new_comment_template_paths. | +| `newCommentTemplate` | [`[CommentTemplatePath!]`](#commenttemplatepath) | Namespace new_comment_template_paths. | | `newProject` | [`String`](#string) | Namespace new_project. | | `register` | [`String`](#string) | Namespace register_path. | | `reportAbuse` | [`String`](#string) | Namespace report_abuse. | @@ -38577,7 +38588,7 @@ Returns [`UserMergeRequestInteraction`](#usermergerequestinteraction). | `issuesList` | [`String`](#string) | Namespace issues_list. | | `labelsFetch` | [`String`](#string) | Namespace labels_fetch. | | `labelsManage` | [`String`](#string) | Namespace labels_manage. | -| `newCommentTemplate` | [`String`](#string) | Namespace new_comment_template_paths. | +| `newCommentTemplate` | [`[CommentTemplatePath!]`](#commenttemplatepath) | Namespace new_comment_template_paths. | | `newProject` | [`String`](#string) | Namespace new_project. | | `register` | [`String`](#string) | Namespace register_path. | | `reportAbuse` | [`String`](#string) | Namespace report_abuse. | @@ -41452,7 +41463,7 @@ fields relate to interactions between the two entities. | `issuesList` | [`String`](#string) | Namespace issues_list. | | `labelsFetch` | [`String`](#string) | Namespace labels_fetch. | | `labelsManage` | [`String`](#string) | Namespace labels_manage. | -| `newCommentTemplate` | [`String`](#string) | Namespace new_comment_template_paths. | +| `newCommentTemplate` | [`[CommentTemplatePath!]`](#commenttemplatepath) | Namespace new_comment_template_paths. | | `newProject` | [`String`](#string) | Namespace new_project. | | `register` | [`String`](#string) | Namespace register_path. | | `reportAbuse` | [`String`](#string) | Namespace report_abuse. | @@ -49725,7 +49736,7 @@ Implementations: | `issuesList` | [`String`](#string) | Namespace issues_list. | | `labelsFetch` | [`String`](#string) | Namespace labels_fetch. | | `labelsManage` | [`String`](#string) | Namespace labels_manage. | -| `newCommentTemplate` | [`String`](#string) | Namespace new_comment_template_paths. | +| `newCommentTemplate` | [`[CommentTemplatePath!]`](#commenttemplatepath) | Namespace new_comment_template_paths. | | `newProject` | [`String`](#string) | Namespace new_project. | | `register` | [`String`](#string) | Namespace register_path. | | `reportAbuse` | [`String`](#string) | Namespace report_abuse. | diff --git a/doc/ci/variables/predefined_variables.md b/doc/ci/variables/predefined_variables.md index 86e76efdf1b..7d016e82b93 100644 --- a/doc/ci/variables/predefined_variables.md +++ b/doc/ci/variables/predefined_variables.md @@ -65,6 +65,7 @@ Predefined variables become available at three different phases of pipeline exec | `CI_DEBUG_TRACE` | Pipeline | `true` if [debug logging (tracing)](variables_troubleshooting.md#enable-debug-logging) is enabled. | | `CI_DEBUG_SERVICES` | Pipeline | `true` if [service container logging](../services/_index.md#capturing-service-container-logs) is enabled. Introduced in GitLab 15.7. Requires GitLab Runner 15.7. | | `CI_DEFAULT_BRANCH` | Pre-pipeline | The name of the project's default branch. | +| `CI_DEFAULT_BRANCH_SLUG` | Pre-pipeline | `CI_DEFAULT_BRANCH` in lowercase, shortened to 63 bytes, and with everything except `0-9` and `a-z` replaced with `-`. No leading / trailing `-`. Use in URLs, host names and domain names. | | `CI_DEPENDENCY_PROXY_DIRECT_GROUP_IMAGE_PREFIX` | Pre-pipeline | The direct group image prefix for pulling images through the Dependency Proxy. | | `CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX` | Pre-pipeline | The top-level group image prefix for pulling images through the Dependency Proxy. | | `CI_DEPENDENCY_PROXY_PASSWORD` | Pipeline | The password to pull images through the Dependency Proxy. | diff --git a/doc/update/_index.md b/doc/update/_index.md index b947071bb69..8b3d88fdc0e 100644 --- a/doc/update/_index.md +++ b/doc/update/_index.md @@ -43,6 +43,7 @@ To upgrade GitLab: 1. If available in your starting version, consider [turning on maintenance mode](../administration/maintenance_mode/_index.md) during the upgrade. 1. Consult changes for different versions of GitLab to ensure compatibility before upgrading: + - [GitLab 18 changes](versions/gitlab_18_changes.md) - [GitLab 17 changes](versions/gitlab_17_changes.md) - [GitLab 16 changes](versions/gitlab_16_changes.md) - [GitLab 15 changes](versions/gitlab_15_changes.md) @@ -240,6 +241,7 @@ If you're using Geo: - Review [Geo upgrade documentation](../administration/geo/replication/upgrading_the_geo_sites.md). - Read about the Geo version-specific update instructions: + - [GitLab 18](versions/gitlab_18_changes.md) - [GitLab 17](versions/gitlab_17_changes.md) - [GitLab 16](versions/gitlab_16_changes.md) - [GitLab 15](versions/gitlab_15_changes.md) diff --git a/doc/user/workspace/set_up_gitlab_agent_and_proxies.md b/doc/user/workspace/set_up_gitlab_agent_and_proxies.md index 253150b8f42..369d484b8c0 100644 --- a/doc/user/workspace/set_up_gitlab_agent_and_proxies.md +++ b/doc/user/workspace/set_up_gitlab_agent_and_proxies.md @@ -317,7 +317,7 @@ To install the Helm chart for the GitLab workspaces proxy: helm upgrade --install gitlab-workspaces-proxy \ gitlab-workspaces-proxy/gitlab-workspaces-proxy \ - --version=0.1.18 \ + --version=0.1.19 \ --namespace="gitlab-workspaces" \ --set="ingress.enabled=true" \ --set="ingress.hosts[0].host=${GITLAB_WORKSPACES_PROXY_DOMAIN}" \ diff --git a/lib/gitlab/regex/packages.rb b/lib/gitlab/regex/packages.rb index c3273625654..57eb7a4219f 100644 --- a/lib/gitlab/regex/packages.rb +++ b/lib/gitlab/regex/packages.rb @@ -268,7 +268,7 @@ module Gitlab end def generic_package_file_name_regex - generic_package_name_regex + @generic_package_file_name_regex ||= /\A(?!~)[A-Za-z0-9\.\_\-\+~]+(? '1' }) end - describe 'rate limit scope' do - it 'uses current_user and search scope' do - %w[projects blobs users issues merge_requests].each do |scope| - expect(::Gitlab::ApplicationRateLimiter).to receive(:throttled?).with(:search_rate_limit, - scope: [user, scope], users_allowlist: []) - get :count, params: { search: 'hello', scope: scope } - end - end - - it 'uses just current_user when search scope is abusive' do - expect(::Gitlab::ApplicationRateLimiter).to receive(:throttled?).with(:search_rate_limit, - scope: [user], users_allowlist: []) - get :count, params: { search: 'hello', scope: 'hack-the-mainframe' } - - expect(::Gitlab::ApplicationRateLimiter).to receive(:throttled?).with(:search_rate_limit, - scope: [user], users_allowlist: []) - get :count, params: { search: 'hello', scope: 'blobs' * 1000 } - end - end + it_behaves_like 'rate limit scope handling', :count, { search: 'hello' } it 'raises an error if search term is missing' do expect do @@ -523,14 +519,7 @@ RSpec.describe SearchController, feature_category: :global_search do end.to raise_error(ActionController::ParameterMissing) end - it 'sets correct cache control headers' do - get :count, params: { search: 'hello', scope: 'projects' } - - expect(response).to have_gitlab_http_status(:ok) - - expect(response.headers['Cache-Control']).to eq('max-age=60, private') - expect(response.headers['Pragma']).to be_nil - end + it_behaves_like 'sets correct cache control headers', :count, { search: 'hello', scope: 'projects' } it 'does NOT blow up if search param is NOT a string' do get :count, params: { search: ['hello'], scope: 'projects' } @@ -545,7 +534,8 @@ RSpec.describe SearchController, feature_category: :global_search do it 'does NOT blow up if repository_ref contains abusive characters' do get :count, params: { search: 'hello', - repository_ref: "(nslookup%20hitqlwv501f.somewhere.bad%7C%7Cperl%20-e%20%22gethostbyname('hitqlwv501f.somewhere.bad')%22)", + repository_ref: "(nslookup%20hitqlwv501f.somewhere.bad%7C%7Cperl%20-e%20%22gethostbyname" \ + "('hitqlwv501f.somewhere.bad')%22)", scope: 'projects' } expect(response).to have_gitlab_http_status(:ok) @@ -616,25 +606,7 @@ RSpec.describe SearchController, feature_category: :global_search do expect(json_response).to be_empty end - describe 'rate limit scope' do - it 'uses current_user and search scope' do - %w[projects blobs users issues merge_requests].each do |scope| - expect(::Gitlab::ApplicationRateLimiter).to receive(:throttled?).with(:search_rate_limit, - scope: [user, scope], users_allowlist: []) - get :autocomplete, params: { term: 'hello', scope: scope } - end - end - - it 'uses just current_user when search scope is abusive' do - expect(::Gitlab::ApplicationRateLimiter).to receive(:throttled?).with(:search_rate_limit, - scope: [user], users_allowlist: []) - get :autocomplete, params: { term: 'hello', scope: 'hack-the-mainframe' } - - expect(::Gitlab::ApplicationRateLimiter).to receive(:throttled?).with(:search_rate_limit, - scope: [user], users_allowlist: []) - get :autocomplete, params: { term: 'hello', scope: 'blobs' * 1000 } - end - end + it_behaves_like 'rate limit scope handling', :autocomplete, { term: 'hello' } it_behaves_like 'rate limited endpoint', rate_limit_key: :search_rate_limit do let(:current_user) { user } @@ -671,16 +643,9 @@ RSpec.describe SearchController, feature_category: :global_search do get :autocomplete, params: { term: 'setting', filter: 'generic' } end - it 'sets correct cache control headers' do - get :autocomplete, params: { term: 'setting', filter: 'generic' } + it_behaves_like 'sets correct cache control headers', :autocomplete, { term: 'setting', filter: 'generic' } - expect(response).to have_gitlab_http_status(:ok) - - expect(response.headers['Cache-Control']).to eq('max-age=60, private') - expect(response.headers['Pragma']).to be_nil - end - - context 'unique users tracking' do + context 'with unique users tracking' do before do allow(Gitlab::UsageDataCounters::HLLRedisCounter).to receive(:track_event) end @@ -705,7 +670,7 @@ RSpec.describe SearchController, feature_category: :global_search do [Gitlab::Tracking::ServicePingContext.new(data_source: :redis_hll, event: property).to_context] end - let(:namespace) { create(:group) } + let_it_be(:namespace) { create(:group) } end end @@ -764,7 +729,7 @@ RSpec.describe SearchController, feature_category: :global_search do end end - context 'abusive searches', :aggregate_failures do + context 'for abusive searches', :aggregate_failures do let(:project) { create(:project, :public, name: 'hello world') } let(:make_abusive_request) do get :show, params: { scope: '1;drop%20tables;boom', search: 'hello world', project_id: project.id } @@ -782,7 +747,7 @@ RSpec.describe SearchController, feature_category: :global_search do end end - context 'unauthorized user' do + context 'with unauthorized user' do describe 'redirecting' do using RSpec::Parameterized::TableSyntax @@ -823,7 +788,7 @@ RSpec.describe SearchController, feature_category: :global_search do describe 'search rate limits' do using RSpec::Parameterized::TableSyntax - let(:project) { create(:project, :public) } + let_it_be(:project) { create(:project, :public) } where(:endpoint, :params) do :show | { search: 'hello', scope: 'projects' } @@ -839,7 +804,8 @@ RSpec.describe SearchController, feature_category: :global_search do end it 'uses request IP as rate limiting scope' do - expect(::Gitlab::ApplicationRateLimiter).to receive(:throttled?).with(:search_rate_limit_unauthenticated, scope: [request.ip]) + expect(::Gitlab::ApplicationRateLimiter) + .to receive(:throttled?).with(:search_rate_limit_unauthenticated, scope: [request.ip]) get endpoint, params: params.merge(project_id: project.id) end end @@ -855,7 +821,8 @@ RSpec.describe SearchController, feature_category: :global_search do expect(response).to have_gitlab_http_status(:ok) expect(doc.css('OpenSearchDescription ShortName').text).to eq('GitLab') - expect(doc.css('OpenSearchDescription *').map(&:name)).to eq(%w[ShortName Description InputEncoding Image Url SearchForm]) + expect(doc.css('OpenSearchDescription *').map(&:name)) + .to eq(%w[ShortName Description InputEncoding Image Url SearchForm]) end end end @@ -875,7 +842,7 @@ RSpec.describe SearchController, feature_category: :global_search do with_them do it 'returns false' do - result = subject.send(:multi_match?, search_type: search_type, scope: scope) + result = controller.send(:multi_match?, search_type: search_type, scope: scope) expect(result).to be(false) end end diff --git a/spec/frontend/sidebar/components/incidents/sidebar_escalation_status_spec.js b/spec/frontend/sidebar/components/incidents/sidebar_escalation_status_spec.js index fd6af651a1a..5608e5e5a0d 100644 --- a/spec/frontend/sidebar/components/incidents/sidebar_escalation_status_spec.js +++ b/spec/frontend/sidebar/components/incidents/sidebar_escalation_status_spec.js @@ -88,6 +88,11 @@ describe('SidebarEscalationStatus', () => { expect(findSidebarComponent().exists()).toBe(true); }); + it('renders the label as `Paging status`', async () => { + await createComponent(mockApollo); + expect(findSidebarComponent().props('title')).toBe('Paging status'); + }); + describe('status icon', () => { it('is visible', async () => { await createComponent(mockApollo); @@ -102,7 +107,7 @@ describe('SidebarEscalationStatus', () => { const tooltip = getBinding(findIcon().element, 'gl-tooltip'); expect(tooltip).toBeDefined(); - expect(tooltip.value).toBe('Status: Triggered'); + expect(tooltip.value).toBe('Paging status: Triggered'); }); }); diff --git a/spec/graphql/types/namespaces/link_paths/group_namespace_links_type_spec.rb b/spec/graphql/types/namespaces/link_paths/group_namespace_links_type_spec.rb index 75acbe596d5..ee086fb671a 100644 --- a/spec/graphql/types/namespaces/link_paths/group_namespace_links_type_spec.rb +++ b/spec/graphql/types/namespaces/link_paths/group_namespace_links_type_spec.rb @@ -17,7 +17,7 @@ RSpec.describe Types::Namespaces::LinkPaths::GroupNamespaceLinksType, feature_ca :issues_list | lazy { "/groups/#{namespace.full_path}/-/issues" } :labels_manage | lazy { "/groups/#{namespace.full_path}/-/labels" } :new_project | lazy { "/projects/new?namespace_id=#{namespace.id}" } - :new_comment_template | "/-/profile/comment_templates" + :new_comment_template | [{ href: "/-/profile/comment_templates", text: "Your comment templates" }] end with_them do diff --git a/spec/graphql/types/namespaces/link_paths/project_namespace_links_type_spec.rb b/spec/graphql/types/namespaces/link_paths/project_namespace_links_type_spec.rb index 9505d85400e..4797bbb0731 100644 --- a/spec/graphql/types/namespaces/link_paths/project_namespace_links_type_spec.rb +++ b/spec/graphql/types/namespaces/link_paths/project_namespace_links_type_spec.rb @@ -19,7 +19,7 @@ RSpec.describe Types::Namespaces::LinkPaths::ProjectNamespaceLinksType, feature_ :issues_list | lazy { "/#{namespace.full_path}/-/issues" } :labels_manage | lazy { "/#{namespace.full_path}/-/labels" } :new_project | lazy { "/projects/new?namespace_id=#{group.id}" } - :new_comment_template | "/-/profile/comment_templates" + :new_comment_template | [{ href: "/-/profile/comment_templates", text: "Your comment templates" }] :contribution_guide_path | nil end diff --git a/spec/lib/gitlab/ci/variables/builder_spec.rb b/spec/lib/gitlab/ci/variables/builder_spec.rb index 1177ea50371..3a288425234 100644 --- a/spec/lib/gitlab/ci/variables/builder_spec.rb +++ b/spec/lib/gitlab/ci/variables/builder_spec.rb @@ -91,6 +91,8 @@ RSpec.describe Gitlab::Ci::Variables::Builder, :clean_gitlab_redis_cache, featur value: project.external_authorization_classification_label }, { key: 'CI_DEFAULT_BRANCH', value: project.default_branch }, + { key: 'CI_DEFAULT_BRANCH_SLUG', + value: Gitlab::Utils.slugify(project.default_branch.to_s) }, { key: 'CI_CONFIG_PATH', value: project.ci_config_path_or_default }, { key: 'CI_PAGES_DOMAIN', diff --git a/spec/lib/gitlab/regex_spec.rb b/spec/lib/gitlab/regex_spec.rb index af8407ab0e1..9331b03e804 100644 --- a/spec/lib/gitlab/regex_spec.rb +++ b/spec/lib/gitlab/regex_spec.rb @@ -780,7 +780,8 @@ RSpec.describe Gitlab::Regex, feature_category: :tooling do it { is_expected.not_to match('..\..\foo') } it { is_expected.not_to match('%2f%2e%2e%2f%2essh%2fauthorized_keys') } it { is_expected.not_to match('$foo/bar') } - it { is_expected.not_to match('my file name') } + it { is_expected.not_to match('my package name') } + it { is_expected.not_to match('foo.bar.baz-2.0-20190901~47283-1') } it { is_expected.not_to match('!!()()') } end @@ -790,12 +791,15 @@ RSpec.describe Gitlab::Regex, feature_category: :tooling do it { is_expected.to match('123') } it { is_expected.to match('foo') } it { is_expected.to match('foo.bar.baz-2.0-20190901.47283-1.jar') } + it { is_expected.to match('foo.bar.baz-2.0-20190901~47283-1') } it { is_expected.not_to match('../../foo') } it { is_expected.not_to match('..\..\foo') } it { is_expected.not_to match('%2f%2e%2e%2f%2essh%2fauthorized_keys') } it { is_expected.not_to match('$foo/bar') } it { is_expected.not_to match('my file name') } it { is_expected.not_to match('!!()()') } + it { is_expected.not_to match('~/../../filename') } + it { is_expected.not_to match('filename~') } end describe '.prefixed_semver_regex' do diff --git a/spec/lib/search/navigation_spec.rb b/spec/lib/search/navigation_spec.rb index 23a9996ae05..26c7a0236b6 100644 --- a/spec/lib/search/navigation_spec.rb +++ b/spec/lib/search/navigation_spec.rb @@ -179,20 +179,14 @@ RSpec.describe Search::Navigation, feature_category: :global_search do end context 'for comments tab' do - where(:tab_enabled, :show_elasticsearch_tabs, :project, :condition) do - true | true | nil | true - true | true | ref(:project_double) | true - false | false | nil | false - false | false | ref(:project_double) | false - false | true | nil | true - false | true | ref(:project_double) | false - true | false | nil | true - true | false | ref(:project_double) | true + where(:tab_enabled, :project, :condition) do + true | nil | true + true | ref(:project_double) | true + false | nil | false + false | ref(:project_double) | false end with_them do - let(:options) { { show_elasticsearch_tabs: show_elasticsearch_tabs } } - it 'data item condition is set correctly' do allow(search_navigation).to receive(:tab_enabled_for_project?).with(:notes).and_return(tab_enabled) diff --git a/spec/migrations/20250620051921_requeue_backfill_archived_and_traversal_ids_to_vulnerability_statistics_again_spec.rb b/spec/migrations/20250620051921_requeue_backfill_archived_and_traversal_ids_to_vulnerability_statistics_again_spec.rb new file mode 100644 index 00000000000..74c099115e1 --- /dev/null +++ b/spec/migrations/20250620051921_requeue_backfill_archived_and_traversal_ids_to_vulnerability_statistics_again_spec.rb @@ -0,0 +1,27 @@ +# frozen_string_literal: true + +require 'spec_helper' +require_migration! + +RSpec.describe RequeueBackfillArchivedAndTraversalIdsToVulnerabilityStatisticsAgain, migration: :gitlab_sec, feature_category: :vulnerability_management do + let!(:batched_migration) { described_class::MIGRATION } + + it 'schedules a new batched migration' do + reversible_migration do |migration| + migration.before -> { + expect(batched_migration).not_to have_scheduled_batched_migration + } + + migration.after -> { + expect(batched_migration).to have_scheduled_batched_migration( + gitlab_schema: :gitlab_sec, + table_name: :vulnerability_statistics, + column_name: :id, + interval: described_class::DELAY_INTERVAL, + batch_size: described_class::BATCH_SIZE, + sub_batch_size: described_class::SUB_BATCH_SIZE + ) + } + end + end +end diff --git a/spec/models/ci/build_spec.rb b/spec/models/ci/build_spec.rb index 9175cf66be0..ff268ee1dcf 100644 --- a/spec/models/ci/build_spec.rb +++ b/spec/models/ci/build_spec.rb @@ -2590,6 +2590,7 @@ RSpec.describe Ci::Build, feature_category: :continuous_integration, factory_def { key: 'CI_PROJECT_REPOSITORY_LANGUAGES', value: project.repository_languages.map(&:name).join(',').downcase, public: true, masked: false }, { key: 'CI_PROJECT_CLASSIFICATION_LABEL', value: project.external_authorization_classification_label, public: true, masked: false }, { key: 'CI_DEFAULT_BRANCH', value: project.default_branch, public: true, masked: false }, + { key: 'CI_DEFAULT_BRANCH_SLUG', value: Gitlab::Utils.slugify(project.default_branch.to_s), public: true, masked: false }, { key: 'CI_CONFIG_PATH', value: project.ci_config_path_or_default, public: true, masked: false }, { key: 'CI_PAGES_DOMAIN', value: Gitlab.config.pages.host, public: true, masked: false }, { key: 'CI_PAGES_HOSTNAME', value: pages_hostname, public: true, masked: false }, diff --git a/spec/models/packages/generic/package_spec.rb b/spec/models/packages/generic/package_spec.rb index ed59afb0798..d7ea1f5654c 100644 --- a/spec/models/packages/generic/package_spec.rb +++ b/spec/models/packages/generic/package_spec.rb @@ -14,6 +14,7 @@ RSpec.describe Packages::Generic::Package, type: :model, feature_category: :pack it { is_expected.not_to allow_value('$foo/bar').for(:name) } it { is_expected.not_to allow_value('my file name').for(:name) } it { is_expected.not_to allow_value('!!().for(:name)().for(:name)').for(:name) } + it { is_expected.not_to allow_value('test-packagename~with-tildes').for(:name) } end describe '#version' do diff --git a/spec/services/ci/create_downstream_pipeline_service_spec.rb b/spec/services/ci/create_downstream_pipeline_service_spec.rb index ba43f224d9d..9362992ae02 100644 --- a/spec/services/ci/create_downstream_pipeline_service_spec.rb +++ b/spec/services/ci/create_downstream_pipeline_service_spec.rb @@ -1116,7 +1116,7 @@ RSpec.describe Ci::CreateDownstreamPipelineService, '#execute', feature_category it 'drops the bridge without creating a pipeline' do expect { subject } .to raise_error(RuntimeError, /undefined failure/) - .and change { Ci::Pipeline.count }.by(0) + .and not_change { Ci::Pipeline.count } expect(bridge.reload).to be_failed expect(bridge.failure_reason).to eq('data_integrity_failure') diff --git a/spec/services/ci/delete_objects_service_spec.rb b/spec/services/ci/delete_objects_service_spec.rb index ce7c2c22089..0a9416a46a6 100644 --- a/spec/services/ci/delete_objects_service_spec.rb +++ b/spec/services/ci/delete_objects_service_spec.rb @@ -102,7 +102,7 @@ RSpec.describe Ci::DeleteObjectsService, :aggregate_failures, feature_category: expect { execute } .to raise_error(Ci::DeleteObjectsService::TransactionInProgressError) - .and change { Ci::DeletedObject.count }.by(0) + .and not_change { Ci::DeletedObject.count } end end 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 152e004fe72..a6605bdbefc 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 @@ -245,7 +245,7 @@ RSpec.describe Ci::JobArtifacts::DestroyAllExpiredService, :clean_gitlab_redis_s let!(:artifact) { create(:ci_job_artifact, :expired, job: locked_job, locked: locked_job.pipeline.locked) } it 'destroys no artifacts' do - expect { subject }.to change { Ci::JobArtifact.count }.by(0) + expect { subject }.to not_change { Ci::JobArtifact.count } end end end 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 6e95548bd18..01411b47dd9 100644 --- a/spec/services/ci/job_artifacts/destroy_batch_service_spec.rb +++ b/spec/services/ci/job_artifacts/destroy_batch_service_spec.rb @@ -235,7 +235,7 @@ RSpec.describe Ci::JobArtifacts::DestroyBatchService, feature_category: :job_art expect { execute } .to change { project_1.statistics.reload.build_artifacts_size }.by(expected_amount) - .and change { project_2.statistics.reload.build_artifacts_size }.by(0) + .and not_change { project_2.statistics.reload.build_artifacts_size } end it 'increments project statistics with artifact size as amount and job artifact id as ref' do 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 c6c99da80a2..2301b2287d5 100644 --- a/spec/services/import/gitlab_projects/create_project_service_spec.rb +++ b/spec/services/import/gitlab_projects/create_project_service_spec.rb @@ -104,8 +104,7 @@ RSpec.describe ::Import::GitlabProjects::CreateProjectService, :aggregate_failur end response = nil - expect { response = subject.execute } - .to change(Project, :count).by(0) + expect { response = subject.execute }.to not_change(Project, :count) expect(response).to be_error expect(response.http_status).to eq(:bad_request) @@ -119,8 +118,7 @@ RSpec.describe ::Import::GitlabProjects::CreateProjectService, :aggregate_failur params.delete(:path) response = nil - expect { response = subject.execute } - .to change(Project, :count).by(0) + expect { response = subject.execute }.to not_change(Project, :count) expect(response).to be_error expect(response.http_status).to eq(:bad_request) @@ -133,8 +131,7 @@ RSpec.describe ::Import::GitlabProjects::CreateProjectService, :aggregate_failur params.merge!(name: '_ an invalid name _', path: '_ an invalid path _') response = nil - expect { response = subject.execute } - .to change(Project, :count).by(0) + expect { response = subject.execute }.to not_change(Project, :count) expect(response).to be_error expect(response.http_status).to eq(:bad_request) 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 c38126baa65..5f5618819ec 100644 --- a/spec/services/incident_management/timeline_events/update_service_spec.rb +++ b/spec/services/incident_management/timeline_events/update_service_spec.rb @@ -249,12 +249,12 @@ RSpec.describe IncidentManagement::TimelineEvents::UpdateService, feature_catego it 'adds the new tag and removes the old tag' do # Since it adds a tag (+1) and removes old tag (-1) so next change in count in 0 - expect { execute }.to change { timeline_event.timeline_event_tags.count }.by(0) + expect { execute }.to not_change { timeline_event.timeline_event_tags.count } end it 'adds the new tag link and removes the old tag link' do # Since it adds a tag link (+1) and removes old tag link (-1) so next change in count in 0 - expect { execute }.to change { IncidentManagement::TimelineEventTagLink.count }.by(0) + expect { execute }.to not_change { IncidentManagement::TimelineEventTagLink.count } end it 'returns the new tag and does not contain the old tag in response' do diff --git a/spec/services/issues/close_service_spec.rb b/spec/services/issues/close_service_spec.rb index 53543ea1d4e..c724b2584d3 100644 --- a/spec/services/issues/close_service_spec.rb +++ b/spec/services/issues/close_service_spec.rb @@ -261,7 +261,7 @@ RSpec.describe Issues::CloseService, feature_category: :team_planning do it 'verifies the number of queries' do recorded = ActiveRecord::QueryRecorder.new { close_issue } - expected_queries = 36 + expected_queries = 40 expect(recorded.count).to be <= expected_queries expect(recorded.cached_count).to eq(0) diff --git a/spec/services/merge_requests/create_from_issue_service_spec.rb b/spec/services/merge_requests/create_from_issue_service_spec.rb index 7bb0dd723a1..b6c7fe35d83 100644 --- a/spec/services/merge_requests/create_from_issue_service_spec.rb +++ b/spec/services/merge_requests/create_from_issue_service_spec.rb @@ -204,7 +204,7 @@ RSpec.describe MergeRequests::CreateFromIssueService, feature_category: :code_re end it 'does not create merge request' do - expect { service.execute }.to change(target_project.merge_requests, :count).by(0) + expect { service.execute }.to not_change(target_project.merge_requests, :count) end end diff --git a/spec/services/merge_requests/refresh_service_spec.rb b/spec/services/merge_requests/refresh_service_spec.rb index 7d9f3340c1b..696edd43988 100644 --- a/spec/services/merge_requests/refresh_service_spec.rb +++ b/spec/services/merge_requests/refresh_service_spec.rb @@ -240,7 +240,7 @@ RSpec.describe MergeRequests::RefreshService, feature_category: :code_review_wor it 'create detached merge request pipeline with commits' do expect { subject } .to change { @merge_request.pipelines_for_merge_request.count }.by(1) - .and change { @another_merge_request.pipelines_for_merge_request.count }.by(0) + .and not_change { @another_merge_request.pipelines_for_merge_request.count } expect(@merge_request.has_commits?).to be_truthy expect(@another_merge_request.has_commits?).to be_falsy @@ -266,7 +266,7 @@ RSpec.describe MergeRequests::RefreshService, feature_category: :code_review_wor it 'creates a detached merge request pipeline with commits' do expect { subject } .to change { @merge_request.pipelines_for_merge_request.count }.by(1) - .and change { @another_merge_request.pipelines_for_merge_request.count }.by(0) + .and not_change { @another_merge_request.pipelines_for_merge_request.count } expect(@merge_request.has_commits?).to be_truthy expect(@another_merge_request.has_commits?).to be_falsy @@ -282,7 +282,7 @@ RSpec.describe MergeRequests::RefreshService, feature_category: :code_review_wor it 'creates a skipped detached merge request pipeline with commits' do expect { subject } .to change { @merge_request.pipelines_for_merge_request.count }.by(1) - .and change { @another_merge_request.pipelines_for_merge_request.count }.by(0) + .and not_change { @another_merge_request.pipelines_for_merge_request.count } expect(@merge_request.has_commits?).to be_truthy expect(@another_merge_request.has_commits?).to be_falsy diff --git a/spec/services/packages/composer/create_package_service_spec.rb b/spec/services/packages/composer/create_package_service_spec.rb index 6450571e067..8c309890474 100644 --- a/spec/services/packages/composer/create_package_service_spec.rb +++ b/spec/services/packages/composer/create_package_service_spec.rb @@ -82,8 +82,8 @@ RSpec.describe Packages::Composer::CreatePackageService, feature_category: :pack it 'does not create a new package' do expect { subject } - .to change { ::Packages::Composer::Package.count }.by(0) - .and change { Packages::Composer::Metadatum.count }.by(0) + .to not_change { ::Packages::Composer::Package.count } + .and not_change { Packages::Composer::Metadatum.count } end end diff --git a/spec/services/packages/npm/create_metadata_cache_service_spec.rb b/spec/services/packages/npm/create_metadata_cache_service_spec.rb index f4010a7d548..e89b354f1e3 100644 --- a/spec/services/packages/npm/create_metadata_cache_service_spec.rb +++ b/spec/services/packages/npm/create_metadata_cache_service_spec.rb @@ -37,7 +37,7 @@ RSpec.describe Packages::Npm::CreateMetadataCacheService, :clean_gitlab_redis_sh let_it_be(:tag) { create(:packages_tag, package: package, name: tag_name) } it 'does not create a new metadata cache' do - expect { subject }.to change { Packages::Npm::MetadataCache.count }.by(0) + expect { subject }.to not_change { Packages::Npm::MetadataCache.count } end it 'updates the metadata cache', :aggregate_failures do @@ -63,7 +63,7 @@ RSpec.describe Packages::Npm::CreateMetadataCacheService, :clean_gitlab_redis_sh end it 'does not create a new metadata cache' do - expect { subject }.to change { Packages::Npm::MetadataCache.count }.by(0) + expect { subject }.to not_change { Packages::Npm::MetadataCache.count } end it 'returns nil' do diff --git a/spec/services/packages/nuget/sync_metadatum_service_spec.rb b/spec/services/packages/nuget/sync_metadatum_service_spec.rb index 700d676a3d4..fa12f5eba37 100644 --- a/spec/services/packages/nuget/sync_metadatum_service_spec.rb +++ b/spec/services/packages/nuget/sync_metadatum_service_spec.rb @@ -39,7 +39,7 @@ RSpec.describe Packages::Nuget::SyncMetadatumService, feature_category: :package let_it_be(:package) { create(:nuget_package, :with_metadatum) } it 'does not create a nuget metadatum' do - expect { subject }.to change { ::Packages::Nuget::Metadatum.count }.by(0) + expect { subject }.to not_change { ::Packages::Nuget::Metadatum.count } end it_behaves_like 'saving metadatum attributes' 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 fe3c99261f1..b79c3b84d63 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 @@ -57,8 +57,8 @@ RSpec.describe Packages::Nuget::UpdatePackageFromMetadataService, :clean_gitlab_ expect(service).to receive(:try_obtain_lease).and_call_original expect { subject } - .to change { ::Packages::Package.count }.by(0) - .and change { Packages::DependencyLink.count }.by(0) + .to not_change { ::Packages::Package.count } + .and not_change { Packages::DependencyLink.count } expect(package_file.reload.file_name).not_to eq(package_file_name) expect(package_file.package).to be_processing expect(package_file.package.reload.name).not_to eq(package_name) @@ -99,9 +99,9 @@ RSpec.describe Packages::Nuget::UpdatePackageFromMetadataService, :clean_gitlab_ expect { subject } .to change { ::Packages::Package.count }.by(-1) - .and change { Packages::Dependency.count }.by(0) - .and change { Packages::DependencyLink.count }.by(0) - .and change { Packages::Nuget::DependencyLinkMetadatum.count }.by(0) + .and not_change { Packages::Dependency.count } + .and not_change { Packages::DependencyLink.count } + .and not_change { Packages::Nuget::DependencyLinkMetadatum.count } .and change { ::Packages::Nuget::Metadatum.count }.by(1) .and change { existing_package.build_infos.count }.by(1) expect(package_file.reload.file_name).to eq(package_file_name) @@ -278,10 +278,10 @@ RSpec.describe Packages::Nuget::UpdatePackageFromMetadataService, :clean_gitlab_ expect { subject } .to change { ::Packages::Package.count }.by(-1) - .and change { Packages::Dependency.count }.by(0) - .and change { Packages::DependencyLink.count }.by(0) - .and change { Packages::Nuget::DependencyLinkMetadatum.count }.by(0) - .and change { ::Packages::Nuget::Metadatum.count }.by(0) + .and not_change { Packages::Dependency.count } + .and not_change { Packages::DependencyLink.count } + .and not_change { Packages::Nuget::DependencyLinkMetadatum.count } + .and not_change { ::Packages::Nuget::Metadatum.count } .and change { existing_package.nuget_symbols.count }.by(1) expect(package_file.reload.file_name).to eq(package_file_name) expect(package_file.package).to eq(existing_package) diff --git a/spec/services/packages/protection/create_rule_service_spec.rb b/spec/services/packages/protection/create_rule_service_spec.rb index 52f8a096643..cd2735f45f5 100644 --- a/spec/services/packages/protection/create_rule_service_spec.rb +++ b/spec/services/packages/protection/create_rule_service_spec.rb @@ -36,7 +36,7 @@ RSpec.describe Packages::Protection::CreateRuleService, '#execute', feature_cate end it do - expect { subject }.to change { Packages::Protection::Rule.count }.by(0) + expect { subject }.to not_change { Packages::Protection::Rule.count } expect(Packages::Protection::Rule.where(project: project).count).to eq package_protection_rule_count_expected expect(Packages::Protection::Rule.where(project: project, @@ -102,7 +102,7 @@ RSpec.describe Packages::Protection::CreateRuleService, '#execute', feature_cate it { is_expected.to be_error } it do - expect { service_execute }.to change { Packages::Protection::Rule.count }.by(0) + expect { service_execute }.to not_change { Packages::Protection::Rule.count } expect(Packages::Protection::Rule.where(project: project).count).to eq 1 expect( diff --git a/spec/services/packages/pypi/create_package_service_spec.rb b/spec/services/packages/pypi/create_package_service_spec.rb index 6f55f6f5c70..7fb243e723a 100644 --- a/spec/services/packages/pypi/create_package_service_spec.rb +++ b/spec/services/packages/pypi/create_package_service_spec.rb @@ -173,7 +173,7 @@ RSpec.describe Packages::Pypi::CreatePackageService, :aggregate_failures, featur it 'adds the file' do expect { service_response } - .to change { Packages::Package.pypi.count }.by(0) + .to not_change { Packages::Package.pypi.count } .and change { Packages::PackageFile.count }.by(1) expect(created_package.package_files.size).to eq 2 diff --git a/spec/services/projects/transfer_service_spec.rb b/spec/services/projects/transfer_service_spec.rb index 50fa7e397b3..a0e8827ee0e 100644 --- a/spec/services/projects/transfer_service_spec.rb +++ b/spec/services/projects/transfer_service_spec.rb @@ -272,7 +272,7 @@ RSpec.describe Projects::TransferService, feature_category: :groups_and_projects it 'replaces inherited integrations', :aggregate_failures do expect { execute_transfer } - .to change(Integration, :count).by(0) + .to not_change(Integration, :count) .and change { project.slack_integration.webhook }.to eq(group_integration.webhook) end end diff --git a/spec/services/projects/update_pages_service_spec.rb b/spec/services/projects/update_pages_service_spec.rb index 7e59df0099c..69296a6536b 100644 --- a/spec/services/projects/update_pages_service_spec.rb +++ b/spec/services/projects/update_pages_service_spec.rb @@ -76,7 +76,7 @@ RSpec.describe Projects::UpdatePagesService, feature_category: :pages do it 'assigns the deploy stage' do expect { service.execute } .to change(GenericCommitStatus, :count).by(1) - .and change(Ci::Stage.where(name: 'deploy'), :count).by(0) + .and not_change(Ci::Stage.where(name: 'deploy'), :count) status = GenericCommitStatus.last diff --git a/spec/services/routes/rename_descendants_service_spec.rb b/spec/services/routes/rename_descendants_service_spec.rb index 72e43ddca26..c654ced67de 100644 --- a/spec/services/routes/rename_descendants_service_spec.rb +++ b/spec/services/routes/rename_descendants_service_spec.rb @@ -38,15 +38,11 @@ RSpec.describe Routes::RenameDescendantsService, feature_category: :groups_and_p shared_examples_for 'descendant paths are not updated' do it do - expect { execute }.to change { - subgroup_routes_with_old_path.size - }.by(0).and change { - subgroup_projects_routes_with_old_path.size - }.by(0).and change { - subgroup_routes_with_new_path.size - }.by(0).and change { - subgroup_projects_routes_with_new_path.size - }.by(0) + expect { execute } + .to not_change { subgroup_routes_with_old_path.size } + .and not_change { subgroup_projects_routes_with_old_path.size } + .and not_change { subgroup_routes_with_new_path.size } + .and not_change { subgroup_projects_routes_with_new_path.size } end end @@ -66,15 +62,11 @@ RSpec.describe Routes::RenameDescendantsService, feature_category: :groups_and_p shared_examples_for 'descendant names are not updated' do it do - expect { execute }.to change { - subgroup_routes_with_old_name.size - }.by(0).and change { - subgroup_projects_routes_with_old_name.size - }.by(0).and change { - subgroup_routes_with_new_name.size - }.by(0).and change { - subgroup_projects_routes_with_new_name.size - }.by(0) + expect { execute } + .to not_change { subgroup_routes_with_old_name.size } + .and not_change { subgroup_projects_routes_with_old_name.size } + .and not_change { subgroup_routes_with_new_name.size } + .and not_change { subgroup_projects_routes_with_new_name.size } end end diff --git a/spec/support/rspec_order_todo.yml b/spec/support/rspec_order_todo.yml index e78b24ce528..98e26eb7335 100644 --- a/spec/support/rspec_order_todo.yml +++ b/spec/support/rspec_order_todo.yml @@ -2604,7 +2604,6 @@ - './spec/controllers/repositories/git_http_controller_spec.rb' - './spec/controllers/repositories/lfs_storage_controller_spec.rb' - './spec/controllers/root_controller_spec.rb' -- './spec/controllers/search_controller_spec.rb' - './spec/controllers/sent_notifications_controller_spec.rb' - './spec/controllers/sessions_controller_spec.rb' - './spec/controllers/snippets/blobs_controller_spec.rb' diff --git a/spec/support/shared_examples/controllers/todos_shared_examples.rb b/spec/support/shared_examples/controllers/todos_shared_examples.rb index 98fc9d9d926..0be05991700 100644 --- a/spec/support/shared_examples/controllers/todos_shared_examples.rb +++ b/spec/support/shared_examples/controllers/todos_shared_examples.rb @@ -29,7 +29,7 @@ RSpec.shared_examples 'todos actions' do sign_in(user) expect do post_create - end.to change { user.todos.count }.by(0) + end.to not_change { user.todos.count } expect(response).to have_gitlab_http_status(:not_found) end @@ -37,7 +37,7 @@ RSpec.shared_examples 'todos actions' do it 'does not create todo when user is not logged in' do expect do post_create - end.to change { user.todos.count }.by(0) + end.to not_change { user.todos.count } expect(response).to have_gitlab_http_status(:found) end diff --git a/spec/support/shared_examples/graphql/mutations/timelogs/create_shared_examples.rb b/spec/support/shared_examples/graphql/mutations/timelogs/create_shared_examples.rb index 23dd195e626..4d1cc543bc2 100644 --- a/spec/support/shared_examples/graphql/mutations/timelogs/create_shared_examples.rb +++ b/spec/support/shared_examples/graphql/mutations/timelogs/create_shared_examples.rb @@ -88,7 +88,7 @@ RSpec.shared_examples 'issuable supports timelog creation mutation' do it 'returns an error' do expect do post_graphql_mutation(mutation, current_user: current_user) - end.to change { Timelog.count }.by(0) + end.to not_change { Timelog.count } expect(response).to have_gitlab_http_status(:success) expect(mutation_response['errors']).to match_array( diff --git a/spec/support/shared_examples/models/relative_positioning_shared_examples.rb b/spec/support/shared_examples/models/relative_positioning_shared_examples.rb index 5def2db7b78..aefcd32be9c 100644 --- a/spec/support/shared_examples/models/relative_positioning_shared_examples.rb +++ b/spec/support/shared_examples/models/relative_positioning_shared_examples.rb @@ -342,7 +342,7 @@ RSpec.shared_examples 'a class that supports relative positioning' do it 'can leap-frog STEPS times before needing to rebalance' do expect { RelativePositioning::STEPS.times { leap_frog } } - .to change { item3.reload.relative_position }.by(0) + .to not_change { item3.reload.relative_position } .and change { item1.reload.relative_position }.by(be < 0) .and change { item2.reload.relative_position }.by(be < 0) @@ -429,13 +429,13 @@ RSpec.shared_examples 'a class that supports relative positioning' do it 'rebalances after STEPS jumps' do RelativePositioning::STEPS.pred.times do expect { leap_frog } - .to change { item3.reload.relative_position }.by(0) + .to not_change { item3.reload.relative_position } .and change { item1.reset.relative_position }.by(be >= 0) .and change { item2.reset.relative_position }.by(be >= 0) end expect { leap_frog } - .to change { item3.reload.relative_position }.by(0) + .to not_change { item3.reload.relative_position } .and change { item1.reset.relative_position }.by(be < 0) .and change { item2.reset.relative_position }.by(be < 0) end diff --git a/spec/support/shared_examples/requests/api/pypi_packages_shared_examples.rb b/spec/support/shared_examples/requests/api/pypi_packages_shared_examples.rb index 925def4d5cf..00012f37af5 100644 --- a/spec/support/shared_examples/requests/api/pypi_packages_shared_examples.rb +++ b/spec/support/shared_examples/requests/api/pypi_packages_shared_examples.rb @@ -37,9 +37,9 @@ RSpec.shared_examples 'PyPI package creation' do |user_type, status, add_member create(:package_file, :pypi, package: existing_package, file_name: params[:content].original_filename) expect { subject } - .to change { Packages::Pypi::Package.for_projects(project).count }.by(0) - .and change { Packages::PackageFile.count }.by(0) - .and change { Packages::Pypi::Metadatum.count }.by(0) + .to not_change { Packages::Pypi::Package.for_projects(project).count } + .and not_change { Packages::PackageFile.count } + .and not_change { Packages::Pypi::Metadatum.count } expect(response).to have_gitlab_http_status(:bad_request) end diff --git a/spec/support/shared_examples/services/clusters/create_service_shared_examples.rb b/spec/support/shared_examples/services/clusters/create_service_shared_examples.rb index 7cd76e45ecd..84022ad66c0 100644 --- a/spec/support/shared_examples/services/clusters/create_service_shared_examples.rb +++ b/spec/support/shared_examples/services/clusters/create_service_shared_examples.rb @@ -22,7 +22,7 @@ end RSpec.shared_examples 'create cluster service error' do it 'returns an error' do - expect { subject }.to change { Clusters::Cluster.count }.by(0) + expect { subject }.to not_change { Clusters::Cluster.count } expect(subject.errors[:"provider_gcp.gcp_project_id"]).to be_present end end diff --git a/spec/support/shared_examples/services/schedule_bulk_repository_shard_moves_shared_examples.rb b/spec/support/shared_examples/services/schedule_bulk_repository_shard_moves_shared_examples.rb index bebd8b7c1cd..5f1ed1fa140 100644 --- a/spec/support/shared_examples/services/schedule_bulk_repository_shard_moves_shared_examples.rb +++ b/spec/support/shared_examples/services/schedule_bulk_repository_shard_moves_shared_examples.rb @@ -29,7 +29,7 @@ RSpec.shared_examples 'moves repository shard in bulk' do expect(subject).to receive(:log_info) .with(/Container #{container.full_path} \(#{container.id}\) was skipped: #{expected_class} is read-only/) expect { subject.execute(source_storage_name, destination_storage_name) } - .to change { move_service_klass.count }.by(0) + .to not_change { move_service_klass.count } end end end diff --git a/spec/support/shared_examples/services/wiki_pages/update_service_shared_examples.rb b/spec/support/shared_examples/services/wiki_pages/update_service_shared_examples.rb index 5b3818d32e2..54dd0b9f039 100644 --- a/spec/support/shared_examples/services/wiki_pages/update_service_shared_examples.rb +++ b/spec/support/shared_examples/services/wiki_pages/update_service_shared_examples.rb @@ -48,7 +48,7 @@ RSpec.shared_examples 'WikiPages::UpdateService#execute' do |container_type| end it 'doesn not create a WikiPage::Meta record' do - expect { service.execute(page) }.to change { WikiPage::Meta.count }.by 0 + expect { service.execute(page) }.to not_change { WikiPage::Meta.count } end end diff --git a/spec/views/layouts/minimal.html.haml_spec.rb b/spec/views/layouts/minimal.html.haml_spec.rb index dc663b8b5c0..3ed2efc45fd 100644 --- a/spec/views/layouts/minimal.html.haml_spec.rb +++ b/spec/views/layouts/minimal.html.haml_spec.rb @@ -10,4 +10,16 @@ RSpec.describe 'layouts/minimal', feature_category: :notifications do expect(rendered).not_to render_template('layouts/_broadcast') end end + + context 'when content_for(:hide_empty_navbar) is present' do + before do + view.content_for(:hide_empty_navbar, true) + end + + it 'does not render the empty navbar layout' do + render + + expect(rendered).not_to render_template('layouts/header/_empty') + end + end end