Move API save tests to controller tests
[MAILPOET-2900]
This commit is contained in:
@ -31,7 +31,6 @@ use MailPoet\Newsletter\Scheduler\Scheduler;
|
|||||||
use MailPoet\Newsletter\Statistics\NewsletterStatisticsRepository;
|
use MailPoet\Newsletter\Statistics\NewsletterStatisticsRepository;
|
||||||
use MailPoet\Newsletter\Url;
|
use MailPoet\Newsletter\Url;
|
||||||
use MailPoet\Router\Router;
|
use MailPoet\Router\Router;
|
||||||
use MailPoet\Services\AuthorizedEmailsController;
|
|
||||||
use MailPoet\Settings\SettingsController;
|
use MailPoet\Settings\SettingsController;
|
||||||
use MailPoet\Tasks\Sending as SendingTask;
|
use MailPoet\Tasks\Sending as SendingTask;
|
||||||
use MailPoet\Util\License\Features\Subscribers as SubscribersFeature;
|
use MailPoet\Util\License\Features\Subscribers as SubscribersFeature;
|
||||||
@ -168,253 +167,18 @@ class NewslettersTest extends \MailPoetTest {
|
|||||||
expect(WPHooksHelper::getFilterApplied($hookName)[0])->internalType('array');
|
expect(WPHooksHelper::getFilterApplied($hookName)[0])->internalType('array');
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testItCanSaveANewNewsletter() {
|
public function testItCanSaveANewsletter() {
|
||||||
$newsletterOptionField = NewsletterOptionField::create();
|
|
||||||
$newsletterOptionField->name = 'some_option';
|
|
||||||
$newsletterOptionField->newsletterType = Newsletter::TYPE_STANDARD;
|
|
||||||
$newsletterOptionField->save();
|
|
||||||
|
|
||||||
$validData = [
|
|
||||||
'subject' => 'My First Newsletter',
|
|
||||||
'type' => Newsletter::TYPE_STANDARD,
|
|
||||||
'options' => [
|
|
||||||
$newsletterOptionField->name => 'some_option_value',
|
|
||||||
],
|
|
||||||
'body' => 'some text',
|
|
||||||
];
|
|
||||||
|
|
||||||
$emoji = $this->make(
|
|
||||||
Emoji::class,
|
|
||||||
['encodeForUTF8Column' => Expected::once(function ($params) {
|
|
||||||
return $params;
|
|
||||||
})]
|
|
||||||
);
|
|
||||||
|
|
||||||
$wp = Stub::make(new WPFunctions, [
|
|
||||||
'applyFilters' => asCallable([WPHooksHelper::class, 'applyFilters']),
|
|
||||||
'doAction' => asCallable([WPHooksHelper::class, 'doAction']),
|
|
||||||
]);
|
|
||||||
$this->endpoint = $this->createNewslettersEndpointWithMocks([
|
|
||||||
'wp' => $wp,
|
|
||||||
'cronHelper' => $this->cronHelper,
|
|
||||||
'authorizedEmailsController' => $this->make(AuthorizedEmailsController::class, ['onNewsletterSenderAddressUpdate' => Expected::once()]),
|
|
||||||
'emoji' => $emoji,
|
|
||||||
'subscribersFeature' => Stub::make(SubscribersFeature::class),
|
|
||||||
]);
|
|
||||||
|
|
||||||
$response = $this->endpoint->save($validData);
|
|
||||||
$savedNewsletter = Newsletter::filter('filterWithOptions', Newsletter::TYPE_STANDARD)
|
|
||||||
->findOne($response->data['id']);
|
|
||||||
expect($response->status)->equals(APIResponse::STATUS_OK);
|
|
||||||
expect($response->data)->equals($savedNewsletter->asArray());
|
|
||||||
// newsletter option should be saved
|
|
||||||
expect($savedNewsletter->someOption)->equals('some_option_value');
|
|
||||||
expect(strlen($savedNewsletter->unsubscribeToken))->equals(15);
|
|
||||||
|
|
||||||
$hookName = 'mailpoet_api_newsletters_save_before';
|
|
||||||
expect(WPHooksHelper::isFilterApplied($hookName))->true();
|
|
||||||
expect(WPHooksHelper::getFilterApplied($hookName)[0])->internalType('array');
|
|
||||||
$hookName = 'mailpoet_api_newsletters_save_after';
|
|
||||||
expect(WPHooksHelper::isActionDone($hookName))->true();
|
|
||||||
expect(WPHooksHelper::getActionDone($hookName)[0] instanceof Newsletter)->true();
|
|
||||||
|
|
||||||
$invalidData = [
|
|
||||||
'subject' => 'Missing newsletter type',
|
|
||||||
];
|
|
||||||
|
|
||||||
$response = $this->endpoint->save($invalidData);
|
|
||||||
expect($response->status)->equals(APIResponse::STATUS_BAD_REQUEST);
|
|
||||||
expect($response->errors[0]['message'])->equals('Please specify a type.');
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testItCanSaveAnExistingNewsletter() {
|
|
||||||
$newsletterData = [
|
$newsletterData = [
|
||||||
'id' => $this->newsletter->id,
|
'id' => $this->newsletter->id,
|
||||||
'subject' => 'My Updated Newsletter',
|
'subject' => 'My Updated Newsletter',
|
||||||
];
|
];
|
||||||
|
|
||||||
$response = $this->endpoint->save($newsletterData);
|
$response = $this->endpoint->save($newsletterData);
|
||||||
$updatedNewsletter = Newsletter::findOne($this->newsletter->id);
|
|
||||||
expect($response->status)->equals(APIResponse::STATUS_OK);
|
expect($response->status)->equals(APIResponse::STATUS_OK);
|
||||||
|
$updatedNewsletter = Newsletter::findOne($this->newsletter->id);
|
||||||
expect($response->data)->equals($updatedNewsletter->asArray());
|
expect($response->data)->equals($updatedNewsletter->asArray());
|
||||||
expect($updatedNewsletter->subject)->equals('My Updated Newsletter');
|
expect($updatedNewsletter->subject)->equals('My Updated Newsletter');
|
||||||
}
|
|
||||||
|
|
||||||
public function testItDoesNotRerenderPostNotificationsUponUpdate() {
|
|
||||||
$sendingQueue = SendingTask::create();
|
|
||||||
$sendingQueue->newsletterId = $this->postNotification->id;
|
|
||||||
$sendingQueue->status = SendingQueue::STATUS_SCHEDULED;
|
|
||||||
$sendingQueue->newsletterRenderedBody = null;
|
|
||||||
$sendingQueue->newsletterRenderedSubject = null;
|
|
||||||
$sendingQueue->save();
|
|
||||||
expect($sendingQueue->getErrors())->false();
|
|
||||||
|
|
||||||
$newsletterData = [
|
|
||||||
'id' => $this->postNotification->id,
|
|
||||||
'subject' => 'My Updated Newsletter',
|
|
||||||
'body' => Fixtures::get('newsletter_body_template'),
|
|
||||||
];
|
|
||||||
|
|
||||||
$response = $this->endpoint->save($newsletterData);
|
|
||||||
$updatedQueue = SendingQueue::where('newsletter_id', $this->postNotification->id)
|
|
||||||
->findOne()
|
|
||||||
->asArray();
|
|
||||||
|
|
||||||
expect($response->status)->equals(APIResponse::STATUS_OK);
|
|
||||||
expect($updatedQueue['newsletter_rendered_body'])->null();
|
|
||||||
expect($updatedQueue['newsletter_rendered_subject'])->null();
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testItCanRerenderQueueUponSave() {
|
|
||||||
$sendingQueue = SendingTask::create();
|
|
||||||
$sendingQueue->newsletterId = $this->newsletter->id;
|
|
||||||
$sendingQueue->status = SendingQueue::STATUS_SCHEDULED;
|
|
||||||
$sendingQueue->newsletterRenderedBody = null;
|
|
||||||
$sendingQueue->newsletterRenderedSubject = null;
|
|
||||||
$sendingQueue->save();
|
|
||||||
expect($sendingQueue->getErrors())->false();
|
|
||||||
|
|
||||||
$newsletterData = [
|
|
||||||
'id' => $this->newsletter->id,
|
|
||||||
'subject' => 'My Updated Newsletter',
|
|
||||||
'body' => Fixtures::get('newsletter_body_template'),
|
|
||||||
];
|
|
||||||
|
|
||||||
$response = $this->endpoint->save($newsletterData);
|
|
||||||
$updatedQueue = SendingQueue::where('newsletter_id', $this->newsletter->id)
|
|
||||||
->findOne()
|
|
||||||
->asArray();
|
|
||||||
|
|
||||||
expect($response->status)->equals(APIResponse::STATUS_OK);
|
|
||||||
expect($updatedQueue['newsletter_rendered_body'])->hasKey('html');
|
|
||||||
expect($updatedQueue['newsletter_rendered_body'])->hasKey('text');
|
|
||||||
expect($updatedQueue['newsletter_rendered_subject'])->equals('My Updated Newsletter');
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testItCanUpdatePostNotificationScheduleUponSave() {
|
|
||||||
$newsletterOptions = [
|
|
||||||
'intervalType',
|
|
||||||
'timeOfDay',
|
|
||||||
'weekDay',
|
|
||||||
'monthDay',
|
|
||||||
'nthWeekDay',
|
|
||||||
'schedule',
|
|
||||||
];
|
|
||||||
foreach ($newsletterOptions as $option) {
|
|
||||||
$newsletterOptionField = NewsletterOptionField::create();
|
|
||||||
$newsletterOptionField->name = $option;
|
|
||||||
$newsletterOptionField->newsletterType = Newsletter::TYPE_NOTIFICATION;
|
|
||||||
$newsletterOptionField->save();
|
|
||||||
}
|
|
||||||
|
|
||||||
$newsletterData = [
|
|
||||||
'id' => $this->newsletter->id,
|
|
||||||
'type' => Newsletter::TYPE_NOTIFICATION,
|
|
||||||
'subject' => 'Newsletter',
|
|
||||||
'options' => [
|
|
||||||
'intervalType' => PostNotificationScheduler::INTERVAL_WEEKLY,
|
|
||||||
'timeOfDay' => '50400',
|
|
||||||
'weekDay' => '1',
|
|
||||||
'monthDay' => '0',
|
|
||||||
'nthWeekDay' => '1',
|
|
||||||
'schedule' => '0 14 * * 1',
|
|
||||||
],
|
|
||||||
];
|
|
||||||
$response = $this->endpoint->save($newsletterData);
|
|
||||||
$savedNewsletter = Newsletter::filter('filterWithOptions', Newsletter::TYPE_NOTIFICATION)
|
|
||||||
->findOne($response->data['id']);
|
|
||||||
expect($response->status)->equals(APIResponse::STATUS_OK);
|
|
||||||
expect($response->data)->equals($savedNewsletter->asArray());
|
|
||||||
|
|
||||||
// schedule should be recalculated when options change
|
|
||||||
$newsletterData['options']['intervalType'] = PostNotificationScheduler::INTERVAL_IMMEDIATELY;
|
|
||||||
$response = $this->endpoint->save($newsletterData);
|
|
||||||
$savedNewsletter = Newsletter::filter('filterWithOptions', Newsletter::TYPE_NOTIFICATION)
|
|
||||||
->findOne($response->data['id']);
|
|
||||||
expect($response->status)->equals(APIResponse::STATUS_OK);
|
|
||||||
expect($savedNewsletter->schedule)->equals('* * * * *');
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testItCanReschedulePreviouslyScheduledSendingQueueJobs() {
|
|
||||||
// create newsletter options
|
|
||||||
$newsletterOptions = [
|
|
||||||
'intervalType',
|
|
||||||
'timeOfDay',
|
|
||||||
'weekDay',
|
|
||||||
'monthDay',
|
|
||||||
'nthWeekDay',
|
|
||||||
'schedule',
|
|
||||||
];
|
|
||||||
foreach ($newsletterOptions as $option) {
|
|
||||||
$newsletterOptionField = NewsletterOptionField::create();
|
|
||||||
$newsletterOptionField->name = $option;
|
|
||||||
$newsletterOptionField->newsletterType = Newsletter::TYPE_NOTIFICATION;
|
|
||||||
$newsletterOptionField->save();
|
|
||||||
}
|
|
||||||
|
|
||||||
// create sending queues
|
|
||||||
$currentTime = Carbon::now();
|
|
||||||
$sendingQueue1 = SendingTask::create();
|
|
||||||
$sendingQueue1->newsletterId = 1;
|
|
||||||
$sendingQueue1->status = SendingQueue::STATUS_SCHEDULED;
|
|
||||||
$sendingQueue1->scheduledAt = $currentTime;
|
|
||||||
$sendingQueue1->save();
|
|
||||||
|
|
||||||
$sendingQueue2 = SendingTask::create();
|
|
||||||
$sendingQueue2->newsletterId = 1;
|
|
||||||
$sendingQueue2->save();
|
|
||||||
|
|
||||||
// save newsletter via router
|
|
||||||
$newsletterData = [
|
|
||||||
'id' => 1,
|
|
||||||
'type' => Newsletter::TYPE_NOTIFICATION,
|
|
||||||
'subject' => 'Newsletter',
|
|
||||||
'options' => [
|
|
||||||
// weekly on Monday @ 7am
|
|
||||||
'intervalType' => PostNotificationScheduler::INTERVAL_WEEKLY,
|
|
||||||
'timeOfDay' => '25200',
|
|
||||||
'weekDay' => '1',
|
|
||||||
'monthDay' => '0',
|
|
||||||
'nthWeekDay' => '1',
|
|
||||||
'schedule' => '0 7 * * 1',
|
|
||||||
],
|
|
||||||
];
|
|
||||||
$newsletter = $this->endpoint->save($newsletterData);
|
|
||||||
/** @var SendingQueue $sendingQueue1 */
|
|
||||||
$sendingQueue1 = SendingQueue::findOne($sendingQueue1->id);
|
|
||||||
$sendingQueue1 = SendingTask::createFromQueue($sendingQueue1);
|
|
||||||
/** @var SendingQueue $sendingQueue2 */
|
|
||||||
$sendingQueue2 = SendingQueue::findOne($sendingQueue2->id);
|
|
||||||
$sendingQueue2 = SendingTask::createFromQueue($sendingQueue2);
|
|
||||||
expect($sendingQueue1->scheduledAt)->notEquals($currentTime);
|
|
||||||
expect($sendingQueue1->scheduledAt)->equals(
|
|
||||||
Scheduler::getNextRunDate($newsletter->data['schedule'])
|
|
||||||
);
|
|
||||||
expect($sendingQueue2->scheduledAt)->null();
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testItCanModifySegmentsOfExistingNewsletter() {
|
|
||||||
$segment1 = Segment::createOrUpdate(['name' => 'Segment 1']);
|
|
||||||
$fakeSegmentId = 1;
|
|
||||||
|
|
||||||
$newsletterData = [
|
|
||||||
'id' => $this->newsletter->id,
|
|
||||||
'subject' => 'My Updated Newsletter',
|
|
||||||
'segments' => [
|
|
||||||
$segment1->asArray(),
|
|
||||||
$fakeSegmentId,
|
|
||||||
],
|
|
||||||
];
|
|
||||||
|
|
||||||
$response = $this->endpoint->save($newsletterData);
|
|
||||||
expect($response->status)->equals(APIResponse::STATUS_OK);
|
|
||||||
|
|
||||||
$updatedNewsletter =
|
|
||||||
Newsletter::findOne($this->newsletter->id)
|
|
||||||
->withSegments();
|
|
||||||
|
|
||||||
expect(count($updatedNewsletter->segments))->equals(1);
|
|
||||||
expect($updatedNewsletter->segments[0]['name'])->equals('Segment 1');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testItReturnsErrorIfSubscribersLimitReached() {
|
public function testItReturnsErrorIfSubscribersLimitReached() {
|
||||||
@ -901,87 +665,6 @@ class NewslettersTest extends \MailPoetTest {
|
|||||||
expect((boolean)$previewLinkData['preview'])->true();
|
expect((boolean)$previewLinkData['preview'])->true();
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testItDeletesSendingQueueAndSetsNewsletterStatusToDraftWhenItIsUnscheduled() {
|
|
||||||
$newsletter = $this->newsletter;
|
|
||||||
$newsletter->status = Newsletter::STATUS_SCHEDULED;
|
|
||||||
$newsletter->save();
|
|
||||||
expect($newsletter->getErrors())->false();
|
|
||||||
|
|
||||||
$sendingQueue = SendingTask::create();
|
|
||||||
$sendingQueue->newsletterId = $newsletter->id;
|
|
||||||
$sendingQueue->newsletterRenderedBody = [
|
|
||||||
'html' => 'html',
|
|
||||||
'text' => 'text',
|
|
||||||
];
|
|
||||||
$sendingQueue->status = SendingQueue::STATUS_SCHEDULED;
|
|
||||||
$sendingQueue->scheduledAt = Carbon::now()->format('Y-m-d H:i');
|
|
||||||
$sendingQueue->save();
|
|
||||||
expect($sendingQueue->getErrors())->false();
|
|
||||||
|
|
||||||
$newsletterData = [
|
|
||||||
'id' => $newsletter->id,
|
|
||||||
'options' => [
|
|
||||||
'isScheduled' => false,
|
|
||||||
],
|
|
||||||
];
|
|
||||||
|
|
||||||
$this->endpoint->save($newsletterData);
|
|
||||||
$newsletter = Newsletter::findOne($newsletter->id);
|
|
||||||
$sendingQueue = SendingQueue::findOne($sendingQueue->id);
|
|
||||||
expect($newsletter->status)->equals(Newsletter::STATUS_DRAFT);
|
|
||||||
expect($sendingQueue)->false();
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testItSavesDefaultSenderIfNeeded() {
|
|
||||||
$settings = $this->diContainer->get(SettingsController::class);
|
|
||||||
$settings->set('sender', null);
|
|
||||||
|
|
||||||
$data = [
|
|
||||||
'subject' => 'My New Newsletter',
|
|
||||||
'type' => Newsletter::TYPE_STANDARD,
|
|
||||||
'sender_name' => 'Test sender',
|
|
||||||
'sender_address' => 'test@example.com',
|
|
||||||
];
|
|
||||||
$response = $this->endpoint->save($data);
|
|
||||||
expect($response->status)->equals(APIResponse::STATUS_OK);
|
|
||||||
expect($settings->get('sender.name'))->same('Test sender');
|
|
||||||
expect($settings->get('sender.address'))->same('test@example.com');
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testItDoesntSaveDefaultSenderWhenEmptyValues() {
|
|
||||||
$settings = $this->diContainer->get(SettingsController::class);
|
|
||||||
$settings->set('sender', null);
|
|
||||||
|
|
||||||
$data = [
|
|
||||||
'subject' => 'My New Newsletter',
|
|
||||||
'type' => Newsletter::TYPE_STANDARD,
|
|
||||||
'sender_name' => '',
|
|
||||||
'sender_address' => null,
|
|
||||||
];
|
|
||||||
$response = $this->endpoint->save($data);
|
|
||||||
expect($response->status)->equals(APIResponse::STATUS_OK);
|
|
||||||
expect($settings->get('sender'))->null();
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testItDoesntOverrideDefaultSender() {
|
|
||||||
$settings = $this->diContainer->get(SettingsController::class);
|
|
||||||
$settings->set('sender', [
|
|
||||||
'name' => 'Test sender',
|
|
||||||
'address' => 'test@example.com',
|
|
||||||
]);
|
|
||||||
|
|
||||||
$data = [
|
|
||||||
'subject' => 'My New Newsletter',
|
|
||||||
'type' => Newsletter::TYPE_STANDARD,
|
|
||||||
'sender_name' => 'Another test sender',
|
|
||||||
'sender_address' => 'another.test@example.com',
|
|
||||||
];
|
|
||||||
$response = $this->endpoint->save($data);
|
|
||||||
expect($response->status)->equals(APIResponse::STATUS_OK);
|
|
||||||
expect($settings->get('sender.name'))->same('Test sender');
|
|
||||||
expect($settings->get('sender.address'))->same('test@example.com');
|
|
||||||
}
|
|
||||||
|
|
||||||
public function _after() {
|
public function _after() {
|
||||||
ORM::raw_execute('TRUNCATE ' . Newsletter::$_table);
|
ORM::raw_execute('TRUNCATE ' . Newsletter::$_table);
|
||||||
ORM::raw_execute('TRUNCATE ' . NewsletterSegment::$_table);
|
ORM::raw_execute('TRUNCATE ' . NewsletterSegment::$_table);
|
||||||
|
337
tests/integration/Newsletter/NewsletterSaveControllerTest.php
Normal file
337
tests/integration/Newsletter/NewsletterSaveControllerTest.php
Normal file
@ -0,0 +1,337 @@
|
|||||||
|
<?php declare(strict_types = 1);
|
||||||
|
|
||||||
|
namespace MailPoet\Newsletter;
|
||||||
|
|
||||||
|
use Codeception\Util\Fixtures;
|
||||||
|
use MailPoet\Entities\NewsletterOptionEntity;
|
||||||
|
use MailPoet\Models\Newsletter;
|
||||||
|
use MailPoet\Models\NewsletterOptionField;
|
||||||
|
use MailPoet\Models\Segment;
|
||||||
|
use MailPoet\Models\SendingQueue;
|
||||||
|
use MailPoet\Newsletter\Scheduler\PostNotificationScheduler;
|
||||||
|
use MailPoet\Newsletter\Scheduler\Scheduler;
|
||||||
|
use MailPoet\Settings\SettingsController;
|
||||||
|
use MailPoet\Tasks\Sending as SendingTask;
|
||||||
|
use MailPoetVendor\Carbon\Carbon;
|
||||||
|
|
||||||
|
class NewsletterSaveControllerTest extends \MailPoetTest {
|
||||||
|
/** @var Newsletter */
|
||||||
|
private $newsletter;
|
||||||
|
|
||||||
|
/** @var Newsletter */
|
||||||
|
private $postNotification;
|
||||||
|
|
||||||
|
/** @var NewsletterSaveController */
|
||||||
|
private $saveController;
|
||||||
|
|
||||||
|
public function _before() {
|
||||||
|
parent::_before();
|
||||||
|
$this->saveController = $this->diContainer->get(NewsletterSaveController::class);
|
||||||
|
$this->newsletter = Newsletter::createOrUpdate([
|
||||||
|
'subject' => 'My Standard Newsletter',
|
||||||
|
'body' => Fixtures::get('newsletter_body_template'),
|
||||||
|
'type' => Newsletter::TYPE_STANDARD,
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->postNotification = Newsletter::createOrUpdate([
|
||||||
|
'subject' => 'My Post Notification',
|
||||||
|
'body' => Fixtures::get('newsletter_body_template'),
|
||||||
|
'type' => Newsletter::TYPE_NOTIFICATION,
|
||||||
|
]);
|
||||||
|
|
||||||
|
NewsletterOptionField::createOrUpdate([
|
||||||
|
'name' => 'isScheduled',
|
||||||
|
'newsletter_type' => 'standard',
|
||||||
|
]);
|
||||||
|
NewsletterOptionField::createOrUpdate([
|
||||||
|
'name' => 'scheduledAt',
|
||||||
|
'newsletter_type' => 'standard',
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testItCanSaveANewsletter() {
|
||||||
|
$newsletterData = [
|
||||||
|
'id' => $this->newsletter->id,
|
||||||
|
'subject' => 'Updated subject',
|
||||||
|
];
|
||||||
|
|
||||||
|
$newsletter = $this->saveController->save($newsletterData);
|
||||||
|
expect($newsletter->getSubject())->equals('Updated subject');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testItDoesNotRerenderPostNotificationsUponUpdate() {
|
||||||
|
// create newsletter options
|
||||||
|
$newsletterOptions = [
|
||||||
|
'intervalType',
|
||||||
|
'timeOfDay',
|
||||||
|
'weekDay',
|
||||||
|
'monthDay',
|
||||||
|
'nthWeekDay',
|
||||||
|
'schedule',
|
||||||
|
];
|
||||||
|
foreach ($newsletterOptions as $option) {
|
||||||
|
$newsletterOptionField = NewsletterOptionField::create();
|
||||||
|
$newsletterOptionField->name = $option;
|
||||||
|
$newsletterOptionField->newsletterType = Newsletter::TYPE_NOTIFICATION;
|
||||||
|
$newsletterOptionField->save();
|
||||||
|
}
|
||||||
|
|
||||||
|
$sendingQueue = SendingTask::create();
|
||||||
|
$sendingQueue->newsletterId = $this->postNotification->id;
|
||||||
|
$sendingQueue->status = SendingQueue::STATUS_SCHEDULED;
|
||||||
|
$sendingQueue->newsletterRenderedBody = null;
|
||||||
|
$sendingQueue->newsletterRenderedSubject = null;
|
||||||
|
$sendingQueue->save();
|
||||||
|
expect($sendingQueue->getErrors())->false();
|
||||||
|
|
||||||
|
$newsletterData = [
|
||||||
|
'id' => $this->postNotification->id,
|
||||||
|
'subject' => 'My Updated Newsletter',
|
||||||
|
'body' => Fixtures::get('newsletter_body_template'),
|
||||||
|
];
|
||||||
|
|
||||||
|
$newsletter = $this->saveController->save($newsletterData);
|
||||||
|
$updatedQueue = SendingQueue::where('newsletter_id', $this->postNotification->id)
|
||||||
|
->findOne()
|
||||||
|
->asArray();
|
||||||
|
|
||||||
|
expect($updatedQueue['newsletter_rendered_body'])->null();
|
||||||
|
expect($updatedQueue['newsletter_rendered_subject'])->null();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testItCanRerenderQueueUponSave() {
|
||||||
|
$sendingQueue = SendingTask::create();
|
||||||
|
$sendingQueue->newsletterId = $this->newsletter->id;
|
||||||
|
$sendingQueue->status = SendingQueue::STATUS_SCHEDULED;
|
||||||
|
$sendingQueue->newsletterRenderedBody = null;
|
||||||
|
$sendingQueue->newsletterRenderedSubject = null;
|
||||||
|
$sendingQueue->save();
|
||||||
|
expect($sendingQueue->getErrors())->false();
|
||||||
|
|
||||||
|
$newsletterData = [
|
||||||
|
'id' => $this->newsletter->id,
|
||||||
|
'subject' => 'My Updated Newsletter',
|
||||||
|
'body' => Fixtures::get('newsletter_body_template'),
|
||||||
|
];
|
||||||
|
|
||||||
|
$newsletter = $this->saveController->save($newsletterData);
|
||||||
|
$updatedQueue = SendingQueue::where('newsletter_id', $this->newsletter->id)
|
||||||
|
->findOne()
|
||||||
|
->asArray();
|
||||||
|
|
||||||
|
expect($updatedQueue['newsletter_rendered_body'])->hasKey('html');
|
||||||
|
expect($updatedQueue['newsletter_rendered_body'])->hasKey('text');
|
||||||
|
expect($updatedQueue['newsletter_rendered_subject'])->equals('My Updated Newsletter');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testItCanUpdatePostNotificationScheduleUponSave() {
|
||||||
|
$newsletterOptions = [
|
||||||
|
'intervalType',
|
||||||
|
'timeOfDay',
|
||||||
|
'weekDay',
|
||||||
|
'monthDay',
|
||||||
|
'nthWeekDay',
|
||||||
|
'schedule',
|
||||||
|
];
|
||||||
|
foreach ($newsletterOptions as $option) {
|
||||||
|
$newsletterOptionField = NewsletterOptionField::create();
|
||||||
|
$newsletterOptionField->name = $option;
|
||||||
|
$newsletterOptionField->newsletterType = Newsletter::TYPE_NOTIFICATION;
|
||||||
|
$newsletterOptionField->save();
|
||||||
|
}
|
||||||
|
|
||||||
|
$newsletterData = [
|
||||||
|
'id' => $this->newsletter->id,
|
||||||
|
'type' => Newsletter::TYPE_NOTIFICATION,
|
||||||
|
'subject' => 'Newsletter',
|
||||||
|
'options' => [
|
||||||
|
'intervalType' => PostNotificationScheduler::INTERVAL_WEEKLY,
|
||||||
|
'timeOfDay' => '50400',
|
||||||
|
'weekDay' => '1',
|
||||||
|
'monthDay' => '0',
|
||||||
|
'nthWeekDay' => '1',
|
||||||
|
'schedule' => '0 14 * * 1',
|
||||||
|
],
|
||||||
|
];
|
||||||
|
$newsletter = $this->saveController->save($newsletterData);
|
||||||
|
$scheduleOption = $newsletter->getOptions()->filter(function (NewsletterOptionEntity $newsletterOption) {
|
||||||
|
return $newsletterOption->getOptionField()->getName() === 'schedule';
|
||||||
|
})->first();
|
||||||
|
|
||||||
|
expect($scheduleOption->getValue())->equals('0 14 * * 1');
|
||||||
|
|
||||||
|
// schedule should be recalculated when options change
|
||||||
|
$newsletterData['options']['intervalType'] = PostNotificationScheduler::INTERVAL_IMMEDIATELY;
|
||||||
|
$savedNewsletter = $this->saveController->save($newsletterData);
|
||||||
|
|
||||||
|
$scheduleOption = $savedNewsletter->getOptions()->filter(function (NewsletterOptionEntity $newsletterOption) {
|
||||||
|
return $newsletterOption->getOptionField()->getName() === 'schedule';
|
||||||
|
})->first();
|
||||||
|
|
||||||
|
expect($scheduleOption->getValue())->equals('* * * * *');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testItCanReschedulePreviouslyScheduledSendingQueueJobs() {
|
||||||
|
// create newsletter options
|
||||||
|
$newsletterOptions = [
|
||||||
|
'intervalType',
|
||||||
|
'timeOfDay',
|
||||||
|
'weekDay',
|
||||||
|
'monthDay',
|
||||||
|
'nthWeekDay',
|
||||||
|
'schedule',
|
||||||
|
];
|
||||||
|
foreach ($newsletterOptions as $option) {
|
||||||
|
$newsletterOptionField = NewsletterOptionField::create();
|
||||||
|
$newsletterOptionField->name = $option;
|
||||||
|
$newsletterOptionField->newsletterType = Newsletter::TYPE_NOTIFICATION;
|
||||||
|
$newsletterOptionField->save();
|
||||||
|
}
|
||||||
|
|
||||||
|
// create sending queues
|
||||||
|
$currentTime = Carbon::now();
|
||||||
|
$sendingQueue1 = SendingTask::create();
|
||||||
|
$sendingQueue1->newsletterId = 1;
|
||||||
|
$sendingQueue1->status = SendingQueue::STATUS_SCHEDULED;
|
||||||
|
$sendingQueue1->scheduledAt = $currentTime;
|
||||||
|
$sendingQueue1->save();
|
||||||
|
|
||||||
|
$sendingQueue2 = SendingTask::create();
|
||||||
|
$sendingQueue2->newsletterId = 1;
|
||||||
|
$sendingQueue2->save();
|
||||||
|
|
||||||
|
// save newsletter via router
|
||||||
|
$newsletterData = [
|
||||||
|
'id' => 1,
|
||||||
|
'type' => Newsletter::TYPE_NOTIFICATION,
|
||||||
|
'subject' => 'Newsletter',
|
||||||
|
'options' => [
|
||||||
|
// weekly on Monday @ 7am
|
||||||
|
'intervalType' => PostNotificationScheduler::INTERVAL_WEEKLY,
|
||||||
|
'timeOfDay' => '25200',
|
||||||
|
'weekDay' => '1',
|
||||||
|
'monthDay' => '0',
|
||||||
|
'nthWeekDay' => '1',
|
||||||
|
'schedule' => '0 7 * * 1',
|
||||||
|
],
|
||||||
|
];
|
||||||
|
$newsletter = $this->saveController->save($newsletterData);
|
||||||
|
/** @var SendingQueue $sendingQueue1 */
|
||||||
|
$sendingQueue1 = SendingQueue::findOne($sendingQueue1->id);
|
||||||
|
$sendingQueue1 = SendingTask::createFromQueue($sendingQueue1);
|
||||||
|
/** @var SendingQueue $sendingQueue2 */
|
||||||
|
$sendingQueue2 = SendingQueue::findOne($sendingQueue2->id);
|
||||||
|
$sendingQueue2 = SendingTask::createFromQueue($sendingQueue2);
|
||||||
|
expect($sendingQueue1->scheduledAt)->notEquals($currentTime);
|
||||||
|
|
||||||
|
$scheduleOption = $newsletter->getOptions()->filter(function (NewsletterOptionEntity $newsletterOption) {
|
||||||
|
return $newsletterOption->getOptionField()->getName() === 'schedule';
|
||||||
|
})->first();
|
||||||
|
|
||||||
|
expect($sendingQueue1->scheduledAt)->equals(
|
||||||
|
Scheduler::getNextRunDate($scheduleOption->getValue())
|
||||||
|
);
|
||||||
|
expect($sendingQueue2->scheduledAt)->null();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testItCanModifySegmentsOfExistingNewsletter() {
|
||||||
|
$segment1 = Segment::createOrUpdate(['name' => 'Segment 1']);
|
||||||
|
$fakeSegmentId = 1;
|
||||||
|
|
||||||
|
$newsletterData = [
|
||||||
|
'id' => $this->newsletter->id,
|
||||||
|
'subject' => 'My Updated Newsletter',
|
||||||
|
'segments' => [
|
||||||
|
$segment1->asArray(),
|
||||||
|
$fakeSegmentId,
|
||||||
|
],
|
||||||
|
];
|
||||||
|
|
||||||
|
$newsletter = $this->saveController->save($newsletterData);
|
||||||
|
expect(count($newsletter->getNewsletterSegments()))->equals(1);
|
||||||
|
expect($newsletter->getNewsletterSegments()->first()->getSegment()->getName())->equals('Segment 1');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testItDeletesSendingQueueAndSetsNewsletterStatusToDraftWhenItIsUnscheduled() {
|
||||||
|
$newsletter = $this->newsletter;
|
||||||
|
$newsletter->status = Newsletter::STATUS_SCHEDULED;
|
||||||
|
$newsletter->save();
|
||||||
|
expect($newsletter->getErrors())->false();
|
||||||
|
|
||||||
|
$sendingQueue = SendingTask::create();
|
||||||
|
$sendingQueue->newsletterId = $newsletter->id;
|
||||||
|
$sendingQueue->newsletterRenderedBody = [
|
||||||
|
'html' => 'html',
|
||||||
|
'text' => 'text',
|
||||||
|
];
|
||||||
|
$sendingQueue->status = SendingQueue::STATUS_SCHEDULED;
|
||||||
|
$sendingQueue->scheduledAt = Carbon::now()->format('Y-m-d H:i');
|
||||||
|
$sendingQueue->save();
|
||||||
|
expect($sendingQueue->getErrors())->false();
|
||||||
|
|
||||||
|
$newsletterData = [
|
||||||
|
'id' => $newsletter->id,
|
||||||
|
'options' => [
|
||||||
|
'isScheduled' => false,
|
||||||
|
],
|
||||||
|
];
|
||||||
|
|
||||||
|
$newsletter = $this->saveController->save($newsletterData);
|
||||||
|
$sendingQueue = SendingQueue::findOne($sendingQueue->id);
|
||||||
|
expect($newsletter->getStatus())->equals(Newsletter::STATUS_DRAFT);
|
||||||
|
expect($sendingQueue)->false();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testItSavesDefaultSenderIfNeeded() {
|
||||||
|
$settings = $this->diContainer->get(SettingsController::class);
|
||||||
|
$settings->set('sender', null);
|
||||||
|
|
||||||
|
$data = [
|
||||||
|
'id' => $this->newsletter->id,
|
||||||
|
'subject' => 'My New Newsletter',
|
||||||
|
'type' => Newsletter::TYPE_STANDARD,
|
||||||
|
'sender_name' => 'Test sender',
|
||||||
|
'sender_address' => 'test@example.com',
|
||||||
|
];
|
||||||
|
|
||||||
|
$this->saveController->save($data);
|
||||||
|
expect($settings->get('sender.name'))->same('Test sender');
|
||||||
|
expect($settings->get('sender.address'))->same('test@example.com');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testItDoesntSaveDefaultSenderWhenEmptyValues() {
|
||||||
|
$settings = $this->diContainer->get(SettingsController::class);
|
||||||
|
$settings->set('sender', null);
|
||||||
|
|
||||||
|
$data = [
|
||||||
|
'id' => $this->newsletter->id,
|
||||||
|
'subject' => 'My New Newsletter',
|
||||||
|
'type' => Newsletter::TYPE_STANDARD,
|
||||||
|
'sender_name' => '',
|
||||||
|
'sender_address' => null,
|
||||||
|
];
|
||||||
|
|
||||||
|
$this->saveController->save($data);
|
||||||
|
expect($settings->get('sender'))->null();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testItDoesntOverrideDefaultSender() {
|
||||||
|
$settings = $this->diContainer->get(SettingsController::class);
|
||||||
|
$settings->set('sender', [
|
||||||
|
'name' => 'Test sender',
|
||||||
|
'address' => 'test@example.com',
|
||||||
|
]);
|
||||||
|
|
||||||
|
$data = [
|
||||||
|
'id' => $this->newsletter->id,
|
||||||
|
'subject' => 'My New Newsletter',
|
||||||
|
'type' => Newsletter::TYPE_STANDARD,
|
||||||
|
'sender_name' => 'Another test sender',
|
||||||
|
'sender_address' => 'another.test@example.com',
|
||||||
|
];
|
||||||
|
|
||||||
|
$this->saveController->save($data);
|
||||||
|
expect($settings->get('sender.name'))->same('Test sender');
|
||||||
|
expect($settings->get('sender.address'))->same('test@example.com');
|
||||||
|
}
|
||||||
|
}
|
Reference in New Issue
Block a user