From 9e334a953af537ba3f30a3bd2b73fb43f95735a7 Mon Sep 17 00:00:00 2001 From: Rodrigo Primo Date: Tue, 16 Nov 2021 14:36:59 -0300 Subject: [PATCH] Add integration tests for LastSubscribedAtListener This commit adds basic integration tests for the class LastSubscribedAtListener since it had none and it will be modified in a subsequent commit. A method from TimestampListenerTest was moved to a base class since it can be reused in LastSubscribedAtTest. [MAILPOET-3946] --- lib/DI/ContainerConfigurator.php | 2 +- .../EventListeners/EventListenersBaseTest.php | 23 +++++ .../EventListeners/LastSubscribedAtTest.php | 93 +++++++++++++++++++ .../EventListeners/TimestampListenerTest.php | 19 +--- 4 files changed, 119 insertions(+), 18 deletions(-) create mode 100644 tests/integration/Doctrine/EventListeners/EventListenersBaseTest.php create mode 100644 tests/integration/Doctrine/EventListeners/LastSubscribedAtTest.php diff --git a/lib/DI/ContainerConfigurator.php b/lib/DI/ContainerConfigurator.php index ea1e3b7967..4e5bc303bc 100644 --- a/lib/DI/ContainerConfigurator.php +++ b/lib/DI/ContainerConfigurator.php @@ -127,7 +127,7 @@ class ContainerConfigurator implements IContainerConfigurator { ->setFactory([new Reference(\MailPoet\Doctrine\EntityManagerFactory::class), 'createEntityManager']) ->setPublic(true); $container->autowire(\MailPoet\Doctrine\EventListeners\EmojiEncodingListener::class)->setPublic(true); - $container->autowire(\MailPoet\Doctrine\EventListeners\LastSubscribedAtListener::class); + $container->autowire(\MailPoet\Doctrine\EventListeners\LastSubscribedAtListener::class)->setPublic(true); $container->autowire(\MailPoet\Doctrine\EventListeners\TimestampListener::class)->setPublic(true); $container->autowire(\MailPoet\Doctrine\EventListeners\ValidationListener::class); $container->autowire(\MailPoet\Doctrine\Validator\ValidatorFactory::class); diff --git a/tests/integration/Doctrine/EventListeners/EventListenersBaseTest.php b/tests/integration/Doctrine/EventListeners/EventListenersBaseTest.php new file mode 100644 index 0000000000..e9faa04a1e --- /dev/null +++ b/tests/integration/Doctrine/EventListeners/EventListenersBaseTest.php @@ -0,0 +1,23 @@ +entityManager->getEventManager()->removeEventListener( + [Events::prePersist, Events::preUpdate], + $original + ); + + $this->entityManager->getEventManager()->addEventListener( + [Events::prePersist, Events::preUpdate], + $replacement + ); + } +} diff --git a/tests/integration/Doctrine/EventListeners/LastSubscribedAtTest.php b/tests/integration/Doctrine/EventListeners/LastSubscribedAtTest.php new file mode 100644 index 0000000000..50c50bfae2 --- /dev/null +++ b/tests/integration/Doctrine/EventListeners/LastSubscribedAtTest.php @@ -0,0 +1,93 @@ +now = Carbon::createFromTimestamp($timestamp); + $this->wp = $this->make(WPFunctions::class, [ + 'currentTime' => $timestamp, + ]); + + $newTimestampListener = new LastSubscribedAtListener($this->wp); + $originalListener = $this->diContainer->get(LastSubscribedAtListener::class); + $this->replaceListeners($originalListener, $newTimestampListener); + } + + public function testItSetsLastSubscribedAtOnCreate() { + $entity = new SubscriberEntity(); + $entity->setEmail('test@test.com'); + $entity->setStatus(SubscriberEntity::STATUS_SUBSCRIBED); + + $this->entityManager->persist($entity); + $this->entityManager->flush(); + + $this->assertEquals($this->now, $entity->getLastSubscribedAt()); + } + + public function testItDoesntSetLastSubscribedAtOnCreateWhenStatusIsNotSubscribed() { + $entity = new SubscriberEntity(); + $entity->setEmail('test@test.com'); + $entity->setStatus(SubscriberEntity::STATUS_INACTIVE); + + $this->entityManager->persist($entity); + $this->entityManager->flush(); + + $this->assertNull($entity->getLastSubscribedAt()); + } + + public function testItSetsLastSubscribedAtOnUpdate() { + $pastDate = new Carbon('2000-01-01 12:00:00'); + $entity = new SubscriberEntity(); + $entity->setEmail('test@test.com'); + $entity->setStatus(SubscriberEntity::STATUS_INACTIVE); + $entity->setLastSubscribedAt($pastDate); + + $this->entityManager->persist($entity); + $this->entityManager->flush(); + + $this->assertEquals($pastDate, $entity->getLastSubscribedAt()); + + $entity->setStatus(SubscriberEntity::STATUS_SUBSCRIBED); + $this->entityManager->flush(); + + $this->assertEquals($this->now, $entity->getLastSubscribedAt()); + } + + public function testItDoesntChangeLastSubscribedAtOnUpdateIfStatusIsNotSubscribed() { + $pastDate = new Carbon('2000-01-01 12:00:00'); + $entity = new SubscriberEntity(); + $entity->setEmail('test@test.com'); + $entity->setStatus(SubscriberEntity::STATUS_INACTIVE); + $entity->setLastSubscribedAt($pastDate); + + $this->entityManager->persist($entity); + $this->entityManager->flush(); + + $this->assertEquals($pastDate, $entity->getLastSubscribedAt()); + + $entity->setEmail('test2@test.com'); + $this->entityManager->flush(); + + $this->assertEquals($pastDate, $entity->getLastSubscribedAt()); + } + + public function _after() { + parent::_after(); + $this->truncateEntity(SubscriberEntity::class); + } +} diff --git a/tests/integration/Doctrine/EventListeners/TimestampListenerTest.php b/tests/integration/Doctrine/EventListeners/TimestampListenerTest.php index 675ff720f4..7b19e5515e 100644 --- a/tests/integration/Doctrine/EventListeners/TimestampListenerTest.php +++ b/tests/integration/Doctrine/EventListeners/TimestampListenerTest.php @@ -7,9 +7,10 @@ use MailPoet\WP\Functions as WPFunctions; use MailPoetVendor\Carbon\Carbon; use MailPoetVendor\Doctrine\ORM\Events; +require_once __DIR__ . '/EventListenersBaseTest.php'; require_once __DIR__ . '/TimestampEntity.php'; -class TimestampListenerTest extends \MailPoetTest { +class TimestampListenerTest extends EventListenersBaseTest { /** @var Carbon */ private $now; @@ -96,20 +97,4 @@ class TimestampListenerTest extends \MailPoetTest { parent::_after(); $this->connection->executeStatement("DROP TABLE IF EXISTS $this->tableName"); } - - /** - * We have to replace event listeners since EventManager - * is shared for all entity managers using same DB connection - */ - private function replaceListeners($original, $replacement) { - $this->entityManager->getEventManager()->removeEventListener( - [Events::prePersist, Events::preUpdate], - $original - ); - - $this->entityManager->getEventManager()->addEventListener( - [Events::prePersist, Events::preUpdate], - $replacement - ); - } }