Fix importing WP users as subscribers

[MAILPOET-3298]
This commit is contained in:
Rostislav Wolny
2020-11-16 11:33:04 +01:00
committed by Veljko V
parent a751a2a459
commit d91c383e53
3 changed files with 41 additions and 9 deletions

View File

@ -7,14 +7,23 @@ use MailPoet\Config\AccessControl;
use MailPoet\Cron\Workers\WooCommerceSync; use MailPoet\Cron\Workers\WooCommerceSync;
use MailPoet\Models\ScheduledTask; use MailPoet\Models\ScheduledTask;
use MailPoet\Models\Segment; use MailPoet\Models\Segment;
use MailPoet\Segments\WP;
use MailPoet\Subscribers\ImportExport\Import\MailChimp; use MailPoet\Subscribers\ImportExport\Import\MailChimp;
use MailPoetVendor\Carbon\Carbon; use MailPoetVendor\Carbon\Carbon;
class ImportExport extends APIEndpoint { class ImportExport extends APIEndpoint {
/** @var WP */
private $wpSegment;
public $permissions = [ public $permissions = [
'global' => AccessControl::PERMISSION_MANAGE_SUBSCRIBERS, 'global' => AccessControl::PERMISSION_MANAGE_SUBSCRIBERS,
]; ];
public function __construct(WP $wpSegment) {
$this->wpSegment = $wpSegment;
}
public function getMailChimpLists($data) { public function getMailChimpLists($data) {
try { try {
$mailChimp = new MailChimp($data['api_key']); $mailChimp = new MailChimp($data['api_key']);
@ -55,6 +64,7 @@ class ImportExport extends APIEndpoint {
public function processImport($data) { public function processImport($data) {
try { try {
$import = new \MailPoet\Subscribers\ImportExport\Import\Import( $import = new \MailPoet\Subscribers\ImportExport\Import\Import(
$this->wpSegment,
json_decode($data, true) json_decode($data, true)
); );
$process = $import->process(); $process = $import->process();

View File

@ -8,6 +8,7 @@ use MailPoet\Models\Newsletter;
use MailPoet\Models\Subscriber; use MailPoet\Models\Subscriber;
use MailPoet\Models\SubscriberCustomField; use MailPoet\Models\SubscriberCustomField;
use MailPoet\Models\SubscriberSegment; use MailPoet\Models\SubscriberSegment;
use MailPoet\Segments\WP;
use MailPoet\Subscribers\ImportExport\ImportExportFactory; use MailPoet\Subscribers\ImportExport\ImportExportFactory;
use MailPoet\Subscribers\Source; use MailPoet\Subscribers\Source;
use MailPoet\Util\DateConverter; use MailPoet\Util\DateConverter;
@ -31,7 +32,11 @@ class Import {
const DB_QUERY_CHUNK_SIZE = 100; const DB_QUERY_CHUNK_SIZE = 100;
const STATUS_DONT_UPDATE = 'dont_update'; const STATUS_DONT_UPDATE = 'dont_update';
public function __construct($data) { /** @var WP */
private $wpSegment;
public function __construct(WP $wpSegment, $data) {
$this->wpSegment = $wpSegment;
$this->validateImportData($data); $this->validateImportData($data);
$this->subscribersData = $this->transformSubscribersData( $this->subscribersData = $this->transformSubscribersData(
$data['subscribers'], $data['subscribers'],
@ -445,7 +450,7 @@ class Import {
} }
public function synchronizeWPUsers($wpUsers) { public function synchronizeWPUsers($wpUsers) {
return array_walk($wpUsers, '\MailPoet\Segments\WP::synchronizeUser'); return array_walk($wpUsers, [$this->wpSegment, 'synchronizeUser']);
} }
public function addSubscribersToSegments($subscribersIds, $segmentsIds) { public function addSubscribersToSegments($subscribersIds, $segmentsIds) {

View File

@ -7,6 +7,7 @@ use MailPoet\Models\Segment;
use MailPoet\Models\Subscriber; use MailPoet\Models\Subscriber;
use MailPoet\Models\SubscriberCustomField; use MailPoet\Models\SubscriberCustomField;
use MailPoet\Models\SubscriberSegment; use MailPoet\Models\SubscriberSegment;
use MailPoet\Segments\WP;
use MailPoet\Subscribers\ImportExport\Import\Import; use MailPoet\Subscribers\ImportExport\Import\Import;
use MailPoetVendor\Idiorm\ORM; use MailPoetVendor\Idiorm\ORM;
@ -19,7 +20,11 @@ class ImportTest extends \MailPoetTest {
public $segment2; public $segment2;
public $segment1; public $segment1;
/** @var WP */
private $wpSegment;
public function _before() { public function _before() {
$this->wpSegment = $this->diContainer->get(WP::class);
$customField = CustomField::create(); $customField = CustomField::create();
$customField->name = 'country'; $customField->name = 'country';
$customField->type = 'text'; $customField->type = 'text';
@ -61,7 +66,7 @@ class ImportTest extends \MailPoetTest {
'last_name', 'last_name',
'email', 'email',
]; ];
$this->import = new Import($this->testData); $this->import = new Import($this->wpSegment, $this->testData);
$this->subscribersData = $this->import->transformSubscribersData( $this->subscribersData = $this->import->transformSubscribersData(
$this->testData['subscribers'], $this->testData['subscribers'],
$this->testData['columns'] $this->testData['columns']
@ -145,7 +150,7 @@ class ImportTest extends \MailPoetTest {
'existingSubscribersStatus' => Import::STATUS_DONT_UPDATE, 'existingSubscribersStatus' => Import::STATUS_DONT_UPDATE,
'updateSubscribers' => true, 'updateSubscribers' => true,
]; ];
$import = new Import($data); $import = new Import($this->wpSegment, $data);
try { try {
$import->process(); $import->process();
self::fail('No valid subscribers found exception not thrown.'); self::fail('No valid subscribers found exception not thrown.');
@ -219,7 +224,7 @@ class ImportTest extends \MailPoetTest {
'existingSubscribersStatus' => Import::STATUS_DONT_UPDATE, 'existingSubscribersStatus' => Import::STATUS_DONT_UPDATE,
'updateSubscribers' => true, 'updateSubscribers' => true,
]; ];
$import = new Import($data); $import = new Import($this->wpSegment, $data);
$subscribersData = [ $subscribersData = [
'data' => $import->subscribersData, 'data' => $import->subscribersData,
'fields' => $import->subscribersFields, 'fields' => $import->subscribersFields,
@ -437,7 +442,7 @@ class ImportTest extends \MailPoetTest {
$data['columns']['status'] = ['index' => 4]; $data['columns']['status'] = ['index' => 4];
$data['subscribers'][0][] = 'unsubscribed'; $data['subscribers'][0][] = 'unsubscribed';
$data['subscribers'][1][] = 'unsubscribed'; $data['subscribers'][1][] = 'unsubscribed';
$import = new Import($data); $import = new Import($this->wpSegment, $data);
$result = $import->process(); $result = $import->process();
$newSubscribers = Subscriber::whereAnyIs([ $newSubscribers = Subscriber::whereAnyIs([
['email' => $data['subscribers'][0][2]], ['email' => $data['subscribers'][0][2]],
@ -461,7 +466,7 @@ class ImportTest extends \MailPoetTest {
$data['columns']['last_subscribed_at'] = ['index' => 4]; $data['columns']['last_subscribed_at'] = ['index' => 4];
$data['subscribers'][0][] = '2018-12-12 12:12:00'; $data['subscribers'][0][] = '2018-12-12 12:12:00';
$data['subscribers'][1][] = '2018-12-12 12:12:00'; $data['subscribers'][1][] = '2018-12-12 12:12:00';
$import = new Import($data); $import = new Import($this->wpSegment, $data);
$existingSubscriber = Subscriber::create(); $existingSubscriber = Subscriber::create();
$existingSubscriber->hydrate( $existingSubscriber->hydrate(
[ [
@ -476,6 +481,18 @@ class ImportTest extends \MailPoetTest {
expect($updatedSubscriber->lastSubscribedAt)->equals('2017-12-12 12:12:00'); expect($updatedSubscriber->lastSubscribedAt)->equals('2017-12-12 12:12:00');
} }
public function testItSynchronizesWpUsers() {
$this->tester->createWordPressUser('mary@jane.com', 'editor');
$beforeImport = Subscriber::where('email', 'mary@jane.com')->findOne();
$data = $this->testData;
$import = new Import($this->wpSegment, $data);
$import->process();
$imported = Subscriber::where('email', 'mary@jane.com')->findOne();
expect($imported->firstName)->equals($beforeImport->firstName); // Subscriber name was synchronized from WP
expect($imported->firstName)->notEquals('Mary');
$this->tester->deleteWordPressUser('mary@jane.com');
}
public function testItDoesUpdateStatusExistingSubscriberWhenExistingSubscribersStatusIsSet() { public function testItDoesUpdateStatusExistingSubscriberWhenExistingSubscribersStatusIsSet() {
$data = $this->testData; $data = $this->testData;
$data['existingSubscribersStatus'] = Subscriber::STATUS_SUBSCRIBED; $data['existingSubscribersStatus'] = Subscriber::STATUS_SUBSCRIBED;
@ -488,7 +505,7 @@ class ImportTest extends \MailPoetTest {
'status' => Subscriber::STATUS_UNSUBSCRIBED, 'status' => Subscriber::STATUS_UNSUBSCRIBED,
'last_subscribed_at' => '2020-08-08 08:08:00', 'last_subscribed_at' => '2020-08-08 08:08:00',
]); ]);
$import = new Import($data); $import = new Import($this->wpSegment, $data);
$import->process(); $import->process();
$updatedSubscriber = Subscriber::where('email', $existingSubscriber->email)->findOne(); $updatedSubscriber = Subscriber::where('email', $existingSubscriber->email)->findOne();
expect($updatedSubscriber->status)->equals(Subscriber::STATUS_SUBSCRIBED); expect($updatedSubscriber->status)->equals(Subscriber::STATUS_SUBSCRIBED);
@ -497,7 +514,7 @@ class ImportTest extends \MailPoetTest {
public function testItDoesStatusNewSubscriberWhenNewSubscribersStatusIsSet() { public function testItDoesStatusNewSubscriberWhenNewSubscribersStatusIsSet() {
$data = $this->testData; $data = $this->testData;
$data['newSubscribersStatus'] = Subscriber::STATUS_UNSUBSCRIBED; $data['newSubscribersStatus'] = Subscriber::STATUS_UNSUBSCRIBED;
$import = new Import($data); $import = new Import($this->wpSegment, $data);
$import->process(); $import->process();
$newSubscriber = Subscriber::where('email', 'Adam@Smith.com')->findOne(); $newSubscriber = Subscriber::where('email', 'Adam@Smith.com')->findOne();
expect($newSubscriber->status)->equals(Subscriber::STATUS_UNSUBSCRIBED); expect($newSubscriber->status)->equals(Subscriber::STATUS_UNSUBSCRIBED);