diff --git a/tests/unit/API/Endpoints/MailerTest.php b/tests/unit/API/Endpoints/MailerTest.php new file mode 100644 index 0000000000..554c9ebab4 --- /dev/null +++ b/tests/unit/API/Endpoints/MailerTest.php @@ -0,0 +1,21 @@ + MailerLog::STATUS_PAUSED); + MailerLog::updateMailerLog($mailer_log); + $mailer_log = MailerLog::getMailerLog(); + expect($mailer_log['status'])->equals(MailerLog::STATUS_PAUSED); + // resumeSending() method should clear the mailer log's status + $mailer_endpoint = new Mailer(); + $response = $mailer_endpoint->resumeSending(); + expect($response->status)->equals(APIResponse::STATUS_OK); + $mailer_log = MailerLog::getMailerLog(); + expect($mailer_log['status'])->null(); + } +} \ No newline at end of file diff --git a/tests/unit/Cron/Workers/SendingQueue/SendingQueueTest.php b/tests/unit/Cron/Workers/SendingQueue/SendingQueueTest.php index fbc17ce9e9..07a4e6648e 100644 --- a/tests/unit/Cron/Workers/SendingQueue/SendingQueueTest.php +++ b/tests/unit/Cron/Workers/SendingQueue/SendingQueueTest.php @@ -37,8 +37,7 @@ class SendingQueueTest extends MailPoetTest { $this->queue->subscribers = serialize( array( 'to_process' => array($this->subscriber->id), - 'processed' => array(), - 'failed' => array() + 'processed' => array() ) ); $this->queue->count_total = 1; @@ -118,18 +117,16 @@ class SendingQueueTest extends MailPoetTest { $updated_queue = SendingQueue::findOne($this->queue->id); expect($updated_queue->status)->equals(SendingQueue::STATUS_COMPLETED); - // queue subscriber processed/failed/to process count is updated + // queue subscriber processed/to process count is updated $updated_queue->subscribers = $updated_queue->getSubscribers(); expect($updated_queue->subscribers)->equals( array( 'to_process' => array(), - 'failed' => array(), 'processed' => array($this->subscriber->id) ) ); expect($updated_queue->count_total)->equals(1); expect($updated_queue->count_processed)->equals(1); - expect($updated_queue->count_failed)->equals(0); expect($updated_queue->count_to_process)->equals(0); // statistics entry should be created @@ -166,18 +163,16 @@ class SendingQueueTest extends MailPoetTest { $updated_queue = SendingQueue::findOne($this->queue->id); expect($updated_queue->status)->equals(SendingQueue::STATUS_COMPLETED); - // queue subscriber processed/failed/to process count is updated + // queue subscriber processed/to process count is updated $updated_queue->subscribers = $updated_queue->getSubscribers(); expect($updated_queue->subscribers)->equals( array( 'to_process' => array(), - 'failed' => array(), 'processed' => array($this->subscriber->id) ) ); expect($updated_queue->count_total)->equals(1); expect($updated_queue->count_processed)->equals(1); - expect($updated_queue->count_failed)->equals(0); expect($updated_queue->count_to_process)->equals(0); // statistics entry should be created @@ -196,8 +191,7 @@ class SendingQueueTest extends MailPoetTest { $this->subscriber->id(), 123 ), - 'processed' => array(), - 'failed' => array() + 'processed' => array() ) ); $queue->count_total = 2; @@ -210,18 +204,16 @@ class SendingQueueTest extends MailPoetTest { $sending_queue_worker->process(); $updated_queue = SendingQueue::findOne($queue->id); - // queue subscriber processed/failed/to process count is updated + // queue subscriber processed/to process count is updated $updated_queue->subscribers = $updated_queue->getSubscribers(); expect($updated_queue->subscribers)->equals( array( 'to_process' => array(), - 'failed' => array(), 'processed' => array($this->subscriber->id) ) ); expect($updated_queue->count_total)->equals(1); expect($updated_queue->count_processed)->equals(1); - expect($updated_queue->count_failed)->equals(0); expect($updated_queue->count_to_process)->equals(0); // statistics entry should be created only for 1 subscriber @@ -237,8 +229,7 @@ class SendingQueueTest extends MailPoetTest { 123, 456 ), - 'processed' => array(), - 'failed' => array() + 'processed' => array() ) ); $queue->count_total = 2; @@ -251,54 +242,19 @@ class SendingQueueTest extends MailPoetTest { $sending_queue_worker->process(); $updated_queue = SendingQueue::findOne($queue->id); - // queue subscriber processed/failed/to process count is updated + // queue subscriber processed/to process count is updated $updated_queue->subscribers = $updated_queue->getSubscribers(); expect($updated_queue->subscribers)->equals( array( 'to_process' => array(), - 'failed' => array(), 'processed' => array() ) ); expect($updated_queue->count_total)->equals(0); expect($updated_queue->count_processed)->equals(0); - expect($updated_queue->count_failed)->equals(0); expect($updated_queue->count_to_process)->equals(0); } - function testItUpdatesFailedListWhenSendingFailed() { - $sending_queue_worker = new SendingQueueWorker( - $timer = false, - Stub::make( - new MailerTask(), - array('send' => Stub::exactly(1, function($newsletter, $subscriber) { return false; })) - ) - ); - $sending_queue_worker->process(); - - // queue subscriber processed/failed/to process count is updated - $updated_queue = SendingQueue::findOne($this->queue->id); - $updated_queue->subscribers = $updated_queue->getSubscribers(); - expect($updated_queue->subscribers)->equals( - array( - 'to_process' => array(), - 'failed' => array($this->subscriber->id), - 'processed' => array() - ) - ); - expect($updated_queue->count_total)->equals(1); - expect($updated_queue->count_processed)->equals(1); - expect($updated_queue->count_failed)->equals(1); - expect($updated_queue->count_to_process)->equals(0); - - // statistics entry should not be created - $statistics = StatisticsNewsletters::where('newsletter_id', $this->newsletter->id) - ->where('subscriber_id', $this->subscriber->id) - ->where('queue_id', $this->queue->id) - ->findOne(); - expect($statistics)->false(); - } - function testItDoesNotSendToTrashedSubscribers() { $sending_queue_worker = $this->sending_queue_worker; $sending_queue_worker->mailer_task = Stub::make( diff --git a/tests/unit/Cron/Workers/SendingQueue/Tasks/MailerTest.php b/tests/unit/Cron/Workers/SendingQueue/Tasks/MailerTest.php index 4c9ab889ac..59cf56cc78 100644 --- a/tests/unit/Cron/Workers/SendingQueue/Tasks/MailerTest.php +++ b/tests/unit/Cron/Workers/SendingQueue/Tasks/MailerTest.php @@ -51,8 +51,7 @@ class MailerTaskTest extends MailPoetTest { function testItGetsMailerLog() { $mailer_log = $this->mailer_task->getMailerLog(); - expect(isset($mailer_log['sent']))->true(); - expect(isset($mailer_log['started']))->true(); + expect(is_array($mailer_log))->true(); } function testItUpdatesMailerLogSentCount() { diff --git a/tests/unit/Mailer/MailerLogTest.php b/tests/unit/Mailer/MailerLogTest.php index d4129e6786..ea73f27250 100644 --- a/tests/unit/Mailer/MailerLogTest.php +++ b/tests/unit/Mailer/MailerLogTest.php @@ -107,29 +107,113 @@ class MailerLogTest extends MailPoetTest { expect($updated_mailer_log['sent'])->equals(0); } - function testItCanEnforceSendingLimit() { + function testItResumesSending() { + // set status to "paused" + $mailer_log = array('status' => MailerLog::STATUS_PAUSED); + MailerLog::updateMailerLog($mailer_log); + $mailer_log = MailerLog::getMailerLog(); + expect($mailer_log['status'])->equals(MailerLog::STATUS_PAUSED); + // status is reset when sending is resumed + MailerLog::resumeSending(); + $mailer_log = MailerLog::getMailerLog(); + expect($mailer_log['status'])->null(); + } + + function testItPausesSending() { + $mailer_log = array( + 'status' => null, + 'retry_attempt' => MailerLog::RETRY_ATTEMPTS_LIMIT, + 'retry_at' => time() + 20 + ); + // status is set to PAUSED, retry attempt and retry at time are cleared + MailerLog::pauseSending($mailer_log); + $mailer_log = MailerLog::getMailerLog(); + expect($mailer_log['status'])->equals(MailerLog::STATUS_PAUSED); + expect($mailer_log['retry_attempt'])->null(); + expect($mailer_log['retry_at'])->null(); + } + + function itProcessesSendingError() { + // retry-related mailer values should be null + $mailer_log = MailerLog::getMailerLog(); + expect($mailer_log['retry_attempt'])->null(); + expect($mailer_log['retry_at'])->null(); + expect($mailer_log['error'])->null(); + // retry attempt should be incremented, error logged, retry attempt scheduled + MailerLog::processSendingError($operation = 'send', $error = 'email rejected'); + $mailer_log = MailerLog::getMailerLog(); + expect($mailer_log['retry_attempt'])->equals(1); + expect($mailer_log['retry_at'])->greaterThan(time()); + expect($mailer_log['error'])->equals( + array( + 'operation' => 'send', + 'error_message' => 'email rejected' + ) + ); + } + + function testItEnforcesSendingLimit() { $mailer_config = array( 'frequency' => array( 'emails' => 2, 'interval' => 1 ) ); - $mailer_log = array( - 'sent' => 2, - 'started' => time() - ); + $mailer_log = MailerLog::createMailerLog(); + $mailer_log['sent'] = 2; + $mailer_log['started'] = time(); Setting::setValue(MailerLog::SETTING_NAME, $mailer_log); Setting::setValue(Mailer::MAILER_CONFIG_SETTING_NAME, $mailer_config); // exception is thrown when sending limit is reached try { - MailerLog::enforceSendingLimit(); + MailerLog::enforceExecutionRequirements(); self::fail('Sending frequency exception was not thrown.'); } catch(\Exception $e) { expect($e->getMessage())->equals('Sending frequency limit has been reached.'); } } + function testItEnforcesRetryAtTime() { + $mailer_log = MailerLog::createMailerLog(); + $mailer_log['retry_at'] = time() + 10; + // exception is thrown when current time is sooner than 120 seconds + try { + MailerLog::enforceExecutionRequirements($mailer_log); + self::fail('Sending waiting to be retried exception was not thrown.'); + } catch(\Exception $e) { + expect($e->getMessage())->equals('Sending is waiting to be retried.'); + } + } + + function testItEnforcesRetryAttempts() { + $mailer_log = MailerLog::createMailerLog(); + $mailer_log['retry_attempt'] = 2; + // allow less than 3 attempts + expect(MailerLog::enforceExecutionRequirements($mailer_log))->null(); + // pase sending and throw exception when more than 3 attempts + $mailer_log['retry_attempt'] = MailerLog::RETRY_ATTEMPTS_LIMIT; + try { + MailerLog::enforceExecutionRequirements($mailer_log); + self::fail('Sending paused exception was not thrown.'); + } catch(\Exception $e) { + expect($e->getMessage())->equals('Sending has been paused.'); + } + $mailer_log = MailerLog::getMailerLog(); + expect($mailer_log['status'])->equals(MailerLog::STATUS_PAUSED); + } + + function testItEnforcesPuasedStatus() { + $mailer_log = MailerLog::createMailerLog(); + $mailer_log['status'] = MailerLog::STATUS_PAUSED; + try { + MailerLog::enforceExecutionRequirements($mailer_log); + self::fail('Sending paused exception was not thrown.'); + } catch(\Exception $e) { + expect($e->getMessage())->equals('Sending has been paused.'); + } + } + function _after() { ORM::raw_execute('TRUNCATE ' . Setting::$_table); }