diff --git a/lib/Statistics/StatisticsUnsubscribesRepository.php b/lib/Statistics/StatisticsUnsubscribesRepository.php index 3b47f635cc..063e0df285 100644 --- a/lib/Statistics/StatisticsUnsubscribesRepository.php +++ b/lib/Statistics/StatisticsUnsubscribesRepository.php @@ -3,7 +3,11 @@ namespace MailPoet\Statistics; use MailPoet\Doctrine\Repository; +use MailPoet\Entities\NewsletterEntity; +use MailPoet\Entities\SendingQueueEntity; use MailPoet\Entities\StatisticsUnsubscribeEntity; +use MailPoet\Entities\SubscriberEntity; +use MailPoetVendor\Carbon\Carbon; /** * @extends Repository @@ -12,4 +16,27 @@ class StatisticsUnsubscribesRepository extends Repository { protected function getEntityClassName() { return StatisticsUnsubscribeEntity::class; } + + /** + * @param array $data + * @return StatisticsUnsubscribeEntity + */ + public function createOrUpdate($data) { + if (isset($data['id'])) { + $entity = $this->findOneById((int)$data['id']); + } + if (!isset($entity)) { + if (!isset($data['newsletter'], $data['queue'], $data['subscriber'])) { + throw new \Exception('Newsletter, SendingQueue and Subscriber entities are required for creation'); + } + assert($data['newsletter'] instanceof NewsletterEntity); + assert($data['queue'] instanceof SendingQueueEntity); + assert($data['subscriber'] instanceof SubscriberEntity); + $entity = new StatisticsUnsubscribeEntity($data['newsletter'], $data['queue'], $data['subscriber']); + $this->entityManager->persist($entity); + } + if (isset($data['created_at'])) $entity->setCreatedAt(new Carbon($data['created_at'])); + $this->entityManager->flush(); + return $entity; + } } diff --git a/tests/integration/Cron/Workers/StatsNotifications/WorkerTest.php b/tests/integration/Cron/Workers/StatsNotifications/WorkerTest.php index 1aa49f049e..63d9103c13 100644 --- a/tests/integration/Cron/Workers/StatsNotifications/WorkerTest.php +++ b/tests/integration/Cron/Workers/StatsNotifications/WorkerTest.php @@ -4,8 +4,9 @@ namespace MailPoet\Cron\Workers\StatsNotifications; use MailPoet\Config\Renderer; use MailPoet\Cron\CronHelper; -use MailPoet\DI\ContainerWrapper; +use MailPoet\Entities\StatisticsUnsubscribeEntity; use MailPoet\Entities\StatsNotificationEntity; +use MailPoet\Entities\SubscriberEntity; use MailPoet\Mailer\Mailer; use MailPoet\Mailer\MetaInfo; use MailPoet\Models\Newsletter; @@ -14,9 +15,11 @@ use MailPoet\Models\ScheduledTask; use MailPoet\Models\SendingQueue; use MailPoet\Models\StatisticsClicks; use MailPoet\Models\StatisticsOpens; -use MailPoet\Models\StatisticsUnsubscribes; +use MailPoet\Newsletter\NewslettersRepository; +use MailPoet\Newsletter\Sending\SendingQueuesRepository; use MailPoet\Newsletter\Statistics\NewsletterStatisticsRepository; use MailPoet\Settings\SettingsController; +use MailPoet\Statistics\StatisticsUnsubscribesRepository; use MailPoet\Subscribers\SubscribersRepository; use MailPoet\Util\License\Features\Subscribers as SubscribersFeature; use MailPoetVendor\Idiorm\ORM; @@ -51,19 +54,28 @@ class WorkerTest extends \MailPoetTest { /** @var NewsletterLinkRepository */ private $newsletterLinkRepository; + /** @var NewslettersRepository */ + private $newslettersRepository; + + /** @var SendingQueuesRepository */ + private $sendingQueuesRepository; + + /** @var StatisticsUnsubscribesRepository */ + private $statisticsUnsubscribesRepository; + public function _before() { parent::_before(); - ORM::raw_execute('TRUNCATE ' . Newsletter::$_table); - ORM::raw_execute('TRUNCATE ' . StatisticsClicks::$_table); - ORM::raw_execute('TRUNCATE ' . ScheduledTask::$_table); - ORM::raw_execute('TRUNCATE ' . SendingQueue::$_table); - $this->repository = ContainerWrapper::getInstance()->get(StatsNotificationsRepository::class); - $this->newsletterLinkRepository = ContainerWrapper::getInstance()->get(NewsletterLinkRepository::class); + $this->cleanup(); + $this->repository = $this->diContainer->get(StatsNotificationsRepository::class); + $this->newsletterLinkRepository = $this->diContainer->get(NewsletterLinkRepository::class); + $this->newslettersRepository = $this->diContainer->get(NewslettersRepository::class); + $this->sendingQueuesRepository = $this->diContainer->get(SendingQueuesRepository::class); + $this->statisticsUnsubscribesRepository = $this->diContainer->get(StatisticsUnsubscribesRepository::class); $this->repository->truncate(); $this->mailer = $this->createMock(Mailer::class); $this->renderer = $this->createMock(Renderer::class); $this->settings = SettingsController::getInstance(); - $this->cronHelper = ContainerWrapper::getInstance()->get(CronHelper::class); + $this->cronHelper = $this->diContainer->get(CronHelper::class); $this->statsNotifications = new Worker( $this->mailer, $this->renderer, @@ -72,10 +84,10 @@ class WorkerTest extends \MailPoetTest { new MetaInfo, $this->repository, $this->newsletterLinkRepository, - ContainerWrapper::getInstance()->get(NewsletterStatisticsRepository::class), + $this->diContainer->get(NewsletterStatisticsRepository::class), $this->entityManager, - ContainerWrapper::getInstance()->get(SubscribersFeature::class), - ContainerWrapper::getInstance()->get(SubscribersRepository::class) + $this->diContainer->get(SubscribersFeature::class), + $this->diContainer->get(SubscribersRepository::class) ); $this->settings->set(Worker::SETTINGS_KEY, [ 'enabled' => true, @@ -156,10 +168,10 @@ class WorkerTest extends \MailPoetTest { 'queue_id' => $this->queue->id(), 'created_at' => '2017-01-02 21:23:45', ]); - StatisticsUnsubscribes::createOrUpdate([ - 'subscriber_id' => '12', - 'newsletter_id' => $this->newsletter->id(), - 'queue_id' => $this->queue->id(), + $this->statisticsUnsubscribesRepository->createOrUpdate([ + 'subscriber' => $this->createSubscriber(), + 'newsletter' => $this->newslettersRepository->findOneById($this->newsletter->id()), + 'queue' => $this->sendingQueuesRepository->findOneById($this->queue->id()), 'created_at' => '2017-01-02 21:23:45', ]); } @@ -311,4 +323,25 @@ class WorkerTest extends \MailPoetTest { $this->statsNotifications->process(); } + + private function createSubscriber(): SubscriberEntity { + $subscriber = new SubscriberEntity(); + $subscriber->setStatus(SubscriberEntity::STATUS_SUBSCRIBED); + $subscriber->setEmail('subscriber' . rand(0, 10000) . '@example.com'); + $this->entityManager->persist($subscriber); + return $subscriber; + } + + private function cleanup() { + ORM::raw_execute('TRUNCATE ' . Newsletter::$_table); + ORM::raw_execute('TRUNCATE ' . StatisticsClicks::$_table); + ORM::raw_execute('TRUNCATE ' . ScheduledTask::$_table); + ORM::raw_execute('TRUNCATE ' . SendingQueue::$_table); + $this->truncateEntity(StatisticsUnsubscribeEntity::class); + } + + public function _after() { + parent::_after(); + $this->cleanup(); + } } diff --git a/tests/integration/Models/NewsletterTest.php b/tests/integration/Models/NewsletterTest.php index df7f6fbd37..c02fcd46ed 100644 --- a/tests/integration/Models/NewsletterTest.php +++ b/tests/integration/Models/NewsletterTest.php @@ -2,6 +2,9 @@ namespace MailPoet\Test\Models; +use MailPoet\Entities\StatisticsClickEntity; +use MailPoet\Entities\StatisticsOpenEntity; +use MailPoet\Entities\StatisticsUnsubscribeEntity; use MailPoet\Models\Newsletter; use MailPoet\Models\NewsletterOption; use MailPoet\Models\NewsletterOptionField; @@ -9,9 +12,6 @@ use MailPoet\Models\NewsletterSegment; use MailPoet\Models\ScheduledTask; use MailPoet\Models\Segment; use MailPoet\Models\SendingQueue; -use MailPoet\Models\StatisticsClicks; -use MailPoet\Models\StatisticsOpens; -use MailPoet\Models\StatisticsUnsubscribes; use MailPoet\Tasks\Sending as SendingTask; use MailPoet\Util\Security; use MailPoet\WP\Functions as WPFunctions; @@ -539,8 +539,8 @@ class NewsletterTest extends \MailPoetTest { ORM::raw_execute('TRUNCATE ' . NewsletterSegment::$_table); ORM::raw_execute('TRUNCATE ' . ScheduledTask::$_table); ORM::raw_execute('TRUNCATE ' . SendingQueue::$_table); - ORM::raw_execute('TRUNCATE ' . StatisticsOpens::$_table); - ORM::raw_execute('TRUNCATE ' . StatisticsClicks::$_table); - ORM::raw_execute('TRUNCATE ' . StatisticsUnsubscribes::$_table); + $this->truncateEntity(StatisticsClickEntity::class); + $this->truncateEntity(StatisticsOpenEntity::class); + $this->truncateEntity(StatisticsUnsubscribeEntity::class); } } diff --git a/tests/integration/Models/StatisticsUnsubscribesTest.php b/tests/integration/Models/StatisticsUnsubscribesTest.php deleted file mode 100644 index 5966a82f60..0000000000 --- a/tests/integration/Models/StatisticsUnsubscribesTest.php +++ /dev/null @@ -1,31 +0,0 @@ -newsletterId = 123; - $unsubscribeStatistics->subscriberId = 456; - $unsubscribeStatistics->queueId = 789; - $unsubscribeStatistics->save(); - $unsubscribeStatistics = StatisticsUnsubscribes::getOrCreate(456, 123, 789); - expect($unsubscribeStatistics->newsletterId)->equals(123); - expect($unsubscribeStatistics->subscriberId)->equals(456); - expect($unsubscribeStatistics->queueId)->equals(789); - } - - public function testItCanCreateNewStatisticsRecord() { - expect(count(StatisticsUnsubscribes::findMany()))->equals(0); - $unsubscribeStatistics = StatisticsUnsubscribes::getOrCreate(456, 123, 789); - expect($unsubscribeStatistics->newsletterId)->equals(123); - expect($unsubscribeStatistics->subscriberId)->equals(456); - expect($unsubscribeStatistics->queueId)->equals(789); - } - - public function _after() { - StatisticsUnsubscribes::deleteMany(); - } -} diff --git a/tests/integration/Statistics/Track/UnsubscribesTest.php b/tests/integration/Statistics/Track/UnsubscribesTest.php index e7871b2682..6b604945f4 100644 --- a/tests/integration/Statistics/Track/UnsubscribesTest.php +++ b/tests/integration/Statistics/Track/UnsubscribesTest.php @@ -2,11 +2,11 @@ namespace MailPoet\Test\Statistics\Track; -use MailPoet\DI\ContainerWrapper; +use MailPoet\Entities\StatisticsUnsubscribeEntity; use MailPoet\Models\Newsletter; use MailPoet\Models\SendingQueue; -use MailPoet\Models\StatisticsUnsubscribes; use MailPoet\Models\Subscriber; +use MailPoet\Statistics\StatisticsUnsubscribesRepository; use MailPoet\Statistics\Track\Unsubscribes; use MailPoet\Tasks\Sending as SendingTask; use MailPoetVendor\Idiorm\ORM; @@ -15,6 +15,9 @@ class UnsubscribesTest extends \MailPoetTest { /** @var Unsubscribes */ private $unsubscribes; + /** @var StatisticsUnsubscribesRepository */ + private $statisticsUnsubscribesRepository; + public $queue; public $subscriber; public $newsletter; @@ -38,7 +41,8 @@ class UnsubscribesTest extends \MailPoetTest { $queue->updateProcessedSubscribers([$subscriber->id]); $this->queue = $queue->save(); // instantiate class - $this->unsubscribes = ContainerWrapper::getInstance()->get(Unsubscribes::class); + $this->unsubscribes = $this->diContainer->get(Unsubscribes::class); + $this->statisticsUnsubscribesRepository = $this->diContainer->get(StatisticsUnsubscribesRepository::class); } public function testItTracksUnsubscribeEvent() { @@ -47,7 +51,7 @@ class UnsubscribesTest extends \MailPoetTest { 'source', $this->queue->id ); - expect(count(StatisticsUnsubscribes::findMany()))->equals(1); + expect(count($this->statisticsUnsubscribesRepository->findAll()))->equals(1); } public function testItDoesNotTrackRepeatedUnsubscribeEvents() { @@ -58,13 +62,13 @@ class UnsubscribesTest extends \MailPoetTest { $this->queue->id ); } - expect(count(StatisticsUnsubscribes::findMany()))->equals(1); + expect(count($this->statisticsUnsubscribesRepository->findAll()))->equals(1); } public function _after() { ORM::raw_execute('TRUNCATE ' . Newsletter::$_table); ORM::raw_execute('TRUNCATE ' . Subscriber::$_table); ORM::raw_execute('TRUNCATE ' . SendingQueue::$_table); - ORM::raw_execute('TRUNCATE ' . StatisticsUnsubscribes::$_table); + $this->truncateEntity(StatisticsUnsubscribeEntity::class); } } diff --git a/tests/integration/Subscription/PagesTest.php b/tests/integration/Subscription/PagesTest.php index c181d53d92..155f5a8c0e 100644 --- a/tests/integration/Subscription/PagesTest.php +++ b/tests/integration/Subscription/PagesTest.php @@ -5,6 +5,7 @@ namespace MailPoet\Test\Subscription; use Codeception\Stub; use MailPoet\Config\Renderer; use MailPoet\DI\ContainerWrapper; +use MailPoet\Entities\StatisticsUnsubscribeEntity; use MailPoet\Entities\SubscriberEntity; use MailPoet\Form\AssetsController; use MailPoet\Models\Newsletter; @@ -13,7 +14,6 @@ use MailPoet\Models\NewsletterOptionField; use MailPoet\Models\ScheduledTask; use MailPoet\Models\Segment; use MailPoet\Models\SendingQueue; -use MailPoet\Models\StatisticsUnsubscribes; use MailPoet\Models\Subscriber; use MailPoet\Models\SubscriberSegment; use MailPoet\Newsletter\Scheduler\WelcomeScheduler; @@ -193,7 +193,7 @@ class PagesTest extends \MailPoetTest { ORM::raw_execute('TRUNCATE ' . SubscriberSegment::$_table); ORM::raw_execute('TRUNCATE ' . NewsletterOption::$_table); ORM::raw_execute('TRUNCATE ' . NewsletterOptionField::$_table); - ORM::raw_execute('TRUNCATE ' . StatisticsUnsubscribes::$_table); + $this->truncateEntity(StatisticsUnsubscribeEntity::class); } private function getPages(