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);
+ }
+ }
+}