From dd6cbbbbcee02b7f00e7be7a1f30ee52484c029a Mon Sep 17 00:00:00 2001 From: Rodrigo Primo Date: Thu, 28 Apr 2022 14:19:47 -0300 Subject: [PATCH] Create SendingQueuesRepository::countAllByNewsletterAndTaskStatus() This method will be used in a subsequent commit to replace some of the usages of the method SendingQueue::findTaskByNewsletterId() as part of the refactor from Paris to Doctrine. [MAILPOET-4138] --- .../Sending/SendingQueuesRepository.php | 13 +++++++ .../Sending/SendingQueuesRepositoryTest.php | 36 ++++++++++++++++--- 2 files changed, 44 insertions(+), 5 deletions(-) diff --git a/mailpoet/lib/Newsletter/Sending/SendingQueuesRepository.php b/mailpoet/lib/Newsletter/Sending/SendingQueuesRepository.php index 718ac009a5..2acbf749e4 100644 --- a/mailpoet/lib/Newsletter/Sending/SendingQueuesRepository.php +++ b/mailpoet/lib/Newsletter/Sending/SendingQueuesRepository.php @@ -48,6 +48,19 @@ class SendingQueuesRepository extends Repository { ->getOneOrNullResult(); } + public function countAllByNewsletterAndTaskStatus(NewsletterEntity $newsletter, string $status): int { + return intval($this->entityManager->createQueryBuilder() + ->select('count(s.task)') + ->from(SendingQueueEntity::class, 's') + ->join('s.task', 't') + ->where('t.status = :status') + ->andWhere('s.newsletter = :newsletter') + ->setParameter('status', $status) + ->setParameter('newsletter', $newsletter) + ->getQuery() + ->getSingleScalarResult()); + } + public function getTaskIdsByNewsletterId(int $newsletterId): array { $results = $this->entityManager->createQueryBuilder() ->select('IDENTITY(s.task) as task_id') diff --git a/mailpoet/tests/integration/Newsletter/Sending/SendingQueuesRepositoryTest.php b/mailpoet/tests/integration/Newsletter/Sending/SendingQueuesRepositoryTest.php index 95eebaa153..f760dbadf2 100644 --- a/mailpoet/tests/integration/Newsletter/Sending/SendingQueuesRepositoryTest.php +++ b/mailpoet/tests/integration/Newsletter/Sending/SendingQueuesRepositoryTest.php @@ -92,6 +92,29 @@ class SendingQueuesRepositoryTest extends \MailPoetTest { expect($newsletter->getStatus())->equals(NewsletterEntity::STATUS_SENDING); } + public function testItReturnsCountOfQueuesByNewsletterAndTaskStatus() { + $taskStatus = ScheduledTaskEntity::STATUS_PAUSED; + + $task1 = $this->createTask(); + $task1->setStatus($taskStatus); + $queue1 = $this->createQueue($task1); + $newsletter = $queue1->getNewsletter(); + + $task2 = $this->createTask(); + $task2->setStatus($taskStatus); + $this->createQueue($task2, $newsletter); + + $task3 = $this->createTask(); + $task3->setStatus(ScheduledTaskEntity::STATUS_SCHEDULED); + $this->createQueue($task3, $newsletter); + + $this->entityManager->flush(); + + $this->assertInstanceOf(NewsletterEntity::class, $newsletter); + // should return the two queues with tasks of the type STATUS_PAUSED and exclude the queue with task of the type STATUS_SCHEDULED + $this->assertSame(2, $this->repository->countAllByNewsletterAndTaskStatus($newsletter, $taskStatus)); + } + private function createTaskSubscriber(ScheduledTaskEntity $task, SubscriberEntity $subscriber, int $processed) { $taskSubscriber = new ScheduledTaskSubscriberEntity( $task, @@ -107,11 +130,13 @@ class SendingQueuesRepositoryTest extends \MailPoetTest { return $task; } - private function createQueue(ScheduledTaskEntity $task): SendingQueueEntity { - $newsletter = new NewsletterEntity(); - $newsletter->setType('type'); - $newsletter->setSubject('Subject'); - $this->entityManager->persist($newsletter); + private function createQueue(ScheduledTaskEntity $task, NewsletterEntity $newsletter = null): SendingQueueEntity { + if (!$newsletter) { + $newsletter = new NewsletterEntity(); + $newsletter->setType('type'); + $newsletter->setSubject('Subject'); + $this->entityManager->persist($newsletter); + } $queue = new SendingQueueEntity(); $queue->setNewsletter($newsletter); @@ -134,5 +159,6 @@ class SendingQueuesRepositoryTest extends \MailPoetTest { $this->truncateEntity(SubscriberEntity::class); $this->truncateEntity(ScheduledTaskEntity::class); $this->truncateEntity(ScheduledTaskSubscriberEntity::class); + $this->truncateEntity(SendingQueueEntity::class); } }