diff --git a/mailpoet/lib/Cron/Workers/SendingQueue/SendingQueue.php b/mailpoet/lib/Cron/Workers/SendingQueue/SendingQueue.php index 7fd20473f0..907586ffc9 100644 --- a/mailpoet/lib/Cron/Workers/SendingQueue/SendingQueue.php +++ b/mailpoet/lib/Cron/Workers/SendingQueue/SendingQueue.php @@ -427,6 +427,14 @@ class SendingQueue { ); } + /** + * @param NewsletterEntity $newsletter + * @param string $textBody - The pre-processed text body of the newsletter, before any shortcodes have been processed. + * Leaving the shortcodes unprocessed ensures that we get the same campaignId for different subscribers, as well as + * for different sends of the same automatic email when link tracking is enabled. + * + * @return string + */ public function calculateCampaignId(NewsletterEntity $newsletter, string $textBody): string { return substr(md5(implode('|', [$newsletter->getId(), $textBody, $newsletter->getSubject()])), 0, 16); } diff --git a/mailpoet/tests/integration/Cron/Workers/SendingQueue/SendingQueueTest.php b/mailpoet/tests/integration/Cron/Workers/SendingQueue/SendingQueueTest.php index da9ccabf2d..0d054aa7f4 100644 --- a/mailpoet/tests/integration/Cron/Workers/SendingQueue/SendingQueueTest.php +++ b/mailpoet/tests/integration/Cron/Workers/SendingQueue/SendingQueueTest.php @@ -1273,6 +1273,47 @@ class SendingQueueTest extends \MailPoetTest { } } + public function testCampaignIdDoesNotChangeIfContentStaysTheSame() { + $newsletter = (new \MailPoet\Test\DataFactories\Newsletter())->withSubject('Subject')->create(); + $campaignId = $this->sendingQueueWorker->calculateCampaignId($newsletter, 'text body'); + expect($campaignId)->equals($this->sendingQueueWorker->calculateCampaignId($newsletter, 'text body')); + } + + public function testCampaignIdChangesIfSubjectChanges() { + $newsletter = (new \MailPoet\Test\DataFactories\Newsletter())->withSubject('Subject')->create(); + $originalCampaignId = $this->sendingQueueWorker->calculateCampaignId($newsletter, 'text body'); + $newsletter->setSubject('Subject 2'); + $this->entityManager->persist($newsletter); + $this->entityManager->flush(); + expect($originalCampaignId)->notEquals($this->sendingQueueWorker->calculateCampaignId($newsletter, 'text body')); + } + + public function testCampaignIdRevertsIfContentReverts() { + $newsletter = (new \MailPoet\Test\DataFactories\Newsletter())->withSubject('Subject')->create(); + $originalCampaignId = $this->sendingQueueWorker->calculateCampaignId($newsletter, 'text body'); + $newsletter->setSubject('Subject 2'); + $this->entityManager->persist($newsletter); + $this->entityManager->flush(); + expect($originalCampaignId)->notEquals($this->sendingQueueWorker->calculateCampaignId($newsletter, 'text body changed')); + $newsletter->setSubject('Subject'); + $this->entityManager->persist($newsletter); + $this->entityManager->flush(); + expect($originalCampaignId)->equals($this->sendingQueueWorker->calculateCampaignId($newsletter, 'text body')); + } + + public function testCampaignIdDependsOnNewsletterId() { + $newsletter1 = (new \MailPoet\Test\DataFactories\Newsletter())->withSubject('Subject')->create(); + $newsletter2 = (new \MailPoet\Test\DataFactories\Newsletter())->withSubject('Subject')->create(); + $sameContent = 'content'; + expect($this->sendingQueueWorker->calculateCampaignId($newsletter1, $sameContent))->notEquals($this->sendingQueueWorker->calculateCampaignId($newsletter2, $sameContent)); + } + + public function testCampaignIdChangesIfContentChanges() { + $newsletter = (new \MailPoet\Test\DataFactories\Newsletter())->withSubject('Subject')->create(); + $originalCampaignId = $this->sendingQueueWorker->calculateCampaignId($newsletter, 'text body'); + expect($originalCampaignId)->notEquals($this->sendingQueueWorker->calculateCampaignId($newsletter, 'different text body')); + } + public function _after() { $this->truncateEntity(SubscriberEntity::class); $this->truncateEntity(SubscriberSegmentEntity::class);