8000 Add tests to the Messenger component · sroze/symfony@86a91ec · GitHub
[go: up one dir, main page]

Skip to content

Commit 86a91ec

Browse files
committed
Add tests to the Messenger component
1 parent 8ab6a1a commit 86a91ec

File tree

10 files changed

+423
-1
lines changed

10 files changed

+423
-1
lines changed

src/Symfony/Component/Messenger/Asynchronous/Middleware/SendMessageMiddleware.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,10 @@ public function handle($message, callable $next)
3838

3939
if (!empty($senders = $this->senderLocator->getSendersForMessage($message))) {
4040
foreach ($senders as $sender) {
41+
if (null === $sender) {
42+
continue;
43+
}
44+
4145
$sender->send($message);
4246
}
4347

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the Symfony package.
5+
*
6+
* (c) Fabien Potencier <fabien@symfony.com>
7+
*
8+
* For the full copyright and license information, please view the LICENSE
9+
* file that was distributed with this source code.
10+
*/
11+
12+
namespace Symfony\Component\Messenger\Tests\Asynchronous\Middleware;
13+
14+
use PHPUnit\Framework\TestCase;
15+
use Symfony\Component\Messenger\Asynchronous\Middleware\SendMessageMiddleware;
16+
use Symfony\Component\Messenger\Asynchronous\Routing\SenderLocatorInterface;
17+
use Symfony\Component\Messenger\Asynchronous\Transport\ReceivedMessage;
18+
use Symfony\Component\Messenger\Tests\Fixtures\DummyMessage;
19+
use Symfony\Component\Messenger\Transport\SenderInterface;
20+
21+
class SendMessageMiddlewareTest extends TestCase
22+
{
23+
public function testItSendsTheMessageToAssignedSender()
24+
{
25+
$message = new DummyMessage('Hey');
26+
$sender = $this->createMock(SenderInterface::class);
27+
$next = $this->createPartialMock(\stdClass::class, ['__invoke']);
28+
29+
$middleware = new SendMessageMiddleware(new InMemorySenderLocator(array(
30+
$sender,
31+
)));
32+
33+
$sender->expects($this->once())->method('send')->with($message);
34+
$next->expects($this->never())->method($this->anything());
35+
36+
$middleware->handle($message, $next);
37+
}
38+
39+
public function testItAlsoCallsTheNextMiddlewareIfASenderIsNull()
40+
{
41+
$message = new DummyMessage('Hey');
42+
$sender = $this->createMock(SenderInterface::class);
43+
$next = $this->createPartialMock(\stdClass::class, ['__invoke']);
44+
45+
$middleware = new SendMessageMiddleware(new InMemorySenderLocator(array(
46+
$sender,
47+
null,
48+
)));
49+
50+
$sender->expects($this->once())->method('send')->with($message);
51+
$next->expects($this->once())->method($this->anything());
52+
53+
$middleware->handle($message, $next);
54+
}
55+
56+
public function testItCallsTheNextMiddlewareWhenNoSenderForThisMessage()
57+
{
58+
$message = new DummyMessage('Hey');
59+
$next = $this->createPartialMock(\stdClass::class, ['__invoke']);
60+
61+
$middleware = new SendMessageMiddleware(new InMemorySenderLocator(array()));
62+
63+
$next->expects($this->once())->method($this->anything());
64+
65+
$middleware->handle($message, $next);
66+
}
67+
68+
public function testItSkipsReceivedMessages()
69+
{
70+
$innerMessage = new DummyMessage('Hey');
71+
$message = new ReceivedMessage($innerMessage);
72+
73+
$sender = $this->createMock(SenderInterface::class);
74+
$next = $this->createPartialMock(\stdClass::class, ['__invoke']);
75+
76+
$middleware = new SendMessageMiddleware(new InMemorySenderLocator(array(
77+
$sender,
78+
)));
79+
80+
$sender->expects($this->never())->method('send');
81+
$next->expects($this->once())->method('__invoke')->with($innerMessage);
82+
83+
$middleware->handle($message, $next);
84+
}
85+
}
86+
87+
class InMemorySenderLocator implements SenderLocatorInterface
88+
{
89+
private $senders;
90+
91+
public function __construct(array $senders)
92+
{
93+
$this->senders = $senders;
94+
}
95+
96+
public function getSendersForMessage($message): array
97+
{
98+
return $this->senders;
99+
}
100+
}
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the Symfony package.
5+
*
6+
* (c) Fabien Potencier <fabien@symfony.com>
7+
*
8+
* For the full copyright and license information, please view the LICENSE
9+
* file that was distributed with this source code.
10+
*/
11+
12+
namespace Symfony\Component\Messenger\Tests\Asynchronous\Routing;
13+
14+
use PHPUnit\Framework\TestCase;
15+
use Symfony\Component\DependencyInjection\Container;
16+
use Symfony\Component\Messenger\Asynchronous\Routing\SenderLocator;
17+
use Symfony\Component\Messenger\Tests\Fixtures\DummyMessage;
18+
use Symfony\Component\Messenger\Tests\Fixtures\SecondMessage;
19+
use Symfony\Component\Messenger\Transport\SenderInterface;
20+
21+
class SenderLocatorTest extends TestCase
22+
{
23+
public function testItReturnsTheSenderBasedOnTheMessageClass()
24+
{
25+
$sender = $this->createMock(SenderInterface::class);
26+
$container = new Container();
27+
$container->set('my_amqp_sender', $sender);
28+
29+
$locator = new SenderLocator($container, [
30+
DummyMessage::class => [
31+
'my_amqp_sender',
32+
]
33+
]);
34+
35+
$this->assertEquals([$sender], $locator->getSendersForMessage(new DummyMessage('Hello')));
36+
$this->assertEquals([], $locator->getSendersForMessage(new SecondMessage()));
37+
}
38+
39+
public function testItSupportsAWildcardInsteadOfTheMessageClass()
40+
{
41+
$container = new Container();
42+
43+
$sender = $this->createMock(SenderInterface::class);
44+
$container->set('my_amqp_sender', $sender);
45+
46+
$apiSender = $this->createMock(SenderInterface::class);
47+
$container->set('my_api_sender', $apiSender);
48+
49+
$locator = new SenderLocator($container, [
50+
DummyMessage::class => [
51+
'my_amqp_sender',
52+
],
53+
'*' => [
54+
'my_api_sender'
55+
]
56+
]);
57+
58+
$this->assertEquals([$sender], $locator->getSendersForMessage(new DummyMessage('Hello')));
59+
$this->assertEquals([$apiSender], $locator->getSendersForMessage(new SecondMessage()));
60+
}
61+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
<?php
2+
3+
namespace Symfony\Component\Messenger\Tests\Fixtures;
4+
5+
class DummyMessage
6+
{
7+
private $message;
8+
9+
public function __construct(string $message)
10+
{
11+
$this->message = $message;
12+
}
13+
14+
public function getMessage(): string
15+
{
16+
return $this->message;
17+
}
18+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
<?php
2+
3+
namespace Symfony\Component\Messenger\Tests\Fixtures;
4+
5+
class SecondMessage
6+
{
7+
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the Symfony package.
5+
*
6+
* (c) Fabien Potencier <fabien@symfony.com>
7+
*
8+
* For the full copyright and license information, please view the LICENSE
9+
* file that was distributed with this source code.
10+
*/
11+
12+
namespace Symfony\Component\Messenger\Tests;
13+
14+
use PHPUnit\Framework\TestCase;
15+
use Symfony\Component\Messenger\MessageBus;
16+
use Symfony\Component\Messenger\MessageBusInterface;
17+
use Symfony\Component\Messenger\MiddlewareInterface;
18+
use Symfony\Component\Messenger\Tests\Fixtures\DummyMessage;
19+
20+
class MessageBusTest extends TestCase
21+
{
22+
public function testItHasTheRightInterface()
23+
{
24+
$bus = new MessageBus();
25+
26+
$this->assertInstanceOf(MessageBusInterface::class, $bus);
27+
}
28+
29+
public function testItCallsTheMiddlewaresAndChainTheReturnValue()
30+
{
31+
$message = new DummyMessage('Hello');
32+
$responseFromDepthMiddleware = 1234;
33+
34+
$firstMiddleware = $this->createMock(MiddlewareInterface::class);
35+
$firstMiddleware->expects($this->once())
36+
->method('handle')
37+
->with($message, $this->anything())
38+
->will($this->returnCallback(function($message, $next) {
39+
return $next($message);
40+
}));
41+
42+
$secondMiddleware = $this->createMock(MiddlewareInterface::class);
43+
$secondMiddleware->expects($this->once())
44+
->method('handle')
45+
->with($message, $this->anything())
46+
->willReturn($responseFromDepthMiddleware);
47+
48+
$bus = new MessageBus([
49+
$firstMiddleware,
50+
$secondMiddleware,
51+
]);
52+
53+
$this->assertEquals($responseFromDepthMiddleware, $bus->dispatch($message));
54+
}
55+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the Symfony package.
5+
*
6+
* (c) Fabien Potencier <fabien@symfony.com>
7+
*
8+
* For the full copyright and license information, please view the LICENSE
9+
* file that was distributed with this source code.
10+
*/
11+
12+
namespace Symfony\Component\Messenger\Tests\Middleware;
13+
14+
use PHPUnit\Framework\TestCase;
15+
use Symfony\Component\Messenger\HandlerLocator;
16+
use Symfony\Component\Messenger\Middleware\HandleMessageMiddleware;
17+
use Symfony\Component\Messenger\Tests\Fixtures\DummyMessage;
18+
19+
class HandleMessageMiddlewareTest extends TestCase
20+
{
21+
public function testItCallsTheHandlerAndNextMiddleware()
22+
{
23+
$message = new DummyMessage('Hey');
24+
25+
$handler = $this->createPartialMock(\stdClass::class, ['__invoke']);
26+
$handler->method('__invoke')->willReturn('Hello');
27+
28+
$next = $this->createPartialMock(\stdClass::class, ['__invoke']);
29+
30+
$middleware = new HandleMessageMiddleware(new HandlerLocator(array(
31+
DummyMessage::class => $handler,
32+
)));
33+
34+
$handler->expects($this->once())->method('__invoke')->with($message);
35+
$next->expects($this->once())->method('__invoke')->with($message);
36+
37+
$middleware->handle($message, $next);
38+
}
39+
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the Symfony package.
5+
*
6+
* (c) Fabien Potencier <fabien@symfony.com>
7+
*
8+
* For the full copyright and license information, please view the LICENSE
9+
* file that was distributed with this source code.
10+
*/
11+
12+
namespace Symfony\Component\Messenger\Tests\Transport\Serialization;
13+
14+
use PHPUnit\Framework\TestCase;
15+
use Symfony\Component\Messenger\Tests\Fixtures\DummyMessage;
16+
use Symfony\Component\Messenger\Transport\Serialization\Serializer;
17+
use Symfony\Component\Serializer as SerializerComponent;
18+
use Symfony\Component\Serializer\Encoder\JsonEncoder;
19+
use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
20+
21+
class SerializerTest extends TestCase
22+
{
23+
public function testEncodedIsDecodable()
24+
{
25+
$serializer = new Serializer(
26+
new SerializerComponent\Serializer(array(new ObjectNormalizer()), array('json' => new JsonEncoder()))
27+
);
28+
29+
$message = new DummyMessage('Hello');
30+
31+
$this->assertEquals($message, $serializer->decode($serializer->encode($message)));
32+
}
33+
34+
public function testEncodedIsHavingTheBodyAndTypeHeader()
35+
{
36+
$serializer = new Serializer(
37+
new SerializerComponent\Serializer(array(new ObjectNormalizer()), array('json' => new JsonEncoder()))
38+
);
39+
40+
$encoded = $serializer->encode(new DummyMessage('Hello'));
41+
42+
$this->assertArrayHasKey('body', $encoded);
43+
$this->assertArrayHasKey('headers', $encoded);
44+
$this->assertArrayHasKey('type', $encoded['headers']);
45+
$this->assertEquals(DummyMessage::class, $encoded['headers']['type']);
46+
}
47+
}

0 commit comments

Comments
 (0)
0