diff --git a/lib/Entities/NewsletterEntity.php b/lib/Entities/NewsletterEntity.php index abefcf5069..9ead7b30ce 100644 --- a/lib/Entities/NewsletterEntity.php +++ b/lib/Entities/NewsletterEntity.php @@ -505,4 +505,11 @@ class NewsletterEntity { $content = $this->getBody()['content'] ?? ''; return json_encode($content) ?: ''; } + + /** + * Only some types of newsletters can be set as sent. Some others are just active or draft. + */ + public function canBeSetSent(): bool { + return in_array($this->getType(), [self::TYPE_NOTIFICATION_HISTORY, self::TYPE_STANDARD], true); + } } diff --git a/lib/Newsletter/Sending/SendingQueuesRepository.php b/lib/Newsletter/Sending/SendingQueuesRepository.php index ef0467657e..127618b4bd 100644 --- a/lib/Newsletter/Sending/SendingQueuesRepository.php +++ b/lib/Newsletter/Sending/SendingQueuesRepository.php @@ -103,6 +103,11 @@ class SendingQueuesRepository extends Repository { $processedAt = Carbon::createFromTimestamp($this->wp->currentTime('mysql')); $task->setProcessedAt($processedAt); $task->setStatus(ScheduledTaskEntity::STATUS_COMPLETED); + // Update also status of newsletter if necessary + $newsletter = $queue->getNewsletter(); + if ($newsletter instanceof NewsletterEntity && $newsletter->canBeSetSent()) { + $newsletter->setStatus(NewsletterEntity::STATUS_SENT); + } $this->flush(); } else { $newsletter = $queue->getNewsletter(); diff --git a/tests/integration/Newsletter/Sending/SendingQueuesRepositoryTest.php b/tests/integration/Newsletter/Sending/SendingQueuesRepositoryTest.php index be92c76b55..95eebaa153 100644 --- a/tests/integration/Newsletter/Sending/SendingQueuesRepositoryTest.php +++ b/tests/integration/Newsletter/Sending/SendingQueuesRepositoryTest.php @@ -54,6 +54,44 @@ class SendingQueuesRepositoryTest extends \MailPoetTest { expect($result)->true(); } + public function testItFinishesSendingWhenResumingQueueWithEverythingSent() { + $task = $this->createTask(); + $task->setStatus(ScheduledTaskEntity::STATUS_PAUSED); + $queue = $this->createQueue($task); + $newsletter = $queue->getNewsletter(); + $this->assertInstanceOf(NewsletterEntity::class, $newsletter); + $newsletter->setType(NewsletterEntity::TYPE_STANDARD); + $newsletter->setStatus(NewsletterEntity::STATUS_SENDING); + $queue->setCountTotal(1); + $queue->setCountProcessed(1); + $this->entityManager->flush(); + + $this->repository->resume($queue); + $this->entityManager->refresh($task); + + expect($task->getStatus())->equals(ScheduledTaskEntity::STATUS_COMPLETED); + expect($newsletter->getStatus())->equals(NewsletterEntity::STATUS_SENT); + } + + public function testItResumesSending() { + $task = $this->createTask(); + $task->setStatus(ScheduledTaskEntity::STATUS_PAUSED); + $queue = $this->createQueue($task); + $newsletter = $queue->getNewsletter(); + $this->assertInstanceOf(NewsletterEntity::class, $newsletter); + $newsletter->setType(NewsletterEntity::TYPE_STANDARD); + $newsletter->setStatus(NewsletterEntity::STATUS_SENDING); + $queue->setCountTotal(1); + $queue->setCountProcessed(2); + $this->entityManager->flush(); + + $this->repository->resume($queue); + $this->entityManager->refresh($task); + + expect($task->getStatus())->null(); + expect($newsletter->getStatus())->equals(NewsletterEntity::STATUS_SENDING); + } + private function createTaskSubscriber(ScheduledTaskEntity $task, SubscriberEntity $subscriber, int $processed) { $taskSubscriber = new ScheduledTaskSubscriberEntity( $task,