Schedules welcome notification upon subscription when subscription
confirmation is disabled Schedules welcome notification upon subscription confirmation Checks when 'REMOTE_ADDR' is not set Adds unit tests
This commit is contained in:
@ -230,11 +230,13 @@ class Subscriber extends Model {
|
||||
$subscriber->sendConfirmationEmail();
|
||||
|
||||
// welcome email
|
||||
if($subscriber->status === self::STATUS_SUBSCRIBED) {
|
||||
Scheduler::scheduleSubscriberWelcomeNotification(
|
||||
$subscriber->id,
|
||||
$segment_ids
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
return $subscriber;
|
||||
}
|
||||
|
@ -6,7 +6,9 @@ use MailPoet\Models\SubscriberSegment;
|
||||
use MailPoet\Models\CustomField;
|
||||
use MailPoet\Models\Setting;
|
||||
use MailPoet\Models\Segment;
|
||||
use MailPoet\Util\Url;
|
||||
use MailPoet\Newsletter\Scheduler\Scheduler;
|
||||
use MailPoet\Util\Helpers;
|
||||
use MailPoet\Util\Url as UrlHelper;
|
||||
use MailPoet\Subscription;
|
||||
use MailPoet\Form\Renderer as FormRenderer;
|
||||
use MailPoet\Form\Block\Date as FormBlockDate;
|
||||
@ -63,16 +65,27 @@ class Pages {
|
||||
$subscriber_data = $this->subscriber->getUnconfirmedData();
|
||||
|
||||
$this->subscriber->status = Subscriber::STATUS_SUBSCRIBED;
|
||||
$this->subscriber->confirmed_ip = $_SERVER['REMOTE_ADDR'];
|
||||
$this->subscriber->confirmed_ip = (!empty($_SERVER['REMOTE_ADDR'])) ? $_SERVER['REMOTE_ADDR'] : null;
|
||||
$this->subscriber->setExpr('confirmed_at', 'NOW()');
|
||||
$this->subscriber->unconfirmed_data = null;
|
||||
$this->subscriber->save();
|
||||
|
||||
if($this->subscriber->getErrors() === false) {
|
||||
// send welcome notification
|
||||
$subsciber_segments = $this->subscriber->segments()->findArray();
|
||||
if($subsciber_segments) {
|
||||
Scheduler::scheduleSubscriberWelcomeNotification(
|
||||
$this->subscriber->id,
|
||||
Helpers::arrayColumn($subsciber_segments, 'id')
|
||||
);
|
||||
}
|
||||
|
||||
// update subscriber from stored data after confirmation
|
||||
if(!empty($subscriber_data)) {
|
||||
Subscriber::createOrUpdate($subscriber_data);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function unsubscribe() {
|
||||
if($this->subscriber !== false) {
|
||||
@ -346,7 +359,7 @@ class Pages {
|
||||
' value="mailpoet_subscription_update" />';
|
||||
$form_html .= '<input type="hidden" name="data[segments]" value="" />';
|
||||
$form_html .= '<input type="hidden" name="mailpoet_redirect" '.
|
||||
'value="'.Url::getCurrentUrl().'" />';
|
||||
'value="'.UrlHelper::getCurrentUrl().'" />';
|
||||
$form_html .= '<input type="hidden" name="data[email]" value="'.
|
||||
$subscriber->email.
|
||||
'" />';
|
||||
@ -404,7 +417,7 @@ class Pages {
|
||||
: __('Manage your subscription', 'mailpoet')
|
||||
);
|
||||
|
||||
return '<a href="'.Subscription\Url::getManageUrl(
|
||||
return '<a href="'.Subscription\UrlHelper::getManageUrl(
|
||||
$this->subscriber
|
||||
).'">'.$text.'</a>';
|
||||
}
|
||||
|
@ -3,7 +3,11 @@
|
||||
use Carbon\Carbon;
|
||||
use Codeception\Util\Fixtures;
|
||||
use MailPoet\Models\CustomField;
|
||||
use MailPoet\Models\Newsletter;
|
||||
use MailPoet\Models\NewsletterOption;
|
||||
use MailPoet\Models\NewsletterOptionField;
|
||||
use MailPoet\Models\Segment;
|
||||
use MailPoet\Models\SendingQueue;
|
||||
use MailPoet\Models\Setting;
|
||||
use MailPoet\Models\Subscriber;
|
||||
use MailPoet\Models\SubscriberCustomField;
|
||||
@ -414,6 +418,100 @@ class SubscriberTest extends MailPoetTest {
|
||||
expect($subscriber->deleted_at)->equals(null);
|
||||
}
|
||||
|
||||
function testItSchedulesWelcomeNotificationUponSubscriptionWhenSubscriptionConfirmationIsDisabled() {
|
||||
// create segment
|
||||
$segment = Segment::create();
|
||||
$segment->hydrate(array('name' => 'List #1'));
|
||||
$segment->save();
|
||||
expect($segment->getErrors())->false();
|
||||
|
||||
// create welcome notification newsletter and relevant scheduling options
|
||||
$newsletter = Newsletter::create();
|
||||
$newsletter->type = Newsletter::TYPE_WELCOME;
|
||||
$newsletter->status = Newsletter::STATUS_ACTIVE;
|
||||
$newsletter->save();
|
||||
expect($newsletter->getErrors())->false();
|
||||
|
||||
$newsletter_options = array(
|
||||
'event' => 'segment',
|
||||
'segment' => $segment->id,
|
||||
'afterTimeType' => 'days',
|
||||
'afterTimeNumber' => 1
|
||||
);
|
||||
foreach($newsletter_options as $option => $value) {
|
||||
$newsletter_option_field = NewsletterOptionField::create();
|
||||
$newsletter_option_field->name = $option;
|
||||
$newsletter_option_field->newsletter_type = $newsletter->type;
|
||||
$newsletter_option_field->save();
|
||||
expect($newsletter_option_field->getErrors())->false();
|
||||
|
||||
$newsletter_option = NewsletterOption::create();
|
||||
$newsletter_option->option_field_id = $newsletter_option_field->id;
|
||||
$newsletter_option->newsletter_id = $newsletter->id;
|
||||
$newsletter_option->value = $value;
|
||||
$newsletter_option->save();
|
||||
expect($newsletter_option->getErrors())->false();
|
||||
}
|
||||
|
||||
$signup_confirmation_enabled = (bool)Setting::setValue(
|
||||
'signup_confirmation.enabled', false
|
||||
);
|
||||
$subscriber = Subscriber::subscribe($this->data, array($segment->id()));
|
||||
expect($subscriber->id() > 0)->equals(true);
|
||||
expect($subscriber->segments()->count())->equals(1);
|
||||
$scheduled_notification = SendingQueue::where('newsletter_id', $newsletter->id)
|
||||
->where('status', SendingQueue::STATUS_SCHEDULED)
|
||||
->findOne();
|
||||
expect($scheduled_notification)->notEmpty();
|
||||
}
|
||||
|
||||
function testItDoesNotScheduleWelcomeNotificationUponSubscriptionWhenSubscriptionConfirmationIsEnabled() {
|
||||
// create segment
|
||||
$segment = Segment::create();
|
||||
$segment->hydrate(array('name' => 'List #1'));
|
||||
$segment->save();
|
||||
expect($segment->getErrors())->false();
|
||||
|
||||
// create welcome notification newsletter and relevant scheduling options
|
||||
$newsletter = Newsletter::create();
|
||||
$newsletter->type = Newsletter::TYPE_WELCOME;
|
||||
$newsletter->status = Newsletter::STATUS_ACTIVE;
|
||||
$newsletter->save();
|
||||
expect($newsletter->getErrors())->false();
|
||||
|
||||
$newsletter_options = array(
|
||||
'event' => 'segment',
|
||||
'segment' => $segment->id,
|
||||
'afterTimeType' => 'days',
|
||||
'afterTimeNumber' => 1
|
||||
);
|
||||
foreach($newsletter_options as $option => $value) {
|
||||
$newsletter_option_field = NewsletterOptionField::create();
|
||||
$newsletter_option_field->name = $option;
|
||||
$newsletter_option_field->newsletter_type = $newsletter->type;
|
||||
$newsletter_option_field->save();
|
||||
expect($newsletter_option_field->getErrors())->false();
|
||||
|
||||
$newsletter_option = NewsletterOption::create();
|
||||
$newsletter_option->option_field_id = $newsletter_option_field->id;
|
||||
$newsletter_option->newsletter_id = $newsletter->id;
|
||||
$newsletter_option->value = $value;
|
||||
$newsletter_option->save();
|
||||
expect($newsletter_option->getErrors())->false();
|
||||
}
|
||||
|
||||
$signup_confirmation_enabled = (bool)Setting::setValue(
|
||||
'signup_confirmation.enabled', true
|
||||
);
|
||||
$subscriber = Subscriber::subscribe($this->data, array($segment->id()));
|
||||
expect($subscriber->id() > 0)->equals(true);
|
||||
expect($subscriber->segments()->count())->equals(1);
|
||||
$scheduled_notification = SendingQueue::where('newsletter_id', $newsletter->id)
|
||||
->where('status', SendingQueue::STATUS_SCHEDULED)
|
||||
->findOne();
|
||||
expect($scheduled_notification)->notEmpty();
|
||||
}
|
||||
|
||||
function testItCannotSubscribeWithReservedColumns() {
|
||||
$segment = Segment::create();
|
||||
$segment->hydrate(array('name' => 'List #1'));
|
||||
@ -943,5 +1041,9 @@ class SubscriberTest extends MailPoetTest {
|
||||
ORM::raw_execute('TRUNCATE ' . SubscriberSegment::$_table);
|
||||
ORM::raw_execute('TRUNCATE ' . CustomField::$_table);
|
||||
ORM::raw_execute('TRUNCATE ' . SubscriberCustomField::$_table);
|
||||
ORM::raw_execute('TRUNCATE ' . Newsletter::$_table);
|
||||
ORM::raw_execute('TRUNCATE ' . NewsletterOptionField::$_table);
|
||||
ORM::raw_execute('TRUNCATE ' . NewsletterOption::$_table);
|
||||
ORM::raw_execute('TRUNCATE ' . Setting::$_table);
|
||||
}
|
||||
}
|
91
tests/unit/Subscription/PagesTest.php
Normal file
91
tests/unit/Subscription/PagesTest.php
Normal file
@ -0,0 +1,91 @@
|
||||
<?php
|
||||
use Codeception\Util\Fixtures;
|
||||
use MailPoet\Models\Newsletter;
|
||||
use MailPoet\Models\NewsletterOption;
|
||||
use MailPoet\Models\NewsletterOptionField;
|
||||
use MailPoet\Models\Segment;
|
||||
use MailPoet\Models\SendingQueue;
|
||||
use MailPoet\Models\Subscriber;
|
||||
use MailPoet\Models\SubscriberSegment;
|
||||
use MailPoet\Subscription\Pages;
|
||||
|
||||
class PagesTest extends MailPoetTest {
|
||||
function _before() {
|
||||
$this->subscriber = Subscriber::create();
|
||||
$this->subscriber->hydrate(Fixtures::get('subscriber_template'));
|
||||
$this->subscriber->status = Subscriber::STATUS_UNCONFIRMED;
|
||||
$this->subscriber->save();
|
||||
expect($this->subscriber->getErrors())->false();
|
||||
$this->data['email'] = $this->subscriber->email;
|
||||
$this->data['token'] = Subscriber::generateToken($this->subscriber->email);
|
||||
$this->subscription = new Pages($action = false, $this->data);
|
||||
}
|
||||
|
||||
function testItConfirmsSubscription() {
|
||||
$this->subscription->confirm();
|
||||
$confirmed_subscriber = Subscriber::findOne($this->subscriber->id);
|
||||
expect($confirmed_subscriber->status)->equals(Subscriber::STATUS_SUBSCRIBED);
|
||||
}
|
||||
|
||||
function testItSendsWelcomeNotificationUponConfirmingSubscription() {
|
||||
// create segment
|
||||
$segment = Segment::create();
|
||||
$segment->hydrate(array('name' => 'List #1'));
|
||||
$segment->save();
|
||||
expect($segment->getErrors())->false();
|
||||
// create subscriber->segment relation
|
||||
$subscriber_segment = SubscriberSegment::create();
|
||||
$subscriber_segment->hydrate(
|
||||
array(
|
||||
'subscriber_id' => $this->subscriber->id,
|
||||
'segment_id' => $segment->id
|
||||
)
|
||||
);
|
||||
$subscriber_segment->save();
|
||||
expect($subscriber_segment->getErrors())->false();
|
||||
|
||||
// create welcome notification newsletter and relevant scheduling options
|
||||
$newsletter = Newsletter::create();
|
||||
$newsletter->type = Newsletter::TYPE_WELCOME;
|
||||
$newsletter->status = Newsletter::STATUS_ACTIVE;
|
||||
$newsletter->save();
|
||||
expect($newsletter->getErrors())->false();
|
||||
$newsletter_options = array(
|
||||
'event' => 'segment',
|
||||
'segment' => $segment->id,
|
||||
'afterTimeType' => 'days',
|
||||
'afterTimeNumber' => 1
|
||||
);
|
||||
foreach($newsletter_options as $option => $value) {
|
||||
$newsletter_option_field = NewsletterOptionField::create();
|
||||
$newsletter_option_field->name = $option;
|
||||
$newsletter_option_field->newsletter_type = $newsletter->type;
|
||||
$newsletter_option_field->save();
|
||||
expect($newsletter_option_field->getErrors())->false();
|
||||
|
||||
$newsletter_option = NewsletterOption::create();
|
||||
$newsletter_option->option_field_id = $newsletter_option_field->id;
|
||||
$newsletter_option->newsletter_id = $newsletter->id;
|
||||
$newsletter_option->value = $value;
|
||||
$newsletter_option->save();
|
||||
expect($newsletter_option->getErrors())->false();
|
||||
}
|
||||
|
||||
// confirm subscription and ensure that welcome email is scheduled
|
||||
$this->subscription->confirm();
|
||||
$scheduled_notification = SendingQueue::where('newsletter_id', $newsletter->id)
|
||||
->where('status', SendingQueue::STATUS_SCHEDULED)
|
||||
->findOne();
|
||||
expect($scheduled_notification)->notEmpty();
|
||||
}
|
||||
|
||||
function _after() {
|
||||
ORM::raw_execute('TRUNCATE ' . Subscriber::$_table);
|
||||
ORM::raw_execute('TRUNCATE ' . SendingQueue::$_table);
|
||||
ORM::raw_execute('TRUNCATE ' . Newsletter::$_table);
|
||||
ORM::raw_execute('TRUNCATE ' . Segment::$_table);
|
||||
ORM::raw_execute('TRUNCATE ' . SubscriberSegment::$_table);
|
||||
ORM::raw_execute('TRUNCATE ' . NewsletterOption::$_table);
|
||||
ORM::raw_execute('TRUNCATE ' . NewsletterOptionField::$_table);
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user