Merge branch 'master' into gdpr-privacy-policy
This commit is contained in:
@@ -132,6 +132,7 @@ class Initializer {
|
|||||||
$this->setupImages();
|
$this->setupImages();
|
||||||
$this->setupPersonalDataExporters();
|
$this->setupPersonalDataExporters();
|
||||||
$this->setupPrivacyPolicy();
|
$this->setupPrivacyPolicy();
|
||||||
|
$this->setupPersonalDataErasers();
|
||||||
|
|
||||||
$this->setupChangelog();
|
$this->setupChangelog();
|
||||||
$this->setupCronTrigger();
|
$this->setupCronTrigger();
|
||||||
@@ -278,6 +279,11 @@ class Initializer {
|
|||||||
$exporters->init();
|
$exporters->init();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function setupPersonalDataErasers() {
|
||||||
|
$erasers = new PersonalDataErasers();
|
||||||
|
$erasers->init();
|
||||||
|
}
|
||||||
|
|
||||||
function setupPHPVersionWarnings() {
|
function setupPHPVersionWarnings() {
|
||||||
$php_version_warnings = new PHPVersionWarnings();
|
$php_version_warnings = new PHPVersionWarnings();
|
||||||
$warnings = $php_version_warnings->init(phpversion(), Menu::isOnMailPoetAdminPage());
|
$warnings = $php_version_warnings->init(phpversion(), Menu::isOnMailPoetAdminPage());
|
||||||
|
22
lib/Config/PersonalDataErasers.php
Normal file
22
lib/Config/PersonalDataErasers.php
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace MailPoet\Config;
|
||||||
|
|
||||||
|
use MailPoet\Subscribers\SubscriberPersonalDataEraser;
|
||||||
|
|
||||||
|
class PersonalDataErasers {
|
||||||
|
|
||||||
|
function init() {
|
||||||
|
add_filter('wp_privacy_personal_data_erasers', array($this, 'registerSubscriberEraser'));
|
||||||
|
}
|
||||||
|
|
||||||
|
function registerSubscriberEraser($erasers) {
|
||||||
|
$erasers['mailpet-subscriber'] = array(
|
||||||
|
'eraser_friendly_name' => __('Mailpoet Subscribers', 'mailpoet'),
|
||||||
|
'callback' => array(new SubscriberPersonalDataEraser(), 'erase'),
|
||||||
|
);
|
||||||
|
|
||||||
|
return $erasers;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@@ -34,12 +34,18 @@ class StatisticsNewsletters extends Model {
|
|||||||
return static::table_alias('statistics')
|
return static::table_alias('statistics')
|
||||||
->select('statistics.newsletter_id', 'newsletter_id')
|
->select('statistics.newsletter_id', 'newsletter_id')
|
||||||
->select('newsletter_rendered_subject')
|
->select('newsletter_rendered_subject')
|
||||||
|
->select('opens.created_at', 'opened_at')
|
||||||
->select('sent_at')
|
->select('sent_at')
|
||||||
->join(
|
->join(
|
||||||
SendingQueue::$_table,
|
SendingQueue::$_table,
|
||||||
array('statistics.queue_id', '=', 'queue.id'),
|
array('statistics.queue_id', '=', 'queue.id'),
|
||||||
'queue'
|
'queue'
|
||||||
)
|
)
|
||||||
|
->leftOuterJoin(
|
||||||
|
StatisticsOpens::$_table,
|
||||||
|
array('statistics.newsletter_id', '=', 'opens.newsletter_id'),
|
||||||
|
'opens'
|
||||||
|
)
|
||||||
->where('statistics.subscriber_id', $subscriber->id())
|
->where('statistics.subscriber_id', $subscriber->id())
|
||||||
->orderByAsc('newsletter_id');
|
->orderByAsc('newsletter_id');
|
||||||
}
|
}
|
||||||
|
@@ -40,16 +40,31 @@ class NewslettersExporter {
|
|||||||
private function exportNewsletter($statistics_row, $newsletters, $subscriber) {
|
private function exportNewsletter($statistics_row, $newsletters, $subscriber) {
|
||||||
$newsletter_data = array();
|
$newsletter_data = array();
|
||||||
$newsletter_data[] = array(
|
$newsletter_data[] = array(
|
||||||
'name' => __('Email subject'),
|
'name' => __('Email subject', 'mailpoet'),
|
||||||
'value' => $statistics_row['newsletter_rendered_subject'],
|
'value' => $statistics_row['newsletter_rendered_subject'],
|
||||||
);
|
);
|
||||||
$newsletter_data[] = array(
|
$newsletter_data[] = array(
|
||||||
'name' => __('Sent at'),
|
'name' => __('Sent at', 'mailpoet'),
|
||||||
'value' => $statistics_row['sent_at'],
|
'value' => $statistics_row['sent_at'],
|
||||||
);
|
);
|
||||||
|
if(isset($statistics_row['opened_at'])) {
|
||||||
|
$newsletter_data[] = array(
|
||||||
|
'name' => __('Opened', 'mailpoet'),
|
||||||
|
'value' => 'Yes',
|
||||||
|
);
|
||||||
|
$newsletter_data[] = array(
|
||||||
|
'name' => __('Opened at', 'mailpoet'),
|
||||||
|
'value' => $statistics_row['opened_at'],
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
$newsletter_data[] = array(
|
||||||
|
'name' => __('Opened', 'mailpoet'),
|
||||||
|
'value' => __('No', 'mailpoet'),
|
||||||
|
);
|
||||||
|
}
|
||||||
if(isset($newsletters[$statistics_row['newsletter_id']])) {
|
if(isset($newsletters[$statistics_row['newsletter_id']])) {
|
||||||
$newsletter_data[] = array(
|
$newsletter_data[] = array(
|
||||||
'name' => __('Email preview'),
|
'name' => __('Email preview', 'mailpoet'),
|
||||||
'value' => Url::getViewInBrowserUrl(
|
'value' => Url::getViewInBrowserUrl(
|
||||||
'',
|
'',
|
||||||
$newsletters[$statistics_row['newsletter_id']],
|
$newsletters[$statistics_row['newsletter_id']],
|
||||||
@@ -61,7 +76,7 @@ class NewslettersExporter {
|
|||||||
}
|
}
|
||||||
return array(
|
return array(
|
||||||
'group_id' => 'mailpoet-newsletters',
|
'group_id' => 'mailpoet-newsletters',
|
||||||
'group_label' => __('MailPoet Emails Sent'),
|
'group_label' => __('MailPoet Emails Sent', 'mailpoet'),
|
||||||
'item_id' => 'newsletter-' . $statistics_row['newsletter_id'],
|
'item_id' => 'newsletter-' . $statistics_row['newsletter_id'],
|
||||||
'data' => $newsletter_data,
|
'data' => $newsletter_data,
|
||||||
);
|
);
|
||||||
|
@@ -29,20 +29,20 @@ class SegmentsExporter {
|
|||||||
private function exportSegment($segment) {
|
private function exportSegment($segment) {
|
||||||
$segment_data = array();
|
$segment_data = array();
|
||||||
$segment_data[] = array(
|
$segment_data[] = array(
|
||||||
'name' => __('List name'),
|
'name' => __('List name', 'mailpoet'),
|
||||||
'value' => $segment['name'],
|
'value' => $segment['name'],
|
||||||
);
|
);
|
||||||
$segment_data[] = array(
|
$segment_data[] = array(
|
||||||
'name' => __('Subscription status'),
|
'name' => __('Subscription status', 'mailpoet'),
|
||||||
'value' => $segment['status'],
|
'value' => $segment['status'],
|
||||||
);
|
);
|
||||||
$segment_data[] = array(
|
$segment_data[] = array(
|
||||||
'name' => __('Timestamp of the subscription (or last change of the subscription status)'),
|
'name' => __('Timestamp of the subscription (or last change of the subscription status)', 'mailpoet'),
|
||||||
'value' => $segment['updated_at'],
|
'value' => $segment['updated_at'],
|
||||||
);
|
);
|
||||||
return array(
|
return array(
|
||||||
'group_id' => 'mailpoet-lists',
|
'group_id' => 'mailpoet-lists',
|
||||||
'group_label' => __('MailPoet Mailing Lists'),
|
'group_label' => __('MailPoet Mailing Lists', 'mailpoet'),
|
||||||
'item_id' => 'list-' . $segment['segment_id'],
|
'item_id' => 'list-' . $segment['segment_id'],
|
||||||
'data' => $segment_data,
|
'data' => $segment_data,
|
||||||
);
|
);
|
||||||
|
@@ -18,7 +18,7 @@ class SubscriberExporter {
|
|||||||
if(!$subscriber) return array();
|
if(!$subscriber) return array();
|
||||||
return array(array(
|
return array(array(
|
||||||
'group_id' => 'mailpoet-subscriber',
|
'group_id' => 'mailpoet-subscriber',
|
||||||
'group_label' => __('MailPoet Subscriber Data'),
|
'group_label' => __('MailPoet Subscriber Data', 'mailpoet'),
|
||||||
'item_id' => 'subscriber-' . $subscriber->id,
|
'item_id' => 'subscriber-' . $subscriber->id,
|
||||||
'data' => $this->getSubscriberExportData($subscriber->withCustomFields()),
|
'data' => $this->getSubscriberExportData($subscriber->withCustomFields()),
|
||||||
));
|
));
|
||||||
@@ -28,36 +28,36 @@ class SubscriberExporter {
|
|||||||
$custom_fields = $this->getCustomFields();
|
$custom_fields = $this->getCustomFields();
|
||||||
$result = array(
|
$result = array(
|
||||||
array(
|
array(
|
||||||
'name' => __('First Name'),
|
'name' => __('First Name', 'mailpoet'),
|
||||||
'value' => $subscriber->first_name,
|
'value' => $subscriber->first_name,
|
||||||
),
|
),
|
||||||
array(
|
array(
|
||||||
'name' => __('Last Name'),
|
'name' => __('Last Name', 'mailpoet'),
|
||||||
'value' => $subscriber->last_name,
|
'value' => $subscriber->last_name,
|
||||||
),
|
),
|
||||||
array(
|
array(
|
||||||
'name' => __('Email'),
|
'name' => __('Email', 'mailpoet'),
|
||||||
'value' => $subscriber->email,
|
'value' => $subscriber->email,
|
||||||
),
|
),
|
||||||
array(
|
array(
|
||||||
'name' => __('Status'),
|
'name' => __('Status', 'mailpoet'),
|
||||||
'value' => $subscriber->status,
|
'value' => $subscriber->status,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
if($subscriber->subscribed_ip) {
|
if($subscriber->subscribed_ip) {
|
||||||
$result[] = array(
|
$result[] = array(
|
||||||
'name' => __('Subscribed IP'),
|
'name' => __('Subscribed IP', 'mailpoet'),
|
||||||
'value' => $subscriber->subscribed_ip,
|
'value' => $subscriber->subscribed_ip,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
if($subscriber->confirmed_ip) {
|
if($subscriber->confirmed_ip) {
|
||||||
$result[] = array(
|
$result[] = array(
|
||||||
'name' => __('Confirmed IP'),
|
'name' => __('Confirmed IP', 'mailpoet'),
|
||||||
'value' => $subscriber->confirmed_ip,
|
'value' => $subscriber->confirmed_ip,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
$result[] = array(
|
$result[] = array(
|
||||||
'name' => __('Created at timestamp'),
|
'name' => __('Created at', 'mailpoet'),
|
||||||
'value' => $subscriber->created_at,
|
'value' => $subscriber->created_at,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
56
lib/Subscribers/SubscriberPersonalDataEraser.php
Normal file
56
lib/Subscribers/SubscriberPersonalDataEraser.php
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace MailPoet\Subscribers;
|
||||||
|
|
||||||
|
use MailPoet\Models\Subscriber;
|
||||||
|
use MailPoet\Models\SubscriberCustomField;
|
||||||
|
|
||||||
|
class SubscriberPersonalDataEraser {
|
||||||
|
|
||||||
|
function erase($email) {
|
||||||
|
if(empty($email)) {
|
||||||
|
return array(
|
||||||
|
'items_removed' => false,
|
||||||
|
'items_retained' => false,
|
||||||
|
'messages' => array(),
|
||||||
|
'done' => true,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
$subscriber = Subscriber::findOne(trim($email));
|
||||||
|
$item_removed = false;
|
||||||
|
$items_retained = true;
|
||||||
|
if($subscriber) {
|
||||||
|
$this->eraseCustomFields($subscriber->id());
|
||||||
|
$this->anonymizeSubscriberData($subscriber);
|
||||||
|
$item_removed = true;
|
||||||
|
$items_retained = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return array(
|
||||||
|
'items_removed' => $item_removed,
|
||||||
|
'items_retained' => $items_retained,
|
||||||
|
'messages' => array(),
|
||||||
|
'done' => true,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function eraseCustomFields($subscriber_id) {
|
||||||
|
$custom_fields = SubscriberCustomField::where('subscriber_id', $subscriber_id)->findMany();
|
||||||
|
foreach($custom_fields as $custom_field) {
|
||||||
|
$custom_field->value = '';
|
||||||
|
$custom_field->save();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private function anonymizeSubscriberData($subscriber) {
|
||||||
|
$subscriber->email = sprintf('deleted-%s@site.invalid', uniqid('', true));
|
||||||
|
$subscriber->first_name = 'Anonymous';
|
||||||
|
$subscriber->last_name = 'Anonymous';
|
||||||
|
$subscriber->status = Subscriber::STATUS_UNSUBSCRIBED;
|
||||||
|
$subscriber->subscribed_ip = '0.0.0.0';
|
||||||
|
$subscriber->confirmed_ip = '0.0.0.0';
|
||||||
|
$subscriber->save();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@@ -9,11 +9,11 @@ class PHPVersionWarningsTest extends \MailPoetTest {
|
|||||||
|
|
||||||
function _before() {
|
function _before() {
|
||||||
$this->phpVersionWarning = new PHPVersionWarnings();
|
$this->phpVersionWarning = new PHPVersionWarnings();
|
||||||
update_option('dismissed-php-version-outdated-notice', false);
|
delete_transient('dismissed-php-version-outdated-notice');
|
||||||
}
|
}
|
||||||
|
|
||||||
function _after() {
|
function _after() {
|
||||||
update_option('dismissed-php-version-outdated-notice', false);
|
delete_transient('dismissed-php-version-outdated-notice');
|
||||||
}
|
}
|
||||||
|
|
||||||
function testItPrintsWarningFor53() {
|
function testItPrintsWarningFor53() {
|
||||||
|
@@ -5,6 +5,7 @@ namespace MailPoet\Subscribers\ImportExport\PersonalDataExporters;
|
|||||||
use MailPoet\Models\Newsletter;
|
use MailPoet\Models\Newsletter;
|
||||||
use MailPoet\Models\SendingQueue;
|
use MailPoet\Models\SendingQueue;
|
||||||
use MailPoet\Models\StatisticsNewsletters;
|
use MailPoet\Models\StatisticsNewsletters;
|
||||||
|
use MailPoet\Models\StatisticsOpens;
|
||||||
use MailPoet\Models\Subscriber;
|
use MailPoet\Models\Subscriber;
|
||||||
|
|
||||||
class NewslettersExporterTest extends \MailPoetTest {
|
class NewslettersExporterTest extends \MailPoetTest {
|
||||||
@@ -81,7 +82,51 @@ class NewslettersExporterTest extends \MailPoetTest {
|
|||||||
'queue_id' => $queue->id(),
|
'queue_id' => $queue->id(),
|
||||||
)));
|
)));
|
||||||
$result = $this->exporter->export('user1@with.newsletters');
|
$result = $this->exporter->export('user1@with.newsletters');
|
||||||
expect($result['data'][0]['data'][2]['name'])->equals('Email preview');
|
expect($result['data'][0]['data'][3]['name'])->equals('Email preview');
|
||||||
expect($result['data'][0]['data'][2]['value'])->contains('mailpoet_router&endpoint=view_in_browser&action=view&data=');
|
expect($result['data'][0]['data'][3]['value'])->contains('mailpoet_router&endpoint=view_in_browser&action=view&data=');
|
||||||
|
}
|
||||||
|
|
||||||
|
function testExportOpens() {
|
||||||
|
$subscriber = Subscriber::createOrUpdate(array(
|
||||||
|
'email' => 'user2@with.newsletters',
|
||||||
|
));
|
||||||
|
$newsletter1 = Newsletter::createOrUpdate(array(
|
||||||
|
'subject' => 'Email Subject1',
|
||||||
|
'type' => Newsletter::TYPE_STANDARD
|
||||||
|
));
|
||||||
|
$newsletter2 = Newsletter::createOrUpdate(array(
|
||||||
|
'subject' => 'Email Subject2',
|
||||||
|
'type' => Newsletter::TYPE_STANDARD
|
||||||
|
));
|
||||||
|
$queue1 = SendingQueue::createOrUpdate(array(
|
||||||
|
'newsletter_rendered_subject' => 'Email Subject1',
|
||||||
|
'task_id' => 2,
|
||||||
|
'newsletter_id' => $newsletter1->id(),
|
||||||
|
));
|
||||||
|
$queue2 = SendingQueue::createOrUpdate(array(
|
||||||
|
'newsletter_rendered_subject' => 'Email Subject1',
|
||||||
|
'task_id' => 2,
|
||||||
|
'newsletter_id' => $newsletter1->id(),
|
||||||
|
));
|
||||||
|
StatisticsNewsletters::createMultiple(array(array(
|
||||||
|
'newsletter_id' => $newsletter1->id(),
|
||||||
|
'subscriber_id' => $subscriber->id(),
|
||||||
|
'queue_id' => $queue1->id(),
|
||||||
|
)));
|
||||||
|
StatisticsNewsletters::createMultiple(array(array(
|
||||||
|
'newsletter_id' => $newsletter2->id(),
|
||||||
|
'subscriber_id' => $subscriber->id(),
|
||||||
|
'queue_id' => $queue2->id(),
|
||||||
|
)));
|
||||||
|
StatisticsOpens::createOrUpdate(array(
|
||||||
|
'subscriber_id' => $subscriber->id(),
|
||||||
|
'newsletter_id' => $newsletter1->id(),
|
||||||
|
'queue_id' => $queue1->id(),
|
||||||
|
'created_at' => '2017-01-02 12:23:45',
|
||||||
|
));
|
||||||
|
$result = $this->exporter->export('user2@with.newsletters');
|
||||||
|
expect($result['data'][0]['data'])->contains(array('name' => 'Opened', 'value' => 'Yes'));
|
||||||
|
expect($result['data'][0]['data'])->contains(array('name' => 'Opened at', 'value' => '2017-01-02 12:23:45'));
|
||||||
|
expect($result['data'][1]['data'])->contains(array('name' => 'Opened', 'value' => 'No'));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -47,7 +47,7 @@ class SubscriberExporterTest extends \MailPoetTest {
|
|||||||
array('name' => 'Last Name', 'value' => 'Doe'),
|
array('name' => 'Last Name', 'value' => 'Doe'),
|
||||||
array('name' => 'Email', 'value' => 'email.that@has.no.custom.fields'),
|
array('name' => 'Email', 'value' => 'email.that@has.no.custom.fields'),
|
||||||
array('name' => 'Status', 'value' => 'unconfirmed'),
|
array('name' => 'Status', 'value' => 'unconfirmed'),
|
||||||
array('name' => 'Created at timestamp', 'value' => '2018-05-03 10:30:08'),
|
array('name' => 'Created at', 'value' => '2018-05-03 10:30:08'),
|
||||||
);
|
);
|
||||||
expect($result['data'][0]['data'])->equals($expected);
|
expect($result['data'][0]['data'])->equals($expected);
|
||||||
}
|
}
|
||||||
|
83
tests/unit/Subscribers/SubscriberPersonalDataEraserTest.php
Normal file
83
tests/unit/Subscribers/SubscriberPersonalDataEraserTest.php
Normal file
@@ -0,0 +1,83 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace MailPoet\Subscribers;
|
||||||
|
|
||||||
|
use MailPoet\Models\CustomField;
|
||||||
|
use MailPoet\Models\Subscriber;
|
||||||
|
use MailPoet\Models\SubscriberCustomField;
|
||||||
|
|
||||||
|
class SubscriberPersonalDataEraserTest extends \MailPoetTest {
|
||||||
|
|
||||||
|
/** @var SubscriberPersonalDataEraser */
|
||||||
|
private $eraser;
|
||||||
|
|
||||||
|
function _before() {
|
||||||
|
$this->eraser = new SubscriberPersonalDataEraser();
|
||||||
|
\ORM::raw_execute('TRUNCATE ' . Subscriber::$_table);
|
||||||
|
\ORM::raw_execute('TRUNCATE ' . CustomField::$_table);
|
||||||
|
\ORM::raw_execute('TRUNCATE ' . SubscriberCustomField::$_table);
|
||||||
|
}
|
||||||
|
|
||||||
|
function testExportWorksWhenSubscriberNotFound() {
|
||||||
|
$result = $this->eraser->erase('email.that@doesnt.exists');
|
||||||
|
expect($result)->internalType('array');
|
||||||
|
expect($result)->hasKey('items_removed');
|
||||||
|
expect($result['items_removed'])->equals(0);
|
||||||
|
expect($result)->hasKey('done');
|
||||||
|
expect($result['done'])->equals(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
function testItDeletesCustomFields() {
|
||||||
|
$subscriber = Subscriber::createOrUpdate(array(
|
||||||
|
'email' => 'eraser.test.email.that@has.custom.fields',
|
||||||
|
));
|
||||||
|
$custom_field1 = CustomField::createOrUpdate(array(
|
||||||
|
'name' => 'Custom field1',
|
||||||
|
'type' => 'input'
|
||||||
|
));
|
||||||
|
$custom_field2 = CustomField::createOrUpdate(array(
|
||||||
|
'name' => 'Custom field2',
|
||||||
|
'type' => 'input'
|
||||||
|
));
|
||||||
|
$subscriber->setCustomField($custom_field1->id(), 'Value');
|
||||||
|
$subscriber->setCustomField($custom_field2->id(), 'Value');
|
||||||
|
|
||||||
|
$this->eraser->erase('eraser.test.email.that@has.custom.fields');
|
||||||
|
|
||||||
|
$subscriber_custom_fields = SubscriberCustomField::where('subscriber_id', $subscriber->id())->findMany();
|
||||||
|
expect($subscriber_custom_fields)->count(2);
|
||||||
|
expect($subscriber_custom_fields[0]->value)->equals('');
|
||||||
|
expect($subscriber_custom_fields[1]->value)->equals('');
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
function testItDeletesSubscriberData() {
|
||||||
|
$subscriber = Subscriber::createOrUpdate(array(
|
||||||
|
'email' => 'subscriber@for.anon.test',
|
||||||
|
'first_name' => 'John',
|
||||||
|
'last_name' => 'Doe',
|
||||||
|
'status' => 'subscribed',
|
||||||
|
'created_at' => '2018-05-03 10:30:08',
|
||||||
|
'subscribed_ip' => 'IP1',
|
||||||
|
'confirmed_ip' => 'IP2',
|
||||||
|
'unconfirmed_data' => 'xyz',
|
||||||
|
));
|
||||||
|
$this->eraser->erase('subscriber@for.anon.test');
|
||||||
|
$subscriber_after = Subscriber::findOne($subscriber->id());
|
||||||
|
expect($subscriber_after->first_name)->equals('Anonymous');
|
||||||
|
expect($subscriber_after->last_name)->equals('Anonymous');
|
||||||
|
expect($subscriber_after->status)->equals('unsubscribed');
|
||||||
|
expect($subscriber_after->subscribed_ip)->equals('0.0.0.0');
|
||||||
|
expect($subscriber_after->confirmed_ip)->equals('0.0.0.0');
|
||||||
|
expect($subscriber_after->unconfirmed_data)->equals('');
|
||||||
|
}
|
||||||
|
|
||||||
|
function testItDeletesSubscriberEmailAddress() {
|
||||||
|
$subscriber = Subscriber::createOrUpdate(array(
|
||||||
|
'email' => 'subscriber@for.anon.test',
|
||||||
|
));
|
||||||
|
$this->eraser->erase('subscriber@for.anon.test');
|
||||||
|
$subscriber_after = Subscriber::findOne($subscriber->id());
|
||||||
|
expect($subscriber_after->email)->notEquals('subscriber@for.anon.test');
|
||||||
|
}
|
||||||
|
}
|
Reference in New Issue
Block a user