Skip to content

Commit

Permalink
Merge branch 'cache_for_private_properties'
Browse files Browse the repository at this point in the history
  • Loading branch information
edudobay committed Jan 31, 2022
2 parents 1e85d46 + 8f15e9c commit 2d344a4
Show file tree
Hide file tree
Showing 6 changed files with 104 additions and 2 deletions.
2 changes: 2 additions & 0 deletions src/FieldMapping.php
Original file line number Diff line number Diff line change
Expand Up @@ -47,9 +47,11 @@ public function __unserialize(array $data): void
{
[$class, $property] = $data['domainProperty'];
$this->domainProperty = (new ReflectionClass($class))->getProperty($property);
$this->domainProperty->setAccessible(true);

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

$this->serializable = $data['serializable'];
}
Expand Down
19 changes: 19 additions & 0 deletions tests/Entities/EntityFour.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
<?php

declare(strict_types=1);

namespace Edudobay\DoctrineSerializable\Tests\Entities;

use DateTimeImmutable;
use Edudobay\DoctrineSerializable\Attributes\Serializable;

class EntityFour
{
public function __construct(
#[Serializable]
public User $user
) {
}

private array $_user;
}
26 changes: 26 additions & 0 deletions tests/Entities/EntityThree.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
<?php

declare(strict_types=1);

namespace Edudobay\DoctrineSerializable\Tests\Entities;

use DateTimeImmutable;
use Edudobay\DoctrineSerializable\Attributes\Serializable;
use Edudobay\DoctrineSerializable\ReflectionClassMetadataFactory;
use Edudobay\DoctrineSerializable\Tests\Psr6CacheClassMetadataFactoryTest;

/**
* This entity should never be loaded directly from the {@link ReflectionClassMetadataFactory}.
*
* @see Psr6CacheClassMetadataFactoryTest::test_get_serialized_metadata()
*/
class EntityThree
{
public function __construct(
#[Serializable]
public User $user
) {
}

private array $_user;
}
48 changes: 46 additions & 2 deletions tests/Psr6CacheClassMetadataFactoryTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,18 +4,19 @@

namespace Edudobay\DoctrineSerializable\Tests;

use Edudobay\DoctrineSerializable\Examples\SerializerFactory;
use Edudobay\DoctrineSerializable\Psr6CacheClassMetadataFactory;
use Edudobay\DoctrineSerializable\ReflectionClassMetadataFactory;
use Edudobay\DoctrineSerializable\SerializationHandler;
use PHPUnit\Framework\TestCase;
use Symfony\Component\Cache\Adapter\ArrayAdapter;
use Symfony\Component\Cache\Adapter\FilesystemAdapter;

class Psr6CacheClassMetadataFactoryTest extends TestCase
{

public function test_cache_passes_through()
{
$factorySpy = new ClassMetadataFactorySpy(new ReflectionClassMetadataFactory());
// TODO: Reflection objects cannot be cached. Can we cache anything useful?
$factory = new Psr6CacheClassMetadataFactory(new ArrayAdapter(storeSerialized: false), $factorySpy);

$metadata = $factory->getClassMetadata(Entities\EntityOne::class);
Expand All @@ -29,4 +30,47 @@ public function test_cache_passes_through()
$factory->getClassMetadata(Entities\EntityOne::class);
self::assertSame(1, $factorySpy->timesCalled);
}

public function pre_test_store_serialized_metadata()
{
$cache = new FilesystemAdapter(directory: __DIR__ . '/cache');
$factorySpy = new ClassMetadataFactorySpy(new ReflectionClassMetadataFactory());
$factory = new Psr6CacheClassMetadataFactory($cache, $factorySpy);

$metadata = $factory->getClassMetadata(Entities\EntityThree::class);

$this->fail('This is not a test — it just prepares the cache.');
}

public function test_get_serialized_metadata()
{
$cache = new FilesystemAdapter(directory: __DIR__ . '/cache');
$factorySpy = new ClassMetadataFactorySpy(new ReflectionClassMetadataFactory());
$factory = new Psr6CacheClassMetadataFactory($cache, $factorySpy);

$metadata = $factory->getClassMetadata(Entities\EntityThree::class);

self::assertSame(0, $factorySpy->timesCalled);
}

public function test_can_serialize_to_private_backing_property(): void
{
$cache = new FilesystemAdapter(directory: __DIR__ . '/cache');
$factorySpy = new ClassMetadataFactorySpy(new ReflectionClassMetadataFactory());
$factory = new Psr6CacheClassMetadataFactory($cache, $factorySpy);

$handler = new SerializationHandler(SerializerFactory::serializer(), $factory);

$user = new Entities\User('[email protected]', 'Ruth Davis');
$e = new Entities\EntityThree(user: $user);
$handler->serialize($e);

$e->user = new Entities\User('[email protected]', 'Should Be Overwritten');
$handler->deserialize($e);

self::assertSame('Ruth Davis', $e->user->fullName);

self::assertSame(0, $factorySpy->timesCalled);
}

}
11 changes: 11 additions & 0 deletions tests/SerializationHandlerTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,17 @@ public function test_null_property_is_serialized_to_PHP_null(): void
self::assertNull($e->_name);
}

public function test_can_serialize_to_private_backing_property(): void
{
$user = new Entities\User('[email protected]', 'Ruth Davis');
$e = new Entities\EntityFour(user: $user);
$this->handler()->serialize($e);

$e->user = new Entities\User('[email protected]', 'Should Be Overwritten');
$this->handler()->deserialize($e);

self::assertSame('Ruth Davis', $e->user->fullName);
}

private function handler(): SerializationHandler
{
Expand Down
Binary file added tests/cache/@/B/S/SVYP9XXFOcQEV3o6ntig
Binary file not shown.

0 comments on commit 2d344a4

Please sign in to comment.