diff --git a/mailpoet/tests/integration/API/JSON/v1/SubscribersTest.php b/mailpoet/tests/integration/API/JSON/v1/SubscribersTest.php index d3b76b5feb..462f01c0c1 100644 --- a/mailpoet/tests/integration/API/JSON/v1/SubscribersTest.php +++ b/mailpoet/tests/integration/API/JSON/v1/SubscribersTest.php @@ -24,6 +24,9 @@ use MailPoet\Entities\SubscriberSegmentEntity; use MailPoet\Form\Util\FieldNameObfuscator; use MailPoet\Listing\Handler; use MailPoet\Models\CustomField; +use MailPoet\Models\Newsletter; +use MailPoet\Models\NewsletterOption; +use MailPoet\Models\NewsletterOptionField; use MailPoet\Models\Segment; use MailPoet\Models\SendingQueue; use MailPoet\Models\Subscriber; @@ -40,8 +43,6 @@ use MailPoet\Subscribers\SubscriberSubscribeController; use MailPoet\Subscription\Captcha; use MailPoet\Subscription\CaptchaSession; use MailPoet\Test\DataFactories\DynamicSegment; -use MailPoet\Test\DataFactories\Newsletter as NewsletterFactory; -use MailPoet\Test\DataFactories\NewsletterOption as NewsletterOptionFactory; use MailPoet\UnexpectedValueException; use MailPoet\WP\Functions; use MailPoetVendor\Carbon\Carbon; @@ -987,23 +988,32 @@ class SubscribersTest extends \MailPoetTest { } private function _createWelcomeNewsletter() { - $newsletterFactory = new NewsletterFactory(); - $welcomeNewsletter = $newsletterFactory - ->withActiveStatus() - ->create(); - $welcomeNewsletter->setType(NewsletterEntity::TYPE_WELCOME); - $this->entityManager->persist($welcomeNewsletter); - $this->entityManager->flush(); + $welcomeNewsletter = Newsletter::create(); + $welcomeNewsletter->type = Newsletter::TYPE_WELCOME; + $welcomeNewsletter->status = Newsletter::STATUS_ACTIVE; + $welcomeNewsletter->save(); + expect($welcomeNewsletter->getErrors())->false(); - $newsletterOptionFactory = new NewsletterOptionFactory(); - $newsletterOptionFactory->createMultipleOptions( - $welcomeNewsletter, - [ - 'event' => 'segment', - 'segment' => $this->segment1->getId(), - 'schedule' => '* * * * *', - ] - ); + $welcomeNewsletterOptions = [ + 'event' => 'segment', + 'segment' => $this->segment1->getId(), + 'schedule' => '* * * * *', + ]; + + foreach ($welcomeNewsletterOptions as $option => $value) { + $newsletterOptionField = NewsletterOptionField::create(); + $newsletterOptionField->name = $option; + $newsletterOptionField->newsletterType = Newsletter::TYPE_WELCOME; + $newsletterOptionField->save(); + expect($newsletterOptionField->getErrors())->false(); + + $newsletterOption = NewsletterOption::create(); + $newsletterOption->optionFieldId = (int)$newsletterOptionField->id; + $newsletterOption->newsletterId = $welcomeNewsletter->id; + $newsletterOption->value = (string)$value; + $newsletterOption->save(); + expect($newsletterOption->getErrors())->false(); + } } public function _after() { diff --git a/mailpoet/tests/integration/AutomaticEmails/WooCommerce/Events/AbandonedCartTest.php b/mailpoet/tests/integration/AutomaticEmails/WooCommerce/Events/AbandonedCartTest.php index 3fac0d361d..70b8e7affe 100644 --- a/mailpoet/tests/integration/AutomaticEmails/WooCommerce/Events/AbandonedCartTest.php +++ b/mailpoet/tests/integration/AutomaticEmails/WooCommerce/Events/AbandonedCartTest.php @@ -3,14 +3,10 @@ namespace MailPoet\AutomaticEmails\WooCommerce\Events; use MailPoet\AutomaticEmails\WooCommerce\WooCommerce as WooCommerceEmail; -use MailPoet\Entities\NewsletterEntity; -use MailPoet\Entities\NewsletterOptionEntity; -use MailPoet\Entities\NewsletterOptionFieldEntity; -use MailPoet\Entities\ScheduledTaskEntity; -use MailPoet\Entities\ScheduledTaskSubscriberEntity; -use MailPoet\Entities\SendingQueueEntity; use MailPoet\Entities\SubscriberEntity; use MailPoet\Models\Newsletter; +use MailPoet\Models\NewsletterOption; +use MailPoet\Models\NewsletterOptionField; use MailPoet\Models\ScheduledTask; use MailPoet\Models\ScheduledTaskSubscriber; use MailPoet\Models\SendingQueue; @@ -20,12 +16,12 @@ use MailPoet\Settings\SettingsController; use MailPoet\Settings\TrackingConfig; use MailPoet\Statistics\Track\SubscriberActivityTracker; use MailPoet\Statistics\Track\SubscriberCookie; -use MailPoet\Test\DataFactories\NewsletterOption as NewsletterOptionFactory; use MailPoet\Tasks\Sending as SendingTask; use MailPoet\Util\Cookies; use MailPoet\WooCommerce\Helper as WooCommerceHelper; use MailPoet\WP\Functions as WPFunctions; use MailPoetVendor\Carbon\Carbon; +use MailPoetVendor\Idiorm\ORM; use PHPUnit\Framework\MockObject\MockObject; use WC_Cart; use WooCommerce; @@ -283,20 +279,13 @@ class AbandonedCartTest extends \MailPoetTest { $newsletter->status = Newsletter::STATUS_ACTIVE; $newsletter->save(); - $newsletterEntity = $this->entityManager->getReference(NewsletterEntity::class, $newsletter->id); - $this->assertInstanceOf(NewsletterEntity::class, $newsletterEntity); - $newsletterOptionFactory = new NewsletterOptionFactory(); - $newsletterOptionFactory->createMultipleOptions( - $newsletterEntity, - [ - 'group' => WooCommerceEmail::SLUG, - 'event' => AbandonedCart::SLUG, - 'afterTimeType' => 'hours', - 'afterTimeNumber' => self::SCHEDULE_EMAIL_AFTER_HOURS, - 'sendTo' => 'user', - ] - ); - + $this->createNewsletterOptions($newsletter, [ + 'group' => WooCommerceEmail::SLUG, + 'event' => AbandonedCart::SLUG, + 'afterTimeType' => 'hours', + 'afterTimeNumber' => self::SCHEDULE_EMAIL_AFTER_HOURS, + 'sendTo' => 'user', + ]); return $newsletter; } @@ -317,6 +306,37 @@ class AbandonedCartTest extends \MailPoetTest { return $task; } + private function createNewsletterOptions(Newsletter $newsletter, array $options) { + foreach ($options as $option => $value) { + $newsletterOptionField = NewsletterOptionField::where('name', $option) + ->where('newsletter_type', $newsletter->type) + ->findOne(); + + if (!$newsletterOptionField) { + $newsletterOptionField = NewsletterOptionField::create(); + $newsletterOptionField->hydrate([ + 'newsletter_type' => $newsletter->type, + 'name' => $option, + ]); + $newsletterOptionField->save(); + } + + $newsletterOption = NewsletterOption::where('newsletter_id', $newsletter->id) + ->where('option_field_id', $newsletterOptionField->id) + ->findOne(); + + if (!$newsletterOption) { + $newsletterOption = NewsletterOption::create(); + $newsletterOption->hydrate([ + 'newsletter_id' => $newsletter->id, + 'option_field_id' => $newsletterOptionField->id, + 'value' => $value, + ]); + $newsletterOption->save(); + } + } + } + private function createSubscriber() { $subscriber = Subscriber::create(); $subscriber->status = Subscriber::STATUS_SUBSCRIBED; @@ -359,13 +379,13 @@ class AbandonedCartTest extends \MailPoetTest { } private function cleanup() { - $this->truncateEntity(NewsletterEntity::class); - $this->truncateEntity(NewsletterOptionEntity::class); - $this->truncateEntity(NewsletterOptionFieldEntity::class); - $this->truncateEntity(SendingQueueEntity::class); - $this->truncateEntity(ScheduledTaskEntity::class); - $this->truncateEntity(ScheduledTaskSubscriberEntity::class); - $this->truncateEntity(SubscriberEntity::class); + ORM::raw_execute('TRUNCATE ' . Subscriber::$_table); + ORM::raw_execute('TRUNCATE ' . Newsletter::$_table); + ORM::raw_execute('TRUNCATE ' . NewsletterOption::$_table); + ORM::raw_execute('TRUNCATE ' . NewsletterOptionField::$_table); + ORM::raw_execute('TRUNCATE ' . SendingQueue::$_table); + ORM::raw_execute('TRUNCATE ' . ScheduledTask::$_table); + ORM::raw_execute('TRUNCATE ' . ScheduledTaskSubscriber::$_table); } public function _after() { diff --git a/mailpoet/tests/integration/AutomaticEmails/WooCommerce/Events/FirstPurchaseTest.php b/mailpoet/tests/integration/AutomaticEmails/WooCommerce/Events/FirstPurchaseTest.php index b06c2d9648..214410d840 100644 --- a/mailpoet/tests/integration/AutomaticEmails/WooCommerce/Events/FirstPurchaseTest.php +++ b/mailpoet/tests/integration/AutomaticEmails/WooCommerce/Events/FirstPurchaseTest.php @@ -7,23 +7,19 @@ use Codeception\Stub\Expected; use Codeception\Util\Fixtures; use MailPoet\AutomaticEmails\WooCommerce\WooCommerce; use MailPoet\AutomaticEmails\WooCommerce\WooCommerceStubs\OrderDetails; -use MailPoet\Entities\NewsletterEntity; -use MailPoet\Entities\NewsletterOptionEntity; -use MailPoet\Entities\NewsletterOptionFieldEntity; -use MailPoet\Entities\ScheduledTaskEntity; -use MailPoet\Entities\ScheduledTaskSubscriberEntity; -use MailPoet\Entities\SendingQueueEntity; -use MailPoet\Entities\SubscriberEntity; use MailPoet\Models\Newsletter; +use MailPoet\Models\NewsletterOption; +use MailPoet\Models\NewsletterOptionField; use MailPoet\Models\ScheduledTask; +use MailPoet\Models\ScheduledTaskSubscriber; use MailPoet\Models\Segment; use MailPoet\Models\SendingQueue; use MailPoet\Models\Subscriber; use MailPoet\Models\SubscriberSegment; use MailPoet\Tasks\Sending; -use MailPoet\Test\DataFactories\NewsletterOption as NewsletterOptionFactory; use MailPoet\WooCommerce\Helper as WCHelper; use MailPoet\WP\Functions as WPFunctions; +use MailPoetVendor\Idiorm\ORM; require_once __DIR__ . '/../WooCommerceStubs/OrderDetails.php'; @@ -294,23 +290,46 @@ class FirstPurchaseTest extends \MailPoetTest { } public function _createNewsletterOption(array $options, $newsletterId) { - $newsletterEntity = $this->entityManager->getReference(NewsletterEntity::class, $newsletterId); - $this->assertInstanceOf(NewsletterEntity::class, $newsletterEntity); - $newsletterOptionFactory = new NewsletterOptionFactory(); - $newsletterOptionFactory->createMultipleOptions( - $newsletterEntity, - $options - ); + foreach ($options as $option => $value) { + $newsletterOptionField = NewsletterOptionField::where('name', $option) + ->where('newsletter_type', Newsletter::TYPE_AUTOMATIC) + ->findOne(); + if (!$newsletterOptionField) { + $newsletterOptionField = NewsletterOptionField::create(); + $newsletterOptionField->hydrate( + [ + 'newsletter_type' => Newsletter::TYPE_AUTOMATIC, + 'name' => $option, + ] + ); + $newsletterOptionField->save(); + } + + $newsletterOption = NewsletterOption::where('newsletter_id', $newsletterId) + ->where('option_field_id', $newsletterOptionField->id) + ->findOne(); + if (!$newsletterOption) { + $newsletterOption = NewsletterOption::create(); + $newsletterOption->hydrate( + [ + 'newsletter_id' => $newsletterId, + 'option_field_id' => $newsletterOptionField->id, + 'value' => $value, + ] + ); + $newsletterOption->save(); + } + } } public function _after() { - $this->truncateEntity(NewsletterEntity::class); - $this->truncateEntity(NewsletterOptionEntity::class); - $this->truncateEntity(NewsletterOptionFieldEntity::class); - $this->truncateEntity(SendingQueueEntity::class); - $this->truncateEntity(ScheduledTaskEntity::class); - $this->truncateEntity(ScheduledTaskSubscriberEntity::class); - $this->truncateEntity(SubscriberEntity::class); + ORM::raw_execute('TRUNCATE ' . Newsletter::$_table); + ORM::raw_execute('TRUNCATE ' . NewsletterOption::$_table); + ORM::raw_execute('TRUNCATE ' . NewsletterOptionField::$_table); + ORM::raw_execute('TRUNCATE ' . Subscriber::$_table); + ORM::raw_execute('TRUNCATE ' . SendingQueue::$_table); + ORM::raw_execute('TRUNCATE ' . ScheduledTask::$_table); + ORM::raw_execute('TRUNCATE ' . ScheduledTaskSubscriber::$_table); WPFunctions::set(new WPFunctions); } } diff --git a/mailpoet/tests/integration/AutomaticEmails/WooCommerce/Events/PurchasedInCategoryTest.php b/mailpoet/tests/integration/AutomaticEmails/WooCommerce/Events/PurchasedInCategoryTest.php index a2920716a3..3ca892fbef 100644 --- a/mailpoet/tests/integration/AutomaticEmails/WooCommerce/Events/PurchasedInCategoryTest.php +++ b/mailpoet/tests/integration/AutomaticEmails/WooCommerce/Events/PurchasedInCategoryTest.php @@ -4,24 +4,19 @@ namespace MailPoet\AutomaticEmails\WooCommerce\Events; use Codeception\Util\Fixtures; use MailPoet\AutomaticEmails\WooCommerce\WooCommerce; -use MailPoet\Entities\NewsletterEntity; -use MailPoet\Entities\NewsletterOptionEntity; -use MailPoet\Entities\NewsletterOptionFieldEntity; -use MailPoet\Entities\ScheduledTaskEntity; -use MailPoet\Entities\ScheduledTaskSubscriberEntity; -use MailPoet\Entities\SendingQueueEntity; -use MailPoet\Entities\SubscriberEntity; +use MailPoet\Models\Newsletter; +use MailPoet\Models\NewsletterOption; +use MailPoet\Models\NewsletterOptionField; +use MailPoet\Models\ScheduledTask; +use MailPoet\Models\ScheduledTaskSubscriber; use MailPoet\Models\Segment; use MailPoet\Models\SendingQueue; use MailPoet\Models\Subscriber; use MailPoet\Models\SubscriberSegment; -use MailPoet\Newsletter\Options\NewsletterOptionFieldsRepository; -use MailPoet\Newsletter\Options\NewsletterOptionsRepository; use MailPoet\Tasks\Sending; -use MailPoet\Test\DataFactories\Newsletter as NewsletterFactory; -use MailPoet\Test\DataFactories\NewsletterOption as NewsletterOptionFactory; use MailPoet\WooCommerce\Helper as WCHelper; use MailPoet\WP\Functions as WPFunctions; +use MailPoetVendor\Idiorm\ORM; use PHPUnit\Framework\MockObject\MockObject; class PurchasedInCategoryTest extends \MailPoetTest { @@ -32,26 +27,18 @@ class PurchasedInCategoryTest extends \MailPoetTest { /** @var PurchasedInCategory */ private $event; - /** @var NewsletterOptionsRepository */ - private $newsletterOptionsRepository; - - /** @var NewsletterOptionFieldsRepository */ - private $newsletterOptionFieldsRepository; - public function _before() { - $this->truncateEntity(NewsletterEntity::class); - $this->truncateEntity(NewsletterOptionEntity::class); - $this->truncateEntity(NewsletterOptionFieldEntity::class); - $this->truncateEntity(SubscriberEntity::class); - $this->truncateEntity(SendingQueueEntity::class); - $this->truncateEntity(ScheduledTaskEntity::class); - $this->truncateEntity(ScheduledTaskSubscriberEntity::class); + ORM::raw_execute('TRUNCATE ' . Newsletter::$_table); + ORM::raw_execute('TRUNCATE ' . NewsletterOption::$_table); + ORM::raw_execute('TRUNCATE ' . NewsletterOptionField::$_table); + ORM::raw_execute('TRUNCATE ' . Subscriber::$_table); + ORM::raw_execute('TRUNCATE ' . SendingQueue::$_table); + ORM::raw_execute('TRUNCATE ' . ScheduledTask::$_table); + ORM::raw_execute('TRUNCATE ' . ScheduledTaskSubscriber::$_table); WPFunctions::set(new WPFunctions); WPFunctions::get()->removeAllFilters('woocommerce_payment_complete'); $this->woocommerceHelper = $this->createMock(WCHelper::class); $this->event = new PurchasedInCategory($this->woocommerceHelper); - $this->newsletterOptionFieldsRepository = $this->diContainer->get(NewsletterOptionFieldsRepository::class); - $this->newsletterOptionsRepository = $this->diContainer->get(NewsletterOptionsRepository::class); } public function testItGetsEventDetails() { @@ -98,7 +85,7 @@ class PurchasedInCategoryTest extends \MailPoetTest { $this->_createSubscriber($customerEmail); $this->event->scheduleEmail(3); - $scheduledTask = Sending::getByNewsletterId($newsletter->getId()); + $scheduledTask = Sending::getByNewsletterId($newsletter->id); $queue = $scheduledTask->queue(); // We only want to record the ID for the category that triggered the newsletter expect($queue->getMeta())->equals(['orderedProductCategories' => ['15']]); @@ -124,7 +111,7 @@ class PurchasedInCategoryTest extends \MailPoetTest { $this->event = new PurchasedInCategory($this->woocommerceHelper); $this->event->scheduleEmail(3); - $queue1 = SendingQueue::where('newsletter_id', $newsletter->getId())->findMany(); + $queue1 = SendingQueue::where('newsletter_id', $newsletter->id)->findMany(); expect($queue1)->notEmpty(); $order = $this->getOrderMock(['15', '17']); @@ -139,7 +126,7 @@ class PurchasedInCategoryTest extends \MailPoetTest { ->will($this->returnValue($customerEmail)); $this->event = new PurchasedInCategory($this->woocommerceHelper); $this->event->scheduleEmail(4); - $queue2 = SendingQueue::where('newsletter_id', $newsletter->getId())->findMany(); + $queue2 = SendingQueue::where('newsletter_id', $newsletter->id)->findMany(); expect($queue2)->count(count($queue1)); } @@ -162,7 +149,7 @@ class PurchasedInCategoryTest extends \MailPoetTest { $this->event = new PurchasedInCategory($this->woocommerceHelper); $this->event->scheduleEmail(3); - $queue1 = SendingQueue::where('newsletter_id', $newsletter->getId())->findMany(); + $queue1 = SendingQueue::where('newsletter_id', $newsletter->id)->findMany(); expect($queue1)->notEmpty(); $order = $this->getOrderMock(['15']); @@ -177,7 +164,7 @@ class PurchasedInCategoryTest extends \MailPoetTest { ->will($this->returnValue($customerEmail)); $this->event = new PurchasedInCategory($this->woocommerceHelper); $this->event->scheduleEmail(4); - $queue2 = SendingQueue::where('newsletter_id', $newsletter->getId())->findMany(); + $queue2 = SendingQueue::where('newsletter_id', $newsletter->id)->findMany(); expect($queue1)->count(count($queue2)); } @@ -200,10 +187,10 @@ class PurchasedInCategoryTest extends \MailPoetTest { $this->event = new PurchasedInCategory($this->woocommerceHelper); $this->event->scheduleEmail(3); - $queue1 = SendingQueue::where('newsletter_id', $newsletter->getId())->findMany(); + $queue1 = SendingQueue::where('newsletter_id', $newsletter->id)->findMany(); expect($queue1)->count(1); - $this->assertInstanceOf(NewsletterEntity::class, $newsletter); + $this->assertInstanceOf(Newsletter::class, $newsletter); $this->updateEmailTriggerIds($newsletter, ['16']); $order = $this->getOrderMock(['16']); $this->woocommerceHelper = $this->createMock(WCHelper::class); @@ -217,7 +204,7 @@ class PurchasedInCategoryTest extends \MailPoetTest { ->will($this->returnValue($customerEmail)); $this->event = new PurchasedInCategory($this->woocommerceHelper); $this->event->scheduleEmail(4); - $queue2 = SendingQueue::where('newsletter_id', $newsletter->getId())->findMany(); + $queue2 = SendingQueue::where('newsletter_id', $newsletter->id)->findMany(); expect($queue2)->count(2); } @@ -252,17 +239,16 @@ class PurchasedInCategoryTest extends \MailPoetTest { return $orderMock; } - private function _createNewsletter(): NewsletterEntity { - $newsletterFactory = new NewsletterFactory(); - $newsletter = $newsletterFactory - ->withSubject('WooCommerce') - ->withAutomaticType() - ->withActiveStatus() - ->create(); - - $newsletterOptionFactory = new NewsletterOptionFactory(); - $newsletterOptionFactory->createMultipleOptions( - $newsletter, + private function _createNewsletter(): Newsletter { + $newsletter = Newsletter::createOrUpdate( + [ + 'subject' => 'WooCommerce', + 'preheader' => 'preheader', + 'type' => Newsletter::TYPE_AUTOMATIC, + 'status' => Newsletter::STATUS_ACTIVE, + ] + ); + $this->_createNewsletterOption( [ 'sendTo' => 'user', 'group' => WooCommerce::SLUG, @@ -275,9 +261,9 @@ class PurchasedInCategoryTest extends \MailPoetTest { ['id' => '15'], ], ]), - ] + ], + $newsletter->id ); - return $newsletter; } @@ -298,14 +284,45 @@ class PurchasedInCategoryTest extends \MailPoetTest { return $subscriber; } - private function updateEmailTriggerIds(NewsletterEntity $newsletter, array $triggerIds) { - $metaOptionField = $this->newsletterOptionFieldsRepository->findOneBy(['name' => 'meta']); - $this->assertInstanceOf(NewsletterOptionFieldEntity::class, $metaOptionField); + public function _createNewsletterOption(array $options, $newsletterId) { + foreach ($options as $option => $value) { + $newsletterOptionField = NewsletterOptionField::where('name', $option) + ->where('newsletter_type', Newsletter::TYPE_AUTOMATIC) + ->findOne(); + if (!$newsletterOptionField) { + $newsletterOptionField = NewsletterOptionField::create(); + $newsletterOptionField->hydrate( + [ + 'newsletter_type' => Newsletter::TYPE_AUTOMATIC, + 'name' => $option, + ] + ); + $newsletterOptionField->save(); + } - $newsletterMetaOption = $this->newsletterOptionsRepository->findOneBy(['newsletter' => $newsletter, 'optionField' => $metaOptionField]); - $this->assertInstanceOf(NewsletterOptionEntity::class, $newsletterMetaOption); - $this->assertIsString($newsletterMetaOption->getValue()); - $optionValue = json_decode($newsletterMetaOption->getValue(), true); + $newsletterOption = NewsletterOption::where('newsletter_id', $newsletterId) + ->where('option_field_id', $newsletterOptionField->id) + ->findOne(); + if (!$newsletterOption) { + $newsletterOption = NewsletterOption::create(); + $newsletterOption->hydrate( + [ + 'newsletter_id' => $newsletterId, + 'option_field_id' => $newsletterOptionField->id, + 'value' => $value, + ] + ); + $newsletterOption->save(); + } + } + } + + private function updateEmailTriggerIds(Newsletter $newsletter, array $triggerIds) { + $metaOptionField = NewsletterOptionField::where('name', 'meta')->findOne(); + $this->assertInstanceOf(NewsletterOptionField::class, $metaOptionField); + $newsletterMetaOption = NewsletterOption::where(['newsletter_id' => $newsletter->id, 'option_field_id' => $metaOptionField->id])->findOne(); + $this->assertInstanceOf(NewsletterOption::class, $newsletterMetaOption); + $optionValue = json_decode($newsletterMetaOption->value, true); $this->assertIsArray($optionValue); $optionValue['option'] = []; foreach ($triggerIds as $triggerId) { @@ -313,9 +330,7 @@ class PurchasedInCategoryTest extends \MailPoetTest { } $newValue = json_encode($optionValue); $this->assertIsString($newValue); - - $newsletterMetaOption->setValue($newValue); - $this->entityManager->persist($newsletterMetaOption); - $this->entityManager->flush($newsletterMetaOption); + $newsletterMetaOption->set('value', $newValue); + $newsletterMetaOption->save(); } } diff --git a/mailpoet/tests/integration/AutomaticEmails/WooCommerce/Events/PurchasedProductTest.php b/mailpoet/tests/integration/AutomaticEmails/WooCommerce/Events/PurchasedProductTest.php index 392b5ff62b..4a079e9045 100644 --- a/mailpoet/tests/integration/AutomaticEmails/WooCommerce/Events/PurchasedProductTest.php +++ b/mailpoet/tests/integration/AutomaticEmails/WooCommerce/Events/PurchasedProductTest.php @@ -8,39 +8,26 @@ use Codeception\Util\Fixtures; use MailPoet\AutomaticEmails\WooCommerce\WooCommerce; use MailPoet\AutomaticEmails\WooCommerce\WooCommerceStubs\ItemDetails; use MailPoet\AutomaticEmails\WooCommerce\WooCommerceStubs\OrderDetails; -use MailPoet\Entities\NewsletterEntity; -use MailPoet\Entities\NewsletterOptionEntity; -use MailPoet\Entities\NewsletterOptionFieldEntity; -use MailPoet\Entities\ScheduledTaskEntity; -use MailPoet\Entities\ScheduledTaskSubscriberEntity; -use MailPoet\Entities\SendingQueueEntity; -use MailPoet\Entities\SubscriberEntity; use MailPoet\Models\Newsletter; +use MailPoet\Models\NewsletterOption; +use MailPoet\Models\NewsletterOptionField; +use MailPoet\Models\ScheduledTask; +use MailPoet\Models\ScheduledTaskSubscriber; use MailPoet\Models\Segment; use MailPoet\Models\SendingQueue; use MailPoet\Models\Subscriber; use MailPoet\Models\SubscriberSegment; -use MailPoet\Newsletter\Options\NewsletterOptionFieldsRepository; -use MailPoet\Newsletter\Options\NewsletterOptionsRepository; use MailPoet\Tasks\Sending; -use MailPoet\Test\DataFactories\NewsletterOption as NewsletterOptionFactory; use MailPoet\WooCommerce\Helper as WCHelper; use MailPoet\WP\Functions as WPFunctions; +use MailPoetVendor\Idiorm\ORM; require_once __DIR__ . '/../WooCommerceStubs/ItemDetails.php'; require_once __DIR__ . '/../WooCommerceStubs/OrderDetails.php'; class PurchasedProductTest extends \MailPoetTest { - /** @var NewsletterOptionFieldsRepository */ - private $newsletterOptionFieldsRepository; - - /** @var NewsletterOptionsRepository */ - private $newsletterOptionsRepository; - public function _before() { WPFunctions::get()->removeAllFilters('woocommerce_payment_complete'); - $this->newsletterOptionFieldsRepository = $this->diContainer->get(NewsletterOptionFieldsRepository::class); - $this->newsletterOptionsRepository = $this->diContainer->get(NewsletterOptionsRepository::class); } public function testItGetsEventDetails() { @@ -259,37 +246,53 @@ class PurchasedProductTest extends \MailPoetTest { } private function updateEmailTriggerIds(Newsletter $newsletter, array $triggerIds) { - $newsletterEntity = $this->entityManager->getReference(NewsletterEntity::class, $newsletter->id); - - $metaOptionField = $this->newsletterOptionFieldsRepository->findOneBy(['name' => 'meta']); - $this->assertInstanceOf(NewsletterOptionFieldEntity::class, $metaOptionField); - - $newsletterMetaOption = $this->newsletterOptionsRepository->findOneBy(['newsletter' => $newsletterEntity, 'optionField' => $metaOptionField]); - $this->assertInstanceOf(NewsletterOptionEntity::class, $newsletterMetaOption); - $this->assertIsString($newsletterMetaOption->getValue()); - $optionValue = json_decode($newsletterMetaOption->getValue(), true); + $metaOptionField = NewsletterOptionField::where('name', 'meta')->findOne(); + $this->assertInstanceOf(NewsletterOptionField::class, $metaOptionField); + $newsletterMetaOption = NewsletterOption::where(['newsletter_id' => $newsletter->id, 'option_field_id' => $metaOptionField->id])->findOne(); + $this->assertInstanceOf(NewsletterOption::class, $newsletterMetaOption); + $optionValue = json_decode($newsletterMetaOption->value, true); $this->assertIsArray($optionValue); - $optionValue['option'] = []; foreach ($triggerIds as $triggerId) { $optionValue['option'][] = ['id' => $triggerId]; } $newValue = json_encode($optionValue); $this->assertIsString($newValue); - - $newsletterMetaOption->setValue($newValue); - $this->entityManager->persist($newsletterMetaOption); - $this->entityManager->flush($newsletterMetaOption); + $newsletterMetaOption->set('value', $newValue); + $newsletterMetaOption->save(); } - public function _createNewsletterOption(array $options, $newsletterId) { - $newsletterEntity = $this->entityManager->getReference(NewsletterEntity::class, $newsletterId); - $this->assertInstanceOf(NewsletterEntity::class, $newsletterEntity); - $newsletterOptionFactory = new NewsletterOptionFactory(); - $newsletterOptionFactory->createMultipleOptions( - $newsletterEntity, - $options - ); + private function _createNewsletterOption(array $options, $newsletterId) { + foreach ($options as $option => $value) { + $newsletterOptionField = NewsletterOptionField::where('name', $option) + ->where('newsletter_type', Newsletter::TYPE_AUTOMATIC) + ->findOne(); + if (!$newsletterOptionField) { + $newsletterOptionField = NewsletterOptionField::create(); + $newsletterOptionField->hydrate( + [ + 'newsletter_type' => Newsletter::TYPE_AUTOMATIC, + 'name' => $option, + ] + ); + $newsletterOptionField->save(); + } + + $newsletterOption = NewsletterOption::where('newsletter_id', $newsletterId) + ->where('option_field_id', $newsletterOptionField->id) + ->findOne(); + if (!$newsletterOption) { + $newsletterOption = NewsletterOption::create(); + $newsletterOption->hydrate( + [ + 'newsletter_id' => $newsletterId, + 'option_field_id' => $newsletterOptionField->id, + 'value' => $value, + ] + ); + $newsletterOption->save(); + } + } } private function createWooSubscriber(array $data = []) { @@ -310,13 +313,13 @@ class PurchasedProductTest extends \MailPoetTest { } public function _after() { - $this->truncateEntity(NewsletterEntity::class); - $this->truncateEntity(NewsletterOptionEntity::class); - $this->truncateEntity(NewsletterOptionFieldEntity::class); - $this->truncateEntity(SendingQueueEntity::class); - $this->truncateEntity(ScheduledTaskEntity::class); - $this->truncateEntity(ScheduledTaskSubscriberEntity::class); - $this->truncateEntity(SubscriberEntity::class); + ORM::raw_execute('TRUNCATE ' . Newsletter::$_table); + ORM::raw_execute('TRUNCATE ' . NewsletterOption::$_table); + ORM::raw_execute('TRUNCATE ' . NewsletterOptionField::$_table); + ORM::raw_execute('TRUNCATE ' . Subscriber::$_table); + ORM::raw_execute('TRUNCATE ' . SendingQueue::$_table); + ORM::raw_execute('TRUNCATE ' . ScheduledTask::$_table); + ORM::raw_execute('TRUNCATE ' . ScheduledTaskSubscriber::$_table); WPFunctions::set(new WPFunctions); } } diff --git a/mailpoet/tests/integration/Cron/Workers/SchedulerTest.php b/mailpoet/tests/integration/Cron/Workers/SchedulerTest.php index ec4f1b10ca..f5a90aa031 100644 --- a/mailpoet/tests/integration/Cron/Workers/SchedulerTest.php +++ b/mailpoet/tests/integration/Cron/Workers/SchedulerTest.php @@ -7,19 +7,10 @@ use Codeception\Stub\Expected; use MailPoet\Cron\CronHelper; use MailPoet\Cron\CronWorkerScheduler; use MailPoet\Cron\Workers\Scheduler; -use MailPoet\Entities\NewsletterEntity; -use MailPoet\Entities\NewsletterOptionEntity; -use MailPoet\Entities\NewsletterOptionFieldEntity; -use MailPoet\Entities\NewsletterSegmentEntity; -use MailPoet\Entities\ScheduledTaskEntity; -use MailPoet\Entities\ScheduledTaskSubscriberEntity; -use MailPoet\Entities\SegmentEntity; -use MailPoet\Entities\SendingQueueEntity; -use MailPoet\Entities\SettingEntity; -use MailPoet\Entities\SubscriberEntity; -use MailPoet\Entities\SubscriberSegmentEntity; use MailPoet\Logging\LoggerFactory; use MailPoet\Models\Newsletter; +use MailPoet\Models\NewsletterOption; +use MailPoet\Models\NewsletterOptionField; use MailPoet\Models\NewsletterSegment; use MailPoet\Models\ScheduledTask; use MailPoet\Models\ScheduledTaskSubscriber; @@ -32,10 +23,11 @@ use MailPoet\Newsletter\Scheduler\WelcomeScheduler; use MailPoet\Newsletter\Sending\ScheduledTasksRepository; use MailPoet\Segments\SegmentsRepository; use MailPoet\Segments\SubscribersFinder; +use MailPoet\Settings\SettingsRepository; use MailPoet\Tasks\Sending as SendingTask; -use MailPoet\Test\DataFactories\NewsletterOption as NewsletterOptionFactory; use MailPoet\WP\Functions as WPFunctions; use MailPoetVendor\Carbon\Carbon; +use MailPoetVendor\Idiorm\ORM; use WP_User; use MailPoet\Newsletter\Scheduler\Scheduler as NewsletterScheduler; @@ -62,9 +54,6 @@ class SchedulerTest extends \MailPoetTest { /** @var NewsletterScheduler */ private $newsletterScheduler; - /** @var NewsletterOptionFactory */ - private $newsletterOptionFactory; - public function _before() { parent::_before(); $this->loggerFactory = LoggerFactory::getInstance(); @@ -75,7 +64,6 @@ class SchedulerTest extends \MailPoetTest { $this->newslettersRepository = $this->diContainer->get(NewslettersRepository::class); $this->segmentsRepository = $this->diContainer->get(SegmentsRepository::class); $this->newsletterScheduler = $this->diContainer->get(NewsletterScheduler::class); - $this->newsletterOptionFactory = new NewsletterOptionFactory(); } public function testItThrowsExceptionWhenExecutionLimitIsReached() { @@ -138,10 +126,9 @@ class SchedulerTest extends \MailPoetTest { public function testItCanDeleteQueueWhenDeliveryIsSetToImmediately() { $newsletter = $this->_createNewsletter(); - $newsletterEntity = $this->entityManager->getReference(NewsletterEntity::class, $newsletter->id); - $this->assertInstanceOf(NewsletterEntity::class, $newsletterEntity); - $this->newsletterOptionFactory->create($newsletterEntity, 'intervalType', 'immediately'); - + $newsletterOptionField = + $this->_createNewsletterOptionField('intervalType', Newsletter::TYPE_WELCOME); + $newsletterOption = $this->_createNewsletterOption($newsletterOptionField->id, $newsletter->id, 'immediately'); $newsletter = Newsletter::filter('filterWithOptions', Newsletter::TYPE_WELCOME) ->findOne($newsletter->id); assert($newsletter instanceof Newsletter); @@ -166,10 +153,9 @@ class SchedulerTest extends \MailPoetTest { public function testItCanRescheduleQueueDeliveryTime() { $newsletter = $this->_createNewsletter(); assert($newsletter instanceof Newsletter); - $newsletterEntity = $this->entityManager->getReference(NewsletterEntity::class, $newsletter->id); - $this->assertInstanceOf(NewsletterEntity::class, $newsletterEntity); - $newsletterOption = $this->newsletterOptionFactory->create($newsletterEntity, 'intervalType', 'daily'); - + $newsletterOptionField = + $this->_createNewsletterOptionField('intervalType', Newsletter::TYPE_WELCOME); + $newsletterOption = $this->_createNewsletterOption($newsletterOptionField->id, $newsletter->id, 'daily'); $newsletter = Newsletter::filter('filterWithOptions', Newsletter::TYPE_WELCOME) ->findOne($newsletter->id); assert($newsletter instanceof Newsletter); @@ -188,9 +174,8 @@ class SchedulerTest extends \MailPoetTest { // queue's next run date should change when interval type is set to anything // other than "immediately" $queue = $this->_createQueue($newsletter->id); - $newsletterOption->setValue('daily'); - $this->entityManager->persist($newsletterOption); - $this->entityManager->flush(); + $newsletterOption->value = 'daily'; + $newsletterOption->save(); $newsletter = Newsletter::filter('filterWithOptions', Newsletter::TYPE_WELCOME)->findOne($newsletter->id); assert($newsletter instanceof Newsletter); expect($queue->scheduledAt)->null(); @@ -206,11 +191,14 @@ class SchedulerTest extends \MailPoetTest { $wPUser = $this->_createOrUpdateWPUser('editor'); $subscriber = $this->_createSubscriber(); $newsletter = $this->_createNewsletter(Newsletter::TYPE_WELCOME); - - $newsletterEntity = $this->entityManager->getReference(NewsletterEntity::class, $newsletter->id); - $this->assertInstanceOf(NewsletterEntity::class, $newsletterEntity); - $this->newsletterOptionFactory->create($newsletterEntity, 'role', 'author'); - + $newsletterOptionField = $this->_createNewsletterOptionField( + 'role', + Newsletter::TYPE_WELCOME + ); + $newsletterOption = $this->_createNewsletterOption( + $newsletterOptionField->id, + $newsletter->id, 'author' + ); $newsletter = Newsletter::filter('filterWithOptions', Newsletter::TYPE_WELCOME) ->findOne($newsletter->id); assert($newsletter instanceof Newsletter); @@ -236,11 +224,14 @@ class SchedulerTest extends \MailPoetTest { $wPUser = $this->_createOrUpdateWPUser('editor'); $subscriber = $this->_createSubscriber($wPUser->ID); $newsletter = $this->_createNewsletter(Newsletter::TYPE_WELCOME); - - $newsletterEntity = $this->entityManager->getReference(NewsletterEntity::class, $newsletter->id); - $this->assertInstanceOf(NewsletterEntity::class, $newsletterEntity); - $this->newsletterOptionFactory->create($newsletterEntity, 'role', 'author'); - + $newsletterOptionField = $this->_createNewsletterOptionField( + 'role', + Newsletter::TYPE_WELCOME + ); + $newsletterOption = $this->_createNewsletterOption( + $newsletterOptionField->id, + $newsletter->id, 'author' + ); $newsletter = Newsletter::filter('filterWithOptions', Newsletter::TYPE_WELCOME) ->findOne($newsletter->id); assert($newsletter instanceof Newsletter); @@ -267,11 +258,12 @@ class SchedulerTest extends \MailPoetTest { $wPUser = $this->_createOrUpdateWPUser('author'); $subscriber = $this->_createSubscriber($wPUser->ID); $newsletter = $this->_createNewsletter(Newsletter::TYPE_WELCOME); - - $newsletterEntity = $this->entityManager->getReference(NewsletterEntity::class, $newsletter->id); - $this->assertInstanceOf(NewsletterEntity::class, $newsletterEntity); - $this->newsletterOptionFactory->create($newsletterEntity, 'role', 'author'); - + $newsletterOptionField = + $this->_createNewsletterOptionField('role', Newsletter::TYPE_WELCOME); + $newsletterOption = $this->_createNewsletterOption( + $newsletterOptionField->id, + $newsletter->id, 'author' + ); $newsletter = Newsletter::filter('filterWithOptions', Newsletter::TYPE_WELCOME) ->findOne($newsletter->id); assert($newsletter instanceof Newsletter); @@ -297,11 +289,12 @@ class SchedulerTest extends \MailPoetTest { $wPUser = $this->_createOrUpdateWPUser('author'); $subscriber = $this->_createSubscriber($wPUser->ID); $newsletter = $this->_createNewsletter(Newsletter::TYPE_WELCOME); - - $newsletterEntity = $this->entityManager->getReference(NewsletterEntity::class, $newsletter->id); - $this->assertInstanceOf(NewsletterEntity::class, $newsletterEntity); - $this->newsletterOptionFactory->create($newsletterEntity, 'role', WelcomeScheduler::WORDPRESS_ALL_ROLES); - + $newsletterOptionField = + $this->_createNewsletterOptionField('role', Newsletter::TYPE_WELCOME); + $newsletterOption = $this->_createNewsletterOption( + $newsletterOptionField->id, $newsletter->id, + WelcomeScheduler::WORDPRESS_ALL_ROLES + ); $newsletter = Newsletter::filter('filterWithOptions', Newsletter::TYPE_WELCOME) ->findOne($newsletter->id); assert($newsletter instanceof Newsletter); @@ -436,11 +429,8 @@ class SchedulerTest extends \MailPoetTest { $subscriber = $this->_createSubscriber(); $segment = $this->_createSegment(); $newsletter = $this->_createNewsletter(); - - $newsletterEntity = $this->entityManager->getReference(NewsletterEntity::class, $newsletter->id); - $this->assertInstanceOf(NewsletterEntity::class, $newsletterEntity); - $this->newsletterOptionFactory->create($newsletterEntity, 'segment', $segment->id); - + $newsletterOptionField = $this->_createNewsletterOptionField('segment', Newsletter::TYPE_NOTIFICATION); + $newsletterOption = $this->_createNewsletterOption($newsletterOptionField->id, $newsletter->id, $segment->id); $newsletter = Newsletter::filter('filterWithOptions', Newsletter::TYPE_NOTIFICATION) ->findOne($newsletter->id); assert($newsletter instanceof Newsletter); @@ -476,11 +466,12 @@ class SchedulerTest extends \MailPoetTest { $segment = $this->_createSegment(); $subscriberSegment = $this->_createSubscriberSegment($subscriber->id, $segment->id); $newsletter = $this->_createNewsletter(); - - $newsletterEntity = $this->entityManager->getReference(NewsletterEntity::class, $newsletter->id); - $this->assertInstanceOf(NewsletterEntity::class, $newsletterEntity); - $this->newsletterOptionFactory->create($newsletterEntity, 'segment', $segment->id); - + $newsletterOptionField = + $this->_createNewsletterOptionField('segment', Newsletter::TYPE_NOTIFICATION); + $newsletterOption = $this->_createNewsletterOption( + $newsletterOptionField->id, $newsletter->id, + $segment->id + ); $newsletter = Newsletter::filter('filterWithOptions', Newsletter::TYPE_NOTIFICATION) ->findOne($newsletter->id); assert($newsletter instanceof Newsletter); @@ -516,9 +507,12 @@ class SchedulerTest extends \MailPoetTest { $segment = $this->_createSegment(); $subscriberSegment = $this->_createSubscriberSegment($subscriber->id, $segment->id); $newsletter = $this->_createNewsletter(); - $newsletterEntity = $this->entityManager->getReference(NewsletterEntity::class, $newsletter->id); - $this->assertInstanceOf(NewsletterEntity::class, $newsletterEntity); - $this->newsletterOptionFactory->create($newsletterEntity, 'segment', $segment->id); + $newsletterOptionField = + $this->_createNewsletterOptionField('segment', Newsletter::TYPE_NOTIFICATION); + $newsletterOption = $this->_createNewsletterOption( + $newsletterOptionField->id, $newsletter->id, + $segment->id + ); $newsletter = Newsletter::filter('filterWithOptions', Newsletter::TYPE_NOTIFICATION) ->findOne($newsletter->id); assert($newsletter instanceof Newsletter); @@ -546,9 +540,12 @@ class SchedulerTest extends \MailPoetTest { $segment = $this->_createSegment(); $subscriberSegment = $this->_createSubscriberSegment($subscriber->id, $segment->id); $newsletter = $this->_createNewsletter(); - $newsletterEntity = $this->entityManager->getReference(NewsletterEntity::class, $newsletter->id); - $this->assertInstanceOf(NewsletterEntity::class, $newsletterEntity); - $this->newsletterOptionFactory->create($newsletterEntity, 'segment', $segment->id); + $newsletterOptionField = + $this->_createNewsletterOptionField('segment', Newsletter::TYPE_NOTIFICATION); + $newsletterOption = $this->_createNewsletterOption( + $newsletterOptionField->id, $newsletter->id, + $segment->id + ); $newsletter = Newsletter::filter('filterWithOptions', Newsletter::TYPE_NOTIFICATION) ->findOne($newsletter->id); assert($newsletter instanceof Newsletter); @@ -575,9 +572,12 @@ class SchedulerTest extends \MailPoetTest { $subscriberSegment = $this->_createSubscriberSegment($subscriber->id, $segment->id); $newsletter = $this->_createNewsletter(); $newsletterSegment = $this->_createNewsletterSegment($newsletter->id, $segment->id); - $newsletterEntity = $this->entityManager->getReference(NewsletterEntity::class, $newsletter->id); - $this->assertInstanceOf(NewsletterEntity::class, $newsletterEntity); - $this->newsletterOptionFactory->create($newsletterEntity, 'segment', $segment->id); + $newsletterOptionField = + $this->_createNewsletterOptionField('segment', Newsletter::TYPE_NOTIFICATION); + $newsletterOption = $this->_createNewsletterOption( + $newsletterOptionField->id, $newsletter->id, + $segment->id + ); $newsletter = Newsletter::filter('filterWithOptions', Newsletter::TYPE_NOTIFICATION) ->findOne($newsletter->id); assert($newsletter instanceof Newsletter); @@ -658,9 +658,12 @@ class SchedulerTest extends \MailPoetTest { $newsletterSegment = $this->_createNewsletterSegment($newsletter->id, $segment->id); $subscriber = $this->_createSubscriber(); $subscriberSegment = $this->_createSubscriberSegment($subscriber->id, $segment->id); - $newsletterEntity = $this->entityManager->getReference(NewsletterEntity::class, $newsletter->id); - $this->assertInstanceOf(NewsletterEntity::class, $newsletterEntity); - $this->newsletterOptionFactory->create($newsletterEntity, 'segment', $segment->id); + $newsletterOptionField = + $this->_createNewsletterOptionField('segment', Newsletter::TYPE_NOTIFICATION); + $newsletterOption = $this->_createNewsletterOption( + $newsletterOptionField->id, $newsletter->id, + $segment->id + ); $newsletter = Newsletter::filter('filterWithOptions', Newsletter::TYPE_NOTIFICATION) ->findOne($newsletter->id); assert($newsletter instanceof Newsletter); @@ -940,17 +943,11 @@ class SchedulerTest extends \MailPoetTest { $segment = $this->_createSegment(); $subscriber = $this->_createSubscriber(); $segmentSubscriber = $this->_createSubscriberSegment($subscriber->id, $segment->id); - - $newsletterEntity = $this->entityManager->getReference(NewsletterEntity::class, $newsletter->id); - $this->assertInstanceOf(NewsletterEntity::class, $newsletterEntity); - $this->newsletterOptionFactory->createMultipleOptions( - $newsletterEntity, - [ - 'sendTo' => 'segment', - 'segment' => $segment->id - ] - ); - + $options = ['sendTo' => 'segment', 'segment' => $segment->id]; + foreach ($options as $option => $value) { + $newsletterOptionField = $this->_createNewsletterOptionField($option, Newsletter::TYPE_AUTOMATIC); + $newsletterOption = $this->_createNewsletterOption($newsletterOptionField->id, $newsletter->id, $value); + } $task = SendingTask::create(); $task->newsletterId = $newsletter->id; $task->status = SendingQueue::STATUS_SCHEDULED; @@ -1054,6 +1051,25 @@ class SchedulerTest extends \MailPoetTest { return $newsletter; } + public function _createNewsletterOptionField($name, $type) { + $newsletterOptionField = NewsletterOptionField::create(); + $newsletterOptionField->name = $name; + $newsletterOptionField->newsletterType = $type; + $newsletterOptionField->save(); + expect($newsletterOptionField->getErrors())->false(); + return $newsletterOptionField; + } + + public function _createNewsletterOption($optionFieldId, $newsletterId, $value) { + $newsletterOption = NewsletterOption::create(); + $newsletterOption->optionFieldId = $optionFieldId; + $newsletterOption->newsletterId = $newsletterId; + $newsletterOption->value = $value; + $newsletterOption->save(); + expect($newsletterOption->getErrors())->false(); + return $newsletterOption; + } + public function _createQueue($newsletterId, $status = SendingQueue::STATUS_SCHEDULED) { $queue = SendingTask::create(); $queue->status = $status; @@ -1089,16 +1105,16 @@ class SchedulerTest extends \MailPoetTest { public function _after() { Carbon::setTestNow(); - $this->truncateEntity(NewsletterEntity::class); - $this->truncateEntity(SettingEntity::class); - $this->truncateEntity(ScheduledTaskEntity::class); - $this->truncateEntity(ScheduledTaskSubscriberEntity::class); - $this->truncateEntity(SendingQueueEntity::class); - $this->truncateEntity(NewsletterOptionEntity::class); - $this->truncateEntity(NewsletterOptionFieldEntity::class); - $this->truncateEntity(SubscriberEntity::class); - $this->truncateEntity(SubscriberSegmentEntity::class); - $this->truncateEntity(SegmentEntity::class); - $this->truncateEntity(NewsletterSegmentEntity::class); + ORM::raw_execute('TRUNCATE ' . Newsletter::$_table); + $this->diContainer->get(SettingsRepository::class)->truncate(); + ORM::raw_execute('TRUNCATE ' . ScheduledTask::$_table); + ORM::raw_execute('TRUNCATE ' . ScheduledTaskSubscriber::$_table); + ORM::raw_execute('TRUNCATE ' . SendingQueue::$_table); + ORM::raw_execute('TRUNCATE ' . NewsletterOption::$_table); + ORM::raw_execute('TRUNCATE ' . NewsletterOptionField::$_table); + ORM::raw_execute('TRUNCATE ' . Subscriber::$_table); + ORM::raw_execute('TRUNCATE ' . SubscriberSegment::$_table); + ORM::raw_execute('TRUNCATE ' . Segment::$_table); + ORM::raw_execute('TRUNCATE ' . NewsletterSegment::$_table); } } diff --git a/mailpoet/tests/integration/Models/NewsletterTest.php b/mailpoet/tests/integration/Models/NewsletterTest.php index 747089c437..c02fcd46ed 100644 --- a/mailpoet/tests/integration/Models/NewsletterTest.php +++ b/mailpoet/tests/integration/Models/NewsletterTest.php @@ -2,26 +2,21 @@ namespace MailPoet\Test\Models; -use MailPoet\Entities\NewsletterEntity; -use MailPoet\Entities\NewsletterOptionEntity; -use MailPoet\Entities\NewsletterOptionFieldEntity; -use MailPoet\Entities\NewsletterSegmentEntity; -use MailPoet\Entities\ScheduledTaskEntity; -use MailPoet\Entities\SegmentEntity; -use MailPoet\Entities\SendingQueueEntity; use MailPoet\Entities\StatisticsClickEntity; use MailPoet\Entities\StatisticsOpenEntity; use MailPoet\Entities\StatisticsUnsubscribeEntity; use MailPoet\Models\Newsletter; +use MailPoet\Models\NewsletterOption; +use MailPoet\Models\NewsletterOptionField; use MailPoet\Models\NewsletterSegment; use MailPoet\Models\ScheduledTask; use MailPoet\Models\Segment; use MailPoet\Models\SendingQueue; use MailPoet\Tasks\Sending as SendingTask; use MailPoet\Util\Security; -use MailPoet\Test\DataFactories\NewsletterOption as NewsletterOptionFactory; use MailPoet\WP\Functions as WPFunctions; use MailPoetVendor\Carbon\Carbon; +use MailPoetVendor\Idiorm\ORM; class NewsletterTest extends \MailPoetTest { public $sendingQueue; @@ -30,9 +25,6 @@ class NewsletterTest extends \MailPoetTest { /** @var Newsletter */ public $newsletter; - /** @var NewsletterOptionFactory */ - private $newsletterOptionFactory; - public function _before() { parent::_before(); $this->newsletter = Newsletter::createOrUpdate([ @@ -61,8 +53,6 @@ class NewsletterTest extends \MailPoetTest { $this->sendingQueue->newsletter_id = $this->newsletter->id; $this->sendingQueue->status = ScheduledTask::STATUS_SCHEDULED; $this->sendingQueue->save(); - - $this->newsletterOptionFactory = new NewsletterOptionFactory(); } public function testItCanBeCreated() { @@ -196,14 +186,22 @@ class NewsletterTest extends \MailPoetTest { } public function testItCanHaveOptions() { - $newsletterEntity = $this->entityManager->getReference(NewsletterEntity::class, $this->newsletter->id); - $this->assertInstanceOf(NewsletterEntity::class, $newsletterEntity); - $newsletterOption = $this->newsletterOptionFactory->create($newsletterEntity, 'event', 'list'); - - $newsletter = Newsletter::filter('filterWithOptions', Newsletter::TYPE_STANDARD) + $newsletterOptions = [ + 'name' => 'event', + 'newsletter_type' => Newsletter::TYPE_WELCOME, + ]; + $optionField = NewsletterOptionField::create(); + $optionField->hydrate($newsletterOptions); + $optionField->save(); + $association = NewsletterOption::create(); + $association->newsletterId = $this->newsletter->id; + $association->optionFieldId = (int)$optionField->id; + $association->value = 'list'; + $association->save(); + $newsletter = Newsletter::filter('filterWithOptions', Newsletter::TYPE_WELCOME) ->findOne($this->newsletter->id); assert($newsletter instanceof Newsletter); - expect($newsletter->event)->equals($newsletterOption->getValue()); + expect($newsletter->event)->equals($association->value); } public function testItGeneratesHashOnNewsletterSave() { @@ -448,12 +446,24 @@ class NewsletterTest extends \MailPoetTest { 'type' => Newsletter::TYPE_AUTOMATIC, ] ); - + $newsletterOptionField = NewsletterOptionField::create(); + $newsletterOptionField->hydrate( + [ + 'newsletter_type' => Newsletter::TYPE_AUTOMATIC, + 'name' => 'meta', + ] + ); + $newsletterOptionField->save(); + $newsletterOption = NewsletterOption::create(); $meta = ['some' => 'value']; - $newsletterEntity = $this->entityManager->getReference(NewsletterEntity::class, $newsletter->id); - $this->assertInstanceOf(NewsletterEntity::class, $newsletterEntity); - $this->assertIsString(json_encode($meta)); - $this->newsletterOptionFactory->create($newsletterEntity, 'meta', json_encode($meta)); + $newsletterOption->hydrate( + [ + 'newsletter_id' => $newsletter->id, + 'option_field_id' => $newsletterOptionField->id, + 'value' => json_encode($meta), + ] + ); + $newsletterOption->save(); // by default meta option does not exist on newsletter object expect($newsletter->getMeta())->isEmpty(); @@ -522,13 +532,13 @@ class NewsletterTest extends \MailPoetTest { } public function _after() { - $this->truncateEntity(NewsletterEntity::class); - $this->truncateEntity(NewsletterOptionEntity::class); - $this->truncateEntity(NewsletterOptionFieldEntity::class); - $this->truncateEntity(NewsletterSegmentEntity::class); - $this->truncateEntity(ScheduledTaskEntity::class); - $this->truncateEntity(SegmentEntity::class); - $this->truncateEntity(SendingQueueEntity::class); + ORM::raw_execute('TRUNCATE ' . NewsletterOption::$_table); + ORM::raw_execute('TRUNCATE ' . Newsletter::$_table); + ORM::raw_execute('TRUNCATE ' . NewsletterOptionField::$_table); + ORM::raw_execute('TRUNCATE ' . Segment::$_table); + ORM::raw_execute('TRUNCATE ' . NewsletterSegment::$_table); + ORM::raw_execute('TRUNCATE ' . ScheduledTask::$_table); + ORM::raw_execute('TRUNCATE ' . SendingQueue::$_table); $this->truncateEntity(StatisticsClickEntity::class); $this->truncateEntity(StatisticsOpenEntity::class); $this->truncateEntity(StatisticsUnsubscribeEntity::class); diff --git a/mailpoet/tests/integration/Newsletter/Scheduler/AutomaticEmailTest.php b/mailpoet/tests/integration/Newsletter/Scheduler/AutomaticEmailTest.php index 67aa2ad8e0..da7e8a64b1 100644 --- a/mailpoet/tests/integration/Newsletter/Scheduler/AutomaticEmailTest.php +++ b/mailpoet/tests/integration/Newsletter/Scheduler/AutomaticEmailTest.php @@ -3,55 +3,40 @@ namespace MailPoet\Newsletter\Scheduler; use Codeception\Util\Fixtures; -use MailPoet\Entities\NewsletterEntity; -use MailPoet\Entities\NewsletterOptionEntity; -use MailPoet\Entities\NewsletterOptionFieldEntity; use MailPoet\Entities\NewsletterPostEntity; -use MailPoet\Entities\ScheduledTaskEntity; -use MailPoet\Entities\ScheduledTaskSubscriberEntity; -use MailPoet\Entities\SendingQueueEntity; -use MailPoet\Entities\SubscriberEntity; use MailPoet\Models\Newsletter; +use MailPoet\Models\NewsletterOption; +use MailPoet\Models\NewsletterOptionField; +use MailPoet\Models\ScheduledTask; +use MailPoet\Models\ScheduledTaskSubscriber; use MailPoet\Models\SendingQueue; use MailPoet\Models\Subscriber; use MailPoet\Tasks\Sending as SendingTask; -use MailPoet\Test\DataFactories\Newsletter as NewsletterFactory; -use MailPoet\Test\DataFactories\NewsletterOption as NewsletterOptionFactory; use MailPoet\WP\Functions as WPFunctions; use MailPoetVendor\Carbon\Carbon; +use MailPoetVendor\Idiorm\ORM; class AutomaticEmailTest extends \MailPoetTest { /** @var AutomaticEmailScheduler */ private $automaticEmailScheduler; - /** @var NewsletterEntity */ - private $newsletter; - - /** @var NewsletterOptionFactory */ - private $newsletterOptionFactory; - - /** @var NewsletterFactory */ - private $newsletterFactory; - public function _before() { parent::_before(); $this->automaticEmailScheduler = $this->diContainer->get(AutomaticEmailScheduler::class); - $this->newsletterFactory = new NewsletterFactory(); - $this->newsletter = $this->newsletterFactory->withActiveStatus()->withAutomaticType()->create(); - $this->newsletterOptionFactory = new NewsletterOptionFactory(); - $this->newsletterOptionFactory->createMultipleOptions( - $this->newsletter, + } + + public function testItCreatesScheduledAutomaticEmailSendingTaskForUser() { + $newsletter = $this->_createNewsletter(); + $this->_createNewsletterOptions( + $newsletter->id, [ 'sendTo' => 'user', 'afterTimeType' => 'hours', 'afterTimeNumber' => 2, ] ); - } - - public function testItCreatesScheduledAutomaticEmailSendingTaskForUser() { - $newsletter = Newsletter::filter('filterWithOptions', Newsletter::TYPE_AUTOMATIC)->findOne($this->newsletter->getId()); + $newsletter = Newsletter::filter('filterWithOptions', Newsletter::TYPE_AUTOMATIC)->findOne($newsletter->id); assert($newsletter instanceof Newsletter); $subscriber = Subscriber::create(); $subscriber->hydrate(Fixtures::get('subscriber_template')); @@ -74,7 +59,16 @@ class AutomaticEmailTest extends \MailPoetTest { } public function testItAddsMetaToSendingQueueWhenCreatingAutomaticEmailSendingTask() { - $newsletter = Newsletter::filter('filterWithOptions', Newsletter::TYPE_AUTOMATIC)->findOne($this->newsletter->getId()); + $newsletter = $this->_createNewsletter(); + $this->_createNewsletterOptions( + $newsletter->id, + [ + 'sendTo' => 'user', + 'afterTimeType' => 'hours', + 'afterTimeNumber' => 2, + ] + ); + $newsletter = Newsletter::filter('filterWithOptions', Newsletter::TYPE_AUTOMATIC)->findOne($newsletter->id); assert($newsletter instanceof Newsletter); $subscriber = Subscriber::create(); $subscriber->hydrate(Fixtures::get('subscriber_template')); @@ -89,7 +83,16 @@ class AutomaticEmailTest extends \MailPoetTest { } public function testItCreatesAutomaticEmailSendingTaskForSegment() { - $newsletter = Newsletter::filter('filterWithOptions', Newsletter::TYPE_AUTOMATIC)->findOne($this->newsletter->getId()); + $newsletter = $this->_createNewsletter(); + $this->_createNewsletterOptions( + $newsletter->id, + [ + 'sendTo' => 'segment', + 'afterTimeType' => 'hours', + 'afterTimeNumber' => 2, + ] + ); + $newsletter = Newsletter::filter('filterWithOptions', Newsletter::TYPE_AUTOMATIC)->findOne($newsletter->id); assert($newsletter instanceof Newsletter); $this->automaticEmailScheduler->createAutomaticEmailSendingTask($newsletter, $subscriber = null, $meta = null); @@ -108,11 +111,15 @@ class AutomaticEmailTest extends \MailPoetTest { } public function testItDoesNotScheduleAutomaticEmailWhenGroupDoesNotMatch() { - $this->newsletterOptionFactory->createMultipleOptions( - $this->newsletter, + $newsletter = $this->_createNewsletter(); + $this->_createNewsletterOptions( + $newsletter->id, [ 'group' => 'some_group', 'event' => 'some_event', + 'sendTo' => 'user', + 'afterTimeType' => 'hours', + 'afterTimeNumber' => 2, ] ); @@ -122,11 +129,15 @@ class AutomaticEmailTest extends \MailPoetTest { } public function testItDoesNotScheduleAutomaticEmailWhenEventDoesNotMatch() { - $this->newsletterOptionFactory->createMultipleOptions( - $this->newsletter, + $newsletter = $this->_createNewsletter(); + $this->_createNewsletterOptions( + $newsletter->id, [ 'group' => 'some_group', 'event' => 'some_event', + 'sendTo' => 'user', + 'afterTimeType' => 'hours', + 'afterTimeNumber' => 2, ] ); @@ -137,17 +148,20 @@ class AutomaticEmailTest extends \MailPoetTest { public function testItSchedulesAutomaticEmailWhenConditionMatches() { $currentTime = Carbon::createFromTimestamp(WPFunctions::get()->currentTime('timestamp')); - $this->newsletterOptionFactory->createMultipleOptions( - $this->newsletter, + $newsletter1 = $this->_createNewsletter(); + $this->_createNewsletterOptions( + $newsletter1->id, [ 'group' => 'some_group', 'event' => 'some_event', + 'sendTo' => 'user', + 'afterTimeType' => 'hours', + 'afterTimeNumber' => 2, ] ); - - $newsletter2 = $this->newsletterFactory->withAutomaticType()->withActiveStatus()->create(); - $this->newsletterOptionFactory->createMultipleOptions( - $newsletter2, + $newsletter2 = $this->_createNewsletter(); + $this->_createNewsletterOptions( + $newsletter2->id, [ 'group' => 'some_group', 'event' => 'some_event', @@ -156,7 +170,6 @@ class AutomaticEmailTest extends \MailPoetTest { 'afterTimeNumber' => 2, ] ); - $condition = function($email) { return $email->sendTo === 'segment'; }; @@ -170,7 +183,7 @@ class AutomaticEmailTest extends \MailPoetTest { $automaticEmailScheduler->scheduleAutomaticEmail('some_group', 'some_event', $condition); $result = SendingQueue::findMany(); expect($result)->count(1); - expect($result[0]->newsletter_id)->equals($newsletter2->getId()); + expect($result[0]->newsletter_id)->equals($newsletter2->id); // scheduled task should be created $task = $result[0]->getTasks()->findOne(); expect($task->id)->greaterOrEquals(1); @@ -180,15 +193,44 @@ class AutomaticEmailTest extends \MailPoetTest { ->equals($currentTime->addHours(2)->format('Y-m-d H:i')); } + private function _createNewsletter() { + $newsletter = Newsletter::create(); + $newsletter->type = Newsletter::TYPE_AUTOMATIC; + $newsletter->status = Newsletter::STATUS_ACTIVE; + $newsletter->save(); + expect($newsletter->getErrors())->false(); + return $newsletter; + } + + private function _createNewsletterOptions($newsletterId, $options) { + foreach ($options as $option => $value) { + $newsletterOptionField = NewsletterOptionField::where('name', $option)->findOne(); + if (!$newsletterOptionField) { + $newsletterOptionField = NewsletterOptionField::create(); + $newsletterOptionField->name = $option; + $newsletterOptionField->newsletterType = Newsletter::TYPE_AUTOMATIC; + $newsletterOptionField->save(); + expect($newsletterOptionField->getErrors())->false(); + } + + $newsletterOption = NewsletterOption::create(); + $newsletterOption->optionFieldId = (int)$newsletterOptionField->id; + $newsletterOption->newsletterId = $newsletterId; + $newsletterOption->value = $value; + $newsletterOption->save(); + expect($newsletterOption->getErrors())->false(); + } + } + public function _after() { Carbon::setTestNow(); - $this->truncateEntity(NewsletterEntity::class); - $this->truncateEntity(NewsletterOptionEntity::class); - $this->truncateEntity(NewsletterOptionFieldEntity::class); + ORM::raw_execute('TRUNCATE ' . Newsletter::$_table); + ORM::raw_execute('TRUNCATE ' . NewsletterOption::$_table); + ORM::raw_execute('TRUNCATE ' . NewsletterOptionField::$_table); $this->truncateEntity(NewsletterPostEntity::class); - $this->truncateEntity(ScheduledTaskEntity::class); - $this->truncateEntity(ScheduledTaskSubscriberEntity::class); - $this->truncateEntity(SendingQueueEntity::class); - $this->truncateEntity(SubscriberEntity::class); + ORM::raw_execute('TRUNCATE ' . ScheduledTask::$_table); + ORM::raw_execute('TRUNCATE ' . ScheduledTaskSubscriber::$_table); + ORM::raw_execute('TRUNCATE ' . SendingQueue::$_table); + ORM::raw_execute('TRUNCATE ' . Subscriber::$_table); } }