Skip to content

Commit 2d344a4

Browse files
committed
Merge branch 'cache_for_private_properties'
2 parents 1e85d46 + 8f15e9c commit 2d344a4

File tree

6 files changed

+104
-2
lines changed

6 files changed

+104
-2
lines changed

src/FieldMapping.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,9 +47,11 @@ public function __unserialize(array $data): void
4747
{
4848
[$class, $property] = $data['domainProperty'];
4949
$this->domainProperty = (new ReflectionClass($class))->getProperty($property);
50+
$this->domainProperty->setAccessible(true);
5051

5152
[$class, $property] = $data['backingProperty'];
5253
$this->backingProperty = (new ReflectionClass($class))->getProperty($property);
54+
$this->backingProperty->setAccessible(true);
5355

5456
$this->serializable = $data['serializable'];
5557
}

tests/Entities/EntityFour.php

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Edudobay\DoctrineSerializable\Tests\Entities;
6+
7+
use DateTimeImmutable;
8+
use Edudobay\DoctrineSerializable\Attributes\Serializable;
9+
10+
class EntityFour
11+
{
12+
public function __construct(
13+
#[Serializable]
14+
public User $user
15+
) {
16+
}
17+
18+
private array $_user;
19+
}

tests/Entities/EntityThree.php

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Edudobay\DoctrineSerializable\Tests\Entities;
6+
7+
use DateTimeImmutable;
8+
use Edudobay\DoctrineSerializable\Attributes\Serializable;
9+
use Edudobay\DoctrineSerializable\ReflectionClassMetadataFactory;
10+
use Edudobay\DoctrineSerializable\Tests\Psr6CacheClassMetadataFactoryTest;
11+
12+
/**
13+
* This entity should never be loaded directly from the {@link ReflectionClassMetadataFactory}.
14+
*
15+
* @see Psr6CacheClassMetadataFactoryTest::test_get_serialized_metadata()
16+
*/
17+
class EntityThree
18+
{
19+
public function __construct(
20+
#[Serializable]
21+
public User $user
22+
) {
23+
}
24+
25+
private array $_user;
26+
}

tests/Psr6CacheClassMetadataFactoryTest.php

Lines changed: 46 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,18 +4,19 @@
44

55
namespace Edudobay\DoctrineSerializable\Tests;
66

7+
use Edudobay\DoctrineSerializable\Examples\SerializerFactory;
78
use Edudobay\DoctrineSerializable\Psr6CacheClassMetadataFactory;
89
use Edudobay\DoctrineSerializable\ReflectionClassMetadataFactory;
10+
use Edudobay\DoctrineSerializable\SerializationHandler;
911
use PHPUnit\Framework\TestCase;
1012
use Symfony\Component\Cache\Adapter\ArrayAdapter;
13+
use Symfony\Component\Cache\Adapter\FilesystemAdapter;
1114

1215
class Psr6CacheClassMetadataFactoryTest extends TestCase
1316
{
14-
1517
public function test_cache_passes_through()
1618
{
1719
$factorySpy = new ClassMetadataFactorySpy(new ReflectionClassMetadataFactory());
18-
// TODO: Reflection objects cannot be cached. Can we cache anything useful?
1920
$factory = new Psr6CacheClassMetadataFactory(new ArrayAdapter(storeSerialized: false), $factorySpy);
2021

2122
$metadata = $factory->getClassMetadata(Entities\EntityOne::class);
@@ -29,4 +30,47 @@ public function test_cache_passes_through()
2930
$factory->getClassMetadata(Entities\EntityOne::class);
3031
self::assertSame(1, $factorySpy->timesCalled);
3132
}
33+
34+
public function pre_test_store_serialized_metadata()
35+
{
36+
$cache = new FilesystemAdapter(directory: __DIR__ . '/cache');
37+
$factorySpy = new ClassMetadataFactorySpy(new ReflectionClassMetadataFactory());
38+
$factory = new Psr6CacheClassMetadataFactory($cache, $factorySpy);
39+
40+
$metadata = $factory->getClassMetadata(Entities\EntityThree::class);
41+
42+
$this->fail('This is not a test — it just prepares the cache.');
43+
}
44+
45+
public function test_get_serialized_metadata()
46+
{
47+
$cache = new FilesystemAdapter(directory: __DIR__ . '/cache');
48+
$factorySpy = new ClassMetadataFactorySpy(new ReflectionClassMetadataFactory());
49+
$factory = new Psr6CacheClassMetadataFactory($cache, $factorySpy);
50+
51+
$metadata = $factory->getClassMetadata(Entities\EntityThree::class);
52+
53+
self::assertSame(0, $factorySpy->timesCalled);
54+
}
55+
56+
public function test_can_serialize_to_private_backing_property(): void
57+
{
58+
$cache = new FilesystemAdapter(directory: __DIR__ . '/cache');
59+
$factorySpy = new ClassMetadataFactorySpy(new ReflectionClassMetadataFactory());
60+
$factory = new Psr6CacheClassMetadataFactory($cache, $factorySpy);
61+
62+
$handler = new SerializationHandler(SerializerFactory::serializer(), $factory);
63+
64+
$user = new Entities\User('ruth@example.com', 'Ruth Davis');
65+
$e = new Entities\EntityThree(user: $user);
66+
$handler->serialize($e);
67+
68+
$e->user = new Entities\User('dummy@user.com', 'Should Be Overwritten');
69+
$handler->deserialize($e);
70+
71+
self::assertSame('Ruth Davis', $e->user->fullName);
72+
73+
self::assertSame(0, $factorySpy->timesCalled);
74+
}
75+
3276
}

tests/SerializationHandlerTest.php

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,17 @@ public function test_null_property_is_serialized_to_PHP_null(): void
8787
self::assertNull($e->_name);
8888
}
8989

90+
public function test_can_serialize_to_private_backing_property(): void
91+
{
92+
$user = new Entities\User('ruth@example.com', 'Ruth Davis');
93+
$e = new Entities\EntityFour(user: $user);
94+
$this->handler()->serialize($e);
95+
96+
$e->user = new Entities\User('dummy@user.com', 'Should Be Overwritten');
97+
$this->handler()->deserialize($e);
98+
99+
self::assertSame('Ruth Davis', $e->user->fullName);
100+
}
90101

91102
private function handler(): SerializationHandler
92103
{
500 Bytes
Binary file not shown.

0 commit comments

Comments
 (0)