diff --git a/lib/dry/events/bus.rb b/lib/dry/events/bus.rb index 2e13538..5f7f393 100644 --- a/lib/dry/events/bus.rb +++ b/lib/dry/events/bus.rb @@ -76,6 +76,11 @@ def subscribe(event_id, query, &block) def subscribed?(listener) listeners.values.any? { |value| value.any? { |(block, _)| block.equal?(listener) } } end + + # @api private + def register_event?(event_id) + events.keys.any? { |value| value == event_id } + end end end end diff --git a/lib/dry/events/publisher.rb b/lib/dry/events/publisher.rb index 7451ad2..56d18a0 100644 --- a/lib/dry/events/publisher.rb +++ b/lib/dry/events/publisher.rb @@ -18,6 +18,14 @@ def initialize(id) end end + # @api public + UnregisterEventError = Class.new(StandardError) do + # @api private + def initialize(event_id) + super("you are trying to subscribe to an event: #{event_id} that has not been register") + end + end + # Extension used for classes that can publish events # # @example @@ -189,6 +197,7 @@ def publish(event_id, payload = EMPTY_HASH) # # @api public def subscribe(object_or_event_id, query = EMPTY_HASH, &block) + raise UnregisterEventError, object_or_event_id unless registered_event?(object_or_event_id) if block __bus__.subscribe(object_or_event_id, query, &block) else @@ -236,6 +245,20 @@ def process(event_id, payload = EMPTY_HASH, &block) def __bus__ @__bus__ ||= self.class.new_bus end + + # Utility method that check that the event has been registered + # + # @return [Boolean] + # + # @api private + def registered_event?(object_or_event_id) + case object_or_event_id + when String, Symbol + __bus__.register_event?(object_or_event_id) + else + true + end + end end end end diff --git a/spec/unit/dry/events/publisher_spec.rb b/spec/unit/dry/events/publisher_spec.rb index 86411e7..930d0ea 100644 --- a/spec/unit/dry/events/publisher_spec.rb +++ b/spec/unit/dry/events/publisher_spec.rb @@ -39,6 +39,14 @@ expect(publisher.subscribed?(listener)).to be(true) end + + it 'raises an exception when subscribing to an unregister event' do + listener = -> * { } + + expect { + publisher.subscribe(:not_register, &listener) + }.to raise_error(Dry::Events::UnregisterEventError, /not_register/) + end end describe '#register_event' do