diff --git a/.rubocop_todo/layout/line_length.yml b/.rubocop_todo/layout/line_length.yml
index dd2095491f5ac800c54d5a42bf7fe3590beaf1b7..fe7b3e6d59160fe6484d6bcc685180951cc3864c 100644
--- a/.rubocop_todo/layout/line_length.yml
+++ b/.rubocop_todo/layout/line_length.yml
@@ -4129,7 +4129,6 @@ Layout/LineLength:
     - 'spec/support/shared_examples/quick_actions/issue/clone_quick_action_shared_examples.rb'
     - 'spec/support/shared_examples/quick_actions/issue/move_quick_action_shared_examples.rb'
     - 'spec/support/shared_examples/quick_actions/merge_request/rebase_quick_action_shared_examples.rb'
-    - 'spec/support/shared_examples/requests/api/conan_packages_shared_examples.rb'
     - 'spec/support/shared_examples/requests/api/custom_attributes_shared_examples.rb'
     - 'spec/support/shared_examples/requests/api/debian_distributions_shared_examples.rb'
     - 'spec/support/shared_examples/requests/api/debian_packages_shared_examples.rb'
diff --git a/.rubocop_todo/rspec/context_wording.yml b/.rubocop_todo/rspec/context_wording.yml
index 1da097f48f62e4f4c95b605af758350bdba02499..f442491a32b565f2420dd47426635bd8008163a9 100644
--- a/.rubocop_todo/rspec/context_wording.yml
+++ b/.rubocop_todo/rspec/context_wording.yml
@@ -2611,7 +2611,6 @@ RSpec/ContextWording:
     - 'spec/support/shared_contexts/prometheus/alert_shared_context.rb'
     - 'spec/support/shared_contexts/rack_attack_shared_context.rb'
     - 'spec/support/shared_contexts/read_ci_configuration_shared_context.rb'
-    - 'spec/support/shared_contexts/requests/api/conan_packages_shared_context.rb'
     - 'spec/support/shared_contexts/requests/api/debian_repository_shared_context.rb'
     - 'spec/support/shared_contexts/requests/api/go_modules_shared_context.rb'
     - 'spec/support/shared_contexts/requests/api/graphql/group_and_project_boards_query_shared_context.rb'
diff --git a/.rubocop_todo/rspec/return_from_stub.yml b/.rubocop_todo/rspec/return_from_stub.yml
index 3af4879b0980fa48b480921a0eb919001952ea34..0f26a92fff0760fa0632514db7574c5056f2e83d 100644
--- a/.rubocop_todo/rspec/return_from_stub.yml
+++ b/.rubocop_todo/rspec/return_from_stub.yml
@@ -176,7 +176,6 @@ RSpec/ReturnFromStub:
     - 'spec/support/shared_examples/lib/gitlab/middleware/read_only_gitlab_instance_shared_examples.rb'
     - 'spec/support/shared_examples/lib/gitlab/sidekiq_middleware/strategy_shared_examples.rb'
     - 'spec/support/shared_examples/models/concerns/can_move_repository_storage_shared_examples.rb'
-    - 'spec/support/shared_examples/requests/api/conan_packages_shared_examples.rb'
     - 'spec/support/shared_examples/services/boards/boards_create_service_shared_examples.rb'
     - 'spec/support/shared_examples/services/boards/create_service_shared_examples.rb'
     - 'spec/support/shared_examples/uploaders/object_storage_shared_examples.rb'
diff --git a/.rubocop_todo/style/format_string.yml b/.rubocop_todo/style/format_string.yml
index ec29a5bee09b36c366c3553b2c39e6f62273be82..ad98b870c2481fa8952aa5652346952c164e5441 100644
--- a/.rubocop_todo/style/format_string.yml
+++ b/.rubocop_todo/style/format_string.yml
@@ -232,7 +232,6 @@ Style/FormatString:
     - 'spec/support/helpers/javascript_fixtures_helpers.rb'
     - 'spec/support/shared_contexts/bulk_imports_requests_shared_context.rb'
     - 'spec/support/shared_examples/features/wiki/user_views_wiki_page_shared_examples.rb'
-    - 'spec/support/shared_examples/requests/api/conan_packages_shared_examples.rb'
     - 'spec/support/shared_examples/services/jira/requests/base_shared_examples.rb'
     - 'spec/support/shared_examples/views/registration_features_prompt_shared_examples.rb'
     - 'spec/validators/any_field_validator_spec.rb'
