diff --git a/assets/js/src/newsletters/listings/mixins.jsx b/assets/js/src/newsletters/listings/mixins.jsx index 769a63040e..8b4fe44559 100644 --- a/assets/js/src/newsletters/listings/mixins.jsx +++ b/assets/js/src/newsletters/listings/mixins.jsx @@ -86,7 +86,7 @@ const QueueMixin = { if (newsletter.queue.status === 'completed') { label = ( - + { MailPoet.I18n.t('newsletterQueueCompleted') diff --git a/assets/js/src/newsletters/listings/welcome.jsx b/assets/js/src/newsletters/listings/welcome.jsx index 6da876356d..00aa7d87ad 100644 --- a/assets/js/src/newsletters/listings/welcome.jsx +++ b/assets/js/src/newsletters/listings/welcome.jsx @@ -215,7 +215,12 @@ const NewsletterListWelcome = createReactClass({ // eslint-disable-line react/pr

- { totalSentMessage } + + { totalSentMessage } + {' '}
{ totalScheduledMessage } diff --git a/assets/js/src/newsletters/sending_status.jsx b/assets/js/src/newsletters/sending_status.jsx index 4c2f7bb81a..5b9bee15fe 100644 --- a/assets/js/src/newsletters/sending_status.jsx +++ b/assets/js/src/newsletters/sending_status.jsx @@ -145,7 +145,7 @@ const ListingItem = ({ } return ( <> - + - + { status } - + { error } diff --git a/tests/DataFactories/Newsletter.php b/tests/DataFactories/Newsletter.php index 376def7764..49a0696bf0 100644 --- a/tests/DataFactories/Newsletter.php +++ b/tests/DataFactories/Newsletter.php @@ -2,10 +2,12 @@ namespace MailPoet\Test\DataFactories; use Carbon\Carbon; -use MailPoet\Models\NewsletterSegment; +use MailPoet\Models\Subscriber; use MailPoet\Models\ScheduledTask; +use MailPoet\Models\NewsletterSegment; use MailPoet\Settings\SettingsController; use MailPoet\Tasks\Sending as SendingTask; +use MailPoet\Models\ScheduledTaskSubscriber; class Newsletter { @@ -18,6 +20,9 @@ class Newsletter { /** @var array */ private $segments; + /** @var array */ + private $task_subscribers; + public function __construct() { $this->data = [ 'subject' => 'Some subject', @@ -29,6 +34,7 @@ class Newsletter { $this->options = []; $this->segments = []; $this->queue_options = []; + $this->task_subscribers = []; $this->loadBodyFrom('newsletterWithALC.json'); SettingsController::resetCache(); // Newsletter model reads settings so we need to ensure it use fresh data } @@ -219,6 +225,16 @@ class Newsletter { return $this; } + public function beingSentToSubscriber($subscriber, array $data = []) { + $this->task_subscribers[] = array_merge([ + 'subscriber_id' => $subscriber->id, + 'processed' => 1, + 'failed' => 0, + 'error' => '', + ], $data); + return $this; + } + /** * @return \MailPoet\Models\Newsletter */ @@ -250,6 +266,16 @@ class Newsletter { $sending_task->count_processed = $this->queue_options['count_processed']; $sending_task->count_total = $this->queue_options['count_total']; $sending_task->save(); + + foreach ($this->task_subscribers as $data) { + $task_subscriber = ScheduledTaskSubscriber::createOrUpdate([ + 'subscriber_id' => $data['subscriber_id'], + 'task_id' => $sending_task->task_id, + 'error' => $data['error'], + 'failed' => $data['failed'], + 'processed' => $data['processed'], + ]); + } } return $newsletter; } diff --git a/tests/_data/acceptanceDump.sql b/tests/_data/acceptanceDump.sql index 3fe0f1e944..5961410de0 100644 --- a/tests/_data/acceptanceDump.sql +++ b/tests/_data/acceptanceDump.sql @@ -302,6 +302,8 @@ CREATE TABLE `mp_mailpoet_scheduled_task_subscribers` ( `task_id` int(11) unsigned NOT NULL, `subscriber_id` int(11) unsigned NOT NULL, `processed` int(1) NOT NULL, + `failed` smallint(1) NOT NULL DEFAULT 0, + `error` text NULL, `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`task_id`,`subscriber_id`), KEY subscriber_id (subscriber_id) diff --git a/tests/acceptance/SendingStatusCest.php b/tests/acceptance/SendingStatusCest.php new file mode 100644 index 0000000000..4e50285cd6 --- /dev/null +++ b/tests/acceptance/SendingStatusCest.php @@ -0,0 +1,66 @@ +wantTo('Check the sending status page for a standard newsletter'); + // Having a standard newsletter sent to 2 subscribers + $lucky_subscriber = (new Subscriber) + ->withFirstName('Lucky') + ->withLastName('Luke') + ->create(); + $unlucky_subscriber = (new Subscriber) + ->withFirstName('Unlucky') + ->withLastName('John') + ->create(); + $newsletter = (new Newsletter) + ->withSubject('Testing newsletter sending status') + ->withSentStatus() + ->withSendingQueue([ + 'count_processed' => 2, + 'count_total' => 2, + ]) + ->beingSentToSubscriber($lucky_subscriber) + ->beingSentToSubscriber($unlucky_subscriber, [ + 'failed' => 1, + 'error' => 'Oh no!', + ]) + ->create(); + // When I visit the newsletters page + $I->login(); + $I->amOnMailPoetPage('Emails'); + $I->waitForText($newsletter->subject); + // I click on the "Sent to 3 of 3" link + $I->click('[data-automation-id="sending_status_' . $newsletter->id . '"]'); + // Check I am on the sending status page + $I->seeInCurrentUrl('?page=mailpoet-newsletters#/sending-status/' . $newsletter->id); + $I->waitForText('Sending status'); + // I see the subscribers with related statuses + $task_id = $newsletter->getQueue()->task_id; + $this->checkSubscriber($I, $task_id, $lucky_subscriber, 'Sent'); + $this->checkSubscriber($I, $task_id, $unlucky_subscriber, 'Failed', 'Oh no!'); + } + + private function checkSubscriber($I, $task_id, $subscriber, $status, $error = false) { + $name_selector = '[data-automation-id="name_' . $task_id . '_' . $subscriber->id . '"]'; + $status_selector = '[data-automation-id="status_' . $task_id . '_' . $subscriber->id . '"]'; + $full_name = $subscriber->first_name . ' ' . $subscriber->last_name; + $I->waitForText($subscriber->email, 10, $name_selector); + $I->waitForText($full_name, 10, $name_selector); + $I->waitForText($status, 10, $status_selector); + if ($error) { + $error_selector = '[data-automation-id="error_' . $task_id . '_' . $subscriber->id . '"]'; + $I->waitForText($error, 10, $error_selector); + } + } +}