From 7c2010b541e3f583c233725afbf6f8ad6b4bfbf0 Mon Sep 17 00:00:00 2001 From: Phil Pirozhkov Date: Wed, 6 Aug 2025 23:08:01 +0300 Subject: [PATCH 1/2] Reduce sandboxing to prevent swallowed deprecations We used to sandbox everything, but it turns out that deprecations were swallowed, as the temporary config has no deprecation stream set, or stderr is masked. --- spec/rspec/rails/configuration_spec.rb | 2 +- spec/rspec/rails/example/channel_example_group_spec.rb | 2 +- spec/rspec/rails/example/controller_example_group_spec.rb | 2 +- spec/rspec/rails/example/feature_example_group_spec.rb | 2 +- spec/rspec/rails/example/helper_example_group_spec.rb | 2 +- spec/rspec/rails/example/job_example_group_spec.rb | 2 +- spec/rspec/rails/example/mailbox_example_group_spec.rb | 2 +- spec/rspec/rails/example/mailer_example_group_spec.rb | 2 +- spec/rspec/rails/example/model_example_group_spec.rb | 2 +- spec/rspec/rails/example/rails_example_group_spec.rb | 2 +- spec/rspec/rails/example/request_example_group_spec.rb | 2 +- spec/rspec/rails/example/routing_example_group_spec.rb | 2 +- spec/rspec/rails/example/system_example_group_spec.rb | 2 +- spec/rspec/rails/example/view_example_group_spec.rb | 2 +- spec/rspec/rails/fixture_file_upload_support_spec.rb | 2 +- spec/rspec/rails/fixture_support_spec.rb | 2 +- spec/rspec/rails/minitest_lifecycle_adapter_spec.rb | 2 +- spec/rspec/rails/setup_and_teardown_adapter_spec.rb | 2 +- spec/rspec/rails/view_rendering_spec.rb | 4 ++-- spec/spec_helper.rb | 4 +++- 20 files changed, 23 insertions(+), 21 deletions(-) diff --git a/spec/rspec/rails/configuration_spec.rb b/spec/rspec/rails/configuration_spec.rb index a2b2dd09da..fdac679a22 100644 --- a/spec/rspec/rails/configuration_spec.rb +++ b/spec/rspec/rails/configuration_spec.rb @@ -123,7 +123,7 @@ end end - describe "#infer_spec_type_from_file_location!" do + describe "#infer_spec_type_from_file_location!", :with_isolated_config do def in_inferring_type_from_location_environment in_sub_process do RSpec.configuration.infer_spec_type_from_file_location! diff --git a/spec/rspec/rails/example/channel_example_group_spec.rb b/spec/rspec/rails/example/channel_example_group_spec.rb index 6421733649..4dccc8eab3 100644 --- a/spec/rspec/rails/example/channel_example_group_spec.rb +++ b/spec/rspec/rails/example/channel_example_group_spec.rb @@ -1,7 +1,7 @@ require "rspec/rails/feature_check" module RSpec::Rails - RSpec.describe ChannelExampleGroup do + RSpec.describe ChannelExampleGroup, :with_isolated_config do if RSpec::Rails::FeatureCheck.has_action_cable_testing? it_behaves_like "an rspec-rails example group mixin", :channel, './spec/channels/', '.\\spec\\channels\\' diff --git a/spec/rspec/rails/example/controller_example_group_spec.rb b/spec/rspec/rails/example/controller_example_group_spec.rb index d50e88ae58..19ed6c07cf 100644 --- a/spec/rspec/rails/example/controller_example_group_spec.rb +++ b/spec/rspec/rails/example/controller_example_group_spec.rb @@ -3,7 +3,7 @@ def self.abstract?; false; end end module RSpec::Rails - RSpec.describe ControllerExampleGroup do + RSpec.describe ControllerExampleGroup, :with_isolated_config do it_behaves_like "an rspec-rails example group mixin", :controller, './spec/controllers/', '.\\spec\\controllers\\' diff --git a/spec/rspec/rails/example/feature_example_group_spec.rb b/spec/rspec/rails/example/feature_example_group_spec.rb index 35ccbcf72c..f84de38eee 100644 --- a/spec/rspec/rails/example/feature_example_group_spec.rb +++ b/spec/rspec/rails/example/feature_example_group_spec.rb @@ -1,5 +1,5 @@ module RSpec::Rails - RSpec.describe FeatureExampleGroup do + RSpec.describe FeatureExampleGroup, :with_isolated_config do it_behaves_like "an rspec-rails example group mixin", :feature, './spec/features/', '.\\spec\\features\\' diff --git a/spec/rspec/rails/example/helper_example_group_spec.rb b/spec/rspec/rails/example/helper_example_group_spec.rb index 27b18ca336..d358261f45 100644 --- a/spec/rspec/rails/example/helper_example_group_spec.rb +++ b/spec/rspec/rails/example/helper_example_group_spec.rb @@ -1,5 +1,5 @@ module RSpec::Rails - RSpec.describe HelperExampleGroup do + RSpec.describe HelperExampleGroup, :with_isolated_config do module ::FoosHelper class InternalClass end diff --git a/spec/rspec/rails/example/job_example_group_spec.rb b/spec/rspec/rails/example/job_example_group_spec.rb index fff75d493e..dbc135715b 100644 --- a/spec/rspec/rails/example/job_example_group_spec.rb +++ b/spec/rspec/rails/example/job_example_group_spec.rb @@ -1,5 +1,5 @@ module RSpec::Rails - RSpec.describe JobExampleGroup do + RSpec.describe JobExampleGroup, :with_isolated_config do if defined?(ActiveJob) it_behaves_like "an rspec-rails example group mixin", :job, './spec/jobs/', '.\\spec\\jobs\\' diff --git a/spec/rspec/rails/example/mailbox_example_group_spec.rb b/spec/rspec/rails/example/mailbox_example_group_spec.rb index 09793b2e7b..9a6c43d369 100644 --- a/spec/rspec/rails/example/mailbox_example_group_spec.rb +++ b/spec/rspec/rails/example/mailbox_example_group_spec.rb @@ -14,7 +14,7 @@ def receive(*) module RSpec module Rails - RSpec.describe MailboxExampleGroup, skip: !RSpec::Rails::FeatureCheck.has_action_mailbox? do + RSpec.describe MailboxExampleGroup, :with_isolated_config, skip: !RSpec::Rails::FeatureCheck.has_action_mailbox? do it_behaves_like "an rspec-rails example group mixin", :mailbox, './spec/mailboxes/', '.\\spec\\mailboxes\\' diff --git a/spec/rspec/rails/example/mailer_example_group_spec.rb b/spec/rspec/rails/example/mailer_example_group_spec.rb index 7baa327c85..5f558e27b2 100644 --- a/spec/rspec/rails/example/mailer_example_group_spec.rb +++ b/spec/rspec/rails/example/mailer_example_group_spec.rb @@ -1,5 +1,5 @@ module RSpec::Rails - RSpec.describe MailerExampleGroup do + RSpec.describe MailerExampleGroup, :with_isolated_config do module ::Rails; end before do allow(Rails).to receive_message_chain(:application, :routes, :url_helpers).and_return(Rails) diff --git a/spec/rspec/rails/example/model_example_group_spec.rb b/spec/rspec/rails/example/model_example_group_spec.rb index e496f1054c..71dd629941 100644 --- a/spec/rspec/rails/example/model_example_group_spec.rb +++ b/spec/rspec/rails/example/model_example_group_spec.rb @@ -1,5 +1,5 @@ module RSpec::Rails - RSpec.describe ModelExampleGroup do + RSpec.describe ModelExampleGroup, :with_isolated_config do it_behaves_like "an rspec-rails example group mixin", :model, './spec/models/', '.\\spec\\models\\' end diff --git a/spec/rspec/rails/example/rails_example_group_spec.rb b/spec/rspec/rails/example/rails_example_group_spec.rb index d21dc2c3be..a4ded3f558 100644 --- a/spec/rspec/rails/example/rails_example_group_spec.rb +++ b/spec/rspec/rails/example/rails_example_group_spec.rb @@ -1,5 +1,5 @@ module RSpec::Rails - RSpec.describe RailsExampleGroup do + RSpec.describe RailsExampleGroup, :with_isolated_config do it 'supports tagged_logger' do expect(described_class.private_instance_methods).to include(:tagged_logger) end diff --git a/spec/rspec/rails/example/request_example_group_spec.rb b/spec/rspec/rails/example/request_example_group_spec.rb index f8d3ef5f04..bcee23d013 100644 --- a/spec/rspec/rails/example/request_example_group_spec.rb +++ b/spec/rspec/rails/example/request_example_group_spec.rb @@ -1,5 +1,5 @@ module RSpec::Rails - RSpec.describe RequestExampleGroup do + RSpec.describe RequestExampleGroup, :with_isolated_config do it_behaves_like "an rspec-rails example group mixin", :request, './spec/requests/', '.\\spec\\requests\\', './spec/integration/', '.\\spec\\integration\\', diff --git a/spec/rspec/rails/example/routing_example_group_spec.rb b/spec/rspec/rails/example/routing_example_group_spec.rb index 8ead44c39a..2ccd659548 100644 --- a/spec/rspec/rails/example/routing_example_group_spec.rb +++ b/spec/rspec/rails/example/routing_example_group_spec.rb @@ -1,5 +1,5 @@ module RSpec::Rails - RSpec.describe RoutingExampleGroup do + RSpec.describe RoutingExampleGroup, :with_isolated_config do it_behaves_like "an rspec-rails example group mixin", :routing, './spec/routing/', '.\\spec\\routing\\' diff --git a/spec/rspec/rails/example/system_example_group_spec.rb b/spec/rspec/rails/example/system_example_group_spec.rb index bba10512d0..2743660522 100644 --- a/spec/rspec/rails/example/system_example_group_spec.rb +++ b/spec/rspec/rails/example/system_example_group_spec.rb @@ -1,5 +1,5 @@ module RSpec::Rails - RSpec.describe SystemExampleGroup do + RSpec.describe SystemExampleGroup, :with_isolated_config do it_behaves_like "an rspec-rails example group mixin", :system, './spec/system/', '.\\spec\\system\\' diff --git a/spec/rspec/rails/example/view_example_group_spec.rb b/spec/rspec/rails/example/view_example_group_spec.rb index 7dd0b3fec3..106b7ae057 100644 --- a/spec/rspec/rails/example/view_example_group_spec.rb +++ b/spec/rspec/rails/example/view_example_group_spec.rb @@ -1,7 +1,7 @@ require 'support/group_failure_formatter' module RSpec::Rails - RSpec.describe ViewExampleGroup do + RSpec.describe ViewExampleGroup, :with_isolated_config do it_behaves_like "an rspec-rails example group mixin", :view, './spec/views/', '.\\spec\\views\\' diff --git a/spec/rspec/rails/fixture_file_upload_support_spec.rb b/spec/rspec/rails/fixture_file_upload_support_spec.rb index d28e29d32c..ea26fe65dc 100644 --- a/spec/rspec/rails/fixture_file_upload_support_spec.rb +++ b/spec/rspec/rails/fixture_file_upload_support_spec.rb @@ -1,5 +1,5 @@ module RSpec::Rails - RSpec.describe FixtureFileUploadSupport do + RSpec.describe FixtureFileUploadSupport, :with_isolated_config do context 'with fixture paths set in config' do it 'resolves fixture file' do RSpec.configuration.fixture_paths = [File.dirname(__FILE__)] diff --git a/spec/rspec/rails/fixture_support_spec.rb b/spec/rspec/rails/fixture_support_spec.rb index 8621b5da59..1094486f0b 100644 --- a/spec/rspec/rails/fixture_support_spec.rb +++ b/spec/rspec/rails/fixture_support_spec.rb @@ -1,5 +1,5 @@ module RSpec::Rails - RSpec.describe FixtureSupport do + RSpec.describe FixtureSupport, :with_isolated_config do context "with use_transactional_fixtures set to false" do it "still supports fixture_path/fixture_paths" do allow(RSpec.configuration).to receive(:use_transactional_fixtures) { false } diff --git a/spec/rspec/rails/minitest_lifecycle_adapter_spec.rb b/spec/rspec/rails/minitest_lifecycle_adapter_spec.rb index 5c52d0c465..13e950dfd1 100644 --- a/spec/rspec/rails/minitest_lifecycle_adapter_spec.rb +++ b/spec/rspec/rails/minitest_lifecycle_adapter_spec.rb @@ -1,4 +1,4 @@ -RSpec.describe RSpec::Rails::MinitestLifecycleAdapter do +RSpec.describe RSpec::Rails::MinitestLifecycleAdapter, :with_isolated_config do it "invokes minitest lifecycle hooks at the appropriate times" do invocations = [] example_group = RSpec::Core::ExampleGroup.describe("MinitestHooks") do diff --git a/spec/rspec/rails/setup_and_teardown_adapter_spec.rb b/spec/rspec/rails/setup_and_teardown_adapter_spec.rb index c6b515b220..8f8271da4c 100644 --- a/spec/rspec/rails/setup_and_teardown_adapter_spec.rb +++ b/spec/rspec/rails/setup_and_teardown_adapter_spec.rb @@ -1,4 +1,4 @@ -RSpec.describe RSpec::Rails::SetupAndTeardownAdapter do +RSpec.describe RSpec::Rails::SetupAndTeardownAdapter, :with_isolated_config do describe ".setup" do it "registers before hooks in the order setup is received" do group = RSpec::Core::ExampleGroup.describe do diff --git a/spec/rspec/rails/view_rendering_spec.rb b/spec/rspec/rails/view_rendering_spec.rb index 3273f20154..9ebefaf1d9 100644 --- a/spec/rspec/rails/view_rendering_spec.rb +++ b/spec/rspec/rails/view_rendering_spec.rb @@ -1,5 +1,5 @@ module RSpec::Rails - RSpec.describe ViewRendering do + RSpec.describe ViewRendering, :with_isolated_config do let(:group) do RSpec::Core::ExampleGroup.describe do def controller @@ -53,7 +53,7 @@ def example.controller expect(group.new.render_views?).to be_falsey end - it "overrides the global config if render_views is enabled there" do + it "overrides the global config if render_views is enabled there", :with_isolated_config do allow(RSpec.configuration).to receive(:render_views?).and_return true group.render_views false expect(group.new.render_views?).to be_falsey diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 570f4cd125..f91c50f22e 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -71,9 +71,11 @@ def self.run_all(reporter = nil) config.warnings = true config.raise_on_warning = true + config.raise_errors_for_deprecations! + # Execute a provided block with RSpec global objects (configuration, # world, current example) reset. This is used to test specs with RSpec. - config.around(:example) do |example| + config.around(:example, :with_isolated_config) do |example| RSpec::Core::Sandbox.sandboxed do |sandbox_config| # If there is an example-within-an-example, we want to make sure the inner # example does not get a reference to the outer example (the real spec) if From 741488e70d2d0fdc422809a71f9f07177adb4592 Mon Sep 17 00:00:00 2001 From: Phil Pirozhkov Date: Wed, 6 Aug 2025 23:56:42 +0300 Subject: [PATCH 2/2] Mute deliberate deprecation RuntimeError: Warnings were generated: /home/runner/work/rspec-rails/rspec-rails/lib/rspec/rails/matchers/have_http_status.rb:219: warning: Status code :unprocessable_entity is deprecated and will be removed in a future version of Rack. Please use :unprocessable_content instead. --- spec/rspec/rails/matchers/have_http_status_spec.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/spec/rspec/rails/matchers/have_http_status_spec.rb b/spec/rspec/rails/matchers/have_http_status_spec.rb index 82333c74c7..dfb8a301b0 100644 --- a/spec/rspec/rails/matchers/have_http_status_spec.rb +++ b/spec/rspec/rails/matchers/have_http_status_spec.rb @@ -502,6 +502,7 @@ def create_response(opts = {}) context 'with deprecated rack status codes' do it 'supports the original names' do + allow(Rack::Utils).to receive(:warn).with(/unprocessable_entity is deprecated/, anything) expect(create_response(status: 422)).to have_http_status(:unprocessable_entity) end end