diff --git a/.rubocop_todo/style/inline_disable_annotation.yml b/.rubocop_todo/style/inline_disable_annotation.yml
index 45d4e345b4fd09212f533706f00f746affc36498..3378f6472990d5173a2b8f351cda1d4152229762 100644
--- a/.rubocop_todo/style/inline_disable_annotation.yml
+++ b/.rubocop_todo/style/inline_disable_annotation.yml
@@ -2405,7 +2405,6 @@ Style/InlineDisableAnnotation:
     - 'spec/support/shared_examples/models/member_shared_examples.rb'
     - 'spec/support/shared_examples/models/packages/debian/component_file_shared_example.rb'
     - 'spec/support/shared_examples/requests/api/award_emoji_todo_shared_examples.rb'
-    - 'spec/support/shared_examples/requests/api/conan_packages_shared_examples.rb'
     - 'spec/support/shared_examples/requests/api/graphql/group_and_project_boards_query_shared_examples.rb'
     - 'spec/support/shared_examples/requests/api/helm_packages_shared_examples.rb'
     - 'spec/support/shared_examples/requests/api/ml_model_packages_shared_examples.rb'
diff --git a/spec/requests/api/conan/v1/instance_packages_spec.rb b/spec/requests/api/conan/v1/instance_packages_spec.rb
index be1249514fa5b6345a6664f0d2114e8b12e24275..d53e48b9dbe88d83c4440bccb986f5ce5ea0d338 100644
--- a/spec/requests/api/conan/v1/instance_packages_spec.rb
+++ b/spec/requests/api/conan/v1/instance_packages_spec.rb
@@ -3,7 +3,7 @@
 require 'spec_helper'
 
 RSpec.describe API::Conan::V1::InstancePackages, feature_category: :package_registry do
-  include_context 'conan api setup'
+  include_context 'with conan api setup'
 
   let_it_be_with_reload(:package) { create(:conan_package, project: project, without_recipe_revisions: true) }
   let(:snowplow_gitlab_standard_context) do
@@ -43,7 +43,7 @@
   end
 
   context 'with recipe endpoints' do
-    include_context 'conan recipe endpoints'
+    include_context 'for conan recipe endpoints'
 
     let(:project_id) { 9999 }
     let(:url_prefix) { "#{Settings.gitlab.base_url}/api/v4" }
@@ -126,7 +126,7 @@
   end
 
   context 'with file download endpoints' do
-    include_context 'conan file download endpoints'
+    include_context 'for conan file download endpoints'
 
     describe 'GET /api/v4/packages/conan/v1/files/:package_name/:package_version/:package_username/:package_channel' \
       '/:recipe_revision/export/:file_name' do
@@ -155,7 +155,7 @@
   end
 
   context 'with file upload endpoints' do
-    include_context 'conan file upload endpoints'
+    include_context 'for conan file upload endpoints'
 
     describe 'PUT /api/v4/packages/conan/v1/files/:package_name/:package_version/:package_username/:package_channel' \
       '/:recipe_revision/export/:file_name/authorize' do
diff --git a/spec/requests/api/conan/v1/project_packages_spec.rb b/spec/requests/api/conan/v1/project_packages_spec.rb
index fdaffe5b0f46444cf05b683b2f59a41f082474e6..b28d310a643f82c007e67e63c7195d0727f5556e 100644
--- a/spec/requests/api/conan/v1/project_packages_spec.rb
+++ b/spec/requests/api/conan/v1/project_packages_spec.rb
@@ -3,7 +3,7 @@
 require 'spec_helper'
 
 RSpec.describe API::Conan::V1::ProjectPackages, feature_category: :package_registry do
-  include_context 'conan api setup'
+  include_context 'with conan api setup'
 
   let_it_be_with_reload(:package) { create(:conan_package, project: project, without_recipe_revisions: true) }
   let(:project_id) { project.id }
@@ -55,7 +55,7 @@
   end
 
   context 'with recipe endpoints' do
-    include_context 'conan recipe endpoints'
+    include_context 'for conan recipe endpoints'
 
     let(:url_prefix) { "#{Settings.gitlab.base_url}/api/v4/projects/#{project_id}" }
     let(:recipe_path) { package.conan_recipe_path }
@@ -150,7 +150,7 @@
   end
 
   context 'with file download endpoints' do
-    include_context 'conan file download endpoints'
+    include_context 'for conan file download endpoints'
 
     subject(:request) { get api(url), headers: headers }
 
