From 7a5e202a8396a3318e5575b281b0bd4424de3818 Mon Sep 17 00:00:00 2001 From: Chris Nevett Date: Fri, 8 May 2026 15:52:29 +0100 Subject: [PATCH] Resolve Class references by name when not caching subscribers --- lib/entity_store/event_bus.rb | 13 ++++++++++ spec/entity_store/event_bus_spec.rb | 39 +++++++++++++++++++++++++++++ 2 files changed, 52 insertions(+) diff --git a/lib/entity_store/event_bus.rb b/lib/entity_store/event_bus.rb index 4a8ae73..b58fed6 100644 --- a/lib/entity_store/event_bus.rb +++ b/lib/entity_store/event_bus.rb @@ -69,12 +69,25 @@ def subscribers case subscriber when String EntityStore::Config.load_type(subscriber) + when Class + resolve_class_subscriber(subscriber) else subscriber end end end + # When cache_event_subscribers is disabled the caller is signalling that + # subscriber Class objects may be invalidated between dispatches (Rails + # autoloader reloads being the canonical case). Re-resolve by name so a + # fresh constant binding is used. + def resolve_class_subscriber(klass) + return klass if EntityStore::Config.cache_event_subscribers + return klass if klass.name.nil? + + EntityStore::Config.load_type(klass.name) + end + def publish_to_feed(entity_type, event) feed_store.add_event(entity_type, event) if feed_store end diff --git a/spec/entity_store/event_bus_spec.rb b/spec/entity_store/event_bus_spec.rb index 86bb473..6e0c80e 100644 --- a/spec/entity_store/event_bus_spec.rb +++ b/spec/entity_store/event_bus_spec.rb @@ -69,6 +69,45 @@ class DummyExternalStore end end + describe "#subscribers" do + context "when cache_event_subscribers is disabled" do + before(:each) do + EntityStore::Config.stub(:cache_event_subscribers).and_return(false) + EntityStore::Config.stub(:event_subscribers).and_return([DummySubscriber]) + end + + it "re-resolves Class entries by name via load_type" do + EntityStore::Config.should_receive(:load_type).with('DummySubscriber').and_return(DummySubscriber) + expect(@event_bus.subscribers).to eq([DummySubscriber]) + end + end + + context "when cache_event_subscribers is enabled" do + before(:each) do + EntityStore::Config.stub(:cache_event_subscribers).and_return(true) + EntityStore::Config.stub(:event_subscribers).and_return([DummySubscriber]) + end + + it "returns Class entries unchanged without invoking load_type" do + EntityStore::Config.should_not_receive(:load_type).with('DummySubscriber') + expect(@event_bus.subscribers).to eq([DummySubscriber]) + end + end + + context "when given an anonymous Class with cache_event_subscribers disabled" do + before(:each) do + EntityStore::Config.stub(:cache_event_subscribers).and_return(false) + @anonymous = Class.new + EntityStore::Config.stub(:event_subscribers).and_return([@anonymous]) + end + + it "returns the Class unchanged" do + EntityStore::Config.should_not_receive(:load_type) + expect(@event_bus.subscribers).to eq([@anonymous]) + end + end + end + describe ".publish_to_feed" do before(:each) do @feed_store = double(DummyExternalStore)