Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions lib/entity_store/event_bus.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
39 changes: 39 additions & 0 deletions spec/entity_store/event_bus_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down