@@ -181,7 +181,7 @@
   end
 
   context 'with file upload endpoints' do
-    include_context 'conan file upload endpoints'
+    include_context 'for conan file upload endpoints'
 
     describe 'PUT /api/v4/projects/:id/packages/conan/v1/files/:package_name/:package_version/:package_username' \
       '/:package_channel/:recipe_revision/export/:file_name/authorize' do
diff --git a/spec/requests/api/conan/v2/project_packages_spec.rb b/spec/requests/api/conan/v2/project_packages_spec.rb
index 646cfd78b18347ab551093e98c9e099bdbd2ce3f..da6774abdda3fac177976a14f11c1578a75c1519 100644
--- a/spec/requests/api/conan/v2/project_packages_spec.rb
+++ b/spec/requests/api/conan/v2/project_packages_spec.rb
@@ -3,7 +3,7 @@
 require 'spec_helper'
 
 RSpec.describe API::Conan::V2::ProjectPackages, feature_category: :package_registry do
-  include_context 'conan api setup'
+  include_context 'with conan api setup'
 
   let_it_be_with_reload(:package) { create(:conan_package, project: project) }
   let(:project_id) { project.id }
@@ -30,7 +30,7 @@
 
   describe 'GET /api/v4/projects/:id/packages/conan/v2/conans/:package_name/:package_version/:package_username/' \
     ':package_channel/revisions/:recipe_revision/files/:file_name' do
-    include_context 'conan file download endpoints'
+    include_context 'for conan file download endpoints'
 
     let(:file_name) { recipe_file.file_name }
     let(:recipe_revision) { recipe_file_metadata.recipe_revision_value }
diff --git a/spec/support/shared_contexts/requests/api/conan_packages_shared_context.rb b/spec/support/shared_contexts/requests/api/conan_packages_shared_context.rb
index 0c3e70e20ec5a872e642080e1957c2f14e02391d..79fc19b4897588b0886a9d34a948fb545481d47e 100644
--- a/spec/support/shared_contexts/requests/api/conan_packages_shared_context.rb
+++ b/spec/support/shared_contexts/requests/api/conan_packages_shared_context.rb
@@ -1,6 +1,6 @@
 # frozen_string_literal: true
 
-RSpec.shared_context 'conan api setup' do
+RSpec.shared_context 'with conan api setup' do
   include PackagesManagerApiSpecHelpers
   include HttpBasicAuthHelpers
 
@@ -44,7 +44,7 @@
   end
 end
 
-RSpec.shared_context 'conan recipe endpoints' do
+RSpec.shared_context 'for conan recipe endpoints' do
   include PackagesManagerApiSpecHelpers
   include HttpBasicAuthHelpers
 
@@ -52,7 +52,7 @@
   let(:headers) { build_token_auth_header(jwt.encoded) }
 end
 
-RSpec.shared_context 'conan file download endpoints' do
+RSpec.shared_context 'for conan file download endpoints' do
   include PackagesManagerApiSpecHelpers
   include HttpBasicAuthHelpers
 
@@ -65,7 +65,7 @@
   let(:recipe_file_metadata) { recipe_file.conan_file_metadatum }
 end
 
-RSpec.shared_context 'conan file upload endpoints' do
+RSpec.shared_context 'for conan file upload endpoints' do
   include PackagesManagerApiSpecHelpers
   include WorkhorseHelpers
   include HttpBasicAuthHelpers
diff --git a/spec/support/shared_examples/requests/api/conan_packages_shared_examples.rb b/spec/support/shared_examples/requests/api/conan_packages_shared_examples.rb
index db06e4ce44cbb34d50f3fb9e86bd38e0772cbad8..3c8fb63199987f5650f2a092314f42ad7c10c931 100644
--- a/spec/support/shared_examples/requests/api/conan_packages_shared_examples.rb
+++ b/spec/support/shared_examples/requests/api/conan_packages_shared_examples.rb
@@ -63,7 +63,10 @@
       end
 
       it { expect(response).to have_gitlab_http_status(:bad_request) }
-      it { expect(json_response['message']).to eq('400 Bad request - Search term length must be less than 200 characters.') }
+
+      it 'returns an error message' do
+        expect(json_response['message']).to eq('400 Bad request - Search term length must be less than 200 characters.')
+      end
     end
 
     context 'returns error when search term has too many wildcards' do
@@ -74,7 +77,10 @@
       end
 
       it { expect(response).to have_gitlab_http_status(:bad_request) }
