From 36f3d5dd224d1faa31c0fc876191fe9dfb6a332c Mon Sep 17 00:00:00 2001 From: dpi Date: Sun, 26 Feb 2017 21:05:41 +0800 Subject: [PATCH 1/6] report and result output --- .../src/Form/SmsDevelMessageForm.php | 108 ++++++++++++++++++ 1 file changed, 108 insertions(+) diff --git a/modules/sms_devel/src/Form/SmsDevelMessageForm.php b/modules/sms_devel/src/Form/SmsDevelMessageForm.php index f29db10..b10f69e 100644 --- a/modules/sms_devel/src/Form/SmsDevelMessageForm.php +++ b/modules/sms_devel/src/Form/SmsDevelMessageForm.php @@ -64,6 +64,110 @@ public function getFormId() { * {@inheritdoc} */ public function buildForm(array $form, FormStateInterface $form_state) { + $results = $form_state->getTemporaryValue('results'); + if ($results) { + $form['results'] = [ + '#type' => 'table', + '#caption' => $this->t('

Results

'), + '#header' => [ + $this->t('Result'), + $this->t('Error'), + $this->t('Error Message'), + $this->t('Credits Used'), + $this->t('Credits Balance'), + ], + ]; + + /** @var \Drupal\sms\Message\SmsMessageResultInterface[] $results */ + foreach ($results as $i => $result) { + $row = []; + $row[]['#plain_text'] = t("#@number", ['@number' => $i]); + + $error = $result->getError(); + if ($error) { + $row[]['#plain_text'] = $error; + } + else { + $row[]['#markup'] = t('Success'); + } + + $other_values = [ + $result->getErrorMessage(), + $result->getCreditsUsed(), + $result->getCreditsBalance(), + ]; + + foreach ($other_values as $other_value) { + if (!empty($other_value)) { + $row[]['#plain_text'] = $other_value; + } + else { + $row[]['#markup'] = t('Undefined'); + } + } + + $form['results'][] = $row; + + $reports_cell = [ + '#type' => 'table', + '#header' => [ + $this->t('Recipient'), + $this->t('Message ID'), + $this->t('Status'), + $this->t('Status Message'), + $this->t('Time Delivered'), + $this->t('Time Queued'), + ], + ]; + foreach ($result->getReports() as $report) { + $row = []; + + $row[]['#plain_text'] = $report->getRecipient(); + + $values = [ + $report->getMessageId(), + $report->getStatus(), + $report->getStatusMessage() + ]; + foreach ($values as $value) { + if (!empty($value)) { + $row[]['#plain_text'] = $value; + } + else { + $row[]['#markup'] = t('Undefined'); + } + } + + $time_delivered = $report->getTimeDelivered(); + if ($time_delivered) { + $date = DrupalDateTime::createFromTimestamp($time_delivered); + $row[]['#plain_text'] = $date->format('c'); + } + else { + $row[]['#markup'] = t('Undefined'); + } + + $time_queued = $report->getTimeQueued(); + if ($time_queued) { + $date = DrupalDateTime::createFromTimestamp($time_queued); + $row[]['#plain_text'] = $date->format('c'); + } + else { + $row[]['#markup'] = t('Undefined'); + } + + $reports_cell[] = $row; + } + + $form['results'][][] = [ + '#wrapper_attributes' => [ + 'colspan' => count($form['results']['#header']), + ], + 'data' => $reports_cell, + ]; + } + } + $form['number'] = [ '#type' => 'tel', '#title' => $this->t('Phone number'), @@ -206,10 +310,14 @@ public function submitSend(array &$form, FormStateInterface $form_state) { try { if ($form_state->getValue('skip_queue')) { $messages = $this->smsProvider->send($this->message); + $results = []; foreach ($messages as $message) { $result = $message->getResult(); $this->resultMessage($result); + $results[] = $result; } + $form_state->setTemporaryValue('results', $results); + $form_state->setRebuild(); } else { $this->smsProvider->queue($this->message); From cb560e965dbd923032741239c9786c362c689d39 Mon Sep 17 00:00:00 2001 From: dpi Date: Thu, 14 Dec 2017 10:07:50 +0800 Subject: [PATCH 2/6] new method, minor refactors --- .../src/Form/SmsDevelMessageForm.php | 226 ++++++++++-------- 1 file changed, 125 insertions(+), 101 deletions(-) diff --git a/modules/sms_devel/src/Form/SmsDevelMessageForm.php b/modules/sms_devel/src/Form/SmsDevelMessageForm.php index b10f69e..00d8875 100644 --- a/modules/sms_devel/src/Form/SmsDevelMessageForm.php +++ b/modules/sms_devel/src/Form/SmsDevelMessageForm.php @@ -65,107 +65,9 @@ public function getFormId() { */ public function buildForm(array $form, FormStateInterface $form_state) { $results = $form_state->getTemporaryValue('results'); - if ($results) { - $form['results'] = [ - '#type' => 'table', - '#caption' => $this->t('

Results

'), - '#header' => [ - $this->t('Result'), - $this->t('Error'), - $this->t('Error Message'), - $this->t('Credits Used'), - $this->t('Credits Balance'), - ], - ]; - - /** @var \Drupal\sms\Message\SmsMessageResultInterface[] $results */ - foreach ($results as $i => $result) { - $row = []; - $row[]['#plain_text'] = t("#@number", ['@number' => $i]); - - $error = $result->getError(); - if ($error) { - $row[]['#plain_text'] = $error; - } - else { - $row[]['#markup'] = t('Success'); - } - $other_values = [ - $result->getErrorMessage(), - $result->getCreditsUsed(), - $result->getCreditsBalance(), - ]; - - foreach ($other_values as $other_value) { - if (!empty($other_value)) { - $row[]['#plain_text'] = $other_value; - } - else { - $row[]['#markup'] = t('Undefined'); - } - } - - $form['results'][] = $row; - - $reports_cell = [ - '#type' => 'table', - '#header' => [ - $this->t('Recipient'), - $this->t('Message ID'), - $this->t('Status'), - $this->t('Status Message'), - $this->t('Time Delivered'), - $this->t('Time Queued'), - ], - ]; - foreach ($result->getReports() as $report) { - $row = []; - - $row[]['#plain_text'] = $report->getRecipient(); - - $values = [ - $report->getMessageId(), - $report->getStatus(), - $report->getStatusMessage() - ]; - foreach ($values as $value) { - if (!empty($value)) { - $row[]['#plain_text'] = $value; - } - else { - $row[]['#markup'] = t('Undefined'); - } - } - - $time_delivered = $report->getTimeDelivered(); - if ($time_delivered) { - $date = DrupalDateTime::createFromTimestamp($time_delivered); - $row[]['#plain_text'] = $date->format('c'); - } - else { - $row[]['#markup'] = t('Undefined'); - } - - $time_queued = $report->getTimeQueued(); - if ($time_queued) { - $date = DrupalDateTime::createFromTimestamp($time_queued); - $row[]['#plain_text'] = $date->format('c'); - } - else { - $row[]['#markup'] = t('Undefined'); - } - - $reports_cell[] = $row; - } - - $form['results'][][] = [ - '#wrapper_attributes' => [ - 'colspan' => count($form['results']['#header']), - ], - 'data' => $reports_cell, - ]; - } + if ($results) { + $form = array_merge($form, $this->verboseResults($results)); } $form['number'] = [ @@ -210,6 +112,12 @@ public function buildForm(array $form, FormStateInterface $form_state) { '#description' => $this->t('Flag this message as automated.'), '#default_value' => TRUE, ]; + $form['options']['verbose'] = [ + '#type' => 'checkbox', + '#title' => $this->t('Verbose output'), + '#description' => $this->t('Show full details of messages sent.'), + '#default_value' => TRUE, + ]; $form['options']['send_on'] = [ '#type' => 'datetime', '#title' => $this->t('Send on'), @@ -308,7 +216,9 @@ public function submitSend(array &$form, FormStateInterface $form_state) { $this->message->setDirection(Direction::OUTGOING); try { - if ($form_state->getValue('skip_queue')) { + $skip_queue = $form_state->getValue('skip_queue'); + $verbose = $form_state->getValue('verbose'); + if ($verbose && $skip_queue) { $messages = $this->smsProvider->send($this->message); $results = []; foreach ($messages as $message) { @@ -360,4 +270,118 @@ protected function resultMessage(SmsMessageResultInterface $result) { } } + /** + * Render message results as a HTML table. + * + * @param \Drupal\sms\Message\SmsMessageResultInterface[] $results + * + * @return array + * A render array. + */ + protected function verboseResults(array $results) { + $render = []; + + $render['results'] = [ + '#type' => 'table', + '#caption' => $this->t('

Results

'), + '#header' => [ + $this->t('Result'), + $this->t('Error'), + $this->t('Error Message'), + $this->t('Credits Used'), + $this->t('Credits Balance'), + ], + ]; + + foreach ($results as $i => $result) { + $row = []; + $row[]['#plain_text'] = $this->t("#@number", ['@number' => $i]); + + $error = $result->getError(); + if ($error) { + $row[]['#plain_text'] = $error; + } + else { + $row[]['#markup'] = $this->t('Success'); + } + + $other_values = [ + $result->getErrorMessage(), + $result->getCreditsUsed(), + $result->getCreditsBalance(), + ]; + + foreach ($other_values as $other_value) { + if (!empty($other_value)) { + $row[]['#plain_text'] = $other_value; + } + else { + $row[]['#markup'] = $this->t('Undefined'); + } + } + + $render['results'][] = $row; + + $reports_cell = [ + '#type' => 'table', + '#header' => [ + $this->t('Recipient'), + $this->t('Message ID'), + $this->t('Status'), + $this->t('Status Message'), + $this->t('Time Delivered'), + $this->t('Time Queued'), + ], + ]; + foreach ($result->getReports() as $report) { + $row = []; + + $row[]['#plain_text'] = $report->getRecipient(); + + $values = [ + $report->getMessageId(), + $report->getStatus(), + $report->getStatusMessage() + ]; + foreach ($values as $value) { + if (!empty($value)) { + $row[]['#plain_text'] = $value; + } + else { + $row[]['#markup'] = $this->t('Undefined'); + } + } + + $time_delivered = $report->getTimeDelivered(); + if ($time_delivered) { + $date = DrupalDateTime::createFromTimestamp($time_delivered); + $row[]['#plain_text'] = $date->format('c'); + } + else { + $row[]['#markup'] = $this->t('Undefined'); + } + + $time_queued = $report->getTimeQueued(); + if ($time_queued) { + $date = DrupalDateTime::createFromTimestamp($time_queued); + $row[]['#plain_text'] = $date->format('c'); + } + else { + $row[]['#markup'] = $this->t('Undefined'); + } + + $reports_cell[] = $row; + } + + $render['results'][][] = [ + '#wrapper_attributes' => [ + 'colspan' => count($render['results']['#header']), + ], + 'data' => $reports_cell, + ]; + } + + return $render; + } + } From 80cc1aa85d890e1669d0dfb9f88c10010fc1c2bd Mon Sep 17 00:00:00 2001 From: dpi Date: Thu, 14 Dec 2017 10:28:55 +0800 Subject: [PATCH 3/6] Added sms_devel to PHPUnit configuration. --- phpunit.xml.dist | 1 + 1 file changed, 1 insertion(+) diff --git a/phpunit.xml.dist b/phpunit.xml.dist index 7d0695a..97e4d4a 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -11,6 +11,7 @@ ./tests ./modules/sms_user/tests + ./modules/sms_devel/tests From 32158ca1f25cd16f1b5e4ea450edf646b6ad8c54 Mon Sep 17 00:00:00 2001 From: dpi Date: Thu, 14 Dec 2017 10:30:08 +0800 Subject: [PATCH 4/6] Converted usage of deprecated methods to their replacements in SmsDevelMessageTest. --- .../src/Functional/SmsDevelMessageTest.php | 47 +++++++++---------- 1 file changed, 23 insertions(+), 24 deletions(-) diff --git a/modules/sms_devel/tests/src/Functional/SmsDevelMessageTest.php b/modules/sms_devel/tests/src/Functional/SmsDevelMessageTest.php index 5e5f083..58f10db 100644 --- a/modules/sms_devel/tests/src/Functional/SmsDevelMessageTest.php +++ b/modules/sms_devel/tests/src/Functional/SmsDevelMessageTest.php @@ -12,7 +12,6 @@ * Tests the message form. * * @group SMS Framework - * @group legacy */ class SmsDevelMessageTest extends SmsFrameworkBrowserTestBase { @@ -47,12 +46,12 @@ public function testSendSkipQueue() { $edit['skip_queue'] = TRUE; $this->drupalPostForm(Url::fromRoute('sms_devel.message'), $edit, t('Send')); - $this->assertResponse(200); - $this->assertRaw('Message was processed, 1 delivery reports were generated.'); + $this->assertSession()->statusCodeEquals(200); + $this->assertSession()->responseContains('Message was processed, 1 delivery reports were generated.'); $messages = $this->getTestMessages($this->gateway); - $this->assertEqual(1, count($messages)); - $this->assertEqual($edit['message'], $messages[0]->getMessage()); + $this->assertEquals(1, count($messages)); + $this->assertEquals($edit['message'], $messages[0]->getMessage()); } /** @@ -64,13 +63,13 @@ public function testSendNoSkipQueue() { $edit['skip_queue'] = FALSE; $this->drupalPostForm(Url::fromRoute('sms_devel.message'), $edit, t('Send')); - $this->assertResponse(200); - $this->assertRaw('Message added to the outgoing queue.'); + $this->assertSession()->statusCodeEquals(200); + $this->assertSession()->responseContains('Message added to the outgoing queue.'); $messages = SmsMessage::loadMultiple(); $message = reset($messages); - $this->assertEqual($edit['message'], $message->getMessage(), 'Message is same'); - $this->assertEqual(Direction::OUTGOING, $message->getDirection(), 'Message is outgoing'); + $this->assertEquals($edit['message'], $message->getMessage(), 'Message is same'); + $this->assertEquals(Direction::OUTGOING, $message->getDirection(), 'Message is outgoing'); } /** @@ -83,10 +82,10 @@ public function testReceiveSkipQueue() { $edit['skip_queue'] = TRUE; $this->drupalPostForm(Url::fromRoute('sms_devel.message'), $edit, t('Receive')); - $this->assertResponse(200); - $this->assertRaw('Message was processed, 1 delivery reports were generated.'); + $this->assertSession()->statusCodeEquals(200); + $this->assertSession()->responseContains('Message was processed, 1 delivery reports were generated.'); - $this->assertEqual($edit['message'], sms_test_gateway_get_incoming()['message']); + $this->assertEquals($edit['message'], sms_test_gateway_get_incoming()['message']); } /** @@ -99,13 +98,13 @@ public function testReceiveNoSkipQueue() { $edit['skip_queue'] = FALSE; $this->drupalPostForm(Url::fromRoute('sms_devel.message'), $edit, t('Receive')); - $this->assertResponse(200); - $this->assertRaw('Message added to the incoming queue.'); + $this->assertSession()->statusCodeEquals(200); + $this->assertSession()->responseContains('Message added to the incoming queue.'); $messages = SmsMessage::loadMultiple(); $message = reset($messages); - $this->assertEqual($edit['message'], $message->getMessage(), 'Message is same'); - $this->assertEqual(Direction::INCOMING, $message->getDirection(), 'Message is incoming'); + $this->assertEquals($edit['message'], $message->getMessage(), 'Message is same'); + $this->assertEquals(Direction::INCOMING, $message->getDirection(), 'Message is incoming'); } /** @@ -115,8 +114,8 @@ public function testReceiveGatewayInvalid() { $edit['gateway'] = ''; $this->drupalPostForm(Url::fromRoute('sms_devel.message'), $edit, t('Receive')); - $this->assertResponse(200); - $this->assertRaw('Gateway must be selected if receiving a message.'); + $this->assertSession()->statusCodeEquals(200); + $this->assertSession()->responseContains('Gateway must be selected if receiving a message.'); } /** @@ -129,7 +128,7 @@ public function testAutomated() { $edit['automated'] = FALSE; $this->drupalPostForm(Url::fromRoute('sms_devel.message'), $edit, t('Send')); - $this->assertResponse(200); + $this->assertSession()->statusCodeEquals(200); $messages = SmsMessage::loadMultiple(); $message = reset($messages); @@ -153,11 +152,11 @@ public function testDate() { $edit['send_on[date]'] = $date_user->format('Y-m-d'); $edit['send_on[time]'] = $date_user->format('H:i:s'); $this->drupalPostForm(Url::fromRoute('sms_devel.message'), $edit, t('Send')); - $this->assertResponse(200); + $this->assertSession()->statusCodeEquals(200); $messages = SmsMessage::loadMultiple(); $message = reset($messages); - $this->assertEqual($date->format('U'), $message->getSendTime(), 'Message has send time.'); + $this->assertEquals($date->format('U'), $message->getSendTime(), 'Message has send time.'); } /** @@ -171,11 +170,11 @@ public function testNoFallbackGateway() { $edit['skip_queue'] = TRUE; $this->drupalPostForm(Url::fromRoute('sms_devel.message'), $edit, t('Send')); - $this->assertResponse(200); - $this->assertRaw('Message could not be sent'); + $this->assertSession()->statusCodeEquals(200); + $this->assertSession()->responseContains('Message could not be sent'); $messages = $this->getTestMessages($this->gateway); - $this->assertEqual(0, count($messages), 'No messages sent.'); + $this->assertEquals(0, count($messages), 'No messages sent.'); } } From 1f8364854e48ce41b34ad37c11d22dba4cb36576 Mon Sep 17 00:00:00 2001 From: dpi Date: Thu, 14 Dec 2017 12:12:06 +0800 Subject: [PATCH 5/6] Refactored devel message --- .../src/Form/SmsDevelMessageForm.php | 95 ++++++++----------- 1 file changed, 39 insertions(+), 56 deletions(-) diff --git a/modules/sms_devel/src/Form/SmsDevelMessageForm.php b/modules/sms_devel/src/Form/SmsDevelMessageForm.php index 00d8875..9703e0b 100644 --- a/modules/sms_devel/src/Form/SmsDevelMessageForm.php +++ b/modules/sms_devel/src/Form/SmsDevelMessageForm.php @@ -105,6 +105,7 @@ public function buildForm(array $form, FormStateInterface $form_state) { '#title' => $this->t('Force skip queue'), '#description' => $this->t('Send or receive the message immediately. If the gateway-specific skip queue setting is turned on, then this option is already applied.'), '#default_value' => TRUE, + '#name' => 'skip_queue', ]; $form['options']['automated'] = [ '#type' => 'checkbox', @@ -115,8 +116,13 @@ public function buildForm(array $form, FormStateInterface $form_state) { $form['options']['verbose'] = [ '#type' => 'checkbox', '#title' => $this->t('Verbose output'), - '#description' => $this->t('Show full details of messages sent.'), + '#description' => $this->t('Show full details of messages.'), '#default_value' => TRUE, + '#states' => [ + 'visible' => [ + ':input[name="' . $form['options']['skip_queue']['#name'] . '"]' => ['checked' => TRUE], + ], + ], ]; $form['options']['send_on'] = [ '#type' => 'datetime', @@ -281,9 +287,30 @@ protected function resultMessage(SmsMessageResultInterface $result) { protected function verboseResults(array $results) { $render = []; + // Renders plain text, or 'Undefined' message if falsey. + $renderString = function($value) { + return !empty($value) ? ['#plain_text' => $value] : ['#markup' => $this->t('Undefined')]; + }; + + // Renders a date text, or 'Undefined' message if falsey. + $renderDate = function($timestamp) { + if ($timestamp) { + $date = DrupalDateTime::createFromTimestamp($timestamp); + return ['#plain_text' => $date->format('c')]; + } + else { + return ['#markup' => $this->t('Undefined')]; + } + }; + $render['results'] = [ '#type' => 'table', - '#caption' => $this->t('

Results

'), + '#caption' => [ + 'heading' => [ + '#type' => 'inline_template', + '#template' => '

Results

', + ] + ], '#header' => [ $this->t('Result'), $this->t('Error'), @@ -298,27 +325,10 @@ protected function verboseResults(array $results) { $row[]['#plain_text'] = $this->t("#@number", ['@number' => $i]); $error = $result->getError(); - if ($error) { - $row[]['#plain_text'] = $error; - } - else { - $row[]['#markup'] = $this->t('Success'); - } - - $other_values = [ - $result->getErrorMessage(), - $result->getCreditsUsed(), - $result->getCreditsBalance(), - ]; - - foreach ($other_values as $other_value) { - if (!empty($other_value)) { - $row[]['#plain_text'] = $other_value; - } - else { - $row[]['#markup'] = $this->t('Undefined'); - } - } + $row[] = $error ? ['#plain_text' => $error] : ['#markup' => $this->t('Success')]; + $row[] = $renderString($result->getErrorMessage()); + $row[] = $renderString($result->getCreditsUsed()); + $row[] = $renderString($result->getCreditsBalance()); $render['results'][] = $row; @@ -336,39 +346,12 @@ protected function verboseResults(array $results) { foreach ($result->getReports() as $report) { $row = []; - $row[]['#plain_text'] = $report->getRecipient(); - - $values = [ - $report->getMessageId(), - $report->getStatus(), - $report->getStatusMessage() - ]; - foreach ($values as $value) { - if (!empty($value)) { - $row[]['#plain_text'] = $value; - } - else { - $row[]['#markup'] = $this->t('Undefined'); - } - } - - $time_delivered = $report->getTimeDelivered(); - if ($time_delivered) { - $date = DrupalDateTime::createFromTimestamp($time_delivered); - $row[]['#plain_text'] = $date->format('c'); - } - else { - $row[]['#markup'] = $this->t('Undefined'); - } - - $time_queued = $report->getTimeQueued(); - if ($time_queued) { - $date = DrupalDateTime::createFromTimestamp($time_queued); - $row[]['#plain_text'] = $date->format('c'); - } - else { - $row[]['#markup'] = $this->t('Undefined'); - } + $row[] = $renderString($report->getRecipient()); + $row[] = $renderString($report->getMessageId()); + $row[] = $renderString($report->getStatus()); + $row[] = $renderString($report->getStatusMessage()); + $row[] = $renderDate($report->getTimeDelivered()); + $row[] = $renderDate($report->getTimeQueued()); $reports_cell[] = $row; } From fdba1756da4b7048c98a8f993d837dd2a8bf417c Mon Sep 17 00:00:00 2001 From: dpi Date: Thu, 14 Dec 2017 12:12:18 +0800 Subject: [PATCH 6/6] tests for verbose reports --- .../src/Functional/SmsDevelMessageTest.php | 69 +++++++++++++++++++ 1 file changed, 69 insertions(+) diff --git a/modules/sms_devel/tests/src/Functional/SmsDevelMessageTest.php b/modules/sms_devel/tests/src/Functional/SmsDevelMessageTest.php index 58f10db..036f43c 100644 --- a/modules/sms_devel/tests/src/Functional/SmsDevelMessageTest.php +++ b/modules/sms_devel/tests/src/Functional/SmsDevelMessageTest.php @@ -177,4 +177,73 @@ public function testNoFallbackGateway() { $this->assertEquals(0, count($messages), 'No messages sent.'); } + /** + * Tests verbose message output. + */ + function testVerboseReports() { + $edit['gateway'] = $this->gateway->id(); + $edit['number'] = $this->randomPhoneNumbers(1)[0]; + $edit['message'] = $this->randomString(); + $edit['skip_queue'] = TRUE; + $edit['verbose'] = TRUE; + + $this->drupalPostForm(Url::fromRoute('sms_devel.message'), $edit, t('Send')); + $this->assertSession()->statusCodeEquals(200); + $this->assertSession()->responseContains('Message was processed, 1 delivery reports were generated.'); + + $first_row = '#edit-results > tbody > tr:nth-child(1)'; + + // Result. + $selector = $first_row . ' > td:nth-child(1)'; + $this->assertSession()->elementTextContains('css', $selector, '#0'); + + // Error. + $selector = $first_row . ' > td:nth-child(2)'; + $this->assertSession()->elementTextContains('css', $selector, 'Success'); + + // Error Message. + $selector = $first_row . ' > td:nth-child(3)'; + $this->assertSession()->elementTextContains('css', $selector, 'Undefined'); + + // Credits Used. + $selector = $first_row . ' > td:nth-child(4)'; + $this->assertSession()->elementTextContains('css', $selector, 'Undefined'); + + // Credits Balance. + $selector = $first_row . ' > td:nth-child(5)'; + $this->assertSession()->elementTextContains('css', $selector, 'Undefined'); + + $message = $this->getLastTestMessage($this->gateway); + $report = $message->getReports()[0]; + $this->assertEquals($edit['number'], $report->getRecipient()); + + $first_row_first_report = '#edit-results > tbody > tr:nth-child(2) > td > table > tbody > tr:nth-child(1)'; + + // Recipient. + $selector = $first_row_first_report . ' > td:nth-child(1)'; + $this->assertSession()->elementTextContains('css', $selector, $report->getRecipient()); + + // Message ID. + $selector = $first_row_first_report . ' > td:nth-child(2)'; + $this->assertSession()->elementTextContains('css', $selector, $report->getMessageId()); + + // Status. + $selector = $first_row_first_report . ' > td:nth-child(3)'; + $this->assertSession()->elementTextContains('css', $selector, $report->getStatus()); + + // Status Message. + $selector = $first_row_first_report . ' > td:nth-child(4)'; + $this->assertSession()->elementTextContains('css', $selector, $report->getStatusMessage()); + + // Time Delivered. + $date = DrupalDateTime::createFromTimestamp($report->getTimeDelivered()); + $selector = $first_row_first_report . ' > td:nth-child(5)'; + $this->assertSession()->elementTextContains('css', $selector, $date->format('c')); + + // Time Queued. + $date = DrupalDateTime::createFromTimestamp($report->getTimeQueued()); + $selector = $first_row_first_report . ' > td:nth-child(6)'; + $this->assertSession()->elementTextContains('css', $selector, $date->format('c')); + } + }