Skip to content
This repository was archived by the owner on Jan 31, 2020. It is now read-only.

Commit e08cf6a

Browse files
committed
Provide backwards compatibility for AggregateHydrator events
Per #55 (and originally reported as zendframework/zend-hydrator#19), this patch does the following: - Adds tests against the hydrate and extract methods to ensure that the event triggered is the zend-stdlib variant (as well as kept the tests for the zend-hydrator variants). - Updated test expectations to check for `triggerEvent()` (and not `trigger()`), as the 1.1 version of zend-hydrator is now forwards-compatible with zend-eventmanager v3. This also required raising the minimum version of zend-hydrator to 1.1 so that tests do not need to be varied. - Fixes the test assumptions in `testAdd()`, as attachment of the aggregate listener now calls the `attach()` method of the listener class, changing how the mock EM instance is called.
1 parent b894a85 commit e08cf6a

File tree

3 files changed

+109
-13
lines changed

3 files changed

+109
-13
lines changed

composer.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
},
1515
"require": {
1616
"php": "^5.5 || ^7.0",
17-
"zendframework/zend-hydrator": "~1.0"
17+
"zendframework/zend-hydrator": "~1.1"
1818
},
1919
"require-dev": {
2020
"zendframework/zend-config": "~2.5",

src/Hydrator/Aggregate/AggregateHydrator.php

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,4 +19,27 @@
1919
*/
2020
class AggregateHydrator extends BaseAggregateHydrator implements HydratorInterface
2121
{
22+
/**
23+
* {@inheritDoc}
24+
*/
25+
public function extract($object)
26+
{
27+
$event = new ExtractEvent($this, $object);
28+
29+
$this->getEventManager()->triggerEvent($event);
30+
31+
return $event->getExtractedData();
32+
}
33+
34+
/**
35+
* {@inheritDoc}
36+
*/
37+
public function hydrate(array $data, $object)
38+
{
39+
$event = new HydrateEvent($this, $object, $data);
40+
41+
$this->getEventManager()->triggerEvent($event);
42+
43+
return $event->getHydratedObject();
44+
}
2245
}

test/Hydrator/Aggregate/AggregateHydratorTest.php

Lines changed: 85 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,13 @@
1010
namespace ZendTest\Stdlib\Hydrator\Aggregate;
1111

1212
use PHPUnit_Framework_TestCase;
13+
use Prophecy\Argument;
14+
use Zend\EventManager\EventManager;
15+
use Zend\Hydrator\Aggregate\HydratorListener;
16+
use Zend\Hydrator\HydratorInterface;
1317
use Zend\Stdlib\Hydrator\Aggregate\AggregateHydrator;
18+
use Zend\Stdlib\Hydrator\Aggregate\ExtractEvent;
19+
use Zend\Stdlib\Hydrator\Aggregate\HydrateEvent;
1420
use stdClass;
1521

1622
/**
@@ -24,7 +30,7 @@ class AggregateHydratorTest extends PHPUnit_Framework_TestCase
2430
protected $hydrator;
2531

2632
/**
27-
* @var \Zend\EventManager\EventManagerInterface|\PHPUnit_Framework_MockObject_MockObject
33+
* @var \Zend\EventManager\EventManager|\PHPUnit_Framework_MockObject_MockObject
2834
*/
2935
protected $eventManager;
3036

@@ -33,7 +39,7 @@ class AggregateHydratorTest extends PHPUnit_Framework_TestCase
3339
*/
3440
public function setUp()
3541
{
36-
$this->eventManager = $this->getMock('Zend\EventManager\EventManagerInterface');
42+
$this->eventManager = $this->getMock(EventManager::class);
3743
$this->hydrator = new AggregateHydrator();
3844

3945
$this->hydrator->setEventManager($this->eventManager);
@@ -44,45 +50,112 @@ public function setUp()
4450
*/
4551
public function testAdd()
4652
{
47-
$attached = $this->getMock('Zend\Hydrator\HydratorInterface');
53+
$hydrator = $this->prophesize(HydratorInterface::class)->reveal();
54+
55+
$events = $this->prophesize(EventManager::class);
56+
57+
$events->setIdentifiers(Argument::type('array'))->shouldBeCalled();
58+
59+
$events->attach(
60+
HydrateEvent::EVENT_HYDRATE,
61+
Argument::that(function ($argument) {
62+
if (! is_callable($argument)) {
63+
return false;
64+
}
65+
if (! is_array($argument)) {
66+
return false;
67+
}
68+
return (
69+
$argument[0] instanceof HydratorListener
70+
&& $argument[1] === 'onHydrate'
71+
);
72+
}),
73+
123
74+
)->shouldBeCalled();
75+
76+
$events->attach(
77+
ExtractEvent::EVENT_EXTRACT,
78+
Argument::that(function ($argument) {
79+
if (! is_callable($argument)) {
80+
return false;
81+
}
82+
if (! is_array($argument)) {
83+
return false;
84+
}
85+
return (
86+
$argument[0] instanceof HydratorListener
87+
&& $argument[1] === 'onExtract'
88+
);
89+
}),
90+
123
91+
)->shouldBeCalled();
92+
93+
$this->hydrator->setEventManager($events->reveal());
94+
$this->hydrator->add($hydrator, 123);
95+
}
96+
97+
/**
98+
* @covers \Zend\Stdlib\Hydrator\Aggregate\AggregateHydrator::hydrate
99+
*/
100+
public function testHydrate()
101+
{
102+
$object = new stdClass();
48103

49104
$this
50105
->eventManager
51106
->expects($this->once())
52-
->method('attachAggregate')
53-
->with($this->isInstanceOf('Zend\Hydrator\Aggregate\HydratorListener'), 123);
107+
->method('triggerEvent')
108+
->with($this->isInstanceOf('Zend\Hydrator\Aggregate\HydrateEvent'));
54109

55-
$this->hydrator->add($attached, 123);
110+
$this->assertSame($object, $this->hydrator->hydrate(['foo' => 'bar'], $object));
56111
}
57112

58113
/**
114+
* @covers \Zend\Stdlib\Hydrator\Aggregate\AggregateHydrator::extract
115+
*/
116+
public function testExtract()
117+
{
118+
$object = new stdClass();
119+
120+
$this
121+
->eventManager
122+
->expects($this->once())
123+
->method('triggerEvent')
124+
->with($this->isInstanceOf('Zend\Hydrator\Aggregate\ExtractEvent'));
125+
126+
$this->assertSame([], $this->hydrator->extract($object));
127+
}
128+
129+
/**
130+
* @group 55
59131
* @covers \Zend\Stdlib\Hydrator\Aggregate\AggregateHydrator::hydrate
60132
*/
61-
public function testHydrate()
133+
public function testHydrateUsesStdlibHydrateEvent()
62134
{
63135
$object = new stdClass();
64136

65137
$this
66138
->eventManager
67139
->expects($this->once())
68-
->method('trigger')
69-
->with($this->isInstanceOf('Zend\Hydrator\Aggregate\HydrateEvent'));
140+
->method('triggerEvent')
141+
->with($this->isInstanceOf('Zend\Stdlib\Hydrator\Aggregate\HydrateEvent'));
70142

71143
$this->assertSame($object, $this->hydrator->hydrate(['foo' => 'bar'], $object));
72144
}
73145

74146
/**
147+
* @group 55
75148
* @covers \Zend\Stdlib\Hydrator\Aggregate\AggregateHydrator::extract
76149
*/
77-
public function testExtract()
150+
public function testExtractUsesStdlibExtractEvent()
78151
{
79152
$object = new stdClass();
80153

81154
$this
82155
->eventManager
83156
->expects($this->once())
84-
->method('trigger')
85-
->with($this->isInstanceOf('Zend\Hydrator\Aggregate\ExtractEvent'));
157+
->method('triggerEvent')
158+
->with($this->isInstanceOf('Zend\Stdlib\Hydrator\Aggregate\ExtractEvent'));
86159

87160
$this->assertSame([], $this->hydrator->extract($object));
88161
}

0 commit comments

Comments
 (0)