289 lines
9.8 KiB
PHP
Executable File
289 lines
9.8 KiB
PHP
Executable File
<?php
|
|
/**
|
|
* Copyright © Magento, Inc. All rights reserved.
|
|
* See COPYING.txt for license details.
|
|
*/
|
|
declare(strict_types=1);
|
|
|
|
namespace Magento\Newsletter\Model;
|
|
|
|
use Magento\Customer\Api\CustomerRepositoryInterface;
|
|
use Magento\Framework\Exception\LocalizedException;
|
|
use Magento\Framework\Exception\NoSuchEntityException;
|
|
use Magento\Framework\Mail\EmailMessage;
|
|
use Magento\Newsletter\Model\ResourceModel\Subscriber\CollectionFactory;
|
|
use Magento\TestFramework\Helper\Bootstrap;
|
|
use Magento\TestFramework\Mail\Template\TransportBuilderMock;
|
|
use PHPUnit\Framework\TestCase;
|
|
|
|
/**
|
|
* Class checks subscription behavior.
|
|
*
|
|
* @see \Magento\Newsletter\Model\Subscriber
|
|
*/
|
|
class SubscriberTest extends TestCase
|
|
{
|
|
private const CONFIRMATION_SUBSCRIBE = 'You have been successfully subscribed to our newsletter.';
|
|
private const CONFIRMATION_UNSUBSCRIBE = 'You have been unsubscribed from the newsletter.';
|
|
|
|
/**
|
|
* @var SubscriberFactory
|
|
*/
|
|
private $subscriberFactory;
|
|
|
|
/**
|
|
* @var TransportBuilderMock
|
|
*/
|
|
private $transportBuilder;
|
|
|
|
/**
|
|
* @var CustomerRepositoryInterface
|
|
*/
|
|
private $customerRepository;
|
|
|
|
/**
|
|
* @var QueueFactory
|
|
*/
|
|
private $queueFactory;
|
|
|
|
/**
|
|
* @var CollectionFactory
|
|
*/
|
|
private $subscriberCollectionFactory;
|
|
|
|
/**
|
|
* @inheritdoc
|
|
*/
|
|
protected function setUp(): void
|
|
{
|
|
$objectManager = Bootstrap::getObjectManager();
|
|
$this->subscriberFactory = $objectManager->get(SubscriberFactory::class);
|
|
$this->transportBuilder = $objectManager->get(TransportBuilderMock::class);
|
|
$this->customerRepository = $objectManager->get(CustomerRepositoryInterface::class);
|
|
$this->queueFactory = $objectManager->get(QueueFactory::class);
|
|
$this->subscriberCollectionFactory = $objectManager->get(CollectionFactory::class);
|
|
}
|
|
|
|
/**
|
|
* @magentoConfigFixture current_store newsletter/subscription/confirm 1
|
|
*
|
|
* @magentoDataFixture Magento/Newsletter/_files/subscribers.php
|
|
*
|
|
* @return void
|
|
*/
|
|
public function testEmailConfirmation(): void
|
|
{
|
|
$subscriber = $this->subscriberFactory->create();
|
|
$subscriber->subscribe('customer_confirm@example.com');
|
|
// confirmationCode 'ysayquyajua23iq29gxwu2eax2qb6gvy' is taken from fixture
|
|
$this->assertStringContainsString(
|
|
'/newsletter/subscriber/confirm/id/' . $subscriber->getSubscriberId()
|
|
. '/code/ysayquyajua23iq29gxwu2eax2qb6gvy',
|
|
$this->transportBuilder->getSentMessage()->getBody()->getParts()[0]->getRawContent()
|
|
);
|
|
$this->assertEquals(Subscriber::STATUS_NOT_ACTIVE, $subscriber->getSubscriberStatus());
|
|
}
|
|
|
|
/**
|
|
* @magentoDataFixture Magento/Newsletter/_files/subscribers.php
|
|
*
|
|
* @return void
|
|
*/
|
|
public function testLoadByCustomerId(): void
|
|
{
|
|
$subscriber = $this->subscriberFactory->create();
|
|
$this->assertSame($subscriber, $subscriber->loadByCustomerId(1));
|
|
$this->assertEquals('customer@example.com', $subscriber->getSubscriberEmail());
|
|
}
|
|
|
|
/**
|
|
* @magentoDataFixture Magento/Newsletter/_files/subscribers.php
|
|
*
|
|
* @magentoAppArea frontend
|
|
*
|
|
* @return void
|
|
*/
|
|
public function testUnsubscribeSubscribe(): void
|
|
{
|
|
$subscriber = $this->subscriberFactory->create();
|
|
$this->assertSame($subscriber, $subscriber->loadByCustomerId(1));
|
|
$this->assertEquals($subscriber, $subscriber->unsubscribe());
|
|
$this->assertConfirmationParagraphExists(
|
|
self::CONFIRMATION_UNSUBSCRIBE,
|
|
$this->transportBuilder->getSentMessage()
|
|
);
|
|
|
|
$this->assertEquals(Subscriber::STATUS_UNSUBSCRIBED, $subscriber->getSubscriberStatus());
|
|
// Subscribe and verify
|
|
$this->assertEquals(Subscriber::STATUS_SUBSCRIBED, $subscriber->subscribe('customer@example.com'));
|
|
$this->assertEquals(Subscriber::STATUS_SUBSCRIBED, $subscriber->getSubscriberStatus());
|
|
|
|
$this->assertConfirmationParagraphExists(
|
|
self::CONFIRMATION_SUBSCRIBE,
|
|
$this->transportBuilder->getSentMessage()
|
|
);
|
|
}
|
|
|
|
/**
|
|
* @magentoDataFixture Magento/Newsletter/_files/subscribers.php
|
|
*
|
|
* @magentoAppArea frontend
|
|
*
|
|
* @return void
|
|
*/
|
|
public function testUnsubscribeSubscribeByCustomerId(): void
|
|
{
|
|
$subscriber = $this->subscriberFactory->create();
|
|
// Unsubscribe and verify
|
|
$this->assertSame($subscriber, $subscriber->unsubscribeCustomerById(1));
|
|
$this->assertEquals(Subscriber::STATUS_UNSUBSCRIBED, $subscriber->getSubscriberStatus());
|
|
$this->assertConfirmationParagraphExists(
|
|
self::CONFIRMATION_UNSUBSCRIBE,
|
|
$this->transportBuilder->getSentMessage()
|
|
);
|
|
|
|
// Subscribe and verify
|
|
$this->assertSame($subscriber, $subscriber->subscribeCustomerById(1));
|
|
$this->assertEquals(Subscriber::STATUS_SUBSCRIBED, $subscriber->getSubscriberStatus());
|
|
$this->assertConfirmationParagraphExists(
|
|
self::CONFIRMATION_SUBSCRIBE,
|
|
$this->transportBuilder->getSentMessage()
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Test subscribe and verify customer subscription status
|
|
*
|
|
* @magentoDataFixture Magento/Customer/_files/customer_sample.php
|
|
*
|
|
* @return void
|
|
*/
|
|
public function testSubscribeAndVerifyCustomerSubscriptionStatus(): void
|
|
{
|
|
$customer = $this->customerRepository->getById(1);
|
|
$subscriptionBefore = $customer->getExtensionAttributes()
|
|
->getIsSubscribed();
|
|
$subscriber = $this->subscriberFactory->create();
|
|
$subscriber->subscribeCustomerById($customer->getId());
|
|
|
|
$customer = $this->customerRepository->getById(1);
|
|
|
|
$this->assertFalse($subscriptionBefore);
|
|
$this->assertTrue($customer->getExtensionAttributes()->getIsSubscribed());
|
|
}
|
|
|
|
/**
|
|
* @magentoConfigFixture current_store newsletter/subscription/confirm 1
|
|
*
|
|
* @magentoDataFixture Magento/Newsletter/_files/subscribers.php
|
|
*
|
|
* @return void
|
|
*/
|
|
public function testConfirm(): void
|
|
{
|
|
$subscriber = $this->subscriberFactory->create();
|
|
$customerEmail = 'customer_confirm@example.com';
|
|
$subscriber->subscribe($customerEmail);
|
|
$subscriber->loadByEmail($customerEmail);
|
|
$subscriber->confirm($subscriber->getSubscriberConfirmCode());
|
|
|
|
$this->assertConfirmationParagraphExists(
|
|
self::CONFIRMATION_SUBSCRIBE,
|
|
$this->transportBuilder->getSentMessage()
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Unsubscribe and check queue
|
|
*
|
|
* @magentoDataFixture Magento/Newsletter/_files/queue.php
|
|
*
|
|
* @return void
|
|
*/
|
|
public function testUnsubscribeCustomer(): void
|
|
{
|
|
$firstSubscriber = $this->subscriberFactory->create()
|
|
->load('customer@example.com', 'subscriber_email');
|
|
$secondSubscriber = $this->subscriberFactory->create()
|
|
->load('customer_two@example.com', 'subscriber_email');
|
|
|
|
$queue = $this->queueFactory->create()
|
|
->load('CustomerSupport', 'newsletter_sender_name');
|
|
$queue->addSubscribersToQueue([$firstSubscriber->getId(), $secondSubscriber->getId()]);
|
|
|
|
$secondSubscriber->unsubscribe();
|
|
|
|
$collection = $this->subscriberCollectionFactory->create()
|
|
->useQueue($queue);
|
|
|
|
$this->assertCount(1, $collection);
|
|
$this->assertEquals(
|
|
'customer@example.com',
|
|
$collection->getFirstItem()->getData('subscriber_email')
|
|
);
|
|
}
|
|
|
|
/**
|
|
* @magentoDataFixture Magento/Customer/_files/customer_confirmation_config_enable.php
|
|
* @magentoDataFixture Magento/Newsletter/_files/newsletter_unconfirmed_customer.php
|
|
*
|
|
* @return void
|
|
* @throws LocalizedException
|
|
* @throws NoSuchEntityException
|
|
*/
|
|
public function testSubscribeUnconfirmedCustomerWithSubscription(): void
|
|
{
|
|
$customer = $this->customerRepository->get('unconfirmedcustomer@example.com');
|
|
$subscriber = $this->subscriberFactory->create();
|
|
$subscriber->subscribeCustomerById($customer->getId());
|
|
$this->assertEquals(Subscriber::STATUS_SUBSCRIBED, $subscriber->getStatus());
|
|
}
|
|
|
|
/**
|
|
* @magentoDataFixture Magento/Customer/_files/customer_confirmation_config_enable.php
|
|
* @magentoDataFixture Magento/Customer/_files/unconfirmed_customer.php
|
|
*
|
|
* @return void
|
|
* @throws LocalizedException
|
|
* @throws NoSuchEntityException
|
|
*/
|
|
public function testSubscribeUnconfirmedCustomerWithoutSubscription(): void
|
|
{
|
|
$customer = $this->customerRepository->get('unconfirmedcustomer@example.com');
|
|
$subscriber = $this->subscriberFactory->create();
|
|
$subscriber->subscribeCustomerById($customer->getId());
|
|
$this->assertEquals(Subscriber::STATUS_UNCONFIRMED, $subscriber->getStatus());
|
|
}
|
|
|
|
/**
|
|
* Verifies if Paragraph with specified message is in e-mail
|
|
*
|
|
* @param string $expectedMessage
|
|
* @param EmailMessage $message
|
|
*/
|
|
private function assertConfirmationParagraphExists(string $expectedMessage, EmailMessage $message): void
|
|
{
|
|
$messageContent = $this->getMessageRawContent($message);
|
|
|
|
$emailDom = new \DOMDocument();
|
|
$emailDom->loadHTML($messageContent);
|
|
|
|
$emailXpath = new \DOMXPath($emailDom);
|
|
$greeting = $emailXpath->query("//p[contains(text(), '$expectedMessage')]");
|
|
|
|
$this->assertSame(1, $greeting->length, "Cannot find the confirmation paragraph in e-mail contents");
|
|
}
|
|
|
|
/**
|
|
* Returns raw content of provided message
|
|
*
|
|
* @param EmailMessage $message
|
|
* @return string
|
|
*/
|
|
private function getMessageRawContent(EmailMessage $message): string
|
|
{
|
|
$emailParts = $message->getBody()->getParts();
|
|
return current($emailParts)->getRawContent();
|
|
}
|
|
}
|