From 8b259c674421b665d2e26f8b3a19420e6c44ee81 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0t=C4=9Bp=C3=A1n=20Zrn=C3=ADk?= Date: Mon, 15 Nov 2021 09:12:16 +0100 Subject: [PATCH] tests for hooks --- .idea/MkSQL.iml | 1 + src/Repository/Fetch/EntityStorage.php | 6 ++ src/Repository/Fetch/ResultService.php | 5 -- src/Repository/Saver/Saver.php | 2 +- tests/IntegrationTest.php | 69 ++++++++++++++++++- .../AfterRetrieveHookEntity.php | 27 ++++++++ .../EntitiesWithHooks/AfterSaveHookEntity.php | 27 ++++++++ .../BeforeSaveHookEntity.php | 24 +++++++ .../EntityHookExceptionType.php | 13 ++++ .../EntityHookRepository.php | 16 +++++ .../EntityWithHookException.php | 22 ++++++ 11 files changed, 205 insertions(+), 7 deletions(-) create mode 100644 tests/Mock/EntitiesWithHooks/AfterRetrieveHookEntity.php create mode 100644 tests/Mock/EntitiesWithHooks/AfterSaveHookEntity.php create mode 100644 tests/Mock/EntitiesWithHooks/BeforeSaveHookEntity.php create mode 100644 tests/Mock/EntitiesWithHooks/EntityHookExceptionType.php create mode 100644 tests/Mock/EntitiesWithHooks/EntityHookRepository.php create mode 100644 tests/Mock/EntitiesWithHooks/EntityWithHookException.php diff --git a/.idea/MkSQL.iml b/.idea/MkSQL.iml index ecfb1d2..414f14e 100644 --- a/.idea/MkSQL.iml +++ b/.idea/MkSQL.iml @@ -5,6 +5,7 @@ + diff --git a/src/Repository/Fetch/EntityStorage.php b/src/Repository/Fetch/EntityStorage.php index e3e4e2c..015bc4f 100644 --- a/src/Repository/Fetch/EntityStorage.php +++ b/src/Repository/Fetch/EntityStorage.php @@ -143,6 +143,12 @@ public function linkEntities(): void } } } + + // Here, we have all entities linked, we can call afterRetrieve hook + foreach ($this->entities as $entity) { + $entity->afterRetrieve(); + } + } /** diff --git a/src/Repository/Fetch/ResultService.php b/src/Repository/Fetch/ResultService.php index 046d0e4..d859586 100644 --- a/src/Repository/Fetch/ResultService.php +++ b/src/Repository/Fetch/ResultService.php @@ -124,11 +124,6 @@ public function getEntities(string $baseEntityClassString, ?string $propertyName } } - foreach ($result as $entity) { - $entity->afterRetrieve(); - } - - return $result; } diff --git a/src/Repository/Saver/Saver.php b/src/Repository/Saver/Saver.php index a20faff..58ff36d 100644 --- a/src/Repository/Saver/Saver.php +++ b/src/Repository/Saver/Saver.php @@ -277,13 +277,13 @@ function insert(array $entities): void $entity->setPrimaryKeyValue($firstPk); $entity->updateRawData(); $entity->indicateSave(); - $entity->afterSave(); $firstPk++; } //endregion $this->pdo->commit(); + foreach ($entities as $entity) { $entity->afterSave(); } diff --git a/tests/IntegrationTest.php b/tests/IntegrationTest.php index 0fc1dfb..21ebba0 100644 --- a/tests/IntegrationTest.php +++ b/tests/IntegrationTest.php @@ -37,6 +37,12 @@ use Tests\Mock\Bugs\DoubleRetrieve\Reward; use Tests\Mock\Bugs\TreeSave\RepeatingNode; use Tests\Mock\Bugs\TreeSave\TreeSaveRepository; +use Tests\Mock\EntitiesWithHooks\AfterRetrieveHookEntity; +use Tests\Mock\EntitiesWithHooks\AfterSaveHookEntity; +use Tests\Mock\EntitiesWithHooks\BeforeSaveHookEntity; +use Tests\Mock\EntitiesWithHooks\EntityHookExceptionType; +use Tests\Mock\EntitiesWithHooks\EntityHookRepository; +use Tests\Mock\EntitiesWithHooks\EntityWithHookException; use Tracy\Debugger; use Zrnik\MkSQL\Column; use Zrnik\MkSQL\Enum\DriverType; @@ -198,10 +204,10 @@ function () use ($Updater) { $this->subTestAllowPrivatePropertiesInEntities($pdo); + $this->subTestBaseEntityHooks($pdo); echo ']' . PHP_EOL . 'Complete!'; - } @@ -1207,4 +1213,65 @@ private function subTestAllowPrivatePropertiesInEntities(PDO $pdo): void static::assertSame($entities[count($entities) - 1]->id, $entity->id); } + + private function subTestBaseEntityHooks(PDO $pdo): void + { + $entityHookRepository = new EntityHookRepository($pdo); + + ############################################### + ############################################### + ############################################### + + /** @var EntityWithHookException $ex */ + $ex = $this->assertExceptionThrown( + EntityWithHookException::class, + function() use ($entityHookRepository) { + $entityHookRepository->save(BeforeSaveHookEntity::create()); + } + ); + + static::assertSame( + EntityHookExceptionType::BEFORE_SAVE, + $ex->hookExceptionType + ); + + ############################################### + ############################################### + ############################################### + + /** @var EntityWithHookException $ex */ + $ex = $this->assertExceptionThrown( + EntityWithHookException::class, + function() use ($entityHookRepository) { + $entityHookRepository->save(AfterSaveHookEntity::create()); + } + ); + + static::assertSame( + EntityHookExceptionType::AFTER_SAVE, + $ex->hookExceptionType + ); + + ############################################### + ############################################### + ############################################### + + /** @var EntityWithHookException $ex */ + $ex = $this->assertExceptionThrown( + EntityWithHookException::class, + function() use ($entityHookRepository) { + $entityHookRepository->save(AfterRetrieveHookEntity::create()); + $entityHookRepository->getAll( + AfterRetrieveHookEntity::class + ); + } + ); + + static::assertSame( + EntityHookExceptionType::AFTER_RETRIEVE, + $ex->hookExceptionType + ); + + } + } diff --git a/tests/Mock/EntitiesWithHooks/AfterRetrieveHookEntity.php b/tests/Mock/EntitiesWithHooks/AfterRetrieveHookEntity.php new file mode 100644 index 0000000..f25e2db --- /dev/null +++ b/tests/Mock/EntitiesWithHooks/AfterRetrieveHookEntity.php @@ -0,0 +1,27 @@ +use(AfterRetrieveHookEntity::class); + $updater->use(AfterSaveHookEntity::class); + $updater->use(BeforeSaveHookEntity::class); + } +} diff --git a/tests/Mock/EntitiesWithHooks/EntityWithHookException.php b/tests/Mock/EntitiesWithHooks/EntityWithHookException.php new file mode 100644 index 0000000..c225793 --- /dev/null +++ b/tests/Mock/EntitiesWithHooks/EntityWithHookException.php @@ -0,0 +1,22 @@ +hookExceptionType = $hookExceptionType; + + parent::__construct( + sprintf( + 'Hook exception "%s" thrown!', + EntityHookExceptionType::getName($hookExceptionType) + ) + ); + } +}