Skip to content

Commit 87ad1d2

Browse files
committed
add tests
1 parent 1eacfa2 commit 87ad1d2

File tree

7 files changed

+370
-18
lines changed

7 files changed

+370
-18
lines changed

pkg/enqueue-bundle/Events/AsyncListener.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ public function syncMode($eventName)
5050
* @param Event $event
5151
* @param string $eventName
5252
*/
53-
public function onEvent(Event $event, $eventName)
53+
public function onEvent(Event $event = null, $eventName)
5454
{
5555
if (false == isset($this->syncMode[$eventName])) {
5656
$transformerName = $this->registry->getTransformerNameForEvent($eventName);

pkg/enqueue-bundle/Events/AsyncProcessor.php

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

33
namespace Enqueue\Bundle\Events;
44

5+
use Enqueue\Consumption\Result;
56
use Enqueue\Psr\PsrContext;
67
use Enqueue\Psr\PsrMessage;
78
use Enqueue\Psr\PsrProcessor;
@@ -34,10 +35,10 @@ public function __construct(Registry $registry, ProxyEventDispatcher $eventDispa
3435
public function process(PsrMessage $message, PsrContext $context)
3536
{
3637
if (false == $eventName = $message->getProperty('event_name')) {
37-
return self::REJECT;
38+
return Result::reject('The message is missing "event_name" property');
3839
}
3940
if (false == $transformerName = $message->getProperty('transformer_name')) {
40-
return self::REJECT;
41+
return Result::reject('The message is missing "transformer_name" property');
4142
}
4243

4344
$event = $this->registry->getTransformer($transformerName)->toEvent($eventName, $message);

pkg/enqueue-bundle/Events/ContainerAwareRegistry.php

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -12,21 +12,21 @@ class ContainerAwareRegistry implements Registry, ContainerAwareInterface
1212
/**
1313
* @var string[]
1414
*/
15-
private $eventNamesMap;
15+
private $eventsMap;
1616

1717
/**
1818
* @var string[]
1919
*/
20-
private $transformerIdsMap;
20+
private $transformersMap;
2121

2222
/**
23-
* @param string[] $eventNamesMap
24-
* @param string[] $transformerIdsMap
23+
* @param string[] $eventsMap [eventName => transformerName]
24+
* @param string[] $transformersMap [transformerName => transformerServiceId]
2525
*/
26-
public function __construct(array $eventNamesMap, array $transformerIdsMap)
26+
public function __construct(array $eventsMap, array $transformersMap)
2727
{
28-
$this->eventNamesMap = $eventNamesMap;
29-
$this->transformerIdsMap = $transformerIdsMap;
28+
$this->eventsMap = $eventsMap;
29+
$this->transformersMap = $transformersMap;
3030
}
3131

3232
/**
@@ -35,10 +35,10 @@ public function __construct(array $eventNamesMap, array $transformerIdsMap)
3535
public function getTransformerNameForEvent($eventName)
3636
{
3737
$transformerName = null;
38-
if (array_key_exists($eventName, $this->eventNamesMap)) {
39-
$transformerName = $this->eventNamesMap[$eventName];
38+
if (array_key_exists($eventName, $this->eventsMap)) {
39+
$transformerName = $this->eventsMap[$eventName];
4040
} else {
41-
foreach ($this->eventNamesMap as $eventNamePattern => $name) {
41+
foreach ($this->eventsMap as $eventNamePattern => $name) {
4242
if ('/' != $eventNamePattern[0]) {
4343
continue;
4444
}
@@ -63,11 +63,11 @@ public function getTransformerNameForEvent($eventName)
6363
*/
6464
public function getTransformer($name)
6565
{
66-
if (false == array_key_exists($name, $this->transformerIdsMap)) {
66+
if (false == array_key_exists($name, $this->transformersMap)) {
6767
throw new \LogicException(sprintf('There is no transformer named %s', $name));
6868
}
6969

70-
$transformer = $this->container->get($this->transformerIdsMap[$name]);
70+
$transformer = $this->container->get($this->transformersMap[$name]);
7171

7272
if (false == $transformer instanceof EventTransformer) {
7373
throw new \LogicException(sprintf(

pkg/enqueue-bundle/Events/ProxyEventDispatcher.php

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,10 +40,13 @@ public function __construct(ContainerInterface $container, EventDispatcherInterf
4040
*/
4141
public function dispatchAsyncListenersOnly($eventName, Event $event = null)
4242
{
43-
$this->asyncListener->resetSyncMode();
44-
$this->asyncListener->syncMode($eventName);
43+
try {
44+
$this->asyncListener->syncMode($eventName);
4545

46-
parent::dispatch($eventName, $event);
46+
parent::dispatch($eventName, $event);
47+
} finally {
48+
$this->asyncListener->resetSyncMode();
49+
}
4750
}
4851

4952
/**
Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
<?php
2+
3+
namespace Enqueue\Bundle\Tests\Events;
4+
5+
use Enqueue\Bundle\Events\AsyncListener;
6+
use Enqueue\Bundle\Events\EventTransformer;
7+
use Enqueue\Bundle\Events\Registry;
8+
use Enqueue\Client\Message;
9+
use Enqueue\Client\ProducerInterface;
10+
use Enqueue\Test\ClassExtensionTrait;
11+
use PHPUnit\Framework\TestCase;
12+
use Symfony\Component\EventDispatcher\GenericEvent;
13+
14+
class AsyncListenerTest extends TestCase
15+
{
16+
use ClassExtensionTrait;
17+
18+
public function testCouldBeConstructedWithRegistryAndProxyEventDispatcher()
19+
{
20+
new AsyncListener($this->createProducerMock(), $this->createRegistryMock());
21+
}
22+
23+
public function testShouldDoNothingIfSyncModeOn()
24+
{
25+
$producer = $this->createProducerMock();
26+
$producer
27+
->expects($this->never())
28+
->method('send')
29+
;
30+
31+
$registry = $this->createRegistryMock();
32+
$registry
33+
->expects($this->never())
34+
->method('getTransformerNameForEvent')
35+
;
36+
37+
$listener = new AsyncListener($producer, $registry);
38+
39+
$listener->syncMode('fooEvent');
40+
41+
$listener->onEvent(null, 'fooEvent');
42+
$listener->onEvent(new GenericEvent(), 'fooEvent');
43+
}
44+
45+
public function testShouldSendMessageIfSyncModeOff()
46+
{
47+
$event = new GenericEvent();
48+
49+
$message = new Message();
50+
$message->setBody('serializedEvent');
51+
52+
$transformerMock = $this->createEventTransformerMock();
53+
$transformerMock
54+
->expects($this->once())
55+
->method('toMessage')
56+
->with('fooEvent', $this->identicalTo($event))
57+
->willReturn($message)
58+
;
59+
60+
$registry = $this->createRegistryMock();
61+
$registry
62+
->expects($this->once())
63+
->method('getTransformerNameForEvent')
64+
->with('fooEvent')
65+
->willReturn('fooTrans')
66+
;
67+
$registry
68+
->expects($this->once())
69+
->method('getTransformer')
70+
->with('fooTrans')
71+
->willReturn($transformerMock)
72+
;
73+
74+
$producer = $this->createProducerMock();
75+
$producer
76+
->expects($this->once())
77+
->method('send')
78+
->with('event.fooEvent', $this->identicalTo($message))
79+
;
80+
81+
$listener = new AsyncListener($producer, $registry);
82+
83+
$listener->onEvent($event, 'fooEvent');
84+
85+
$this->assertEquals('serializedEvent', $message->getBody());
86+
$this->assertEquals([], $message->getHeaders());
87+
$this->assertEquals([
88+
'event_name' => 'fooEvent',
89+
'transformer_name' => 'fooTrans',
90+
], $message->getProperties());
91+
}
92+
93+
/**
94+
* @return \PHPUnit_Framework_MockObject_MockObject|EventTransformer
95+
*/
96+
private function createEventTransformerMock()
97+
{
98+
return $this->createMock(EventTransformer::class);
99+
}
100+
101+
/**
102+
* @return \PHPUnit_Framework_MockObject_MockObject|ProducerInterface
103+
*/
104+
private function createProducerMock()
105+
{
106+
return $this->createMock(ProducerInterface::class);
107+
}
108+
109+
/**
110+
* @return \PHPUnit_Framework_MockObject_MockObject|Registry
111+
*/
112+
private function createRegistryMock()
113+
{
114+
return $this->createMock(Registry::class);
115+
}
116+
}
Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
<?php
2+
3+
namespace Enqueue\Bundle\Tests\Events;
4+
5+
use Enqueue\Bundle\Events\AsyncProcessor;
6+
use Enqueue\Bundle\Events\EventTransformer;
7+
use Enqueue\Bundle\Events\ProxyEventDispatcher;
8+
use Enqueue\Bundle\Events\Registry;
9+
use Enqueue\Consumption\Result;
10+
use Enqueue\Null\NullContext;
11+
use Enqueue\Null\NullMessage;
12+
use Enqueue\Psr\PsrProcessor;
13+
use Enqueue\Test\ClassExtensionTrait;
14+
use PHPUnit\Framework\TestCase;
15+
use Symfony\Component\EventDispatcher\GenericEvent;
16+
17+
class AsyncProcessorTest extends TestCase
18+
{
19+
use ClassExtensionTrait;
20+
21+
public function testShouldImplementProcessorInterface()
22+
{
23+
$this->assertClassImplements(PsrProcessor::class, AsyncProcessor::class);
24+
}
25+
26+
public function testCouldBeConstructedWithRegistryAndProxyEventDispatcher()
27+
{
28+
new AsyncProcessor($this->createRegistryMock(), $this->createProxyEventDispatcherMock());
29+
}
30+
31+
public function testRejectIfMessageMissingEventNameProperty()
32+
{
33+
$processor = new AsyncProcessor($this->createRegistryMock(), $this->createProxyEventDispatcherMock());
34+
35+
$result = $processor->process(new NullMessage(), new NullContext());
36+
37+
$this->assertInstanceOf(Result::class, $result);
38+
$this->assertEquals(Result::REJECT, $result->getStatus());
39+
$this->assertEquals('The message is missing "event_name" property', $result->getReason());
40+
}
41+
42+
public function testRejectIfMessageMissingTransformerNameProperty()
43+
{
44+
$processor = new AsyncProcessor($this->createRegistryMock(), $this->createProxyEventDispatcherMock());
45+
46+
$message = new NullMessage();
47+
$message->setProperty('event_name', 'anEventName');
48+
49+
$result = $processor->process($message, new NullContext());
50+
51+
$this->assertInstanceOf(Result::class, $result);
52+
$this->assertEquals(Result::REJECT, $result->getStatus());
53+
$this->assertEquals('The message is missing "transformer_name" property', $result->getReason());
54+
}
55+
56+
public function testShouldDispatchAsyncListenersOnly()
57+
{
58+
$eventName = 'theEventName';
59+
$transformerName = 'theTransformerName';
60+
61+
$event = new GenericEvent();
62+
63+
$message = new NullMessage();
64+
$message->setProperty('event_name', $eventName);
65+
$message->setProperty('transformer_name', $transformerName);
66+
67+
$transformerMock = $this->createEventTransformerMock();
68+
$transformerMock
69+
->expects($this->once())
70+
->method('toEvent')
71+
->with($eventName, $this->identicalTo($message))
72+
->willReturn($event)
73+
;
74+
75+
$registryMock = $this->createRegistryMock();
76+
$registryMock
77+
->expects($this->once())
78+
->method('getTransformer')
79+
->with($transformerName)
80+
->willReturn($transformerMock)
81+
;
82+
83+
$dispatcherMock = $this->createProxyEventDispatcherMock();
84+
$dispatcherMock
85+
->expects($this->once())
86+
->method('dispatchAsyncListenersOnly')
87+
->with($eventName, $this->identicalTo($event))
88+
;
89+
$dispatcherMock
90+
->expects($this->never())
91+
->method('dispatch')
92+
;
93+
94+
$processor = new AsyncProcessor($registryMock, $dispatcherMock);
95+
96+
$this->assertSame(Result::ACK, $processor->process($message, new NullContext()));
97+
}
98+
99+
/**
100+
* @return \PHPUnit_Framework_MockObject_MockObject|EventTransformer
101+
*/
102+
private function createEventTransformerMock()
103+
{
104+
return $this->createMock(EventTransformer::class);
105+
}
106+
107+
/**
108+
* @return \PHPUnit_Framework_MockObject_MockObject|ProxyEventDispatcher
109+
*/
110+
private function createProxyEventDispatcherMock()
111+
{
112+
return $this->createMock(ProxyEventDispatcher::class);
113+
}
114+
115+
/**
116+
* @return \PHPUnit_Framework_MockObject_MockObject|Registry
117+
*/
118+
private function createRegistryMock()
119+
{
120+
return $this->createMock(Registry::class);
121+
}
122+
}

0 commit comments

Comments
 (0)