Skip to content

Commit f3fd843

Browse files
Only subscribe to Rails.error if connects_to is configured
The previous behavior could lead to strange errors if solid_errors is not configured in the given environment. The error reporter would try to write to solid_errors table, but the table is not available in the default database. With that if statement in place, the subscriber will only be added, if solid_errors is enabled for the environment.
1 parent 2ba4fd2 commit f3fd843

File tree

2 files changed

+45
-1
lines changed

2 files changed

+45
-1
lines changed

lib/solid_errors/engine.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ class Engine < ::Rails::Engine
1818
end
1919

2020
initializer "solid_errors.active_record.error_subscriber" do
21-
Rails.error.subscribe(SolidErrors::Subscriber.new)
21+
Rails.error.subscribe(SolidErrors::Subscriber.new) if config.solid_errors.connects_to.present?
2222
end
2323
end
2424
end

test/engine_test.rb

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
# frozen_string_literal: true
2+
3+
require "test_helper"
4+
5+
class EngineTest < Minitest::Test
6+
def setup
7+
@config = Rails.application.config
8+
@original_connects_to = @config.solid_errors.connects_to
9+
@subscriber = nil
10+
end
11+
12+
def teardown
13+
Rails.error.unsubscribe(@subscriber) if @subscriber
14+
@config.solid_errors.connects_to = @original_connects_to
15+
end
16+
17+
def test_subscriber_is_enabled_when_connects_to_is_present
18+
@config.solid_errors.connects_to = {database: {writing: :primary}}
19+
20+
run_subscriber_initializer
21+
22+
assert solid_errors_subscriber, "Subscriber should be registered when connects_to is configured"
23+
end
24+
25+
def test_subscriber_is_disabled_when_connects_to_is_nil
26+
@config.solid_errors.connects_to = nil
27+
28+
run_subscriber_initializer
29+
30+
refute solid_errors_subscriber, "Subscriber should not be registered when connects_to is nil"
31+
end
32+
33+
private
34+
35+
def run_subscriber_initializer
36+
initializer = SolidErrors::Engine.initializers.find { |i| i.name == "solid_errors.active_record.error_subscriber" }
37+
SolidErrors::Engine.instance_exec(Rails.application, &initializer.block)
38+
end
39+
40+
def solid_errors_subscriber
41+
subscribers = Rails.error.instance_variable_get(:@subscribers)
42+
@subscriber = subscribers.find { |s| s.is_a?(SolidErrors::Subscriber) }
43+
end
44+
end

0 commit comments

Comments
 (0)