diff --git a/tests/DataFactories/Subscriber.php b/tests/DataFactories/Subscriber.php index 1453a13e95..c1f4b39613 100644 --- a/tests/DataFactories/Subscriber.php +++ b/tests/DataFactories/Subscriber.php @@ -69,6 +69,15 @@ class Subscriber { return $this; } + /** + * @param bool $isWooCustomer + * @return $this + */ + public function withIsWooCommerceUser($isWooCustomer = true) { + $this->data['is_woocommerce_user'] = $isWooCustomer; + return $this; + } + /** * @param SegmentEntity[] $segments * @return $this @@ -91,6 +100,7 @@ class Subscriber { 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['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); foreach ($this->segments as $segment) { diff --git a/tests/integration/PostEditorBlocks/WooCommerceBlocksIntegrationTest.php b/tests/integration/PostEditorBlocks/WooCommerceBlocksIntegrationTest.php new file mode 100644 index 0000000000..5e2613b2b0 --- /dev/null +++ b/tests/integration/PostEditorBlocks/WooCommerceBlocksIntegrationTest.php @@ -0,0 +1,146 @@ +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(); + } +} diff --git a/tests/integration/Statistics/Track/UnsubscribesTest.php b/tests/integration/Statistics/Track/UnsubscribesTest.php index 6b604945f4..d15abce374 100644 --- a/tests/integration/Statistics/Track/UnsubscribesTest.php +++ b/tests/integration/Statistics/Track/UnsubscribesTest.php @@ -2,14 +2,15 @@ namespace MailPoet\Test\Statistics\Track; +use MailPoet\Entities\NewsletterEntity; +use MailPoet\Entities\SendingQueueEntity; use MailPoet\Entities\StatisticsUnsubscribeEntity; +use MailPoet\Entities\SubscriberEntity; use MailPoet\Models\Newsletter; -use MailPoet\Models\SendingQueue; use MailPoet\Models\Subscriber; use MailPoet\Statistics\StatisticsUnsubscribesRepository; use MailPoet\Statistics\Track\Unsubscribes; use MailPoet\Tasks\Sending as SendingTask; -use MailPoetVendor\Idiorm\ORM; class UnsubscribesTest extends \MailPoetTest { /** @var Unsubscribes */ @@ -24,6 +25,7 @@ class UnsubscribesTest extends \MailPoetTest { public function _before() { parent::_before(); + $this->cleanup(); // create newsletter $newsletter = Newsletter::create(); $newsletter->type = 'type'; @@ -65,10 +67,14 @@ class UnsubscribesTest extends \MailPoetTest { expect(count($this->statisticsUnsubscribesRepository->findAll()))->equals(1); } - public function _after() { - ORM::raw_execute('TRUNCATE ' . Newsletter::$_table); - ORM::raw_execute('TRUNCATE ' . Subscriber::$_table); - ORM::raw_execute('TRUNCATE ' . SendingQueue::$_table); + private function cleanup() { + $this->truncateEntity(NewsletterEntity::class); + $this->truncateEntity(SubscriberEntity::class); + $this->truncateEntity(SendingQueueEntity::class); $this->truncateEntity(StatisticsUnsubscribeEntity::class); } + + public function _after() { + $this->cleanup(); + } } diff --git a/tests/integration/_bootstrap.php b/tests/integration/_bootstrap.php index 5dfe9aff4d..11eb4c1b8c 100644 --- a/tests/integration/_bootstrap.php +++ b/tests/integration/_bootstrap.php @@ -280,6 +280,12 @@ if (!function_exists('WC')) { 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