From be59a1a46a5a1a76f70f83081a8257d6b0ad2175 Mon Sep 17 00:00:00 2001 From: Jan Jakes Date: Thu, 9 Dec 2021 15:23:34 +0100 Subject: [PATCH] Use DI to create WooCommerce event emails [MAILPOET-3924] --- .../WooCommerce/WooCommerce.php | 19 ++++----- .../WooCommerce/WooCommerceEventFactory.php | 39 +++++++++++++++++++ lib/DI/ContainerConfigurator.php | 5 +++ .../API/JSON/v1/AutomaticEmailsTest.php | 4 +- .../AutomaticEmails/AutomaticEmailsTest.php | 7 +++- .../WooCommerce/WooCommerceTest.php | 8 +++- 6 files changed, 69 insertions(+), 13 deletions(-) create mode 100644 lib/AutomaticEmails/WooCommerce/WooCommerceEventFactory.php diff --git a/lib/AutomaticEmails/WooCommerce/WooCommerce.php b/lib/AutomaticEmails/WooCommerce/WooCommerce.php index 7c1537271a..3562364dd3 100644 --- a/lib/AutomaticEmails/WooCommerce/WooCommerce.php +++ b/lib/AutomaticEmails/WooCommerce/WooCommerce.php @@ -28,13 +28,18 @@ class WooCommerce { /** @var WPFunctions */ private $wp; + /** @var WooCommerceEventFactory */ + private $eventFactory; + public function __construct( WPFunctions $wp, - WooCommerceHelper $woocommerceHelper + WooCommerceHelper $woocommerceHelper, + WooCommerceEventFactory $eventFactory ) { $this->wp = $wp; $this->woocommerceHelper = $woocommerceHelper; $this->woocommerceEnabled = $this->isWoocommerceEnabled(); + $this->eventFactory = $eventFactory; } public function init() { @@ -70,19 +75,15 @@ class WooCommerce { ] : []; foreach ($this->availableEvents as $event) { - $eventClass = sprintf( - '%s\Events\%s', - __NAMESPACE__, - $event - ); + $eventInstance = in_array($event, $this->availableEvents, true) + ? $this->eventFactory->createEvent($event) + : null; - if (!class_exists($eventClass)) { + if (!$eventInstance) { $this->displayEventWarning($event); continue; } - $eventInstance = new $eventClass(); - if (method_exists($eventInstance, 'init')) { $eventInstance->init(); } else { diff --git a/lib/AutomaticEmails/WooCommerce/WooCommerceEventFactory.php b/lib/AutomaticEmails/WooCommerce/WooCommerceEventFactory.php new file mode 100644 index 0000000000..9ee5dc2b77 --- /dev/null +++ b/lib/AutomaticEmails/WooCommerce/WooCommerceEventFactory.php @@ -0,0 +1,39 @@ + AbandonedCart::class, + 'FirstPurchase' => FirstPurchase::class, + 'PurchasedInCategory' => PurchasedInCategory::class, + 'PurchasedProduct' => PurchasedProduct::class, + ]; + + /** @var ContainerWrapper */ + private $container; + + public function __construct( + ContainerWrapper $container + ) { + $this->container = $container; + } + + /** @return object|null */ + public function createEvent(string $eventName) { + $eventClass = self::EVENTS_MAP[$eventName] ?? null; + + try { + return $eventClass ? $this->container->get($eventClass) : null; + } catch (ServiceNotFoundException $e) { + return null; + } + } +} diff --git a/lib/DI/ContainerConfigurator.php b/lib/DI/ContainerConfigurator.php index 6696f8815d..7dd6c0156b 100644 --- a/lib/DI/ContainerConfigurator.php +++ b/lib/DI/ContainerConfigurator.php @@ -94,6 +94,11 @@ class ContainerConfigurator implements IContainerConfigurator { $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); + $container->autowire(\MailPoet\AutomaticEmails\WooCommerce\WooCommerceEventFactory::class)->setPublic(true); + $container->autowire(\MailPoet\AutomaticEmails\WooCommerce\Events\AbandonedCart::class)->setPublic(true); + $container->autowire(\MailPoet\AutomaticEmails\WooCommerce\Events\FirstPurchase::class)->setPublic(true); + $container->autowire(\MailPoet\AutomaticEmails\WooCommerce\Events\PurchasedInCategory::class)->setPublic(true); + $container->autowire(\MailPoet\AutomaticEmails\WooCommerce\Events\PurchasedProduct::class)->setPublic(true); // Config $container->autowire(\MailPoet\Config\AccessControl::class)->setPublic(true); $container->autowire(\MailPoet\Config\Activator::class)->setPublic(true); diff --git a/tests/integration/API/JSON/v1/AutomaticEmailsTest.php b/tests/integration/API/JSON/v1/AutomaticEmailsTest.php index 99af5878f3..d9d6486b66 100644 --- a/tests/integration/API/JSON/v1/AutomaticEmailsTest.php +++ b/tests/integration/API/JSON/v1/AutomaticEmailsTest.php @@ -5,6 +5,7 @@ namespace MailPoet\API\JSON\v1; use MailPoet\AutomaticEmails\AutomaticEmailFactory; use MailPoet\AutomaticEmails\AutomaticEmails as AutomaticEmailsController; use MailPoet\AutomaticEmails\WooCommerce\WooCommerce; +use MailPoet\AutomaticEmails\WooCommerce\WooCommerceEventFactory; use MailPoet\WooCommerce\Helper; use MailPoet\WP\Functions as WPFunctions; @@ -17,8 +18,9 @@ class AutomaticEmailsTest extends \MailPoetTest { public function _before() { $this->wp = new WPFunctions; + $wooCommerceEventFactory = $this->diContainer->get(WooCommerceEventFactory::class); $automaticEmailFactory = $this->makeEmpty(AutomaticEmailFactory::class, [ - 'createWooCommerceEmail' => new WooCommerce($this->wp, new Helper()), + 'createWooCommerceEmail' => new WooCommerce($this->wp, new Helper(), $wooCommerceEventFactory), ]); $this->api = new AutomaticEmails(new AutomaticEmailsController($this->wp, $automaticEmailFactory), $this->wp); } diff --git a/tests/integration/AutomaticEmails/AutomaticEmailsTest.php b/tests/integration/AutomaticEmails/AutomaticEmailsTest.php index 7a029a6f7e..a3317480f0 100644 --- a/tests/integration/AutomaticEmails/AutomaticEmailsTest.php +++ b/tests/integration/AutomaticEmails/AutomaticEmailsTest.php @@ -3,6 +3,7 @@ namespace MailPoet\AutomaticEmails; use MailPoet\AutomaticEmails\WooCommerce\WooCommerce; +use MailPoet\AutomaticEmails\WooCommerce\WooCommerceEventFactory; use MailPoet\WooCommerce\Helper; use MailPoet\WP\Functions as WPFunctions; @@ -10,13 +11,17 @@ class AutomaticEmailsTest extends \MailPoetTest { public $wp; public $AM; + /** @var WooCommerceEventFactory */ + private $wooCommerceEventFactory; + /** @var AutomaticEmailFactory */ private $automaticEmailFactory; public function _before() { $this->wp = new WPFunctions(); + $this->wooCommerceEventFactory = $this->diContainer->get(WooCommerceEventFactory::class); $this->automaticEmailFactory = $this->makeEmpty(AutomaticEmailFactory::class, [ - 'createWooCommerceEmail' => new WooCommerce($this->wp, new Helper()), + 'createWooCommerceEmail' => new WooCommerce($this->wp, new Helper(), $this->wooCommerceEventFactory), ]); $this->AM = new AutomaticEmails($this->wp, $this->automaticEmailFactory); } diff --git a/tests/integration/AutomaticEmails/WooCommerce/WooCommerceTest.php b/tests/integration/AutomaticEmails/WooCommerce/WooCommerceTest.php index adc3325baa..c9c4944040 100644 --- a/tests/integration/AutomaticEmails/WooCommerce/WooCommerceTest.php +++ b/tests/integration/AutomaticEmails/WooCommerce/WooCommerceTest.php @@ -12,12 +12,16 @@ use MailPoet\WooCommerce\Helper; use MailPoet\WP\Functions as WPFunctions; class WooCommerceTest extends \MailPoetTest { + /** @var WooCommerceEventFactory */ + private $wooCommerceEventFactory; + /** @var AutomaticEmailFactory */ private $automaticEmailFactory; public function _before() { + $this->wooCommerceEventFactory = $this->diContainer->get(WooCommerceEventFactory::class); $this->automaticEmailFactory = $this->makeEmpty(AutomaticEmailFactory::class, [ - 'createWooCommerceEmail' => new WooCommerce(new WPFunctions(), new Helper()), + 'createWooCommerceEmail' => new WooCommerce(new WPFunctions(), new Helper(), $this->wooCommerceEventFactory), ]); } @@ -103,7 +107,7 @@ class WooCommerceTest extends \MailPoetTest { private function createWooCommerceEmailMock(bool $isWoocommerceEnabled = true): WooCommerce { $mock = $this->make(WooCommerce::class, ['isWoocommerceEnabled' => $isWoocommerceEnabled]); - $mock->__construct(new WPFunctions(), new Helper()); + $mock->__construct(new WPFunctions(), new Helper(), $this->wooCommerceEventFactory); return $mock; } }