Use DI to create WooCommerce email

[MAILPOET-3924]
This commit is contained in:
Jan Jakes
2021-12-09 14:27:00 +01:00
committed by Veljko V
parent 9f32f05933
commit 3b85f89f3c
6 changed files with 62 additions and 50 deletions

View File

@@ -0,0 +1,21 @@
<?php declare(strict_types=1);
namespace MailPoet\AutomaticEmails;
use MailPoet\AutomaticEmails\WooCommerce\WooCommerce;
use MailPoet\DI\ContainerWrapper;
class AutomaticEmailFactory {
/** @var ContainerWrapper */
private $container;
public function __construct(
ContainerWrapper $container
) {
$this->container = $container;
}
public function createWooCommerceEmail(): WooCommerce {
return $this->container->get(WooCommerce::class);
}
}

View File

@@ -3,7 +3,6 @@
namespace MailPoet\AutomaticEmails;
use MailPoet\WP\Functions as WPFunctions;
use MailPoet\WP\Notice;
class AutomaticEmails {
const FILTER_PREFIX = 'mailpoet_automatic_email_';
@@ -14,38 +13,20 @@ class AutomaticEmails {
/** @var array|null */
private $automaticEmails;
public $availableGroups = [
'WooCommerce',
];
/** @var AutomaticEmailFactory */
private $automaticEmailFactory;
public function __construct(
WPFunctions $wp
WPFunctions $wp,
AutomaticEmailFactory $automaticEmailFactory
) {
$this->wp = $wp;
$this->automaticEmailFactory = $automaticEmailFactory;
}
public function init() {
foreach ($this->availableGroups as $group) {
$groupClass = sprintf(
'%1$s\%2$s\%2$s',
__NAMESPACE__,
$group
);
if (!class_exists($groupClass)) {
$this->displayGroupWarning($group);
continue;
}
$groupInstance = new $groupClass();
if (method_exists($groupInstance, 'init')) {
$groupInstance->init();
} else {
$this->displayGroupWarning($group);
continue;
}
}
$instance = $this->automaticEmailFactory->createWooCommerceEmail();
$instance->init();
}
public function getAutomaticEmails() {
@@ -151,12 +132,4 @@ class AutomaticEmails {
$this->automaticEmails = null;
}
private function displayGroupWarning($group) {
$notice = sprintf('%s %s',
sprintf(__('%s automatic email group is misconfigured.', 'mailpoet'), $group),
WPFunctions::get()->__('Please contact our technical support for assistance.', 'mailpoet')
);
Notice::displayWarning($notice);
}
}

View File

@@ -92,6 +92,8 @@ class ContainerConfigurator implements IContainerConfigurator {
$container->autowire(\MailPoet\API\JSON\ResponseBuilders\DynamicSegmentsResponseBuilder::class)->setPublic(true);
// Automatic emails
$container->autowire(\MailPoet\AutomaticEmails\AutomaticEmails::class)->setPublic(true);
$container->autowire(\MailPoet\AutomaticEmails\AutomaticEmailFactory::class)->setPublic(true);
$container->autowire(\MailPoet\AutomaticEmails\WooCommerce\WooCommerce::class)->setPublic(true);
// Config
$container->autowire(\MailPoet\Config\AccessControl::class)->setPublic(true);
$container->autowire(\MailPoet\Config\Activator::class)->setPublic(true);

View File

@@ -2,7 +2,10 @@
namespace MailPoet\API\JSON\v1;
use MailPoet\AutomaticEmails\AutomaticEmailFactory;
use MailPoet\AutomaticEmails\AutomaticEmails as AutomaticEmailsController;
use MailPoet\AutomaticEmails\WooCommerce\WooCommerce;
use MailPoet\WooCommerce\Helper;
use MailPoet\WP\Functions as WPFunctions;
class AutomaticEmailsTest extends \MailPoetTest {
@@ -13,7 +16,11 @@ class AutomaticEmailsTest extends \MailPoetTest {
public function _before() {
$this->wp = new WPFunctions;
$this->api = new AutomaticEmails(new AutomaticEmailsController($this->wp), $this->wp);
$automaticEmailFactory = $this->makeEmpty(AutomaticEmailFactory::class, [
'createWooCommerceEmail' => new WooCommerce($this->wp, new Helper()),
]);
$this->api = new AutomaticEmails(new AutomaticEmailsController($this->wp, $automaticEmailFactory), $this->wp);
}
public function testItRequiresProperlyFormattedRequestWhenGettingEventOptions() {

View File

@@ -2,15 +2,22 @@
namespace MailPoet\AutomaticEmails;
use MailPoet\AutomaticEmails\WooCommerce\WooCommerce;
use MailPoet\WP\Functions as WPFunctions;
class AutomaticEmailsTest extends \MailPoetTest {
public $wp;
public $AM;
/** @var AutomaticEmailFactory */
private $automaticEmailFactory;
public function _before() {
$this->wp = new WPFunctions();
$this->AM = new AutomaticEmails($this->wp);
$this->automaticEmailFactory = $this->makeEmpty(AutomaticEmailFactory::class, [
'createWooCommerceEmail' => new WooCommerce(),
]);
$this->AM = new AutomaticEmails($this->wp, $this->automaticEmailFactory);
}
public function testItCanUnregisterAutomaticEmails() {
@@ -37,14 +44,6 @@ class AutomaticEmailsTest extends \MailPoetTest {
expect($result)->null();
}
public function testItReturnsNullWhenThereAreNoRegisteredAutomaticEmails() {
$AM = $this->AM;
$AM->unregisterAutomaticEmails();
$AM->availableGroups = [];
$AM->init();
expect($AM->getAutomaticEmails())->null();
}
public function testItGetsAutomaticEmails() {
$this->wp->addFilter('mailpoet_automatic_email_test1', function() {
return [

View File

@@ -3,6 +3,7 @@
namespace MailPoet\AutomaticEmails\WooCommerce;
use Codeception\Util\Stub;
use MailPoet\AutomaticEmails\AutomaticEmailFactory;
use MailPoet\AutomaticEmails\AutomaticEmails;
use MailPoet\AutomaticEmails\WooCommerce\Events\AbandonedCart;
use MailPoet\AutomaticEmails\WooCommerce\Events\FirstPurchase;
@@ -11,13 +12,22 @@ use MailPoet\AutomaticEmails\WooCommerce\Events\PurchasedProduct;
use MailPoet\WP\Functions as WPFunctions;
class WooCommerceTest extends \MailPoetTest {
/** @var AutomaticEmailFactory */
private $automaticEmailFactory;
public function _before() {
$this->automaticEmailFactory = $this->makeEmpty(AutomaticEmailFactory::class, [
'createWooCommerceEmail' => new WooCommerce(),
]);
}
public function testItRegistersAbandonedCartEvent() {
$WC = Stub::make(new WooCommerce(), ['isWoocommerceEnabled' => true]);
$WC->__construct();
$WC->init();
// event is registered
$AM = new AutomaticEmails(new WPFunctions());
$AM = new AutomaticEmails(new WPFunctions(), $this->automaticEmailFactory);
$result = $AM->getAutomaticEmailEventBySlug(WooCommerce::SLUG, AbandonedCart::SLUG);
expect($result)->notEmpty();
}
@@ -28,7 +38,7 @@ class WooCommerceTest extends \MailPoetTest {
$WC->init();
// event is registered
$AM = new AutomaticEmails(new WPFunctions());
$AM = new AutomaticEmails(new WPFunctions(), $this->automaticEmailFactory);
$result = $AM->getAutomaticEmailEventBySlug(WooCommerce::SLUG, FirstPurchase::SLUG);
expect($result)->notEmpty();
@@ -44,7 +54,7 @@ class WooCommerceTest extends \MailPoetTest {
$WC->init();
// event is registered
$AM = new AutomaticEmails(new WPFunctions());
$AM = new AutomaticEmails(new WPFunctions(), $this->automaticEmailFactory);
$result = $AM->getAutomaticEmailEventBySlug(WooCommerce::SLUG, PurchasedInCategory::SLUG);
expect($result)->notEmpty();
}
@@ -55,7 +65,7 @@ class WooCommerceTest extends \MailPoetTest {
$WC->init();
// event is registered
$AM = new AutomaticEmails(new WPFunctions());
$AM = new AutomaticEmails(new WPFunctions(), $this->automaticEmailFactory);
$result = $AM->getAutomaticEmailEventBySlug(WooCommerce::SLUG, PurchasedProduct::SLUG);
expect($result)->notEmpty();
@@ -69,7 +79,7 @@ class WooCommerceTest extends \MailPoetTest {
$WC = Stub::make(new WooCommerce(), ['isWoocommerceEnabled' => false]);
$WC->__construct();
$WC->init();
$AM = new AutomaticEmails(new WPFunctions());
$AM = new AutomaticEmails(new WPFunctions(), $this->automaticEmailFactory);
$result = $AM->getAutomaticEmailBySlug('woocommerce');
foreach ($result['events'] as $event) {
expect($event['actionButtonTitle'])->equals('WooCommerce is required');
@@ -79,7 +89,7 @@ class WooCommerceTest extends \MailPoetTest {
$WC = Stub::make(new WooCommerce(), ['isWoocommerceEnabled' => true]);
$WC->__construct();
$WC->init();
$AM = new AutomaticEmails(new WPFunctions());
$AM = new AutomaticEmails(new WPFunctions(), $this->automaticEmailFactory);
$result = $AM->getAutomaticEmailBySlug('woocommerce');
foreach ($result['events'] as $event) {
expect($event)->hasNotKey('actionButtonTitle');