-      it { expect(json_response['message']).to eq('400 Bad request - Too many wildcards in search term. Maximum is 5.') }
+
+      it 'returns an error message' do
+        expect(json_response['message']).to eq('400 Bad request - Too many wildcards in search term. Maximum is 5.')
+      end
     end
   end
 
@@ -365,7 +371,8 @@
 RSpec.shared_examples 'empty recipe for not found package' do
   context 'with invalid recipe url' do
     let(:recipe_path) do
-      'aa/bb/%{project}/ccc' % { project: ::Packages::Conan::Metadatum.package_username_from(full_path: project.full_path) }
+      format('aa/bb/%{project}/ccc',
+        project: ::Packages::Conan::Metadatum.package_username_from(full_path: project.full_path))
     end
 
     let(:presenter) { double('::Packages::Conan::PackagePresenter') }
@@ -384,8 +391,7 @@
           project,
           any_args
         ).and_return(presenter)
-      allow(presenter).to receive(:recipe_snapshot) { {} }
-      allow(presenter).to receive(:package_snapshot) { {} }
+      allow(presenter).to receive_messages(recipe_snapshot: {}, package_snapshot: {})
 
       subject
 
@@ -412,13 +418,14 @@
 
 RSpec.shared_examples 'recipe download_urls' do
   let(:recipe_path) { package.conan_recipe_path }
+  let(:base_url_with_recipe_path) { "#{url_prefix}/packages/conan/v1/files/#{package.conan_recipe_path}" }
 
   it_behaves_like 'enforcing read_packages job token policy'
 
   it 'returns the download_urls for the recipe files' do
     expected_response = {
-      'conanfile.py' => "#{url_prefix}/packages/conan/v1/files/#{package.conan_recipe_path}/0/export/conanfile.py",
-      'conanmanifest.txt' => "#{url_prefix}/packages/conan/v1/files/#{package.conan_recipe_path}/0/export/conanmanifest.txt"
+      'conanfile.py' => "#{base_url_with_recipe_path}/0/export/conanfile.py",
+      'conanmanifest.txt' => "#{base_url_with_recipe_path}/0/export/conanmanifest.txt"
     }
 
     subject
@@ -431,14 +438,15 @@
 
 RSpec.shared_examples 'package download_urls' do
   let(:recipe_path) { package.conan_recipe_path }
+  let(:base_url_with_recipe_path) { "#{url_prefix}/packages/conan/v1/files/#{package.conan_recipe_path}" }
 
   it_behaves_like 'enforcing read_packages job token policy'
 
   it 'returns the download_urls for the package files' do
     expected_response = {
-      'conaninfo.txt' => "#{url_prefix}/packages/conan/v1/files/#{package.conan_recipe_path}/0/package/#{conan_package_reference}/0/conaninfo.txt",
-      'conanmanifest.txt' => "#{url_prefix}/packages/conan/v1/files/#{package.conan_recipe_path}/0/package/#{conan_package_reference}/0/conanmanifest.txt",
-      'conan_package.tgz' => "#{url_prefix}/packages/conan/v1/files/#{package.conan_recipe_path}/0/package/#{conan_package_reference}/0/conan_package.tgz"
+      'conaninfo.txt' => "#{base_url_with_recipe_path}/0/package/#{conan_package_reference}/0/conaninfo.txt",
+      'conanmanifest.txt' => "#{base_url_with_recipe_path}/0/package/#{conan_package_reference}/0/conanmanifest.txt",
+      'conan_package.tgz' => "#{base_url_with_recipe_path}/0/package/#{conan_package_reference}/0/conan_package.tgz"
     }
 
     subject
@@ -537,6 +545,7 @@
 
 RSpec.shared_examples 'recipe upload_urls endpoint' do
   let(:recipe_path) { package.conan_recipe_path }
