Skip to content

Commit dc89b16

Browse files
committed
[client] Fixes edge cases in client's routing logic.
1 parent 41dbe59 commit dc89b16

File tree

4 files changed

+43
-11
lines changed

4 files changed

+43
-11
lines changed

pkg/enqueue/Client/ConsumptionExtension/SetRouterPropertiesExtension.php

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,13 @@ public function onPreReceived(Context $context)
3535
return;
3636
}
3737

38+
$config = $this->driver->getConfig();
39+
if ($context->getPsrQueue()->getQueueName() != $config->createTransportQueueName($config->getRouterQueueName())) {
40+
return;
41+
}
42+
3843
// RouterProcessor is our default message processor when that header is not set
39-
$message->setProperty(Config::PARAMETER_PROCESSOR_NAME, $this->driver->getConfig()->getRouterProcessorName());
40-
$message->setProperty(Config::PARAMETER_PROCESSOR_QUEUE_NAME, $this->driver->getConfig()->getRouterQueueName());
44+
$message->setProperty(Config::PARAMETER_PROCESSOR_NAME, $config->getRouterProcessorName());
45+
$message->setProperty(Config::PARAMETER_PROCESSOR_QUEUE_NAME, $config->getRouterQueueName());
4146
}
4247
}

pkg/enqueue/Client/RouterProcessor.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
namespace Enqueue\Client;
44

5+
use Enqueue\Consumption\Result;
56
use Enqueue\Psr\PsrContext;
67
use Enqueue\Psr\PsrMessage;
78
use Enqueue\Psr\PsrProcessor;
@@ -45,7 +46,7 @@ public function process(PsrMessage $message, PsrContext $context)
4546
{
4647
$topicName = $message->getProperty(Config::PARAMETER_TOPIC_NAME);
4748
if (false == $topicName) {
48-
throw new \LogicException(sprintf(
49+
return Result::reject(sprintf(
4950
'Got message without required parameter: "%s"',
5051
Config::PARAMETER_TOPIC_NAME
5152
));

pkg/enqueue/Tests/Client/ConsumptionExtension/SetRouterPropertiesExtensionTest.php

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
use Enqueue\Consumption\Context;
99
use Enqueue\Consumption\ExtensionInterface;
1010
use Enqueue\Null\NullMessage;
11+
use Enqueue\Null\NullQueue;
1112
use Enqueue\Psr\PsrContext;
1213
use Enqueue\Test\ClassExtensionTrait;
1314
use PHPUnit\Framework\TestCase;
@@ -26,13 +27,13 @@ public function testCouldBeConstructedWithRequiredArguments()
2627
new SetRouterPropertiesExtension($this->createDriverMock());
2728
}
2829

29-
public function testShouldSetRouterProcessorPropertyIfNotSet()
30+
public function testShouldSetRouterProcessorPropertyIfNotSetAndOnRouterQueue()
3031
{
31-
$config = new Config('', '', '', 'router-queue', '', 'router-processor-name');
32+
$config = Config::create('test', '', '', 'router-queue', '', 'router-processor-name');
3233

3334
$driver = $this->createDriverMock();
3435
$driver
35-
->expects(self::exactly(2))
36+
->expects($this->once())
3637
->method('getConfig')
3738
->willReturn($config)
3839
;
@@ -41,6 +42,7 @@ public function testShouldSetRouterProcessorPropertyIfNotSet()
4142

4243
$context = new Context($this->createPsrContextMock());
4344
$context->setPsrMessage($message);
45+
$context->setPsrQueue(new NullQueue('test.router-queue'));
4446

4547
$extension = new SetRouterPropertiesExtension($driver);
4648
$extension->onPreReceived($context);
@@ -51,11 +53,34 @@ public function testShouldSetRouterProcessorPropertyIfNotSet()
5153
], $message->getProperties());
5254
}
5355

56+
public function testShouldNotSetRouterProcessorPropertyIfNotSetAndNotOnRouterQueue()
57+
{
58+
$config = Config::create('test', '', '', 'router-queue', '', 'router-processor-name');
59+
60+
$driver = $this->createDriverMock();
61+
$driver
62+
->expects($this->once())
63+
->method('getConfig')
64+
->willReturn($config)
65+
;
66+
67+
$message = new NullMessage();
68+
69+
$context = new Context($this->createPsrContextMock());
70+
$context->setPsrMessage($message);
71+
$context->setPsrQueue(new NullQueue('test.another-queue'));
72+
73+
$extension = new SetRouterPropertiesExtension($driver);
74+
$extension->onPreReceived($context);
75+
76+
$this->assertEquals([], $message->getProperties());
77+
}
78+
5479
public function testShouldNotSetAnyPropertyIfProcessorNamePropertyAlreadySet()
5580
{
5681
$driver = $this->createDriverMock();
5782
$driver
58-
->expects(self::never())
83+
->expects($this->never())
5984
->method('getConfig')
6085
;
6186

pkg/enqueue/Tests/Client/RouterProcessorTest.php

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,14 +30,15 @@ public function testCouldBeConstructedWithSessionAndRoutes()
3030
$this->assertAttributeEquals($routes, 'routes', $router);
3131
}
3232

33-
public function testShouldThrowExceptionIfTopicNameParameterIsNotSet()
33+
public function testShouldRejectIfTopicNameParameterIsNotSet()
3434
{
3535
$router = new RouterProcessor($this->createDriverMock());
3636

37-
$this->expectException(\LogicException::class);
38-
$this->expectExceptionMessage('Got message without required parameter: "enqueue.topic_name"');
37+
$result = $router->process(new NullMessage(), new NullContext());
3938

40-
$router->process(new NullMessage(), new NullContext());
39+
$this->assertInstanceOf(Result::class, $result);
40+
$this->assertEquals(Result::REJECT, $result->getStatus());
41+
$this->assertEquals('Got message without required parameter: "enqueue.topic_name"', $result->getReason());
4142
}
4243

4344
public function testShouldRouteOriginalMessageToRecipient()

0 commit comments

Comments
 (0)