2017-09-30 13:16:30 +01:00
|
|
|
<?php
|
|
|
|
|
|
|
|
/*
|
|
|
|
* This file is part of the Symfony package.
|
|
|
|
*
|
|
|
|
* (c) Fabien Potencier <fabien@symfony.com>
|
|
|
|
*
|
|
|
|
* For the full copyright and license information, please view the LICENSE
|
|
|
|
* file that was distributed with this source code.
|
|
|
|
*/
|
|
|
|
|
|
|
|
namespace Symfony\Component\Messenger\Tests;
|
|
|
|
|
|
|
|
use PHPUnit\Framework\TestCase;
|
2018-05-07 16:54:04 +01:00
|
|
|
use Symfony\Component\Messenger\Envelope;
|
2017-09-30 13:16:30 +01:00
|
|
|
use Symfony\Component\Messenger\MessageBus;
|
|
|
|
use Symfony\Component\Messenger\MessageBusInterface;
|
2018-05-02 20:48:50 +01:00
|
|
|
use Symfony\Component\Messenger\Middleware\MiddlewareInterface;
|
2018-10-18 09:53:38 +01:00
|
|
|
use Symfony\Component\Messenger\Stamp\ReceivedStamp;
|
|
|
|
use Symfony\Component\Messenger\Tests\Fixtures\AnEnvelopeStamp;
|
2017-09-30 13:16:30 +01:00
|
|
|
use Symfony\Component\Messenger\Tests\Fixtures\DummyMessage;
|
|
|
|
|
|
|
|
class MessageBusTest extends TestCase
|
|
|
|
{
|
|
|
|
public function testItHasTheRightInterface()
|
|
|
|
{
|
|
|
|
$bus = new MessageBus();
|
|
|
|
|
|
|
|
$this->assertInstanceOf(MessageBusInterface::class, $bus);
|
|
|
|
}
|
|
|
|
|
2018-05-07 23:47:24 +01:00
|
|
|
/**
|
2018-10-17 14:58:28 +01:00
|
|
|
* @expectedException \TypeError
|
|
|
|
* @expectedExceptionMessage Invalid argument provided to "Symfony\Component\Messenger\MessageBus::dispatch()": expected object, but got string.
|
2018-05-07 23:47:24 +01:00
|
|
|
*/
|
|
|
|
public function testItDispatchInvalidMessageType()
|
|
|
|
{
|
|
|
|
(new MessageBus())->dispatch('wrong');
|
|
|
|
}
|
|
|
|
|
2018-10-17 17:40:36 +01:00
|
|
|
public function testItCallsMiddleware()
|
2017-09-30 13:16:30 +01:00
|
|
|
{
|
|
|
|
$message = new DummyMessage('Hello');
|
2018-10-18 13:51:08 +01:00
|
|
|
$envelope = new Envelope($message);
|
2017-09-30 13:16:30 +01:00
|
|
|
$responseFromDepthMiddleware = 1234;
|
|
|
|
|
2018-03-13 16:34:51 +00:00
|
|
|
$firstMiddleware = $this->getMockBuilder(MiddlewareInterface::class)->getMock();
|
2017-09-30 13:16:30 +01:00
|
|
|
$firstMiddleware->expects($this->once())
|
|
|
|
->method('handle')
|
2018-10-18 13:51:08 +01:00
|
|
|
->with($envelope, $this->anything())
|
2018-10-18 12:31:58 +01:00
|
|
|
->will($this->returnCallback(function ($envelope, $stack) {
|
|
|
|
$stack->next()->handle($envelope, $stack);
|
2017-09-30 13:16:30 +01:00
|
|
|
}));
|
|
|
|
|
2018-03-13 16:34:51 +00:00
|
|
|
$secondMiddleware = $this->getMockBuilder(MiddlewareInterface::class)->getMock();
|
2018-05-07 16:54:04 +01:00
|
|
|
$secondMiddleware->expects($this->once())
|
|
|
|
->method('handle')
|
|
|
|
->with($envelope, $this->anything())
|
|
|
|
;
|
|
|
|
|
|
|
|
$bus = new MessageBus(array(
|
|
|
|
$firstMiddleware,
|
|
|
|
$secondMiddleware,
|
|
|
|
));
|
|
|
|
|
2018-10-18 13:51:08 +01:00
|
|
|
$bus->dispatch($message);
|
2018-05-07 16:54:04 +01:00
|
|
|
}
|
|
|
|
|
2018-10-18 09:53:38 +01:00
|
|
|
public function testThatAMiddlewareCanAddSomeStampsToTheEnvelope()
|
2018-05-07 16:54:04 +01:00
|
|
|
{
|
|
|
|
$message = new DummyMessage('Hello');
|
2018-10-18 09:53:38 +01:00
|
|
|
$envelope = new Envelope($message, new ReceivedStamp());
|
|
|
|
$envelopeWithAnotherStamp = $envelope->with(new AnEnvelopeStamp());
|
2018-05-07 16:54:04 +01:00
|
|
|
|
2018-10-18 13:51:08 +01:00
|
|
|
$firstMiddleware = $this->getMockBuilder(MiddlewareInterface::class)->getMock();
|
2018-05-07 16:54:04 +01:00
|
|
|
$firstMiddleware->expects($this->once())
|
|
|
|
->method('handle')
|
|
|
|
->with($envelope, $this->anything())
|
2018-10-18 12:31:58 +01:00
|
|
|
->will($this->returnCallback(function ($envelope, $stack) {
|
|
|
|
$stack->next()->handle($envelope->with(new AnEnvelopeStamp()), $stack);
|
2018-05-07 16:54:04 +01:00
|
|
|
}));
|
|
|
|
|
|
|
|
$secondMiddleware = $this->getMockBuilder(MiddlewareInterface::class)->getMock();
|
|
|
|
$secondMiddleware->expects($this->once())
|
|
|
|
->method('handle')
|
2018-10-18 13:51:08 +01:00
|
|
|
->with($envelopeWithAnotherStamp, $this->anything())
|
2018-10-18 12:31:58 +01:00
|
|
|
->will($this->returnCallback(function ($envelope, $stack) {
|
|
|
|
$stack->next()->handle($envelope, $stack);
|
2018-05-07 16:54:04 +01:00
|
|
|
}));
|
|
|
|
|
2018-10-18 13:51:08 +01:00
|
|
|
$thirdMiddleware = $this->getMockBuilder(MiddlewareInterface::class)->getMock();
|
2018-05-07 16:54:04 +01:00
|
|
|
$thirdMiddleware->expects($this->once())
|
|
|
|
->method('handle')
|
2018-10-18 09:53:38 +01:00
|
|
|
->with($envelopeWithAnotherStamp, $this->anything())
|
2018-05-07 16:54:04 +01:00
|
|
|
;
|
|
|
|
|
|
|
|
$bus = new MessageBus(array(
|
|
|
|
$firstMiddleware,
|
|
|
|
$secondMiddleware,
|
|
|
|
$thirdMiddleware,
|
|
|
|
));
|
|
|
|
|
|
|
|
$bus->dispatch($envelope);
|
|
|
|
}
|
|
|
|
|
2018-10-18 09:53:38 +01:00
|
|
|
public function testThatAMiddlewareCanUpdateTheMessageWhileKeepingTheEnvelopeStamps()
|
2018-05-07 16:54:04 +01:00
|
|
|
{
|
|
|
|
$message = new DummyMessage('Hello');
|
2018-10-18 09:53:38 +01:00
|
|
|
$envelope = new Envelope($message, ...$stamps = array(new ReceivedStamp()));
|
2018-05-07 16:54:04 +01:00
|
|
|
|
|
|
|
$changedMessage = new DummyMessage('Changed');
|
2018-10-18 09:53:38 +01:00
|
|
|
$expectedEnvelope = new Envelope($changedMessage, ...$stamps);
|
2018-05-07 16:54:04 +01:00
|
|
|
|
|
|
|
$firstMiddleware = $this->getMockBuilder(MiddlewareInterface::class)->getMock();
|
|
|
|
$firstMiddleware->expects($this->once())
|
|
|
|
->method('handle')
|
2018-10-18 13:51:08 +01:00
|
|
|
->with($envelope, $this->anything())
|
2018-10-18 12:31:58 +01:00
|
|
|
->will($this->returnCallback(function ($envelope, $stack) use ($expectedEnvelope) {
|
|
|
|
$stack->next()->handle($expectedEnvelope, $stack);
|
2018-05-07 16:54:04 +01:00
|
|
|
}));
|
|
|
|
|
2018-10-18 13:51:08 +01:00
|
|
|
$secondMiddleware = $this->getMockBuilder(MiddlewareInterface::class)->getMock();
|
2018-05-07 16:54:04 +01:00
|
|
|
$secondMiddleware->expects($this->once())
|
|
|
|
->method('handle')
|
|
|
|
->with($expectedEnvelope, $this->anything())
|
|
|
|
;
|
|
|
|
|
|
|
|
$bus = new MessageBus(array(
|
|
|
|
$firstMiddleware,
|
|
|
|
$secondMiddleware,
|
|
|
|
));
|
|
|
|
|
|
|
|
$bus->dispatch($envelope);
|
|
|
|
}
|
|
|
|
}
|