Skip to content

Commit 2898641

Browse files
committed
add tests
1 parent 7730cb1 commit 2898641

File tree

3 files changed

+151
-6
lines changed

3 files changed

+151
-6
lines changed

src/MetadataHydrator.php

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -64,9 +64,7 @@ public function hydrate(string $class, array $data): object
6464
}
6565

6666
if ($this->eventDispatcher) {
67-
$event = new PreHydrate($data, $metadata);
68-
$this->eventDispatcher->dispatch($event);
69-
$data = $event->data;
67+
$data = $this->eventDispatcher->dispatch(new PreHydrate($data, $metadata))->data;
7068
}
7169

7270
$object = $metadata->newInstance();
@@ -193,9 +191,7 @@ public function extract(object $object): array
193191
}
194192

195193
if ($this->eventDispatcher) {
196-
$event = new PostExtract($data, $metadata);
197-
$this->eventDispatcher->dispatch($event);
198-
$data = $event->data;
194+
return $this->eventDispatcher->dispatch(new PostExtract($data, $metadata))->data;
199195
}
200196

201197
return $data;
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Patchlevel\Hydrator\Tests\Unit\Cryptography;
6+
7+
use Patchlevel\Hydrator\Cryptography\CryptographySubscriber;
8+
use Patchlevel\Hydrator\Cryptography\PayloadCryptographer;
9+
use Patchlevel\Hydrator\Event\PostExtract;
10+
use Patchlevel\Hydrator\Event\PreHydrate;
11+
use Patchlevel\Hydrator\Metadata\ClassMetadata;
12+
use PHPUnit\Framework\Attributes\CoversClass;
13+
use PHPUnit\Framework\TestCase;
14+
use Prophecy\PhpUnit\ProphecyTrait;
15+
use ReflectionClass;
16+
use stdClass;
17+
18+
#[CoversClass(CryptographySubscriber::class)]
19+
final class CryptographySubscriberTest extends TestCase
20+
{
21+
use ProphecyTrait;
22+
23+
public function testSubscriptions(): void
24+
{
25+
self::assertEquals([
26+
PreHydrate::class => 'preHydrate',
27+
PostExtract::class => 'postExtract',
28+
], CryptographySubscriber::getSubscribedEvents());
29+
}
30+
31+
public function testPreHydrate(): void
32+
{
33+
$metadata = new ClassMetadata(
34+
new ReflectionClass(stdClass::class),
35+
);
36+
37+
$event = new PreHydrate(
38+
['foo' => 'bar'],
39+
$metadata,
40+
);
41+
42+
$cryptographer = $this->prophesize(PayloadCryptographer::class);
43+
$cryptographer->decrypt(
44+
$metadata,
45+
['foo' => 'bar'],
46+
)->willReturn(['foo' => 'baz'])->shouldBeCalledOnce();
47+
48+
$subscriber = new CryptographySubscriber($cryptographer->reveal());
49+
$subscriber->preHydrate($event);
50+
51+
self::assertEquals(['foo' => 'baz'], $event->data);
52+
}
53+
54+
public function testPostExtract(): void
55+
{
56+
$metadata = new ClassMetadata(
57+
new ReflectionClass(stdClass::class),
58+
);
59+
60+
$event = new PostExtract(
61+
['foo' => 'bar'],
62+
$metadata,
63+
);
64+
65+
$cryptographer = $this->prophesize(PayloadCryptographer::class);
66+
$cryptographer->encrypt(
67+
$metadata,
68+
['foo' => 'bar'],
69+
)->willReturn(['foo' => 'baz'])->shouldBeCalledOnce();
70+
71+
$subscriber = new CryptographySubscriber($cryptographer->reveal());
72+
$subscriber->postExtract($event);
73+
74+
self::assertEquals(['foo' => 'baz'], $event->data);
75+
}
76+
}

tests/Unit/MetadataHydratorTest.php

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
use Patchlevel\Hydrator\ClassNotSupported;
1212
use Patchlevel\Hydrator\Cryptography\PayloadCryptographer;
1313
use Patchlevel\Hydrator\DenormalizationFailure;
14+
use Patchlevel\Hydrator\Event\PostExtract;
15+
use Patchlevel\Hydrator\Event\PreHydrate;
1416
use Patchlevel\Hydrator\Metadata\AttributeMetadataFactory;
1517
use Patchlevel\Hydrator\MetadataHydrator;
1618
use Patchlevel\Hydrator\NormalizationFailure;
@@ -37,6 +39,7 @@
3739
use Patchlevel\Hydrator\TypeMismatch;
3840
use PHPUnit\Framework\TestCase;
3941
use Prophecy\PhpUnit\ProphecyTrait;
42+
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
4043

4144
final class MetadataHydratorTest extends TestCase
4245
{
@@ -298,6 +301,76 @@ public function testEncrypt(): void
298301
self::assertSame($encryptedPayload, $return);
299302
}
300303

304+
public function testPreHydrate(): void
305+
{
306+
$object = new ProfileCreated(
307+
ProfileId::fromString('1'),
308+
Email::fromString('info@patchlevel.de'),
309+
);
310+
311+
$payload = ['profileId' => '1', 'email' => 'info@patchlevel.de'];
312+
$encryptedPayload = ['profileId' => '1', 'email' => 'encrypted'];
313+
314+
$metadataFactory = new AttributeMetadataFactory();
315+
316+
$event = new PreHydrate(
317+
$encryptedPayload,
318+
$metadataFactory->metadata(ProfileCreated::class),
319+
);
320+
321+
$eventReturn = new PreHydrate(
322+
$payload,
323+
$metadataFactory->metadata(ProfileCreated::class),
324+
);
325+
326+
$eventDispatcher = $this->prophesize(EventDispatcherInterface::class);
327+
$eventDispatcher
328+
->dispatch($event)
329+
->willReturn($eventReturn)
330+
->shouldBeCalledOnce();
331+
332+
$hydrator = new MetadataHydrator($metadataFactory, eventDispatcher: $eventDispatcher->reveal());
333+
334+
$return = $hydrator->hydrate(ProfileCreated::class, $encryptedPayload);
335+
336+
self::assertEquals($object, $return);
337+
}
338+
339+
public function testPostExtract(): void
340+
{
341+
$object = new ProfileCreated(
342+
ProfileId::fromString('1'),
343+
Email::fromString('info@patchlevel.de'),
344+
);
345+
346+
$payload = ['profileId' => '1', 'email' => 'info@patchlevel.de'];
347+
$encryptedPayload = ['profileId' => '1', 'email' => 'encrypted'];
348+
349+
$metadataFactory = new AttributeMetadataFactory();
350+
351+
$event = new PostExtract(
352+
$payload,
353+
$metadataFactory->metadata(ProfileCreated::class),
354+
);
355+
356+
$eventReturn = new PostExtract(
357+
$encryptedPayload,
358+
$metadataFactory->metadata(ProfileCreated::class),
359+
);
360+
361+
$eventDispatcher = $this->prophesize(EventDispatcherInterface::class);
362+
$eventDispatcher
363+
->dispatch($event)
364+
->willReturn($eventReturn)
365+
->shouldBeCalledOnce();
366+
367+
$hydrator = new MetadataHydrator($metadataFactory, eventDispatcher: $eventDispatcher->reveal());
368+
369+
$return = $hydrator->extract($object);
370+
371+
self::assertSame($encryptedPayload, $return);
372+
}
373+
301374
public function testHydrateWithNormalizerInBaseClass(): void
302375
{
303376
$expected = new NormalizerInBaseClassDefinedDto(

0 commit comments

Comments
 (0)