diff --git a/src/predaddy/messagehandling/InterceptableMessageBus.php b/src/predaddy/messagehandling/InterceptableMessageBus.php index 84fbf75..9e9d62a 100644 --- a/src/predaddy/messagehandling/InterceptableMessageBus.php +++ b/src/predaddy/messagehandling/InterceptableMessageBus.php @@ -23,13 +23,13 @@ namespace predaddy\messagehandling; +use ArrayIterator; use Closure; use InvalidArgumentException; use precore\lang\Object; use precore\util\Preconditions; use predaddy\messagehandling\util\MessageCallbackClosures; use RuntimeException; -use SplFixedArray; /** * @author Janos Szurovecz @@ -42,7 +42,7 @@ abstract class InterceptableMessageBus extends Object implements MessageBus private static $emptyCallback; /** - * @var SplFixedArray + * @var DispatchInterceptor[] */ private $interceptors; @@ -56,7 +56,7 @@ public static function init() public function __construct(array $interceptors = []) { - $this->interceptors = SplFixedArray::fromArray($interceptors); + $this->interceptors = $interceptors; } /** @@ -111,7 +111,7 @@ private function createChain($message, Closure $dispatchClosure) { return new DefaultInterceptorChain( $message, - $this->interceptors, + new ArrayIterator($this->interceptors), $dispatchClosure ); } diff --git a/tests/src/predaddy/messagehandling/InterceptableMessageBusTest.php b/tests/src/predaddy/messagehandling/InterceptableMessageBusTest.php new file mode 100644 index 0000000..6409947 --- /dev/null +++ b/tests/src/predaddy/messagehandling/InterceptableMessageBusTest.php @@ -0,0 +1,94 @@ + + */ +class InterceptableMessageBusTest extends PHPUnit_Framework_TestCase +{ + /** + * @var EventBus + */ + private $eventBus; + + /** + * @var CommandBus + */ + private $commandBus; + + protected function setUp() + { + $blockerInterceptor = new BlockerInterceptor(); + $this->eventBus = EventBus::builder() + ->withInterceptors([$blockerInterceptor]) + ->build(); + $blockerInterceptorManager = $blockerInterceptor->manager(); + $this->commandBus = CommandBus::builder() + ->withInterceptors([$blockerInterceptorManager]) + ->withExceptionHandler($blockerInterceptorManager) + ->build(); + } + + /** + * @test + */ + public function shouldBlockBothEvents() + { + EventPublisher::instance()->setEventBus($this->eventBus); + $eventHandlerCalled = 0; + + $eventHandler1 = function (BaseEvent $event) use (&$eventHandlerCalled) { + $eventHandlerCalled++; + }; + $eventHandler2 = function (BaseEvent2 $event) use (&$eventHandlerCalled) { + $eventHandlerCalled++; + }; + $this->eventBus->registerClosure($eventHandler1); + $this->eventBus->registerClosure($eventHandler2); + + $commandHandler = function (SimpleCommand $command) { + EventPublisher::instance()->post(new BaseEvent()); + EventPublisher::instance()->post(new BaseEvent2()); + throw new Exception(); + }; + $this->commandBus->registerClosure($commandHandler); + + $this->commandBus->post(new SimpleCommand(null, null, null)); + self::assertEquals(0, $eventHandlerCalled); + } +}