From fbc85086fd1785849be224fe1693902906dc4185 Mon Sep 17 00:00:00 2001 From: Diogo Machado Date: Tue, 13 Oct 2020 23:45:48 +0100 Subject: [PATCH] [DB][TESTS] Implement Doctrine event listener to update timestamps on modification, and related tests --- config/services.yaml | 4 ++ src/EventListener/UpdateListener.php | 44 +++++++++++++++++ templates/doc/source.html.twig | 2 +- tests/EventListener/UpdateListenerTest.php | 57 ++++++++++++++++++++++ 4 files changed, 106 insertions(+), 1 deletion(-) create mode 100644 src/EventListener/UpdateListener.php create mode 100644 tests/EventListener/UpdateListenerTest.php diff --git a/config/services.yaml b/config/services.yaml index 4de258f1f4..b1ac9a1f96 100644 --- a/config/services.yaml +++ b/config/services.yaml @@ -37,6 +37,10 @@ services: App\Core\Queue\MessageHandler: tags: ['messenger.message_handler'] + App\EventListener\UpdateListener: + tags: + - { name: doctrine.event_listener , event: preUpdate } + Symfony\Bridge\Doctrine\Security\RememberMe\DoctrineTokenProvider: ~ Plugin\: diff --git a/src/EventListener/UpdateListener.php b/src/EventListener/UpdateListener.php new file mode 100644 index 0000000000..4a1c7786f2 --- /dev/null +++ b/src/EventListener/UpdateListener.php @@ -0,0 +1,44 @@ +. +// }}} + +namespace App\EventListener; + +use DateTime; +use Doctrine\ORM\Event\PreUpdateEventArgs; + +class UpdateListener +{ + public function preUpdate(PreUpdateEventArgs $args) + { + $entity = $args->getEntity(); + + if (!method_exists($entity, 'setModified')) { + return false; + } + + $em = $args->getEntityManager(); + $uow = $em->getUnitOfWork(); + $md = $em->getClassMetadata(get_class($entity)); + + $entity->setModified(new DateTime()); + $uow->recomputeSingleEntityChangeSet($md, $entity); + + return true; + } +} diff --git a/templates/doc/source.html.twig b/templates/doc/source.html.twig index 001d09dd19..2657bcecb6 100644 --- a/templates/doc/source.html.twig +++ b/templates/doc/source.html.twig @@ -16,7 +16,7 @@ ## References - GNU social main site, https://gnu.io - - GNU social repository, https://git.gnu.io/gnu/gnu-social + - GNU social repository, https://notabug.org/gnu/gnu-social {% endapply %} {% endblock %} diff --git a/tests/EventListener/UpdateListenerTest.php b/tests/EventListener/UpdateListenerTest.php new file mode 100644 index 0000000000..b13ade2503 --- /dev/null +++ b/tests/EventListener/UpdateListenerTest.php @@ -0,0 +1,57 @@ +. +// }}} + +namespace App\Tests\EventListener; + +use App\Entity\GSActor; +use App\EventListener\UpdateListener; +use DateTime; +use Doctrine\ORM\EntityManager; +use Doctrine\ORM\Event\PreUpdateEventArgs; +use Doctrine\ORM\Mapping\ClassMetadata; +use Doctrine\ORM\UnitOfWork; +use Symfony\Bundle\FrameworkBundle\Test\WebTestCase; + +class UpdateListenerTest extends WebTestCase +{ + public function testPreUpdate() + { + $actor = new GSActor(); + $actor->setModified(new DateTime('1999-09-23')); + static::assertSame($actor->getModified(), new DateTime('1999-09-23')); + + $em = $this->createMock(EntityManager::class); + $uow = $this->createMock(UnitOfWork::class); + $em->expects(static::once()) + ->method('getUnitOfWork') + ->willReturn($uow); + + $md = $this->createMock(ClassMetadata::class); + $em->expects(static::once()) + ->method('getClassMetadata') + ->willReturn($md); + + $change_set = []; + $args = new PreUpdateEventArgs($actor, $em, $change_set); + $ul = new UpdateListener(); + $ul->preUpdate($args); + + static::assertNotSame($actor->getModified(), new DateTime('1999-09-23')); + } +}