From 86c5aabcaef2ec6ccfc8aac2597164a0d3f76fa5 Mon Sep 17 00:00:00 2001 From: Nicolas PHILIPPE Date: Mon, 27 Jan 2025 16:30:20 +0100 Subject: [PATCH] test: assert updates are implicitly persisted (#781) --- src/ORM/AbstractORMPersistenceStrategy.php | 7 +++++-- src/Persistence/PersistenceManager.php | 6 ++---- src/Persistence/PersistentObjectFactory.php | 2 +- .../EntityFactoryRelationshipTestCase.php | 17 +++++++++++++++++ 4 files changed, 25 insertions(+), 7 deletions(-) diff --git a/src/ORM/AbstractORMPersistenceStrategy.php b/src/ORM/AbstractORMPersistenceStrategy.php index fbbb6c2f5..879902257 100644 --- a/src/ORM/AbstractORMPersistenceStrategy.php +++ b/src/ORM/AbstractORMPersistenceStrategy.php @@ -41,10 +41,13 @@ final public function hasChanges(object $object): bool return false; } + // we're cloning the UOW because computing change set has side effect + $unitOfWork = clone $em->getUnitOfWork(); + // cannot use UOW::recomputeSingleEntityChangeSet() here as it wrongly computes embedded objects as changed - $em->getUnitOfWork()->computeChangeSet($em->getClassMetadata($object::class), $object); + $unitOfWork->computeChangeSet($em->getClassMetadata($object::class), $object); - return (bool) $em->getUnitOfWork()->getEntityChangeSet($object); + return (bool) $unitOfWork->getEntityChangeSet($object); } final public function truncate(string $class): void diff --git a/src/Persistence/PersistenceManager.php b/src/Persistence/PersistenceManager.php index 79730a6e5..aaf4d621f 100644 --- a/src/Persistence/PersistenceManager.php +++ b/src/Persistence/PersistenceManager.php @@ -155,10 +155,8 @@ public function refresh(object &$object, bool $force = false): object $strategy = $this->strategyFor($object::class); - if (!$force) { - if ($strategy->hasChanges($object)) { - throw RefreshObjectFailed::objectHasUnsavedChanges($object::class); - } + if ($strategy->hasChanges($object)) { + throw RefreshObjectFailed::objectHasUnsavedChanges($object::class); } $om = $strategy->objectManagerFor($object::class); diff --git a/src/Persistence/PersistentObjectFactory.php b/src/Persistence/PersistentObjectFactory.php index 383e8f28b..7267096c9 100644 --- a/src/Persistence/PersistentObjectFactory.php +++ b/src/Persistence/PersistentObjectFactory.php @@ -389,7 +389,7 @@ protected function normalizeObject(object $object): object } try { - return $persistenceManager->refresh($object, force: true); + return $configuration->persistence()->refresh($object); } catch (RefreshObjectFailed|VarExportLogicException) { return $object; } diff --git a/tests/Integration/ORM/EntityRelationship/EntityFactoryRelationshipTestCase.php b/tests/Integration/ORM/EntityRelationship/EntityFactoryRelationshipTestCase.php index c949adc74..8ec50a06c 100644 --- a/tests/Integration/ORM/EntityRelationship/EntityFactoryRelationshipTestCase.php +++ b/tests/Integration/ORM/EntityRelationship/EntityFactoryRelationshipTestCase.php @@ -31,6 +31,7 @@ use Zenstruck\Foundry\Tests\Fixture\Entity\Contact; use Zenstruck\Foundry\Tests\Fixture\Entity\Tag; +use function Zenstruck\Foundry\Persistence\refresh; use function Zenstruck\Foundry\Persistence\unproxy; /** @@ -361,6 +362,22 @@ public function ensure_one_to_many_relations_are_not_pre_persisted(): void } } + /** + * @test + */ + public function assert_updates_are_implicitly_persisted(): void + { + $category = static::categoryFactory()->create(); + $address = static::addressFactory()->create(); + + $category->setName('new name'); + + static::contactFactory()->create(['category' => $category, 'address' => $address]); + + refresh($category); + self::assertSame('new name', $category->getName()); + } + /** @test */ #[Test] #[DataProvider('provideCascadeRelationshipsCombinations')]