Split class to prevent circular dependency
[MAILPOET-2899]
This commit is contained in:
@ -12,7 +12,7 @@ use MailPoet\Util\ConflictResolver;
|
|||||||
use MailPoet\Util\Helpers;
|
use MailPoet\Util\Helpers;
|
||||||
use MailPoet\Util\Notices\PermanentNotices;
|
use MailPoet\Util\Notices\PermanentNotices;
|
||||||
use MailPoet\WooCommerce\Helper as WooCommerceHelper;
|
use MailPoet\WooCommerce\Helper as WooCommerceHelper;
|
||||||
use MailPoet\WooCommerce\TransactionalEmails as WCTransactionalEmails;
|
use MailPoet\WooCommerce\TransactionalEmailHooks as WCTransactionalEmails;
|
||||||
use MailPoet\WP\Functions as WPFunctions;
|
use MailPoet\WP\Functions as WPFunctions;
|
||||||
use MailPoet\WP\Notice as WPNotice;
|
use MailPoet\WP\Notice as WPNotice;
|
||||||
|
|
||||||
|
@ -298,6 +298,7 @@ class ContainerConfigurator implements IContainerConfigurator {
|
|||||||
$container->autowire(\MailPoet\WooCommerce\Helper::class)->setPublic(true);
|
$container->autowire(\MailPoet\WooCommerce\Helper::class)->setPublic(true);
|
||||||
$container->autowire(\MailPoet\WooCommerce\Settings::class)->setPublic(true);
|
$container->autowire(\MailPoet\WooCommerce\Settings::class)->setPublic(true);
|
||||||
$container->autowire(\MailPoet\WooCommerce\Subscription::class)->setPublic(true);
|
$container->autowire(\MailPoet\WooCommerce\Subscription::class)->setPublic(true);
|
||||||
|
$container->autowire(\MailPoet\WooCommerce\TransactionalEmailHooks::class)->setPublic(true);
|
||||||
$container->autowire(\MailPoet\WooCommerce\TransactionalEmails::class)->setPublic(true);
|
$container->autowire(\MailPoet\WooCommerce\TransactionalEmails::class)->setPublic(true);
|
||||||
$container->autowire(\MailPoet\WooCommerce\TransactionalEmails\Template::class)->setPublic(true);
|
$container->autowire(\MailPoet\WooCommerce\TransactionalEmails\Template::class)->setPublic(true);
|
||||||
$container->autowire(\MailPoet\WooCommerce\TransactionalEmails\Renderer::class)->setPublic(true);
|
$container->autowire(\MailPoet\WooCommerce\TransactionalEmails\Renderer::class)->setPublic(true);
|
||||||
|
75
lib/WooCommerce/TransactionalEmailHooks.php
Normal file
75
lib/WooCommerce/TransactionalEmailHooks.php
Normal file
@ -0,0 +1,75 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace MailPoet\WooCommerce;
|
||||||
|
|
||||||
|
use MailPoet\Entities\NewsletterEntity;
|
||||||
|
use MailPoet\Models\Newsletter;
|
||||||
|
use MailPoet\Settings\SettingsController;
|
||||||
|
use MailPoet\WooCommerce\TransactionalEmails\Renderer;
|
||||||
|
use MailPoet\WP\Functions as WPFunctions;
|
||||||
|
|
||||||
|
class TransactionalEmailHooks {
|
||||||
|
/** @var WPFunctions */
|
||||||
|
private $wp;
|
||||||
|
|
||||||
|
/** @var SettingsController */
|
||||||
|
private $settings;
|
||||||
|
|
||||||
|
/** @var Renderer */
|
||||||
|
private $renderer;
|
||||||
|
|
||||||
|
public function __construct(
|
||||||
|
WPFunctions $wp,
|
||||||
|
SettingsController $settings,
|
||||||
|
Renderer $renderer
|
||||||
|
) {
|
||||||
|
$this->wp = $wp;
|
||||||
|
$this->settings = $settings;
|
||||||
|
$this->renderer = $renderer;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function useTemplateForWoocommerceEmails() {
|
||||||
|
$this->wp->addAction('woocommerce_init', function() {
|
||||||
|
/** @var callable */
|
||||||
|
$emailHeaderCallback = [\WC()->mailer(), 'email_header'];
|
||||||
|
/** @var callable */
|
||||||
|
$emailFooterCallback = [\WC()->mailer(), 'email_footer'];
|
||||||
|
$this->wp->removeAction('woocommerce_email_header', $emailHeaderCallback);
|
||||||
|
$this->wp->removeAction('woocommerce_email_footer', $emailFooterCallback);
|
||||||
|
$this->wp->addAction('woocommerce_email_header', function($emailHeading) {
|
||||||
|
$this->renderer->render($this->getNewsletter());
|
||||||
|
echo $this->renderer->getHTMLBeforeContent($emailHeading);
|
||||||
|
});
|
||||||
|
$this->wp->addAction('woocommerce_email_footer', function() {
|
||||||
|
echo $this->renderer->getHTMLAfterContent();
|
||||||
|
});
|
||||||
|
$this->wp->addAction('woocommerce_email_styles', [$this->renderer, 'prefixCss']);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private function getNewsletter() {
|
||||||
|
return Newsletter::findOne($this->settings->get(TransactionalEmails::SETTING_EMAIL_ID));
|
||||||
|
}
|
||||||
|
|
||||||
|
public function enableEmailSettingsSyncToWooCommerce() {
|
||||||
|
$this->wp->addFilter('mailpoet_api_newsletters_save_after', [$this, 'syncEmailSettingsToWooCommerce']);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function syncEmailSettingsToWooCommerce(array $newsletterData) {
|
||||||
|
if ($newsletterData['type'] !== NewsletterEntity::TYPE_WC_TRANSACTIONAL_EMAIL) {
|
||||||
|
return $newsletterData;
|
||||||
|
}
|
||||||
|
|
||||||
|
$styles = $newsletterData['body']['globalStyles'];
|
||||||
|
$optionsToSync = [
|
||||||
|
'woocommerce_email_background_color' => $styles['body']['backgroundColor'],
|
||||||
|
'woocommerce_email_base_color' => $styles['woocommerce']['brandingColor'],
|
||||||
|
'woocommerce_email_body_background_color' => $styles['wrapper']['backgroundColor'],
|
||||||
|
'woocommerce_email_text_color' => $styles['text']['fontColor'],
|
||||||
|
];
|
||||||
|
foreach ($optionsToSync as $wcName => $value) {
|
||||||
|
$this->wp->updateOption($wcName, $value);
|
||||||
|
}
|
||||||
|
return $newsletterData;
|
||||||
|
}
|
||||||
|
}
|
@ -4,10 +4,8 @@ namespace MailPoet\WooCommerce;
|
|||||||
|
|
||||||
use MailPoet\Config\Env;
|
use MailPoet\Config\Env;
|
||||||
use MailPoet\Entities\NewsletterEntity;
|
use MailPoet\Entities\NewsletterEntity;
|
||||||
use MailPoet\Models\Newsletter;
|
|
||||||
use MailPoet\Newsletter\NewslettersRepository;
|
use MailPoet\Newsletter\NewslettersRepository;
|
||||||
use MailPoet\Settings\SettingsController;
|
use MailPoet\Settings\SettingsController;
|
||||||
use MailPoet\WooCommerce\TransactionalEmails\Renderer;
|
|
||||||
use MailPoet\WooCommerce\TransactionalEmails\Template;
|
use MailPoet\WooCommerce\TransactionalEmails\Template;
|
||||||
use MailPoet\WP\Functions as WPFunctions;
|
use MailPoet\WP\Functions as WPFunctions;
|
||||||
|
|
||||||
@ -26,20 +24,22 @@ class TransactionalEmails {
|
|||||||
/** @var Helper */
|
/** @var Helper */
|
||||||
private $woocommerceHelper;
|
private $woocommerceHelper;
|
||||||
|
|
||||||
/** @var Renderer */
|
|
||||||
private $renderer;
|
|
||||||
|
|
||||||
/** @var array */
|
/** @var array */
|
||||||
private $emailHeadings;
|
private $emailHeadings;
|
||||||
|
|
||||||
/** @var NewslettersRepository */
|
/** @var NewslettersRepository */
|
||||||
private $newslettersRepository;
|
private $newslettersRepository;
|
||||||
|
|
||||||
public function __construct(WPFunctions $wp, SettingsController $settings, Template $template, Renderer $renderer, Helper $woocommerceHelper, NewslettersRepository $newslettersRepository) {
|
public function __construct(
|
||||||
|
WPFunctions $wp,
|
||||||
|
SettingsController $settings,
|
||||||
|
Template $template,
|
||||||
|
Helper $woocommerceHelper,
|
||||||
|
NewslettersRepository $newslettersRepository
|
||||||
|
) {
|
||||||
$this->wp = $wp;
|
$this->wp = $wp;
|
||||||
$this->settings = $settings;
|
$this->settings = $settings;
|
||||||
$this->template = $template;
|
$this->template = $template;
|
||||||
$this->renderer = $renderer;
|
|
||||||
$this->woocommerceHelper = $woocommerceHelper;
|
$this->woocommerceHelper = $woocommerceHelper;
|
||||||
$this->newslettersRepository = $newslettersRepository;
|
$this->newslettersRepository = $newslettersRepository;
|
||||||
$this->emailHeadings = [
|
$this->emailHeadings = [
|
||||||
@ -84,25 +84,6 @@ class TransactionalEmails {
|
|||||||
return $values;
|
return $values;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function useTemplateForWoocommerceEmails() {
|
|
||||||
$this->wp->addAction('woocommerce_init', function() {
|
|
||||||
/** @var callable */
|
|
||||||
$emailHeaderCallback = [\WC()->mailer(), 'email_header'];
|
|
||||||
/** @var callable */
|
|
||||||
$emailFooterCallback = [\WC()->mailer(), 'email_footer'];
|
|
||||||
$this->wp->removeAction('woocommerce_email_header', $emailHeaderCallback);
|
|
||||||
$this->wp->removeAction('woocommerce_email_footer', $emailFooterCallback);
|
|
||||||
$this->wp->addAction('woocommerce_email_header', function($emailHeading) {
|
|
||||||
$this->renderer->render($this->getNewsletter());
|
|
||||||
echo $this->renderer->getHTMLBeforeContent($emailHeading);
|
|
||||||
});
|
|
||||||
$this->wp->addAction('woocommerce_email_footer', function() {
|
|
||||||
echo $this->renderer->getHTMLAfterContent();
|
|
||||||
});
|
|
||||||
$this->wp->addAction('woocommerce_email_styles', [$this->renderer, 'prefixCss']);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
private function createNewsletter() {
|
private function createNewsletter() {
|
||||||
$wcEmailSettings = $this->getWCEmailSettings();
|
$wcEmailSettings = $this->getWCEmailSettings();
|
||||||
$newsletter = new NewsletterEntity;
|
$newsletter = new NewsletterEntity;
|
||||||
@ -114,10 +95,6 @@ class TransactionalEmails {
|
|||||||
return $newsletter;
|
return $newsletter;
|
||||||
}
|
}
|
||||||
|
|
||||||
private function getNewsletter() {
|
|
||||||
return Newsletter::findOne($this->settings->get(self::SETTING_EMAIL_ID));
|
|
||||||
}
|
|
||||||
|
|
||||||
private function replacePlaceholders($text) {
|
private function replacePlaceholders($text) {
|
||||||
$title = $this->wp->wpSpecialcharsDecode($this->wp->getOption('blogname'), ENT_QUOTES);
|
$title = $this->wp->wpSpecialcharsDecode($this->wp->getOption('blogname'), ENT_QUOTES);
|
||||||
$address = $this->wp->wpParseUrl($this->wp->homeUrl(), PHP_URL_HOST);
|
$address = $this->wp->wpParseUrl($this->wp->homeUrl(), PHP_URL_HOST);
|
||||||
@ -129,28 +106,6 @@ class TransactionalEmails {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function enableEmailSettingsSyncToWooCommerce() {
|
|
||||||
$this->wp->addFilter('mailpoet_api_newsletters_save_after', [$this, 'syncEmailSettingsToWooCommerce']);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function syncEmailSettingsToWooCommerce(array $newsletterData) {
|
|
||||||
if ($newsletterData['type'] !== NewsletterEntity::TYPE_WC_TRANSACTIONAL_EMAIL) {
|
|
||||||
return $newsletterData;
|
|
||||||
}
|
|
||||||
|
|
||||||
$styles = $newsletterData['body']['globalStyles'];
|
|
||||||
$optionsToSync = [
|
|
||||||
'woocommerce_email_background_color' => $styles['body']['backgroundColor'],
|
|
||||||
'woocommerce_email_base_color' => $styles['woocommerce']['brandingColor'],
|
|
||||||
'woocommerce_email_body_background_color' => $styles['wrapper']['backgroundColor'],
|
|
||||||
'woocommerce_email_text_color' => $styles['text']['fontColor'],
|
|
||||||
];
|
|
||||||
foreach ($optionsToSync as $wcName => $value) {
|
|
||||||
$this->wp->updateOption($wcName, $value);
|
|
||||||
}
|
|
||||||
return $newsletterData;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getWCEmailSettings() {
|
public function getWCEmailSettings() {
|
||||||
$wcEmailSettings = [
|
$wcEmailSettings = [
|
||||||
'woocommerce_email_background_color' => '#f7f7f7',
|
'woocommerce_email_background_color' => '#f7f7f7',
|
||||||
|
@ -14,21 +14,27 @@ class Renderer {
|
|||||||
/** @var csstidy */
|
/** @var csstidy */
|
||||||
private $cssParser;
|
private $cssParser;
|
||||||
|
|
||||||
|
/** @var NewsletterRenderer */
|
||||||
|
private $renderer;
|
||||||
|
|
||||||
/** @var string */
|
/** @var string */
|
||||||
private $htmlBeforeContent;
|
private $htmlBeforeContent;
|
||||||
|
|
||||||
/** @var string */
|
/** @var string */
|
||||||
private $htmlAfterContent;
|
private $htmlAfterContent;
|
||||||
|
|
||||||
public function __construct(csstidy $cssParser) {
|
public function __construct(
|
||||||
|
csstidy $cssParser,
|
||||||
|
NewsletterRenderer $renderer
|
||||||
|
) {
|
||||||
$this->cssParser = $cssParser;
|
$this->cssParser = $cssParser;
|
||||||
$this->htmlBeforeContent = '';
|
$this->htmlBeforeContent = '';
|
||||||
$this->htmlAfterContent = '';
|
$this->htmlAfterContent = '';
|
||||||
|
$this->renderer = $renderer;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function render(Newsletter $newsletter, NewsletterRenderer $renderer = null) {
|
public function render(Newsletter $newsletter) {
|
||||||
$renderer = $renderer ?: new NewsletterRenderer();
|
$html = explode(Preprocessor::WC_CONTENT_PLACEHOLDER, $this->renderer->render($newsletter, true, 'html'));
|
||||||
$html = explode(Preprocessor::WC_CONTENT_PLACEHOLDER, $renderer->render($newsletter, true, 'html'));
|
|
||||||
$this->htmlBeforeContent = $html[0];
|
$this->htmlBeforeContent = $html[0];
|
||||||
$this->htmlAfterContent = $html[1];
|
$this->htmlAfterContent = $html[1];
|
||||||
}
|
}
|
||||||
|
192
tests/integration/WooCommerce/TransactionalEmailHooksTest.php
Normal file
192
tests/integration/WooCommerce/TransactionalEmailHooksTest.php
Normal file
@ -0,0 +1,192 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace MailPoet\WooCommerce;
|
||||||
|
|
||||||
|
use Codeception\Stub;
|
||||||
|
use MailPoet\API\JSON\ResponseBuilders\NewslettersResponseBuilder;
|
||||||
|
use MailPoet\DI\ContainerWrapper;
|
||||||
|
use MailPoet\Entities\NewsletterEntity;
|
||||||
|
use MailPoet\Models\Newsletter;
|
||||||
|
use MailPoet\Newsletter\Editor\LayoutHelper as L;
|
||||||
|
use MailPoet\Newsletter\NewslettersRepository;
|
||||||
|
use MailPoet\Settings\SettingsController;
|
||||||
|
use MailPoet\WooCommerce\TransactionalEmails\Renderer;
|
||||||
|
use MailPoet\WP\Functions as WPFunctions;
|
||||||
|
|
||||||
|
class TransactionalEmailHooksTest extends \MailPoetTest {
|
||||||
|
|
||||||
|
/** @var SettingsController */
|
||||||
|
private $settings;
|
||||||
|
|
||||||
|
/** @var array */
|
||||||
|
private $originalWcSettings;
|
||||||
|
|
||||||
|
/** @var NewslettersRepository */
|
||||||
|
private $newslettersRepository;
|
||||||
|
|
||||||
|
public function _before() {
|
||||||
|
$this->settings = SettingsController::getInstance();
|
||||||
|
$this->originalWcSettings = $this->settings->get('woocommerce');
|
||||||
|
$this->newslettersRepository = ContainerWrapper::getInstance()->get(NewslettersRepository::class);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testItSynchronizesEmailSettingsToWooCommerce() {
|
||||||
|
$newsletter = new NewsletterEntity;
|
||||||
|
$newsletter->setType(Newsletter::TYPE_WC_TRANSACTIONAL_EMAIL);
|
||||||
|
$newsletter->setSubject('WooCommerce Transactional Email');
|
||||||
|
$newsletter->setBody([
|
||||||
|
'globalStyles' => [
|
||||||
|
'text' =>
|
||||||
|
[
|
||||||
|
'fontColor' => '#111111',
|
||||||
|
'fontFamily' => 'Arial',
|
||||||
|
'fontSize' => '14px',
|
||||||
|
'lineHeight' => '1.6',
|
||||||
|
],
|
||||||
|
'h1' =>
|
||||||
|
[
|
||||||
|
'fontColor' => '#222222',
|
||||||
|
'fontFamily' => 'Source Sans Pro',
|
||||||
|
'fontSize' => '36px',
|
||||||
|
'lineHeight' => '1.6',
|
||||||
|
],
|
||||||
|
'h2' =>
|
||||||
|
[
|
||||||
|
'fontColor' => '#333333',
|
||||||
|
'fontFamily' => 'Verdana',
|
||||||
|
'fontSize' => '24px',
|
||||||
|
'lineHeight' => '1.6',
|
||||||
|
],
|
||||||
|
'h3' =>
|
||||||
|
[
|
||||||
|
'fontColor' => '#444444',
|
||||||
|
'fontFamily' => 'Trebuchet MS',
|
||||||
|
'fontSize' => '22px',
|
||||||
|
'lineHeight' => '1.6',
|
||||||
|
],
|
||||||
|
'link' =>
|
||||||
|
[
|
||||||
|
'fontColor' => '#555555',
|
||||||
|
'textDecoration' => 'underline',
|
||||||
|
],
|
||||||
|
'wrapper' =>
|
||||||
|
[
|
||||||
|
'backgroundColor' => '#666666',
|
||||||
|
],
|
||||||
|
'body' =>
|
||||||
|
[
|
||||||
|
'backgroundColor' => '#777777',
|
||||||
|
],
|
||||||
|
'woocommerce' =>
|
||||||
|
[
|
||||||
|
'brandingColor' => '#888888',
|
||||||
|
'headingFontColor' => '#999999',
|
||||||
|
],
|
||||||
|
],
|
||||||
|
]);
|
||||||
|
$this->newslettersRepository->persist($newsletter);
|
||||||
|
$this->newslettersRepository->flush();
|
||||||
|
|
||||||
|
$options = [];
|
||||||
|
$wp = Stub::make(new WPFunctions, [
|
||||||
|
'updateOption' => function($name, $value) use (&$options) {
|
||||||
|
$options[$name] = $value;
|
||||||
|
},
|
||||||
|
'getOption' => function($name) use (&$options) {
|
||||||
|
return $options[$name];
|
||||||
|
},
|
||||||
|
]);
|
||||||
|
|
||||||
|
$transactionalEmails = new TransactionalEmailHooks(
|
||||||
|
$wp,
|
||||||
|
$this->settings,
|
||||||
|
ContainerWrapper::getInstance()->get(Renderer::class)
|
||||||
|
);
|
||||||
|
$transactionalEmails->enableEmailSettingsSyncToWooCommerce();
|
||||||
|
|
||||||
|
$newsletterData = $this->diContainer->get(NewslettersResponseBuilder::class)->build($newsletter);
|
||||||
|
$wp->applyFilters('mailpoet_api_newsletters_save_after', $newsletterData);
|
||||||
|
|
||||||
|
expect($wp->getOption('woocommerce_email_background_color'))->equals('#777777');
|
||||||
|
expect($wp->getOption('woocommerce_email_base_color'))->equals('#888888');
|
||||||
|
expect($wp->getOption('woocommerce_email_body_background_color'))->equals('#666666');
|
||||||
|
expect($wp->getOption('woocommerce_email_text_color'))->equals('#111111');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testUseTemplateForWCEmails() {
|
||||||
|
$addedActions = [];
|
||||||
|
$removedActions = [];
|
||||||
|
$newsletter = new NewsletterEntity;
|
||||||
|
$newsletter->setType(Newsletter::TYPE_WC_TRANSACTIONAL_EMAIL);
|
||||||
|
$newsletter->setSubject('WooCommerce Transactional Email');
|
||||||
|
$newsletter->setBody([
|
||||||
|
'content' => L::col([
|
||||||
|
L::row([L::col([['type' => 'text', 'text' => 'Some text before heading']])]),
|
||||||
|
['type' => 'woocommerceHeading'],
|
||||||
|
L::row([L::col([['type' => 'text', 'text' => 'Some text between heading and content']])]),
|
||||||
|
['type' => 'woocommerceContent'],
|
||||||
|
L::row([L::col([['type' => 'text', 'text' => 'Some text after content']])]),
|
||||||
|
]),
|
||||||
|
]);
|
||||||
|
$this->newslettersRepository->persist($newsletter);
|
||||||
|
$this->newslettersRepository->flush();
|
||||||
|
$this->settings->set(TransactionalEmails::SETTING_EMAIL_ID, $newsletter->getId());
|
||||||
|
$wp = Stub::make(new WPFunctions, [
|
||||||
|
'getOption' => function($name) {
|
||||||
|
return '';
|
||||||
|
},
|
||||||
|
'addAction' => function ($name, $action) use(&$addedActions) {
|
||||||
|
$addedActions[$name] = $action;
|
||||||
|
},
|
||||||
|
'removeAction' => function ($name, $action) use(&$removedActions) {
|
||||||
|
$removedActions[$name] = $action;
|
||||||
|
},
|
||||||
|
]);
|
||||||
|
$renderer = Stub::make(Renderer::class, [
|
||||||
|
'render' => function($email) use(&$newsletter) {
|
||||||
|
expect($email->id)->equals($newsletter->getId());
|
||||||
|
},
|
||||||
|
'getHTMLBeforeContent' => function($headingText) {
|
||||||
|
return 'HTML before content with ' . $headingText;
|
||||||
|
},
|
||||||
|
'getHTMLAfterContent' => function() {
|
||||||
|
return 'HTML after content';
|
||||||
|
},
|
||||||
|
'prefixCss' => function($css) {
|
||||||
|
return 'prefixed ' . $css;
|
||||||
|
},
|
||||||
|
]);
|
||||||
|
|
||||||
|
$transactionalEmails = new TransactionalEmailHooks(
|
||||||
|
$wp,
|
||||||
|
$this->settings,
|
||||||
|
$renderer
|
||||||
|
);
|
||||||
|
$transactionalEmails->useTemplateForWoocommerceEmails();
|
||||||
|
expect($addedActions)->count(1);
|
||||||
|
expect($addedActions['woocommerce_init'])->callable();
|
||||||
|
$addedActions['woocommerce_init']();
|
||||||
|
expect($removedActions)->count(2);
|
||||||
|
expect($addedActions)->count(4);
|
||||||
|
expect($addedActions['woocommerce_email_header'])->callable();
|
||||||
|
ob_start();
|
||||||
|
$addedActions['woocommerce_email_header']('heading text');
|
||||||
|
expect(ob_get_clean())->equals('HTML before content with heading text');
|
||||||
|
expect($addedActions['woocommerce_email_footer'])->callable();
|
||||||
|
ob_start();
|
||||||
|
$addedActions['woocommerce_email_footer']();
|
||||||
|
expect(ob_get_clean())->equals('HTML after content');
|
||||||
|
expect($addedActions['woocommerce_email_styles'])->callable();
|
||||||
|
expect($addedActions['woocommerce_email_styles']('some css'))->equals('prefixed some css');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function _after() {
|
||||||
|
$this->entityManager
|
||||||
|
->createQueryBuilder()
|
||||||
|
->delete()
|
||||||
|
->from(NewsletterEntity::class, 'n')
|
||||||
|
->getQuery()
|
||||||
|
->execute();
|
||||||
|
$this->settings->set('woocommerce', $this->originalWcSettings);
|
||||||
|
}
|
||||||
|
}
|
@ -50,7 +50,7 @@ class RendererTest extends \MailPoetTest {
|
|||||||
]
|
]
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
$renderer->render($this->newsletter, $newsletterRenderer);
|
$renderer->render($this->newsletter);
|
||||||
$html = $renderer->getHTMLBeforeContent('Heading Text');
|
$html = $renderer->getHTMLBeforeContent('Heading Text');
|
||||||
expect($html)->contains('Some text before heading');
|
expect($html)->contains('Some text before heading');
|
||||||
expect($html)->contains('Heading Text');
|
expect($html)->contains('Heading Text');
|
||||||
@ -59,8 +59,8 @@ class RendererTest extends \MailPoetTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public function testGetHTMLAfterContent() {
|
public function testGetHTMLAfterContent() {
|
||||||
$renderer = new Renderer(new csstidy);
|
|
||||||
$newsletterRenderer = new NewsletterRenderer();
|
$newsletterRenderer = new NewsletterRenderer();
|
||||||
|
$renderer = new Renderer(new csstidy, $newsletterRenderer);
|
||||||
$newsletterRenderer->preprocessor = new Preprocessor(
|
$newsletterRenderer->preprocessor = new Preprocessor(
|
||||||
$newsletterRenderer->blocksRenderer,
|
$newsletterRenderer->blocksRenderer,
|
||||||
Stub::make(
|
Stub::make(
|
||||||
@ -73,7 +73,7 @@ class RendererTest extends \MailPoetTest {
|
|||||||
]
|
]
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
$renderer->render($this->newsletter, $newsletterRenderer);
|
$renderer->render($this->newsletter);
|
||||||
$html = $renderer->getHTMLAfterContent();
|
$html = $renderer->getHTMLAfterContent();
|
||||||
expect($html)->notContains('Some text before heading');
|
expect($html)->notContains('Some text before heading');
|
||||||
expect($html)->notContains('Heading Text');
|
expect($html)->notContains('Heading Text');
|
||||||
|
@ -3,15 +3,12 @@
|
|||||||
namespace MailPoet\WooCommerce;
|
namespace MailPoet\WooCommerce;
|
||||||
|
|
||||||
use Codeception\Stub;
|
use Codeception\Stub;
|
||||||
use MailPoet\API\JSON\ResponseBuilders\NewslettersResponseBuilder;
|
|
||||||
use MailPoet\DI\ContainerWrapper;
|
use MailPoet\DI\ContainerWrapper;
|
||||||
use MailPoet\Entities\NewsletterEntity;
|
use MailPoet\Entities\NewsletterEntity;
|
||||||
use MailPoet\Models\Newsletter;
|
use MailPoet\Models\Newsletter;
|
||||||
use MailPoet\Newsletter\Editor\LayoutHelper as L;
|
|
||||||
use MailPoet\Newsletter\NewslettersRepository;
|
use MailPoet\Newsletter\NewslettersRepository;
|
||||||
use MailPoet\Settings\SettingsController;
|
use MailPoet\Settings\SettingsController;
|
||||||
use MailPoet\WooCommerce\Helper as WooCommerceHelper;
|
use MailPoet\WooCommerce\Helper as WooCommerceHelper;
|
||||||
use MailPoet\WooCommerce\TransactionalEmails\Renderer;
|
|
||||||
use MailPoet\WooCommerce\TransactionalEmails\Template;
|
use MailPoet\WooCommerce\TransactionalEmails\Template;
|
||||||
use MailPoet\WP\Functions as WPFunctions;
|
use MailPoet\WP\Functions as WPFunctions;
|
||||||
|
|
||||||
@ -40,7 +37,6 @@ class TransactionalEmailsTest extends \MailPoetTest {
|
|||||||
$this->wp,
|
$this->wp,
|
||||||
$this->settings,
|
$this->settings,
|
||||||
ContainerWrapper::getInstance()->get(Template::class),
|
ContainerWrapper::getInstance()->get(Template::class),
|
||||||
ContainerWrapper::getInstance()->get(Renderer::class),
|
|
||||||
Stub::makeEmpty(WooCommerceHelper::class),
|
Stub::makeEmpty(WooCommerceHelper::class),
|
||||||
$this->newslettersRepository
|
$this->newslettersRepository
|
||||||
);
|
);
|
||||||
@ -72,7 +68,6 @@ class TransactionalEmailsTest extends \MailPoetTest {
|
|||||||
$wp,
|
$wp,
|
||||||
$this->settings,
|
$this->settings,
|
||||||
ContainerWrapper::getInstance()->get(Template::class),
|
ContainerWrapper::getInstance()->get(Template::class),
|
||||||
ContainerWrapper::getInstance()->get(Renderer::class),
|
|
||||||
Stub::makeEmpty(WooCommerceHelper::class),
|
Stub::makeEmpty(WooCommerceHelper::class),
|
||||||
$this->newslettersRepository
|
$this->newslettersRepository
|
||||||
);
|
);
|
||||||
@ -84,162 +79,6 @@ class TransactionalEmailsTest extends \MailPoetTest {
|
|||||||
expect(json_encode($email->getBody()))->contains('my-awesome-image-url');
|
expect(json_encode($email->getBody()))->contains('my-awesome-image-url');
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testItSynchronizesEmailSettingsToWooCommerce() {
|
|
||||||
$newsletter = new NewsletterEntity;
|
|
||||||
$newsletter->setType(Newsletter::TYPE_WC_TRANSACTIONAL_EMAIL);
|
|
||||||
$newsletter->setSubject('WooCommerce Transactional Email');
|
|
||||||
$newsletter->setBody([
|
|
||||||
'globalStyles' => [
|
|
||||||
'text' =>
|
|
||||||
[
|
|
||||||
'fontColor' => '#111111',
|
|
||||||
'fontFamily' => 'Arial',
|
|
||||||
'fontSize' => '14px',
|
|
||||||
'lineHeight' => '1.6',
|
|
||||||
],
|
|
||||||
'h1' =>
|
|
||||||
[
|
|
||||||
'fontColor' => '#222222',
|
|
||||||
'fontFamily' => 'Source Sans Pro',
|
|
||||||
'fontSize' => '36px',
|
|
||||||
'lineHeight' => '1.6',
|
|
||||||
],
|
|
||||||
'h2' =>
|
|
||||||
[
|
|
||||||
'fontColor' => '#333333',
|
|
||||||
'fontFamily' => 'Verdana',
|
|
||||||
'fontSize' => '24px',
|
|
||||||
'lineHeight' => '1.6',
|
|
||||||
],
|
|
||||||
'h3' =>
|
|
||||||
[
|
|
||||||
'fontColor' => '#444444',
|
|
||||||
'fontFamily' => 'Trebuchet MS',
|
|
||||||
'fontSize' => '22px',
|
|
||||||
'lineHeight' => '1.6',
|
|
||||||
],
|
|
||||||
'link' =>
|
|
||||||
[
|
|
||||||
'fontColor' => '#555555',
|
|
||||||
'textDecoration' => 'underline',
|
|
||||||
],
|
|
||||||
'wrapper' =>
|
|
||||||
[
|
|
||||||
'backgroundColor' => '#666666',
|
|
||||||
],
|
|
||||||
'body' =>
|
|
||||||
[
|
|
||||||
'backgroundColor' => '#777777',
|
|
||||||
],
|
|
||||||
'woocommerce' =>
|
|
||||||
[
|
|
||||||
'brandingColor' => '#888888',
|
|
||||||
'headingFontColor' => '#999999',
|
|
||||||
],
|
|
||||||
],
|
|
||||||
]);
|
|
||||||
$this->newslettersRepository->persist($newsletter);
|
|
||||||
$this->newslettersRepository->flush();
|
|
||||||
|
|
||||||
$options = [];
|
|
||||||
$wp = Stub::make(new WPFunctions, [
|
|
||||||
'updateOption' => function($name, $value) use (&$options) {
|
|
||||||
$options[$name] = $value;
|
|
||||||
},
|
|
||||||
'getOption' => function($name) use (&$options) {
|
|
||||||
return $options[$name];
|
|
||||||
},
|
|
||||||
]);
|
|
||||||
|
|
||||||
$transactionalEmails = new TransactionalEmails(
|
|
||||||
$wp,
|
|
||||||
$this->settings,
|
|
||||||
ContainerWrapper::getInstance()->get(Template::class),
|
|
||||||
ContainerWrapper::getInstance()->get(Renderer::class),
|
|
||||||
Stub::makeEmpty(WooCommerceHelper::class),
|
|
||||||
$this->newslettersRepository
|
|
||||||
);
|
|
||||||
$transactionalEmails->enableEmailSettingsSyncToWooCommerce();
|
|
||||||
|
|
||||||
$newsletterData = $this->diContainer->get(NewslettersResponseBuilder::class)->build($newsletter);
|
|
||||||
$wp->applyFilters('mailpoet_api_newsletters_save_after', $newsletterData);
|
|
||||||
|
|
||||||
expect($wp->getOption('woocommerce_email_background_color'))->equals('#777777');
|
|
||||||
expect($wp->getOption('woocommerce_email_base_color'))->equals('#888888');
|
|
||||||
expect($wp->getOption('woocommerce_email_body_background_color'))->equals('#666666');
|
|
||||||
expect($wp->getOption('woocommerce_email_text_color'))->equals('#111111');
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testUseTemplateForWCEmails() {
|
|
||||||
$addedActions = [];
|
|
||||||
$removedActions = [];
|
|
||||||
$newsletter = new NewsletterEntity;
|
|
||||||
$newsletter->setType(Newsletter::TYPE_WC_TRANSACTIONAL_EMAIL);
|
|
||||||
$newsletter->setSubject('WooCommerce Transactional Email');
|
|
||||||
$newsletter->setBody([
|
|
||||||
'content' => L::col([
|
|
||||||
L::row([L::col([['type' => 'text', 'text' => 'Some text before heading']])]),
|
|
||||||
['type' => 'woocommerceHeading'],
|
|
||||||
L::row([L::col([['type' => 'text', 'text' => 'Some text between heading and content']])]),
|
|
||||||
['type' => 'woocommerceContent'],
|
|
||||||
L::row([L::col([['type' => 'text', 'text' => 'Some text after content']])]),
|
|
||||||
]),
|
|
||||||
]);
|
|
||||||
$this->newslettersRepository->persist($newsletter);
|
|
||||||
$this->newslettersRepository->flush();
|
|
||||||
$this->settings->set(TransactionalEmails::SETTING_EMAIL_ID, $newsletter->getId());
|
|
||||||
$wp = Stub::make(new WPFunctions, [
|
|
||||||
'getOption' => function($name) {
|
|
||||||
return '';
|
|
||||||
},
|
|
||||||
'addAction' => function ($name, $action) use(&$addedActions) {
|
|
||||||
$addedActions[$name] = $action;
|
|
||||||
},
|
|
||||||
'removeAction' => function ($name, $action) use(&$removedActions) {
|
|
||||||
$removedActions[$name] = $action;
|
|
||||||
},
|
|
||||||
]);
|
|
||||||
$renderer = Stub::make(Renderer::class, [
|
|
||||||
'render' => function($email) use(&$newsletter) {
|
|
||||||
expect($email->id)->equals($newsletter->getId());
|
|
||||||
},
|
|
||||||
'getHTMLBeforeContent' => function($headingText) {
|
|
||||||
return 'HTML before content with ' . $headingText;
|
|
||||||
},
|
|
||||||
'getHTMLAfterContent' => function() {
|
|
||||||
return 'HTML after content';
|
|
||||||
},
|
|
||||||
'prefixCss' => function($css) {
|
|
||||||
return 'prefixed ' . $css;
|
|
||||||
},
|
|
||||||
]);
|
|
||||||
|
|
||||||
$transactionalEmails = new TransactionalEmails(
|
|
||||||
$wp,
|
|
||||||
$this->settings,
|
|
||||||
ContainerWrapper::getInstance()->get(Template::class),
|
|
||||||
$renderer,
|
|
||||||
Stub::makeEmpty(WooCommerceHelper::class),
|
|
||||||
ContainerWrapper::getInstance()->get(NewslettersRepository::class)
|
|
||||||
);
|
|
||||||
$transactionalEmails->useTemplateForWoocommerceEmails();
|
|
||||||
expect($addedActions)->count(1);
|
|
||||||
expect($addedActions['woocommerce_init'])->callable();
|
|
||||||
$addedActions['woocommerce_init']();
|
|
||||||
expect($removedActions)->count(2);
|
|
||||||
expect($addedActions)->count(4);
|
|
||||||
expect($addedActions['woocommerce_email_header'])->callable();
|
|
||||||
ob_start();
|
|
||||||
$addedActions['woocommerce_email_header']('heading text');
|
|
||||||
expect(ob_get_clean())->equals('HTML before content with heading text');
|
|
||||||
expect($addedActions['woocommerce_email_footer'])->callable();
|
|
||||||
ob_start();
|
|
||||||
$addedActions['woocommerce_email_footer']();
|
|
||||||
expect(ob_get_clean())->equals('HTML after content');
|
|
||||||
expect($addedActions['woocommerce_email_styles'])->callable();
|
|
||||||
expect($addedActions['woocommerce_email_styles']('some css'))->equals('prefixed some css');
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testInitStripsUnwantedTagsFromWCFooterText() {
|
public function testInitStripsUnwantedTagsFromWCFooterText() {
|
||||||
$optionOriginalValue = $this->wp->getOption('woocommerce_email_footer_text');
|
$optionOriginalValue = $this->wp->getOption('woocommerce_email_footer_text');
|
||||||
$this->wp->updateOption('woocommerce_email_footer_text', '<div><p>Text <a href="http://example.com">Link</a></p></div>');
|
$this->wp->updateOption('woocommerce_email_footer_text', '<div><p>Text <a href="http://example.com">Link</a></p></div>');
|
||||||
|
@ -36,10 +36,9 @@ class TransactionalEmailsUnitTest extends \MailPoetUnitTest {
|
|||||||
]);
|
]);
|
||||||
$settings = Stub::make(SettingsController::class);
|
$settings = Stub::make(SettingsController::class);
|
||||||
$template = Stub::make(Template::class);
|
$template = Stub::make(Template::class);
|
||||||
$renderer = Stub::make(Renderer::class);
|
|
||||||
$woocommerceHelper = Stub::make(WooCommerceHelper::class);
|
$woocommerceHelper = Stub::make(WooCommerceHelper::class);
|
||||||
$newslettersRepository = Stub::make(NewslettersRepository::class);
|
$newslettersRepository = Stub::make(NewslettersRepository::class);
|
||||||
$transactionalEmails = new TransactionalEmails($wp, $settings, $template, $renderer, $woocommerceHelper, $newslettersRepository);
|
$transactionalEmails = new TransactionalEmails($wp, $settings, $template, $woocommerceHelper, $newslettersRepository);
|
||||||
expect($transactionalEmails->getEmailHeadings())->equals([
|
expect($transactionalEmails->getEmailHeadings())->equals([
|
||||||
'new_account' => 'Test: New Order: #0001',
|
'new_account' => 'Test: New Order: #0001',
|
||||||
'processing_order' => 'Thank you for your order',
|
'processing_order' => 'Thank you for your order',
|
||||||
|
Reference in New Issue
Block a user