diff --git a/lib/API/MP/v1/API.php b/lib/API/MP/v1/API.php index dec16a37b4..c8e2888337 100644 --- a/lib/API/MP/v1/API.php +++ b/lib/API/MP/v1/API.php @@ -69,6 +69,7 @@ class API { function subscribeToLists($subscriber_id, array $segments_ids, $options = array()) { $schedule_welcome_email = (isset($options['schedule_welcome_email']) && $options['schedule_welcome_email'] === false) ? false : true; + $send_confirmation_email = (isset($options['send_confirmation_email']) && $options['send_confirmation_email'] === false) ? false : true; if (empty($segments_ids)) { throw new \Exception(__('At least one segment ID is required.', 'mailpoet')); @@ -116,6 +117,20 @@ class API { $this->_scheduleWelcomeNotification($subscriber, $found_segments_ids); } + // send confirmation email + if ( + $send_confirmation_email + && $subscriber->status === Subscriber::STATUS_UNCONFIRMED + && (int)$subscriber->count_confirmations === 0 + ) { + $result = $this->_sendConfirmationEmail($subscriber); + if (!$result && $subscriber->getErrors()) { + throw new \Exception( + WPFunctions::get()->__(sprintf('Subscriber added to lists, but confirmation email failed to send: %s', strtolower(implode(', ', $subscriber->getErrors()))), 'mailpoet') + ); + } + } + return $subscriber->withCustomFields()->withSubscriptions()->asArray(); } @@ -217,17 +232,9 @@ class API { // subscribe to segments and optionally: 1) send confirmation email, 2) schedule welcome email(s) if (!empty($segments)) { - $this->subscribeToLists($new_subscriber->id, $segments); - - // send confirmation email - if ($send_confirmation_email && $new_subscriber->status === Subscriber::STATUS_UNCONFIRMED) { - $result = $this->_sendConfirmationEmail($new_subscriber); - if (!$result && $new_subscriber->getErrors()) { - throw new \Exception( - WPFunctions::get()->__(sprintf('Subscriber added, but confirmation email failed to send: %s', strtolower(implode(', ', $new_subscriber->getErrors()))), 'mailpoet') - ); - } - } + $this->subscribeToLists($new_subscriber->id, $segments, [ + 'send_confirmation_email' => $send_confirmation_email, + ]); // schedule welcome email(s) if ($schedule_welcome_email && $new_subscriber->status === Subscriber::STATUS_SUBSCRIBED) { diff --git a/tests/integration/API/MP/APITest.php b/tests/integration/API/MP/APITest.php index 5af3f5f253..ce57afae95 100644 --- a/tests/integration/API/MP/APITest.php +++ b/tests/integration/API/MP/APITest.php @@ -191,6 +191,42 @@ class APITest extends \MailPoetTest { expect($result['subscriptions'][0]['segment_id'])->equals($segment->id); } + function testItSendsConfirmationEmailToASubscriberWhenBeingAddedToList() { + $subscriber = Subscriber::create(); + $subscriber->hydrate(Fixtures::get('subscriber_template')); + $subscriber->status = Subscriber::STATUS_UNCONFIRMED; + $subscriber->save(); + $segment = Segment::createOrUpdate([ + 'name' => 'Default', + 'type' => Segment::TYPE_DEFAULT, + ]); + $segment->save(); + + $sent = false; + $API = $this->makeEmptyExcept(\MailPoet\API\MP\v1\API::class, 'subscribeToLists', [ + '_sendConfirmationEmail' => function () use (&$sent) { + $sent = true; + }, + ]); + + $segments = [$segment->id]; + + // should not send + $API->subscribeToLists($subscriber->email, $segments, ['send_confirmation_email' => false]); + expect($sent)->equals(false); + + // should send + $API->subscribeToLists($subscriber->email, $segments); + expect($sent)->equals(true); + + // should not send + $sent = false; + $subscriber->count_confirmations = 1; + $subscriber->save(); + $API->subscribeToLists($subscriber->email, $segments); + expect($sent)->equals(false); + } + function testItSubscribesSubscriberWithEmailIdentifier() { $subscriber = Subscriber::create(); $subscriber->hydrate(Fixtures::get('subscriber_template')); @@ -464,14 +500,18 @@ class APITest extends \MailPoetTest { } function testByDefaultItSendsConfirmationEmailAfterAddingSubscriber() { - $API = Stub::makeEmptyExcept( + $API = $this->makeEmptyExcept( \MailPoet\API\MP\v1\API::class, 'addSubscriber', - array( - '_sendConfirmationEmail' => Expected::once(), + [ + 'subscribeToLists' => Expected::once(function ($subscriber_id, $segments_ids, $options) { + expect($options)->contains('send_confirmation_email'); + expect($options['send_confirmation_email'])->equals(true); + }), 'required_custom_field_validator' => Stub::makeEmpty(RequiredCustomFieldValidator::class, ['validate']), 'new_subscriber_notification_mailer'=> Stub::makeEmpty(NewSubscriberNotificationMailer::class, ['send']) - ), $this); + ] + ); $subscriber = array( 'email' => 'test@example.com' ); @@ -500,7 +540,7 @@ class APITest extends \MailPoetTest { $subscriber = array( 'email' => 'test@example.com' ); - $this->setExpectedException('\Exception', 'Subscriber added, but confirmation email failed to send: big error'); + $this->setExpectedException('\Exception', 'Subscriber added to lists, but confirmation email failed to send: big error'); $API->addSubscriber($subscriber, array($segment->id), array('send_confirmation_email' => true)); }