Add unsubscribe API method

It can be used by calling:

```
$mailpoet_api = \MailPoet\API\API::MP('v1');
$mailpoet_api->unsubscribe($subscriberId);
```

[MAILPOET-5152]
This commit is contained in:
Rodrigo Primo
2023-03-27 11:41:09 -03:00
committed by Aschepikov
parent d37b961c2b
commit c507229dd2
5 changed files with 114 additions and 1 deletions

View File

@@ -14,6 +14,7 @@ use MailPoet\Config\Changelog;
use MailPoet\CustomFields\CustomFieldsRepository;
use MailPoet\Entities\CustomFieldEntity;
use MailPoet\Entities\SegmentEntity;
use MailPoet\Entities\StatisticsUnsubscribeEntity;
use MailPoet\Entities\SubscriberEntity;
use MailPoet\Entities\SubscriberSegmentEntity;
use MailPoet\Models\ScheduledTask;
@@ -284,6 +285,75 @@ class SubscribersTest extends \MailPoetTest {
$API->subscribeToLists($subscriber->getId(), [$segment->getId()], $options);
}
public function testUnsubscribeRaisesExceptionWhenSubscriberIdIsNotPassed() {
try {
$this->getApi()->unsubscribe(false);
$this->fail('Subscriber does not exist exception should have been thrown.');
} catch (\Exception $e) {
expect($e->getMessage())->equals('A subscriber is required.');
}
}
public function testUnsubscribeRaisesExceptionWhenSubscriberDoesNotExist() {
try {
$this->getApi()->unsubscribe('asdf');
$this->fail('Subscriber does not exist exception should have been thrown.');
} catch (\Exception $e) {
expect($e->getMessage())->equals('This subscriber does not exist.');
}
}
public function testUnsubscribeRaisesExceptionIfSubscriberAlreadyUnsubscribed() {
$subscriber = $this->subscriberFactory
->withStatus(SubscriberEntity::STATUS_UNSUBSCRIBED)
->create();
try {
$this->getApi()->unsubscribe($subscriber->getId());
$this->fail('Subscriber already unsubscribed exception should have been thrown.');
} catch (\Exception $e) {
expect($e->getMessage())->equals('This subscriber is already unsubscribed.');
}
}
public function testUnsubscribesSubscriberFromAllListsAndChangesItsStatus() {
$subscriber = $this->subscriberFactory->create();
$segment1 = $this->getSegment('Segment 1');
$segment2 = $this->getSegment('Segment 2');
$this->getApi()->subscribeToLists($subscriber->getId(), [$segment1->getId(), $segment2->getId()]);
$this->assertSame(SubscriberEntity::STATUS_SUBSCRIBED, $subscriber->getStatus());
$result = $this->getApi()->unsubscribe($subscriber->getId());
$this->assertSame(SubscriberEntity::STATUS_UNSUBSCRIBED, $subscriber->getStatus());
foreach ($subscriber->getSubscriberSegments() as $subscriberSegment) {
$this->assertSame(SubscriberEntity::STATUS_UNSUBSCRIBED, $subscriberSegment->getStatus());
}
$this->assertSame(SubscriberEntity::STATUS_UNSUBSCRIBED, $result['status']);
$this->assertSame(SubscriberEntity::STATUS_UNSUBSCRIBED, $result['subscriptions'][0]['status']);
$this->assertSame(SubscriberEntity::STATUS_UNSUBSCRIBED, $result['subscriptions'][1]['status']);
}
public function testUnsubscribesSubscriberFromAllListsAndChangesItsStatusUsingEmailInsteadOfId() {
$subscriber = $this->subscriberFactory->create();
$segment1 = $this->getSegment('Segment 1');
$segment2 = $this->getSegment('Segment 2');
$this->getApi()->subscribeToLists($subscriber->getId(), [$segment1->getId(), $segment2->getId()]);
$this->assertSame(SubscriberEntity::STATUS_SUBSCRIBED, $subscriber->getStatus());
$result = $this->getApi()->unsubscribe($subscriber->getEmail());
$this->assertSame(SubscriberEntity::STATUS_UNSUBSCRIBED, $subscriber->getStatus());
foreach ($subscriber->getSubscriberSegments() as $subscriberSegment) {
$this->assertSame(SubscriberEntity::STATUS_UNSUBSCRIBED, $subscriberSegment->getStatus());
}
$this->assertSame(SubscriberEntity::STATUS_UNSUBSCRIBED, $result['status']);
$this->assertSame(SubscriberEntity::STATUS_UNSUBSCRIBED, $result['subscriptions'][0]['status']);
$this->assertSame(SubscriberEntity::STATUS_UNSUBSCRIBED, $result['subscriptions'][1]['status']);
}
public function testItDoesNotUnsubscribeWhenSubscriberIdNotPassedFromLists() {
try {
$this->getApi()->unsubscribeFromLists(false, [1,2,3]);
@@ -961,6 +1031,7 @@ class SubscribersTest extends \MailPoetTest {
}
public function _after() {
$this->truncateEntity(StatisticsUnsubscribeEntity::class);
$this->truncateEntity(SubscriberSegmentEntity::class);
$this->truncateEntity(SubscriberEntity::class);
$this->truncateEntity(SegmentEntity::class);