Add integration test for checkout block opt-in integration
[MAILPOET-3920]
This commit is contained in:
committed by
Veljko V
parent
a8ad7b7767
commit
e9202d840a
@@ -69,6 +69,15 @@ class Subscriber {
|
|||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param bool $isWooCustomer
|
||||||
|
* @return $this
|
||||||
|
*/
|
||||||
|
public function withIsWooCommerceUser($isWooCustomer = true) {
|
||||||
|
$this->data['is_woocommerce_user'] = $isWooCustomer;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param SegmentEntity[] $segments
|
* @param SegmentEntity[] $segments
|
||||||
* @return $this
|
* @return $this
|
||||||
@@ -91,6 +100,7 @@ class Subscriber {
|
|||||||
if (isset($this->data['count_confirmations'])) $subscriber->setConfirmationsCount($this->data['count_confirmations']);
|
if (isset($this->data['count_confirmations'])) $subscriber->setConfirmationsCount($this->data['count_confirmations']);
|
||||||
if (isset($this->data['last_name'])) $subscriber->setLastName($this->data['last_name']);
|
if (isset($this->data['last_name'])) $subscriber->setLastName($this->data['last_name']);
|
||||||
if (isset($this->data['first_name'])) $subscriber->setFirstName($this->data['first_name']);
|
if (isset($this->data['first_name'])) $subscriber->setFirstName($this->data['first_name']);
|
||||||
|
if (isset($this->data['is_woocommerce_user'])) $subscriber->setIsWoocommerceUser($this->data['is_woocommerce_user']);
|
||||||
$entityManager->persist($subscriber);
|
$entityManager->persist($subscriber);
|
||||||
|
|
||||||
foreach ($this->segments as $segment) {
|
foreach ($this->segments as $segment) {
|
||||||
|
@@ -0,0 +1,146 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace MailPoet\PostEditorBlocks;
|
||||||
|
|
||||||
|
use MailPoet\Entities\SubscriberEntity;
|
||||||
|
use MailPoet\Entities\SubscriberSegmentEntity;
|
||||||
|
use MailPoet\Segments\WooCommerce as WooSegment;
|
||||||
|
use MailPoet\Settings\SettingsController;
|
||||||
|
use MailPoet\Subscribers\SubscribersRepository;
|
||||||
|
use MailPoet\Test\DataFactories\Subscriber;
|
||||||
|
use MailPoet\WooCommerce\Subscription;
|
||||||
|
use MailPoet\WP\Functions;
|
||||||
|
use PHPUnit\Framework\MockObject\MockObject;
|
||||||
|
|
||||||
|
class WooCommerceBlocksIntegrationTest extends \MailPoetTest {
|
||||||
|
|
||||||
|
/** @var \WC_Order & MockObject */
|
||||||
|
private $wcOrderMock;
|
||||||
|
|
||||||
|
/** @var WooSegment & MockObject */
|
||||||
|
private $wcSegmentMock;
|
||||||
|
|
||||||
|
/** @var WooCommerceBlocksIntegration */
|
||||||
|
private $integration;
|
||||||
|
|
||||||
|
/** @var SettingsController */
|
||||||
|
private $settings;
|
||||||
|
|
||||||
|
public function _before() {
|
||||||
|
$this->settings = $this->diContainer->get(SettingsController::class);
|
||||||
|
$this->wcOrderMock = $this->createMock(\WC_Order::class);
|
||||||
|
$this->wcOrderMock->method('get_id')
|
||||||
|
->willReturn(1);
|
||||||
|
$this->wcSegmentMock = $this->createMock(WooSegment::class);
|
||||||
|
$this->integration = new WooCommerceBlocksIntegration(
|
||||||
|
$this->diContainer->get(Functions::class),
|
||||||
|
$this->settings,
|
||||||
|
$this->diContainer->get(Subscription::class),
|
||||||
|
$this->wcSegmentMock,
|
||||||
|
$this->diContainer->get(SubscribersRepository::class)
|
||||||
|
);
|
||||||
|
$this->cleanup();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testItHandlesOptInForGuestCustomer() {
|
||||||
|
$this->settings->set('woocommerce.optin_on_checkout.enabled', true);
|
||||||
|
$email = 'guest@customer.com';
|
||||||
|
$this->wcOrderMock->method('get_billing_email')
|
||||||
|
->willReturn($email);
|
||||||
|
$this->setupSyncGuestUserMock($email);
|
||||||
|
$request['extensions']['mailpoet']['optin'] = true;
|
||||||
|
$this->integration->processCheckoutBlockOptin($this->wcOrderMock, $request);
|
||||||
|
|
||||||
|
$subscriber = $this->entityManager->getRepository(SubscriberEntity::class)->findOneBy(['email' => $email]);
|
||||||
|
$this->assertInstanceOf(SubscriberEntity::class, $subscriber);
|
||||||
|
$this->entityManager->refresh($subscriber);
|
||||||
|
expect($subscriber->getStatus())->equals(SubscriberEntity::STATUS_UNCONFIRMED);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testItHandlesOptOutForGuestCustomer() {
|
||||||
|
$this->settings->set('woocommerce.optin_on_checkout.enabled', true);
|
||||||
|
$email = 'guest@customer.com';
|
||||||
|
$this->wcOrderMock->method('get_billing_email')
|
||||||
|
->willReturn($email);
|
||||||
|
$this->setupSyncGuestUserMock($email);
|
||||||
|
$request['extensions']['mailpoet']['optin'] = false;
|
||||||
|
$this->integration->processCheckoutBlockOptin($this->wcOrderMock, $request);
|
||||||
|
|
||||||
|
$subscriber = $this->entityManager->getRepository(SubscriberEntity::class)->findOneBy(['email' => $email]);
|
||||||
|
$this->assertInstanceOf(SubscriberEntity::class, $subscriber);
|
||||||
|
$this->entityManager->refresh($subscriber);
|
||||||
|
expect($subscriber->getStatus())->equals(SubscriberEntity::STATUS_UNSUBSCRIBED);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testItHandlesOptinForExistingUnsubscribedCustomer() {
|
||||||
|
$this->settings->set('woocommerce.optin_on_checkout.enabled', true);
|
||||||
|
$email = 'exising@customer.com';
|
||||||
|
$this->wcOrderMock->method('get_billing_email')
|
||||||
|
->willReturn($email);
|
||||||
|
$this->createSubscriber($email, SubscriberEntity::STATUS_UNSUBSCRIBED);
|
||||||
|
$request['extensions']['mailpoet']['optin'] = true;
|
||||||
|
$this->integration->processCheckoutBlockOptin($this->wcOrderMock, $request);
|
||||||
|
|
||||||
|
$subscriber = $this->entityManager->getRepository(SubscriberEntity::class)->findOneBy(['email' => $email]);
|
||||||
|
$this->assertInstanceOf(SubscriberEntity::class, $subscriber);
|
||||||
|
$this->entityManager->refresh($subscriber);
|
||||||
|
expect($subscriber->getStatus())->equals(SubscriberEntity::STATUS_UNCONFIRMED);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testItHandlesOptinForExistingSubscribedCustomer() {
|
||||||
|
$this->settings->set('woocommerce.optin_on_checkout.enabled', true);
|
||||||
|
$email = 'exising@customer.com';
|
||||||
|
$this->wcOrderMock->method('get_billing_email')
|
||||||
|
->willReturn($email);
|
||||||
|
$this->createSubscriber($email, SubscriberEntity::STATUS_SUBSCRIBED);
|
||||||
|
$request['extensions']['mailpoet']['optin'] = true;
|
||||||
|
$this->integration->processCheckoutBlockOptin($this->wcOrderMock, $request);
|
||||||
|
|
||||||
|
$subscriber = $this->entityManager->getRepository(SubscriberEntity::class)->findOneBy(['email' => $email]);
|
||||||
|
$this->assertInstanceOf(SubscriberEntity::class, $subscriber);
|
||||||
|
$this->entityManager->refresh($subscriber);
|
||||||
|
expect($subscriber->getStatus())->equals(SubscriberEntity::STATUS_SUBSCRIBED);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testItHandlesOptOutForExistingSubscribedCustomer() {
|
||||||
|
$this->settings->set('woocommerce.optin_on_checkout.enabled', true);
|
||||||
|
$email = 'exising@customer.com';
|
||||||
|
$this->wcOrderMock->method('get_billing_email')
|
||||||
|
->willReturn($email);
|
||||||
|
$this->createSubscriber($email, SubscriberEntity::STATUS_SUBSCRIBED);
|
||||||
|
$request['extensions']['mailpoet']['optin'] = false;
|
||||||
|
$this->integration->processCheckoutBlockOptin($this->wcOrderMock, $request);
|
||||||
|
|
||||||
|
$subscriber = $this->entityManager->getRepository(SubscriberEntity::class)->findOneBy(['email' => $email]);
|
||||||
|
$this->assertInstanceOf(SubscriberEntity::class, $subscriber);
|
||||||
|
$this->entityManager->refresh($subscriber);
|
||||||
|
expect($subscriber->getStatus())->equals(SubscriberEntity::STATUS_UNSUBSCRIBED);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function setupSyncGuestUserMock(string $email) {
|
||||||
|
$this->wcSegmentMock->method('synchronizeGuestCustomer')
|
||||||
|
->willReturnCallback(function () use ($email) {
|
||||||
|
return (new Subscriber())->withEmail($email)
|
||||||
|
->withStatus(SubscriberEntity::STATUS_UNCONFIRMED)
|
||||||
|
->withIsWooCommerceUser(true)
|
||||||
|
->create();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private function createSubscriber(string $email, string $status) {
|
||||||
|
return (new Subscriber())->withEmail($email)
|
||||||
|
->withStatus($status)
|
||||||
|
->withIsWooCommerceUser(true)
|
||||||
|
->create();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function cleanup() {
|
||||||
|
$this->truncateEntity(SubscriberEntity::class);
|
||||||
|
$this->truncateEntity(SubscriberSegmentEntity::class);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function _after() {
|
||||||
|
parent::_after();
|
||||||
|
$this->cleanup();
|
||||||
|
}
|
||||||
|
}
|
@@ -2,14 +2,15 @@
|
|||||||
|
|
||||||
namespace MailPoet\Test\Statistics\Track;
|
namespace MailPoet\Test\Statistics\Track;
|
||||||
|
|
||||||
|
use MailPoet\Entities\NewsletterEntity;
|
||||||
|
use MailPoet\Entities\SendingQueueEntity;
|
||||||
use MailPoet\Entities\StatisticsUnsubscribeEntity;
|
use MailPoet\Entities\StatisticsUnsubscribeEntity;
|
||||||
|
use MailPoet\Entities\SubscriberEntity;
|
||||||
use MailPoet\Models\Newsletter;
|
use MailPoet\Models\Newsletter;
|
||||||
use MailPoet\Models\SendingQueue;
|
|
||||||
use MailPoet\Models\Subscriber;
|
use MailPoet\Models\Subscriber;
|
||||||
use MailPoet\Statistics\StatisticsUnsubscribesRepository;
|
use MailPoet\Statistics\StatisticsUnsubscribesRepository;
|
||||||
use MailPoet\Statistics\Track\Unsubscribes;
|
use MailPoet\Statistics\Track\Unsubscribes;
|
||||||
use MailPoet\Tasks\Sending as SendingTask;
|
use MailPoet\Tasks\Sending as SendingTask;
|
||||||
use MailPoetVendor\Idiorm\ORM;
|
|
||||||
|
|
||||||
class UnsubscribesTest extends \MailPoetTest {
|
class UnsubscribesTest extends \MailPoetTest {
|
||||||
/** @var Unsubscribes */
|
/** @var Unsubscribes */
|
||||||
@@ -24,6 +25,7 @@ class UnsubscribesTest extends \MailPoetTest {
|
|||||||
|
|
||||||
public function _before() {
|
public function _before() {
|
||||||
parent::_before();
|
parent::_before();
|
||||||
|
$this->cleanup();
|
||||||
// create newsletter
|
// create newsletter
|
||||||
$newsletter = Newsletter::create();
|
$newsletter = Newsletter::create();
|
||||||
$newsletter->type = 'type';
|
$newsletter->type = 'type';
|
||||||
@@ -65,10 +67,14 @@ class UnsubscribesTest extends \MailPoetTest {
|
|||||||
expect(count($this->statisticsUnsubscribesRepository->findAll()))->equals(1);
|
expect(count($this->statisticsUnsubscribesRepository->findAll()))->equals(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function _after() {
|
private function cleanup() {
|
||||||
ORM::raw_execute('TRUNCATE ' . Newsletter::$_table);
|
$this->truncateEntity(NewsletterEntity::class);
|
||||||
ORM::raw_execute('TRUNCATE ' . Subscriber::$_table);
|
$this->truncateEntity(SubscriberEntity::class);
|
||||||
ORM::raw_execute('TRUNCATE ' . SendingQueue::$_table);
|
$this->truncateEntity(SendingQueueEntity::class);
|
||||||
$this->truncateEntity(StatisticsUnsubscribeEntity::class);
|
$this->truncateEntity(StatisticsUnsubscribeEntity::class);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function _after() {
|
||||||
|
$this->cleanup();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -280,6 +280,12 @@ if (!function_exists('WC')) {
|
|||||||
|
|
||||||
public function get_billing_last_name() { // phpcs:ignore
|
public function get_billing_last_name() { // phpcs:ignore
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function get_billing_email() { // phpcs:ignore
|
||||||
|
}
|
||||||
|
|
||||||
|
public function get_id() { // phpcs:ignore
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class WC_Emails {} // phpcs:ignore
|
class WC_Emails {} // phpcs:ignore
|
||||||
|
Reference in New Issue
Block a user