+  let(:base_url_with_recipe_path) { "#{url_prefix}/packages/conan/v1/files/#{package.conan_recipe_path}" }
 
   let(:params) do
     { 'conanfile.py': 24,
@@ -553,8 +562,8 @@
     subject
 
     expected_response = {
-      'conanfile.py': "#{url_prefix}/packages/conan/v1/files/#{package.conan_recipe_path}/0/export/conanfile.py",
-      'conanmanifest.txt': "#{url_prefix}/packages/conan/v1/files/#{package.conan_recipe_path}/0/export/conanmanifest.txt"
+      'conanfile.py': "#{base_url_with_recipe_path}/0/export/conanfile.py",
+      'conanmanifest.txt': "#{base_url_with_recipe_path}/0/export/conanmanifest.txt"
     }
 
     expect(response.body).to eq(expected_response.to_json)
@@ -571,9 +580,9 @@
       subject
 
       expected_response = {
-        'conan_sources.tgz': "#{url_prefix}/packages/conan/v1/files/#{package.conan_recipe_path}/0/export/conan_sources.tgz",
-        'conan_export.tgz': "#{url_prefix}/packages/conan/v1/files/#{package.conan_recipe_path}/0/export/conan_export.tgz",
-        'conanmanifest.txt': "#{url_prefix}/packages/conan/v1/files/#{package.conan_recipe_path}/0/export/conanmanifest.txt"
+        'conan_sources.tgz': "#{base_url_with_recipe_path}/0/export/conan_sources.tgz",
+        'conan_export.tgz': "#{base_url_with_recipe_path}/0/export/conan_export.tgz",
+        'conanmanifest.txt': "#{base_url_with_recipe_path}/0/export/conanmanifest.txt"
       }
 
       expect(response.body).to eq(expected_response.to_json)
@@ -590,7 +599,7 @@
       subject
 
       expected_response = {
-        'conanmanifest.txt': "#{url_prefix}/packages/conan/v1/files/#{package.conan_recipe_path}/0/export/conanmanifest.txt"
+        'conanmanifest.txt': "#{base_url_with_recipe_path}/0/export/conanmanifest.txt"
       }
 
       expect(response.body).to eq(expected_response.to_json)
@@ -600,6 +609,7 @@
 
 RSpec.shared_examples 'package upload_urls endpoint' do
   let(:recipe_path) { package.conan_recipe_path }
+  let(:base_url_with_recipe_path) { "#{url_prefix}/packages/conan/v1/files/#{package.conan_recipe_path}" }
 
   let(:params) do
     { 'conaninfo.txt': 24,
@@ -615,9 +625,9 @@
 
   it 'returns a set of upload urls for the files requested' do
     expected_response = {
-      'conaninfo.txt': "#{url_prefix}/packages/conan/v1/files/#{package.conan_recipe_path}/0/package/123456789/0/conaninfo.txt",
-      'conanmanifest.txt': "#{url_prefix}/packages/conan/v1/files/#{package.conan_recipe_path}/0/package/123456789/0/conanmanifest.txt",
-      'conan_package.tgz': "#{url_prefix}/packages/conan/v1/files/#{package.conan_recipe_path}/0/package/123456789/0/conan_package.tgz"
+      'conaninfo.txt': "#{base_url_with_recipe_path}/0/package/123456789/0/conaninfo.txt",
+      'conanmanifest.txt': "#{base_url_with_recipe_path}/0/package/123456789/0/conanmanifest.txt",
+      'conan_package.tgz': "#{base_url_with_recipe_path}/0/package/123456789/0/conan_package.tgz"
     }
 
     subject
@@ -633,7 +643,7 @@
 
     it 'returns upload urls only for the valid requested files' do
       expected_response = {
-        'conaninfo.txt': "#{url_prefix}/packages/conan/v1/files/#{package.conan_recipe_path}/0/package/123456789/0/conaninfo.txt"
+        'conaninfo.txt': "#{base_url_with_recipe_path}/0/package/123456789/0/conaninfo.txt"
       }
 
       subject
@@ -1010,10 +1020,13 @@
       end
 
       context 'with existing package' do
-        let!(:existing_package) { create(:conan_package, name: recipe_path_name, version: recipe_path_version, project: project) }
+        let!(:existing_package) do
+          create(:conan_package, name: recipe_path_name, version: recipe_path_version, project: project)
+        end
 
         before do
-          existing_package.conan_metadatum.update!(package_username: recipe_path_username, package_channel: recipe_path_channel)
+          existing_package.conan_metadatum.update!(package_username: recipe_path_username,
+            package_channel: recipe_path_channel)
         end
 
         it 'does not create a new package' do
@@ -1044,7 +1057,7 @@
       end
 
       let(:tmp_object) do
-        fog_connection.directories.new(key: 'packages').files.create( # rubocop:disable Rails/SaveBang
+        fog_connection.directories.new(key: 'packages').files.create( # rubocop:disable Rails/SaveBang -- Method #create! is undefined for class Fog::AWS::Storage::Files
           key: "tmp/uploads/#{file_name}",
           body: 'content'
         )