-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge branch 'cache_for_private_properties'
- Loading branch information
Showing
6 changed files
with
104 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -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); | ||
|
@@ -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); | ||
} | ||
|
||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -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 | ||
{ | ||
|
Binary file not shown.