Move getWooCommerceSegmentSubscriber() from helper to model

[MAILPOET-2382]
This commit is contained in:
Jan Jakeš
2019-10-03 15:31:16 +02:00
committed by Jack Kitterhing
parent dd45a96b94
commit 25d9ffa656
8 changed files with 74 additions and 76 deletions

View File

@ -160,7 +160,7 @@ class FirstPurchase {
'order_id' => $order_details->get_id(), 'order_id' => $order_details->get_id(),
]; ];
$subscriber = $this->premium_helper->getWooCommerceSegmentSubscriber($customer_email); $subscriber = Subscriber::getWooCommerceSegmentSubscriber($customer_email);
if (!$subscriber instanceof Subscriber) { if (!$subscriber instanceof Subscriber) {
Logger::getLogger(self::SLUG)->addInfo( Logger::getLogger(self::SLUG)->addInfo(

View File

@ -2,7 +2,6 @@
namespace MailPoet\AutomaticEmails\WooCommerce\Events; namespace MailPoet\AutomaticEmails\WooCommerce\Events;
use MailPoet\AutomaticEmails\WooCommerce\Helper as WCPremiumHelper;
use MailPoet\AutomaticEmails\WooCommerce\WooCommerce; use MailPoet\AutomaticEmails\WooCommerce\WooCommerce;
use MailPoet\Logging\Logger; use MailPoet\Logging\Logger;
use MailPoet\Models\Subscriber; use MailPoet\Models\Subscriber;
@ -18,21 +17,14 @@ class PurchasedInCategory {
/** @var WCHelper */ /** @var WCHelper */
private $woocommerce_helper; private $woocommerce_helper;
/** @var WCPremiumHelper */
private $premium_helper;
/** @var AutomaticEmailScheduler */ /** @var AutomaticEmailScheduler */
private $scheduler; private $scheduler;
function __construct(WCHelper $woocommerce_helper = null, WCPremiumHelper $premium_helper = null) { function __construct(WCHelper $woocommerce_helper = null) {
if ($woocommerce_helper === null) { if ($woocommerce_helper === null) {
$woocommerce_helper = new WCHelper(); $woocommerce_helper = new WCHelper();
} }
if ($premium_helper === null) {
$premium_helper = new WCPremiumHelper;
}
$this->woocommerce_helper = $woocommerce_helper; $this->woocommerce_helper = $woocommerce_helper;
$this->premium_helper = $premium_helper;
$this->scheduler = new AutomaticEmailScheduler(); $this->scheduler = new AutomaticEmailScheduler();
} }
@ -101,7 +93,7 @@ class PurchasedInCategory {
} }
$customer_email = $order_details->get_billing_email(); $customer_email = $order_details->get_billing_email();
$subscriber = $this->premium_helper->getWooCommerceSegmentSubscriber($customer_email); $subscriber = Subscriber::getWooCommerceSegmentSubscriber($customer_email);
if (!$subscriber instanceof Subscriber) { if (!$subscriber instanceof Subscriber) {
Logger::getLogger(self::SLUG)->addInfo( Logger::getLogger(self::SLUG)->addInfo(

View File

@ -2,7 +2,6 @@
namespace MailPoet\AutomaticEmails\WooCommerce\Events; namespace MailPoet\AutomaticEmails\WooCommerce\Events;
use MailPoet\AutomaticEmails\WooCommerce\Helper as WCPremiumHelper;
use MailPoet\AutomaticEmails\WooCommerce\WooCommerce; use MailPoet\AutomaticEmails\WooCommerce\WooCommerce;
use MailPoet\Logging\Logger; use MailPoet\Logging\Logger;
use MailPoet\Models\Subscriber; use MailPoet\Models\Subscriber;
@ -19,23 +18,14 @@ class PurchasedProduct {
*/ */
private $helper; private $helper;
/**
* @var WCPremiumHelper
*/
private $premium_helper;
/** @var AutomaticEmailScheduler */ /** @var AutomaticEmailScheduler */
private $scheduler; private $scheduler;
function __construct(WCHelper $helper = null, WCPremiumHelper $premium_helper = null) { function __construct(WCHelper $helper = null) {
if ($helper === null) { if ($helper === null) {
$helper = new WCHelper(); $helper = new WCHelper();
} }
if ($premium_helper === null) {
$premium_helper = new WCPremiumHelper;
}
$this->helper = $helper; $this->helper = $helper;
$this->premium_helper = $premium_helper;
$this->scheduler = new AutomaticEmailScheduler(); $this->scheduler = new AutomaticEmailScheduler();
} }
@ -113,7 +103,7 @@ class PurchasedProduct {
} }
$customer_email = $order_details->get_billing_email(); $customer_email = $order_details->get_billing_email();
$subscriber = $this->premium_helper->getWooCommerceSegmentSubscriber($customer_email); $subscriber = Subscriber::getWooCommerceSegmentSubscriber($customer_email);
if (!$subscriber instanceof Subscriber) { if (!$subscriber instanceof Subscriber) {
Logger::getLogger(self::SLUG)->addInfo( Logger::getLogger(self::SLUG)->addInfo(

View File

@ -29,27 +29,6 @@ class Helper {
$this->helper = $helper; $this->helper = $helper;
} }
/**
* @param string $customer_email
* @return bool|Subscriber
*/
function getWooCommerceSegmentSubscriber($customer_email) {
$wc_segment = Segment::getWooCommerceSegment();
return Subscriber::tableAlias('subscribers')
->select('subscribers.*')
->where('subscribers.email', $customer_email)
->join(
MP_SUBSCRIBER_SEGMENT_TABLE,
'relation.subscriber_id = subscribers.id',
'relation'
)
->where('relation.segment_id', $wc_segment->id)
->where('relation.status', Subscriber::STATUS_SUBSCRIBED)
->where('subscribers.status', Subscriber::STATUS_SUBSCRIBED)
->where('subscribers.is_woocommerce_user', 1)
->findOne();
}
function getCustomerOrderCount($customer_email) { function getCustomerOrderCount($customer_email) {
// registered user // registered user
$user = $this->wp->getUserBy('email', $customer_email); $user = $this->wp->getUserBy('email', $customer_email);

View File

@ -344,6 +344,27 @@ class Subscriber extends Model {
return $subscribers; return $subscribers;
} }
/**
* @param string $customer_email
* @return bool|Subscriber
*/
static function getWooCommerceSegmentSubscriber($customer_email) {
$wc_segment = Segment::getWooCommerceSegment();
return Subscriber::tableAlias('subscribers')
->select('subscribers.*')
->where('subscribers.email', $customer_email)
->join(
MP_SUBSCRIBER_SEGMENT_TABLE,
'relation.subscriber_id = subscribers.id',
'relation'
)
->where('relation.segment_id', $wc_segment->id)
->where('relation.status', Subscriber::STATUS_SUBSCRIBED)
->where('subscribers.status', Subscriber::STATUS_SUBSCRIBED)
->where('subscribers.is_woocommerce_user', 1)
->findOne();
}
function customFields() { function customFields() {
return $this->hasManyThrough( return $this->hasManyThrough(
__NAMESPACE__ . '\CustomField', __NAMESPACE__ . '\CustomField',

View File

@ -13,8 +13,10 @@ use MailPoet\Models\NewsletterOption;
use MailPoet\Models\NewsletterOptionField; use MailPoet\Models\NewsletterOptionField;
use MailPoet\Models\ScheduledTask; use MailPoet\Models\ScheduledTask;
use MailPoet\Models\ScheduledTaskSubscriber; use MailPoet\Models\ScheduledTaskSubscriber;
use MailPoet\Models\Segment;
use MailPoet\Models\SendingQueue; use MailPoet\Models\SendingQueue;
use MailPoet\Models\Subscriber; use MailPoet\Models\Subscriber;
use MailPoet\Models\SubscriberSegment;
use MailPoet\Tasks\Sending; use MailPoet\Tasks\Sending;
use MailPoet\WooCommerce\Helper as WCHelper; use MailPoet\WooCommerce\Helper as WCHelper;
use MailPoet\WP\Functions as WPFunctions; use MailPoet\WP\Functions as WPFunctions;
@ -229,7 +231,17 @@ class FirstPurchaseTest extends \MailPoetTest {
$subscriber = Subscriber::createOrUpdate(Fixtures::get('subscriber_template')); $subscriber = Subscriber::createOrUpdate(Fixtures::get('subscriber_template'));
$subscriber->email = $customer_email; $subscriber->email = $customer_email;
$subscriber->is_woocommerce_user = 1; $subscriber->is_woocommerce_user = 1;
$subscriber->status = Subscriber::STATUS_SUBSCRIBED;
$subscriber->save(); $subscriber->save();
$subscriber_segment = SubscriberSegment::create();
$subscriber_segment->hydrate([
'subscriber_id' => $subscriber->id,
'segment_id' => Segment::getWooCommerceSegment()->id,
'status' => Subscriber::STATUS_SUBSCRIBED,
]);
$subscriber_segment->save();
$date_created = new \DateTime('2018-12-12'); $date_created = new \DateTime('2018-12-12');
$helper = Stub::make(WCHelper::class, [ $helper = Stub::make(WCHelper::class, [
'wcGetOrder' => function($order_id) use ($customer_email, $date_created) { 'wcGetOrder' => function($order_id) use ($customer_email, $date_created) {
@ -245,13 +257,8 @@ class FirstPurchaseTest extends \MailPoetTest {
return $order_details; return $order_details;
}, },
]); ]);
$premium_helper = Stub::make(new WCPremiumHelper, [
'getCustomerOrderCount' => 1, $event = new FirstPurchase($helper);
'getWooCommerceSegmentSubscriber' => function () use ($subscriber) {
return $subscriber;
},
]);
$event = new FirstPurchase($helper, $premium_helper);
$event->init(); $event->init();
$order_id = 12; $order_id = 12;

View File

@ -3,15 +3,16 @@
namespace MailPoet\AutomaticEmails\WooCommerce\Events; namespace MailPoet\AutomaticEmails\WooCommerce\Events;
use Codeception\Util\Fixtures; use Codeception\Util\Fixtures;
use MailPoet\AutomaticEmails\WooCommerce\Helper as WCPremiumHelper;
use MailPoet\AutomaticEmails\WooCommerce\WooCommerce; use MailPoet\AutomaticEmails\WooCommerce\WooCommerce;
use MailPoet\Models\Newsletter; use MailPoet\Models\Newsletter;
use MailPoet\Models\NewsletterOption; use MailPoet\Models\NewsletterOption;
use MailPoet\Models\NewsletterOptionField; use MailPoet\Models\NewsletterOptionField;
use MailPoet\Models\ScheduledTask; use MailPoet\Models\ScheduledTask;
use MailPoet\Models\ScheduledTaskSubscriber; use MailPoet\Models\ScheduledTaskSubscriber;
use MailPoet\Models\Segment;
use MailPoet\Models\SendingQueue; use MailPoet\Models\SendingQueue;
use MailPoet\Models\Subscriber; use MailPoet\Models\Subscriber;
use MailPoet\Models\SubscriberSegment;
use MailPoet\Tasks\Sending; use MailPoet\Tasks\Sending;
use MailPoet\WooCommerce\Helper as WCHelper; use MailPoet\WooCommerce\Helper as WCHelper;
use MailPoet\WP\Functions as WPFunctions; use MailPoet\WP\Functions as WPFunctions;
@ -21,9 +22,6 @@ class PurchasedInCategoryTest extends \MailPoetTest {
/** @var WCHelper */ /** @var WCHelper */
private $woocommerce_helper; private $woocommerce_helper;
/** @var WCPremiumHelper */
private $premium_helper;
/** @var PurchasedInCategory */ /** @var PurchasedInCategory */
private $event; private $event;
@ -38,8 +36,7 @@ class PurchasedInCategoryTest extends \MailPoetTest {
WPFunctions::set(new WPFunctions); WPFunctions::set(new WPFunctions);
WPFunctions::get()->removeAllFilters('woocommerce_payment_complete'); WPFunctions::get()->removeAllFilters('woocommerce_payment_complete');
$this->woocommerce_helper = $this->makeEmpty(WCHelper::class, []); $this->woocommerce_helper = $this->makeEmpty(WCHelper::class, []);
$this->premium_helper = $this->makeEmpty(WCPremiumHelper::class, []); $this->event = new PurchasedInCategory($this->woocommerce_helper);
$this->event = new PurchasedInCategory($this->woocommerce_helper, $this->premium_helper);
} }
function testItGetsEventDetails() { function testItGetsEventDetails() {
@ -66,11 +63,6 @@ class PurchasedInCategoryTest extends \MailPoetTest {
->expects($this->atLeastOnce()) ->expects($this->atLeastOnce())
->method('get_billing_email') ->method('get_billing_email')
->will($this->returnValue('email@example.com')); ->will($this->returnValue('email@example.com'));
$this->premium_helper
->expects($this->once())
->method('getWooCommerceSegmentSubscriber')
->with($this->equalTo('email@example.com'))
->will($this->returnValue(false));
$this->event->scheduleEmail(2); $this->event->scheduleEmail(2);
} }
@ -98,6 +90,8 @@ class PurchasedInCategoryTest extends \MailPoetTest {
], ],
$newsletter->id $newsletter->id
); );
$customer_email = 'email@example.com';
$order = $this->getOrderMock(['15', '16']); $order = $this->getOrderMock(['15', '16']);
$this->woocommerce_helper $this->woocommerce_helper
->expects($this->once()) ->expects($this->once())
@ -106,13 +100,22 @@ class PurchasedInCategoryTest extends \MailPoetTest {
$order $order
->expects($this->atLeastOnce()) ->expects($this->atLeastOnce())
->method('get_billing_email') ->method('get_billing_email')
->will($this->returnValue('email@example.com')); ->will($this->returnValue($customer_email));
$subscriber = Subscriber::createOrUpdate(Fixtures::get('subscriber_template')); $subscriber = Subscriber::createOrUpdate(Fixtures::get('subscriber_template'));
$this->premium_helper $subscriber->email = $customer_email;
->expects($this->once()) $subscriber->is_woocommerce_user = 1;
->method('getWooCommerceSegmentSubscriber') $subscriber->status = Subscriber::STATUS_SUBSCRIBED;
->with($this->equalTo('email@example.com')) $subscriber->save();
->will($this->returnValue($subscriber));
$subscriber_segment = SubscriberSegment::create();
$subscriber_segment->hydrate([
'subscriber_id' => $subscriber->id,
'segment_id' => Segment::getWooCommerceSegment()->id,
'status' => Subscriber::STATUS_SUBSCRIBED,
]);
$subscriber_segment->save();
$this->event->scheduleEmail(3); $this->event->scheduleEmail(3);
$scheduled_task = Sending::getByNewsletterId($newsletter->id); $scheduled_task = Sending::getByNewsletterId($newsletter->id);
expect($scheduled_task)->notEmpty(); expect($scheduled_task)->notEmpty();

View File

@ -5,7 +5,6 @@ namespace MailPoet\AutomaticEmails\WooCommerce\Events;
use Codeception\Stub; use Codeception\Stub;
use Codeception\Stub\Expected; use Codeception\Stub\Expected;
use Codeception\Util\Fixtures; use Codeception\Util\Fixtures;
use MailPoet\AutomaticEmails\WooCommerce\Helper as WCPremiumHelper;
use MailPoet\AutomaticEmails\WooCommerce\WooCommerce; use MailPoet\AutomaticEmails\WooCommerce\WooCommerce;
use MailPoet\AutomaticEmails\WooCommerce\WooCommerceStubs\ItemDetails; use MailPoet\AutomaticEmails\WooCommerce\WooCommerceStubs\ItemDetails;
use MailPoet\AutomaticEmails\WooCommerce\WooCommerceStubs\OrderDetails; use MailPoet\AutomaticEmails\WooCommerce\WooCommerceStubs\OrderDetails;
@ -14,13 +13,16 @@ use MailPoet\Models\NewsletterOption;
use MailPoet\Models\NewsletterOptionField; use MailPoet\Models\NewsletterOptionField;
use MailPoet\Models\ScheduledTask; use MailPoet\Models\ScheduledTask;
use MailPoet\Models\ScheduledTaskSubscriber; use MailPoet\Models\ScheduledTaskSubscriber;
use MailPoet\Models\Segment;
use MailPoet\Models\SendingQueue; use MailPoet\Models\SendingQueue;
use MailPoet\Models\Subscriber; use MailPoet\Models\Subscriber;
use MailPoet\Models\SubscriberSegment;
use MailPoet\Tasks\Sending; use MailPoet\Tasks\Sending;
use MailPoet\WooCommerce\Helper as WCHelper; use MailPoet\WooCommerce\Helper as WCHelper;
use MailPoet\WP\Functions as WPFunctions; use MailPoet\WP\Functions as WPFunctions;
require_once __DIR__ . '/../WooCommerceStubs/ItemDetails.php'; require_once __DIR__ . '/../WooCommerceStubs/ItemDetails.php';
require_once __DIR__ . '/../WooCommerceStubs/OrderDetails.php';
class PurchasedProductTest extends \MailPoetTest { class PurchasedProductTest extends \MailPoetTest {
function _before() { function _before() {
@ -200,8 +202,17 @@ class PurchasedProductTest extends \MailPoetTest {
$subscriber = Subscriber::createOrUpdate(Fixtures::get('subscriber_template')); $subscriber = Subscriber::createOrUpdate(Fixtures::get('subscriber_template'));
$subscriber->email = $customer_email; $subscriber->email = $customer_email;
$subscriber->is_woocommerce_user = 1; $subscriber->is_woocommerce_user = 1;
$subscriber->status = Subscriber::STATUS_SUBSCRIBED;
$subscriber->save(); $subscriber->save();
$subscriber_segment = SubscriberSegment::create();
$subscriber_segment->hydrate([
'subscriber_id' => $subscriber->id,
'segment_id' => Segment::getWooCommerceSegment()->id,
'status' => Subscriber::STATUS_SUBSCRIBED,
]);
$subscriber_segment->save();
$order_details = Stub::make( $order_details = Stub::make(
new OrderDetails(), new OrderDetails(),
[ [
@ -229,13 +240,8 @@ class PurchasedProductTest extends \MailPoetTest {
$helper = Stub::make(WCHelper::class, [ $helper = Stub::make(WCHelper::class, [
'wcGetOrder' => $order_details, 'wcGetOrder' => $order_details,
]); ]);
$premium_helper = Stub::make(new WCPremiumHelper, [
'getCustomerOrderCount' => 1, $event = new PurchasedProduct($helper);
'getWooCommerceSegmentSubscriber' => function () use ($subscriber) {
return $subscriber;
},
]);
$event = new PurchasedProduct($helper, $premium_helper);
// ensure there are no existing scheduled tasks // ensure there are no existing scheduled tasks
$scheduled_task = Sending::getByNewsletterId($newsletter->id); $scheduled_task = Sending::getByNewsletterId($newsletter->id);