[Messenger] RoutableMessageBus route to default bus

This commit is contained in:
Dirk39 2019-04-27 12:52:21 +02:00 committed by Fabien Potencier
parent 8fdcd6e6ef
commit c4e5e83b56
2 changed files with 29 additions and 11 deletions

View File

@ -45,14 +45,12 @@ class RoutableMessageBus implements MessageBusInterface
/** @var BusNameStamp $busNameStamp */
$busNameStamp = $envelope->last(BusNameStamp::class);
if (null === $busNameStamp) {
throw new InvalidArgumentException('Envelope does not contain a BusNameStamp.');
$busName = null !== $busNameStamp ? $busNameStamp->getBusName() : MessageBusInterface::class;
if (!$this->busLocator->has($busName)) {
throw new InvalidArgumentException(sprintf('Bus name "%s" does not exists.', $busName));
}
if (!$this->busLocator->has($busNameStamp->getBusName())) {
throw new InvalidArgumentException(sprintf('Invalid bus name "%s" on BusNameStamp.', $busNameStamp->getBusName()));
}
return $this->busLocator->get($busNameStamp->getBusName())->dispatch($envelope, $stamps);
return $this->busLocator->get($busName)->dispatch($envelope, $stamps);
}
}

View File

@ -41,15 +41,35 @@ class RoutableMessageBusTest extends TestCase
$this->assertSame($envelope, $routableBus->dispatch($envelope, [$stamp]));
}
public function testItExceptionOnMissingStamp()
public function testItRoutesToDefaultBus()
{
$envelope = new Envelope(new \stdClass());
$stamp = new DelayStamp(5);
$defaultBus = $this->createMock(MessageBusInterface::class);
$defaultBus->expects($this->once())->method('dispatch')->with($envelope, [$stamp])
->willReturn($envelope);
$container = $this->createMock(ContainerInterface::class);
$container->expects($this->once())->method('has')->with(MessageBusInterface::class)
->willReturn(true);
$container->expects($this->once())->method('get')->with(MessageBusInterface::class)
->willReturn($defaultBus);
$routableBus = new RoutableMessageBus($container);
$this->assertSame($envelope, $routableBus->dispatch($envelope, [$stamp]));
}
public function testItExceptionOnDefaultBusNotFound()
{
$this->expectException(InvalidArgumentException::class);
$this->expectExceptionMessage('does not contain a BusNameStamp');
$this->expectExceptionMessage(sprintf('Bus name "%s" does not exists.', MessageBusInterface::class));
$envelope = new Envelope(new \stdClass());
$container = $this->createMock(ContainerInterface::class);
$container->expects($this->never())->method('has');
$container->expects($this->once())->method('has')->with(MessageBusInterface::class)
->willReturn(false);
$routableBus = new RoutableMessageBus($container);
$routableBus->dispatch($envelope);
@ -58,7 +78,7 @@ class RoutableMessageBusTest extends TestCase
public function testItExceptionOnBusNotFound()
{
$this->expectException(InvalidArgumentException::class);
$this->expectExceptionMessage('Invalid bus name');
$this->expectExceptionMessage(sprintf('Bus name "%s" does not exists.', 'foo_bus'));
$envelope = new Envelope(new \stdClass(), [new BusNameStamp('foo_bus')]);